module-catalog.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import {
  2. Code2,
  3. Database,
  4. Layers3,
  5. ListTodo,
  6. MemoryStick,
  7. Container,
  8. Server,
  9. Activity,
  10. Network,
  11. ClipboardCheck,
  12. } from 'lucide-react';
  13. export const modules = [
  14. {
  15. slug: 'api',
  16. name: 'API 服务开发',
  17. icon: Code2,
  18. count: 16,
  19. kicker: '接口与通信',
  20. stack: 'FastAPI · HTTP · SSE · WebSocket',
  21. description:
  22. '从 Python 函数到可调用的服务,完成参数校验、REST 接口、异步调用、流式响应与双向通信。',
  23. project: '电商商品服务',
  24. scope:
  25. '用商品名称、描述、价格和上架状态练习内存版接口,后续逐步补齐持久化、缓存和商品清单导出。业务围绕商品目录展开。',
  26. prerequisites: [
  27. 'Python 函数、列表与字典',
  28. '已安装 Python,能用编辑器保存文件',
  29. ],
  30. depends: [],
  31. outcomes: [
  32. '从空目录启动服务,用 /docs 和 curl 验证接口。',
  33. '完成 CRUD,正确处理状态码、输入校验与错误。',
  34. '消费 SSE 并释放连接,处理 WebSocket 断开。',
  35. '用自动化测试复现接口成功与失败路径。',
  36. ],
  37. },
  38. {
  39. slug: 'database',
  40. name: '数据库开发',
  41. icon: Database,
  42. count: 12,
  43. kicker: '数据与事务',
  44. stack: 'MySQL 8.4 LTS · InnoDB · PyMySQL',
  45. description:
  46. '从商品与分类的需求推导表结构,选择字段类型、主外键和约束,再验证查询、事务、索引与数据恢复。',
  47. project: 'shop_lab 商品与分类数据库',
  48. scope:
  49. '从表结构和 SQL 开始,完成查询计划分析、并发事务实验、最小权限与可恢复的备份。',
  50. prerequisites: [
  51. '已完成 API 服务开发',
  52. '已安装并可运行 Docker;第 01 课会创建 MySQL 练习库',
  53. ],
  54. depends: ['api'],
  55. outcomes: [
  56. '从读写需求设计商品表、分类表和关联表,解释金额、主外键与删除策略。',
  57. '用数据库约束保护数据,而非仅依赖应用校验。',
  58. '使用两个会话复现隔离、锁等待和死锁。',
  59. '根据 EXPLAIN 与实际数据选择索引和查询方式。',
  60. '完成受限账户访问、备份与隔离恢复验收。',
  61. ],
  62. },
  63. {
  64. slug: 'api-database',
  65. name: 'API + 数据库',
  66. icon: Layers3,
  67. count: 12,
  68. kicker: '持久化服务',
  69. stack: 'SQLAlchemy 2 · Alembic · MySQL',
  70. description:
  71. '把商品接口接入数据库,明确会话与事务边界,处理并发更新、幂等请求和兼容性迁移。',
  72. project: 'shop-service 持久化 API',
  73. scope:
  74. '以请求生命周期组织连接、事务和错误;用版本字段、唯一约束与 outbox 处理跨请求及跨进程一致性。',
  75. prerequisites: ['REST 接口与 Pydantic 模型', 'SQL、事务和数据库连接'],
  76. depends: ['api', 'database'],
  77. outcomes: [
  78. '每个请求独立使用 Session,并在明确边界提交或回滚。',
  79. '验证连接池预算、超时、重复提交与并发修改。',
  80. '通过 Alembic 实施兼容性迁移并验证旧版本行为。',
  81. '以真实 MySQL 测试约束、事务和故障路径。',
  82. ],
  83. },
  84. {
  85. slug: 'tasks',
  86. name: '异步任务开发',
  87. icon: ListTodo,
  88. count: 16,
  89. kicker: '并发与任务执行',
  90. stack: 'asyncio · threading · multiprocessing · Celery',
  91. description:
  92. '根据 I/O、CPU、隔离与持久性要求选择执行方式,把长任务变成可限流、可重试、可恢复的任务系统。',
  93. project: '商品清单导出与描述统计任务',
  94. scope:
  95. '从事件循环、线程和进程开始,再引入任务队列、数据库状态、outbox、工作租约和故障恢复。',
  96. prerequisites: [
  97. 'API 与数据库事务',
  98. '前 07 课使用本机 Python;第 08 课起准备 Linux / WSL2 与 Docker',
  99. ],
  100. depends: ['api-database'],
  101. outcomes: [
  102. '为 I/O 与 CPU 工作选择有界的协程、线程池或进程池。',
  103. '区分进程内后台任务与可持久化任务队列。',
  104. '处理重复投递、超时、取消、重试与 worker 退出。',
  105. '验证状态机、幂等、背压、调度与任务积压告警。',
  106. ],
  107. },
  108. {
  109. slug: 'redis',
  110. name: 'Redis 缓存',
  111. icon: MemoryStick,
  112. count: 10,
  113. kicker: '缓存与协调',
  114. stack: 'Redis 7 · redis-py · Cache Aside',
  115. description:
  116. '为读请求引入缓存,明确数据真源、失效窗口和容量边界,复现穿透、击穿、雪崩与 Redis 故障。',
  117. project: 'shop-service 查询缓存',
  118. scope:
  119. '缓存只承载可重建数据;围绕更新失效、热点保护、并发控制、内存策略与故障降级设计实现。',
  120. prerequisites: [
  121. '已完成持久化商品接口',
  122. '可用的 Docker;第 01 课会创建 Redis 练习实例',
  123. ],
  124. depends: ['api-database'],
  125. outcomes: [
  126. '实现包含 TTL 与键版本的缓存读取和更新失效。',
  127. '在并发下验证缓存击穿、过期抖动与热点保护。',
  128. '设置内存预算、连接超时与可用的失败降级。',
  129. '明确锁、计数器、会话与队列各自的可靠性边界。',
  130. ],
  131. },
  132. {
  133. slug: 'docker',
  134. name: 'Docker 容器化',
  135. icon: Container,
  136. count: 10,
  137. kicker: '构建与运行',
  138. stack: 'Docker Engine · Compose · OCI Images',
  139. description:
  140. '构建可复现镜像,组合 API、数据库、缓存与 worker,管理数据、网络、资源、健康检查与升级。',
  141. project: 'shop-service 容器运行环境',
  142. scope:
  143. '区分镜像、容器和持久卷;用非 root 运行、固定依赖、资源上限、迁移作业与可回滚发布管理服务。',
  144. prerequisites: [
  145. 'API、数据库、Redis 与任务进程的职责',
  146. 'Docker Engine / Docker Desktop 与 Compose',
  147. ],
  148. depends: ['tasks', 'redis'],
  149. outcomes: [
  150. '构建分层合理、非 root 运行的应用镜像。',
  151. '使用服务名、健康检查和持久卷组织多容器系统。',
  152. '验证优雅退出、资源限制、密钥注入与日志输出。',
  153. '在保留数据库数据的条件下完成升级与回滚。',
  154. ],
  155. },
  156. {
  157. slug: 'linux',
  158. name: 'Linux 部署',
  159. icon: Server,
  160. count: 10,
  161. kicker: '交付与运维',
  162. stack: 'Linux · systemd · Nginx · TLS',
  163. description:
  164. '把本地可运行服务部署到 Linux,建立权限边界、进程管理、反向代理、发布回滚与备份恢复流程。',
  165. project: 'shop-service Linux 部署',
  166. scope:
  167. '以独立练习主机为环境,验证服务启动、网络入口、流式代理、凭证权限、发布检查与恢复手册。',
  168. prerequisites: ['容器与服务网络', '独立 Linux 练习机,使用普通账户与 sudo'],
  169. depends: ['docker'],
  170. outcomes: [
  171. '建立最小权限运行账户、目录权限与网络入口。',
  172. '管理 systemd 服务并验证重启和停止行为。',
  173. '为 HTTP、SSE 和 WebSocket 配置代理与 TLS。',
  174. '执行有健康门槛的发布、回滚及隔离恢复演练。',
  175. ],
  176. },
  177. {
  178. slug: 'troubleshooting',
  179. name: '线上问题排查',
  180. icon: Activity,
  181. count: 12,
  182. kicker: '观测与故障恢复',
  183. stack: 'Logs · Metrics · Traces · Runbooks',
  184. description:
  185. '从请求症状建立证据链,定位 CPU、内存、连接、数据库、缓存与队列问题,验证止损和修复效果。',
  186. project: 'shop-service 故障演练环境',
  187. scope:
  188. '先定义影响范围,再观察指标、日志和追踪;在隔离环境复现故障,记录恢复操作与复发条件。',
  189. prerequisites: [
  190. 'API、数据库、任务与缓存实现',
  191. 'Linux 部署与独立故障演练环境',
  192. ],
  193. depends: ['linux'],
  194. outcomes: [
  195. '用请求 ID、日志与指标缩小问题范围。',
  196. '区分事件循环阻塞、CPU 饱和、内存增长和连接耗尽。',
  197. '定位慢 SQL、锁等待、缓存失效与任务堆积。',
  198. '验证恢复门槛、回滚、容量改进与复盘行动。',
  199. ],
  200. },
  201. {
  202. slug: 'distributed',
  203. name: '分布式系统设计',
  204. icon: Network,
  205. count: 12,
  206. kicker: '架构原理与面试推演',
  207. stack: '架构模式 · 一致性 · 可靠性 · 容量设计',
  208. description:
  209. '从商品查询与清单导出的跨进程链路出发,理解常见分布式架构、失败模式和解决方案。用场景推演与面试问答练习设计取舍。',
  210. project: '电商商品服务系统设计案例',
  211. scope:
  212. '纯理论模块,无环境安装和实战代码。围绕组件职责、故障时间线、方案代价与适用边界进行分析;能说清为什么选择,何时需要调整。',
  213. prerequisites: [
  214. '了解 API、数据库、缓存与队列各自的职责',
  215. '建议先阅读课程总览与相关模块图解',
  216. ],
  217. depends: ['api-database', 'tasks', 'redis'],
  218. outcomes: [
  219. '根据业务约束比较模块化单体、微服务和事件驱动架构。',
  220. '用具体故障解释一致性、重复消息、未知结果与缓存失效。',
  221. '说明幂等、事务、租约锁、重试与熔断各自解决的问题及边界。',
  222. '围绕容量、可观测性、RPO 与 RTO 完成有依据的系统设计回答。',
  223. ],
  224. },
  225. {
  226. slug: 'review',
  227. name: '复盘与自测',
  228. icon: ClipboardCheck,
  229. count: 9,
  230. kicker: '掌握标准与回学',
  231. stack: '理解问题 · 情境推演 · 掌握证据',
  232. description:
  233. '逐一回顾前面九个模块:先独立回答核心问题,再对照思考要点,以可验证的成果判断是否掌握,并找到需要回学的课时。',
  234. project: '电商商品服务 · 九模块能力复盘',
  235. scope:
  236. '每个单元对应一个技术模块,包含六个理解问题、两个情境推演和四项掌握标准。先作答后展开要点,自评与回答保存在当前浏览器,可按薄弱项返回原课时。',
  237. prerequisites: [
  238. '完成想要自测的对应模块即可进入',
  239. '准备自己的练习记录;先闭卷回答,再核对参考要点',
  240. ],
  241. depends: [],
  242. outcomes: [
  243. '能够独立解释各模块的核心机制,并用商品服务举例。',
  244. '条件改变或出现故障时,能推演结果、说明取舍和验证方法。',
  245. '每个模块的四项掌握标准都有实际操作或设计推演证据。',
  246. '将未掌握的问题对应到具体课时,补学后重新闭卷自测。',
  247. ],
  248. },
  249. ] as const;
  250. export type ModuleSlug = (typeof modules)[number]['slug'];
  251. export type ModuleInfo = (typeof modules)[number];
  252. export function getModule(slug: string) {
  253. return modules.find((m) => m.slug === slug);
  254. }