MeetAdalaja/real-time-support-platform

GitHub: MeetAdalaja/real-time-support-platform

一款基于现代技术栈的企业级实时支持与事件响应平台。

Stars: 0 | Forks: 0

# 30天全栈实践路线图 本README是您每天执行指南,通过实际工作来增强全栈JavaScript/TypeScript面试能力。 主要项目是: **实时支持与事件响应平台** 您正在构建一个生产风格的内部公司工具,其中支持代理、工程师和管理员处理客户工单、事件、SLA截止日期、升级、通知、评论、附件、审计日志和实时更新。 此项目旨在教授真正的工程技能: - 后端API设计 - TypeScript - NestJS - PostgreSQL - Redis - WebSockets - 后台作业 - 认证 - 基于角色的访问控制 - 测试 - Docker - CI/CD - 调试 - 系统设计 - 面试解释 DSA有意从本README中删除,因为您已经在使用外部系统,并且每天解决一个问题。 ## 如何使用此README 每天,只遵循当天的部分。 每一天都有: - **目标:**今天的内容。 - **学习:**您必须理解的概念。 - **构建:**您必须完成的项目工作。 - **练习:**解释/调试/系统思维。 - **完成条件:**一天的明确完成线。 - **预计时间表:**现实的8-10小时结构。 除非今天完全完成,否则不要尝试提前完成未来的日子。 ## 项目摘要 您将构建一个实时支持与事件响应平台,具有: - 登录和用户角色 - 工单创建和工单生命周期 - 工单分配 - 客户可见回复 - 内部备注 - 工单时间线/历史 - 事件创建和事件更新 - SLA截止日期和升级 - 应用内通知 - Redis支持的后台作业 - WebSocket实时更新 - 文件附件元数据 - 审计日志 - 仪表板摘要 - 测试 - Docker和CI - 部署备注 ## 推荐堆栈 - 前端:Next.js、React、TypeScript - 后端:NestJS、TypeScript - 数据库:PostgreSQL - ORM:TypeORM - 缓存/队列:Redis - 实时:Socket.IO或NestJS WebSocket网关 - 测试:Jest、Supertest、Playwright - DevOps:Docker Compose、GitHub Actions ## 核心角色 | 角色 | 职责 | | --- | --- | | 管理员 | 管理用户、角色、审计日志和敏感操作 | | 支持经理 | 分配工单、管理队列、处理升级 | | 支持代理 | 处理分配的工单并回复客户 | | 工程师 | 处理技术升级和事件 | | 查看者 | 只读访问 | ## 主要数据模型 您将逐步创建这些: - `User` - `Ticket` - `TicketComment` - `TicketEvent` - `Incident` - `IncidentUpdate` - `Notification` - `Attachment` - `AuditLog` - `RefreshToken`或`Session` ## 30天计划 ## 第1天:TypeScript、HTTP和项目理解 ### 目标 了解您要构建的内容,并为后端API创建基本的心理模型。 今天不是关于构建大型功能。今天是要了解: - 支持工单系统是什么 - HTTP API是如何工作的 - TypeScript如何帮助您安全地建模数据 - 首个后端对象应该是什么样子 ### 学习 关注以下主题: - TypeScript原始类型:`string`、`number`、`boolean` - 对象类型和接口 - 联合类型 - 可选字段 - 函数参数和返回类型 - 基本HTTP方法:`GET`、`POST`、`PATCH`、`DELETE` - 基本HTTP状态码:`200`、`201`、`400`、`401`、`403`、`404`、`500` - 请求体与查询参数与路由参数 您应该能够回答: - `POST /tickets`和`GET /tickets`之间的区别是什么? - 为什么后端数据应该是类型化的? - `400`错误意味着什么? - `401`错误意味着什么? - `403`错误意味着什么? ### 构建 创建您的第一个项目笔记和类型。 创建或更新项目笔记文件: ``` What is this app? Who uses it? What is a ticket? What is an incident? What actions can users perform? What should happen when a ticket is created? ``` 然后定义您的第一个TypeScript形状: ``` type TicketPriority = "low" | "medium" | "high" | "urgent"; type TicketStatus = | "open" | "assigned" | "waiting_on_customer" | "escalated" | "resolved" | "closed"; type TicketCategory = | "billing" | "technical" | "account" | "bug" | "feature_request" | "incident"; interface Ticket { id: string; title: string; description: string; priority: TicketPriority; status: TicketStatus; category: TicketCategory; requesterEmail: string; assigneeId?: string; createdAt: Date; updatedAt: Date; } ``` 还要定义: ``` interface PaginatedResponse { items: T[]; page: number; limit: number; total: number; } ``` ### 练习 大声解释: 使用以下流程: 1. 用户填写表单。 2. 前端验证明显字段。 3. 前端发送`POST /tickets`。 4. 后端验证请求体。 5. 后端创建工单。 6. 后端将工单存储在数据库中。 7. 后端返回`201 Created`。 8. 前端显示成功状态。 ### 完成条件 当您完成第1天时: - 您理解了项目。 - 您可以解释工单创建请求。 - 您创建了基本的工单TypeScript类型。 - 您理解常见的HTTP方法和状态码。 - 您写完了第1天的笔记。 ### 预计时间表 - 1小时:理解项目领域 - 1.5小时:学习TypeScript基础知识 - 1小时:学习HTTP基础知识 - 2小时:编写工单类型和笔记 - 1小时:解释请求生命周期 - 1小时:回顾和清理笔记 ## 第2天:异步JavaScript和内存中工单服务 ### 目标 构建您的第一个无数据库的后端风格服务。 在开始使用PostgreSQL之前,您需要理解简单的内存数据中的服务逻辑。这使数据库工作更容易。 ### 学习 关注以下内容: - `Promise` - `async`和`await` - `try/catch` - 服务函数 - CRUD操作 - 为什么业务逻辑不应直接位于控制器中 您应该能够回答: - 为什么API函数通常返回Promise? - 当异步函数抛出异常时会发生什么? - 控制器逻辑和服务逻辑之间的区别是什么? ### 构建 创建内存中的工单服务。 它应该支持: - 创建工单 - 列出工单 - 通过ID获取工单 - 更新工单状态 - 分配工单 示例服务方法: ``` createTicket(input) listTickets(filters) getTicketById(id) updateTicketStatus(id, status) assignTicket(id, assigneeId) ``` 暂时将数据保存在数组中。 添加简单的规则: - 标题是必需的。 - 优先级必须是有效的。 - 状态必须是有效的。 - 关闭的工单不能被移回为打开状态。 ### 练习 解释: - 为什么规则放在服务中? - 如果工单ID不存在会发生什么? - 如果状态转换无效会发生什么? ### 完成条件 当您完成时: - 您可以在内存中创建工单。 - 您可以列出工单。 - 您可以更新工单状态。 - 您可以解释为什么服务逻辑很重要。 ### 预计时间表 - 1小时:学习async/await - 1小时:设计服务方法 - 3小时:构建内存服务 - 1小时:添加简单的验证/规则 - 1小时:练习解释 ## 第3天:验证、错误和API合约 ### 目标 了解真实API如何保护自己免受不良输入并返回可预测的错误。 ### 学习 关注以下内容: - DTOs - 验证 - 错误响应形状 - 查询参数 - 分页 - 过滤 - 排序 您应该能够回答: - 为什么后端验证很重要,即使前端也进行了验证? - 什么是API合约? - 为什么错误应该具有一致的形状? ### 构建 设计您的API合约。 创建标准错误形状: ``` { "statusCode": 400, "code": "VALIDATION_ERROR", "message": "Request validation failed", "details": [ { "field": "title", "message": "Title is required" } ], "requestId": "req_123" } ``` 设计工单列表查询: ``` GET /tickets?page=1&limit=20&status=open&priority=urgent&sort=createdAt&order=desc ``` 添加验证规则: - 标题:必需的,3-120个字符 - 描述:必需的,最多3000个字符 - 优先级:低、中、高、紧急 - 类别:账单、技术、账户、错误、功能请求、事件 - 请求者电子邮件:有效的电子邮件 ### 练习 解释: - `400`、`401`和`403`之间的区别是什么? - 为什么`limit`被限制? - 为什么应该允许列表排序字段? ### 完成条件 当您完成时: - 您有一个清晰的API错误形状。 - 您有工单验证规则。 - 您有分页/过滤/排序规则。 - 您可以解释为什么API合约很重要。 ### 预计时间表 - 1小时:学习验证和DTO概念 - 1小时:设计错误形状 - 2小时:定义工单验证规则 - 1.5小时:定义分页/过滤/排序合约 - 1小时:练习解释 ## 第4天:NestJS项目结构 ### 目标 了解如何组织真实的NestJS后端。 ### 学习 关注以下内容: - 模块 - 控制器 - 服务 - 提供者 - 依赖注入 - DTO文件夹结构 - 常用工具 您应该能够回答: - 什么是NestJS模块? - 控制器负责什么? - 服务负责什么? - 为什么依赖注入有帮助? ### 构建 创建后端模块结构: ``` src/ |-- auth/ |-- users/ |-- tickets/ |-- comments/ |-- incidents/ |-- notifications/ |-- audit/ |-- common/ ``` 在`tickets`内部准备: ``` tickets.controller.ts tickets.service.ts ticket.entity.ts dto/create-ticket.dto.ts dto/update-ticket.dto.ts ``` 不要过度构建。目标是清晰的架构。 ### 练习 解释: - 控制器接收HTTP请求。 - DTO验证输入。 - 服务应用业务规则。 - 存储库/数据库存储数据。 ### 完成条件 当您完成时: - 后端文件夹清晰。 - 工单模块具有控制器/服务/DTO结构。 - 您可以解释每一层的责任。 ### 预计时间表 - 1小时:学习NestJS结构 - 2小时:创建模块文件夹 - 2小时:创建工单控制器/服务骨架 - 1小时:编写架构笔记 - 1小时:大声解释结构 ## 第5天:PostgreSQL数据建模 ### 目标 在编写数据库代码之前设计数据库模式。 ### 学习 关注以下内容: - 表 - 列 - 主键 - 外键 - 一对多关系 - 多对多关系 - 索引 - 创建/更新时间戳 您应该能够回答: - 为什么评论需要`ticketId`? - 为什么事件-工单链接需要一个单独的表? - 索引是什么? ### 构建 设计以下表: ``` users tickets ticket_comments ticket_events incidents incident_updates incident_tickets notifications attachments audit_logs ``` 对于每个表,编写: - 主要列 - 关系 - 重要的索引 - 为什么这个表存在 最小工单列: ``` id title description priority status category requester_email assignee_id created_by_id created_at updated_at resolved_at closed_at ``` ### 练习 解释: - `ticket_comments`和`ticket_events`之间的区别是什么? - 为什么`incident_tickets`很有用? - 为什么状态和优先级应该被索引? ### 完成条件 当您完成时: - 您已经编写了数据库设计。 - 您可以解释每个表。 - 您知道您将添加的第一个索引。 ### 预计时间表 - 1小时:学习关系型数据库基础知识 - 2小时:设计模式 - 1.5小时:定义关系 - 1小时:定义索引 - 1小时:解释模式 ## 第6天:使用数据库的工单CRUD ### 目标 将您的工单服务连接到PostgreSQL。 ### 学习 关注以下内容: - TypeORM实体 - 存储库 - `find` - `findOne` - `save` - `update` - 使用`where`进行过滤 - 使用`skip`和`take`进行分页 您应该能够回答: - 实体是什么? - 存储库是什么? - 服务逻辑如何使用数据库访问? ### 构建 实现: - 创建工单 - 列出工单 - 获取工单详情 - 更新工单状态 - 分配工单 每个列表端点都应该支持: - 页码 - 限制 - 状态过滤器 - 优先级过滤器 - 类别过滤器 - 分配者过滤器 当工单状态更改时,创建工单事件。 ### 练习 解释: - 当工单状态更改时会发生什么? - 为什么我们创建事件历史记录? - 如果数据库写入失败会发生什么? ### 完成条件 当您完成时: - 工单CRUD与数据库一起工作。 - 工单状态更改创建历史记录。 - 工单列表支持基本过滤器。 ### 预计时间表 - 1小时:学习TypeORM基础知识 - 3小时:实现工单数据库CRUD - 1小时:添加过滤器/分页 - 1小时:在状态更改时添加工单事件 - 1小时:手动测试和解释 ## 第7天:Swagger、种子数据和第一周回顾 ### 目标 使后端易于理解和演示。 ### 学习 关注以下内容: - Swagger/OpenAPI - API文档 - 种子数据 - 手动测试 - 周回顾 ### 构建 添加: - Swagger设置 - 工单端点的Swagger文档 - 用户和工单的种子数据 - README备注,说明如何运行后端 至少种子: - 5个用户 - 20个工单 - 多个状态 - 多个优先级 - 多个类别 - 多个分配者 ### 练习 进行5分钟的讲解: 包括: - 应用程序做什么 - 存在哪些表 - 存在哪些端点 - 什么是不完整的 - 下一步是什么 ### 完成条件 当您完成时: - Swagger文档可以打开。 - 存有种子工单。 - 您可以清楚地解释第一周。 ### 预计时间表 - 1小时:学习Swagger基础知识 - 2小时:添加Swagger文档 - 2小时:添加种子数据 - 1小时:手动测试端点 - 1小时:第一周回顾 ## 第8天:认证 ### 目标 允许用户安全地登录。 ### 学习 关注以下内容: - 密码散列 - bcrypt - JWT或会话 - 访问令牌 - 刷新令牌 - 身份验证保护 - 登录失败处理 您应该能够回答: - 为什么我们散列密码? - 认证和授权之间的区别是什么? - 当登录失败时会发生什么? ### 构建 实现: - 注册用户 - 登录用户 - 散列密码 - 验证密码 - 发布令牌/会话 - 获取当前用户端点 - 保护工单路由 ### 练习 解释: - 登录流程的每一步。 - 为什么密码永远不会以纯文本形式存储。 - 令牌缺失时会发生什么。 ### 完成条件 当您完成时: - 用户可以注册。 - 用户可以登录。 - 受保护的路由拒绝未经身份验证的请求。 - `/me`返回当前用户。 ### 预计时间表 - 1小时:学习认证基础知识 - 2小时:构建注册/登录 - 1.5小时:添加密码散列 - 1.5小时:添加身份验证保护/当前用户 - 1小时:手动测试 ## 第9天:基于角色的访问控制 ### 目标 控制每个用户角色可以做什么。 ### 学习 关注以下内容: - 授权 - 角色 - 权限 - 保护 - 权限助手 - 后端强制执行与前端隐藏 构建 实现角色: - 管理员 - 支持经理 - 支持代理 - 工程师 - 查看者 实现权限: - 创建工单 - 分配工单 - 回复工单 - 添加内部备注 - 升级工单 - 创建事件 - 解决事件 - 查看审计日志 - 删除工单 根据权限保护路由。 ### 练习 解释: - 前端角色隐藏不是安全性的原因。 - 为什么后端必须强制执行权限。 - 认证和授权之间的区别。 ### 完成条件 当您完成时: - 查看者不能修改工单。 - 支持经理可以分配工单。 - 工程师可以创建事件。 - 管理员可以查看审计日志。 ### 预计时间表 - 1小时:学习RBAC基础知识 - 2小时:定义权限 - 2小时:构建权限保护/助手 - 1小时:保护路由 - 1小时:手动角色测试 ## 第10天:评论和工单时间线 ### 目标 通过评论和历史使工单详情更真实。 ### 学习 关注以下内容: - 一对多关系 - 内部备注与公共回复 - 时间线/事件建模 - 只读历史 ### 构建 实现: - 添加工单评论 - 列出工单评论 - 标记评论为内部或客户可见 - 添加工单事件记录 - 显示工单事件历史记录 事件应包括: - 工单创建 - 工单分配 - 状态更改 - 评论添加 - 工单升级 ### 练习 解释: - 为什么评论和事件是分开的。 - 为什么历史不应该被覆盖。 - 时间线如何帮助调试。 ### 完成条件 当您完成时: - 工单详情有评论。 - 工单详情有事件历史记录。 - 内部备注与客户可见回复分开。 ### 预计时间表
标签:CMS安全, Docker, IT运维, JavaScript, Linux 内核安全, NestJS, PostgreSQL, React, Redis, SLA管理, Socks5代理, Syscalls, TypeORM, TypeScript, WebSocket, 仪表盘, 依赖分析, 后端开发, 团队协作, 基于角色的访问控制, 安全插件, 安全防御评估, 实时支持, 审计日志, 客户服务, 技术支持, 搜索引擎查询, 测试, 测试用例, 票务系统, 系统设计, 缓存队列, 背景任务, 调试, 部署, 面试准备, 项目管理