以下是企业官网的MySQL数据库设计、本地安装指南,以及基于Node.js的增删改查(CRUD)实现方案:
一、MySQL数据库设计(企业官网基础表)
1. 核心表结构
-- 1. 用户表(管理员)
CREATE TABLE `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL, -- 存储加密后的密码
`role` ENUM('admin', 'editor') DEFAULT 'editor',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. 新闻/文章表
CREATE TABLE `articles` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR(100) NOT NULL,
`content` TEXT NOT NULL,
`cover_image` VARCHAR(255),
`status` ENUM('draft', 'published') DEFAULT 'draft',
`author_id` INT,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`author_id`) REFERENCES `users`(`id`)
);
-- 3. 产品表
CREATE TABLE `products` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`description` TEXT,
`price` DECIMAL(10,2),
`category` VARCHAR(50),
`is_featured` BOOLEAN DEFAULT FALSE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 4. 联系方式表
CREATE TABLE `contacts` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`email` VARCHAR(100) NOT NULL,
`phone` VARCHAR(20),
`message` TEXT,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 初始化测试数据
INSERT INTO `users` (`username`, `password`, `role`)
VALUES ('admin', '$2a$10$N9qo8uLOickgx2ZMRZoMy.MQDqShxs6Ld4eYFJwD17tWZROr6i.CW', 'admin');
INSERT INTO `articles` (`title`, `content`, `author_id`, `status`)
VALUES ('欢迎来到企业官网', '这是第一篇示例文章...', 1, 'published');
二、本地安装MySQL
1. 安装步骤(以Mac为例)
# 通过Homebrew安装
brew install mysql
# 启动服务
brew services start mysql
# 安全初始化(设置root密码)
mysql_secure_installation
# 登录MySQL
mysql -u root -p
2. 创建数据库
CREATE DATABASE company_website;
USE company_website;
-- 执行前面的建表SQL
三、Node.js实现CRUD操作
1. 项目初始化
mkdir node-mysql-crud && cd node-mysql-crud
npm init -y
npm install express mysql2 body-parser cors
2. 目录结构
├── app.js # 主入口
├── db.js # 数据库连接
├── routes/ # 路由
│ ├── articles.js
│ └── products.js
└── package.json
3. 关键代码实现
db.js - 数据库连接
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'company_website',
waitForConnections: true,
connectionLimit: 10
});
module.exports = pool;
routes/articles.js - 文章CRUD
const express = require('express');
const router = express.Router();
const db = require('../db');
// 获取所有文章
router.get('/', async (req, res) => {
const [rows] = await db.query('SELECT * FROM articles');
res.json(rows);
});
// 创建文章
router.post('/', async (req, res) => {
const { title, content, author_id } = req.body;
const [result] = await db.query(
'INSERT INTO articles (title, content, author_id) VALUES (?, ?, ?)',
[title, content, author_id]
);
res.status(201).json({ id: result.insertId });
});
// 更新文章
router.put('/:id', async (req, res) => {
const { title, content } = req.body;
await db.query(
'UPDATE articles SET title=?, content=? WHERE id=?',
[title, content, req.params.id]
);
res.sendStatus(204);
});
// 删除文章
router.delete('/:id', async (req, res) => {
await db.query('DELETE FROM articles WHERE id=?', [req.params.id]);
res.sendStatus(204);
});
module.exports = router;
app.js - 主入口
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
// 中间件
app.use(cors());
app.use(bodyParser.json());
// 路由
const articleRouter = require('./routes/articles');
app.use('/api/articles', articleRouter);
// 启动服务器
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
四、接口测试示例(使用Postman)
操作 | 方法 | URL | 请求体示例(JSON) |
---|---|---|---|
查所有 | GET | http://localhost:3000/api/articles | - |
查单个 | GET | http://localhost:3000/api/articles/1 | - |
增 | POST | http://localhost:3000/api/articles | {"title":"新文章","content":"...","author_id":1} |
改 | PUT | http://localhost:3000/api/articles/1 | {"title":"更新标题","content":"..."} |
删 | DELETE | http://localhost:3000/api/articles/1 | - |
五、增强建议
- 安全加固:
- 使用
dotenv
管理敏感配置 - 密码加密存储(如bcrypt)
- 使用
- 性能优化:
- 添加数据库连接池
- 实现分页查询(
LIMIT offset, count
)
- 扩展功能:
- 文件上传(文章封面图)
- 软删除(添加
is_deleted
字段)
如果需要更详细的实现(如用户认证、文件上传),可以进一步展开说明。