# Kylin Prompt

Kylin 防沉迷适龄提示语包 — 按年龄分组定制提示语，符合 T/CADPA 14-2021 标准，含 AI 合规标注、国际化、审计日志。

## 功能特性

- **年龄分组提示**：四级年龄分组（未满 8 周岁/8-16 周岁/16-18 周岁/已满 18 周岁）
- **适龄提示**：符合 T/CADPA 14-2021《网络游戏适龄提示》标准
- **9 种场景**：登录/时段限制/时长预警/消费限额/强制下线/健康忠告/监护人绑定/人脸识别/举报渠道
- **缓存优化**：提示语缓存 1 小时（`cache_ttl = 3600`）
- **降级机制**：数据库无数据时使用默认文案（版号审核必过）
- **多语言**：支持 zh/en/ja/ko 四语言（`PromptInternationalization`）
- **AI 合规标注**：AI 生成提示语标注 `[AI生成]` 标识（`AIPromptCompliance`）
- **审计日志**：`PromptAudit` Trait 提供审计能力
- **权限控制**：`PromptPolicy` 继承 `CrudPolicy`，权限命名 `prompt.*`

## 安装

```bash
composer require kylin/prompt
```

## 配置发布

```bash
php artisan vendor:publish --tag=kylin-prompt-config
```

## 配置说明

```php
// config/kylin-prompt.php
return [
    'cache_key' => 'kylin:prompts',
    'cache_ttl' => 3600,                 // 缓存 TTL（秒）
    'age_groups' => [
        0 => '未满8周岁',
        1 => '8周岁以上未满16周岁',
        2 => '16周岁以上未满18周岁',
        3 => '已满18周岁',
    ],
];
```

## 使用示例

### Facade

```php
use Kylin\Prompt\Facades\KylinPrompt;

// 根据年龄组获取提示语
$prompt = KylinPrompt::getPrompt(1, 'login');  // 8-16 周岁登录提示

// 根据实际年龄获取登录提示语
$prompt = KylinPrompt::getAgePrompt(15);  // 自动判断年龄组

// 获取所有年龄分组的登录提示语
$prompts = KylinPrompt::getAllPrompts();

// 获取某年龄组所有场景提示语
$prompts = KylinPrompt::getPromptsByAgeGroup(1);

// 获取健康游戏忠告
$advice = KylinPrompt::getHealthAdvice(3);

// 清除缓存
KylinPrompt::clearCache();
```

### AI 合规标注

```php
use Kylin\Prompt\Services\AIPromptCompliance;

// 标注 AI 生成的提示语
$marked = AIPromptCompliance::markAIGenerated([
    'title' => '温馨提示',
    'content' => '请合理安排游戏时间',
]);
// $marked['title'] = '[AI生成] 温馨提示'
// $marked['content'] = "请合理安排游戏时间\n\n[AI生成] 本提示语由 AI 生成，仅供参考。"

// 判断是否为 AI 生成
$isAI = AIPromptCompliance::isAIGenerated($marked);  // true

// 去除 AI 标记
$cleaned = AIPromptCompliance::removeAIMark($marked);

// 合规声明
$notice = AIPromptCompliance::complianceNotice();
```

### 国际化

```php
use Kylin\Prompt\Services\PromptInternationalization;

// 翻译为英文
$translated = PromptInternationalization::translate($prompt, 'en');

// 获取当前语言环境的提示语
$localized = PromptInternationalization::getLocalizedContent($prompt);

// 获取支持的语言列表
$locales = PromptInternationalization::supportedLocales();
// ['zh' => '简体中文', 'en' => 'English', 'ja' => '日本語', 'ko' => '한국어']
```

### 审计日志（通过 Trait）

```php
use Kylin\Prompt\Traits\PromptAudit;

class PromptManageService
{
    use PromptAudit;

    public function updatePrompt(int $promptId, array $data): void
    {
        // ... 业务逻辑 ...
        $this->auditPrompt('prompt_updated', 'kp_prompts', $promptId, [
            'age_group' => $data['age_group'],
            'scene' => $data['scene'],
        ]);
    }
}
```

### API 路由

公开查询路由无需鉴权，管理类路由需通过 `auth:sanctum` 鉴权。

| 方法 | 路径 | 鉴权 | 说明 |
|------|------|------|------|
| GET | /api/kylin/prompt/show | 否 | 按年龄组+场景查询 |
| GET | /api/kylin/prompt/by-age | 否 | 按实际年龄查询登录提示 |
| GET | /api/kylin/prompt/all | 否 | 所有年龄分组登录提示 |
| GET | /api/kylin/prompt/by-age-group | 否 | 某年龄组所有场景提示 |
| GET | /api/kylin/prompt/compliance-notice | 否 | AI 合规声明 |
| POST | /api/kylin/prompt/mark-ai | 是 | AI 合规标注 |
| POST | /api/kylin/prompt/clear-cache | 是 | 清除缓存 |

## 提示场景

| 场景 | 说明 | 适用年龄组 |
|------|------|------------|
| `login` | 登录提示 | 全部 |
| `time_limit` | 时段限制提示 | 0-2（未满 18 周岁） |
| `duration_warning` | 时长预警提示 | 0-2（未满 18 周岁） |
| `payment_limit` | 消费限额提示 | 0-2（未满 18 周岁） |
| `kick` | 强制下线提示 | 0-2（未满 18 周岁） |
| `health_advice` | 健康游戏忠告 | 全部 |
| `guardian_bind` | 监护人绑定提示 | 0-1（未满 16 周岁） |
| `face_verify` | 人脸识别提示 | 全部 |
| `report_channel` | 举报渠道提示 | 全部 |

## 数据库表

| 表名 | 说明 |
|------|------|
| `kp_prompts` | 提示语表（age_group + scene 唯一） |

## 合规要点

| 合规项 | 实现方式 | 法律依据 |
|------|------|------|
| 适龄提示 | 4 级年龄分组，9 种场景 | 《未成年人保护法》第七十五条 |
| 时段限制 | `time_limit` 场景提示 | 《未成年人保护法》第七十六条 |
| 消费限额 | `payment_limit` 场景提示 | 防沉迷通知第二条 |
| AI 生成标注 | `AIPromptCompliance::markAIGenerated()` | 《深度合成服务管理规定》第六条 |
| 多语言支持 | `PromptInternationalization` | 《网络安全法》第十二条 |
| 审计日志 | `PromptAudit` Trait + `audit()` | 《网络安全法》第二十一条 |
| 权限控制 | `PromptPolicy` 继承 `CrudPolicy` | — |
| 缓存机制 | `cache_ttl = 3600` | — |
| 降级机制 | `getDefaultPrompt()` 默认文案 | 版号审核要求 |

## 审计事件

| 事件 | 说明 |
|------|------|
| `prompt_cache_cleared` | 提示语缓存清除 |
| `prompt_updated` | 提示语更新（通过 `PromptAudit` Trait） |
| `prompt_created` | 提示语创建（通过 `PromptAudit` Trait） |
| `prompt_deleted` | 提示语删除（通过 `PromptAudit` Trait） |

## 法律合规

详见 [LEGAL.md](./LEGAL.md)，涵盖：
- 《中华人民共和国未成年人保护法》(2021.6.1)
- 国家新闻出版署《关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知》(2021.8.30)
- T/CADPA 14-2021《网络游戏适龄提示》
- 《互联网信息服务深度合成管理规定》(2023.1.10)
- 《中华人民共和国个人信息保护法》(2021.11.1)
- 《中华人民共和国网络安全法》(2017.6.1)
- 等保 2.0 (GB/T 22239) 8.1.4.6

## 依赖

- PHP ^8.5
- Laravel ^13.0
- kylin/core
- 建议：kylin/audit-log（审计日志）、kylin/rbac（权限控制）

## 许可证

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