// +---------------------------------------------------------------------- declare (strict_types = 1); namespace addon\haonav\model; use ywxapp\model\BaseModel; class Configure extends BaseModel { protected function getOptions(): array { // 所有的参数配置统一返回 return [ 'strict' => false, 'name' => 'haonav_config', 'autoRelation' => [], 'createTime' => 'create_at', 'updateTime' => 'update_at', 'dateFormat' => 'Y-m-d H:i:s', ]; } /** * 读取单个配置值 * @param string $name * @param mixed $default * @return mixed */ public static function getVal(string $name, $default = '') { static $cache = []; if (array_key_exists($name, $cache)) { return $cache[$name]; } $val = self::where('name', $name)->value('value'); $val = $val === null ? $default : $val; $cache[$name] = $val; return $val; } /** * 读取全部配置为 name => value 数组 * @return array */ public static function getAll(): array { return self::column('value', 'name'); } /** * 老库结构自愈:早期 install.sql 的 config 表 id 无 PRIMARY KEY/AUTO_INCREMENT, * create() 不带 id 会报 1364 Field 'id' doesn't have a default value,此处运行时修复。 */ protected static function ensurePk(): void { static $done = false; if ($done) { return; } self::ensureAutoIncrementPk('wxapp_haonav_config'); $done = true; } /** * 返利配置自愈:老库安装时 install.sql 尚未含这 3 行,访问配置页时补种, * 保证后台「返利」分组始终可配置(INSERT 幂等,按 name 判重)。 */ public static function ensureRebateConfig(): void { self::ensurePk(); $defaults = [ 'enable_rebate' => ['返利', '开启返利PID', '开启后,命中适用域名的链接点击将自动拼接返利PID', 'radio', '0', '1,0'], 'rebate_param' => ['返利', '返利参数名', '拼接在网址后的参数名,默认 pid', 'string', 'pid', ''], 'rebate_domains' => ['返利', '返利适用域名', '仅这些域名(含子域名)会拼接返利PID,逗号或换行分隔,如 taobao.com,jd.com,pinduoduo.com', 'textarea', 'taobao.com,jd.com,pinduoduo.com', ''], ]; foreach ($defaults as $name => $cfg) { if (self::where('name', $name)->count() === 0) { self::create([ 'name' => $name, 'group' => $cfg[0], 'title' => $cfg[1], 'tip' => $cfg[2], 'type' => $cfg[3], 'value' => $cfg[4], 'content' => $cfg[5], ]); } } } /** * 死链自动下线配置自愈:老库安装时 install.sql 尚未含这 3 行,访问配置页时补种, * 保证后台「导航配置」的 task 分组始终可配置(INSERT 幂等,按 name 判重)。 */ public static function ensureDeadlinkConfig(): void { self::ensurePk(); $defaults = [ 'deadlink_auto' => ['task', '死链自动下线', '连续检测失败达阈值后,自动将链接置为禁用(下线)', 'radio', '0', '1,0'], 'deadlink_threshold' => ['task', '下线阈值(连续失败次数)', '达到该连续失败次数才下线,避免单次网络抖动误杀(建议2)', 'number', '2', ''], 'deadlink_recover' => ['task', '死链恢复自动上线', '链接重新可达时自动恢复为启用(仅对检测器自动下线的链接生效)', 'radio', '0', '1,0'], ]; foreach ($defaults as $name => $cfg) { if (self::where('name', $name)->count() === 0) { self::create([ 'name' => $name, 'group' => $cfg[0], 'title' => $cfg[1], 'tip' => $cfg[2], 'type' => $cfg[3], 'value' => $cfg[4], 'content' => $cfg[5], ]); } } } }