// +---------------------------------------------------------------------- declare(strict_types=1); namespace app\appmall\model; use app\appmall\library\AppmallSchema; use ywxapp\model\BaseModel; /** * 插件市场商品(中心站,已上架) * 表:appmall_addon_list * @mixin \think\Model */ class AddonList extends BaseModel { protected function getOptions(): array { return [ 'strict' => true, 'name' => 'appmall_addon_list', 'autoWriteTimestamp' => 'int', 'createTime' => 'create_at', 'updateTime' => 'update_at', ]; } /** * 表结构自愈:缺表建表 + 老库扩展列补齐(事实源 app/appmall/install.sql)。 */ public static function ensureSchema(): void { AppmallSchema::ensureTable('appmall_addon_list', [ '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)'", 'changelog' => "text COMMENT '更新日志'", 'require_framework' => "varchar(20) DEFAULT '' COMMENT '最低兼容框架版本,如 1.2.0'", 'type' => "varchar(20) NOT NULL DEFAULT 'addon' COMMENT '商品类型:addon=插件 template=模板'", 'review_count' => "int unsigned NOT NULL DEFAULT 0 COMMENT '评价条数(已发布)'", // 售卖策略(商业化):授权周期 / 试用 / 跨大版本升级策略 / 站点座席 'license_period' => "int unsigned NOT NULL DEFAULT 0 COMMENT '授权有效天数:0=买断永久,>0=订阅制'", 'trial_days' => "int unsigned NOT NULL DEFAULT 0 COMMENT '免费试用天数:0=不提供'", 'upgrade_policy' => "tinyint NOT NULL DEFAULT 0 COMMENT '大版本升级策略:0=买断式 1=按原价重购 2=按 upgrade_price'", 'upgrade_price' => "decimal(10,2) NOT NULL DEFAULT 0 COMMENT '跨大版本升级优惠价'", 'seats' => "int unsigned NOT NULL DEFAULT 1 COMMENT '单份授权可绑定站点数'", ]); } /** * 模型一被使用(含静态查询)就先兜底建表,任何入口都不会再撞 1146。 */ protected function initialize() { parent::initialize(); self::ensureSchema(); } /** * 关联发布者(appmall_developers) * @return \think\model\relation\BelongsTo */ public function developer() { return $this->belongsTo(Developer::class, 'developer_id', 'id'); } }