2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- KaMiXiTong 软件授权管理系统 MySQL 数据库初始化脚本
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 创建时间: 2025-12-11
|
|
|
|
|
|
-- 版本: v1.0
|
|
|
|
|
|
-- 描述: 创建所有数据表、索引、约束和初始数据
|
|
|
|
|
|
-- =====================================================
|
2025-11-22 16:48:45 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- 设置字符集和排序规则
|
2025-11-22 16:48:45 +08:00
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
|
|
SET FOREIGN_KEY_CHECKS = 0;
|
|
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 1. 管理员表 (admin)
|
|
|
|
|
|
-- =====================================================
|
2025-11-22 20:32:49 +08:00
|
|
|
|
DROP TABLE IF EXISTS `admin`;
|
2025-11-22 16:48:45 +08:00
|
|
|
|
CREATE TABLE `admin` (
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`admin_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理员ID',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`username` varchar(32) NOT NULL COMMENT '用户名',
|
|
|
|
|
|
`password_hash` varchar(128) NOT NULL COMMENT '密码哈希',
|
|
|
|
|
|
`email` varchar(64) DEFAULT NULL COMMENT '邮箱',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`role` int(11) NOT NULL DEFAULT '0' COMMENT '角色: 0=普通管理员, 1=超级管理员',
|
|
|
|
|
|
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用, 1=正常',
|
|
|
|
|
|
`is_deleted` int(11) NOT NULL DEFAULT '0' COMMENT '软删除标记: 0=未删除, 1=已删除',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
|
|
|
|
|
|
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
|
|
|
|
|
|
`last_login_ip` varchar(32) DEFAULT NULL COMMENT '最后登录IP',
|
|
|
|
|
|
PRIMARY KEY (`admin_id`),
|
|
|
|
|
|
UNIQUE KEY `uk_username` (`username`),
|
2025-12-12 11:35:14 +08:00
|
|
|
|
KEY `idx_status` (`status`),
|
|
|
|
|
|
KEY `idx_is_deleted` (`is_deleted`)
|
2025-11-22 16:48:45 +08:00
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表';
|
|
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 2. 产品表 (product)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `product`;
|
2025-11-22 16:48:45 +08:00
|
|
|
|
CREATE TABLE `product` (
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '产品ID',
|
|
|
|
|
|
`product_name` varchar(64) NOT NULL COMMENT '产品名称',
|
|
|
|
|
|
`description` text COMMENT '产品描述',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`features` text COMMENT '产品功能特性',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`image_path` varchar(255) DEFAULT NULL COMMENT '产品图片路径',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用, 1=启用',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
|
|
|
PRIMARY KEY (`product_id`),
|
|
|
|
|
|
KEY `idx_status` (`status`)
|
2025-11-22 16:48:45 +08:00
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品表';
|
|
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 3. 套餐表 (package)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `package`;
|
|
|
|
|
|
CREATE TABLE `package` (
|
|
|
|
|
|
`package_id` varchar(64) NOT NULL COMMENT '套餐ID',
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '关联产品ID',
|
|
|
|
|
|
`name` varchar(64) NOT NULL COMMENT '套餐名称',
|
|
|
|
|
|
`description` text COMMENT '套餐描述',
|
|
|
|
|
|
`price` double NOT NULL COMMENT '价格',
|
|
|
|
|
|
`duration` int(11) NOT NULL COMMENT '时长(天)',
|
|
|
|
|
|
`max_devices` int(11) NOT NULL DEFAULT '1' COMMENT '最大设备数',
|
|
|
|
|
|
`stock` int(11) NOT NULL DEFAULT '-1' COMMENT '库存,-1表示无限',
|
|
|
|
|
|
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用, 1=启用',
|
|
|
|
|
|
`sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
|
|
|
PRIMARY KEY (`package_id`),
|
|
|
|
|
|
KEY `idx_product_id` (`product_id`),
|
|
|
|
|
|
KEY `idx_status` (`status`),
|
|
|
|
|
|
CONSTRAINT `fk_package_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
|
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品套餐表';
|
2025-11-22 16:48:45 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 4. 许可证表 (license)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `license`;
|
2025-11-22 16:48:45 +08:00
|
|
|
|
CREATE TABLE `license` (
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`license_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '卡密ID',
|
|
|
|
|
|
`license_key` varchar(35) NOT NULL COMMENT '卡密(格式:XXXX-XXXX-XXXX-XXXX)',
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '关联产品ID',
|
|
|
|
|
|
`type` int(11) NOT NULL DEFAULT '1' COMMENT '类型: 0=试用, 1=正式',
|
|
|
|
|
|
`status` int(11) NOT NULL DEFAULT '0' COMMENT '状态: 0=未激活, 1=已激活, 2=已过期, 3=已禁用',
|
|
|
|
|
|
`valid_days` int(11) NOT NULL COMMENT '有效期(天,-1=永久)',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`bind_machine_code` varchar(64) DEFAULT NULL COMMENT '绑定的机器码',
|
|
|
|
|
|
`activate_time` datetime DEFAULT NULL COMMENT '激活时间',
|
|
|
|
|
|
`expire_time` datetime DEFAULT NULL COMMENT '过期时间',
|
|
|
|
|
|
`last_verify_time` datetime DEFAULT NULL COMMENT '最后验证时间',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`unbind_count` int(11) NOT NULL DEFAULT '0' COMMENT '解绑次数',
|
|
|
|
|
|
`remark` text COMMENT '备注',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
PRIMARY KEY (`license_id`),
|
|
|
|
|
|
UNIQUE KEY `uk_license_key` (`license_key`),
|
2025-12-12 11:35:14 +08:00
|
|
|
|
KEY `idx_product_id` (`product_id`),
|
|
|
|
|
|
KEY `idx_status` (`status`),
|
|
|
|
|
|
KEY `idx_type` (`type`),
|
|
|
|
|
|
KEY `idx_bind_machine_code` (`bind_machine_code`),
|
|
|
|
|
|
CONSTRAINT `fk_license_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
|
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='许可证(卡密)表';
|
2025-11-22 16:48:45 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 5. 设备表 (device)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `device`;
|
2025-11-22 16:48:45 +08:00
|
|
|
|
CREATE TABLE `device` (
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`device_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '设备ID',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`machine_code` varchar(64) NOT NULL COMMENT '机器码',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`license_id` int(11) DEFAULT NULL COMMENT '关联卡密ID',
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '关联产品ID',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`software_version` varchar(16) DEFAULT NULL COMMENT '软件版本',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`ip_address` varchar(45) DEFAULT NULL COMMENT 'IP地址(支持IPv6)',
|
|
|
|
|
|
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用, 1=正常',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`activate_time` datetime DEFAULT NULL COMMENT '激活时间',
|
|
|
|
|
|
`last_verify_time` datetime DEFAULT NULL COMMENT '最后验证时间',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
PRIMARY KEY (`device_id`),
|
|
|
|
|
|
UNIQUE KEY `uk_machine_code` (`machine_code`),
|
2025-12-12 11:35:14 +08:00
|
|
|
|
KEY `idx_license_id` (`license_id`),
|
|
|
|
|
|
KEY `idx_product_id` (`product_id`),
|
|
|
|
|
|
KEY `idx_status` (`status`),
|
|
|
|
|
|
KEY `idx_software_version` (`software_version`),
|
|
|
|
|
|
CONSTRAINT `fk_device_license_id` FOREIGN KEY (`license_id`) REFERENCES `license` (`license_id`) ON DELETE SET NULL,
|
|
|
|
|
|
CONSTRAINT `fk_device_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
|
2025-11-22 16:48:45 +08:00
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='设备表';
|
|
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 6. 版本表 (version)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `version`;
|
|
|
|
|
|
CREATE TABLE `version` (
|
|
|
|
|
|
`version_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '版本ID',
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '关联产品ID',
|
|
|
|
|
|
`version_num` varchar(16) NOT NULL COMMENT '版本号',
|
|
|
|
|
|
`platform` varchar(32) DEFAULT NULL COMMENT '平台信息',
|
|
|
|
|
|
`description` text COMMENT '版本描述',
|
|
|
|
|
|
`update_log` text COMMENT '更新日志',
|
|
|
|
|
|
`download_url` varchar(255) DEFAULT NULL COMMENT '下载链接',
|
|
|
|
|
|
`min_license_version` varchar(16) DEFAULT NULL COMMENT '兼容最低卡密版本',
|
|
|
|
|
|
`force_update` int(11) NOT NULL DEFAULT '0' COMMENT '强制更新: 0=否, 1=是',
|
|
|
|
|
|
`download_status` int(11) NOT NULL DEFAULT '1' COMMENT '下载状态: 0=禁用, 1=启用',
|
|
|
|
|
|
`publish_status` int(11) NOT NULL DEFAULT '0' COMMENT '发布状态: 0=草稿, 1=已发布, 2=已回滚',
|
|
|
|
|
|
`file_hash` varchar(64) DEFAULT NULL COMMENT '文件SHA256哈希值',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
|
|
|
PRIMARY KEY (`version_id`),
|
|
|
|
|
|
UNIQUE KEY `uk_product_version` (`product_id`, `version_num`),
|
|
|
|
|
|
KEY `idx_product_id` (`product_id`),
|
|
|
|
|
|
KEY `idx_publish_status` (`publish_status`),
|
|
|
|
|
|
KEY `idx_download_status` (`download_status`),
|
|
|
|
|
|
CONSTRAINT `fk_version_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
|
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='版本表';
|
|
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 7. 订单表 (order)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `order`;
|
|
|
|
|
|
CREATE TABLE `order` (
|
|
|
|
|
|
`order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
|
|
|
|
|
|
`order_number` varchar(32) NOT NULL COMMENT '订单号',
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '关联产品ID',
|
|
|
|
|
|
`package_id` varchar(64) NOT NULL COMMENT '套餐ID',
|
|
|
|
|
|
`contact_person` varchar(64) NOT NULL COMMENT '联系人',
|
|
|
|
|
|
`phone` varchar(20) NOT NULL COMMENT '手机号',
|
|
|
|
|
|
`quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
|
|
|
|
|
|
`amount` double NOT NULL COMMENT '金额',
|
|
|
|
|
|
`status` int(11) NOT NULL DEFAULT '0' COMMENT '状态: 0=待支付, 1=已支付, 2=已取消, 3=已完成',
|
|
|
|
|
|
`payment_method` varchar(20) DEFAULT NULL COMMENT '支付方式',
|
|
|
|
|
|
`payment_time` datetime DEFAULT NULL COMMENT '支付时间',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
|
|
|
PRIMARY KEY (`order_id`),
|
|
|
|
|
|
UNIQUE KEY `uk_order_number` (`order_number`),
|
|
|
|
|
|
KEY `idx_product_id` (`product_id`),
|
|
|
|
|
|
KEY `idx_status` (`status`),
|
|
|
|
|
|
KEY `idx_package_id` (`package_id`),
|
|
|
|
|
|
CONSTRAINT `fk_order_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT `fk_order_package_id` FOREIGN KEY (`package_id`) REFERENCES `package` (`package_id`) ON DELETE CASCADE
|
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
|
|
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 8. 工单表 (ticket)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `ticket`;
|
2025-11-22 16:48:45 +08:00
|
|
|
|
CREATE TABLE `ticket` (
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`ticket_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '工单ID',
|
|
|
|
|
|
`ticket_number` varchar(32) NOT NULL COMMENT '工单编号',
|
|
|
|
|
|
`title` varchar(128) NOT NULL COMMENT '工单标题',
|
|
|
|
|
|
`product_id` varchar(32) NOT NULL COMMENT '关联产品ID',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`software_version` varchar(16) DEFAULT NULL COMMENT '软件版本',
|
|
|
|
|
|
`machine_code` varchar(64) DEFAULT NULL COMMENT '机器码',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`license_key` varchar(35) DEFAULT NULL COMMENT '卡密',
|
|
|
|
|
|
`description` text NOT NULL COMMENT '问题描述',
|
|
|
|
|
|
`priority` int(11) NOT NULL DEFAULT '1' COMMENT '优先级: 0=低, 1=中, 2=高',
|
|
|
|
|
|
`status` int(11) NOT NULL DEFAULT '0' COMMENT '状态: 0=待处理, 1=处理中, 2=已解决, 3=已关闭',
|
|
|
|
|
|
`operator` varchar(32) DEFAULT NULL COMMENT '处理人(管理员账号)',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`remark` text COMMENT '处理备注',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`contact_person` varchar(64) DEFAULT NULL COMMENT '联系人姓名',
|
|
|
|
|
|
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`resolve_time` datetime DEFAULT NULL COMMENT '解决时间',
|
|
|
|
|
|
`close_time` datetime DEFAULT NULL COMMENT '关闭时间',
|
|
|
|
|
|
PRIMARY KEY (`ticket_id`),
|
2025-12-12 11:35:14 +08:00
|
|
|
|
UNIQUE KEY `uk_ticket_number` (`ticket_number`),
|
|
|
|
|
|
KEY `idx_product_id` (`product_id`),
|
|
|
|
|
|
KEY `idx_status` (`status`),
|
|
|
|
|
|
KEY `idx_priority` (`priority`),
|
|
|
|
|
|
KEY `idx_operator` (`operator`),
|
|
|
|
|
|
CONSTRAINT `fk_ticket_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
|
2025-11-22 16:48:45 +08:00
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工单表';
|
|
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 9. 审计日志表 (audit_log)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
DROP TABLE IF EXISTS `audit_log`;
|
2025-11-22 16:48:45 +08:00
|
|
|
|
CREATE TABLE `audit_log` (
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`log_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志ID',
|
|
|
|
|
|
`admin_id` int(11) NOT NULL COMMENT '管理员ID',
|
|
|
|
|
|
`action` varchar(32) NOT NULL COMMENT '操作类型:CREATE, UPDATE, DELETE, LOGIN, LOGOUT, TOGGLE_STATUS',
|
|
|
|
|
|
`target_type` varchar(32) NOT NULL COMMENT '目标类型:ADMIN, PRODUCT, LICENSE等',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`target_id` varchar(32) DEFAULT NULL COMMENT '目标ID',
|
2025-12-12 11:35:14 +08:00
|
|
|
|
`details` text COMMENT '操作详情(JSON格式)',
|
|
|
|
|
|
`ip_address` varchar(32) DEFAULT NULL COMMENT '操作IP地址',
|
2025-11-22 16:48:45 +08:00
|
|
|
|
`user_agent` varchar(256) DEFAULT NULL COMMENT '用户代理',
|
|
|
|
|
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
PRIMARY KEY (`log_id`),
|
2025-12-12 11:35:14 +08:00
|
|
|
|
KEY `idx_admin_id` (`admin_id`),
|
|
|
|
|
|
KEY `idx_action` (`action`),
|
|
|
|
|
|
KEY `idx_target_type` (`target_type`),
|
|
|
|
|
|
KEY `idx_target_id` (`target_id`),
|
|
|
|
|
|
KEY `idx_create_time` (`create_time`),
|
|
|
|
|
|
CONSTRAINT `fk_audit_log_admin_id` FOREIGN KEY (`admin_id`) REFERENCES `admin` (`admin_id`) ON DELETE CASCADE
|
2025-11-22 16:48:45 +08:00
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审计日志表';
|
|
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 插入初始数据
|
|
|
|
|
|
-- =====================================================
|
2025-11-22 20:32:49 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- 插入默认超级管理员账号
|
|
|
|
|
|
-- 用户名: admin
|
|
|
|
|
|
-- 密码: admin123 (首次登录后请立即修改)
|
|
|
|
|
|
-- 注意:此哈希值由 Werkzeug 的 generate_password_hash 生成,使用 PBKDF2-SHA256 算法
|
|
|
|
|
|
INSERT INTO `admin` (`username`, `password_hash`, `email`, `role`, `status`) VALUES
|
|
|
|
|
|
('admin', 'pbkdf2:sha256:600000$03EhhcMpfObidblD$e0f7de0e1028c8ab004c48ec28a3380950568080abd214055f67d02300e2786d', 'admin@example.com', 1, 1);
|
2025-11-22 16:48:45 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- 插入示例产品
|
|
|
|
|
|
INSERT INTO `product` (`product_id`, `product_name`, `description`, `features`, `status`) VALUES
|
|
|
|
|
|
('PROD_EXAMPLE', '示例产品', '这是一个示例产品,用于演示系统功能', '功能1: 核心功能\n功能2: 高级功能\n功能3: 专业功能', 1);
|
2025-11-22 20:32:49 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- 插入示例套餐
|
|
|
|
|
|
INSERT INTO `package` (`package_id`, `product_id`, `name`, `description`, `price`, `duration`, `max_devices`, `stock`, `status`, `sort_order`) VALUES
|
|
|
|
|
|
('PKG_DEMO_1', 'PROD_EXAMPLE', '试用版', '30天试用期,可体验基础功能', 0.00, 30, 1, 100, 1, 1),
|
|
|
|
|
|
('PKG_DEMO_2', 'PROD_EXAMPLE', '标准版', '一年有效期,支持3台设备', 299.00, 365, 3, 50, 1, 2),
|
|
|
|
|
|
('PKG_DEMO_3', 'PROD_EXAMPLE', '专业版', '永久授权,支持10台设备', 999.00, -1, 10, -1, 1, 3);
|
|
|
|
|
|
|
|
|
|
|
|
-- 插入示例版本
|
|
|
|
|
|
INSERT INTO `version` (`product_id`, `version_num`, `platform`, `description`, `update_log`, `download_url`, `publish_status`, `download_status`) VALUES
|
|
|
|
|
|
('PROD_EXAMPLE', '1.0.0', 'Windows/Mac/Linux', '首个正式版本', '初始版本发布', '/downloads/product_v1.0.0.exe', 1, 1);
|
|
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 创建视图(可选,用于简化查询)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
|
|
|
|
|
|
-- 视图:产品统计信息
|
|
|
|
|
|
CREATE OR REPLACE VIEW `view_product_stats` AS
|
|
|
|
|
|
SELECT
|
|
|
|
|
|
p.product_id,
|
|
|
|
|
|
p.product_name,
|
|
|
|
|
|
COUNT(DISTINCT l.license_id) AS total_licenses,
|
|
|
|
|
|
COUNT(DISTINCT CASE WHEN l.status = 1 THEN l.license_id END) AS active_licenses,
|
|
|
|
|
|
COUNT(DISTINCT d.device_id) AS total_devices,
|
|
|
|
|
|
COUNT(DISTINCT CASE WHEN d.status = 1 THEN d.device_id END) AS active_devices,
|
|
|
|
|
|
(SELECT version_num FROM version v WHERE v.product_id = p.product_id AND v.publish_status = 1 ORDER BY v.create_time DESC LIMIT 1) AS latest_version
|
|
|
|
|
|
FROM product p
|
|
|
|
|
|
LEFT JOIN license l ON p.product_id = l.product_id
|
|
|
|
|
|
LEFT JOIN device d ON p.product_id = d.product_id
|
|
|
|
|
|
GROUP BY p.product_id, p.product_name;
|
|
|
|
|
|
|
|
|
|
|
|
-- 视图:卡密详细信息
|
|
|
|
|
|
CREATE OR REPLACE VIEW `view_license_detail` AS
|
|
|
|
|
|
SELECT
|
|
|
|
|
|
l.license_id,
|
|
|
|
|
|
l.license_key,
|
|
|
|
|
|
l.product_id,
|
|
|
|
|
|
p.product_name,
|
|
|
|
|
|
l.type,
|
|
|
|
|
|
CASE WHEN l.type = 0 THEN '试用' ELSE '正式' END AS type_name,
|
|
|
|
|
|
l.status,
|
|
|
|
|
|
CASE
|
|
|
|
|
|
WHEN l.status = 0 THEN '未激活'
|
|
|
|
|
|
WHEN l.status = 1 THEN '已激活'
|
|
|
|
|
|
WHEN l.status = 2 THEN '已过期'
|
|
|
|
|
|
WHEN l.status = 3 THEN '已禁用'
|
|
|
|
|
|
ELSE '未知'
|
|
|
|
|
|
END AS status_name,
|
|
|
|
|
|
l.valid_days,
|
|
|
|
|
|
l.bind_machine_code,
|
|
|
|
|
|
l.activate_time,
|
|
|
|
|
|
l.expire_time,
|
|
|
|
|
|
l.last_verify_time,
|
|
|
|
|
|
l.unbind_count,
|
|
|
|
|
|
CASE
|
|
|
|
|
|
WHEN l.valid_days = -1 THEN '永久'
|
|
|
|
|
|
WHEN l.expire_time IS NULL THEN CONCAT(l.valid_days, '天')
|
|
|
|
|
|
WHEN l.expire_time < NOW() THEN CONCAT(TIMESTAMPDIFF(DAY, l.expire_time, NOW()), '天前过期')
|
|
|
|
|
|
ELSE CONCAT(TIMESTAMPDIFF(DAY, NOW(), l.expire_time), '天')
|
|
|
|
|
|
END AS remaining_days_display,
|
|
|
|
|
|
l.create_time
|
|
|
|
|
|
FROM license l
|
|
|
|
|
|
LEFT JOIN product p ON l.product_id = p.product_id;
|
|
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 创建存储过程(可选,用于常用操作)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
|
|
|
|
|
|
DELIMITER //
|
|
|
|
|
|
|
|
|
|
|
|
-- 存储过程:清理过期卡密
|
|
|
|
|
|
CREATE PROCEDURE `CleanExpiredLicenses`()
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
DECLARE done INT DEFAULT FALSE;
|
|
|
|
|
|
DECLARE v_license_id INT;
|
|
|
|
|
|
DECLARE cur CURSOR FOR
|
|
|
|
|
|
SELECT license_id FROM license
|
|
|
|
|
|
WHERE status = 1 AND expire_time IS NOT NULL AND expire_time < NOW();
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
OPEN cur;
|
|
|
|
|
|
|
|
|
|
|
|
read_loop: LOOP
|
|
|
|
|
|
FETCH cur INTO v_license_id;
|
|
|
|
|
|
IF done THEN
|
|
|
|
|
|
LEAVE read_loop;
|
|
|
|
|
|
END IF;
|
2025-11-22 20:32:49 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
UPDATE license
|
|
|
|
|
|
SET status = 2
|
|
|
|
|
|
WHERE license_id = v_license_id;
|
|
|
|
|
|
END LOOP;
|
2025-11-22 20:32:49 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
CLOSE cur;
|
2025-11-22 20:32:49 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
SELECT CONCAT('已清理 ', ROW_COUNT(), ' 个过期卡密') AS result;
|
|
|
|
|
|
END//
|
2025-11-22 16:48:45 +08:00
|
|
|
|
|
2025-12-12 11:35:14 +08:00
|
|
|
|
-- 存储过程:生成卡密
|
|
|
|
|
|
CREATE PROCEDURE `GenerateLicenses`(
|
|
|
|
|
|
IN p_product_id VARCHAR(32),
|
|
|
|
|
|
IN p_type INT,
|
|
|
|
|
|
IN p_valid_days INT,
|
|
|
|
|
|
IN p_count INT,
|
|
|
|
|
|
IN p_prefix VARCHAR(10)
|
|
|
|
|
|
)
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
DECLARE i INT DEFAULT 0;
|
|
|
|
|
|
DECLARE v_license_key VARCHAR(35);
|
|
|
|
|
|
DECLARE v_chars VARCHAR(36) DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
|
|
|
|
|
|
|
|
|
|
WHILE i < p_count DO
|
|
|
|
|
|
SET v_license_key = CONCAT(
|
|
|
|
|
|
p_prefix,
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1), '-',
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1), '-',
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1), '-',
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1),
|
|
|
|
|
|
SUBSTRING(v_chars, FLOOR(RAND() * 36) + 1, 1)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO license (license_key, product_id, type, valid_days, status)
|
|
|
|
|
|
VALUES (v_license_key, p_product_id, p_type, p_valid_days, 0);
|
|
|
|
|
|
|
|
|
|
|
|
SET i = i + 1;
|
|
|
|
|
|
END WHILE;
|
|
|
|
|
|
|
|
|
|
|
|
SELECT CONCAT('成功生成 ', p_count, ' 个卡密') AS result;
|
|
|
|
|
|
END//
|
|
|
|
|
|
|
|
|
|
|
|
DELIMITER ;
|
|
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 创建触发器(可选,用于自动操作)
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
|
|
|
|
|
|
DELIMITER //
|
|
|
|
|
|
|
|
|
|
|
|
-- 触发器:更新设备数量统计
|
|
|
|
|
|
CREATE TRIGGER `tr_license_activate`
|
|
|
|
|
|
AFTER UPDATE ON `license`
|
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
IF NEW.status = 1 AND OLD.status != 1 THEN
|
|
|
|
|
|
-- 卡密被激活时,记录审计日志
|
|
|
|
|
|
INSERT INTO audit_log (admin_id, action, target_type, target_id, details, ip_address)
|
|
|
|
|
|
VALUES (0, 'ACTIVATE', 'LICENSE', NEW.license_id, CONCAT('License activated: ', NEW.license_key), NULL);
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
END//
|
|
|
|
|
|
|
|
|
|
|
|
-- 触发器:自动清理过期设备
|
|
|
|
|
|
CREATE TRIGGER `tr_device_cleanup`
|
|
|
|
|
|
BEFORE UPDATE ON `device`
|
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
IF NEW.status = 0 AND OLD.status != 0 THEN
|
|
|
|
|
|
-- 设备被禁用时,记录审计日志
|
|
|
|
|
|
INSERT INTO audit_log (admin_id, action, target_type, target_id, details, ip_address)
|
|
|
|
|
|
VALUES (0, 'DISABLE', 'DEVICE', NEW.device_id, CONCAT('Device disabled: ', NEW.machine_code), NULL);
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
END//
|
|
|
|
|
|
|
|
|
|
|
|
DELIMITER ;
|
|
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 设置外键检查
|
|
|
|
|
|
-- =====================================================
|
2025-11-22 16:48:45 +08:00
|
|
|
|
SET FOREIGN_KEY_CHECKS = 1;
|
2025-12-12 11:35:14 +08:00
|
|
|
|
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
-- 完成提示
|
|
|
|
|
|
-- =====================================================
|
|
|
|
|
|
SELECT 'MySQL 数据库初始化完成!' AS message;
|
|
|
|
|
|
SELECT '默认管理员账号: admin / admin123 (首次登录后请立即修改)' AS default_account;
|
|
|
|
|
|
SELECT '示例产品已创建: PROD_EXAMPLE' AS sample_data;
|