# Kylin AdminLTE

Kylin AdminLTE 后台模板包 — Fork 自 adminlte-laravel，集成 AdminLTE 4 + Bootstrap 5.3.8，提供企业级合规后台管理界面。

## 功能特性

- **AdminLTE 4**：基于 Bootstrap 5.3.8 的后台管理模板
- **Blade 组件**：侧边栏、导航栏、面包屑、卡片等 Blade 组件
- **菜单配置**：通过配置文件定义后台菜单，支持多级嵌套
- **主题定制**：CSS 变量支持自定义主题色
- **暗色模式**：内置暗色模式切换（`theme.dark` 配置）
- **多标签页**：支持多标签页导航
- **法律合规**：内置 ICP 备案号、公安备案号、隐私政策、Cookie 同意等合规组件
- **无障碍访问**：跳过导航链接、ARIA 标签、屏幕阅读器支持
- **安全防护**：CSRF Token、外部链接 noopener 防护、CSP/HSTS/X-Frame-Options 安全头中间件
- **Artisan 命令**：一键安装前端资源

## 安装

```bash
composer require kylin/adminlte
```

### 发布配置

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

### 发布视图（可选，用于自定义）

```bash
php artisan vendor:publish --tag=kylin-adminlte-views
```

### 安装前端资源

```bash
php artisan kylin:adminlte:install
```

## 配置

配置文件：`config/kylin-adminlte.php`

### 基础配置

| 配置项 | 类型 | 默认值 | 说明 |
|------|------|------|------|
| `title` | string | `APP_NAME` | 网站标题 |
| `title_prefix` | string | `''` | 标题前缀 |
| `title_postfix` | string | `''` | 标题后缀 |
| `logo` | string | `'<b>Kylin</b> Admin'` | Logo HTML |
| `logo_img` | string\|null | `null` | Logo 图片路径 |
| `logo_img_class` | string | `'img-circle elevation-1'` | Logo 图片 CSS 类 |

### 用户菜单配置

| 配置项 | 类型 | 默认值 | 说明 |
|------|------|------|------|
| `usermenu_enabled` | bool | `true` | 是否显示用户菜单 |
| `profile_url` | string | `'/admin/profile'` | 个人资料页面 URL |
| `logout_url` | string | `'/admin/logout'` | 退出登录 URL |
| `login_url` | string | `'/admin/login'` | 登录页面 URL |
| `dashboard_url` | string | `'/admin'` | 控制台 URL |

### 主题配置

| 配置项 | 类型 | 默认值 | 说明 |
|------|------|------|------|
| `theme.dark` | bool | `false` | 是否启用暗色模式 |
| `theme.sidebar` | string | `'dark'` | 侧边栏主题（dark/light） |
| `theme.navbar` | string | `'white'` | 导航栏主题 |
| `theme.accent` | string | `'primary'` | 主题色 |

### 静态资源配置

| 配置项 | 类型 | 默认值 | 说明 |
|------|------|------|------|
| `assets.adminlte_css` | string | `'vendor/kylin-adminlte/css/adminlte.min.css'` | AdminLTE CSS |
| `assets.adminlte_js` | string | `'vendor/kylin-adminlte/js/adminlte.min.js'` | AdminLTE JS |
| `assets.bootstrap_css` | string | `'vendor/kylin-adminlte/css/bootstrap.min.css'` | Bootstrap CSS |
| `assets.bootstrap_js` | string | `'vendor/kylin-adminlte/js/bootstrap.bundle.min.js'` | Bootstrap JS |

### 法律合规配置

| 配置项 | 类型 | 默认值 | 说明 |
|------|------|------|------|
| `footer.copyright` | string | `APP_NAME` | 版权信息 |
| `footer.icp_number` | string | `''` | ICP 备案号（如：京ICP备XXXXXXXX号） |
| `footer.icp_url` | string | `'https://beian.miit.gov.cn/'` | 工信部备案查询地址 |
| `footer.public_security_number` | string | `''` | 公安备案号 |
| `footer.privacy_policy_url` | string | `'/privacy'` | 隐私政策页面 URL |
| `footer.terms_url` | string | `'/terms'` | 服务条款页面 URL |
| `cookie_consent.enabled` | bool | `true` | 是否启用 Cookie 同意弹窗 |
| `cookie_consent.message` | string | 见配置 | Cookie 同意提示信息 |
| `cookie_consent.button_text` | string | `'同意'` | 同意按钮文字 |
| `cookie_consent.more_info_url` | string | `'/privacy'` | 了解更多链接 |
| `accessibility.skip_navigation` | bool | `true` | 是否启用跳过导航链接 |

### 环境变量参考

```bash
# .env
ICP_NUMBER=京ICP备XXXXXXXX号
PUBLIC_SECURITY_NUMBER=京公网安备XXXXXXXX号
PRIVACY_POLICY_URL=/privacy
TERMS_URL=/terms
COOKIE_CONSENT_ENABLED=true
```

## 使用示例

### 后台布局

```blade
@extends('kylin-adminlte::layouts.app')

@section('title', '页面标题')

@section('content-header')
    <h1>页面标题 <small>副标题</small></h1>
    <ol class="breadcrumb">
        <li class="breadcrumb-item"><a href="/admin">首页</a></li>
        <li class="breadcrumb-item active">当前页面</li>
    </ol>
@stop

@section('content')
    <div class="card">
        <div class="card-header">
            <h3 class="card-title">卡片标题</h3>
        </div>
        <div class="card-body">
            内容区域
        </div>
    </div>
@stop

@push('css')
    <link rel="stylesheet" href="/css/custom.css">
@endpush

@push('js')
    <script src="/js/custom.js"></script>
@endpush
```

### 菜单配置

```php
// config/kylin-adminlte.php
'menu' => [
    // 标题分隔
    ['header' => '主导航'],
    
    // 基础菜单项
    [
        'text' => '控制台',
        'route' => 'admin.dashboard',
        'icon' => 'bi bi-speedometer2',
    ],
    
    // 子菜单
    [
        'text' => '用户管理',
        'icon' => 'bi bi-people',
        'submenu' => [
            ['text' => '用户列表', 'route' => 'admin.users.index', 'icon' => 'bi bi-list-ul'],
            ['text' => '角色管理', 'route' => 'admin.roles.index', 'icon' => 'bi bi-shield-check'],
            ['text' => '权限管理', 'route' => 'admin.permissions.index', 'icon' => 'bi bi-key'],
        ],
    ],
    
    // 外部链接
    [
        'text' => '帮助文档',
        'url' => 'https://docs.example.com',
        'icon' => 'bi bi-book',
        'target' => '_blank',
    ],
    
    ['header' => '系统设置'],
    [
        'text' => '系统配置',
        'route' => 'admin.settings',
        'icon' => 'bi bi-gear',
        'can' => 'manage-settings', // Gate 权限控制
    ],
],
```

### 菜单配置项

| 属性 | 类型 | 说明 |
|------|------|------|
| `header` | string | 菜单分组标题 |
| `text` | string | 菜单项显示文字 |
| `route` | string | Laravel 路由名称 |
| `url` | string | 绝对 URL 地址 |
| `icon` | string | Bootstrap Icons 图标类名 |
| `submenu` | array | 子菜单数组 |
| `target` | string | 链接打开方式（`_blank` 新窗口） |
| `can` | string | Gate 权限检查（无权限时隐藏菜单） |
| `role` | string | 角色权限检查（使用 `@role` 指令） |
| `active` | array | 自定义激活路由匹配 |

### 安全头中间件

```php
// 在路由组中使用安全头中间件
Route::middleware('admin-security')->group(function () {
    Route::get('/admin', [DashboardController::class, 'index']);
    // ... 其他后台路由
});

// 或注册为全局中间件（在 Http\Kernel 中）
protected $middleware = [
    // ...
    \Kylin\Adminlte\Middleware\SecurityHeadersMiddleware::class,
];
```

### 账号注销入口

```bash
# .env
ACCOUNT_DELETE_URL=/account/delete
```

启用后，页脚将自动显示"注销账号"链接，符合《个保法》第四十七条要求。

### 扩展主布局

```blade
{{-- resources/views/layouts/admin.blade.php --}}
@extends('kylin-adminlte::master')

@section('content_header')
    @yield('content-header')
@stop

@section('content')
    @yield('content')
@stop

{{-- 在页面使用 --}}
@extends('layouts.admin')
@section('content-header')
    <h1>自定义页面</h1>
@stop
```

## 视图结构

```
resources/views/
├── master.blade.php              # 主模板（HTML 结构）
├── layouts/
│   └── app.blade.php             # 应用布局（继承 master）
└── partials/
    ├── navbar.blade.php          # 顶部导航栏
    ├── sidebar.blade.php         # 侧边栏菜单（支持 header/submenu/can/role）
    ├── sidebar-item.blade.php    # 菜单项渲染组件
    ├── sidebar-subitem.blade.php # 子菜单项渲染组件
    ├── footer.blade.php          # 页脚（含 ICP 备案号、隐私政策、服务条款、注销账号）
    └── cookie-consent.blade.php  # Cookie 同意弹窗（依据《个保法》17条）
```

## 合规要点

| 法规 | 要求 | 实现方式 |
|------|------|----------|
| 《互联网信息服务管理办法》12条 | 标明 ICP 备案号 | 页脚 `footer.icp_number` 配置 |
| 《个保法》17条 | 告知 Cookie 使用 | `cookie_consent` 配置 + 弹窗组件 |
| 《个保法》7条 | 公开隐私政策 | 页脚隐私政策/服务条款链接 |
| 《个保法》47条 | 提供删除个人信息途径 | 页脚 `account_delete_url` 配置 |
| 《无障碍环境建设法》32条 | 无障碍设计 | 跳过导航链接、ARIA 标签 |
| 等保 2.0 8.1.3.2 | 通信保密性 | `SecurityHeadersMiddleware`（HSTS/CSP/X-Frame-Options） |
| 等保 2.0 8.1.4.4 | 登录失败处理 | 与 auth 扩展包集成 |

## 依赖

- PHP ^8.5
- Laravel ^13.0
- kylin/core
- Bootstrap 5.3.8
- AdminLTE 4

## 许可证

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