保存
This commit is contained in:
0
.qoder/quests/music-player-error-handling.md
Normal file
0
.qoder/quests/music-player-error-handling.md
Normal file
623
.qoder/quests/system-business-decoupling-design.md
Normal file
623
.qoder/quests/system-business-decoupling-design.md
Normal file
@@ -0,0 +1,623 @@
|
||||
# 系统与业务解耦架构设计
|
||||
|
||||
## 概述
|
||||
|
||||
本设计旨在构建一个高性能的类Windows桌面前端系统,实现系统框架与业务应用的完全解耦。系统提供统一的桌面环境、窗体管理和资源访问控制,而业务应用通过标准化的SDK接口进行开发,确保双方独立演进且相互不影响。
|
||||
|
||||
### 核心设计原则
|
||||
|
||||
- **完全隔离**:系统与应用在运行时完全隔离,应用无法直接访问系统资源
|
||||
- **标准化接口**:通过统一的SDK提供标准化的系统服务接口
|
||||
- **性能优先**:采用微前端沙箱、虚拟化渲染等技术确保高性能
|
||||
- **框架无关**:支持任意前端框架开发的第三方应用
|
||||
- **安全可控**:严格的权限控制和安全沙箱机制
|
||||
|
||||
## 整体架构
|
||||
|
||||
### 系统分层架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "用户界面层"
|
||||
Desktop[桌面容器]
|
||||
WindowManager[窗体管理器]
|
||||
TaskBar[任务栏]
|
||||
SystemUI[系统UI组件]
|
||||
end
|
||||
|
||||
subgraph "系统服务层"
|
||||
WindowService[窗体服务]
|
||||
ResourceService[资源服务]
|
||||
EventService[事件服务]
|
||||
SecurityService[安全服务]
|
||||
StorageService[存储服务]
|
||||
end
|
||||
|
||||
subgraph "应用运行时层"
|
||||
AppContainer[应用容器]
|
||||
SandboxEngine[沙箱引擎]
|
||||
SDKBridge[SDK桥接层]
|
||||
AppLifecycle[应用生命周期]
|
||||
end
|
||||
|
||||
subgraph "第三方应用"
|
||||
App1[业务应用A]
|
||||
App2[业务应用B]
|
||||
App3[业务应用C]
|
||||
end
|
||||
|
||||
Desktop --> WindowManager
|
||||
WindowManager --> WindowService
|
||||
AppContainer --> SandboxEngine
|
||||
SDKBridge --> SystemService[系统服务层]
|
||||
App1 --> AppContainer
|
||||
App2 --> AppContainer
|
||||
App3 --> AppContainer
|
||||
```
|
||||
|
||||
### 核心组件职责
|
||||
|
||||
| 组件 | 职责 | 接口类型 |
|
||||
| ---------- | -------------------------- | -------- |
|
||||
| 桌面容器 | 管理应用图标、布局和交互 | 系统内部 |
|
||||
| 窗体管理器 | 窗体创建、管理、切换和销毁 | 系统内部 |
|
||||
| 应用容器 | 第三方应用运行环境隔离 | 对外SDK |
|
||||
| 沙箱引擎 | 安全隔离和权限控制 | 系统内部 |
|
||||
| SDK桥接层 | 系统服务的标准化接口 | 对外SDK |
|
||||
|
||||
## 系统核心服务
|
||||
|
||||
### 窗体管理服务
|
||||
|
||||
窗体管理服务负责所有窗体的生命周期管理,提供统一的窗体操作接口。
|
||||
|
||||
#### 窗体生命周期
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Creating: 创建窗体
|
||||
Creating --> Loading: 加载应用
|
||||
Loading --> Active: 激活显示
|
||||
Active --> Minimized: 最小化
|
||||
Minimized --> Active: 恢复显示
|
||||
Active --> Maximized: 最大化
|
||||
Maximized --> Active: 还原
|
||||
Active --> Closing: 关闭请求
|
||||
Closing --> Destroyed: 销毁完成
|
||||
Destroyed --> [*]
|
||||
|
||||
Loading --> Error: 加载失败
|
||||
Error --> Destroyed: 错误处理
|
||||
```
|
||||
|
||||
#### 窗体服务接口规范
|
||||
|
||||
| 服务方法 | 参数 | 返回值 | 描述 |
|
||||
| -------------- | ----------------------- | -------------- | ------------ |
|
||||
| createWindow | appId, config | WindowInstance | 创建新窗体 |
|
||||
| destroyWindow | windowId | boolean | 销毁指定窗体 |
|
||||
| minimizeWindow | windowId | boolean | 最小化窗体 |
|
||||
| maximizeWindow | windowId | boolean | 最大化窗体 |
|
||||
| restoreWindow | windowId | boolean | 还原窗体 |
|
||||
| setWindowTitle | windowId, title | boolean | 设置窗体标题 |
|
||||
| setWindowSize | windowId, width, height | boolean | 设置窗体尺寸 |
|
||||
|
||||
### 资源管理服务
|
||||
|
||||
资源管理服务提供统一的系统资源访问控制,确保应用只能通过授权访问系统资源。
|
||||
|
||||
#### 资源访问控制矩阵
|
||||
|
||||
| 资源类型 | 默认权限 | 申请方式 | 审批流程 |
|
||||
| ------------ | ------------ | -------- | -------- |
|
||||
| 本地存储 | 应用独立空间 | 配置声明 | 自动授权 |
|
||||
| 网络请求 | 白名单域名 | 动态申请 | 用户确认 |
|
||||
| 文件系统 | 禁止访问 | 动态申请 | 用户确认 |
|
||||
| 系统通知 | 禁止发送 | 动态申请 | 用户确认 |
|
||||
| 剪贴板 | 禁止访问 | 动态申请 | 用户确认 |
|
||||
| 摄像头麦克风 | 禁止访问 | 动态申请 | 用户确认 |
|
||||
|
||||
### 事件通信服务
|
||||
|
||||
提供系统级别的事件通信机制,支持应用间消息传递和系统事件监听。
|
||||
|
||||
#### 事件分类与权限
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "系统事件"
|
||||
SE1[窗体状态变化]
|
||||
SE2[主题切换]
|
||||
SE3[网络状态变化]
|
||||
SE4[系统资源变化]
|
||||
end
|
||||
|
||||
subgraph "应用事件"
|
||||
AE1[应用间消息]
|
||||
AE2[应用状态同步]
|
||||
AE3[数据共享请求]
|
||||
end
|
||||
|
||||
subgraph "用户事件"
|
||||
UE1[用户交互]
|
||||
UE2[快捷键触发]
|
||||
UE3[拖拽操作]
|
||||
end
|
||||
|
||||
SE1 --> 只读监听
|
||||
SE2 --> 只读监听
|
||||
AE1 --> 权限验证
|
||||
AE2 --> 权限验证
|
||||
UE1 --> 应用内处理
|
||||
```
|
||||
|
||||
## 应用沙箱机制
|
||||
|
||||
### 沙箱隔离策略
|
||||
|
||||
应用运行在完全隔离的沙箱环境中,通过多重隔离机制确保安全性。
|
||||
|
||||
#### 沙箱隔离层次
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "物理隔离层"
|
||||
IFrame[IFrame容器]
|
||||
ShadowDOM[Shadow DOM]
|
||||
CSP[内容安全策略]
|
||||
end
|
||||
|
||||
subgraph "逻辑隔离层"
|
||||
Namespace[命名空间隔离]
|
||||
Memory[内存隔离]
|
||||
Storage[存储隔离]
|
||||
end
|
||||
|
||||
subgraph "网络隔离层"
|
||||
CORS[跨域限制]
|
||||
Proxy[代理拦截]
|
||||
Whitelist[白名单过滤]
|
||||
end
|
||||
|
||||
subgraph "API隔离层"
|
||||
SDKProxy[SDK代理]
|
||||
Permission[权限验证]
|
||||
Audit[审计日志]
|
||||
end
|
||||
|
||||
IFrame --> Namespace
|
||||
ShadowDOM --> Memory
|
||||
CSP --> Storage
|
||||
Namespace --> SDKProxy
|
||||
Memory --> Permission
|
||||
Storage --> Audit
|
||||
```
|
||||
|
||||
### 沙箱性能优化
|
||||
|
||||
#### 虚拟化渲染机制
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start[应用启动] --> CheckCache{检查缓存}
|
||||
CheckCache -->|存在| LoadCache[加载缓存实例]
|
||||
CheckCache -->|不存在| CreateSandbox[创建沙箱]
|
||||
|
||||
CreateSandbox --> PreloadResources[预加载资源]
|
||||
PreloadResources --> InitSDK[初始化SDK]
|
||||
InitSDK --> MountApp[挂载应用]
|
||||
|
||||
LoadCache --> ValidateCache{验证缓存有效性}
|
||||
ValidateCache -->|有效| RestoreApp[恢复应用状态]
|
||||
ValidateCache -->|无效| CreateSandbox
|
||||
|
||||
MountApp --> AppReady[应用就绪]
|
||||
RestoreApp --> AppReady
|
||||
|
||||
AppReady --> Monitor[性能监控]
|
||||
Monitor --> OptimizeMemory[内存优化]
|
||||
OptimizeMemory --> CheckIdle{检查空闲状态}
|
||||
CheckIdle -->|空闲| SuspendApp[挂起应用]
|
||||
CheckIdle -->|活跃| Monitor
|
||||
|
||||
SuspendApp --> CheckActivate{检查激活请求}
|
||||
CheckActivate -->|激活| RestoreApp
|
||||
CheckActivate -->|继续空闲| SuspendApp
|
||||
```
|
||||
|
||||
## SDK接口设计
|
||||
|
||||
### SDK架构组成
|
||||
|
||||
SDK作为应用与系统间的唯一通信桥梁,提供完整的系统服务接口。
|
||||
|
||||
#### SDK模块划分
|
||||
|
||||
| 模块名称 | 功能描述 | 主要接口 |
|
||||
| ----------- | -------- | --------------------------------------- |
|
||||
| WindowSDK | 窗体操作 | setTitle, resize, minimize, maximize |
|
||||
| StorageSDK | 数据存储 | get, set, remove, clear |
|
||||
| EventSDK | 事件通信 | emit, on, off, broadcast |
|
||||
| UISDK | UI组件 | showDialog, showNotification, showToast |
|
||||
| NetworkSDK | 网络请求 | request, upload, download |
|
||||
| ResourceSDK | 资源访问 | getFile, saveFile, getClipboard |
|
||||
|
||||
### SDK使用示例
|
||||
|
||||
#### 窗体操作SDK
|
||||
|
||||
```typescript
|
||||
// 应用中使用窗体SDK的示例
|
||||
interface WindowSDK {
|
||||
// 设置窗体标题
|
||||
setTitle(title: string): Promise<boolean>
|
||||
|
||||
// 调整窗体尺寸
|
||||
resize(width: number, height: number): Promise<boolean>
|
||||
|
||||
// 最小化窗体
|
||||
minimize(): Promise<boolean>
|
||||
|
||||
// 最大化窗体
|
||||
maximize(): Promise<boolean>
|
||||
|
||||
// 监听窗体状态变化
|
||||
onStateChange(callback: (state: WindowState) => void): void
|
||||
}
|
||||
```
|
||||
|
||||
#### 存储服务SDK
|
||||
|
||||
```typescript
|
||||
// 应用存储SDK接口定义
|
||||
interface StorageSDK {
|
||||
// 存储数据
|
||||
set(key: string, value: any): Promise<boolean>
|
||||
|
||||
// 获取数据
|
||||
get(key: string): Promise<any>
|
||||
|
||||
// 删除数据
|
||||
remove(key: string): Promise<boolean>
|
||||
|
||||
// 清空存储
|
||||
clear(): Promise<boolean>
|
||||
|
||||
// 监听存储变化
|
||||
onChanged(callback: (key: string, newValue: any, oldValue: any) => void): void
|
||||
}
|
||||
```
|
||||
|
||||
### SDK权限控制机制
|
||||
|
||||
#### 权限申请流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as 第三方应用
|
||||
participant SDK as SDK桥接层
|
||||
participant Security as 安全服务
|
||||
participant User as 用户界面
|
||||
participant System as 系统服务
|
||||
|
||||
App->>SDK: 调用需权限的API
|
||||
SDK->>Security: 检查权限状态
|
||||
|
||||
alt 已授权
|
||||
Security->>SDK: 返回已授权
|
||||
SDK->>System: 调用系统服务
|
||||
System->>SDK: 返回执行结果
|
||||
SDK->>App: 返回结果
|
||||
else 未授权
|
||||
Security->>User: 显示权限申请弹窗
|
||||
User->>Security: 用户确认/拒绝
|
||||
alt 用户同意
|
||||
Security->>SDK: 授权通过
|
||||
SDK->>System: 调用系统服务
|
||||
System->>SDK: 返回执行结果
|
||||
SDK->>App: 返回结果
|
||||
else 用户拒绝
|
||||
Security->>SDK: 权限被拒绝
|
||||
SDK->>App: 返回权限错误
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
## 应用生命周期管理
|
||||
|
||||
### 应用状态管理
|
||||
|
||||
应用在系统中具有完整的生命周期管理,确保资源的合理分配和回收。
|
||||
|
||||
#### 应用状态转换图
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Installing: 安装应用
|
||||
Installing --> Installed: 安装完成
|
||||
Installing --> InstallFailed: 安装失败
|
||||
InstallFailed --> [*]
|
||||
|
||||
Installed --> Starting: 启动应用
|
||||
Starting --> Running: 运行中
|
||||
Starting --> StartFailed: 启动失败
|
||||
StartFailed --> Installed
|
||||
|
||||
Running --> Suspended: 挂起
|
||||
Suspended --> Running: 恢复
|
||||
Running --> Stopping: 停止
|
||||
Stopping --> Installed: 已停止
|
||||
|
||||
Installed --> Uninstalling: 卸载应用
|
||||
Uninstalling --> [*]: 卸载完成
|
||||
```
|
||||
|
||||
### 应用资源管理
|
||||
|
||||
#### 内存管理策略
|
||||
|
||||
| 应用状态 | 内存策略 | 清理时机 | 恢复方式 |
|
||||
| ---------- | -------------- | -------- | ---------- |
|
||||
| Running | 完整内存保持 | 不清理 | 无需恢复 |
|
||||
| Suspended | 压缩非关键数据 | 5分钟后 | 延迟加载 |
|
||||
| Background | 最小化内存占用 | 立即清理 | 重新初始化 |
|
||||
| Stopped | 完全释放内存 | 立即清理 | 完整重启 |
|
||||
|
||||
#### 性能监控指标
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "性能指标"
|
||||
CPU[CPU使用率]
|
||||
Memory[内存占用]
|
||||
Network[网络请求]
|
||||
Render[渲染性能]
|
||||
end
|
||||
|
||||
subgraph "监控阈值"
|
||||
CPULimit[CPU < 30%]
|
||||
MemoryLimit[内存 < 100MB]
|
||||
NetworkLimit[请求 < 10/s]
|
||||
RenderLimit[FPS > 30]
|
||||
end
|
||||
|
||||
subgraph "优化策略"
|
||||
Throttle[请求节流]
|
||||
Cache[智能缓存]
|
||||
Lazy[懒加载]
|
||||
Virtual[虚拟滚动]
|
||||
end
|
||||
|
||||
CPU --> CPULimit
|
||||
Memory --> MemoryLimit
|
||||
Network --> NetworkLimit
|
||||
Render --> RenderLimit
|
||||
|
||||
CPULimit --> Throttle
|
||||
MemoryLimit --> Cache
|
||||
NetworkLimit --> Throttle
|
||||
RenderLimit --> Virtual
|
||||
```
|
||||
|
||||
## 数据流架构
|
||||
|
||||
### 系统数据流
|
||||
|
||||
系统采用单向数据流架构,确保数据的一致性和可追踪性。
|
||||
|
||||
#### 数据流向图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph "系统层"
|
||||
SystemStore[系统状态存储]
|
||||
SystemEvents[系统事件总线]
|
||||
SystemServices[系统服务]
|
||||
end
|
||||
|
||||
subgraph "应用层"
|
||||
AppState[应用状态]
|
||||
AppEvents[应用事件]
|
||||
AppSDK[应用SDK]
|
||||
end
|
||||
|
||||
subgraph "界面层"
|
||||
SystemUI[系统界面]
|
||||
AppUI[应用界面]
|
||||
end
|
||||
|
||||
SystemStore --> SystemUI
|
||||
SystemEvents --> SystemUI
|
||||
SystemServices --> AppSDK
|
||||
AppSDK --> AppState
|
||||
AppState --> AppUI
|
||||
AppEvents --> SystemEvents
|
||||
|
||||
SystemUI --> SystemEvents
|
||||
AppUI --> AppEvents
|
||||
```
|
||||
|
||||
### 跨应用数据共享
|
||||
|
||||
#### 数据共享权限模型
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据提供者"
|
||||
ProviderApp[应用A]
|
||||
DataExport[导出数据接口]
|
||||
Permission[权限配置]
|
||||
end
|
||||
|
||||
subgraph "系统中介"
|
||||
DataBroker[数据代理服务]
|
||||
PermissionCheck[权限验证]
|
||||
DataTransform[数据转换]
|
||||
end
|
||||
|
||||
subgraph "数据消费者"
|
||||
ConsumerApp[应用B]
|
||||
DataImport[导入数据接口]
|
||||
DataValidation[数据验证]
|
||||
end
|
||||
|
||||
ProviderApp --> DataExport
|
||||
DataExport --> DataBroker
|
||||
Permission --> PermissionCheck
|
||||
DataBroker --> PermissionCheck
|
||||
PermissionCheck --> DataTransform
|
||||
DataTransform --> DataImport
|
||||
DataImport --> ConsumerApp
|
||||
DataImport --> DataValidation
|
||||
```
|
||||
|
||||
## 部署与运维
|
||||
|
||||
### 应用分发机制
|
||||
|
||||
系统支持多种应用分发方式,确保第三方应用的便捷接入。
|
||||
|
||||
#### 应用打包规范
|
||||
|
||||
| 文件类型 | 必需性 | 描述 | 示例 |
|
||||
| ------------- | ------ | ------------ | -------------------------- |
|
||||
| manifest.json | 必需 | 应用清单文件 | 包含应用基本信息、权限需求 |
|
||||
| index.html | 必需 | 应用入口文件 | 应用主页面 |
|
||||
| assets/ | 可选 | 静态资源目录 | CSS、图片、字体等 |
|
||||
| sdk/ | 可选 | SDK依赖文件 | 如需离线使用SDK |
|
||||
|
||||
#### 应用安装流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Upload[上传应用包] --> Validate[验证应用包]
|
||||
Validate --> Extract[解压应用文件]
|
||||
Extract --> ScanSecurity[安全扫描]
|
||||
ScanSecurity --> CheckPermission[权限检查]
|
||||
CheckPermission --> RegisterApp[注册应用]
|
||||
RegisterApp --> CreateSandbox[创建沙箱环境]
|
||||
CreateSandbox --> InstallComplete[安装完成]
|
||||
|
||||
Validate -->|验证失败| InstallFailed[安装失败]
|
||||
ScanSecurity -->|安全风险| InstallFailed
|
||||
CheckPermission -->|权限过度| UserConfirm[用户确认]
|
||||
UserConfirm -->|同意| RegisterApp
|
||||
UserConfirm -->|拒绝| InstallFailed
|
||||
```
|
||||
|
||||
### 系统监控与日志
|
||||
|
||||
#### 监控体系架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据采集层"
|
||||
AppMetrics[应用性能指标]
|
||||
SystemMetrics[系统性能指标]
|
||||
UserActions[用户行为数据]
|
||||
ErrorLogs[错误日志]
|
||||
end
|
||||
|
||||
subgraph "数据处理层"
|
||||
DataAggregator[数据聚合器]
|
||||
AlertEngine[告警引擎]
|
||||
Analytics[分析引擎]
|
||||
end
|
||||
|
||||
subgraph "展示层"
|
||||
Dashboard[监控面板]
|
||||
Reports[性能报告]
|
||||
Alerts[告警通知]
|
||||
end
|
||||
|
||||
AppMetrics --> DataAggregator
|
||||
SystemMetrics --> DataAggregator
|
||||
UserActions --> Analytics
|
||||
ErrorLogs --> AlertEngine
|
||||
|
||||
DataAggregator --> Dashboard
|
||||
Analytics --> Reports
|
||||
AlertEngine --> Alerts
|
||||
```
|
||||
|
||||
## 安全机制
|
||||
|
||||
### 多层安全防护
|
||||
|
||||
系统采用多层安全防护机制,确保系统和应用的安全运行。
|
||||
|
||||
#### 安全防护体系
|
||||
|
||||
| 防护层级 | 防护措施 | 防护目标 |
|
||||
| -------- | ------------------ | -------- |
|
||||
| 网络层 | HTTPS强制、CSP策略 | 传输安全 |
|
||||
| 应用层 | 沙箱隔离、权限控制 | 运行安全 |
|
||||
| 数据层 | 加密存储、访问控制 | 数据安全 |
|
||||
| 用户层 | 身份验证、操作审计 | 使用安全 |
|
||||
|
||||
### 权限管理系统
|
||||
|
||||
#### 权限分级模型
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "系统权限"
|
||||
SysAdmin[系统管理员]
|
||||
SysOperator[系统操作员]
|
||||
SysUser[系统用户]
|
||||
end
|
||||
|
||||
subgraph "应用权限"
|
||||
AppOwner[应用所有者]
|
||||
AppUser[应用用户]
|
||||
AppGuest[应用访客]
|
||||
end
|
||||
|
||||
subgraph "资源权限"
|
||||
ReadOnly[只读权限]
|
||||
ReadWrite[读写权限]
|
||||
FullControl[完全控制]
|
||||
end
|
||||
|
||||
SysAdmin --> FullControl
|
||||
SysOperator --> ReadWrite
|
||||
SysUser --> ReadOnly
|
||||
|
||||
AppOwner --> FullControl
|
||||
AppUser --> ReadWrite
|
||||
AppGuest --> ReadOnly
|
||||
```
|
||||
|
||||
## 性能优化策略
|
||||
|
||||
### 渲染性能优化
|
||||
|
||||
#### 虚拟化渲染机制
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
ViewportDetection[视口检测] --> VisibilityCheck{可见性检查}
|
||||
VisibilityCheck -->|可见| RenderApp[渲染应用]
|
||||
VisibilityCheck -->|不可见| SuspendRender[暂停渲染]
|
||||
|
||||
RenderApp --> FrameOptimization[帧率优化]
|
||||
FrameOptimization --> RequestAnimationFrame[RAF调度]
|
||||
RequestAnimationFrame --> RenderComplete[渲染完成]
|
||||
|
||||
SuspendRender --> MemoryCleanup[内存清理]
|
||||
MemoryCleanup --> LowPowerMode[低功耗模式]
|
||||
|
||||
RenderComplete --> ViewportDetection
|
||||
LowPowerMode --> ViewportDetection
|
||||
```
|
||||
|
||||
### 内存管理优化
|
||||
|
||||
#### 智能内存回收策略
|
||||
|
||||
| 回收时机 | 回收对象 | 回收策略 | 恢复方式 |
|
||||
| ---------- | ------------- | ----------- | ------------ |
|
||||
| 应用切换时 | 非活跃应用DOM | 延迟5秒回收 | 重新渲染 |
|
||||
| 内存告警时 | 缓存数据 | LRU算法清理 | 重新请求 |
|
||||
| 长时间空闲 | 应用实例 | 序列化存储 | 反序列化恢复 |
|
||||
| 系统重启时 | 所有临时数据 | 立即清理 | 重新初始化 |
|
||||
Reference in New Issue
Block a user