MexConfigGroup::class, 'type' => MexConfigType::class, 'is_enabled' => 'boolean', 'is_readonly' => 'boolean', 'sort_order' => 'integer', 'options' => 'array', ]; /** * 获取配置的实际值(根据类型转换) */ public function getTypedValue() { if (!$this->is_enabled) { return $this->type->castValue($this->default_value); } return $this->type->castValue($this->value); } /** * 设置配置值(根据类型验证和转换) */ public function setTypedValue($value): bool { if (!$this->type->validateValue($value)) { return false; } $this->value = $this->type->castValue($value); return true; } /** * 获取配置的显示值 */ public function getDisplayValue(): string { $value = $this->getTypedValue(); return match ($this->type) { MexConfigType::BOOLEAN => $value ? '是' : '否', MexConfigType::JSON, MexConfigType::ARRAY => json_encode($value, JSON_UNESCAPED_UNICODE), default => (string) $value, }; } /** * 检查配置是否有效 */ public function isValid(): bool { if (!$this->is_enabled) { return true; } return $this->type->validateValue($this->value); } /** * 重置为默认值 */ public function resetToDefault(): void { $this->value = $this->default_value; } /** * 作用域:按分组筛选 */ public function scopeByGroup(Builder $query, MexConfigGroup $group): Builder { return $query->where('group', $group); } /** * 作用域:只查询启用的配置 */ public function scopeEnabled(Builder $query): Builder { return $query->where('is_enabled', true); } /** * 作用域:只查询非只读的配置 */ public function scopeEditable(Builder $query): Builder { return $query->where('is_readonly', false); } /** * 作用域:按排序权重排序 */ public function scopeOrdered(Builder $query): Builder { return $query->orderBy('sort_order')->orderBy('key'); } /** * 作用域:按键名搜索 */ public function scopeSearchKey(Builder $query, string $search): Builder { return $query->where(function ($q) use ($search) { $q->where('key', 'like', "%{$search}%") ->orWhere('name', 'like', "%{$search}%") ->orWhere('description', 'like', "%{$search}%"); }); } /** * 获取分组标签 */ public function getGroupLabelAttribute(): string { return $this->group->getLabel(); } /** * 获取类型标签 */ public function getTypeLabelAttribute(): string { return $this->type->getLabel(); } /** * 获取状态标签 */ public function getStatusLabelAttribute(): string { if (!$this->is_enabled) { return '已禁用'; } if ($this->is_readonly) { return '只读'; } return '正常'; } }