// 执行SQL语句的工具函数 const runAsync = (db, sql, params = []) => { return new Promise((resolve, reject) => { db.run(sql, params, function (err) { if (err) reject(err); else resolve(this); }); }); }; // 系统数据库表结构 const systemSchema = { config: ` CREATE TABLE IF NOT EXISTS config ( id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE, value TEXT NOT NULL, protected INTEGER DEFAULT 0 ); `, dictTypes: ` CREATE TABLE IF NOT EXISTS dict_types ( id INTEGER PRIMARY KEY AUTOINCREMENT, type_code TEXT NOT NULL UNIQUE, type_name TEXT NOT NULL, description TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, dictItems: ` CREATE TABLE IF NOT EXISTS dict_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, type_code TEXT NOT NULL, item_code TEXT NOT NULL, item_name TEXT NOT NULL, item_description TEXT DEFAULT '', parent_code TEXT, is_active BOOLEAN DEFAULT 1, created_at TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(type_code, item_code) ); `, questions: ` CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_type TEXT NOT NULL, question_name TEXT NOT NULL DEFAULT '', question_description TEXT NOT NULL DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionDatasets: ` CREATE TABLE IF NOT EXISTS question_datasets ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, dataset_name TEXT NOT NULL DEFAULT '', dataset_data TEXT NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionImages: ` CREATE TABLE IF NOT EXISTS question_images ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, image_name TEXT NOT NULL DEFAULT '', image_base64 TEXT NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionFillTable: ` CREATE TABLE IF NOT EXISTS question_fill_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, table_name TEXT NOT NULL DEFAULT '', table_data TEXT NOT NULL, table_description TEXT NOT NULL DEFAULT '', score REAL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionFillTableBlanks: ` CREATE TABLE IF NOT EXISTS question_fill_table_blanks ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, table_id INTEGER NOT NULL, cell_position TEXT NOT NULL, cell_type TEXT NOT NULL DEFAULT 'number', correct_answer TEXT NOT NULL DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionChoices: ` CREATE TABLE IF NOT EXISTS question_choices ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, choice_description TEXT NOT NULL DEFAULT '', choice_type TEXT NOT NULL DEFAULT 'single', choice_options TEXT NOT NULL, correct_answers TEXT NOT NULL, score REAL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionFillBlanks: ` CREATE TABLE IF NOT EXISTS question_fill_blanks ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, blank_description TEXT NOT NULL DEFAULT '', blank_count INTEGER NOT NULL DEFAULT 0, correct_answers TEXT NOT NULL DEFAULT '', score REAL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionJudge: ` CREATE TABLE IF NOT EXISTS question_judge ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, judge_ask TEXT NOT NULL DEFAULT '', judge_answer INTEGER NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, questionShort: ` CREATE TABLE IF NOT EXISTS question_short ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, short_ask TEXT NOT NULL DEFAULT '', short_answer_ref TEXT NOT NULL DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, exam: ` CREATE TABLE IF NOT EXISTS exam ( id INTEGER PRIMARY KEY AUTOINCREMENT, exam_name TEXT NOT NULL DEFAULT '', exam_description TEXT NOT NULL DEFAULT '', exam_examinee_type TEXT NOT NULL DEFAULT '', exam_notice TEXT NOT NULL DEFAULT '', exam_minutes INTEGER NOT NULL DEFAULT 0, exam_minutes_min INTEGER NOT NULL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, examinee: ` CREATE TABLE IF NOT EXISTS examinee ( id INTEGER PRIMARY KEY AUTOINCREMENT, examinee_name TEXT NOT NULL DEFAULT '', examinee_gender TEXT NOT NULL DEFAULT '', examinee_unit TEXT NOT NULL DEFAULT '', written_exam_room TEXT NOT NULL DEFAULT '', written_exam_seat TEXT NOT NULL DEFAULT '', computer_exam_room TEXT NOT NULL DEFAULT '', computer_exam_seat TEXT NOT NULL DEFAULT '', examinee_id_card TEXT NOT NULL DEFAULT '', examinee_admission_ticket TEXT NOT NULL DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); ` }; // 用户数据库表结构 userSchema = { examinee: ` CREATE TABLE IF NOT EXISTS examinee ( id INTEGER PRIMARY KEY AUTOINCREMENT, examinee_name TEXT NOT NULL DEFAULT '', examinee_gender TEXT, examinee_unit TEXT, written_exam_room TEXT, written_exam_seat TEXT, computer_exam_room TEXT, computer_exam_seat TEXT, examinee_id_card TEXT NOT NULL DEFAULT '', examinee_admission_ticket TEXT NOT NULL DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, examinee_papers: ` CREATE TABLE IF NOT EXISTS examinee_papers ( id INTEGER PRIMARY KEY AUTOINCREMENT, examinee_id INTEGER NOT NULL, paper_minutes INTEGER NOT NULL DEFAULT 0, paper_minutes_min INTEGER NOT NULL DEFAULT 0, paper_start_time TEXT, paper_last_time TEXT, paper_submit_time TEXT, paper_end_time TEXT, paper_duration_seconds INTEGER DEFAULT 0, paper_status INTEGER NOT NULL DEFAULT 0, paper_score_real REAL DEFAULT 0, paper_score REAL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, paper_questions: ` CREATE TABLE IF NOT EXISTS paper_questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, examinee_id INTEGER NOT NULL, paper_id INTEGER NOT NULL, question_type TEXT NOT NULL, question_name TEXT NOT NULL DEFAULT '', question_description TEXT NOT NULL DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, question_datasets: ` CREATE TABLE IF NOT EXISTS question_datasets ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, dataset_name TEXT NOT NULL DEFAULT '', dataset_data TEXT NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, question_images: ` CREATE TABLE IF NOT EXISTS question_images ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, image_name TEXT NOT NULL DEFAULT '', image_base64 TEXT NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, question_choices: ` CREATE TABLE IF NOT EXISTS question_choices ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, choice_description TEXT NOT NULL DEFAULT '', choice_type TEXT NOT NULL DEFAULT 'single', choice_options TEXT NOT NULL, correct_answers TEXT NOT NULL, examinee_answers TEXT NOT NULL DEFAULT '', score REAL, score_real REAL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); `, question_fill_blanks: ` CREATE TABLE IF NOT EXISTS question_fill_blanks ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, blank_description TEXT NOT NULL DEFAULT '', blank_count INTEGER NOT NULL DEFAULT 0, correct_answers TEXT NOT NULL DEFAULT '', examinee_answers TEXT NOT NULL DEFAULT '', score REAL, score_real REAL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); ` }; // 导出函数和常量供其他模块使用 module.exports = { runAsync, systemSchema, userSchema };