result.put("count", pageInfo.getTotal());
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "查询异常!");
}
return result;
}
`goodsMapper.getGoodsList()`呢,就是与数据库交互的方法了:
@Select(“SELECT * FROM mutest.goods”)
List getGoodsList();
经过`PageHelper`的分页处理,将前端传来的`pageNum`和`pageSize` 织入sql语句中:
SELECT * FROM mutest.goods LIMIT 0,5
至此,渲染数据的前后端已经完成,那么刷新数据是怎么实现的呢?
首先,要页面放置头部工具按钮,包括新增和刷新:
然后,监听头部按钮点击事件:
// 监听头部工具栏
table.on(‘toolbar(goods_bar)’, function (obj) {
switch (obj.event) {
case 'refresh':
// 执行一个表格重载即实现刷新功能
table.reload('goodsReload', {
where: '',
contentType: 'application/x-www-form-urlencoded',
page: {
curr: 1 //重新从第 1 页开始
},
url: '/goods/goodsList',
method: 'get'
});
break;
}
});
有这么几点需要强调一下:
* `toolbar`是头部工具事件,与之对应的还有`tool`(行工具),后面括号中的`goods_bar`是与`table`元素的`lay-filter`的值对应起来的
* `table.reload('goodsReload'`中的`goodsReload`是与`table.render`的id对应起来的,通过再次向特定`url`请求数据实现了表格的重载。
[]( )2 新增和编辑
=================================================================
新增和编辑在本文中,是使用弹层来实现的。思路是这样的:
1. 首先,准备一个`div`元素,其`display`设置为`none`
2. 通过新增和编辑按钮的点击事件触发弹出`form`,在`form`内填写好内容
3. 通过点击弹层中的【提交】按钮,将`form`提交到后端对应的接口,从而实现后端数据的更新
4. 提交完成后,ajax请求的success回调中添加表格重载,完成前端数据更新
[]( )2.1 弹层
----------------------------------------------------------------
弹层的div元素是这样的:
<form id="add_form" class="layui-form" action="" style="margin-top: 20px;align:center;">
<!--隐藏字段action,用来区分增加和编辑行为-->
<input type="hidden" name="action" id="action">
<!--隐藏字段id,用于提供编辑需要的主键-->
<input type="hidden" name="id" id="id">
<!--隐藏字段request_type,用于提供请求方式:get,post,put-->
<input type="hidden" name="request_type" id="request_type">
<div class="layui-form-item" style="display: table;width: 96%">
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">类  型</label>
<div class="layui-input-block">
<select id="" name="type" lay-filter="type" lay-verify="required">
<option value="">请选择</option>
<option value="国产">国产</option>
<option value="进口">进口</option>
</select>
</div>
</div>
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">产品名称</label>
<div class="layui-input-block">
<input type="text" name="name" placeholder="请输入产品名称"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
</div>
<div class="layui-form-item" style="display: table;width: 96%">
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">价  格</label>
<div class="layui-input-block">
<input type="text" name="price" placeholder="请输入价格"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">数  量</label>
<div class="layui-input-block">
<input type="text" name="size" placeholder="请输入数量"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
</div>
<div class="layui-form-item" style="width: 96%">
<label class="layui-form-label">说  明</label>
<div class="layui-input-block">
<input type="text" name="description" placeholder="请输入产品说明"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
<div class="layui-form-item" style="margin-left: 40%">
<div class="layui-btn-group">
<button class="layui-btn" lay-submit="" lay-filter="update_submit">提 交</button>
<button type="reset" class="layui-btn layui-btn-primary">重 置</button>
</div>
</div>
</form>
**接下来,我们看打开弹层时,做了什么?首先是【新增】事件:**
// 监听头部工具栏
table.on(‘toolbar(goods_bar)’, function (obj) {
switch (obj.event) {
// 根据增加行为给form隐藏项赋值
case 'add':
var data = {};
data.action = 'addGood';
data.request_type = 'post';
// 调用打开弹层的工具方法
open_form("#open_div", data, '添加商品', '620px', '282px');
break;
}
});
【编辑】事件:
table.on(‘tool(goods_bar)’, function (obj) {
var data = obj.data;
var layEvent = obj.event;
var id = data.id;
switch (layEvent) {
case 'edit':
// 根据编辑行为为form隐藏项赋值
data.action = 'updateGood';
data.request_type = 'post';
open_form("#open_div", data, '编辑用例', '620px', '282px');
break;
}
});
仔细观察,div中有很多隐藏元素,之所以隐藏起来,是因为这些值必须要传递给后端,且不能被用户篡改,而是由程序赋值
* id:就是你所操作的数据的主键,通过该值来告知后端,我要修改的是哪条数据。【新增】没有对id赋值,因为id设为自增字段,插库时无需传入id
* action:区分新增和编辑的重要字段,【新增】赋值`addGood`,【编辑】赋值`updateGood`
* request\_type:区分`get`请求和`post`请求的字段,新增和编辑都赋值`post`
\*\*`open_form`和`setForm`是两个工具方法,前者是打开弹层,后者是为`form`初始化(也是编辑弹窗会代入数据的实现方法),源码见 3.2 工具方法部分。
[]( )2.2 form submit
-------------------------------------------------------------------------
当打开弹层并填入内容后,当然是要提交了。通过监听form的提交按钮点击事件来实现表单提交:
form.on(‘submit(update_submit)’, function (data) {
var uri = data.field.action;
var type = data.field.request_type;
$.ajax({
type: type,
url: '/goods/' + uri,
contentType: "application/json; charset=utf-8",
data: JSON.stringify(data.field),
dataType: "json",
success: function (result) {
if (result.code == "0") {
table.reload('goodsReload', {
contentType: 'application/x-www-form-urlencoded',
page: {
curr: 1 //重新从第 1 页开始
},
url: '/goods/goodsList',
method: 'get'
});
layer.msg('修改成功', {icon: 1, time: 1000});
} else { //失败
layer.alert(result.msg, {icon: 2}, function () {
layer.close(index);
});
}
}
});
layer.close(index);//关闭弹出层
return false;
});
【新增】和【编辑】使用的是同一套提交逻辑,而后端接口肯定不是同一个,所以`action`在打开弹层时被赋值,而提交时引用该值,从而指向了各自的后端接口。
后端接口:
// 新增接口
@RequestMapping(value = “/addGood”, method = RequestMethod.POST)
public JSONObject addGood(@RequestBody JSONObject request) {
JSONObject result = new JSONObject();
try {
goodsMapper.addGood(request);
result.put("code", "0");
result.put("msg", "操作成功!");
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "新增商品异常!");
}
return result;
}
// 编辑接口
@RequestMapping(value = “/updateGood”, method = RequestMethod.POST)
public JSONObject updateGood(@RequestBody JSONObject request) {
JSONObject result = new JSONObject();
try {
goodsMapper.updateGood(request);
result.put("code", "0");
result.put("msg", "操作成功!");
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "修改商品异常!");
System.out.println(e.getMessage());
}
return result;
}
// 新增sql
@Insert(“INSERT INTO mutest.goods(type,name,price,size,status,description)VALUES(#{type},#{name},#{price},#{size},#{status},#{description})”)
int addGood(JSONObject request);
// 编辑sql
@Update(“UPDATE mutest.goods SET type=#{type},name=#{name},price=#{price},size=#{size},status=#{status},description=#{description} WHERE id=#{id}”)
void updateGood(JSONObject request);
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190727163912774.gif)
[]( )3 完整代码
================================================================
[]( )3.1 后端
----------------------------------------------------------------
### []( )pom.xml依赖
项目用到的完整的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mudemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mudemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<swagger.version>2.8.0</swagger.version>
<google.guava>23.0</google.guava>
<fastjson.version>1.2.47</fastjson.version>
<druid.version>1.1.9</druid.version>
<poi.version>3.17</poi.version>
<jwt.version>0.9.0</jwt.version>
<mybatis.version>1.3.2</mybatis.version>
</properties>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--data:省略set、get方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
### []( )实体类
package mudemo.model;
import lombok.Data;
/**
-
@author guozhengMu
-
@version 1.0
-
@date 2019/8/26 16:16
-
@description
-
@modify
*/
@Data
public class Good {
private int id;
private String name;
private String type;
private double price;
private int size;
private int status;
private String description;
}
### []( )controller层
package mudemo.controller;
import com.alibaba.fastjson.JSONObject;
import mudemo.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
-
@author guozhengMu
-
@version 1.0
-
@date 2019/8/26 16:51
-
@description
-
@modify
*/
@RestController
@RequestMapping(value = “/goods”)
public class GoodsController {
@Autowired
private GoodsService goodsService;
@RequestMapping(value = "/goodsList", method = RequestMethod.GET)
public JSONObject getGoodsList(@RequestParam("pageNum") int pageNum, @RequestParam("pageSize") int pageSize) {
return goodsService.getGoodsList(pageNum, pageSize);
}
@RequestMapping(value = "/updateGood", method = RequestMethod.POST)
public JSONObject updateGood(@RequestBody JSONObject request) {
return goodsService.updateGood(request);
}
@RequestMapping(value = "/addGood", method = RequestMethod.POST)
public JSONObject addGood(@RequestBody JSONObject request) {
return goodsService.addGood(request);
}
@RequestMapping(value = "/deleteGood", method = RequestMethod.GET)
public JSONObject deleteGood(@RequestParam("id") int id) {
return goodsService.deleteGood(id);
}
}
### []( )接口层实现层
接口层省略,这里只贴上接口实现类:
package mudemo.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import mudemo.dao.GoodsMapper;
import mudemo.model.Good;
import mudemo.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
-
@author guozhengMu
-
@version 1.0
-
@date 2019/8/26 16:55
-
@description
-
@modify
*/
@Service(value = “GoodsService”)
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsMapper goodsMapper;
@Override
public JSONObject getGoodsList(int pageNum, int pageSize) {
JSONObject result = new JSONObject();
try {
PageHelper.startPage(pageNum, pageSize);
PageInfo<Good> pageInfo = new PageInfo(goodsMapper.getGoodsList());
result.put("code", "0");
result.put("msg", "操作成功!");
result.put("data", pageInfo.getList());
result.put("count", pageInfo.getTotal());
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "查询异常!");
}
return result;
}
@Override
public JSONObject addGood(JSONObject request) {
JSONObject result = new JSONObject();
try {
goodsMapper.addGood(request);
result.put("code", "0");
result.put("msg", "操作成功!");
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "新增商品异常!");
}
return result;
}
@Override
public JSONObject updateGood(JSONObject request) {
JSONObject result = new JSONObject();
try {
goodsMapper.updateGood(request);
result.put("code", "0");
result.put("msg", "操作成功!");
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "修改商品异常!");
System.out.println(e.getMessage());
}
return result;
}
@Override
public JSONObject deleteGood(int id) {
JSONObject result = new JSONObject();
try {
goodsMapper.deleteGood(id);
result.put("code", "0");
result.put("msg", "操作成功!");
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "删除商品异常!");
}
return result;
}
}
### []( )dao层
package mudemo.dao;
import com.alibaba.fastjson.JSONObject;
import mudemo.model.Good;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface GoodsMapper {
@Select("SELECT * FROM mutest.goods")
List<Good> getGoodsList();
@Insert("INSERT INTO mutest.goods(type,name,price,size,status,description)VALUES(#{type},#{name},#{price},#{size},#{status},#{description})")
int addGood(JSONObject request);
@Update("UPDATE mutest.goods SET type=#{type},name=#{name},price=#{price},size=#{size},status=#{status},description=#{description} WHERE id=#{id}")
void updateGood(JSONObject request);
@Delete("DELETE FROM mutest.goods WHERE id=#{id}")
void deleteGood(@Param("id") int id);
}
[]( )3.2 前端
----------------------------------------------------------------
### []( )index.html
<meta charset="UTF-8">
<title>商品信息</title>
<!--根据自己的项目目录修改-->
<link rel="stylesheet" href="layui/css/layui.css" media="all"/>
<form id="add_form" class="layui-form" action="" style="margin-top: 20px;align:center;">
<!--隐藏字段action,用来区分增加和编辑行为-->
<input type="hidden" name="action" id="action">
<!--隐藏字段id,用于提供编辑需要的主键-->
<input type="hidden" name="id" id="id">
<!--隐藏字段request_type,用于提供请求方式:get,post,put-->
<input type="hidden" name="request_type" id="request_type">
<div class="layui-form-item" style="display: table;width: 96%">
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">类  型</label>
<div class="layui-input-block">
<select id="" name="type" lay-filter="type" lay-verify="required">
<option value="">请选择</option>
<option value="国产">国产</option>
<option value="进口">进口</option>
</select>
</div>
</div>
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">产品名称</label>
<div class="layui-input-block">
<input type="text" name="name" placeholder="请输入产品名称"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
</div>
<div class="layui-form-item" style="display: table;width: 96%">
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">价  格</label>
<div class="layui-input-block">
<input type="text" name="price" placeholder="请输入价格"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
<div class="layui-form-item" style="display: table-cell;width: 50%">
<label class="layui-form-label">数  量</label>
<div class="layui-input-block">
<input type="text" name="size" placeholder="请输入数量"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
</div>
</div>
<div class="layui-form-item" style="width: 96%">
<label class="layui-form-label">说  明</label>
<div class="layui-input-block">
<input type="text" name="description" placeholder="请输入产品说明"
autocomplete="off" class="layui-input" lay-verify="required">
</div>
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。
我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
面试题及解析总结
大厂面试场景
知识点总结
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
=“description” placeholder=“请输入产品说明”
autocomplete="off" class="layui-input" lay-verify="required">
</div>
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-gwIpEgxq-1712799318332)]
[外链图片转存中…(img-3xL3BZIb-1712799318333)]
[外链图片转存中…(img-FgkopGnp-1712799318333)]
[外链图片转存中…(img-AzL0dgHt-1712799318334)]
[外链图片转存中…(img-wZbpZH2x-1712799318334)]
[外链图片转存中…(img-rlHgxAuZ-1712799318334)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-cwnajAhm-1712799318334)]
总结
面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。
我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
面试题及解析总结
[外链图片转存中…(img-QvfFEVK6-1712799318335)]
大厂面试场景
[外链图片转存中…(img-hGwEIk5w-1712799318335)]
知识点总结
[外链图片转存中…(img-J83wYe5Q-1712799318335)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-rN81BvDx-1712799318335)]