Files
xlxumu/backend/api/database-sqlite.js

232 lines
6.8 KiB
JavaScript

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
};