232 lines
6.8 KiB
JavaScript
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
|
|
}; |