JS实现留言板功能

JS实现留言板功能需要分为前端和后端两部分来完成。前端主要负责用户交互的展示和处理,后端主要负责数据的存储和传递。

前端实现

1. HTML和CSS

首先需要创建一个包含留言板所需元素的HTML文件,并使用CSS样式美化页面。留言板所需的元素可能包括标题、留言内容输入框、留言列表等等。需要注意的是,留言列表实际上是一个包含多个留言的容器,而每个留言又由多个元素组成,如留言的作者、时间、内容等。

2. JavaScript

接下来需要使用JavaScript处理用户的留言输入和页面展示。具体来说,可以实现以下功能:

  • 用户点击“提交”按钮后,获取留言内容并将其添加到留言列表(需要将用户输入的内容进行转义,防止注入攻击)
  • 点击“删除”按钮可以删除对应的留言
  • 点击“修改”按钮可以修改对应的留言
  • 对留言列表进行分页和排序
  • 通过AJAX调用后端接口,将留言内容提交到后端

这些功能可以使用原生的JavaScript来实现,也可以使用现成的前端框架如jQuery、Vue、React等来实现。

后端实现

1. 数据库

要存储用户的留言,需要创建一张留言表并定义列名和数据类型。一般来说,我们需要留言的作者、时间、内容等信息,并将这些信息按照一定的规范存储到数据库中。

2. 后端接口

创建后端接口,接收前端传递过来的留言信息,将其存储到数据库中,并返回插入成功的结果。后端接口一般使用PHP、Java或Node.js等语言来实现。接口的编写需要注意输入参数的验证和输出结果的格式。

例如,在Node.js中,可以使用Express框架创建API接口:

const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');

const pool = mysql.createPool({
  connectionLimit: 5,
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'test'
});

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.post('/message', (req, res) => {
  const { author, content } = req.body;
  pool.query('INSERT INTO messages (author, content) VALUES (?, ?)', [author, content], (err, results) => {
    if (err) {
      console.error(err);
      res.status(500).json({ success: false, message: '添加留言失败' });
    } else {
      res.json({ success: true, message: '添加留言成功' });
    }
  });
});

app.listen(3000, () => console.log('Server is running.'));

示例

示例1:使用jQuery实现留言

以下代码使用jQuery实现留言功能,使用AJAX调用后端接口提交留言信息。留言列表使用Bootstrap样式实现,具有删除和分页功能。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>留言板</title>
  <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col-sm-6">
        <h1>留言板</h1>
        <form id="message-form">
          <div class="form-group">
            <label>作者</label>
            <input type="text" class="form-control" name="author">
          </div>
          <div class="form-group">
            <label>内容</label>
            <textarea rows="5" class="form-control" name="content"></textarea>
          </div>
          <button type="submit" class="btn btn-primary">提交</button>
        </form>
      </div>
      <div class="col-sm-6">
        <h1>留言列表</h1>
        <table class="table table-bordered">
          <thead>
            <tr>
              <th>#</th>
              <th>作者</th>
              <th>时间</th>
              <th>内容</th>
              <th>操作</th>
            </tr>
          </thead>
          <tbody id="message-list"></tbody>
        </table>
        <ul class="pagination"></ul>
      </div>
    </div>
  </div>
  <script>
    $(function () {
      const MESSAGE_PAGE_SIZE = 10;

      // 获取留言列表
      const getMessageList = function (page) {
        $.ajax({
          url: 'http://localhost:3000/messages',
          type: 'GET',
          data: {
            page: page,
            size: MESSAGE_PAGE_SIZE
          },
          dataType: 'json',
          success: function (data) {
            const list = data.list || [];
            const total = data.total || 0;
            const currentPage = data.currentPage || 1;
            const pageCount = Math.ceil(total / MESSAGE_PAGE_SIZE);
            const $pagination = $('.pagination').empty();

            // 构建分页链接
            for (let i = 1; i <= pageCount; i++) {
              const $li = $('<li>');
              const $a = $('<a>', { href: 'javascript: void(0)', text: i });
              if (i === currentPage) {
                $li.addClass('active');
              }
              $li.append($a);
              $pagination.append($li);
            }

            // 构建留言列表
            const $list = $('#message-list').empty();
            list.forEach((item, index) => {
              const $tr = $('<tr>');
              $tr.append($('<td>', { text: index + 1 }));
              $tr.append($('<td>', { text: item.author }));
              $tr.append($('<td>', { text: item.createdAt }));
              $tr.append($('<td>', { text: item.content }));
              const $td = $('<td>');
              const $buttonDelete = $('<button>', {
                type: 'button',
                class: 'btn btn-danger',
                text: '删除'
              });
              $buttonDelete.click(() => deleteMessage(item.id));
              const $buttonEdit = $('<button>', {
                type: 'button',
                class: 'btn btn-primary',
                text: '编辑'
              });
              $buttonEdit.click(() => editMessage(item));
              $td.append($buttonDelete);
              $td.append($buttonEdit);
              $tr.append($td);
              $list.append($tr);
            });
          },
          error: function (err) {
            console.error(err);
          }
        });
      };

      // 删除留言
      const deleteMessage = function (id) {
        $.ajax({
          url: `http://localhost:3000/messages/${id}`,
          type: 'DELETE',
          dataType: 'json',
          success: function () {
            getMessageList();
          },
          error: function (err) {
            console.error(err);
          }
        });
      };

      // 编辑留言
      const editMessage = function (item) {
        const author = prompt('请输入作者', item.author);
        const content = prompt('请输入内容', item.content);
        if (author && content) {
          $.ajax({
            url: `http://localhost:3000/messages/${item.id}`,
            type: 'PUT',
            dataType: 'json',
            data: { author, content },
            success: function () {
              getMessageList();
            },
            error: function (err) {
              console.error(err);
            }
          });
        }
      };

      // 提交留言
      $('#message-form').submit(function (event) {
        event.preventDefault();
        const author = $(this).find('[name="author"]').val();
        const content = $(this).find('[name="content"]').val();
        if (author && content) {
          $.ajax({
            url: 'http://localhost:3000/messages',
            type: 'POST',
            data: { author, content },
            dataType: 'json',
            success: function () {
              $(event.target).get(0).reset();
              getMessageList();
            },
            error: function (err) {
              console.error(err);
            }
          });
        }
      });

      // 绑定分页链接点击事件
      $('.pagination').on('click', 'a', function () {
        const $a = $(this);
        if (!$a.parent().hasClass('active')) {
          const page = +$a.text();
          getMessageList(page);
        }
      });

      // 初始化页面
      getMessageList();
    });
  </script>
</body>
</html>

示例2:使用React实现留言

以下代码使用React实现留言功能,通过调用后端接口提交和获取留言信息。留言列表使用Antd样式实现,具有删除、分页和编辑功能。

import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';
import { List, Input, Button, message, Pagination } from 'antd';
import moment from 'moment';
import 'antd/dist/antd.css';
import './index.css';

const MESSAGE_PAGE_SIZE = 10;

const App = () => {
  const [author, setAuthor] = useState('');
  const [content, setContent] = useState('');
  const [list, setList] = useState([]);
  const [total, setTotal] = useState(0);
  const [currentPage, setCurrentPage] = useState(1);

  useEffect(() => {
    getMessageList();
  }, [currentPage]);

  const getMessageList = (page = 1) => {
    fetch(`http://localhost:3000/messages?page=${page}&size=${MESSAGE_PAGE_SIZE}`)
      .then(res => res.json())
      .then(data => {
        setList(data.list || []);
        setTotal(data.total || 0);
        setCurrentPage(data.currentPage || 1);
      })
      .catch(err => console.error(err));
  };

  const deleteMessage = id => {
    fetch(`http://localhost:3000/messages/${id}`, { method: 'DELETE' })
      .then(() => getMessageList())
      .catch(err => console.error(err));
  };

  const editMessage = item => {
    const author = prompt('请输入作者', item.author);
    const content = prompt('请输入内容', item.content);
    if (author && content) {
      fetch(`http://localhost:3000/messages/${item.id}`, {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ author, content })
      })
        .then(() => getMessageList())
        .catch(err => console.error(err));
    }
  }

  const handleSubmit = event => {
    event.preventDefault();
    if (author && content) {
      fetch('http://localhost:3000/messages', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ author, content })
      })
        .then(() => {
          setAuthor('');
          setContent('');
          getMessageList();
        })
        .catch(err => console.error(err));
    }
  };

  return (
    <div className="container">
      <div className="row">
        <div className="col-sm-6">
          <h1>留言板</h1>
          <form onSubmit={handleSubmit}>
            <div className="form-group">
              <label>作者</label>
              <Input value={author} onChange={e => setAuthor(e.target.value)} />
            </div>
            <div className="form-group">
              <label>内容</label>
              <Input.TextArea rows={5} value={content} onChange={e => setContent(e.target.value)} />
            </div>
            <Button type="primary" htmlType="submit">提交</Button>
          </form>
        </div>
        <div className="col-sm-6">
          <h1>留言列表</h1>
          <List
            itemLayout="horizontal"
            dataSource={list}
            renderItem={item => (
              <List.Item
                actions={[
                  <Button type="danger" onClick={() => deleteMessage(item.id)}>删除</Button>,
                  <Button type="primary" onClick={() => editMessage(item)}>编辑</Button>
                ]}
              >
                <List.Item.Meta
                  title={item.author}
                  description={moment(item.createdAt).format('YYYY-MM-DD HH:mm:ss')}
                />
                {item.content}
              </List.Item>
            )}
          />
          <Pagination
            total={total}
            pageSize={MESSAGE_PAGE_SIZE}
            current={currentPage}
            onChange={page => setCurrentPage(page)}
          />
        </div>
      </div>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById('root'));

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现留言板功能 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • python使用reportlab生成pdf实例

    下面是生成PDF文件的完整攻略。 1. 环境准备 在使用ReportLab生成PDF之前,需要先安装ReportLab库,可以使用pip命令进行安装,具体操作如下: pip install reportlab 2. 基本应用 下面通过两个示例,分别讲解ReportLab库的基础使用。 示例1 在本示例中,我们将使用ReportLab库创建一个简单的PDF文件…

    Flask 2023年5月16日
    00
  • Python中的flask框架详解

    Flask框架详解 Flask是一个基于Python语言的Web应用程序框架,由于其轻量、易学易用、灵活性强、完美与其他框架协作等特性,已经成为Python开发中最为流行的Web框架之一。下面详细讲解一下Flask框架的组成以及其常用的功能模块。 1.1 组成 Flask框架的核心组件包括:路由、请求上下文、应用上下文、视图函数、JSON支持、请求-响应对象…

    Flask 2023年5月15日
    00
  • Python Flask JinJa2 语法使用示例详解

    下面我会详细讲解“Python Flask JinJa2 语法使用示例详解”这个完整攻略,并包含两个示例的说明。 Python Flask JinJa2 语法使用示例详解 什么是 JinJa2 JinJa2 是 Python 中一个非常流行的模板引擎,它是 Flask 框架所使用的默认模板引擎。 JinJa2 的基本语法 JinJa2 使用 {{}} 来输出…

    Flask 2023年5月15日
    00
  • Flask表单与表单验证实现流程介绍

    下面我将对”Flask表单与表单验证实现流程介绍”进行详细讲解。 一、Flask表单 1.1 WTForms简介 WTForms是一个用于验证表单数据的Python库。使用它可以很简单地为你的Flask应用程序添加表单支持。它可以完成以下任务: 生成HTML渲染的表单 验证表单数据的完整性和正确性 在验证失败时,向用户显示错误消息 1.2 Flask-WTF…

    Flask 2023年5月15日
    00
  • Elasticsearches之python使用及Django与Flask集成示例

    下面我将为您详细讲解“Elasticsearches之python使用及Django与Flask集成示例”的完整攻略,这个攻略主要包含两个示例说明:使用python操作Elasticsearch以及如何将Elasticsearch集成到Django和Flask中。 Elasticsearches之Python使用 安装elasticsearch-py 首先,…

    Flask 2023年5月16日
    00
  • Python中turtle库常用代码汇总

    让我分步骤地介绍一下“Python中turtle库常用代码汇总”的完整攻略: 1. turtle库概述 turtle库是Python语言内置的绘图库,可以让我们使用海龟的方式来绘制图形,如线条、图案、形状等。turtle库在Python 3中默认安装,无需额外安装。下面是turtle库的使用方法: import turtle 2. 常用命令 turtle库中…

    Flask 2023年5月15日
    00
  • Vue+Flask实现简单的登录验证跳转的示例代码

    下面是“Vue+Flask实现简单的登录验证跳转的示例代码”的完整攻略,包含两个示例说明。 示例一 前端部分(Vue) 在前端部分,我们需要使用 axios 进行登录请求。登录成功后我们将会在 cookie 中存储 token,以便随后的访问都可以带上该 token。 <template> <form> <input v-mod…

    Flask 2023年5月16日
    00
  • python中Flask Web 表单的使用方法介绍

    下面是 Python 中 Flask Web 表单的使用方法介绍: Flask Web 表单 Flask Web 表单(Flask Web Forms)是 Flask 框架的一个扩展,它提供了简单易用的 API 来处理 Web 表单。使用 Flask Web 表单,可以轻松地编写处理用户表单的代码并实现表单验证。 安装 Flask Web 表单 安装 Fla…

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部