一、静态页面
静态页面和完整程序有需留言即可。
另外个人地址为:添加链接描述
1.1 留言表单
1.2 留言贴列表
1.3 分页
二、程序设计【Springboot】
个人本户采用的是Springboot2+JPA完成设计的。
数据库会根据java实体类中的字段进行自动创建,不需要自己创建。
2.1 数据库实体设计
在数据库主要是对于留言贴这个对象的属性进行设计,比较简单,主要有ID,昵称字段,日期,留言贴内容,头像,性别等属性,这也是在表单中即将提交的内容。
2.2 Java实体类
省略构造,getter setter toString等方法。
@Entity @Table(name = "t_message") public class Message { @Id @GeneratedValue private Long id; // 留言昵称 private String nickname; // 性别 private String sex; // 留言内容 private String content; // 留言头像 private String avatar; // 留言时间 @Temporal(TemporalType.TIMESTAMP) private Date createTime; }
2.3 MessageService服务接口
接口功能:帖子存库,删除帖子【后台审核】,分页查询帖子数据封装到JPA中的Pageable中。
public interface MessageService { // 做留言贴存库 void getMessage(Message message); // 分页查询 public Page<Message> listMessage(Pageable pageable); // 删除留言 void delete(Long id); }
2.4 MessageServiceImpl实现类
@Service public class MessageServiceImpl implements MessageService { @Autowired private MessageRepository messageRepository; @Transactional @Override public void getMessage(Message message) { message.setCreateTime(new Date()); messageRepository.save(message); } //分页查询 jpa封装的 @Override public Page<Message> listMessage(Pageable pageable) { return messageRepository.findAll(pageable); } @Override public void delete(Long id) { messageRepository.deleteById(id); } }
2.5 DAO操作数据库
数据操作层,采用了JPA封装CRUD,只需要继承一个JpaRepository类即可。这也是和MybatisPlus如出一辙的想法。
public interface MessageRepository extends JpaRepository<Message, Long> { }
2.6 Controller层实现
控制层只做了简单的跳转和判空操作,为了安全起见,应该将视图层,控制层还有数据层全部需要进行判空,这里不做了。
@Controller public class MessageController { @Autowired MessageService messageService; // 带有分页的便利贴 @RequestMapping("/message") public String message(@PageableDefault(size = 12, sort = {"createTime"}, direction = Sort.Direction.DESC) Pageable pageable, Model model){ model.addAttribute("page", messageService.listMessage(pageable)); return "message"; } /** * 获取前台留言板信息 */ @PostMapping("/getMessage") public String getMessage(Message message,Model model){ if (message.getAvatar()!=null && message.getContent()!=null && message.getNickname()!=null && message.getSex()!=null){ // 插入数据库 messageService.getMessage(message); }else{ } return "redirect:/message"; } }
2.7 HTML数据渲染
数据渲染只展示出了留言贴的遍历和分页数据的简单使用。
提交表单:略 留言贴: <div class="suiyan_list"> <ul> <li th:each="message : ${page}"><a> <p class="suiyan_time" style="color: deeppink" th:text="${message.nickname}+' && '+${#dates.format(message.createTime,'yyyy-MM-dd')}">你的昵称 & 2020-07-04</p> <p class="suiyan_text" th:text="${message.content}">随着年龄的增长,人总会变得越来越宽容;所以很多事情到最后并不是真的解决了,而是,算了吧。</p> <img style="padding-bottom: 1px;" height="40px" width="40px" th:src="@{${message.avatar}}"> <span style="font-size: 20px;color: deeppink" th:text="${message.sex}">女生</span> </a> </li> </ul> </div> 分页: <!--分页--> <div class="pagelist2" th:if="${page.totalPages}>1"> <a th:href="@{/message/(page=0)}" th:classappend="${page.number==0} ? 'curPage'">首页</a> <a th:href="@{/message/(page=1)}" th:classappend="${page.number==1} ? 'curPage'">2</a> <a th:href="@{/message/(page=2)}" th:classappend="${page.number==2} ? 'curPage'">3</a> <a>...</a> <a th:href="@{/message/(page=${page.totalPages}-1)}" th:classappend="${page.number==page.totalPages-1} ? 'curPage'" >末页</a> <a th:href="@{/message/(page=${page.number}-1)}" th:unless="${page.first}">上一页</a> <a th:href="@{/message/(page=${page.number}+1)}" th:unless="${page.last}">下一页</a> </div>