企业官网nodejs mySQL数据库安装及使用

news2025/4/19 9:46:48

以下是企业官网的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)
查所有GEThttp://localhost:3000/api/articles-
查单个GEThttp://localhost:3000/api/articles/1-
POSThttp://localhost:3000/api/articles{"title":"新文章","content":"...","author_id":1}
PUThttp://localhost:3000/api/articles/1{"title":"更新标题","content":"..."}
DELETEhttp://localhost:3000/api/articles/1-

五、增强建议

  1. 安全加固
    • 使用dotenv管理敏感配置
    • 密码加密存储(如bcrypt)
  2. 性能优化
    • 添加数据库连接池
    • 实现分页查询(LIMIT offset, count
  3. 扩展功能
    • 文件上传(文章封面图)
    • 软删除(添加is_deleted字段)

如果需要更详细的实现(如用户认证、文件上传),可以进一步展开说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu学习day3

3 编译与调试 3.1 gcc/g编译器 当我们进行编译的时候,要使用一系列的工具,我们称之为工具链。SDK就是编译工具链的简写,我们所使用的是gcc系列编译工具链。使用-v参数来查看gcc的版本,从而确定某些语法特性是否可用,…

6.8.最小生成树

一.复习: 1.生成树: 对于一个连通的无向图,假设图中有n个顶点,如果能找到一个符合以下要求的子图: 子图中包含图中所有的顶点,同时各个顶点保持连通, 而且子图的边的数量只有n-1条&#xff0…

QT中栅格模式探索

1、Qt中选择了栅格模式,如下图所示: 2、在进行整个大的UI界面布局时,需了解每个控件所需要选择的属性sizePolicy。 sizePolicy包含如下几种选择: 3、举个例子:此时整个UI界面,我采用了栅格模式&#xf…

C++入门基础:命名空间,缺省参数,函数重载,输入输出

命名空间: C语言是基于C语言的,融入了面向对象编程思想,有了很多有用的库,所以接下来我们将学习C如何优化C语言的不足的。 在C/C语言实践中,在全局作用域中变量,函数,类会有很多,这…

tomcat 的安装与启动

文章目录 tomcat 服务器安装启动本地Tomcat服务器 tomcat 服务器安装 https://tomcat.apache.org/下载 Tomcat 10.0.X 启动本地Tomcat服务器 进入 Tomcat 的 bin

算法-堆+单调栈

堆 首先堆在我们的Java中我们的是一个优先队列类 PriorityQueue 然后我们要弄最大堆和最小堆 最大堆&#xff1a; PriorityQueue<Integer> pq new PriorityQueue<Integer>((a, b) -> b - a); 最小堆&#xff1a; PriorityQueue<Integer> pq new P…

物联网平台管理系统

物联网平台管理系统概述 物联网平台管理系统是物联网架构中的核心枢纽&#xff0c;承担着承上启下的关键作用。它向下连接各类物联网设备&#xff0c;实现设备的接入、管理与控制&#xff1b;向上为应用开发提供统一的数据接口和共性模块工具&#xff0c;支撑起各种丰富多彩的…

STM32CubeMX-H7-15-SPI通信协议读写W25Q64

前言 SPI&#xff08;Serial Peripheral Interface&#xff09;通信协议是一种高速、全双工、同步的串行通信协议 本篇文章就使用W25Q64模块来学习SPI,包括软件SPI代码的编写&#xff0c;硬件SPI&#xff0c;中断SPI和DMASPI SPI的应用场景和模块 &#xff01;这里是抄AI的&a…

【软考】论devops在企业信息系统开发中的应用

摘要&#xff1a; 随着互联网的不断发展&#xff0c;各行各业都在建设自己的企业信息系统&#xff0c;而随着业务的不断升级和复杂化&#xff0c;系统的更新迭代速度越来越快&#xff0c;系统也越来越复杂。对于信息系统开发者&#xff0c;架构师&#xff0c;管理者&#xff0c…

生物化学笔记:医学免疫学原理22 肿瘤及肿瘤治疗

肿瘤及肿瘤治疗 免疫疗法 CAR-T细胞介绍

JVM考古现场(二十二):降维打击·用二向箔优化内存模型

"警报&#xff01;三维堆内存正在经历二维化坍缩&#xff01;" 我腰间的玄铁令突然震动&#xff0c;在蜀山剑派的量子剑阵中投射出诡异的曼德博分形——这是三体文明发动降维打击的铁证&#xff01; 楔子&#xff1a;二向箔奇点降临 昆仑镜监控日志&#xff1a; // …

操作系统-PV

&#x1f9e0; 背景&#xff1a;为什么会有 PV&#xff1f; 类比&#xff1a;内存&#xff08;生产者&#xff09; 和 CPU&#xff08;消费者&#xff09; 内存 / IO / 磁盘 / 网络下载 → 不断“生产数据” 例如&#xff1a;读取文件、下载视频、从数据库加载信息 CPU → 负…

医院数据中心智能化数据上报与调数机制设计

针对医院数据中心的智能化数据上报与调数机制设计,需兼顾数据安全性、效率性、合规性及智能化能力。以下为系统性设计方案,分为核心模块、技术架构和关键流程三部分: 一、核心模块设计 1. 数据上报模块 子模块功能描述多源接入层对接HIS/LIS/PACS/EMR等异构系统,支持API/E…

【MATLAB代码例程】AOA与TOA结合的高精度平面地位,适用于四个基站的情况,附完整的代码

本代码实现了一种基于到达角(AOA) 和到达时间(TOA) 的混合定位算法,适用于二维平面内移动或静止目标的定位。通过4个基站的协同测量,结合最小二乘法和几何解算,能够有效估计目标位置,并支持噪声模拟、误差分析和可视化输出。适用于室内定位、无人机导航、工业监测等场景…

PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 PC主板及CPU ID 信息物理 MAC地址获取win11 新电脑 wmic 安装❤️ 欢迎一起学AI…

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…

web后端语言中篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 三月十八 笔者本来打算隔一天给它更完的&#xff0c;但是事情有点多这几天&#xff0c;实在是抱歉。废话不多说直接进入正题。 PHP流程控制语句 什么是流控:流程控制语句用于决定代码的执行顺序。 #注意流程控制语句…

Spine-Leaf 与 传统三层架构:全面对比与解析

本文将详细介绍Spine-Leaf架构&#xff0c;深入对比传统三层架构&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探讨其与Full-mesh网络和软件定义网络&#xff08;SDN&#xff09;的关联。通过通俗易懂的示例和数据中心网络分析&#xff0c;我将帮助您理解Spine-L…

Vmware esxi 查看硬盘健康状况

起因 硬盘掉盘 - - 使用自带的命令esxcli 列出所有硬盘 esxcli storage core device list[rootlocalhost:~] esxcli storage core device list t10.NVMe____INTEL_MEMPEK1W016GAL____________________PHBT83660BYP016D____00000001Display Name: Local NVMe Disk (t10.NVMe…

4.黑马学习笔记-SpringMVC(P43-P47)

1.SpringMVC简介 SpringMVC技术&#xff08;更少的代码&#xff0c;简便&#xff09;与servlet技术功能相同&#xff0c;属于web层开发技术。 SpringMVC是一种基于java实现MVC模型的轻量级web框架。 轻量级指的是&#xff08;内存占用比较低&#xff0c;运行效率高&#xff09;…