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技术站