# Kylin Settings

Kylin 系统设置包 — 键值配置 CRUD、分组管理、加密存储、审计日志、变更通知、RBAC 权限控制。

## 功能特性

- **键值存储**：灵活的键值对配置管理
- **分组管理**：按业务分组组织配置项（default/security/payment/third_party/sms/email）
- **类型安全**：支持 string / int / bool / json / array / **encrypted** 类型
- **加密存储**：`encrypted` 类型自动 `Crypt::encryptString()` 加密存储，读取自动解密（依据《密码法》第二十七条）
- **缓存策略**：读取时自动缓存，更新时自动失效
- **批量操作**：批量获取/设置配置
- **环境覆盖**：支持 .env 覆盖数据库配置
- **审计日志**：配置增删改自动写入 `kylin/audit-log`，敏感值自动脱敏（依据等保 2.0 8.1.4.6）
- **变更通知**：敏感分组（security/payment/third_party/sms/email）变更触发 `SettingChanged` 事件
- **权限控制**：`SettingPolicy` 基于 RBAC 控制配置管理权限
- **敏感值脱敏**：secret/key/token/password 等关键字段自动脱敏（依据《个人信息保护法》第五十一条）

## 安装

```bash
composer require kylin/settings
```

## 配置发布

```bash
php artisan vendor:publish --tag=kylin-settings-config
php artisan vendor:publish --tag=kylin-settings-migrations
php artisan migrate
```

## 使用示例

### Facade 方式

```php
use Kylin\Settings\Facades\KylinSettings;

// 常规配置
KylinSettings::set('site.name', 'Kylin App');
KylinSettings::set('site.logo', '/images/logo.png', type: 'string', group: 'site');

// 加密配置（密钥/Token 等）
KylinSettings::set('payment.alipay.app_secret', 'sk_xxxxxxxx', type: 'encrypted', group: 'payment');
$secret = KylinSettings::get('payment.alipay.app_secret'); // 自动解密

// 获取（带默认值）
$name = KylinSettings::get('site.name', '默认名称');

// 批量获取分组配置（自动解密加密字段）
$config = KylinSettings::getGroup('payment');

// 删除
KylinSettings::forget('site.logo');

// 检查是否存在
$exists = KylinSettings::has('site.name');
```

### 监听变更事件

```php
use Kylin\Settings\Events\SettingChanged;

Event::listen(SettingChanged::class, function (SettingChanged $event) {
    // $event->group, $event->key, $event->newValue, $event->oldValue, $event->userId
    Log::info("敏感配置变更: {$event->group}.{$event->key}", [
        'user_id' => $event->userId,
    ]);
});
```

### 权限控制

```php
// SettingPolicy 自动校验
// 在 Controller 中：
public function update(Request $request, Setting $setting)
{
    $this->authorize('update', $setting); // RBAC 权限校验
    // ...
}
```

## 配置说明

```php
// config/kylin-settings.php

'cache_enabled' => true,           // 缓存开关
'cache_ttl'     => 3600,           // 缓存 TTL（秒）

'sensitive_groups' => [            // 敏感分组（变更触发事件）
    'security',
    'payment',
    'third_party',
    'sms',
    'email',
],

'sensitive_keys' => [              // 敏感关键字（审计日志脱敏）
    'secret', 'key', 'token', 'password', 'api_key', 'app_secret',
],
```

## API 路由

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /api/kylin/settings | 配置列表 |
| POST | /api/kylin/settings | 创建/更新配置 |
| GET | /api/kylin/settings/{key} | 获取单个配置 |
| PUT | /api/kylin/settings/{key} | 更新配置 |
| DELETE | /api/kylin/settings/{key} | 删除配置 |
| GET | /api/kylin/settings/group/{group} | 按分组获取配置 |

## 数据库表

| 表名 | 说明 |
|------|------|
| `kylin_settings` | 配置表（key/group/value/type/description） |

## 法律合规

详见 [LEGAL.md](./LEGAL.md)，涵盖：
- 《中华人民共和国网络安全法》— 第二十一条、第二十二条、第四十一条
- 《中华人民共和国个人信息保护法》— 第六条、第二十八条、第四十七条、第五十一条
- 《中华人民共和国数据安全法》— 第二十一条、第二十七条、第二十九条
- 《中华人民共和国密码法》— 第十二条、第二十七条
- 等保 2.0 (GB/T 22239-2019) — 8.1.4.1/8.1.4.3/8.1.4.6

## 依赖

- PHP ^8.5
- Laravel ^13.0
- kylin/core
- kylin/audit-log（可选，用于审计日志）

## 许可证

私有软件，未经授权禁止使用。
