• 简易留言板


    目录

    前端实现

    数据库的使用

    创建数据表

    创建项目

    连接数据库

    后端实现

    接口定义

    持久层

    业务逻辑层

    控制层

    前端代码完善


    留言板是一个常见的功能,在本篇文章中,将实现一个简易的留言板:

    页面中能够显示所有留言内容,当点击发布留言后,内容会在下方空白处进行显示

    前端实现

    在这里,使用的是 HTML、CSS 和 JavaScript 实现:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>简易留言板title>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js">script>
    8. <style>
    9. .container {
    10. margin: 20px;
    11. }
    12. .submit {
    13. width: 150px;
    14. height: 40px;
    15. background-color: #ffb3a7;
    16. color: white;
    17. border: none;
    18. margin: 10px;
    19. border-radius: 5px;
    20. font-size: 20px;
    21. }
    22. style>
    23. head>
    24. <body>
    25. <div class="container">
    26. <h1>简易留言板h1>
    27. <form id="messageForm">
    28. <label for="author">作者:label>
    29. <input type="text" id="author" required><br>
    30. <label for="content">内容:label><br>
    31. <textarea id="content" rows="4" cols="50" required>textarea><br>
    32. <button type="submit" class="submit">发布留言button>
    33. form>
    34. div>
    35. <script>
    36. // 监听表单提交事件
    37. $('#messageForm').submit(function(event) {
    38. event.preventDefault(); // 阻止表单默认提交行为
    39. var author = $('#author').val();
    40. var content = $('#content').val();
    41. if (author && content) {
    42. //构造节点
    43. var divE = '
      ' + author + '留言:' + content;
    44. // 将节点添加到页面上
    45. $('.container').append(divE);
    46. // 清空表单输入框
    47. $('#author').val('');
    48. $('#content').val('');
    49. }else {
    50. alert('作者和内容不能为空!');
    51. }
    52. });
    53. script>
    54. body>
    55. html>

    当我们点击提交后,留言内容显示在下方空白处

    当我们进行刷新时,数据就会丢失,要想数据不丢失,需要将数据存储在数据库中

    数据库的使用

    要想使用数据库存储数据,我们首先需要创建数据表

    创建数据表

    1. DROP TABLE IF EXISTS message_info;
    2. CREATE TABLE `message_info` (
    3. `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
    4. `author` VARCHAR ( 127 ) NOT NULL,
    5. `message` VARCHAR ( 256 ) NOT NULL,
    6. `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
    7. `create_time` DATETIME DEFAULT now(),
    8. `update_time` DATETIME DEFAULT now() ON UPDATE now(),
    9. PRIMARY KEY ( `id` )
    10. ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

    此时,创建出表 message_info

    虽然当前实现的留言板不涉及更新和删除操作,但在这里仍然创建了字段 delete_flag、update_flag,若后续增加了相关功能,则不需要再对数据表进行修改

    接下来我们使用 MyBatis 来实现数据的操作

    创建项目

    我们首先创建SpringBoot工程,并引入MyBatis 和 MySQL驱动依赖

    连接数据库

    1. spring:
    2. datasource:
    3. url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    4. username: root
    5. password: 123123
    6. driver-class-name: com.mysql.cj.jdbc.Driver
    7. mybatis:
    8. configuration: #打印 MyBatis 日志
    9. map-underscore-to-camel-case: true #驼峰字段转换

    连接好数据库后,我们就可以开始编写后端代码了

    后端实现

    我们首先创建留言对象 MessageInfo 类

    1. package com.example.messageboard.model;
    2. import lombok.Data;
    3. import java.util.Date;
    4. @Data
    5. public class MessageInfo {
    6. private Integer id;
    7. private String author;
    8. private String message;
    9. private Integer deleteFlag;
    10. private Date createTime;
    11. private Date updateTime;
    12. }

    根据留言板的需求可看出,后端需要提供两个服务:

    1. 添加留言:用户输入留言信息后,后端需要将留言信息存到数据库中

    2. 显示留言:页面展示时,需要从后端获取到所有的留言信息

    接口定义

    添加留言

    [URL]

    POST /message/publish

    [请求参数]

    author=ppp&message=ppp

    [响应]

    true //添加成功

    false //添加失败

    显示留言

    [URL]

    GET /message/getList

    [请求参数]

    [响应]

    返回留言列表

    [

        {

            "id": 1,

            "author": "aa",

            "message": "aa",

            "deleteFlag": 0,

            "createTime": "2024-05-11T09:42:59.000+00:00",

            "updateTime": "2024-05-11T09:42:59.000+00:00"

        },

        {

            "id": 2,

            "author": "aa",

            "message": "aa",

            "deleteFlag": 0,

            "createTime": "2024-05-11T09:52:01.000+00:00",

            "updateTime": "2024-05-11T09:52:01.000+00:00"

        },

        {

            "id": 3,

            "author": "aa",

            "message": "aa",

            "deleteFlag": 0,

            "createTime": "2024-05-11T09:52:15.000+00:00",

            "updateTime": "2024-05-11T09:52:15.000+00:00"

        }

    ]

    持久层

    将应用程序的数据持久化到数据库中,并提供对数据库的访问操作

    实现向数据库中添加留言和从数据库中查询所有留言:

    1. package com.example.messageboard.mapper;
    2. import com.example.messageboard.model.MessageInfo;
    3. import org.apache.ibatis.annotations.Insert;
    4. import org.apache.ibatis.annotations.Mapper;
    5. import org.apache.ibatis.annotations.Select;
    6. import java.util.List;
    7. @Mapper
    8. public interface MessageInfoMapper {
    9. @Insert("insert into message_info (`author`, `message`) values (#{author}, #{message})")
    10. Integer addMessage(MessageInfo messageInfo);
    11. @Select("select `id`, `author`, `message`,`delete_flag`, `create_time`, `update_time` from message_info where delete_flag = 0")
    12. List queryAll();
    13. }

    业务逻辑层

    处理具体的业务逻辑

    由于留言板的功能简单,不需要进行其他的处理,因此,我们直接调用messageInfoMapper的方法并返回即可

    1. package com.example.messageboard.service;
    2. import com.example.messageboard.mapper.MessageInfoMapper;
    3. import com.example.messageboard.model.MessageInfo;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. import java.util.List;
    7. @Service
    8. public class MessageInfoService {
    9. @Autowired
    10. private MessageInfoMapper messageInfoMapper;
    11. public int addMessage(MessageInfo messageInfo) {
    12. return messageInfoMapper.addMessage(messageInfo);
    13. }
    14. public List queryAll() {
    15. return messageInfoMapper.queryAll();
    16. }
    17. }

    控制层

    接收前端发送的请求,对请求进行处理,并响应数据

    添加留言:进行参数校验,校验通过后添加留言 

    查询留言:返回留言列表

    1. package com.example.messageboard.controller;
    2. import com.example.messageboard.model.MessageInfo;
    3. import com.example.messageboard.service.MessageInfoService;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.util.StringUtils;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import org.springframework.web.bind.annotation.RestController;
    9. import java.util.List;
    10. @RequestMapping("/message")
    11. @RestController
    12. @Slf4j
    13. public class MessageInfoController {
    14. @Autowired
    15. private MessageInfoService messageInfoService;
    16. /**
    17. * 发布留言
    18. * @param messageInfo
    19. * @return
    20. */
    21. @RequestMapping("/publish")
    22. public boolean publish(MessageInfo messageInfo){
    23. log.info("接收到参数messageInfo: {}", messageInfo);
    24. //参数校验
    25. if(!StringUtils.hasLength(messageInfo.getAuthor())
    26. || !StringUtils.hasLength(messageInfo.getMessage())){
    27. return false;
    28. }
    29. int result = messageInfoService.addMessage(messageInfo);
    30. if(result > 0){
    31. return true;
    32. }
    33. return false;
    34. }
    35. /**
    36. * 获取留言列表
    37. * @return
    38. */
    39. @RequestMapping("/getList")
    40. public List getList(){
    41. return messageInfoService.queryAll();
    42. }
    43. }

    后端代码编写完成后,我们运行程序,并进行测试:

    我们首先测试添加留言:

    分别测试 添加成功、未输入昵称、未输入留言三种情况下的添加:

    结果正确

    我们再测试显示留言:

    结果正确 

    接下来,我们来完善客户端代码

    前端代码完善

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>简易留言板title>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js">script>
    8. <style>
    9. .container {
    10. margin: 20px;
    11. }
    12. .submit {
    13. width: 150px;
    14. height: 40px;
    15. background-color: #ffb3a7;
    16. color: white;
    17. border: none;
    18. margin: 10px;
    19. border-radius: 5px;
    20. font-size: 20px;
    21. }
    22. style>
    23. head>
    24. <body>
    25. <div class="container">
    26. <h1>简易留言板h1>
    27. <form id="messageForm">
    28. <label for="author">作者:label>
    29. <input type="text" id="author" required><br>
    30. <label for="content">内容:label><br>
    31. <textarea id="content" rows="4" cols="50" required>textarea><br>
    32. <button type="submit" class="submit">发布留言button>
    33. form>
    34. div>
    35. <script>
    36. //获取留言
    37. $.ajax({
    38. url: '/message/getList',
    39. method: 'GET',
    40. success: function(messageInfos) {
    41. // console.log(messageInfos);
    42. var divE = "";
    43. for(var message of messageInfos){
    44. divE += '
      ' + message.author + '留言:' + message.message;
    45. }
    46. $('.container').append(divE);
    47. },
    48. error: function(error) {
    49. console.error('获取留言列表时发生错误:', error);
    50. }
    51. });
    52. // 监听表单提交事件
    53. $('#messageForm').submit(function(event) {
    54. event.preventDefault(); // 阻止表单默认提交行为
    55. var author = $('#author').val();
    56. var content = $('#content').val();
    57. if (author && content) {
    58. // 发送 AJAX 请求保存留言
    59. $.ajax({
    60. url: '/message/publish',
    61. method: 'POST',
    62. data: { author: author, message: content },
    63. success: function(result) {
    64. console.log(result);
    65. //构造节点
    66. var divE = '
      ' + author + '留言:' + content;
    67. // 将节点添加到页面上
    68. $('.container').append(divE);
    69. // 清空表单输入框
    70. $('#author').val('');
    71. $('#content').val('');
    72. },
    73. error: function(error) {
    74. console.error('保存留言时发生错误:', error);
    75. }
    76. });
    77. } else {
    78. alert('作者和内容不能为空!');
    79. }
    80. });
    81. script>
    82. body>
    83. html>

    最后,我们进行测试:

    所有留言信息成功显示,且新添加的留言信息也在下方成功显示 

  • 相关阅读:
    CentOS7安装jdk
    基于JAVA开发的在线双人联机坦克大战小游戏
    git 相关指令总结(持续更新中......)
    iperf带宽探测工具
    Spring—Bean的装配方式—基于注解的七种装配方式
    Genesis公链:夯实Web 3.0发展底座
    【代码随想录】day45
    测试工程师面试攻略:教你如何描述项目经验
    uniapp onPageScroll监听页面滚动不起作用?解决方案
    UML类图
  • 原文地址:https://blog.csdn.net/2301_76161469/article/details/138719221