前言:
小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java快一年时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。首先给各位粉丝朋友们道个歉,在2022年上半年中,我因为参加实习、做毕设和写论文,以及毕业答辩等诸多原因,不得不停更之前的博客系列,不过现在我忙完后就又回来了,后续将会给大家分享更多的编程干货。 最近这段时间我会将在毕设项目的编写过程中所遇到的问题以及解决问题的方法进行总结,整理成这个 SpringBoot+LayUI前后端分离项目实战系列 。今天分享的问题是:如何使用SpringBoot和LayUI来实现系统公告通知功能,具体解决方案如下,请各位小伙伴们耐心观看:
1.SpringBoot后端代码
由于我使用的持久层是优秀的Mybatis-Plus框架,可以省去基本增删改查的编写,所以这里只展示Sevice层和Controller层的实现代码
1.1 SportInfoService服务层接口的实现代码
package com.rz.sport_manager.service;
public interface SportInfoService extends IService<SportInfo> {
public JsonResult<List<SportVo>> getLastFifthIsPublishedSportInfoList();
}
1.2 SportInfoServiceImpl服务层接口实现类的实现代码
package com.rz.sport_manager.service.impl;
@Service
public class SportInfoServiceImpl extends ServiceImpl<SportInfoMapper, SportInfo> implements SportInfoService {
@Autowired
private SportInfoMapper sportInfoMapper;
@Override
public JsonResult<List<SportVo>> getLastFifthIsPublishedSportInfoList() {
QueryWrapper<SportInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status",1);
queryWrapper.orderByDesc(true,"sport_id");
IPage<SportInfo> sportIPage = new Page<>(1,5);
IPage<SportInfo> result = sportInfoMapper.selectPage(sportIPage, queryWrapper);
List<SportInfo> sportInfoList = result.getRecords();
List<SportVo> sportVoList = new ArrayList<>();
for (SportInfo sportInfo : sportInfoList) {
SportVo sportVo = new SportVo();
BeanUtils.copyProperties(sportInfo,sportVo);
sportVoList.add(sportVo);
}
return JsonResult.batchDataSuccess((int) result.getTotal(),sportVoList);
}
}
上面出现的SportVo其实就是 SportInfo(运动会信息实体类)的视图对象,具体代码我就不进行展示了。
1.3 SportInfoController控制层的实现代码
package com.rz.sport_manager.controller;
@Controller
@RequestMapping("/sport_manager/sport_info")
public class SportInfoController {
@Autowired
private SportInfoService sportInfoService;
@GetMapping("/getLastFifthIsPublishedSportInfoList")
@ResponseBody
public JsonResult<List<SportVo>> getLastFifthIsPublishedSportInfoList(){
return sportInfoService.getLastFifthIsPublishedSportInfoList();
}
}
前面的代码中反复使用到了一个工具类JsonResult,为了方便大家理解,我把实现代码也展示一下:
1.4 JsonResult工具类的实现代码
package com.rz.sport_manager.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonResult<T> implements Serializable {
private Integer code;
private String msg;
private Integer count;
private T data;
public static <T> JsonResult<T> oneDataSuccess(T data) {
return new JsonResult<T>(0,"oneDataSuccess",1,data);
}
public static <T> JsonResult<T> oneDataFailure() {
return new JsonResult<T>(1,"oneDataFailure",0,null);
}
public static <T> JsonResult<T> batchDataSuccess(Integer count,T data) {
return new JsonResult<T>(0,"batchDataSuccess",count,data);
}
public static <T> JsonResult<T> batchDataFailure() {
return new JsonResult<T>(1,"batchDataFailure",0,null);
}
}
后端的主要实现代码基本就是上述这些了,如对其中的实现代码存在疑惑,可以随时私聊我!
2.LayUI前端代码
主要功能就是在系统的后台首页的系统公告区域上展示已经发布的运动会报名信息,其页面代码和显示效果如下所示:
2.1 系统公告的前端实现代码
<style>
.welcome .layui-card {border:1px solid #f2f2f2;border-radius:5px;}
.welcome .layuimini-notice:hover {background:#f6f6f6;}
.welcome .layuimini-notice {padding:7px 16px;clear:both;font-size:12px !important;cursor:pointer;position:relative;transition:background 0.2s ease-in-out;}
.welcome .layuimini-notice-title {padding-right:70px !important;text-overflow:ellipsis !important;overflow:hidden !important;white-space:nowrap !important;}
.welcome .layuimini-notice-title {line-height:28px;font-size:14px;}
.welcome .layuimini-notice-extra {position:absolute;top:50%;margin-top:-8px;right:16px;display:inline-block;height:16px;color:#999;}
</style>
<div class="layuimini-container layuimini-page-anim">
<div class="layuimini-main welcome">
<div class="layui-row layui-col-space20">
<div class="layui-col-md12">
<div class="layui-row layui-col-space15">
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header"><i class="fa fa-bullhorn icon icon-tip"></i>系统公告</div>
<div class="layui-card-body layui-text">
<div id="notice" class="layui-card">
<script type="text/html" id="noticeTemplate">
<!-- 使用layui的each循环, 遍历数据集合信息(注意: 这里一定要使用d.data; 参数index表示集合下标, item表示集合元素) -->
{{# layui.each(d.data,function(index,item){ }}
<div class="layuimini-notice">
<!-- class选择器为"layuimini-notice-title"的div盒子用于存储公告通知中的标题 -->
<!-- 判断当前元素下标是否位于集合的前两位, 若为前两位, 则在运动会名称后加上new的字样 -->
{{# if(index<=1) { }}
<!-- 遍历每个元素值均使用 {{ item.字段名 }} 格式(注意: {{后无需加#号) -->
<div class="layuimini-notice-title">{{ item.sportName }}报名开启 <span class="label layui-bg-red">new</span></div>
{{# } else { }}
<!-- 若当前元素下标不位于集合中的前两位, 则无需显示new字样 -->
<div class="layuimini-notice-title">{{ item.sportName }}报名开启</div>
{{# } }}
<!-- class选择器为"layuimini-notice-extra"的div盒子用于存储公告通知中的发布时间 -->
<div class="layuimini-notice-extra">{{ item.createTime }}</div>
<!-- class选择器为"layuimini-notice-content"的div盒子用于存储公告通知的具体内容, 使用layui-hide将内容隐藏, 在查看详情时展示 -->
<div class="layuimini-notice-content layui-hide">
<!-- 仍旧是遍历每个元素值, 也是使用 {{ item.字段名 }} 的格式 -->
<span style="font-size:14px;font-weight: bolder;color: #000000">运动会名:</span>{{ item.sportName }} <br>
<span style="font-size:14px;font-weight: bolder;color: #000000">举办场地:</span>{{ item.place }} <br>
<span style="font-size:14px;font-weight: bolder;color: #000000">举办方:</span>{{ item.holder }} <br>
<span style="font-size:14px;font-weight: bolder;color: #000000">举办时间:</span>{{ item.startTime}} 至 {{ item.endTime }} <br>
<span style="font-size:14px;font-weight: bolder;color: #000000">详情描述:</span>{{ item.description }} <br>
</div>
</div>
<!-- 循环结束记得加上这个 -->
{{# }); }}
</script>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
layui.use(['layer','jquery','laytpl'], function () {
var $ = layui.jquery,
layer = layui.layer,
laytpl = layui.laytpl;
let sportInfoList;
$.ajax({
type: 'GET',
url: 'http://localhost:8080/sport_manager/sport_info/getLastFifthIsPublishedSportInfoList',
dataType: 'json',
contentType: 'application/json',
async: false,
success: function (data) {
if(data.code === 0) {
sportInfoList = data;
} else {
layer.msg('获取已发布的运动会信息失败!', {icon: 2});
}
}
});
let noticeTpl = noticeTemplate.innerHTML,
notice = document.getElementById('notice');
laytpl(noticeTpl).render(sportInfoList, function(html) {
notice.innerHTML = html;
});
$('body').on('click', '.layuimini-notice', function () {
var title = $(this).children('.layuimini-notice-title').text().replace("new",""),
noticeTime = $(this).children('.layuimini-notice-extra').text(),
content = $(this).children('.layuimini-notice-content').html();
var html = '<div style="padding:15px 20px; text-align:justify; line-height: 22px;border-bottom:1px solid #e2e2e2;background-color: #ffffff;color: #000000">\n' +
'<div style="text-align: center;margin-bottom: 20px;font-weight: bold;border-bottom:1px solid #718fb5;padding-bottom: 5px">\n' +
'<h3 class="text-danger" style="font-size:16px;font-weight:bolder;color:red;">' + title + '</h3></div>\n' +
'<div style="font-size: 15px">' + content + '</div>\n' +
'</div>\n';
parent.layer.open({
type: 1,
title: ['系统公告'+ '<span style="float: right;right: 1px;font-size: 14px;color: #b1b3b9;margin-top: 1px">' + noticeTime + '</span>', 'font-size:18px;'],
area: ['500px','500px'],
shade: 0.3,
id: 'layuimini-notice',
btn: ['查看', '取消'],
btnAlign: 'c',
moveType: 1,
content: html,
success: function (layero) {
var btn = layero.find('.layui-layer-btn');
btn.find('.layui-layer-btn0').attr({
href: 'https://gitee.com/zhongshaofa/layuimini',
target: '_self'
});
}
});
});
});
</script>
2.2 系统公告的页面显示效果
2.2.1 系统公告整体显示效果
2.2.2 点击后查看公告详情
以上就是如何使用SpringBoot和LayUI来实现系统公告通知功能的所有分享内容了。欢迎各位小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!
参考文档链接:LayUI模板文档
|