"CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_orders` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `uid` int unsigned NOT NULL DEFAULT 0, `aid` int unsigned NOT NULL DEFAULT 0 COMMENT 'appmall_addon_list.id', `site_id` int unsigned NOT NULL DEFAULT 0 COMMENT '下单站点', `amount` decimal(10,2) NOT NULL DEFAULT 0, `status` tinyint NOT NULL DEFAULT 0 COMMENT '0=待支付 1=已支付 2=已退款', `trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '商户订单号', `pay_time` int unsigned DEFAULT 0, `create_at` int unsigned DEFAULT 0, `update_at` int unsigned DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_uid` (`uid`), KEY `idx_trade` (`trade_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='插件购买订单表';", 'appmall_addon_licenses' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_licenses` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `uid` int unsigned NOT NULL, `aid` int unsigned NOT NULL, `license_key` varchar(64) NOT NULL COMMENT '授权码', `site_id` int unsigned NOT NULL DEFAULT 0 COMMENT '绑定站点', `domain` varchar(255) DEFAULT NULL COMMENT '绑定域名(站点授权)', `status` tinyint NOT NULL DEFAULT 1 COMMENT '1=有效 0=已吊销', `expire_time` int unsigned DEFAULT 0 COMMENT '0为永久', `download_count` int DEFAULT 0 COMMENT '下载次数限制', `create_at` int DEFAULT 0, `update_at` int DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `license_key` (`license_key`), UNIQUE KEY `uk_uid_aid` (`uid`, `aid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='插件授权表';", 'appmall_addon_download_logs' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_download_logs` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `license_id` int unsigned NOT NULL DEFAULT 0, `uid` int unsigned NOT NULL DEFAULT 0, `aid` int unsigned NOT NULL DEFAULT 0, `operator_id` int unsigned NOT NULL DEFAULT 0 COMMENT '运营后台安装者(特权放行审计)', `ip` varchar(45) DEFAULT '', `create_at` int unsigned DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_license` (`license_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='插件下载日志表';", 'appmall_throttle' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_throttle` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `action` varchar(30) NOT NULL COMMENT '限流动作(buy/notify/download/submit)', `ident` varchar(80) NOT NULL COMMENT '限流标识(uid 或 IP)', `count` int unsigned NOT NULL DEFAULT 0 COMMENT '窗口内已请求次数', `expire_at` int unsigned NOT NULL DEFAULT 0 COMMENT '窗口过期时间戳', `create_at` int unsigned DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `uk_action_ident` (`action`, `ident`), KEY `idx_expire` (`expire_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='接口频率限制表';", 'appmall_addon_review_log' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_review_log` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `submission_id` int unsigned NOT NULL DEFAULT 0 COMMENT 'appmall_addon_submissions.id', `operator_id` int unsigned NOT NULL DEFAULT 0 COMMENT '操作管理员ID', `action` varchar(20) NOT NULL COMMENT '操作:submit/approve/reject', `from_status` tinyint NOT NULL DEFAULT 0 COMMENT '变更前状态', `to_status` tinyint NOT NULL DEFAULT 0 COMMENT '变更后状态', `reason` varchar(255) NOT NULL DEFAULT '' COMMENT '审核意见/驳回理由', `create_at` int unsigned NOT NULL DEFAULT 0 COMMENT '操作时间', PRIMARY KEY (`id`), KEY `idx_submission` (`submission_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='插件审核历史日志(可视化时间线数据源)';", 'appmall_developers' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_developers` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL COMMENT '开发者名称', `email` varchar(120) NOT NULL COMMENT '邮箱(接收令牌/通知)', `token` varchar(64) NOT NULL COMMENT '开发者令牌(发布插件时校验)', `status` tinyint DEFAULT 0 COMMENT '0=待审核 1=正常 -1=禁用', `balance` decimal(10,2) DEFAULT '0.00' COMMENT '可提现余额', `frozen_balance` decimal(10,2) DEFAULT '0.00' COMMENT '待结算/冻结金额', `create_at` int DEFAULT 0, `update_at` int DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `uk_email` (`email`), UNIQUE KEY `uk_token` (`token`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场开发者表';", 'appmall_addon_revenues' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_revenues` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `developer_id` int unsigned NOT NULL DEFAULT '0' COMMENT '受益开发者', `order_id` int unsigned NOT NULL DEFAULT '0' COMMENT 'appmall_addon_orders.id', `aid` int unsigned NOT NULL DEFAULT '0' COMMENT 'appmall_addon_list.id', `uid` int unsigned NOT NULL DEFAULT '0' COMMENT '购买用户', `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额', `commission` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '平台抽成', `income` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '开发者应得', `status` tinyint DEFAULT 0 COMMENT '0=待结算 1=已结算', `create_at` int DEFAULT 0, `settle_at` int DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_developer` (`developer_id`), KEY `idx_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='插件销售收益账本';", 'appmall_addon_withdrawals' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_withdrawals` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `developer_id` int unsigned NOT NULL DEFAULT '0', `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '提现金额', `channel` varchar(20) DEFAULT 'alipay' COMMENT '提现渠道', `account` varchar(100) DEFAULT '' COMMENT '收款账号', `status` tinyint DEFAULT 0 COMMENT '0=待处理 1=已打款 -1=驳回', `remark` varchar(255) DEFAULT '', `create_at` int DEFAULT 0, `update_at` int DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_developer` (`developer_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开发者提现单';", 'appmall_addon_submissions' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_submissions` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `developer_id` int unsigned NOT NULL DEFAULT 0 COMMENT 'appmall_developers.id', `name` varchar(50) NOT NULL COMMENT '插件标识符', `type` varchar(20) NOT NULL DEFAULT 'addon' COMMENT '商品类型:addon=插件 template=模板', `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称', `author` varchar(100) DEFAULT '' COMMENT '作者', `description` text COMMENT '简介', `version` varchar(20) NOT NULL COMMENT '版本号', `price` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '价格', `logo` varchar(255) DEFAULT '' COMMENT '封面', `category` varchar(50) DEFAULT '' COMMENT '分类', `tags` varchar(255) DEFAULT '' COMMENT '标签', `file_path` varchar(255) NOT NULL COMMENT '待审包路径', `file_hash` varchar(64) NOT NULL COMMENT 'SHA256', `status` tinyint DEFAULT 0 COMMENT '0待审 1通过 2驳回', `reject_reason` varchar(255) DEFAULT '' COMMENT '驳回原因', `create_at` int DEFAULT 0, `update_at` int DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `uk_name_ver` (`name`, `version`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='插件提交审核表';", 'appmall_addon_list' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_addon_list` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '标识符', `type` varchar(20) NOT NULL DEFAULT 'addon' COMMENT '商品类型:addon=插件 template=模板', `developer_id` int unsigned NOT NULL DEFAULT 0 COMMENT 'appmall_developers.id', `title` varchar(100) NOT NULL COMMENT '名称', `version` varchar(20) NOT NULL COMMENT '版本号', `price` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '价格', `author` varchar(100) DEFAULT '' COMMENT '作者', `description` text COMMENT '简介/描述', `logo` varchar(255) DEFAULT '' COMMENT '封面图 URL', `file_path` varchar(255) NOT NULL COMMENT '存储路径(非公开)', `file_hash` varchar(64) NOT NULL COMMENT 'SHA256校验值', `category` varchar(50) DEFAULT '' COMMENT '分类', `tags` varchar(255) DEFAULT '' COMMENT '标签', `screenshots` text COMMENT '截图URL(逗号分隔或JSON)', `rating` decimal(2,1) DEFAULT '0.0' COMMENT '评分(0.0~5.0)', `status` tinyint DEFAULT 1 COMMENT '1上架 0下架', `download_count` int DEFAULT 0 COMMENT '下载次数', `create_at` int DEFAULT 0 COMMENT '创建时间', `update_at` int DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场插件列表';", 'appmall_sites' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_sites` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `site_token` varchar(64) NOT NULL DEFAULT '' COMMENT '站点令牌(客户端 install 时生成/上报)', `domain` varchar(255) NOT NULL DEFAULT '' COMMENT '主域名', `owner_uid` int unsigned NOT NULL DEFAULT '0' COMMENT '站点所有者用户ID', `status` tinyint NOT NULL DEFAULT '1' COMMENT '1=正常 0=禁用', `create_at` int DEFAULT 0, `update_at` int DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `uk_domain` (`domain`), KEY `idx_token` (`site_token`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场客户端站点(授权绑定维度)';", 'appmall_framework_list' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_framework_list` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `version` varchar(20) NOT NULL COMMENT '框架版本号', `title` varchar(100) DEFAULT '' COMMENT '版本标题', `changelog` text COMMENT '更新日志', `file_path` varchar(255) DEFAULT '' COMMENT '整包 zip 物理路径(非 Web 可访问目录)', `file_hash` varchar(64) DEFAULT '' COMMENT '整包 SHA256 校验值', `patch_path` varchar(255) DEFAULT '' COMMENT '增量补丁 zip 物理路径(与整包同版本共存)', `patch_hash` varchar(64) DEFAULT '' COMMENT '补丁 SHA256 校验值', `patch_from` varchar(20) DEFAULT '' COMMENT '补丁适用的基础版本', `type` tinyint DEFAULT 0 COMMENT '兼容旧客户端:0=含整包 1=仅补丁', `from_version` varchar(20) DEFAULT '' COMMENT '兼容旧客户端:补丁基础版本镜像', `status` tinyint DEFAULT 0 COMMENT '0=草稿 1=已发布(可下载)', `download_count` int DEFAULT 0 COMMENT '下载次数', `create_at` int DEFAULT 0 COMMENT '创建时间', `update_at` int DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_version` (`version`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='主框架版本表';", 'appmall_framework_download_log' => "CREATE TABLE IF NOT EXISTS `{$p}appmall_framework_download_log` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `version` varchar(20) NOT NULL COMMENT '下载的版本号', `uid` int DEFAULT 0 COMMENT '下载用户ID(来自客户端)', `ip` varchar(45) DEFAULT '' COMMENT '下载来源IP', `create_at` int DEFAULT 0 COMMENT '下载时间', PRIMARY KEY (`id`), KEY `idx_version` (`version`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='主框架下载日志表';", ]; foreach ($tables as $t => $sql) { BaseModel::ensureTable($prefix . $t, $sql); } // 老库扩展列兜底(幂等) $list = $prefix . 'appmall_addon_list'; BaseModel::ensureColumn($list, 'category', "varchar(50) DEFAULT '' COMMENT '分类'"); BaseModel::ensureColumn($list, 'tags', "varchar(255) DEFAULT '' COMMENT '标签(逗号分隔)'"); BaseModel::ensureColumn($list, 'screenshots', "text COMMENT '截图URL(逗号分隔或JSON)'"); BaseModel::ensureColumn($list, 'rating', "decimal(2,1) DEFAULT '0.0' COMMENT '评分(0.0~5.0)'"); BaseModel::ensureColumn($list, 'changelog', "text COMMENT '更新日志'"); BaseModel::ensureColumn($list, 'require_framework', "varchar(20) DEFAULT '' COMMENT '最低兼容框架版本,如 1.2.0'"); BaseModel::ensureColumn($list, 'type', "varchar(20) NOT NULL DEFAULT 'addon' COMMENT '商品类型:addon=插件 template=模板'"); $sub = $prefix . 'appmall_addon_submissions'; BaseModel::ensureColumn($sub, 'changelog', "text COMMENT '更新日志'"); BaseModel::ensureColumn($sub, 'require_framework', "varchar(20) DEFAULT '' COMMENT '最低兼容框架版本,如 1.2.0'"); BaseModel::ensureColumn($sub, 'type', "varchar(20) NOT NULL DEFAULT 'addon' COMMENT '商品类型:addon=插件 template=模板'"); BaseModel::ensureColumn($prefix . 'appmall_addon_download_logs', 'operator_id', "int unsigned NOT NULL DEFAULT 0 COMMENT '运营后台安装者(特权放行审计)'"); BaseModel::ensureColumn($prefix . 'appmall_developers', 'balance', "decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '可提现余额'"); BaseModel::ensureColumn($prefix . 'appmall_developers', 'frozen_balance', "decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '待结算/冻结金额'"); BaseModel::ensureColumn($prefix . 'appmall_addon_licenses', 'status', "tinyint NOT NULL DEFAULT '1' COMMENT '1=有效 0=已吊销'"); BaseModel::ensureColumn($prefix . 'appmall_addon_licenses', 'site_id', "int unsigned NOT NULL DEFAULT '0' COMMENT '绑定站点'"); BaseModel::ensureColumn($prefix . 'appmall_addon_licenses', 'domain', "varchar(255) DEFAULT NULL COMMENT '绑定域名(站点授权)'"); BaseModel::ensureColumn($prefix . 'appmall_addon_licenses', 'expire_time', "int unsigned DEFAULT 0 COMMENT '0为永久'"); } }