""" 初始化仪表盘的内部表(用户管理、操作日志等) 运行方式: python3 init_db.py """ import pymysql import config from services.passwords import hash_password def init(): conn = pymysql.connect( unix_socket=config.DB_CONFIG["unix_socket"], user="root", database=config.DB_CONFIG["database"], charset="utf8mb4" ) cursor = conn.cursor() # 系统用户表 cursor.execute(""" CREATE TABLE IF NOT EXISTS dashboard_users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, real_name VARCHAR(50) DEFAULT '', role VARCHAR(20) DEFAULT 'viewer', phone VARCHAR(20) DEFAULT '', email VARCHAR(100) DEFAULT '', department VARCHAR(50) DEFAULT '' COMMENT '部门', avatar VARCHAR(255) DEFAULT '', status TINYINT DEFAULT 1 COMMENT '1=启用 0=禁用', must_change_password TINYINT DEFAULT 1 COMMENT '1=下次登录必须修改密码', last_login DATETIME DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """) # 操作日志表 cursor.execute(""" CREATE TABLE IF NOT EXISTS dashboard_logs ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id INT DEFAULT NULL, action VARCHAR(100) NOT NULL, detail TEXT, ip_address VARCHAR(50) DEFAULT '', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """) # 用户订单列宽配置表(同一账号跨设备同步) cursor.execute(""" CREATE TABLE IF NOT EXISTS user_column_widths ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, page VARCHAR(50) NOT NULL COMMENT '页面标识', field_name VARCHAR(100) NOT NULL COMMENT '稳定字段名', width INT NOT NULL COMMENT '列宽(px)', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_user_page_field (user_id, page, field_name), KEY idx_user_page (user_id, page) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """) # 新品管理表 cursor.execute(""" CREATE TABLE IF NOT EXISTS new_products ( id INT AUTO_INCREMENT PRIMARY KEY, category1 VARCHAR(100) NOT NULL DEFAULT '' COMMENT '第一级分类', category2 VARCHAR(100) NOT NULL DEFAULT '' COMMENT '第二级分类', category3 VARCHAR(100) NOT NULL DEFAULT '' COMMENT '第三级分类', product_type VARCHAR(50) NOT NULL DEFAULT '' COMMENT '类别:成品/赠品/现货', brand VARCHAR(100) NOT NULL DEFAULT '' COMMENT '品牌', product_code VARCHAR(100) NOT NULL DEFAULT '' COMMENT '产品编码', product_name VARCHAR(200) NOT NULL DEFAULT '' COMMENT '产品名称', barcode VARCHAR(100) NOT NULL DEFAULT '' COMMENT '条形码', capacity VARCHAR(100) NOT NULL DEFAULT '' COMMENT '容量', effect_img VARCHAR(500) NOT NULL DEFAULT '' COMMENT '产品效果图(内外包)', remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '成品备注', total_cost VARCHAR(100) NOT NULL DEFAULT '' COMMENT '产品总成本', total_payment VARCHAR(100) NOT NULL DEFAULT '' COMMENT '产品总货款', product_dev VARCHAR(100) NOT NULL DEFAULT '' COMMENT '产品开发', package_dev VARCHAR(100) NOT NULL DEFAULT '' COMMENT '包材开发', designer VARCHAR(100) NOT NULL DEFAULT '' COMMENT '设计师', operator VARCHAR(100) NOT NULL DEFAULT '' COMMENT '负责运营', upgrade_img VARCHAR(500) NOT NULL DEFAULT '' COMMENT '升级前的(内料升级前图片)', confirm_img VARCHAR(500) NOT NULL DEFAULT '' COMMENT '确版内料图凭证', quote_inner_img VARCHAR(500) NOT NULL DEFAULT '' COMMENT '内料报价单', quote_pack_img VARCHAR(500) NOT NULL DEFAULT '' COMMENT '包材报价单', created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新品管理表' """) # 成品基础信息附件(报价单、供应商选择原因等图片) cursor.execute(""" CREATE TABLE IF NOT EXISTS product_attachments ( id BIGINT AUTO_INCREMENT PRIMARY KEY, product_id INT NOT NULL, stored_name VARCHAR(80) NOT NULL, original_name VARCHAR(255) NOT NULL DEFAULT '', uploaded_by INT DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY idx_product_attachments_product (product_id), UNIQUE KEY uk_product_attachments_stored_name (stored_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成品基础信息附件' """) # 插入默认管理员 cursor.execute("SELECT COUNT(*) FROM dashboard_users WHERE username='admin'") if cursor.fetchone()[0] == 0: cursor.execute(""" INSERT INTO dashboard_users (username, password, real_name, role, phone, email, must_change_password) VALUES (%s, %s, %s, %s, %s, %s, 1) """, ('admin', hash_password('Admin123!@#'), '系统管理员', 'admin', '', 'admin@dy.com')) conn.commit() cursor.close() conn.close() print("✅ 数据库初始化完成") print(" 默认账号: admin / Admin123!@#(首次登录必须修改)") if __name__ == "__main__": init()