修改文件结构,统一文档格式

This commit is contained in:
ylweng
2025-09-02 23:22:10 +08:00
parent 02fe7d11da
commit 6b4e0c227f
85 changed files with 5501 additions and 272 deletions

167
scripts/README.md Normal file
View File

@@ -0,0 +1,167 @@
# 执行脚本目录
本目录包含宁夏智慧养殖监管平台的运维脚本和工具脚本。
## 📋 脚本索引
### 🗄️ 数据库管理
- [`init-db.js`](init-db.js) - 数据库初始化脚本
- [`migration-manager.js`](migration-manager.js) - 数据库迁移管理脚本
- [`seed-manager.js`](seed-manager.js) - 种子数据管理脚本
- [`database/create_tables.sql`](database/create_tables.sql) - 完整数据库表结构创建脚本
- [`database/schema.sql`](database/schema.sql) - 基础数据库结构脚本
### 🔗 连接测试
- [`test-connection.js`](test-connection.js) - 数据库连接测试脚本
- [`test-map-api.js`](test-map-api.js) - 百度地图API连接测试脚本
## 🚀 脚本使用方法
### 数据库初始化
```bash
# 初始化数据库结构和基础数据
node scripts/init-db.js
# 或者在backend目录下使用npm脚本
cd backend
npm run init-db
```
### 数据库迁移管理
```bash
# 运行所有未执行的迁移
node scripts/migration-manager.js up
# 回滚最后一次迁移
node scripts/migration-manager.js down
# 查看迁移状态
node scripts/migration-manager.js status
```
### 种子数据管理
```bash
# 填充所有种子数据
node scripts/seed-manager.js all
# 填充特定种子数据
node scripts/seed-manager.js users
node scripts/seed-manager.js farms
# 清空种子数据
node scripts/seed-manager.js clear
```
### 连接测试
```bash
# 测试数据库连接
node scripts/test-connection.js
# 测试百度地图API连接
node scripts/test-map-api.js
```
## ⚙️ 环境要求
运行这些脚本需要:
1. **Node.js 18.0+** - JavaScript运行环境
2. **MySQL 8.0+** - 数据库服务
3. **环境变量配置** - 正确配置的.env文件
## 🔧 配置说明
### 环境变量
脚本依赖以下环境变量通常在backend/.env文件中配置
```bash
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_NAME=nxxmdata
DB_USER=root
DB_PASSWORD=your_password
# 百度地图API配置
BAIDU_MAP_API_KEY=your_api_key
# 其他配置
NODE_ENV=development
```
### 权限要求
- 数据库用户需要有创建、删除、修改表的权限
- 百度地图API密钥需要有效且未超过调用限制
## 📊 日志和输出
脚本运行时会输出详细的日志信息:
- ✅ 成功操作以绿色显示
- ❌ 错误信息以红色显示
- ⚠️ 警告信息以黄色显示
- 信息性消息以蓝色显示
## 🛡️ 安全注意事项
1. **生产环境**: 在生产环境运行脚本前务必备份数据
2. **权限控制**: 确保脚本执行用户具有必要的最小权限
3. **敏感数据**: 不要在脚本中硬编码敏感信息
4. **审计日志**: 生产环境执行脚本应记录详细的审计日志
## 🔄 脚本开发规范
如需新增脚本,请遵循以下规范:
### 文件命名
- 使用 kebab-case 命名: `example-script.js`
- 功能明确的描述性名称
- 按功能分类存放
### 代码结构
```javascript
#!/usr/bin/env node
/**
* 脚本功能说明
* 用法: node scripts/example-script.js [参数]
*/
const path = require('path');
const { logger } = require('../backend/utils/logger');
// 主要功能函数
async function main() {
try {
// 脚本逻辑
logger.info('脚本执行成功');
} catch (error) {
logger.error('脚本执行失败:', error);
process.exit(1);
}
}
// 如果直接运行脚本则执行main函数
if (require.main === module) {
main();
}
module.exports = { main };
```
### 错误处理
- 使用统一的日志记录
- 合适的错误码退出
- 详细的错误信息输出
## 📞 支持和帮助
如果在使用脚本过程中遇到问题:
1. 检查环境变量配置是否正确
2. 确认数据库连接是否正常
3. 查看脚本输出的错误信息
4. 参考项目文档或联系技术支持
---
*最后更新: 2025年1月*

View File

@@ -0,0 +1,270 @@
-- 宁夏智慧养殖监管平台数据库表结构脚本
-- 基于Sequelize模型定义生成
-- 创建时间: 2024年
-- 设置字符集和排序规则
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- 创建数据库(如果不存在)
-- CREATE DATABASE IF NOT EXISTS nxxmdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- USE nxxmdata;
-- ============================================
-- 用户相关表
-- ============================================
-- 用户表
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户唯一标识',
`username` varchar(50) NOT NULL COMMENT '用户名',
`email` varchar(100) NOT NULL COMMENT '邮箱',
`password` varchar(255) NOT NULL COMMENT '密码(加密后)',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`status` enum('active','inactive','banned') DEFAULT 'active' COMMENT '用户状态',
`last_login` datetime DEFAULT NULL COMMENT '最后登录时间',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 角色表
CREATE TABLE IF NOT EXISTS `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色唯一标识',
`name` varchar(50) NOT NULL COMMENT '角色名称',
`description` text DEFAULT NULL COMMENT '角色描述',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- 用户角色关联表
CREATE TABLE IF NOT EXISTS `user_roles` (
`user_id` int(11) NOT NULL COMMENT '用户ID',
`role_id` int(11) NOT NULL COMMENT '角色ID',
`assigned_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间',
PRIMARY KEY (`user_id`, `role_id`),
KEY `fk_user_roles_role_id` (`role_id`),
CONSTRAINT `fk_user_roles_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_user_roles_role_id` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
-- ============================================
-- 养殖场相关表
-- ============================================
-- 养殖场表
CREATE TABLE IF NOT EXISTS `farms` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '养殖场唯一标识',
`name` varchar(100) NOT NULL COMMENT '养殖场名称',
`type` varchar(50) NOT NULL COMMENT '养殖场类型',
`location` json NOT NULL COMMENT '地理位置信息(经纬度等)',
`address` varchar(255) DEFAULT NULL COMMENT '详细地址',
`contact` varchar(50) DEFAULT NULL COMMENT '联系人',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`status` enum('active','inactive','maintenance') DEFAULT 'active' COMMENT '养殖场状态',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_type` (`type`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='养殖场表';
-- 动物表
CREATE TABLE IF NOT EXISTS `animals` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '动物记录唯一标识',
`type` varchar(50) NOT NULL COMMENT '动物类型',
`count` int(11) NOT NULL DEFAULT 0 COMMENT '数量',
`farm_id` int(11) NOT NULL COMMENT '所属养殖场ID',
`health_status` enum('healthy','sick','quarantine') DEFAULT 'healthy' COMMENT '健康状态',
`last_inspection` datetime DEFAULT NULL COMMENT '最后检查时间',
`notes` text DEFAULT NULL COMMENT '备注信息',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `fk_animals_farm_id` (`farm_id`),
KEY `idx_type` (`type`),
KEY `idx_health_status` (`health_status`),
CONSTRAINT `fk_animals_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动物表';
-- 设备表
CREATE TABLE IF NOT EXISTS `devices` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '设备唯一标识',
`name` varchar(100) NOT NULL COMMENT '设备名称',
`type` varchar(50) NOT NULL COMMENT '设备类型',
`status` enum('online','offline','maintenance') DEFAULT 'offline' COMMENT '设备状态',
`farm_id` int(11) NOT NULL COMMENT '所属养殖场ID',
`last_maintenance` datetime DEFAULT NULL COMMENT '最后维护时间',
`installation_date` datetime DEFAULT NULL COMMENT '安装日期',
`metrics` json DEFAULT NULL COMMENT '设备指标数据',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `fk_devices_farm_id` (`farm_id`),
KEY `idx_type` (`type`),
KEY `idx_status` (`status`),
CONSTRAINT `fk_devices_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='设备表';
-- 预警表
CREATE TABLE IF NOT EXISTS `alerts` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '预警唯一标识',
`type` varchar(50) NOT NULL COMMENT '预警类型',
`level` enum('low','medium','high','critical') DEFAULT 'medium' COMMENT '预警级别',
`message` text NOT NULL COMMENT '预警消息',
`status` enum('active','acknowledged','resolved') DEFAULT 'active' COMMENT '预警状态',
`farm_id` int(11) NOT NULL COMMENT '所属养殖场ID',
`device_id` int(11) DEFAULT NULL COMMENT '关联设备ID',
`resolved_at` datetime DEFAULT NULL COMMENT '解决时间',
`resolved_by` int(11) DEFAULT NULL COMMENT '解决人ID',
`resolution_notes` text DEFAULT NULL COMMENT '解决说明',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `fk_alerts_farm_id` (`farm_id`),
KEY `fk_alerts_device_id` (`device_id`),
KEY `fk_alerts_resolved_by` (`resolved_by`),
KEY `idx_type` (`type`),
KEY `idx_level` (`level`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`),
CONSTRAINT `fk_alerts_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_alerts_device_id` FOREIGN KEY (`device_id`) REFERENCES `devices` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_alerts_resolved_by` FOREIGN KEY (`resolved_by`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预警表';
-- ============================================
-- 商品订单相关表
-- ============================================
-- 产品表
CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '产品唯一标识',
`name` varchar(100) NOT NULL COMMENT '产品名称',
`description` text DEFAULT NULL COMMENT '产品描述',
`price` int(11) NOT NULL COMMENT '产品价格(单位:分)',
`stock` int(11) NOT NULL DEFAULT 0 COMMENT '库存数量',
`image_url` varchar(255) DEFAULT NULL COMMENT '产品图片URL',
`is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否激活',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`),
KEY `idx_is_active` (`is_active`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品表';
-- 订单表
CREATE TABLE IF NOT EXISTS `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单唯一标识',
`user_id` int(11) NOT NULL COMMENT '用户ID',
`total_amount` int(11) NOT NULL DEFAULT 0 COMMENT '订单总金额(单位:分)',
`status` enum('pending','processing','shipped','delivered','cancelled') NOT NULL DEFAULT 'pending' COMMENT '订单状态',
`payment_status` enum('unpaid','paid','refunded') NOT NULL DEFAULT 'unpaid' COMMENT '支付状态',
`shipping_address` text DEFAULT NULL COMMENT '收货地址',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `fk_orders_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_payment_status` (`payment_status`),
KEY `idx_created_at` (`created_at`),
CONSTRAINT `fk_orders_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
-- 订单项表
CREATE TABLE IF NOT EXISTS `order_items` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项唯一标识',
`order_id` int(11) NOT NULL COMMENT '订单ID',
`product_id` int(11) NOT NULL COMMENT '产品ID',
`quantity` int(11) NOT NULL DEFAULT 1 COMMENT '数量',
`price` int(11) NOT NULL COMMENT '单价(单位:分)',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `fk_order_items_order_id` (`order_id`),
KEY `fk_order_items_product_id` (`product_id`),
CONSTRAINT `fk_order_items_order_id` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_order_items_product_id` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单项表';
-- ============================================
-- 初始化数据
-- ============================================
-- 插入默认角色
INSERT IGNORE INTO `roles` (`name`, `description`) VALUES
('admin', '系统管理员'),
('manager', '养殖场管理员'),
('operator', '操作员'),
('viewer', '查看者');
-- 插入默认管理员用户(密码: admin123使用bcrypt加密
INSERT IGNORE INTO `users` (`username`, `email`, `password`, `phone`, `avatar`, `status`) VALUES
('admin', 'admin@nxxmdata.com', '$2b$10$kWV4BQk3P4iSn79kQEEoduByeVo8kv41r7FI04mON1/zcrpF7.kn6', '13800138000', '/uploads/avatars/default.png', 'active'),
('manager', 'manager@nxxmdata.com', '$2b$10$kWV4BQk3P4iSn79kQEEoduByeVo8kv41r7FI04mON1/zcrpF7.kn6', '13800138001', '/uploads/avatars/default.png', 'active'),
('user', 'user@nxxmdata.com', '$2b$10$kWV4BQk3P4iSn79kQEEoduByeVo8kv41r7FI04mON1/zcrpF7.kn6', '13800138002', '/uploads/avatars/default.png', 'active');
-- 为用户分配角色
INSERT IGNORE INTO `user_roles` (`user_id`, `role_id`)
SELECT u.id, r.id
FROM `users` u, `roles` r
WHERE (u.username = 'admin' AND r.name = 'admin')
OR (u.username = 'manager' AND r.name = 'manager')
OR (u.username = 'user' AND r.name = 'viewer');
-- 插入示例养殖场数据
INSERT IGNORE INTO `farms` (`name`, `type`, `location`, `address`, `contact`, `phone`, `status`) VALUES
('宁夏示范养殖场', '奶牛养殖', '{"latitude": 38.46667, "longitude": 106.26667}', '宁夏回族自治区银川市金凤区', '张经理', '13800138000', 'active'),
('银川现代化养殖基地', '肉牛养殖', '{"latitude": 38.48779, "longitude": 106.22541}', '宁夏回族自治区银川市兴庆区', '李主任', '13800138001', 'active'),
('吴忠生态养殖园', '综合养殖', '{"latitude": 37.98629, "longitude": 106.19273}', '宁夏回族自治区吴忠市利通区', '王场长', '13800138002', 'active');
-- 插入示例动物数据
INSERT IGNORE INTO `animals` (`type`, `count`, `farm_id`, `health_status`, `last_inspection`) VALUES
('奶牛', 500, 1, 'healthy', '2025-01-18 10:00:00'),
('肉牛', 300, 2, 'healthy', '2025-01-18 09:30:00'),
('绵羊', 1000, 3, 'healthy', '2025-01-18 11:00:00');
-- 插入示例设备数据
INSERT IGNORE INTO `devices` (`name`, `type`, `status`, `farm_id`, `installation_date`, `metrics`) VALUES
('温度传感器001', '温度传感器', 'online', 1, '2024-01-01', '{"temperature": 25.5, "humidity": 60}'),
('湿度传感器001', '湿度传感器', 'online', 1, '2024-01-01', '{"temperature": 25.3, "humidity": 62}'),
('监控摄像头001', '摄像头', 'online', 2, '2024-02-01', '{"status": "normal", "resolution": "1080p"}');
-- 插入示例产品数据
INSERT IGNORE INTO `products` (`name`, `description`, `price`, `stock`, `image_url`) VALUES
('优质鲜牛奶', '新鲜优质牛奶,富含营养', 5000, 1000, '/uploads/products/milk.jpg'),
('有机牛肉', '无添加有机牛肉', 12000, 500, '/uploads/products/beef.jpg'),
('纯羊毛制品', '100%纯羊毛制品', 8000, 300, '/uploads/products/wool.jpg');
-- ============================================
-- 索引优化建议
-- ============================================
-- 复合索引
CREATE INDEX `idx_farms_type_status` ON `farms` (`type`, `status`);
CREATE INDEX `idx_animals_farm_type` ON `animals` (`farm_id`, `type`);
CREATE INDEX `idx_devices_farm_status` ON `devices` (`farm_id`, `status`);
CREATE INDEX `idx_alerts_farm_status_level` ON `alerts` (`farm_id`, `status`, `level`);
CREATE INDEX `idx_orders_user_status` ON `orders` (`user_id`, `status`);
CREATE INDEX `idx_order_items_order_product` ON `order_items` (`order_id`, `product_id`);
-- 时间范围查询索引
CREATE INDEX `idx_alerts_created_status` ON `alerts` (`created_at`, `status`);
CREATE INDEX `idx_orders_created_status` ON `orders` (`created_at`, `status`);
SET FOREIGN_KEY_CHECKS = 1;
-- 脚本执行完成
-- 注意:
-- 1. 请根据实际需求调整字段长度和约束
-- 2. 密码字段需要在应用层进行加密处理
-- 3. JSON字段需要MySQL 5.7+版本支持
-- 4. 建议定期备份数据库
-- 5. 生产环境请根据实际情况调整索引策略

View File

@@ -0,0 +1,88 @@
-- 创建数据库
CREATE DATABASE IF NOT EXISTS nxxmdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用数据库
USE nxxmdata;
-- 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建角色表
CREATE TABLE roles (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) UNIQUE NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建用户角色关联表
CREATE TABLE user_roles (
user_id INT NOT NULL,
role_id INT NOT NULL,
assigned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, role_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);
-- 创建产品表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
stock INT DEFAULT 0,
status ENUM('active', 'inactive') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建订单表
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status ENUM('pending', 'paid', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 创建订单项表
CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);
-- 插入基础角色数据
INSERT INTO roles (name, description) VALUES
('admin', '系统管理员'),
('user', '普通用户'),
('guest', '访客');
-- 插入示例用户数据
INSERT INTO users (username, email, password) VALUES
('admin', 'admin@example.com', '$2b$10$rVHMOB./a2mFmE4EEdI3QO4f./bN3LYb.dpDvtX9gRUM9gNwspj1a'),
('john_doe', 'john@example.com', '$2b$10$rVHMOB./a2mFmE4EEdI3QO4f./bN3LYb.dpDvtX9gRUM9gNwspj1a');
-- 为示例用户分配角色
INSERT INTO user_roles (user_id, role_id) VALUES
(1, 1), -- admin用户具有admin角色
(2, 2); -- john_doe用户具有user角色
-- 插入示例产品数据
INSERT INTO products (name, description, price, stock) VALUES
('示例产品1', '这是一个示例产品', 99.99, 100),
('示例产品2', '这是另一个示例产品', 149.99, 50);

50
scripts/simple-db-test.js Normal file
View File

@@ -0,0 +1,50 @@
/**
* 简单数据库连接测试脚本
* 测试数据库基本连接功能
*/
const { sequelize, testConnection } = require('../backend/config/database-simple');
async function simpleConnectionTest() {
console.log('🔍 开始测试数据库连接...');
try {
// 测试数据库连接
const isConnected = await testConnection();
if (isConnected) {
console.log('✅ 数据库连接测试通过');
// 执行简单查询
const [results] = await sequelize.query('SELECT 1 + 1 AS result');
console.log('📊 数据库查询测试:', results[0]);
// 检查数据库版本
const [version] = await sequelize.query('SELECT VERSION() AS version');
console.log('🗄️ 数据库版本:', version[0].version);
console.log('🎉 所有数据库测试通过!');
} else {
console.log('❌ 数据库连接失败');
process.exit(1);
}
} catch (error) {
console.error('❌ 数据库测试出错:', error.message);
process.exit(1);
} finally {
// 关闭连接
try {
await sequelize.close();
console.log('🔒 数据库连接已关闭');
} catch (closeError) {
console.error('关闭连接时出错:', closeError.message);
}
}
}
// 执行测试
if (require.main === module) {
simpleConnectionTest();
}
module.exports = simpleConnectionTest;