refactor: 重构数据库配置为SQLite开发环境并移除冗余文档
This commit is contained in:
232
backend/api/database-sqlite.js
Normal file
232
backend/api/database-sqlite.js
Normal file
@@ -0,0 +1,232 @@
|
||||
const sqlite3 = require('sqlite3').verbose();
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
// 确保数据库目录存在
|
||||
const dbDir = path.dirname(process.env.DB_PATH || './database/xlxumu_dev.db');
|
||||
if (!fs.existsSync(dbDir)) {
|
||||
fs.mkdirSync(dbDir, { recursive: true });
|
||||
}
|
||||
|
||||
const dbPath = process.env.DB_PATH || './database/xlxumu_dev.db';
|
||||
|
||||
// 创建数据库连接
|
||||
const db = new sqlite3.Database(dbPath, (err) => {
|
||||
if (err) {
|
||||
console.error('❌ SQLite数据库连接失败:', err.message);
|
||||
} else {
|
||||
console.log('✅ SQLite数据库连接成功:', dbPath);
|
||||
}
|
||||
});
|
||||
|
||||
// 初始化数据库表结构
|
||||
const initDatabase = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 用户表
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
email VARCHAR(100) UNIQUE,
|
||||
phone VARCHAR(20),
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
real_name VARCHAR(50),
|
||||
user_type TEXT CHECK(user_type IN ('admin', 'farmer', 'government', 'bank', 'insurance')) DEFAULT 'farmer',
|
||||
status TEXT CHECK(status IN ('active', 'inactive', 'suspended')) DEFAULT 'active',
|
||||
avatar_url VARCHAR(255),
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('创建用户表失败:', err.message);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// 角色表
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS roles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name VARCHAR(50) UNIQUE NOT NULL,
|
||||
description TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('创建角色表失败:', err.message);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// 权限表
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS permissions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name VARCHAR(50) UNIQUE NOT NULL,
|
||||
description TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('创建权限表失败:', err.message);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// 用户角色关联表
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS user_roles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL,
|
||||
role_id INTEGER NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
FOREIGN KEY (role_id) REFERENCES roles(id)
|
||||
)
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('创建用户角色表失败:', err.message);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// 角色权限关联表
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS role_permissions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
role_id INTEGER NOT NULL,
|
||||
permission_id INTEGER NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (role_id) REFERENCES roles(id),
|
||||
FOREIGN KEY (permission_id) REFERENCES permissions(id)
|
||||
)
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('创建角色权限表失败:', err.message);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// 牛只档案表
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS cattle (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
ear_tag VARCHAR(50) UNIQUE NOT NULL,
|
||||
name VARCHAR(100),
|
||||
breed VARCHAR(100),
|
||||
gender TEXT CHECK(gender IN ('male', 'female')) NOT NULL,
|
||||
birth_date DATE,
|
||||
color VARCHAR(50),
|
||||
weight DECIMAL(8,2),
|
||||
health_status TEXT CHECK(health_status IN ('healthy', 'sick', 'quarantine', 'deceased')) DEFAULT 'healthy',
|
||||
status TEXT CHECK(status IN ('active', 'sold', 'deceased', 'transferred')) DEFAULT 'active',
|
||||
owner_id INTEGER,
|
||||
farm_location VARCHAR(255),
|
||||
notes TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (owner_id) REFERENCES users(id)
|
||||
)
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('创建牛只档案表失败:', err.message);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
console.log('✅ 数据库表结构初始化完成');
|
||||
resolve();
|
||||
});
|
||||
};
|
||||
|
||||
// 插入初始数据
|
||||
const insertInitialData = async () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 等待所有表创建完成后再插入数据
|
||||
setTimeout(() => {
|
||||
// 插入默认角色
|
||||
const roles = [
|
||||
{ name: 'admin', description: '系统管理员' },
|
||||
{ name: 'farmer', description: '养殖户' },
|
||||
{ name: 'government', description: '政府监管员' },
|
||||
{ name: 'bank', description: '银行工作人员' },
|
||||
{ name: 'insurance', description: '保险公司工作人员' }
|
||||
];
|
||||
|
||||
const permissions = [
|
||||
{ name: 'user_manage', description: '用户管理' },
|
||||
{ name: 'cattle_manage', description: '牛只管理' },
|
||||
{ name: 'finance_manage', description: '金融管理' },
|
||||
{ name: 'loan_manage', description: '贷款管理' },
|
||||
{ name: 'insurance_manage', description: '保险管理' },
|
||||
{ name: 'data_view', description: '数据查看' },
|
||||
{ name: 'report_generate', description: '报告生成' }
|
||||
];
|
||||
|
||||
// 插入角色
|
||||
const insertRole = db.prepare('INSERT OR IGNORE INTO roles (name, description) VALUES (?, ?)');
|
||||
roles.forEach(role => {
|
||||
insertRole.run(role.name, role.description);
|
||||
});
|
||||
insertRole.finalize();
|
||||
|
||||
// 插入权限
|
||||
const insertPermission = db.prepare('INSERT OR IGNORE INTO permissions (name, description) VALUES (?, ?)');
|
||||
permissions.forEach(permission => {
|
||||
insertPermission.run(permission.name, permission.description);
|
||||
});
|
||||
insertPermission.finalize();
|
||||
|
||||
console.log('✅ 初始数据插入完成');
|
||||
resolve();
|
||||
}, 100); // 延迟100ms确保表创建完成
|
||||
});
|
||||
};
|
||||
|
||||
// 模拟MySQL连接池接口
|
||||
const pool = {
|
||||
execute: (sql, params = []) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
db.all(sql, params, (err, rows) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve([rows]);
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
getConnection: () => {
|
||||
return Promise.resolve({
|
||||
execute: pool.execute,
|
||||
release: () => {}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 测试数据库连接
|
||||
const testDatabaseConnection = async () => {
|
||||
try {
|
||||
await initDatabase();
|
||||
await insertInitialData();
|
||||
console.log('✅ SQLite数据库初始化完成');
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('❌ SQLite数据库初始化失败:', error.message);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
pool,
|
||||
testDatabaseConnection,
|
||||
db
|
||||
};
|
||||
Reference in New Issue
Block a user