前言
在这篇文章介绍并记录关于Springboot+Mybatis后端集成Layui后台管理,实现前后端分离模式开发。
主要实现增加、删除、查询、修改、分页、批量删除等功能。一看就明白
不说别的,就直接贴上代码实现Demo例子。
1. 后台管理新增页面代码---add.html
注: 页面只贴跟后端代码实现的相关代码有关,主要参考使用ajax方法向后端传递参数,实现前后端分离开发模式。
2.2 后台管理列表页面代码--list.html
注意:列表页面实现的功能主要有查询、表格分页、修改、删除、批量删除。
3. 后端Springboot+Mybatis代码实现功能
注意:后端使用Springboot+Mybatis,使用了通用mapper以及pagehelper插件。
3.1 使用maven项目构建,先贴上pom.xml依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
tk.mybatis
mapper-spring-boot-starter
2.0.2
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.5
com.google.code.gson
gson
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
commons-codec
commons-codec
1.9
org.apache.commons
commons-collections4
4.0
3.2 Springboot yml配置文件
server:
servlet:
context-path: /自己的路径
port: 自己的端口
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 自己密码
url: jdbc:mysql://自己的地址/数据库名字?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.mi.entity
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count==countSql
page-size-zero: true
logging:
level:
com.mi.mapper: trace
3.3 贴上工具类
3.3.1 keyUtil 生成唯一主键
public class keyUtil {
/**
* 生成唯一的主键
* 格式:时间+随机数
* @return
*/
public static synchronized String genUniqueKey(){
Random random = new Random();
Integer number = random.nextInt(900000)+100000;
return System.currentTimeMillis() + String.valueOf(number);
}
}
3.3.2 TimeUtil 转化时间工具类
public class TimeUtil {
public static Date getNowDate(Date currentTime) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
ParsePosition pos = new ParsePosition(0);
Date currentTime_2 = formatter.parse(dateString, pos);
return currentTime_2;
}
}
3.3.3 统一返回数据封装类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse implements Serializable {
private Integer code;
private String message;
private T data;
public CommonResponse(Integer code, String message) {
this.code = code;
this.message = message;
}
}
3.3.4 统一返回数据封装工具类
public class ResponseVoUtil {
public static CommonResponse success(Object object) {
CommonResponse response = new CommonResponse();
response.setData(object);
response.setCode(0);
response.setMessage("成功");
return response;
}
public static CommonResponse success(){
return success(null);
}
public static CommonResponse error(Integer code,String msg){
CommonResponse response = new CommonResponse();
response.setCode(code);
response.setMessage(msg);
return response;
}
}
3.3.5 跨域配置
注意:要是前后端分离跨域不成功,需要配置这个方可配置
@Configuration
public class CorsFilter implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry corsRegistry){
corsRegistry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(1800)
.allowedOrigins("*");
}
}
3.3.6 Springboot 启动类
@SpringBootApplication
@MapperScan("com.mi.mapper") //自己需要扫描的mapper包名
public class WebApplication {
public static void main(String args[]){
SpringApplication.run(WebApplication.class,args);
}
}
3.4 后端其它需要的类
3.4.1 实体类
注意:该实体类可以自己定义,此处只为了参考
@Data
@Table(name = "appoint_item") //填写自己数据库的表名,最好用下划线声明表,例如appoint_item举例
public class AppointItem implements Serializable {
/**服务id**/
@Id
@KeySql(useGeneratedKeys = true) //回显
private String itemId;
/**服务名称**/
private String itemName;
/**服务状态 0 正常 1 关闭**/
private Integer itemStatus;
/**服务描述**/
private String itemDesc;
/**创建时间**/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
/**修改时间**/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date updateTime;
}
3.4.2 实体类form表单
注意:该类是会接受页面传递的值,然后使用转换属性的工具转到具体的对应数据库的实体类,下面会具体实现。
@Data
public class AppointItemForm {
private String itemId;
/**服务名称**/
private String itemName;
/**服务状态 0 正常 1 关闭**/
private Integer itemStatus;
/**服务描述**/
private String itemDesc;
/**创建时间**/
private Timestamp createTime;
/**修改时间**/
private Timestamp updateTime;
}
3.4.3 对应Dao层的mapper接口
注意:通过使用通用mapper插件,继续该mapper,就会有增删查改方法。
public interface AItemMapper extends Mapper {
/**
* 批量删除
* @param itemIds
* @return
*/
public int batchDelAItem(List itemIds);
}
3.4.4 业务接口类
public interface AItemService {
public void addAItem(AppointItem item);
public AppointItem seleceByOne(String appointId);
public int delectByOne(String appointId);
public int updateItem(AppointItem item);
/**
* 分页
* @param offset
* @param pageSize
* @return
*/
public PageInfo selectByPages(Integer offset, Integer pageSize,String keywords);
/**
* 批量删除
* @param itemIds
* @return
*/
public int batchDelAItem(List itemIds);
}
3.4.4 业务接口实现类
@Service
@Slf4j
public class AItemServiceImpl implements AItemService {
@Autowired
private AItemMapper aItemMapper;
/**
* 新增
* @param item
*/
@Override
public void addAItem(AppointItem item) {
aItemMapper.insertSelective(item);
}
/**
* 查询一个Item
* @param appointId
* @return
*/
@Override
public AppointItem seleceByOne(String appointId) {
return aItemMapper.selectByPrimaryKey(appointId);
}
/**
* 删除一个Item
* @param appointId
*/
@Override
public int delectByOne(String appointId) {
return aItemMapper.deleteByPrimaryKey(appointId);
}
/**
* 更新
* @param item
* @return
*/
@Override
public int updateItem(AppointItem item) {
return aItemMapper.updateByPrimaryKeySelective(item);
}
/**
* 分页
* @param offset
* @param pageSize
* @param itemName
* @return
*/
@Override
public PageInfo selectByPages(Integer offset, Integer pageSize,String itemName) {
PageHelper.startPage(offset,pageSize);
Example example = new Example(AppointItem.class);
Example.Criteria criteria = example.createCriteria();
// 1. 查询keywords 关键字
if (!StringUtils.isEmpty(itemName) && itemName.length() > 0) {
log.info("itemName = {}",itemName);
criteria.andLike("itemName","%"+itemName+"%");
}
List itemPages = aItemMapper.selectByExample(example);
PageInfo pageInfo = new PageInfo<>(itemPages);
return pageInfo;
}
/**
* 批量删除
* @param itemIds
* @return
*/
@Override
public int batchDelAItem(List itemIds) {
int isBatch = aItemMapper.batchDelAItem(itemIds);
return isBatch;
}
}
3.4.5 mapper.xml 文件
item_id,item_name,item_status,item_desc,create_time,update_time
DELETE FROM appoint_item WHERE item_id IN
#{item}
3.5 控制器实现类-controller
注意:该controller就是后台管理页面通过ajax调用controller的api接口实现前后端分离模式开发。
RestController
@Slf4j
@RequestMapping("/aItem")
public class StoreAItemController {
@Autowired
private AItemService aItemService;
/**
* 新增
* @param itemForm
* @return
*/
@PostMapping(value = "/addAItem")
public CommonResponse addAItem(AppointItemForm itemForm){
log.info("【使用addAItem方法】");
//1. 创建服务实体类
AppointItem item = new AppointItem();
//2. 判断服务名称是否为空
if (!StringUtils.isEmpty(itemForm.getItemName())){
itemForm.setItemId(keyUtil.genUniqueKey());
BeanUtils.copyProperties(itemForm,item);
item.setCreateTime(TimeUtil.getNowDate(new java.util.Date()));
aItemService.addAItem(item);
}
return ResponseVoUtil.success();
}
/**
* 查询一个Item
* @param appointId
* @return
*/
@GetMapping(value = "/selectAItem/{id}")
public CommonResponse selectAItem(@PathVariable("id")String appointId){
log.info("【使用selectAItem 方法】 = {}",appointId);
// 1.判断appointid是否为空
if (!StringUtils.isEmpty(appointId)){
AppointItem item = aItemService.seleceByOne(appointId);
return ResponseVoUtil.success(item);
}
// 2. 为空就返回null
return null;
}
/**
* 删除一个Item
* @param appointId
* @return
*/
@DeleteMapping(value = "/deletetAItem/{id}")
public CommonResponse deletetAItem(@PathVariable("id")String appointId){
log.info("【使用delectAItem】 = {}",appointId);
int isDelete = aItemService.delectByOne(appointId);
return ResponseVoUtil.success(isDelete);
}
/**
* 分页
* @param offset
* @param size
* @param itemName
* @return
*/
@GetMapping(value = "/pagesAItems")
public CommonResponse pagesAItems(@RequestParam(value = "page",defaultValue = "0")Integer offset,
@RequestParam(value = "size",defaultValue = "10")Integer size
, @RequestParam(value = "itemName",required = false) String itemName
){
log.info("【使用pagesAItems】");
log.info(" itemName = {}",itemName);
PageInfo pageInfo = aItemService.selectByPages(offset,size,itemName);
return ResponseVoUtil.success(pageInfo);
}
/**
* 更新预约服务
* @param itemForm
* @return
*/
@PostMapping(value = "updateAItem")
public CommonResponse updateAItem(@RequestBody AppointItemForm itemForm){
log.info("【使用updateAItem】");
log.info(" item = {}",itemForm);
AppointItem item = new AppointItem();
if (!StringUtils.isEmpty(itemForm.getItemName())){
BeanUtils.copyProperties(itemForm,item);
item.setUpdateTime(TimeUtil.getNowDate(new java.util.Date()));
int isUpdate = aItemService.updateItem(item);
return ResponseVoUtil.success(isUpdate);
}
return null;
}
/**
* 批量删除
* @param itemIds
* @return
*/
@PostMapping(value = "/batchDelAItem/{itemIds}")
public CommonResponse batchDelAItem (@PathVariable("itemIds") String itemIds){
log.info("【使用batchDelAItem】");
log.info("itemIds = {}",itemIds);
List idsList = new ArrayList();
String [] strIds = itemIds.split(",");
for (String str : strIds){
idsList.add(str);
}
log.info("idsList = {}",idsList);
int isBatch = aItemService.batchDelAItem(idsList);
return ResponseVoUtil.success(isBatch);
}
}
4 表格分页效果图展示
4.1 新增页面效果图
4.2 列表页面效果图
4.3 查询效果图
4.4 修改效果图
4.5 删除效果图
4.6 批量删除效果图
5.结语
大致就把一个Demo案例实现了,目前只有增删查改、分页、批量删除功能。需要的同学可以参考该Demo的实例实现自己的相关功能。
如果觉得不错的话就为我点个赞吧。
要是有问题可在留言提问,我们来讨论讨论。