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日

相关文章

  • Flask框架的学习指南之用户登录管理

    标题:Flask框架的学习指南之用户登录管理 1.概述 Flask是一个非常流行的Python Web框架,灵活可扩展。在Web应用程序中,用户登录管理是必不可少的一项功能。Flask框架提供了快速构建用户认证和授权的工具。 2.安装Flask 在开始使用Flask之前,需要先安装Flask。可以使用pip来安装Flask: pip install Flas…

    Flask 2023年5月15日
    00
  • Python编程中flask的简介与简单使用

    下面是关于“Python编程中Flask的简介与简单使用”的完整攻略, 1. 什么是Flask Flask是一个轻量级的Web框架,它基于Python编写并且符合WSGI(Web Server Gateway Interface)标准。它的设计思路是让开发者能够以最小的工作量来实现Web应用程序的搭建以及开发。 Flask优秀的设计结构,使得它非常容易上手。…

    Flask 2023年5月15日
    00
  • Python接口测试环境搭建过程详解

    Python接口测试环境搭建过程详解 本文将介绍如何搭建Python接口测试环境以及基本的调试工具的使用,使你可以快速开始编写接口测试脚本。 步骤一:安装Python Python是开发接口测试必不可少的工具。你可以到Python官方网站下载最新的Python安装包,然后根据安装向导进行安装。安装完成后,你可以通过命令行输入以下代码检查你的Python版本:…

    Flask 2023年5月16日
    00
  • python2.7的flask框架之引用js&css等静态文件的实现方法

    下面是详细讲解“Python2.7的Flask框架之引用JS&CSS等静态文件的实现方法”的攻略: 一、Flask框架静态文件目录 在Flask应用中,静态资源文件一般保存在应用程序的 static 文件夹中。因为 Flask 框架在启动时会将 static 文件夹中的内容提供给外部访问。 一般情况下,静态资源文件可分为如下两类: CSS:层叠样式表…

    Flask 2023年5月16日
    00
  • python学习开发mock接口

    Python学习开发Mock接口 在进行前后端项目开发中,前后端联调过程中可能会出现前后端开发进度不一致或者依赖的接口尚未完成等问题,导致耗费大量时间等问题。这时可以使用Mock接口的技术手段,在后端接口未完成的情况下,模拟数据返回从而达到开发目的。 本篇攻略将介绍Python Mock接口的开发,并包含两个示例说明。 准备工作 安装Python开发环境 本…

    Flask 2023年5月16日
    00
  • 详解Django ORM引发的数据库N+1性能问题

    让我们来一步一步地详细讲解 “详解Django ORM引发的数据库N+1性能问题”的完整攻略吧! 什么是数据库N+1性能问题? 数据库N+1性能问题是ORM使用不当时最常见的性能问题之一。在ORM加载关联数据时,如果没有使用合适的预加载方法,就可能会发出大量的查询,导致查询次数呈N+1的增长模式,最终导致性能问题。 如何预防N+1性能问题? 预防N+1性能问…

    Flask 2023年5月16日
    00
  • 详解python logging日志传输

    下面我将为你详细讲解“详解Python logging日志传输”的完整攻略,包含两条示例说明。 概述 Python中的logging模块提供了强大的日志记录功能,可以对不同等级的日志进行分类,方便后期调试和问题排查。然而,在一个分布式系统中,不同的组件可能运行在不同的机器上,这时候将分散的日志收集起来就变得尤为重要。Python logging模块提供了So…

    Flask 2023年5月16日
    00
  • python Flask 装饰器顺序问题解决

    下面是关于“python Flask 装饰器顺序问题解决”问题的解决攻略: 问题背景 在 Flask 中,我们经常会使用装饰器(decorator)对视图函数(view function)进行修饰,以增加一些额外的功能。比如,我们可以使用 @login_required 装饰器来保护某些需要登录才能访问的页面,使用 @cache_control 装饰器来设置…

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