{
  "themeColor": "#10162F",
  "slug": "web-code-bootcamp-or-learn-to-code-1",
  "name": "AI Engineer 全栈项目班 Code Bootcamp | Learn to Code",
  "description": "全栈班+DevOps班流程图 整个流程分为五个大阶段：计划、开发、构建、测试、发布。 从全栈班到DevOps班学员共同奋斗完成这五个阶段内容，这一流程为开发团队提供了完整的解决方案，帮助学员全面掌握全栈开发DevOps的核心技能。我们独有的P3商业项目同时贯穿了整个栈，全面提升了实战能力流程和对抗！ 澳洲的IT工作环境如何？ 在澳洲做会计师是怎样的一种体验？没有996，没有35岁，不歧视女性，不内卷，工作和生活平衡等等。 工作生活平衡 ：澳大利亚职场文化强调合理的工作时间和灵活的工作安排，支持工作与生活的平衡。 信念和约束性 ：澳洲致力于营造一个多元和约束性的工作环境，不严格年龄限制，同时积极推动性别平等。 职业发展机会 ：IT行业的快速发展带来了广泛的职业机会，公司通常提供培训和发展课程以支持员工技能提升。 有相对的薪酬和福利 ：IT专业人士可以享受到具有相对价格和全面的福利套餐。 优质的工作和生活环境 ：现代化的办公设施和优美的自然环境，使得工作和生活质量都相当重要。 澳洲IT行业翟先生 ？ 在澳大利亚，IT行业的薪资水平因地区、公司规模和职位的不同而存在显着差异。根据2023年的数据，澳大利亚各州的平均薪资之间也有所不同，新南威尔士州平均薪资最高，达到约80,000澳元，而塔斯马尼亚州的薪资最低，约65,000澳元。此外，随着技能的持续，几乎九成的雇主都面临人才难题，这导致许多雇主提高薪资以奖励和留住员工。 全栈开发者职业发展 下图展示了全栈工程师在IT公司的职位和不同的工作职位 从需求部署的各个阶段中涉及不同的角色和技术，对IT开发流程有以下关键项目参与者和参与者： Stakeholder : 明确项目的需求和目标。 Business Analyst : 分析业务需求，确定项目范围。 Product Owner : 确保产品符合业务需求和用户需求。 UI Designer : 设计产品的用户界面，提高用户体验。 QA &amp; Tester : 负责软件的质量控制和bug测试。 Full-stack Developer : 负责开发和项目落地。 DevOps &amp; SRE &amp; Cloud Engineer : 优化项目的开发运营流程，管理云基础设施。 Data Engineer : 处理和管理数据流，设计数据存储解决方案。 Data Analyst : 分析数据，提供决策支持。 Data Warehouse/Lake/Tools : 管理和分析大量数据。 UAT, Staging, Production (用户验收测试、预生产、生产环境) : 分阶段部署和测试软件，确保产品质量。 针对 Agile (敏捷) 方法论的应用，这是一种迭代和以人为核心的开发流程，可以快速响应项目需求的变化，增强团队协作和项目透明度。整个图示反映了现代软件开发中多学科团队的协作和技术的综合应用，突出了全栈开发者在整个开发周期内的关键作用，以及他们如何与其他专业领域的专家一起工作，共同推进项目的成功。 Developer职业成长 Web全栈班是为了帮助IT/CS毕业生，以及想转行做IT，成长成为一位合格 (Qualified) 的Full-stack Developer/ Front-end Developer/Back-end Developer/ Software Engineer，在澳洲和中国找到一份全职工作。 如何在澳洲找到第一份工作? 什么是Web开发全栈项目班? 2017年， 匠人学院 在澳洲 首次独创 Web全栈班模式， 完全自主研发 课程，课件，内容，以及 关联项目 和 澳洲本地合作公司 ，每一期都不断地询问学员意见进行修改和升级， Web全栈班 会根据一线老师，以及公司需求变化而变化。匠人也跟Deloitte, Servian等公司合作，定向向公司提供优秀学员。 Web全栈班根据澳洲 Job Market 的需求变化而变化，完全面向企业需求进行课程设置。Web全栈班已经培养了 4000 多位学员，帮助 4000 多位学员在澳洲、中国、美国就业。 &rdquo;帮助大家能更好地在本地就业&ldquo; --- 这也是匠人学院始终如一的目标。 精彩的Web全栈学习之旅- 掌握从前端开发到后端、云端部署及CI/CD的全方位技能 从基础到精通，我们的课程覆盖了 JavaScript ， HTML5 ， CSS3 ， ES6 ，程序员必备版本控制能力 Git ，澳洲市场占有率最高的前端框架 React.js 、以及三大高需求后端技术： Node.js 、 Java 、 .NET ，还有 Amazon Web Service(AWS) ， OpenAI 等企业需求的技术。 不仅仅是基础开发工作，更多会涉及到云端架构， Serverless ， Microservice 等架构，经历目前企业需要的必备 CI/CD 部署经验等。从 开发 到 部署 ，全链路学习。 通过实战项目，您不仅能掌握编程知识，还会获得实际开发经验。我们提供2个个人项目和1个商业项目，让您能在真实场景中应用所学，准备好步入职场。同时，我们的职业辅导和简历内推服务，将助您顺利找到理想的工作。 Offer收割机 已经帮助4000多位学生就业。 Web全栈班的团队大项目+简历内推，让学生通过Web全栈班就能拿到至少2个优质的工作经验。整个的Agile工作模式体系，跟中等规模的公司相似。拿到工作经验=拿到Offer，可以拿到相当于6个月的工作经验，不愁在澳洲找不到工作。每期全栈班都是全新的团队项目，每个团队都是不同的项目，每个团队有项目Tutor带领。让上课学到的知识也可以直接实践利用，并且很多更难的技术也可以在项目学习和应用。 Web全栈班课程安排（Timeline） Web全栈班6.0 开始，有14周的教课内容。整个Bootcamp持续24周 Web 全栈班课程大纲 6.0 新的 Web 全栈班课程大纲，新增Nextjs、AWS、Lambda和AI App课程内容。 Web全栈班核心解决的问题 团队合作能力欠缺，缺乏团队合作意识 刚毕业或在校学生的团队合作能力普遍比较欠缺，不知道如何跟团队里其他的Developer沟通和合作，缺乏团队合作的经验和意识。遇到代码问题常常不知道如何解决，也找不到有效的沟通方式和解决办法，通常都是一个人蒙头写代码，但结果却不尽人意，既浪费了时间也还影响了团队的工作效率。 缺乏工程化思维 工程思维是指在解决问题和设计解决方案时，能够综合考虑项目的全局性、系统性和实用性，以及可持续发展和风险管理等方面的思考模式。在软件开发领域，这意味着开发人员不仅需要关注代码的编写，还需要从更广阔的视角考虑软件的设计、架构、用户体验、性能、安全、维护和可扩展性等各个方面。 简单来说，就是在开发的过程中需要把复杂问题简单化，知道妥协、知道循序渐进。不仅要考虑代码的质量问题，还要考虑业务需求、项目工期、开发成本等各种因素之间的相互影响。 学校所学技能不符合澳洲公司主流技术栈要求 许多学员在学习学习的技术多为基础理论，缺乏实际项目的练习和实践。而且学校目前教授的HTML，CSS等课程都是开发中较为基础的技术栈，与澳洲企业要求的主流技术栈存在明显的gap，学生毕业后无法直接达到企业招聘的要求和满足实际需求。 代码质量达不到澳洲IT公司标准 在学校学习或自学编程的过程中常常缺乏code review 环节，难以达到商业级工程代码质量。我们的课程中会提供专业导师点评，帮助学员快速提升。学习并实践符合澳洲企业编制的代码规范，提高代码质量，以达到澳洲公司要求。 缺乏云端项目经验 学校的作业或个人项目缺乏云端部署的经验，匠人提供Production Grade的云端项目实战经验，帮助学员熟悉从开发到部署的完整流程。 简历总是石沉大海，缺乏竞争力 澳洲留学生找工作难的原因之一就是简历不过关或简历缺乏竞争力，投递的简历总是石沉大海。匠人Web全栈班能够帮助学员补充商业级项目经验、实习经验，提升简历含金量，让HR更愿意给出面试机会。 缺少工作机会和职业资源支持 澳洲的留学生或毕业生求职往往都是孤军奋战，只能仅通过常规的招聘网站来找工作，缺少工作机会和职业资源支持。但匠人的学员能够借助匠人学院庞大的校友网络，获得工作内推机会。也可以通过建立Networking扩大自己的人脉资源，从前辈和行业大神那里收获行业资讯和经验分享。匠人可以为学员求职提供强有力的支持。 Web 全栈班学习内容 多元化职业道路，一次报名，三重选择 选择我们的课程，您将开启 Node.js 、 .Net 、 Java 三大热门后端技术的学习之旅。我们的资源共享机制，跨课程、跨城市的学习环境，助您拓宽职业视野，增加获取理想工作Offer的可能性。无论您在澳洲还是中国，这门课程都将为您的Web开发和编程事业铺设坚实的基石。通过实战项目经验积累，提升您在职场的竞争力，我们的课程适合想在商业项目中增加实战经验的您。 &nbsp; 前端培训: 企业级前端技术精讲 深入解析前端技术的企业应用，如 React 、 Redux Saga 、 ES6 等，帮助学员紧跟行业最新需求，编写出高质量的代码。课程内容随市场需求定期更新，确保学员学到最实用、最前沿的技能。 Web 培训: Web 标准化与响应式设计 系统讲解 HTML5 、 CSS3 、 Sass 等前端基础，重点训练标准化编程和响应式网页设计，让学员能编写出符合行业标准的Web项目。 React 培训: 系统掌握 React 开发 摆脱自学困境，通过项目实战和企业案例，深入学习 React 的语法、结构和组件设计，帮助学员理解企业级代码质量要求，提升React开发能力。 后端培训: 可选三语言后端开发精英培养 澳洲唯一涵盖 Nodejs， .NET , Java 的三语言后端培训，深入讲解后端架构、微服务、 RESTful API 等核心知识，拓宽学员的职业发展路径。 Node.js 方向&nbsp; Node.js采用 线上直播课 的模式学习。在Node.js方向的学习中，你将深入了解Node.js的核心原理、模块系统以及事件驱动模型。我们将从基础开始，带你逐步掌握 Node.js 的基本语法、 API 调用以及 Express.js 等常用框架的使用。 .NET 方向 .NET方向采用 线下 教学的模式，悉尼、墨尔本、布里斯班三个城市开班。在.NET方向的学习中，你将领略到.NET框架的强大功能与灵活性。我们将从 .NET 框架的基础知识讲起，涵盖 C#语言基础 、 ASP.NET Web开发 、 WCF服务开发 等多个方面。通过学习，你将掌握如何使用.NET框架构建高效、安全的Web应用程序，提升你的开发能力和项目实战水平。 Java 方向 Java方向采用 Self-Paced Learning 的学习模式。在Java方向的学习中，你将体验到Java作为企业级开发语言的魅力。我们将从Java语言基础入手，讲解面向对象编程思想、JVM原理、常用设计模式等核心知识，还会学习Spring Boot。 AI方向内容介绍&nbsp; &nbsp;Speech sample app&nbsp; 功能亮点 全面的AI应用 ：AI课程涵盖语音识别、文本转换、翻译及生成式AI应用，全面提升学员的AI技术能力。 实用工具开发 ：通过开发实际应用（如语音转文字、文本翻译），学员能够将所学知识应用于实际课程中。 热门技术栈 ：使用业界流行的工具和技术（如Python、Azure AI、OpenAI），紧跟技术前沿。 企业应用案例 ：学习和实践澳洲企业中实际应用AI技术的案例，提升职业竞争力。 AI内容介绍 AI文字语音转换翻译课程旨在通过开发一个功能全面的Web应用，帮助用户进行语音到文字、文字到语音及翻译的转换。该课程结合了AI技术与实际应用，帮助学员掌握AI技术在编程中的具体应用。将通过Azure AI和OpenAI的API，实现语音识别、文字生成和翻译功能，并通过React构建用户界面。 主要功能包括： 语音识别 ：将用户的语音输入转换为文本。 文本到语音 ：将文本转换为语音进行播放。 文本翻译 ：将文本翻译成多种语言。 AI生成 ：通过生成式AI技术，生成符合上下文的文本回答。 提升能力 通过完成AI文字语音转换翻译，学员将提升以下技能： AI技术应用 ： 学习如何使用Azure AI进行语音识别和文本转换。 掌握使用OpenAI进行文本生成和翻译。 职业发展能力 ： 通过项目实践，提升解决实际问题的能力。 积累项目开发经验，为职业发展打下坚实基础。 通过这些内容学习，学员不仅能掌握AI技术在语音识别、文本生成和翻译中的应用，还能通过实践提升综合开发能力，为进一步的职业发展和实际项目开发打下坚实基础。 全栈班+DevOps班流程图 整个过程分为五大阶段：Plan、Development、Build、Test、Release。 从全栈班到DevOps班学员共同配合完成这五个阶段内容，这一流程为开发团队提供了完整的解决方案，帮助学员全面掌握全栈开发DevOps的核心技能。我们独特的P3商业项目同时贯穿整个流程，全面提升学员的实战能力和竞争力！ Web 全栈班阶段 Web 全栈班分五个阶段：Web 基础技能提升，Web Application Delivery，Agile Team Project Delivery，Career Coaching Self-paced Learning面试准备与技能提升，简历内推库 阶段 1：Web 基本技能提升 熟练掌握 Web 开发三剑客 HTML 、 CSS 、 JavaScript 的企业级开发习惯和常用模块，并通过个人网站的开发夯实基础。项目本身也可以作为简历中的项目经历、或者求职过程中展示自己的一份作品。 Web 基础技能提升阶段，主要学习 HTML，CSS，JavaScript，Sass，Flexbox，Responsive Web Design，以及 Version Control -- Git 工具 第一阶段需要完成的项目- 商业级个人/公司Landing Page 阶段 2：Web App Delivery 学习三大前端框架之一的 React.js 以及相关工具，大幅提升你的前端开发能力以及小型网页应用项目的独立开发能力。该阶段需要完成一个常见 MongoDB 面试项目题&mdash;&mdash;Weather Application 的开发，完成后你就可以 handle 常见的面试项目题 第二阶段的学习内容围绕 React 展开，通过 ES6 (ECMAScript 2015)，提升 JavaScript 的使用，学习 Linter 规范代码格式，以及学习 SOLID，思维范式等等，提升工程师能力 第二阶段的项目需要完成 Weather App 的开发，从 2017 年沿用到现在，是重要的提升 Code Challenge 的项目 阶段 3：商业项目 Delivery 学习 后端框架 、 数据库 ， 基本的架构 、 云服务 等知识，并通过参与团队大项目，亲身体验互联网产品主流项目开发流程&mdash;&mdash;Agile 敏捷开发流程，获得职场中不可或缺的多角色团队配合能力。 到了第三阶段整体技术学习难度和广度都有提升 什么是 Web 全栈班 P3 项目 -- 项目实战 由 8-10 位 Full stack Developers，6-8 位 DevOps Enginners，1 位 Business Analyst 和 1 位 UI Designer 组队，共同完成一个商业级项目。项目通过团队协作，获得澳洲真实的开发工作流程。 Web 全栈班项目与其他匠人培训班（Bootcamp）高度搭配融合 Web 全栈班最著名的 P3 项目，不再仅仅是 Web 全栈班的单一项目，而是由 Web 全栈班为核心，与其他班级搭配形成一个完整的大团队，这个在其他任何培训机构从未出现过，P3 项目组会包含 8-10 个 Full-stack Developers 来自 Web 全栈班，1 位 Business Analyst 来自 BA 产品经理班，6-8 位 DevOps Engineers 来自 DevOps 项目班，以及 1 位 UI Designer 来自 UI 项目班。学生将会有 两次 做团队项目的权益，增加简历筹码。 &nbsp;第三个项目为匠人学院独创, 提供多个 Projects 选择, 每个班分成不同 Team, 通过 Agile, 花三个月时间, Deliver 一个完整的全栈项目, 最后项目结束会有 Presentation 以及来自现场导师的反馈。 多种不同级别的商业项目可以选。可以选择适合转行转专业的同学的 Level 1 级别的项目，Level 1 的项目除了可以自己做之外，还提供其他真实企业的项目经验，进入合作公司去做 Level 1。如果进入合作公司的 Level 1 的项目，需要经过面试，公司满意后，可以进入做项目。 P3 项目亮点 每个小组配有项目 Tutor 全程为组员项目答疑 产品经理协助项目管理，保障项目顺利落地 班主任督促检查每周项目进度 项目直接对接企业方 Employer 每个小组不同主题，组间 Battle 团队协作，模拟澳洲真实职场项目 写进简历提升 Offer 筹码 对外商业 Showcase 项目成果对外展示，与雇主面对面交流，增加项目商业化。通过参加 Showcase，招聘官可以直接了解学员的背景和优势，得到与各大行业领头公司 decision maker 的直接对话机会，大大提升求职成功率，更有可能现场获得 Offer 哦。 &nbsp; &nbsp; 阶段 4：IT Career Coaching Self-paced Learning 100+Career Coaching的视频资料可供大家Self-paced Learning，从职业规划，简历，面试，谈薪水等多方面提升。 阶段 5：简历内推库 &amp; 工作实习内推 让学员&ldquo;不仅仅是获得实习，更成为工作 Offer 收割机&rdquo; 简历内推库是一个特设的、专为我们的学员打造的数字化简历存储平台。在这里，每位学员的简历都经过专业导师的审核与优化，确保其准确、专业且符合行业标准。 匠人毕业学员的简历，有权优先录入简历内推库。依托匠人长久积累的的企业伙伴和毕业校友、导师的长久合作，这些简历会被优先推荐和匹配合适的岗位，有效缩短求职路径。 面向&ldquo;转码&rdquo;同学的帮助 从 Web 入门班晋升过来的同学，为了能够让转码的同学更友好的拿到 Offer。我们为转码的同学单独开设以下举措： 1. 提供适合转码同学的单独 Tutorial 进度，针对性答疑 2. 设立转码互助学习小组，转码同学互相取暖，互相帮助 3. 可以选择性参加转码补习小组，小班制，最多五人。 4. 多种不同难度级别的项目可供选择，不同级别项目也有对应的公司，提供难度较低的工作机会，扩充简历内容 &nbsp; Web全栈班如何保障&ldquo;IT&rdquo;专业学生获得Offer 没有经验缺乏工作？ 全栈班核心问题就是去解决，企业需要相关工作经验，但自己没有相关经验问题。 对于全栈班，提供了多种级别涉猎的项目可以做，不同的项目，同样对应，不同的利益相关者（公司、老师等），为学员提供更多的项目经验需求，来满足企业对工作经验的要求。 每年3次的内推会，可以近距离接触位置内推官，直接面向企业需求。 网络开发全栈班导师介绍 一线大厂老师，多年面试经验，辅导以及教学经验。多种不同，针对不同阶段教学 授课老师 课程导师 项目导师 项目带队导师 全班导师协议 &nbsp; 为什么选择Web开发全栈项目班？ 帮助数千名同学，找到了澳洲和中国的工作，获得了Offer。 阿富汗大学课程与企业需求的鸿沟(Gap) 超强导师团队 一线大厂老师授课，并同时有课程辅导导师+项目辅导导师，陪伴你的学习之路。 独创3+3+12模式 独创3+3+12模式，通过3个月课程+3个项目+12个月简历内推库，填写简历空白，求职有表格！ 面向职场的开发人员培训 锻炼只学习开发技术，还对接真实的互联网工作环境，带你熟悉开发团队中BA、UI设计师、DevOps等其他岗位的工作内容和涉及技术，帮助你未来更快的巴基斯坦工作团队。 指导 针对前面、工作室、全栈等不同开发岗位提供专业的求职辅导，资深导师教你如何写简历、写Linkedin、应对面试。 超越开发者团队合作 参与团队大型项目，与来自匠人学院其他培训项目的BA、UI设计师、DevOps组队完成商业级别的互联网项目开发，提前体验互联网项目开发团队配合。 學 Web全栈班會議員: 课程全程导师全程答疑 所有项目团队配备项目导师 1 年项目经验 期往及课程全程录音 三个项目经验丰富你的简历 模拟面试与HR面试 简历指导与简历修改 背景调查证明 匠人庞大工作内推网络 庞大的大师学员及导师资源 学员，大师导师直接优秀挖人 与匠人合作企业的内推及实习与全职工作机会 我们的学员工作 自Web全栈班开班以来，已有超过3000+同学成功就业，也有学生进入澳洲各大公司如德勤，Servian等知名公司工作。以下为往届学生的部分作品展示。 为什么Web全栈训练营受到大企业认可 项目技术面向企业人才需求 项目流程与公司工作流程一样 开发人员与 DevOps 一起工作与真实公司工作一致 3 个月项目经验 = 3 个月工作经验 进行项目魔鬼训练，修炼IT专业性符合公司需求 学员具有初步的系统设计能力 禅师权益大盘点，属于禅师学员的独特礼遇 概念界定 大师学员：凡报名过大师学员Web开发栈项目班的学员 新学员：报名Web开发全栈项目班后，第一次参与全栈课程期间，统称为新学员 学员：报名Web开发全栈项目班后，第一次参与的课程结课后，统称为老学员（这里主要指enroll老学员课程期间内） ⚠️以下权益仅限购买课程本人使用，禁止售卖和转让，一经发现封号处理 &nbsp;",
  "description_html": "<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">全栈班+DevOps班流程图</span></span></h2>\r\n<p><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">整个流程分为五个大阶段：计划、开发、构建、测试、发布。</span></span></strong><br /><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">从全栈班到DevOps班学员共同奋斗完成这五个阶段内容，这一流程为开发团队提供了完整的解决方案，帮助学员全面掌握全栈开发DevOps的核心技能。我们独有的P3商业项目同时贯穿了整个栈，全面提升了实战能力流程和对抗！</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/59f183cc705f6dda67dfe8753adc3d90.jpg\" alt=\"\" /></p>\r\n<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">澳洲的IT工作环境如何？</span></span></h2>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">在澳洲做会计师是怎样的一种体验？没有996，没有35岁，不歧视女性，不内卷，工作和生活平衡等等。</span></span></p>\r\n<ol>\r\n<li><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">工作生活平衡</span></span></strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">：澳大利亚职场文化强调合理的工作时间和灵活的工作安排，支持工作与生活的平衡。</span></span></li>\r\n<li><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">信念和约束性</span></span></strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">：澳洲致力于营造一个多元和约束性的工作环境，不严格年龄限制，同时积极推动性别平等。</span></span></li>\r\n<li><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">职业发展机会</span></span></strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">：IT行业的快速发展带来了广泛的职业机会，公司通常提供培训和发展课程以支持员工技能提升。</span></span></li>\r\n<li><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">有相对的薪酬和福利</span></span></strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">：IT专业人士可以享受到具有相对价格和全面的福利套餐。</span></span></li>\r\n<li><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">优质的工作和生活环境</span></span></strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">：现代化的办公设施和优美的自然环境，使得工作和生活质量都相当重要。</span></span></li>\r\n</ol>\r\n<h2><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/75b3f5ba80b9cc9103d38f831dd035fa.png\" alt=\"\" /></span></h2>\r\n<h2><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">澳洲IT行业翟先生</span></span></span><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">？</span></span></h2>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">在澳大利亚，IT行业的薪资水平因地区、公司规模和职位的不同而存在显着差异。根据2023年的数据，澳大利亚各州的平均薪资之间也有所不同，新南威尔士州平均薪资最高，达到约80,000澳元，而塔斯马尼亚州的薪资最低，约65,000澳元。此外，随着技能的持续，几乎九成的雇主都面临人才难题，这导致许多雇主提高薪资以奖励和留住员工。</span></span></p>\r\n<h2><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/a610d089ddf6414e40c394e4276e3fa1.png\" alt=\"\" /></span></h2>\r\n<h2><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">全栈开发者职业发展</span></span></span></h2>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">下图展示了全栈工程师在IT公司的职位和不同的工作职位</span></span></p>\r\n<p><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/97565f306454d14d387fa5b78e08ebda.jpg\" alt=\"不同岗位在IT公司的位置\" /></span></p>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">从需求部署的各个阶段中涉及不同的角色和技术，对IT开发流程有以下关键项目参与者和参与者：</span></span></p>\r\n<ol>\r\n<li><strong>Stakeholder</strong>: 明确项目的需求和目标。</li>\r\n<li><strong>Business Analyst</strong>: 分析业务需求，确定项目范围。</li>\r\n<li><strong>Product Owner </strong>: 确保产品符合业务需求和用户需求。</li>\r\n<li><strong>UI Designer </strong>: 设计产品的用户界面，提高用户体验。</li>\r\n<li><strong>QA &amp; Tester </strong>: 负责软件的质量控制和bug测试。</li>\r\n<li><strong>Full-stack Developer</strong>: 负责开发和项目落地。</li>\r\n<li><strong>DevOps &amp; SRE &amp; Cloud Engineer</strong>: 优化项目的开发运营流程，管理云基础设施。</li>\r\n<li><strong>Data Engineer </strong>: 处理和管理数据流，设计数据存储解决方案。</li>\r\n<li><strong>Data Analyst</strong>: 分析数据，提供决策支持。</li>\r\n<li><strong>Data Warehouse/Lake/Tools </strong>: 管理和分析大量数据。</li>\r\n<li><strong>UAT, Staging, Production (用户验收测试、预生产、生产环境)</strong>: 分阶段部署和测试软件，确保产品质量。</li>\r\n</ol>\r\n<p>针对 <strong>Agile (敏捷)</strong> 方法论的应用，这是一种迭代和以人为核心的开发流程，可以快速响应项目需求的变化，增强团队协作和项目透明度。整个图示反映了现代软件开发中多学科团队的协作和技术的综合应用，突出了全栈开发者在整个开发周期内的关键作用，以及他们如何与其他专业领域的专家一起工作，共同推进项目的成功。</p>\r\n<h3>Developer职业成长</h3>\r\n<p>Web全栈班是为了帮助IT/CS毕业生，以及想转行做IT，成长成为一位合格 (Qualified) 的Full-stack Developer/ Front-end Developer/Back-end Developer/ Software Engineer，在澳洲和中国找到一份全职工作。</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/kxs3w0fwztwp1sqrizfr.jpg\" alt=\"全栈-18\" /></p>\r\n<h2>如何在澳洲找到第一份工作?</h2>\r\n<p><iframe title=\"YouTube video player\" src=\"https://www.youtube.com/embed/ygSWqUDPPWc?si=owWmvvWUsLO0SgyW\" width=\"100%\" height=\"350\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"></iframe></p>\r\n<h2>什么是Web开发全栈项目班?</h2>\r\n<p>2017年，<strong>匠人学院</strong>在澳洲<strong>首次独创</strong>Web全栈班模式，<strong>完全自主研发</strong>课程，课件，内容，以及<strong>关联项目</strong>和<strong>澳洲本地合作公司</strong>，每一期都不断地询问学员意见进行修改和升级，<strong>Web全栈班</strong>会根据一线老师，以及公司需求变化而变化。匠人也跟Deloitte, Servian等公司合作，定向向公司提供优秀学员。</p>\r\n<p>Web全栈班根据澳洲<strong>Job Market</strong>的需求变化而变化，完全面向企业需求进行课程设置。Web全栈班已经培养了<strong>4000</strong>多位学员，帮助<strong>4000</strong>多位学员在澳洲、中国、美国就业。</p>\r\n<p>&rdquo;帮助大家能更好地在本地就业&ldquo; --- 这也是匠人学院始终如一的目标。</p>\r\n<p><strong>精彩的Web全栈学习之旅- 掌握从前端开发到后端、云端部署及CI/CD的全方位技能</strong></p>\r\n<p>从基础到精通，我们的课程覆盖了<strong>JavaScript</strong>，<strong>HTML5</strong>，<strong>CSS3</strong>，<strong>ES6</strong>，程序员必备版本控制能力<strong>Git</strong>，澳洲市场占有率最高的前端框架<strong>React.js</strong>、以及三大高需求后端技术：<strong>Node.js</strong>、<strong>Java</strong>、<strong>.NET</strong>，还有<strong>Amazon Web Service(AWS)</strong>，<strong>OpenAI</strong>等企业需求的技术。</p>\r\n<p>不仅仅是基础开发工作，更多会涉及到云端架构，<strong>Serverless</strong>，<strong>Microservice</strong>等架构，经历目前企业需要的必备<strong>CI/CD</strong>部署经验等。从<strong>开发</strong>到<strong>部署</strong>，全链路学习。</p>\r\n<p>通过实战项目，您不仅能掌握编程知识，还会获得实际开发经验。我们提供2个个人项目和1个商业项目，让您能在真实场景中应用所学，准备好步入职场。同时，我们的职业辅导和简历内推服务，将助您顺利找到理想的工作。</p>\r\n<h3><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/9bd7bb6330cee5fee3a1456f1d538cc4.png\" alt=\"\" /></h3>\r\n<h3>Offer收割机</h3>\r\n<p><strong>已经帮助4000多位学生就业。</strong>Web全栈班的团队大项目+简历内推，让学生通过Web全栈班就能拿到至少2个优质的工作经验。整个的Agile工作模式体系，跟中等规模的公司相似。拿到工作经验=拿到Offer，可以拿到相当于6个月的工作经验，不愁在澳洲找不到工作。每期全栈班都是全新的团队项目，每个团队都是不同的项目，每个团队有项目Tutor带领。让上课学到的知识也可以直接实践利用，并且很多更难的技术也可以在项目学习和应用。</p>\r\n<h3>Web全栈班课程安排（Timeline）</h3>\r\n<p>Web全栈班6.0 开始，有14周的教课内容。整个Bootcamp持续24周</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/0df8f2b1683abea2101163441405454a.png\" alt=\"\" /></p>\r\n<h3>Web 全栈班课程大纲 6.0</h3>\r\n<p>新的 Web 全栈班课程大纲，新增Nextjs、AWS、Lambda和AI App课程内容。</p>\r\n<h2>Web全栈班核心解决的问题</h2>\r\n<h3>团队合作能力欠缺，缺乏团队合作意识</h3>\r\n<p>刚毕业或在校学生的团队合作能力普遍比较欠缺，不知道如何跟团队里其他的Developer沟通和合作，缺乏团队合作的经验和意识。遇到代码问题常常不知道如何解决，也找不到有效的沟通方式和解决办法，通常都是一个人蒙头写代码，但结果却不尽人意，既浪费了时间也还影响了团队的工作效率。</p>\r\n<h3>缺乏工程化思维</h3>\r\n<p>工程思维是指在解决问题和设计解决方案时，能够综合考虑项目的全局性、系统性和实用性，以及可持续发展和风险管理等方面的思考模式。在软件开发领域，这意味着开发人员不仅需要关注代码的编写，还需要从更广阔的视角考虑软件的设计、架构、用户体验、性能、安全、维护和可扩展性等各个方面。</p>\r\n<p>简单来说，就是在开发的过程中需要把复杂问题简单化，知道妥协、知道循序渐进。不仅要考虑代码的质量问题，还要考虑业务需求、项目工期、开发成本等各种因素之间的相互影响。</p>\r\n<h3>学校所学技能不符合澳洲公司主流技术栈要求</h3>\r\n<p>许多学员在学习学习的技术多为基础理论，缺乏实际项目的练习和实践。而且学校目前教授的HTML，CSS等课程都是开发中较为基础的技术栈，与澳洲企业要求的主流技术栈存在明显的gap，学生毕业后无法直接达到企业招聘的要求和满足实际需求。</p>\r\n<h3>代码质量达不到澳洲IT公司标准</h3>\r\n<p>在学校学习或自学编程的过程中常常缺乏code review 环节，难以达到商业级工程代码质量。我们的课程中会提供专业导师点评，帮助学员快速提升。学习并实践符合澳洲企业编制的代码规范，提高代码质量，以达到澳洲公司要求。</p>\r\n<h3>缺乏云端项目经验</h3>\r\n<p>学校的作业或个人项目缺乏云端部署的经验，匠人提供Production Grade的云端项目实战经验，帮助学员熟悉从开发到部署的完整流程。</p>\r\n<h3>简历总是石沉大海，缺乏竞争力</h3>\r\n<p>澳洲留学生找工作难的原因之一就是简历不过关或简历缺乏竞争力，投递的简历总是石沉大海。匠人Web全栈班能够帮助学员补充商业级项目经验、实习经验，提升简历含金量，让HR更愿意给出面试机会。</p>\r\n<h3>缺少工作机会和职业资源支持</h3>\r\n<p>澳洲的留学生或毕业生求职往往都是孤军奋战，只能仅通过常规的招聘网站来找工作，缺少工作机会和职业资源支持。但匠人的学员能够借助匠人学院庞大的校友网络，获得工作内推机会。也可以通过建立Networking扩大自己的人脉资源，从前辈和行业大神那里收获行业资讯和经验分享。匠人可以为学员求职提供强有力的支持。</p>\r\n<p><!-- notionvc: 0f5c3e76-3ea1-4640-b128-2ece3e256ce5 --></p>\r\n<h2>Web 全栈班学习内容</h2>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/dd262d9a118b0701cbe687b5f6e8784a.png\" alt=\"\" /></p>\r\n<h3><strong>多元化职业道路，一次报名，三重选择</strong></h3>\r\n<p>选择我们的课程，您将开启<strong>Node.js</strong>、<strong>.Net</strong>、<strong>Java</strong>三大热门后端技术的学习之旅。我们的资源共享机制，跨课程、跨城市的学习环境，助您拓宽职业视野，增加获取理想工作Offer的可能性。无论您在澳洲还是中国，这门课程都将为您的Web开发和编程事业铺设坚实的基石。通过实战项目经验积累，提升您在职场的竞争力，我们的课程适合想在商业项目中增加实战经验的您。<!-- notionvc: e266205e-3c72-43af-a015-1f5b23a01d25 --></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/fa131d187b155401baa5e820fe0dc7a1.png\" alt=\"\" /></p>\r\n<p>&nbsp;</p>\r\n<h3><strong>前端培训: 企业级前端技术精讲</strong></h3>\r\n<p>深入解析前端技术的企业应用，如<strong>React</strong>、<strong>Redux Saga</strong>、<strong>ES6</strong>等，帮助学员紧跟行业最新需求，编写出高质量的代码。课程内容随市场需求定期更新，确保学员学到最实用、最前沿的技能。<!-- notionvc: aed69b5d-2051-4829-9707-cc34d83bbafa --></p>\r\n<h4><strong>Web 培训: Web 标准化与响应式设计</strong></h4>\r\n<p>系统讲解<strong>HTML5</strong>、<strong>CSS3</strong>、<strong>Sass</strong>等前端基础，重点训练标准化编程和响应式网页设计，让学员能编写出符合行业标准的Web项目。<!-- notionvc: ea9e017c-f35d-4970-9cb8-418aaa9ab7c4 --></p>\r\n<h4><strong>React 培训: 系统掌握 React 开发</strong></h4>\r\n<p>摆脱自学困境，通过项目实战和企业案例，深入学习<strong>React</strong>的语法、结构和组件设计，帮助学员理解企业级代码质量要求，提升React开发能力。<!-- notionvc: 93bb8652-e6c7-4f8d-b655-f6958d910605 --></p>\r\n<h3><strong>后端培训: 可选三语言后端开发精英培养</strong></h3>\r\n<p>澳洲唯一涵盖<strong>Nodejs，</strong><strong>.NET</strong>, <strong>Java</strong>的三语言后端培训，深入讲解后端架构、微服务、<strong>RESTful API</strong>等核心知识，拓宽学员的职业发展路径。<!-- notionvc: 8afbaa0c-44de-40f4-ac9f-70e84c11165b --></p>\r\n<h4><strong>Node.js 方向&nbsp;</strong></h4>\r\n<p>Node.js采用<strong><span class=\"notion-enable-hover\" data-token-index=\"1\">线上直播课</span></strong>的模式学习。在Node.js方向的学习中，你将深入了解Node.js的核心原理、模块系统以及事件驱动模型。我们将从基础开始，带你逐步掌握<strong>Node.js</strong>的基本语法、<strong>API</strong>调用以及<strong>Express.js</strong>等常用框架的使用。<!-- notionvc: 7575bc98-45aa-432b-be6f-59c141c836a5 --></p>\r\n<p><strong>.NET 方向</strong></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/904fd3981f8922fde4a2c2d973b1477a.png\" alt=\"\" /></p>\r\n<p>.NET方向采用<strong><span class=\"notion-enable-hover\" data-token-index=\"1\">线下</span></strong>教学的模式，悉尼、墨尔本、布里斯班三个城市开班。在.NET方向的学习中，你将领略到.NET框架的强大功能与灵活性。我们将从<strong>.NET</strong>框架的基础知识讲起，涵盖<strong>C#语言基础</strong>、<strong>ASP.NET Web开发</strong>、<strong>WCF服务开发</strong>等多个方面。通过学习，你将掌握如何使用.NET框架构建高效、安全的Web应用程序，提升你的开发能力和项目实战水平。<!-- notionvc: 2c47e38f-3654-4132-a4d2-3da8c8671f74 --></p>\r\n<p><strong>Java 方向</strong></p>\r\n<p>Java方向采用<strong><span class=\"notion-enable-hover\" data-token-index=\"1\">Self-Paced Learning</span></strong>的学习模式。在Java方向的学习中，你将体验到Java作为企业级开发语言的魅力。我们将从Java语言基础入手，讲解面向对象编程思想、JVM原理、常用设计模式等核心知识，还会学习Spring Boot。<!-- notionvc: ab384cb5-6440-4ca4-822c-30459e6d7fbc --></p>\r\n<p><strong>AI方向内容介绍&nbsp; &nbsp;Speech sample app&nbsp;<br /></strong></p>\r\n<p><strong><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/b6dfcbc739d5136930ef137b68de0784.jpeg\" alt=\"\" /></strong></p>\r\n<h3>功能亮点</h3>\r\n<ol>\r\n<li><strong>全面的AI应用</strong>：AI课程涵盖语音识别、文本转换、翻译及生成式AI应用，全面提升学员的AI技术能力。</li>\r\n<li><strong>实用工具开发</strong>：通过开发实际应用（如语音转文字、文本翻译），学员能够将所学知识应用于实际课程中。</li>\r\n<li><strong>热门技术栈</strong>：使用业界流行的工具和技术（如Python、Azure AI、OpenAI），紧跟技术前沿。</li>\r\n<li><strong>企业应用案例</strong>：学习和实践澳洲企业中实际应用AI技术的案例，提升职业竞争力。</li>\r\n</ol>\r\n<h3>AI内容介绍</h3>\r\n<p>AI文字语音转换翻译课程旨在通过开发一个功能全面的Web应用，帮助用户进行语音到文字、文字到语音及翻译的转换。该课程结合了AI技术与实际应用，帮助学员掌握AI技术在编程中的具体应用。将通过Azure AI和OpenAI的API，实现语音识别、文字生成和翻译功能，并通过React构建用户界面。</p>\r\n<p><strong>主要功能包括：</strong></p>\r\n<ul>\r\n<li><strong>语音识别</strong>：将用户的语音输入转换为文本。</li>\r\n<li><strong>文本到语音</strong>：将文本转换为语音进行播放。</li>\r\n<li><strong>文本翻译</strong>：将文本翻译成多种语言。</li>\r\n<li><strong>AI生成</strong>：通过生成式AI技术，生成符合上下文的文本回答。</li>\r\n</ul>\r\n<h3>提升能力</h3>\r\n<p>通过完成AI文字语音转换翻译，学员将提升以下技能：</p>\r\n<ol>\r\n<li><strong>AI技术应用</strong>：\r\n<ul>\r\n<li>学习如何使用Azure AI进行语音识别和文本转换。</li>\r\n<li>掌握使用OpenAI进行文本生成和翻译。</li>\r\n</ul>\r\n</li>\r\n<li><strong>职业发展能力</strong>：\r\n<ul>\r\n<li>通过项目实践，提升解决实际问题的能力。</li>\r\n<li>积累项目开发经验，为职业发展打下坚实基础。</li>\r\n</ul>\r\n</li>\r\n</ol>\r\n<ul>\r\n<li>通过这些内容学习，学员不仅能掌握AI技术在语音识别、文本生成和翻译中的应用，还能通过实践提升综合开发能力，为进一步的职业发展和实际项目开发打下坚实基础。</li>\r\n</ul>\r\n<h2>全栈班+DevOps班流程图</h2>\r\n<p><strong>整个过程分为五大阶段：Plan、Development、Build、Test、Release。</strong><br />从全栈班到DevOps班学员共同配合完成这五个阶段内容，这一流程为开发团队提供了完整的解决方案，帮助学员全面掌握全栈开发DevOps的核心技能。我们独特的P3商业项目同时贯穿整个流程，全面提升学员的实战能力和竞争力！</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/fe0ddadb054f5206f10b8e7f1f616433.png\" alt=\"\" /></p>\r\n<h2>Web 全栈班阶段</h2>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/c2f118e055f3e29db754a6f928cbcb45.jpg\" alt=\"\" /></p>\r\n<p>Web 全栈班分五个阶段：Web 基础技能提升，Web Application Delivery，Agile Team Project Delivery，Career Coaching Self-paced Learning面试准备与技能提升，简历内推库</p>\r\n<h3>阶段 1：Web 基本技能提升</h3>\r\n<p>熟练掌握 Web 开发三剑客 <strong>HTML</strong>、<strong>CSS</strong>、<strong>JavaScript</strong> 的企业级开发习惯和常用模块，并通过个人网站的开发夯实基础。项目本身也可以作为简历中的项目经历、或者求职过程中展示自己的一份作品。</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/jwlsxfxl8almwpto679h.jpg\" alt=\"全栈-11\" /></p>\r\n<p>Web 基础技能提升阶段，主要学习 HTML，CSS，JavaScript，Sass，Flexbox，Responsive Web Design，以及 Version Control -- Git 工具</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/3b41e033902e2db3de9e22eff4f5a0e6.png\" alt=\"Web 基础技能提升\" /></p>\r\n<p>第一阶段需要完成的项目- 商业级个人/公司Landing Page</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/c5402809d6116b58fc5de53ccc7d5c72.png\" alt=\"\" /></p>\r\n<h3>阶段 2：Web App Delivery</h3>\r\n<p>学习三大前端框架之一的 React.js 以及相关工具，大幅提升你的前端开发能力以及小型网页应用项目的独立开发能力。该阶段需要完成一个常见 MongoDB 面试项目题&mdash;&mdash;Weather Application 的开发，完成后你就可以 handle 常见的面试项目题</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/0171b78f1dbec5d4cb534c21a3b8dbfe.png\" alt=\"\" /></p>\r\n<p>第二阶段的学习内容围绕 React 展开，通过<strong> ES6</strong>(ECMAScript 2015)，提升 JavaScript 的使用，学习 <strong>Linter</strong>规范代码格式，以及学习 SOLID，思维范式等等，提升工程师能力</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/030e0c7bc376e7d3e6636ced90d6e4bf.png\" alt=\"Web全班第二阶段\" /></p>\r\n<p>第二阶段的项目需要完成 Weather App 的开发，从 2017 年沿用到现在，是重要的提升 Code Challenge 的项目</p>\r\n<h3>阶段 3：商业项目 Delivery</h3>\r\n<p>学习<strong>后端框架</strong>、<strong>数据库</strong>，<strong>基本的架构</strong>、<strong>云服务</strong>等知识，并通过参与团队大项目，亲身体验互联网产品主流项目开发流程&mdash;&mdash;Agile 敏捷开发流程，获得职场中不可或缺的多角色团队配合能力。</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/lo4x09yskvreamic6y33.jpg\" alt=\"全栈-13\" /></p>\r\n<p>到了第三阶段整体技术学习难度和广度都有提升</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/329259d2df8cdbfcd806353b90f6f844.png\" alt=\"web全栈板\" /></p>\r\n<h3>什么是 Web 全栈班 P3 项目 -- 项目实战</h3>\r\n<p>由 8-10 位 Full stack Developers，6-8 位 DevOps Enginners，1 位 Business Analyst 和 1 位 UI Designer 组队，共同完成一个商业级项目。项目通过团队协作，获得澳洲真实的开发工作流程。</p>\r\n<p><strong>Web 全栈班项目与其他匠人培训班（Bootcamp）高度搭配融合</strong></p>\r\n<p>Web 全栈班最著名的 P3 项目，不再仅仅是 Web 全栈班的单一项目，而是由 Web 全栈班为核心，与其他班级搭配形成一个完整的大团队，这个在其他任何培训机构从未出现过，P3 项目组会包含 8-10 个 Full-stack Developers 来自 Web 全栈班，1 位 Business Analyst 来自 BA 产品经理班，6-8 位 DevOps Engineers 来自 DevOps 项目班，以及 1 位 UI Designer 来自 UI 项目班。学生将会有<strong>两次</strong>做团队项目的权益，增加简历筹码。</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/gg1ivlga1vdlkgk4cphd.jpg\" alt=\"全栈-14\" /></p>\r\n<p>&nbsp;第三个项目为匠人学院独创, 提供多个 Projects 选择, 每个班分成不同 Team, 通过 Agile, 花三个月时间, Deliver 一个完整的全栈项目, 最后项目结束会有 Presentation 以及来自现场导师的反馈。</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/cvvsy5fihier14fi7eu0.jpg\" alt=\"参与Web全栈班团队项目流程\" /></p>\r\n<p>多种不同级别的商业项目可以选。可以选择适合转行转专业的同学的 Level 1 级别的项目，Level 1 的项目除了可以自己做之外，还提供其他真实企业的项目经验，进入合作公司去做 Level 1。如果进入合作公司的 Level 1 的项目，需要经过面试，公司满意后，可以进入做项目。</p>\r\n<h3>P3 项目亮点</h3>\r\n<ul>\r\n<li>\r\n<p>每个小组配有项目 Tutor 全程为组员项目答疑</p>\r\n</li>\r\n<li>\r\n<p>产品经理协助项目管理，保障项目顺利落地</p>\r\n</li>\r\n<li>\r\n<p>班主任督促检查每周项目进度</p>\r\n</li>\r\n<li>\r\n<p>项目直接对接企业方 Employer</p>\r\n</li>\r\n<li>\r\n<p>每个小组不同主题，组间 Battle</p>\r\n</li>\r\n<li>\r\n<p>团队协作，模拟澳洲真实职场项目</p>\r\n</li>\r\n<li>\r\n<p>写进简历提升 Offer 筹码</p>\r\n</li>\r\n</ul>\r\n<h3>对外商业 Showcase</h3>\r\n<p>项目成果对外展示，与雇主面对面交流，增加项目商业化。通过参加 Showcase，招聘官可以直接了解学员的背景和优势，得到与各大行业领头公司 decision maker 的直接对话机会，大大提升求职成功率，更有可能现场获得 Offer 哦。</p>\r\n<div>&nbsp;</div>\r\n<div><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/mrmdsngofbroyc7tnjoq.jpg\" alt=\"JR学院展示\" /></div>\r\n<div>&nbsp;</div>\r\n<div>\r\n<h3>阶段 4：IT Career Coaching Self-paced Learning</h3>\r\n<p><span class=\"OYPEnA text-decoration-none text-strikethrough-none\">100+Career Coaching的视频资料可供大家Self-paced Learning，从职业规划，简历，面试，谈薪水等多方面提升。</span></p>\r\n</div>\r\n<div>\r\n<h3>阶段 5：简历内推库 &amp; 工作实习内推</h3>\r\n<p><span class=\"OYPEnA text-decoration-none text-strikethrough-none\">让学员&ldquo;不仅仅是获得实习，更成为工作 Offer 收割机&rdquo;</span></p>\r\n<p><span class=\"OYPEnA text-decoration-none text-strikethrough-none\">简历内推库是一个特设的、专为我们的学员打造的数字化简历存储平台。在这里，每位学员的简历都经过专业导师的审核与优化，确保其准确、专业且符合行业标准。</span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/402619ab7f5f89f6d9ad5c4817d7da7d.png\" alt=\"\" /></p>\r\n<p><span class=\"OYPEnA text-decoration-none text-strikethrough-none\">匠人毕业学员的简历，有权优先录入简历内推库。依托匠人长久积累的的企业伙伴和毕业校友、导师的长久合作，这些简历会被优先推荐和匹配合适的岗位，有效缩短求职路径。</span></p>\r\n<p><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/9e1fde4d0760587d58403485d32c8e2d.png\" alt=\"简历内推库\" /></span></p>\r\n</div>\r\n<div>\r\n<h2>面向&ldquo;转码&rdquo;同学的帮助</h2>\r\n<p>从 Web 入门班晋升过来的同学，为了能够让转码的同学更友好的拿到 Offer。我们为转码的同学单独开设以下举措：</p>\r\n<p>1. 提供适合转码同学的单独 Tutorial 进度，针对性答疑</p>\r\n<p>2. 设立转码互助学习小组，转码同学互相取暖，互相帮助</p>\r\n<p>3. 可以选择性参加转码补习小组，小班制，最多五人。</p>\r\n<p>4. 多种不同难度级别的项目可供选择，不同级别项目也有对应的公司，提供难度较低的工作机会，扩充简历内容</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/gyas0bnkgvrp4eoiowox.png\" alt=\"澳洲转运\" /></p>\r\n<p>&nbsp;</p>\r\n<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Web全栈班如何保障&ldquo;IT&rdquo;专业学生获得Offer</span></span></h2>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">没有经验缺乏工作？</span></span></h3>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">全栈班核心问题就是去解决，企业需要相关工作经验，但自己没有相关经验问题。</span></span></p>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">对于全栈班，提供了多种级别涉猎的项目可以做，不同的项目，同样对应，不同的利益相关者（公司、老师等），为学员提供更多的项目经验需求，来满足企业对工作经验的要求。</span></span></p>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">每年3次的内推会，可以近距离接触位置内推官，直接面向企业需求。</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/126cb5d61bd8e3cf6ef34b80a78fcdac.png\" alt=\"\" /></p>\r\n</div>\r\n<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">网络开发全栈班导师介绍</span></span></h2>\r\n<p class=\"cvGsUA direction-ltr align-start para-style-body\"><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">一线大厂老师，多年面试经验，辅导以及教学经验。多种不同，针对不同阶段教学</span></span></span></p>\r\n<ul>\r\n<li><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">授课老师</span></span></span></li>\r\n<li><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">课程导师</span></span></span></li>\r\n<li><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">项目导师</span></span></span></li>\r\n<li><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">项目带队导师</span></span></span></li>\r\n</ul>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/a892412028ec6f2b1090ebd059449544.png\" alt=\"Web全板导师介绍\" /></p>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">全班导师协议</span></span></p>\r\n<div>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/171924af0137d398edb088b463c1167d.png\" alt=\"网站全班老师\" /></p>\r\n</div>\r\n<div><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/c160188985a05986e98f9059f76db3c6.png\" alt=\"\" width=\"701\" height=\"935\" /></div>\r\n<div><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/8fcbf9d358d34e90820812bae2bf1e08.png\" alt=\"\" />&nbsp;<img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/701d02d9bb1da68355882ac80b061047.png\" alt=\"网站全班老师\" /> <img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/3af2addd1829944c27b2fca468c6205f.png\" alt=\"网站全班老师\" width=\"701\" height=\"517\" /></div>\r\n<h2><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/03307d8132964f247270bd0912487e8f.png\" alt=\"\" width=\"701\" height=\"935\" /></h2>\r\n<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">为什么选择Web开发全栈项目班？</span></span></h2>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">帮助数千名同学，找到了澳洲和中国的工作，获得了Offer。</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/zpgbcau9rdgdrz2kzhqo.jpg\" alt=\"全栈-03\" /></p>\r\n<p><iframe title=\"YouTube video player\" src=\"https://www.youtube.com/embed/aMPidfRnvhk\" width=\"100%\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\" data-mce-fragment=\"1\"></iframe></p>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">阿富汗大学课程与企业需求的鸿沟(Gap)</span></span></p>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">超强导师团队</span></span></h3>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">一线大厂老师授课，并同时有课程辅导导师+项目辅导导师，陪伴你的学习之路。</span></span></p>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">独创3+3+12模式</span></span></h3>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">独创3+3+12模式，通过3个月课程+3个项目+12个月简历内推库，填写简历空白，求职有表格！</span></span></p>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">面向职场的开发人员培训</span></span></h3>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">锻炼只学习开发技术，还对接真实的互联网工作环境，带你熟悉开发团队中BA、UI设计师、DevOps等其他岗位的工作内容和涉及技术，帮助你未来更快的巴基斯坦工作团队。</span></span></p>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">指导</span></span></h3>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">针对前面、工作室、全栈等不同开发岗位提供专业的求职辅导，资深导师教你如何写简历、写Linkedin、应对面试。</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/d45d5a37cda7568343f35a5f391d1a27.png\" alt=\"\" /></p>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">超越开发者团队合作</span></span></h3>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">参与团队大型项目，与来自匠人学院其他培训项目的BA、UI设计师、DevOps组队完成商业级别的互联网项目开发，提前体验互联网项目开发团队配合。</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/dxlm9taswsjxjmv67ljx.jpg\" alt=\"全栈-10\" /></p>\r\n<h3><strong><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">學 Web全栈班會議員:</span></span></strong></h3>\r\n<ul>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">课程全程导师全程答疑</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">所有项目团队配备项目导师</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">1 年项目经验</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">期往及课程全程录音</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">三个项目经验丰富你的简历</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">模拟面试与HR面试</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">简历指导与简历修改</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">背景调查证明</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">匠人庞大工作内推网络</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">庞大的大师学员及导师资源</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">学员，大师导师直接优秀挖人</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">与匠人合作企业的内推及实习与全职工作机会</span></span></li>\r\n</ul>\r\n<h2><span class=\"OYPEnA text-decoration-none text-strikethrough-none\"><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">我们的学员工作</span></span></span></h2>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">自Web全栈班开班以来，已有超过3000+同学成功就业，也有学生进入澳洲各大公司如德勤，Servian等知名公司工作。以下为往届学生的部分作品展示。</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/c2df29397e34ec0f6d554841600eb6d0.png\" alt=\"我们的学生在\" /></p>\r\n<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">为什么Web全栈训练营受到大企业认可</span></span></h2>\r\n<ul>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">项目技术面向企业人才需求</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">项目流程与公司工作流程一样</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">开发人员与 DevOps 一起工作与真实公司工作一致</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">3 个月项目经验 = 3 个月工作经验</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">进行项目魔鬼训练，修炼IT专业性符合公司需求</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">学员具有初步的系统设计能力</span></span></li>\r\n</ul>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/training/editor/fe0nh3jqoijgmzjrv23k.jpg\" alt=\"\" /></p>\r\n<p><!-- notionvc: 01b51b53-c5e8-4c39-875c-bf23b502169c --></p>\r\n<h2><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">禅师权益大盘点，属于禅师学员的独特礼遇</span></span></h2>\r\n<h3><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">概念界定</span></span></h3>\r\n<ul>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">大师学员：凡报名过大师学员Web开发栈项目班的学员</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">新学员：报名Web开发全栈项目班后，第一次参与全栈课程期间，统称为新学员</span></span></li>\r\n<li><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">学员：报名Web开发全栈项目班后，第一次参与的课程结课后，统称为老学员（这里主要指enroll老学员课程期间内）</span></span></li>\r\n</ul>\r\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">⚠️以下权益仅限购买课程本人使用，禁止售卖和转让，一经发现封号处理</span></span></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/d41eb3adab8598d284bcca15b032b2c3.png\" alt=\"\" /></p>\r\n<p>&nbsp;</p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/3c3ea2cfa408d621d5e475d2f59b06f1.png\" alt=\"\" /></p>\r\n<p><img src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/editor/88f4df1a502ead09eadd40356bb81960.png\" alt=\"\" /></p>",
  "title": "AI Engineer全栈项目班",
  "courseObjective": "学习RAG，React.js，Node.js，.Net Core，Spring Boot，Redux，AWS，Agile项目实践，获得2个个人项目经验和1个商业项目经验+80多节Career Coaching Self-paced Learning课程+12月简历内推",
  "suitable": "IT、CS 专业在校生和毕业生\r\nIS毕业生\r\n国内有IT工作经验, 无本地工作经验的新移民\r\nJob Changer",
  "cardDescription": "",
  "promoDescription": "",
  "timeLength": "共16周",
  "prerequisiteknowledge": "HTML CSS JS Programming Git",
  "highlights": [
    "Junior AI Engineer 入门首选：从全栈基础到 AI 产品集成，系统掌握 RAG、OpenAI API 等核心技能，独立交付能上线的 AI 应用",
    "扎实的全栈工程基础：涵盖前端 React、后端 Node.js 及多方向后端技术，为 AI 产品落地提供坚实的工程支撑",
    "Agile 敏捷开发流程：快速提升学员项目交付能力，契合 AI 商业场景的快节奏开发要求",
    "行业大咖指导：FLAG 及澳洲大厂资深专家授课，传授 AI 工程实战经验与商业落地方法论",
    "实战项目驱动：打造 3 个项目，包含完整的 AI 商业项目，积累能写进简历的高价值 AI Engineer 经验",
    "全真团队协作：学员融入完整开发团队，与 BA、DevOps、UI Designer 等不同角色协同，提升 AI 商业项目协作能力",
    "AI 实习强化：提供实习机会，让学员将 RAG、LLM 等 AI 技术真正用于企业真实业务，积累 AI 方向商业履历",
    "AI 职业规划：依据澳洲市场 AI Engineer 岗位趋势，为学员定制职业路径规划，助力迈向 AI 工程领域",
    "全程职业辅导：12 个月全程支持，针对 AI Engineer、AI 应用工程师等 AI 相关岗位精准辅导，助力高薪就业",
    "庞大校友网络：加入匠人校友群体，优先获取岗位内推机会，拓展行业人脉资源",
    "紧跟 AI 前沿：持续融入最新 AI 工程课程内容，以 RAG、Claude、OpenAI 等前沿技术为教学工具，确保课程内容与市场同步",
    "灵活学习模式：线上直播为主，多后端方向可选，平衡工作与学习节奏"
  ],
  "features": [
    "简历增加3段经验 || 课程配备3段项目经验，写到简历里，包括2个个人项目，1个Agile团队项目 || 超越Developers的团队合作，第三个项目会包含DevOps，UI Designer，Business Analyst 加入，团队配合，掌握面试要领 || 通过全栈班获得项目工作经验 ，超过你的同期大学毕业生，不做无澳洲本地经验的求职者",
    "一次费用，学双方向 || 只需要花1次费用，不仅仅可以终生学习AI Web全栈班，同时可以学习.Net+ Reactjs以及Nodejs + Reactjs两个方向 || 面向不同种类，不同级别的公司求职，获得更高就业筹码，更好的就业竞争力 || 两个方向代表后续不同的DevOps合作方向，以及两条线路不同的老师组合，从横向和纵向同时组合拳，让自己的就业能力大大提高",
    "超级知名度+合作公司实习机会 || AI Web全栈班受到900多个公司的招聘认可，帮助上千位学生拿到工作，有庞大的匠人学员工作网络 || 与许多本地华人公司，英语类公司，展开求职以及实习直聘服务，学员毕业直达公司要求，进入求职快车道。其中不乏 ASX 上市企业，HR 和 Hiring Manager 高度认可 || 3 个月课程+3 个月项目+2 个月 Career Coaching，帮助学生从毫无竞争力到极强的竞争力，能打，能做，加上 DevOps 和 BA 的加入，全面超越其他竞争对手"
  ],
  "faqs": [],
  "bootcampSections": [],
  "level": "中级",
  "type": "bootcamp",
  "totalLessons": 485,
  "totalSteps": 0,
  "liveClasses": 20,
  "estimatedHours": 853,
  "phases": [
    {
      "name": "AI Web全栈班26期.NET方向",
      "color": "#6366f1",
      "summary": "",
      "test": {
        "questions": 0,
        "passRate": 0,
        "unlocks": ""
      },
      "lessons": [
        {
          "code": "L01",
          "title": "课前须知",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>课前须知：</p>\n<p>欢迎来到Web全栈开发课程！为了帮助大家更好地投入学习并取得最佳效果，我们特别准备了以下课前须知，请仔细阅读：</p>\n<ol>\n<li><strong>预习材料</strong>：建议同学们提前自学W3Cschool中的HTML、CSS和JavaScript部分内容，多加练习可以帮助你更好地理解课堂内容。</li>\n<li><strong>课堂设备准备</strong>：为了提高学习效率，建议大家在上课时使用多个屏幕。你可以通过外接显示器或使用iPad来播放课程视频，同时在电脑端进行代码练习和做笔记，这样的方式将帮助你更好地掌握课程内容。</li>\n<li><strong>做笔记的重要性</strong>：良好的文档管理能力是成为专业人士的重要技能之一。上课时建议大家积极做笔记，可以在匠人课堂的线上平台完成笔记记录，也可以选择私下整理笔记。</li>\n<li><strong>Tutorial 环节</strong>：本课程设置了专门的Tutorial环节，旨在为大家解答学习中的疑惑。请充分利用这个时间段，解决你在学习中遇到的问题。</li>\n<li><strong>实践至上</strong>：学习IT技能的最佳方法就是多加实践。请勇敢迈出编写代码的第一步，只要不断练习和动手操作，你离成功就不远了。</li>\n<li><strong>积极提问</strong>：由于课程采用线上教学模式，老师不在身边，因此在遇到问题时，请务必通过分享屏幕或截屏的方式向老师提问，这样有助于老师更准确地理解你的问题并提供帮助。</li>\n</ol>\n<p>期待大家在这门课程中有所收获，并取得优异的成绩！如果有任何疑问，请随时提问，老师们会在第一时间为你解答。让我们一起努力，迈向成为全栈开发工程师的目标！</p>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c1a1"
        },
        {
          "code": "L02",
          "title": "课程准备",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>为确保同学们在全栈开发课程中获得最佳学习体验，请参考以下准备指南：</p>\n<ol>\n<li><strong>基础知识预习</strong>：建议您在正式课程开始前，访问 <a href=\"https://www.w3schools.com/\">W3Schools</a> 等在线资源，自学 HTML、CSS 和 JavaScript 等基础知识。多次复习这些基本概念将为您加入全栈班级打下坚实的基础。</li>\n<li><strong>课前准备</strong>：请务必查阅我们为您准备的 PPT，以便做好充分的课前准备。这将帮助您更好地理解即将学习的内容。</li>\n<li><strong>课程笔记和项目</strong>：\n<ul>\n<li>课程笔记可在此处查看： <a href=\"https://github.com/australiaitgroup/full-stack-bootcamp-wiki\" aria-invalid=\"true\">https://github.com/australiaitgroup/full-stack-bootcamp-wiki</a></li>\n<li>我们的课程包括三个实践项目，您可以参考以下信息：<a href=\"https://github.com/australiaitgroup/jr-full-stack-projects\">https://github.com/australiaitgroup/jr-full-stack-projects</a></li>\n</ul>\n</li>\n<li><strong>编辑器工具</strong>：您可以根据个人喜好选择任意一款代码编辑器，如 VS Code、Webstorm、Intellij 等。</li>\n<li><strong>Node.js 安装</strong>：请自行安装 16 版本以上的 Node.js LTS（长期支持）版本。</li>\n</ol>\n<p>我们期待着与你在全栈班的旅程中携手前行，并助你成为一名出色的全栈开发者！</p>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c1a2"
        },
        {
          "code": "L03",
          "title": "Introduction & Career",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2><strong>Web全栈班课程内容介绍</strong></h2><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>匠人学院概述学院背景与发展</strong>: 匠人学院（JR Academy）成立于2017年，总部位于澳大利亚布里斯班，目前在悉尼、墨尔本、阿德莱德等主要城市设有分部。学院致力于为澳洲华人提供高质量的IT教育，帮助学员提升技能，实现职业发展。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>使命与愿景</strong>: 我们的使命是通过技术赋能教育，以专业和匠心服务用户，助力学员开启他们的第一份澳洲IT工作。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学员与导师的覆盖范围及影响力</strong>: 学院已培训超过4000名IT学员，拥有600多位全球导师，举办200多场线上线下活动，并成功帮助数千名学员拿到offer。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Web全栈班课程简介基础课程</strong>（3.5个月）：涵盖HTML、CSS、JavaScript、数据库、Web框架等核心技能，帮助学员打下扎实的技术基础。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目实战</strong>（3个月）：学员将参与3个实际项目，包括商业级个人/公司Landing Page开发、Web Application Delivery，以及Agile Team Project Delivery。在项目实战中，学员不仅能巩固所学，还能积累团队协作和项目管理经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>AIGC新内容</strong>：课程新增人工智能生成内容（AIGC）模块，帮助学员掌握最新的AI技术，增强竞争力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>职业辅导</strong>（2个月）：在Career Coaching阶段，学员将接受全方位的职业辅导，内容涵盖职业规划、简历优化、面试准备、谈薪技巧等，确保学员在求职时有充足的准备。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>简历内推库</strong>（12个月）：学员将享受为期一年的简历内推服务，简历将由专业导师审核优化，并推荐至行业内相关岗位，增加就业机会。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>导师与辅导团队导师背景与专业领域</strong>: 我们的导师团队由来自全球知名IT公司的行业专家组成，涵盖软件开发、云计算、DevOps、数据分析等多个领域。导师不仅具备丰富的技术背景，还拥有多年的教学与面试经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>辅导老师与班主任角色</strong>: 每期课程配备专属辅导员和班主任，负责学员的日常学习辅导、作业批改、课程反馈与建议，确保每位学员都能得到个性化的指导和支持。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学习模式与平台课程授课</strong>：由一线大厂导师主讲，传授前沿技术和实用经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutorial</strong>：通过课堂和项目Tutorial，学员在学习中得到及时的答疑和作业批改反馈。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目实战</strong>：学员将在导师的指导下，完成商业级项目，积累实际工作经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>IT Career Coaching Bootcamp</strong>：职业辅导包括求职技巧、职业发展规划，帮助学员更快适应职场。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>元宇宙互动学习平台</strong>: 学院独创的线上互动学习平台，将元宇宙场景融入学习中，打破远程学习的社交壁垒，提供24小时线上自习室和团队协作环境。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>线上自习室与团队协作</strong>: 学员可以在元宇宙平台上找到学习伙伴，共同学习并参与项目，快速建立紧密的团队协作氛围。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>职业发展与就业支持简历内推库与求职指导</strong>: 匠人学院为毕业学员打造了专属的简历内推库，每份简历都经过专业导师的审核与优化，并优先推荐给合作企业，帮助学员缩短求职路径。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Career Coaching Bootcamp</strong>: 该课程提供为期2个月的职业指导，涵盖职业规划、简历优化、面试技巧、薪资谈判等内容，帮助学员全面提升就业能力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实习与工作内推课程</strong>: 学院与多家一线IT公司合作，提供实习机会和工作内推服务，为学员搭建与企业接轨的桥梁。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实战项目与案例分析项目背景与设计原则</strong>: 每个项目都源自真实商业场景，要求学员与客户合作，理解并实现他们的需求，从而锻炼实际开发能力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目提交要求与评估标准</strong>: 项目需提交完整的代码、文档和展示链接，评估标准包括代码质量、功能实现、用户体验等方面。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>真实商业项目体验</strong>: 学员将参与多个真实商业项目，如个人或公司Landing Page、Web应用程序开发、云服务集成等，积累宝贵的项目经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学员社区与支持体系班长与课代表制度</strong>: 学员可以竞选班长或课代表，协助导师管理课程，解答同学疑问，并参与课程反馈，锻炼领导能力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>社区互助与资源共享</strong>: 学院拥有活跃的学员社区，成员间互帮互助，共享内推资源与学习资料，形成良好的学习氛围。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学员信息统计与社区互动</strong>: 学院定期统计学员信息，了解学员需求，组织线上线下的互动活动，增强社区凝聚力。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1a3"
        },
        {
          "code": "L04",
          "title": "【课后阅读】“计算机专业要学哪些？\"10 分钟带你白嫖完三年科班程序员的必修课",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>面向对象编程（OOP）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 OOP 的核心概念</li></ol><p>前端（Front-end）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 HTML、CSS、JavaScript 的魔法</li></ol><p>系统编程（System Programming）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解系统编程的重要性</li></ol><p>图像处理</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>图像在设计和计算机视觉中的奥秘</li></ol><p>互联网协议（Internet Protocols）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>互联网协议的秘密</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 TCP/IP 和 HTTP</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>网络通信的魔法</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1a4"
        },
        {
          "code": "L05",
          "title": "开课讲解会",
          "type": "Lesson",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>主要内容：</strong></p><p>1. 课表查看</p><p>2. 课程资料查找</p><p>3. 课程回放查找</p><p>4. 学习平台资源</p><p>5. Jobpin简历生成器使用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1a5"
        },
        {
          "code": "L06",
          "title": "HTML & CSS 的奥秘",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>网页的心跳: 网页如何呈现给用户</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>网页旅程: 探究一个网页如何从服务器传输到你的屏幕的背后原理。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML标签揭秘: 网络的基石。熟悉最常用的标签并理解它们的功能。</li></ol><p>深入HTML的构架</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML结构: 学习HTML的基本框架和其重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>头部(Head)解析: 头部标签里包含了什么? 为什么它是如此重要?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML的观众: HTML是为了人类还是机器而创建的？或者两者兼而有之？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>元素之间的区别: 什么是Block元素? 什么是Inline元素? 为什么需要区分?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>常用标签探讨: 深入了解和实践常用的HTML标签。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签的语义性: 为什么选择正确的标签很重要？如何提高代码的可读性和无障碍访问性。</li></ol><p>HTML的其他要素</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML注释的艺术: 为什么注释是重要的，以及如何正确地使用它们。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跨浏览器的兼容性: 在不同的浏览器上，为什么同一代码会显示不同的样子？如何确保你的代码对所有用户都是友好的？</li></ol><p>现代HTML5新增特性</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>新的语义标签: 如&lt;article&gt;, &lt;section&gt;, &lt;nav&gt;, &lt;header&gt;, &lt;footer&gt;等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多媒体标签: 如何使用&lt;audio&gt;和&lt;video&gt;标签嵌入音频和视频。</li></ol><p>表单与用户互动</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>表单基础: 输入类型、标签和属性的详细介绍。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据验证: 如何使用HTML自带的验证功能确保用户输入的数据有效。</li></ol><p>网页的布局基础</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Box Model: 详细解析边距、边框、填充和内容如何共同作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Position: 学习static、relative、absoulute和fixed定位的基本知识。</li></ol><p>响应式Web设计入门</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Viewport: 什么是Viewport？为什么它对移动设备如此重要？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Media Query: 基础介绍，如何根据不同的设备和屏幕尺寸应用不同的CSS样式。</li></ol><p>与其他技术的交互</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>嵌入JavaScript: 简单介绍如何在HTML中使用JavaScript增强互动。</li></ol><p> </p><p>作业：registration_form</p>",
          "_id": "67c6cb1f6a041b1fcf12c1a6"
        },
        {
          "code": "L07",
          "title": "HTML & CSS的奥秘: Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>创建Registration Form</strong></p><p><strong>作业背景：</strong></p><p>网页表单是任何交互性网站的核心部分，无论是注册、登录、提问还是购物，表单都扮演了关键角色。为了强化你对HTML和基础CSS的理解，我们为你设计了这个作业，让你从实践中学习。</p><p><strong>作业要求：</strong></p><p><strong>表单结构</strong>：你的表单应该至少包含以下字段：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>First Name (text input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Last Name (text input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Email Address (appropriate input type)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Password (password input field with appropriate attributes to ensure security)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Confirm Password (password input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Date of Birth (date picker)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Gender (radio buttons: Male/Female/Other)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>About Me (textarea)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Choose Your Profession (dropdown list with options like \"Web Development\", \"Data Analytics\", \"UI/UX Design\", etc.)</li></ol><p><strong>布局和样式</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用CSS为你的表单元素添加基本样式，如边框、背景颜色、文本颜色等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保所有元素在各种设备和屏幕尺寸上都有清晰的布局和良好的可读性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>考虑元素间的间距，确保表单整体布局美观。</li></ol><p><strong>交互</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为提交按钮添加hover效果。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用HTML5验证功能确保在提交之前填写了所有必需字段。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保电子邮件和密码字段有适当的格式限制。</li></ol><p><strong>代码清晰性</strong>：确保你的代码结构清晰，HTML和CSS均应有合适的注释说明。</p><p><br></p><p><strong>参考UI图：</strong></p><p><img src=\"data:image/png;base64,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odeudH5rr7z5w0P37ruumcxu567bfeO++796cjV42k4u7WnONfYunejcpbW2ntVx98GT7VumIdl98KUXD37yfTubcztvvP7/euJEv9+8eVbPvnj4v9+cPuiO5m13/tWRn6+Ult9aW7948sh9++5or1hjV+OGfZ88/MPfBmveWlv9+ZP333lrfgizecut9x761q86s/D8scIlh3dJlrnw5C8v9lvPXKBrJ3D67cKxlTd/uPTxO37vuuTQ6bW79n3y8Ev5XoGMK7k+/1o80l5+90P3bE64ni4TIEBgygQqzuqQU9Ust1ucsK6156aNe76Z/NI/882Pv785t/NDS8c74Tn9o4duSc9vyo4CfmLfH6dn2dw8f7SY424iq43rb96x88abP7Z/4WMf/MMDP83LVHplZKnb9Ye37Wjset8HP7OweE87rn94/3PBsd7TRxd3JoeH06Ut7l/42L6sYTs/+49n25VqvXbwQzsazR3ND961uH9h8TN33nxjekT5o4d/3X7EnqyePbJwczZ6uPVj+xc+dfd/Sbu44alb/bL6J5/60+vzx/3YBxsJYHPn/h+kOwBOffNv9i/Mf7DRaM69/4MfTVbsf/5kbb115dePfyJ76D++81P7O1tdHuL0FXMlAQIEpkKg4qy+90v3bjxDDX/63i/du0XTLKXJkdSzRz9781xj1y1fzueXa+utC/947/XJcdb5p08X+4Tbod1ZxGkTWZ1r3PTxp4sel2parH+WutKDXjn9ZFq7vEzrrSsvfKZnBNAeFjTmH8/qmx2/vPmhH3fmr60fP7Dn2l233vVo+xTorqye/fq9SYZvf+jFfPreOnNsPhW474f917a11i+ryUnU3yzmzSvH/zbZ5btz8UixJj07gY9/OR0B3P63rxST8jy0na3eaNI8aPVcT4AAgUkRqDir7/n8nWE4N778ns/fWWRpsxdOP/3pZOZ03Q3XNpo7Plx6p8dvHvnoXKPZWDiWz//az83LD+2ZazSbD7ySPtZmsvr+Lz53tTZkqWv82QtFyJNHufD0R5Jdx3mZXvgfu2648dqFY6XbrJXXJEvXnzyywXtXylk9dfjDzbnGrft/1Jmst9bWzz4xf+2uW2/7f342ALZvVrt2iZdXbG291Z3VHyy+v8+O9PZWFwOFq9ENWMNJ+Rdl9QgQqLlAXbLaWjv75D03JXs+e95vc/Sz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\"></p><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p>方式一：GitHub链接提交</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的HTML和CSS 文件上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol><p>方式二：ZIP文件提交</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS代码保存在一个名为 \"Registration_Form\" 的文件夹中；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将文件夹压缩为 ZIP 文件；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传zip文件，点击“确认提交”，提交成功。</span></li></ol><p>请确保提交的代码结构完整、清晰，并能够正常运行。</p>",
          "_id": "67c6cb1f6a041b1fcf12c1a7"
        },
        {
          "code": "L08",
          "title": "Lab(1)：使用Chrome Debugger和实现Responsive List",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用Chrome Debugger和实现Responsive List</p>",
          "_id": "67c6cb1f6a041b1fcf12c1a8"
        },
        {
          "code": "L09",
          "title": "HTML&CSS (Part 2)",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>CSS概念</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义：CSS (级联样式表) 是用来装饰和布局网页的语言。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>作用：让网页内容更加美观，为HTML元素设置样式。</li></ol><p>Emmet语法</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义：一个高效的编码快捷工具，帮助快速编写HTML/CSS。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>示例：输入ul&gt;li*5后，可快速展开为5个列表项的无序列表。</li></ol><p>选择器的种类及其作用</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签选择器：针对特定HTML标签应用样式。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类选择器：一个或多个HTML元素的自定义样式。例如，.classname。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类选择器多类名使用：一个元素可以应用多个类名，例如&lt;div class=\"class1 class2\"&gt;。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ID选择器：针对特定ID的HTML元素应用样式。例如，#idname。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通配符选择器 (``)：选取所有元素应用统一样式。</li></ol><p>CSS字体与文本属性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>字体属性：如font-family, font-size, font-weight等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>复合属性：例如font: 12px Arial, sans-serif;可以一次性设置多个字体相关的属性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文本样式：如text-align, text-decoration, text-transform等用于控制文本的显示效果。</li></ol><p>CSS样式表的种类</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>内部样式表：直接在HTML文件的&lt;head&gt;中使用&lt;style&gt;标签。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>行内样式：直接在HTML元素上使用style属性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>外部样式表：通过.css文件链接到HTML，使样式与内容分离。</li></ol><p>选择器的进阶使用</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>后代选择器：如div p选择所有div内的p元素。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>子元素选择器：如div &gt; p只选择div的直接子元素p。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>并集选择器：例如h1, h2, h3可以同时为多个标签设置样式。</li></ol><p>链接伪类选择器</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如:hover, :active, :visited等，用于定义链接或其他元素在不同状态下的样式。</li></ol><p>元素显示模式</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>行内元素：如span，不独占一行。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>块元素：如div，独占一行。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>元素模式转化：使用display属性，如display: block;或display: inline;。</li></ol><p>背景属性 (background)</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如background-color, background-image, background-repeat等，用于设置元素的背景。</li></ol><p>CSS的三大特性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>层叠性：当有多个相互冲突的样式规则时，哪一个会生效。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>继承性：某些样式会被子元素继承。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优先级 &amp; 权重叠加：如!important, 选择器的权重等。</li></ol><p>CSS盒模型 (Box Model)</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括：内容(content), 填充(padding), 边框(border), 外边距(margin)。</li></ol><p>边距的特性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Margin水平居中：如margin: 0 auto;可以使块元素在容器中水平居中。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Margin合并塌陷：当两个垂直边距相遇时，它们将形成一个边距。</li></ol><p>Flex布局</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍：一个为设计复杂布局而生的模型，主要用于调整元素在不同设备和屏幕大小上的显示。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基本概念：如flex-container, flex-item, justify-content, align-items等。</li></ol><p>Flex属性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如flex-grow, flex-shrink, flex-basis等，用于控制flex容器内元素的大小和排列。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1a9"
        },
        {
          "code": "L10",
          "title": "HTML&CSS (Part 2): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业背景：</strong></p><p>卡片式设计（Card UI Design）是现代Web设计中常见的一种模式，广泛用于产品展示、新闻摘要、个人资料等。此次作业，你将会获得一些预先设计好的Card UI Design图。你的任务是使用HTML和CSS来实现这些设计，将其从静态图像转变为实际的Web元素。</p><p>选择一个提供的UI设计，完成作业。</p><p>参考图一：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66ebbcbab6f2210012886fe6/6b41a24aa27f883bed79cf9329e6beb0.png\"></p><p>参考图二：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66ebbcbab6f2210012886fe6/ed57f5b8462e237bd62872ff63e7bd51.png\"></p><p><br></p><p><strong>作业要求：</strong></p><p><strong>精确还原</strong>：尽量确保你的代码实现与给定的UI设计图在视觉上相匹配，包括颜色、尺寸、字体和间距。</p><p><strong>响应式设计</strong>：尽管设计图可能是针对特定的屏幕尺寸，但你需要确保你的卡片设计在各种设备和屏幕尺寸上都能正常显示。</p><p><strong>使用选择器和属性</strong>：你应该在CSS中应用至少以下选择器和属性：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签选择器、类选择器、ID选择器。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文本样式、背景属性、padding、margin、flexbox。</li></ol><p><strong>代码清晰性</strong>：代码应该是清晰的、整洁的，并且有适当的注释。</p><p><strong>交互效果</strong>：考虑为你的卡片添加一些基本的交互效果，如hover状态。</p><p><br></p><p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">作业提交：</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">方式一：GitHub链接提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS 文件上传到 GitHub 仓库，确保项目结构清晰且完整；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传可访问的仓库链接，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">方式二：ZIP文件提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS代码保存在一个名为 \"Card_UI_Implementation\" 的文件夹中；确保所有必要的资源（如图片、字体）都已包含在此文件夹中，并使用相对路径链接到你的HTML中。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将文件夹压缩为 ZIP 文件；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传zip文件，点击“确认提交”，提交成功。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">请确保提交的代码结构完整、清晰，并能够正常运行。</span></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1aa"
        },
        {
          "code": "L11",
          "title": "Tutorial 01 (HTML)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "67c6cb1f6a041b1fcf12c1ab"
        },
        {
          "code": "L12",
          "title": "CSS & Sass",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Card Design作业评议与SVG编辑</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾与讨论学生提交的card design作业。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何编辑SVG图像以增强设计效果。</li></ol><p>box-sizing的实际应用</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释box-sizing属性如何影响元素的宽高计算。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示content-box与border-box之间的区别。</li></ol><p>CSS长度单位探讨</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>绝对单位：如px, pt, cm等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>相对单位：如em, rem, vw, vh等。</li></ol><p>文本溢出处理</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解`word-wrap`和`word-break`属性如何帮助控制文本溢出。</li></ol><p>伪类与伪元素的使用</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如:hover, ::before, ::after等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何使用它们增强页面样式和效果。</li></ol><p>float的应用技巧</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍float属性的常见用途，如创建多列布局或水平菜单。</li></ol><p>选择器的特异性 (specificity)</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解如何计算选择器的权重，以及为何某些样式没有被应用。</li></ol><p>响应式设计基础</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么响应式设计是必要的。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用媒体查询创建适应不同屏幕大小的布局。</li></ol><p>Bootstrap与Semantic UI</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简介Bootstrap，展示如何使用Bootstrap实现响应式设计。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Semantic UI框架并比较其与Bootstrap的异同。</li></ol><p>CSS预处理器简介:&nbsp;</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是Sass、Less等预处理器？为什么它们在现代网页开发中很有用？</li></ol><p>CSS的挑战与Sass解决方案</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论在大型项目中CSS可能面临的问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Sass (SCSS) 如何简化CSS编写，以及如何使用变量、嵌套等功能。</li></ol><p>深入Flexbox</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Flexbox如何解决传统布局问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索`flex`, `flex-grow`, `flex-shrink`等属性的使用。</li></ol><p>UI设计原则与组件库</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习创建出色UI的基本原则。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍流行的组件库，如Material-UI或Ant Design。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示个人网站设计案例，启发学生的设计灵感。</li></ol><p>&nbsp;</p><p>作业指导</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>要求使用本节课学到的技能完成四个Card布局。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1ac"
        },
        {
          "code": "L13",
          "title": "Lab(2)：使用Grid和Flexbox实现卡片布局",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用Grid和Flexbox实现卡片布局</p>",
          "_id": "67c6cb1f6a041b1fcf12c1ad"
        },
        {
          "code": "L14",
          "title": "JavaScript ",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>JavaScript的奇幻之旅：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随时间的轨迹，了解JavaScript如何从一个小小的脚本语言成为Web的重要组成部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解其如何成为Web的核心语言。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验Node.js的魅力，看看如何轻松地在这个环境中运行你的JS代码。</li></ol><p>探索js的秘密：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解JavaScript的独特Data Types，感知数据的生命力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认识变量命名背后的Naming Conventions，并感受到Hoisting带来的惊喜。</li></ol><p>动态的数据操作：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习Operators的秘密语言，看它们如何让数据生动起来。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解==与===的精确差异</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入探讨JavaScript的Type Conversion，体验其动态特性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>揭示数字计算中的Precision问题，学会安全的数据处理技巧。</li></ol><p>数组的神秘世界：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从创建到访问，全方位认识Arrays。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索数组的神奇方法，无论是sort还是filter，并学会使用break和continue来调控循环的行为。</li></ol><p>控制代码的流程：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验如何使用Conditional Statements让代码做出决策。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>利用Loops让魔法反复施放，直到完成神奇的任务。</li></ol><p>Dive into Functions:</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何将神奇的咒语封装成Functions，随时随地召唤。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义和调用函数，了解Scope和参数传递的机制。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Strict Mode，为什么它是良好编程实践的一部分。</li></ol><p>Objects：模型化复杂的现实世界</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Objects，看它们如何代表复杂的事物。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验Objects和Arrays的冒险，了解它们在JavaScript世界中的地位。</li></ol><p>最佳实践和注意事项：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Strict Mode，掌握其在现代JavaScript开发中的重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认识一些常见的JavaScript陷阱，并学会如何避免它们。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1ae"
        },
        {
          "code": "L15",
          "title": "JavaScript Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>JavaScript 入门作业: 购物清单管理</strong></p><p>作业目标:</p><p>通过这次的作业，你将会练习JavaScript中的基本数据类型、数组、对象、条件语句、循环语句和函数的应用。</p><p>作业要求:</p><p><strong>数据与变量：</strong></p><p>创建一个购物清单数组，例如:</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/36160717-8966-4f0a-8b7b-02f2afda4063.png\"></p><p><strong>数组应用：</strong></p><p>向购物清单中添加两样物品，并输出更新后的清单。</p><p>从购物清单中删除最后一项物品，并输出结果。</p><p><strong>条件与循环：</strong></p><p>创建一个函数，当购物清单中的物品超过5项时，在控制台输出\"你的购物车满了\"。</p><p>使用循环语句遍历购物清单，将每一项物品在控制台上以编号的形式输出。例如：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/1108680f-6d20-48ff-b6d6-a6a13cf6d313.png\"></p><p><strong>函数与对象：</strong></p><p>创建一个函数，该函数接受物品名称作为参数，并返回该物品是否在购物清单中。</p><p>创建一个购物物品对象，其中包括物品名称、价格和数量。例如:</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/e66a7c88-b85f-4641-9f2e-9d1890ceccf8.png\"></p><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">方式一：GitHub链接提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">将你的JavaScript 文件（如：ShoppingList.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">上传可访问的仓库链接，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">方式二：ZIP文件提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">请将你的代码保存在一个名为 \"</span>ShoppingList<span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">\" 的文件夹中；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">将文件夹压缩为 ZIP 文件；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">上传zip文件，点击“确认提交”，提交成功。</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">请确保提交的代码结构完整、清晰，并能够正常运行。</span></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1af"
        },
        {
          "code": "L16",
          "title": "Tutorial 02 (CSS)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "67c6cb1f6a041b1fcf12c1b0"
        },
        {
          "code": "L17",
          "title": "Git Introduction",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>探索版本控制的魔法</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么我们都爱版本控制？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分布式(Distributed) vs 集中式(Centralized)：Git的独特之处。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是分布式版本控制系统</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>主流的 git 系统介绍</li></ol><p><strong>开启你的Git旅程</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>一步步引导你安装和配置Git。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为Git设定你的身份：告诉Git你是谁。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化Git空间: **git init**的魔力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>mkdir</strong>：快速创建你的项目目录。</li></ol><p><strong>创建并驾驭你的代码宝库（Repository）</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化你的第一个Git仓库。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何管理和跟踪你的代码变更。</li></ol><p><strong>保护与跟踪你的代码</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何安全地保存你的代码更改？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解**add**, **commit**以及它们如何帮助你管理更改。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解**git log**：用美化的log追溯你的代码历史。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>.gitignore</strong>：掌握哪些文件不应纳入版本控制。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索日常工作中使用Git的标准流程。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>远程仓库(Remote Repository)的创建与管理：掌握**clone**, <strong>push</strong>, <strong>pull</strong>。</li></ol><p><strong>Sourcetree：让Git操作可视化</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么需要图形化工具？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用Sourcetree提高工作效率。</li></ol><p><strong>出错了怎么办：撤回与修复</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握reset, <strong>revert</strong>, <strong>amend</strong>：让你的代码时光倒流。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>checkout和stash</strong>：两种保存和切换的策略，它们的不同之处。</li></ol><p><strong>更进一步：分支管理与合作</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何merge、处理代码冲突。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>rebase</strong>：为什么和何时使用它。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>pull request与代码审查：如何高效、规范地合作。</li></ol><p><strong>当代码世界相撞：冲突(Conflict)解决大师</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当代码出现纷争，我们该如何和平解决？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用rebase<strong>与</strong>merge的策略，成为解决冲突的高手。</li></ol><p><strong>Git的小贴士和技巧</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍神奇的.gitignore文件：让某些文件“隐形”。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>快速、有效地查看你的代码历史。</li></ol><p><strong>Git遇见GitHub：开放的代码舞台</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>GitHub: 一个开发者的乐园。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在GitHub上展示你的才华，与全球开发者共舞。</li></ol><p>&nbsp;</p><p><strong>Links:</strong></p><p><br></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git client: <a href=\"https://git-scm.com/\" rel=\"noopener noreferrer\" target=\"_blank\">https://git-scm.com/</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>SourceTree: <a href=\"https://www.sourcetreeapp.com/\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.sourcetreeapp.com/</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Visualizing Git: <a href=\"http://git-school.github.io/visualizing-git/#free\" rel=\"noopener noreferrer\" target=\"_blank\">http://git-school.github.io/visualizing-git/#free</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Windows Terminal: <a href=\"https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Powerline for Windows Terminal: <a href=\"https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Windows Subsystem for Linux: <a href=\"https://docs.microsoft.com/en-us/windows/wsl/install-win10\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.microsoft.com/en-us/windows/wsl/install-win10</a></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1b1"
        },
        {
          "code": "L18",
          "title": "Git Introduction Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git 简答作业</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git 练习作业</li></ol><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">在你的GitHub上面创建一个仓库，上传GitHub仓库链接，点击“确认提交”，提交成功。</span></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1b2"
        },
        {
          "code": "L19",
          "title": "Lab(3)：创建Responsive定价卡片",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>创建Responsive定价卡片</p>",
          "_id": "67c6cb1f6a041b1fcf12c1b3"
        },
        {
          "code": "L20",
          "title": "Lab(4)：Git实践练习",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Git实践练习</p>",
          "_id": "67c6cb1f6a041b1fcf12c1b4"
        },
        {
          "code": "L21",
          "title": "探索现代 JavaScript —— ES6 (ECMAScript 2015) 之魅力",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>可供学生预习大纲：</p><p><br></p><h3>1. 重新定义\"变量\"：let, const</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为何var不再流行？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>const: 不仅仅是常量</li></ol><h3>2. 模板字符串 (Template Literals)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>无痛多行与字符串嵌入 Seamless multi-line support &amp; string interpolation</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态字符串制造器 • Dynamic string generation</li></ol><h3>3. 解构 (Destructuring)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组、对象，一切尽在掌握</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>函数参数的魔法展示</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从对象和数组中轻松提取信息，让数据处理变得更高效</li></ol><h3>4. 箭头函数 (Arrow Functions)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>this 的革命</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简洁与力量的完美结合</li></ol><h3>5. 展开与收纳: 扩展操作符 (Spread &amp; Rest)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组、对象的新演绎</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>收纳与释放的双重魔法</li></ol><h3>6. 可选与默认: 参数默认值</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>告别undefined</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态、简洁、高效</li></ol><p><strong>本节知识点：</strong></p><p>同学们可以根据自己时间精力设置前端整体学习目标</p><p>以下是项目参考</p><p><a href=\"https://docs.google.com/spreadsheets/d/1Sk_ovYC8tsEBpXns4Yt4ZzC77riF-P8H1D6KTtW0tSM/edit?usp=sharing\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.google.com/spreadsheets/d/1Sk_ovYC8tsEBpXns4Yt4ZzC77riF-P8H1D6KTtW0tSM/edit?usp=sharing</a></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/6641b52c65fec700459ad763/5487aa0a936bd7bd8454aaa6be1e06e4.png\" height=\"655\" width=\"974\"></p><p>根据十节课学完同学们能够掌握项目编程的基本前端技能为目标，我们可以倒推分解一下重点概念知识点的学习计划</p><p>11 个大知识模块</p><p>知识点已经精心筛选，精华重点</p><p>每一个概念都是必须到熟练运用的程度</p><p><a href=\"https://docs.google.com/spreadsheets/d/1jB3HThHu95NGC7YUCPkgzU5yUfKuU79S_wULg_AVeX4/edit?usp=sharing\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.google.com/spreadsheets/d/1jB3HThHu95NGC7YUCPkgzU5yUfKuU79S_wULg_AVeX4/edit?usp=sharing</a></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/6641b52c65fec700459ad763/20dd19a97d209ba4b88538a060be953e.png\" height=\"807\" width=\"1603\"></p><p>概念掌握程度自测Cheatsheet</p><p><a href=\"https://docs.google.com/spreadsheets/d/143KPucgIBlc6XILUqV77Im-I-IxccXqR7W3oOYqoyAA/edit?usp=sharing\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.google.com/spreadsheets/d/143KPucgIBlc6XILUqV77Im-I-IxccXqR7W3oOYqoyAA/edit?usp=sharing</a></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/6641b52c65fec700459ad763/f29e11d0b143b0f44d1f7c46634531bc.png\" height=\"541\" width=\"1446\"></p>",
          "_id": "67c6cb1f6a041b1fcf12c1b5"
        },
        {
          "code": "L22",
          "title": "ES6 Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业1</strong>.  Let, Const 和 Var</p><p><strong>任务</strong>: 将以下代码重写为使用 let 和 const 代替 var。解释为什么在每种情况下 let 或 const 更合适。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/aad961274d2af066d5d9a9a389e7ee99.png\"></p><p><strong>作业2</strong>. 箭头函数 (Arrow Functions)</p><p><strong>任务</strong>: 将以下函数转换为箭头函数。然后解释箭头函数如何与常规函数不同地处理 this 关键字。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/ae8c82473e613e9b02e26748ab400d85.png\" height=\"134\" width=\"729\"></p><p><strong>作业3</strong>: 模板字面量 (Template Literals)</p><p><strong>任务</strong>: 使用模板字面量重写以下字符串拼接代码。在字符串中添加一个新行。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/b2497dc3997022b4848567e706738f09.png\" height=\"57\" width=\"769\"></p><p><strong>作业4</strong>.解构赋值 (Destructuring)</p><p><strong>任务</strong>: 使用解构赋值从 person 对象中提取 name 和 age 属性。然后编写一个函数，在参数列表中解构对象的属性。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/592150c13d124922e483fd8de02aa3ca.png\"></p><p><strong>作业5. </strong>默认参数（Default Parameters）</p><p><strong>任务</strong>：编写一个计算机行面积的函数。如果没有提供高度，假设它是一个正方形。使用默认参数为高度设置默认值。<img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/5e316117aafda1e7332a033196f5da30.png\" height=\"326\" width=\"1858\"></p><p><strong>作业6</strong>. Rest/Spread 运算符</p><p><strong>任务</strong>: 使用 Rest 运算符创建一个函数，能够将任意数量的参数相加。然后使用 Spread 运算符合并两个数组。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/59114f7c3eac62881de33210ca86b521.png\" height=\"224\" width=\"838\"></p><p><br></p><p><strong>作业提交：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的JavaScript 文件（如：Homework_ES6.js）上传到 GitHub 仓库，确保项目结构清晰且完整； </li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1b6"
        },
        {
          "code": "L23",
          "title": "Tutorial 03 (JavaScript, Git)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "67c6cb1f6a041b1fcf12c1b7"
        },
        {
          "code": "L24",
          "title": "ES6 进阶技巧与实践",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Promises &amp; Async/Await：轻松应对异步挑战！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Promises：利用then()精简代码、用catch()处理异常，以及finally()的应用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际场景中的 Promise 链式调用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>异步编程新姿势：使用async/await实现更简洁、易读的代码。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Destructuring（解构赋值）：一步到位，快速提取值！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从对象和数组中轻松提取信息，让数据处理变得更高效。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Spread &amp; Rest Operators（展开和剩余操作符）：更便捷地操作数据！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何利用...操作符展开数组和对象。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何收集函数参数。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Enhanced Object Literals（增强的对象字面量）：定义对象，更佳清晰！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简化属性和方法的定义。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态属性名。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Iterators &amp; Generators（迭代器和生成器）：掌控数据流！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是Iterators？如何自定义迭代。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创造自己的生成器函数，了解其强大之处。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>New Data Structures：Map &amp; Set — 探索新的数据结构！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Map和Set的应用，它们与传统对象和数组的差异。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>高效地存储唯一值。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Modules（模块化）：组织和重用代码的新方式！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES6模块化的基本概念。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何import和export模块。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Symbols &amp; Well-Known Symbols</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Symbol 的高级应用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>内置 Symbols 的实用性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1b8"
        },
        {
          "code": "L25",
          "title": "ES6 (Part2) & TypeScript Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Post-Lesson Exercise: Practicing Callbacks, Promises, and Async/Await</h3><p><strong>Objective:</strong> This exercise is designed to help students reinforce their understanding of asynchronous programming in JavaScript by practicing callbacks, promises, and async/await.</p><p><strong>Part 1: Callbacks</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a function fetchData that simulates fetching data from a server. This function should take two arguments: a url (string) and a callback function. Use setTimeout to simulate a delay of 2 seconds before calling the callback function with the fetched data.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The fetchData function should print \"Fetching data from [url]...\" when it starts.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>After 2 seconds, it should call the callback function with the data: \"Data from [url]\".</li></ol><p><strong>Part 2: Promises</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the fetchData function to return a promise instead of using a callback.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The function should still simulate a 2-second delay before resolving the promise with the data: \"Data from [url]\".</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>If the url is empty or not provided, reject the promise with an error message: \"Invalid URL\".</li></ol><p><strong>Part 3: Async/Await</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the code to use async/await to fetch data and handle errors.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create an async function named loadData that calls fetchData with a given url.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use try/catch to handle any errors that occur during the data fetching process.</li></ol><h3><strong>After-Class Homework: Learning the Basics of TypeScript</strong></h3><p><strong>Objective:</strong></p><p>This homework is designed to help students get started with TypeScript, a strongly typed superset of JavaScript. Students will learn about basic TypeScript concepts, including types, interfaces, classes, and functions.</p><p><strong>Part 1: Setting Up TypeScript</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Install TypeScript on your machine and set up a new TypeScript project.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use npm (Node Package Manager) to install TypeScript globally</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new project directory and initialize it with a tsconfig.json file</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new TypeScript file called index.ts in the project directory.</li></ol><p><strong>Part 2: Basic Type Annotations</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Write a function in index.ts that takes two numbers as parameters and returns their sum. Use TypeScript to annotate the types of the parameters and the return value.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define the function add with type annotations.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Compile the TypeScript file to JavaScript using the tsc command and run the resulting JavaScript file.</li></ol><p><strong>Part 3: Working with Interfaces</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define an interface Person with properties name (string) and age (number). Create a function greet that takes a Person object as a parameter and prints a greeting message.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define the Person interface and use it to type the parameter of the greet function.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a Person object and pass it to the greet function.</li></ol><p>&nbsp;</p><p><strong>作业提交：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的JavaScript 文件（如：Homework_ES6.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1b9"
        },
        {
          "code": "L26",
          "title": "Lab(5)：构建一个JavaScript天气应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>构建一个JavaScript天气应用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1ba"
        },
        {
          "code": "L27",
          "title": "Lab(6)：使用Promise和ES6创建进度条",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用Promise和ES6创建进度条</p>",
          "_id": "67c6cb1f6a041b1fcf12c1bb"
        },
        {
          "code": "L28",
          "title": "Technical SEO 基础知识",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. SEO是什么，SEO是怎么工作的，影响SEO由哪四大要素影响</p><p>2. SEO用什么工具查看</p><p>3. Technical SEO具体如何进行有优化</p><p>4. 网页的结构应该如何进行优化</p><p>5. 面对SEO规则，HTML里如何进行优化，如何使用Canonical，301等</p><p>6. 怎样进行提升网站Performance，Page Speed如何提升</p>",
          "_id": "67c6cb1f6a041b1fcf12c1bc"
        },
        {
          "code": "L29",
          "title": "Project 1 介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2><strong>Project One: 商业级个人/公司Landing Page</strong></h2><h3><br></h3><h3><strong>﻿项目背景:</strong></h3><p>在实际工作中，很多时候我们需要与多方合作，包括客户、设计师、运营、产品经理等。理解并转化他们的需求是开发的关键。在这个项目中，你将扮演开发者的角色，与一个“甲方”合作（可以是你的朋友、律师、PT、会计、设计师、小咖啡店或公司等），理解并实现他们的网站需求。</p><h3><strong>1. 项目描述:</strong></h3><p>学员需要与“甲方”合作，创建一个网站，可以是个人展示网站、公司或产品的landing page、咖啡店的菜单页面等等。该网站应该清晰地传达“甲方”的主题和信息，并在设计上展现出专业感。</p><h3><strong>2. 基本要求:</strong></h3><p><strong>实战练习：</strong>课上由老师手把手带领同学实现一个landing page。</p><p><strong>课后练习：</strong></p><ul><li class=\"ql-indent-1\"><strong>需求沟通:</strong> 与“甲方”进行深入沟通，了解其具体需求、目标用户、核心内容等。</li><li class=\"ql-indent-1\"><strong>设计原则:</strong> 清晰、简洁且富有吸引力。</li><li class=\"ql-indent-1\"><strong>响应式设计:</strong> 网站需要在手机、平板和桌面设备上均有良好的显示效果。</li><li class=\"ql-indent-1\"><strong>HTML结构:</strong> 使用语义化的HTML标签，确保内容有条理。</li><li class=\"ql-indent-1\"><strong>CSS &amp; Sass样式:</strong> 充分利用CSS和Sass来美化网页，并使用flexbox或Bootstrap进行布局。</li><li class=\"ql-indent-1\"><strong>JavaScript &amp; jQuery:</strong> 根据需要，增加基本的交互功能，如滑动效果、导航条切换等。</li><li class=\"ql-indent-1\"><strong>页面内容:</strong> 至少包括：主页、关于我们/关于我、产品或服务展示、联系方式。</li></ul><h3><strong>3. 加分项:</strong></h3><ul><li><strong>动画效果:</strong> 使用CSS或JavaScript添加过渡或动画效果，增强用户体验。</li><li><strong>表单功能:</strong> 如联系表单或订阅表单，用于收集用户信息或反馈。</li><li><strong>原创性:</strong> 尽量减少模板的使用，展现自己的原创设计和创意。</li><li><strong>页面加载速度:</strong> 优化图片和代码，确保页面快速加载。</li></ul>",
          "_id": "67c6cb1f6a041b1fcf12c1bd"
        },
        {
          "code": "L30",
          "title": "Project 1 Tutorial",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目启动</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 Landing Page 的重要性和应用场景。</li></ol><p><strong>布局与样式设计</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>逐步构建页面结构，使用语义化 HTML 标签。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用 CSS/Sass 技巧，打造视觉吸引力十足的界面。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论响应式设计的要点，确保页面在不同设备上均表现完美。</li></ol><p><strong>互动功能实现</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教你如何利用 JavaScript/jQuery 增加页面动态效果。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现用户交互功能，如滑动效果、导航条切换等。</li></ol><p><strong>细节打磨</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优化页面元素，提升用户体验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分享专业技巧，如加载速度优化、SEO 最佳实践等。</li></ol><p><strong>实现效果</strong></p><p>参考网站：<a href=\"https://elisc-react.vercel.app/index-one-page\" rel=\"noopener noreferrer\" target=\"_blank\">https://elisc-react.vercel.app/index-one-page</a></p><p><u>参考代码： https://github.com/jessieyu1/portfolio-landing-page</u></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c9/841979b9-6eb1-4a11-b755-a0a9d0ee1089.png\"></p>",
          "_id": "67c6cb1f6a041b1fcf12c1be"
        },
        {
          "code": "L31",
          "title": "Node.js 如何安装",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>To install Node.js, you can follow these general steps. The exact process may vary slightly depending on your operating system:</p>\n<h3>Windows or macOS</h3>\n<ol>\n<li><strong>Download the Installer</strong>:</li>\n</ol>\n<ul>\n<li class=\"ql-indent-1\">Go to the <a href=\"https://nodejs.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js website</a>.</li>\n<li class=\"ql-indent-1\">Choose the version you need. The LTS (Long Term Support) version is recommended for most users, as it's more stable.</li>\n</ul>\n<ol>\n<li><strong>Run the Installer</strong>:</li>\n</ol>\n<ul>\n<li class=\"ql-indent-1\">After downloading, run the installer.</li>\n<li class=\"ql-indent-1\">Follow the installation prompts, including agreeing to the license agreement and choosing the installation location.</li>\n<li class=\"ql-indent-1\">The installer typically includes Node.js and npm (Node Package Manager).</li>\n</ul>\n<ol>\n<li><strong>Verify Installation</strong>:</li>\n</ol>\n<ul>\n<li class=\"ql-indent-1\">Open a command prompt (Windows) or terminal (macOS).</li>\n<li class=\"ql-indent-1\">Type <code>node -v</code> and press Enter. This should display the Node.js version, confirming it's installed.</li>\n<li class=\"ql-indent-1\">Type <code>npm -v</code> to check npm's version.</li>\n</ul>\n<h3>Linux</h3>\n<p>The process can vary based on the Linux distribution. Here are the steps for Ubuntu:</p>\n<ol>\n<li><strong>Update Package Index</strong>:</li>\n</ol>\n<pre class=\"ql-syntax\" spellcheck=\"false\">sudo apt update\n</pre>\n<ol>\n<li><strong>Install Node.js</strong>:</li>\n</ol>\n<ul>\n<li>You can install Node.js from the Ubuntu repository:</li>\n</ul>\n<pre class=\"ql-syntax ql-indent-1\" spellcheck=\"false\">sudo apt install nodejs\n</pre>\n<ul>\n<li>For the latest version, you might prefer using a PPA (Personal Package Archive):</li>\n</ul>\n<pre class=\"ql-syntax\" spellcheck=\"false\">curl -sL &lt;https://deb.nodesource.com/setup_16.x&gt; | sudo -E bash -\nsudo apt-get install -y nodejs\n</pre>\n<ol>\n<li><strong>Verify Installation</strong>:</li>\n</ol>\n<ul>\n<li>Check Node.js version:</li>\n</ul>\n<pre class=\"ql-syntax ql-indent-1\" spellcheck=\"false\">node -v\n</pre>\n<ul>\n<li>Check npm version:</li>\n</ul>\n<pre class=\"ql-syntax ql-indent-1\" spellcheck=\"false\">npm -v\n</pre>\n<p>Remember to replace <code>16.x</code> with the version you want if you're using the PPA method. For other Linux distributions, the process will be similar but might require different commands to update packages or add repositories.</p>",
          "_id": "67c6cb1f6a041b1fcf12c1bf"
        },
        {
          "code": "L32",
          "title": "React Install",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>React 安装、配置及创建项目教学文档</h3><h3>1. 环境要求</h3><p>首先，确保您的开发环境包括以下：</p><ul><li>Node.js：React 需要 Node.js 环境。请访问 <a href=\"https://nodejs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">Node.js 官网</a> 下载并安装最新版本。</li><li>npm（Node 包管理器）：通常会与 Node.js 一起安装。</li></ul><h3>2. 安装 Create React App</h3><p>Create React App 是一个官方支持的方式，用于创建单页 React 应用程序。它提供了一个现代化的构建设置，无需配置。</p><p>在终端或命令提示符中运行以下命令来安装 Create React App：</p><pre class=\"ql-syntax\" spellcheck=\"false\">npx create-react-app my-app\n</pre><p>这将在当前目录下创建一个名为 <code>my-app</code> 的新目录。</p><h3>3. 进入项目目录</h3><p>安装完成后，进入项目目录：</p><pre class=\"ql-syntax\" spellcheck=\"false\">cd my-app\n</pre><h3>4. 启动开发服务器</h3><p>在项目目录中，运行以下命令启动开发服务器：</p><pre class=\"ql-syntax\" spellcheck=\"false\">npm start\n</pre><p>此命令将启动一个本地服务器，并在默认浏览器中打开 <code>http://localhost:3000</code>。当您对代码进行更改时，页面将实时重新加载。</p><h3>5. 编辑 React 组件</h3><p>打开项目文件夹，您会看到一些预创建的文件。最重要的是 <code>src/App.js</code>，这是您的 React 应用程序的主要组件。</p><p>您可以开始编辑 <code>src/App.js</code>，并在浏览器中看到您的更改。例如，尝试更改文本并保存文件，您的更改将立即反映在浏览器中。</p><h3>6. 构建和部署</h3><p>当您准备好将应用程序部署到生产环境时，运行以下命令以构建应用程序：</p><pre class=\"ql-syntax\" spellcheck=\"false\">npm run build\n</pre><p>这将在 <code>build</code> 目录中创建一个优化的生产构建。</p><h3>7. 后续步骤</h3><ul><li>学习 React 基础：建议浏览 <a href=\"https://reactjs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">React 官方文档</a>，了解更多关于 React 的知识。</li><li>组件编写：实践通过编写不同的组件来构建复杂的 UI。</li><li>状态管理：学习使用 React 的状态管理，例如使用 Hooks。</li><li>路由：如果您的应用需要导航，尝试使用如 <code>react-router-dom</code> 等库。</li></ul>",
          "_id": "67c6cb1f6a041b1fcf12c1c0"
        },
        {
          "code": "L33",
          "title": "React项目快速上手",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>React 框架的起源与版本演进历程：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 框架的起源和发展历程，包括重要版本的发布和主要特性的改进。</li></ol><p>快速上手 React：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置开发环境：指导学生安装 Node.js 和 VS Code，以便开始 React 应用程序的开发。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>快速上手 create-react-app：介绍 create-react-app 工具，以及如何使用它来快速创建 React 项目的基本结构。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验 React 核心概念：通过编写简单的示例代码，让学生体验 JSX 语法以及 useState 和 useEffect 等 React 核心概念的使用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>拆分组件：引导学生学习如何将 React 应用程序拆分为可维护的组件，提高代码的复用性和可维护性。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c1"
        },
        {
          "code": "L34",
          "title": "React组件基础",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>组件基础：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用 SASS 与 Bootstrap 构建组件的外观：介绍如何利用 SASS 预处理器和 Bootstrap 框架来快速构建组件的外观和样式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>强大的模板语法 JSX：深入了解 JSX 语法的特点和优势，以及如何在 React 组件中编写 JSX 代码。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props &amp; State：解释组件中的 props 和 state 的概念，以及它们分别用于什么目的。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props 与 State 的区别和联系：对比 props 和 state 的区别，以及它们之间的联系和作用范围。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件间通讯：讨论不同组件之间如何进行通讯，包括父子组件通讯和兄弟组件通讯等方式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>综合实例：构建一个结构复杂的页面，通过实际例子来理解 React 切分组件的思想，以及如何合理组织组件结构和通讯。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c2"
        },
        {
          "code": "L35",
          "title": "React Router",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>快速上手 React Router:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索 React Router，这个强大的库可让你构建单页应用程序的导航系统，快速开始你的路程。</li></ol><p>嵌套路由:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解嵌套路由，通过分层结构创建复杂的页面布局和导航。</li></ol><p>HashRouter 与 BrowserRouter:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比 HashRouter 和 BrowserRouter，了解它们之间的区别，以及何时使用哪一个来管理 URL。</li></ol><p>React Router 运行机制:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 React Router 的内部机制，从路由匹配到组件渲染，掌握它如何使一切无缝运转。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c3"
        },
        {
          "code": "L36",
          "title": "React表单处理",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>非受控表单:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解非受控表单，它们是表单元素的一种处理方式，适用于简单的表单，但缺乏状态控制和验证。</li></ol><p>受控表单:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索受控表单，这种表单通过React组件状态来控制表单元素的值和行为，使数据流更可控。</li></ol><p>表单校验 (Form Validation):</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会如何对表单进行校验，确保用户输入的数据满足特定的要求，提高数据的有效性和安全性。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c4"
        },
        {
          "code": "L37",
          "title": "React服务端交互",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>典型交互方式：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨与服务器通信的经典方式，包括 Ajax、Fetch 和 Axios，并介绍它们各自的用途和优势。</li></ol><p>快速上手 Axios：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何迅速上手 Axios，了解其基本用法和常见配置，以及如何发起 HTTP 请求并处理响应。</li></ol><p>拦截器处理通用操作：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解如何使用 Axios 拦截器来处理通用的操作，如请求和响应的日志记录、身份验证、错误处理等。</li></ol><p>封装可复用的 Axios 服务：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会将 Axios 封装为可复用的服务，以便在整个应用程序中共享和维护一致的 HTTP 请求配置，提高代码的可维护性和可扩展性。</li></ol><p>React 组件的生命周期：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 React 组件的生命周期方法，包括挂载、更新和卸载阶段，并学会如何在组件的生命周期中处理各种操作。</li></ol><p>VDOM：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍虚拟 DOM（VDOM）的概念，以及其在 React 中的作用和优势，理解 VDOM 的工作原理。</li></ol><p>类组件与函数式组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比类组件和函数式组件的特点和用法，并解释为什么函数式组件越来越受欢迎。</li></ol><p>复合组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用复合组件将多个组件组合在一起，以构建更复杂和灵活的 UI。</li></ol><p>高阶组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍高阶组件的概念和用法，以及如何使用高阶组件来增强组件的功能和复用性。</li></ol><p>开源组件库与企业业务组件库：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨开源组件库的特点和优势，以及如何选择和使用适合项目需求的组件库；同时，讨论企业业务组件库的重要性和设计原则。</li></ol><p>动态生成页面与 React 低代码：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍动态生成页面的概念和 React 低代码的特点，了解如何利用 React 技术栈实现动态页面和低代码开发。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c5"
        },
        {
          "code": "L38",
          "title": "React Hooks",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>React Hooks：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 内置的 Hooks，如 useState 和 useEffect，并解释它们的作用和用法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 useState Hook，包括如何在函数组件中管理状态并进行状态更新。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 useEffect Hook，包括如何处理副作用、订阅和取消订阅等操作。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何自定义 Hooks，以便在应用程序中共享和重用状态逻辑。</li></ol><p>用 useTranslation 钩子实现组件的 i18n：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨如何使用第三方库中提供的 useTranslation 钩子来实现组件的国际化（i18n），以支持多语言应用程序的开发。</li></ol><p>状态管理：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解状态管理的基本概念，包括状态、单一数据源、不可变性等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 内置的 Context API，以及如何使用 Context 在组件之间共享状态。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍 React Redux，作为一种常用的状态管理中间件，以及其与 Context 的区别和优势。</li></ol><p>自动化测试：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何进行单元测试，包括安装配置 Jest 测试框架和详解 Jasmine 语法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何进行集成测试，包括安装配置 Cypress 测试框架和运行集成测试用例。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c6"
        },
        {
          "code": "L39",
          "title": "REACT(1): React with Modern JavaScript",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>React 基础与入门</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 背景</strong>发展历史</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在业界的应用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>与其他框架/库的比较</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>createReactApp</strong>安装和配置</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>项目结构简介</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>声明式 vs 命令式</strong>基本定义和区别</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 React 中为什么选择声明式</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>示例代码对比</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>组件化编程</strong>组件的定义和分类</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件的重用和组合</li></ol><p><strong>实验/练习</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 <strong>create-react-app</strong> 创建一个简单的应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>编写一个小例子展示声明式和命令式的区别。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个简单的 React 组件。</li></ol><p><strong>课后作业</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读关于 React 的基础文档或相关文章。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>尝试修改和运行刚创建的 React 应用。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c7"
        },
        {
          "code": "L40",
          "title": "React (1): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2><strong>Exercise: Building a CourseCard Component for a MOOC Platform</strong></h2><h3><strong>Objective:</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Practice creating a real-world functional component in React.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Apply ES6 features such as destructuring, template literals, and arrow functions.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ensure the component integrates smoothly into a React project and runs locally.</li></ol><h3><strong>Requirements - The CourseCard component should:</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the course title, price, language, duration, location.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optionally display a \"New\" badge if the course is recently added.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optionally display a course Image.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use ES6 features such as destructuring, template literals, and arrow functions.</li></ol><h3><strong>Optional Requirements:</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Research how to style a component</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new file named CourseCard.css in the src directory.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add styles to enhance the appearance of the CourseCard component.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Write this component again in Class Component</li></ol><p><br></p><p><strong>作业提交：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的 CourseCard 组件相关文件（如：CourseCard.jsx、CourseCardClass.jsx、CourseCard.css等）上传到 GitHub 仓库，确保项目结构清晰、可在本地运行；</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c8"
        },
        {
          "code": "L41",
          "title": "Tutorial 04 (ES6)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>本节内容：</p><h1>练习</h1><p><strong>使用 <a href=\"https://api-ninjas.com/api/randomuser\" rel=\"noopener noreferrer\" target=\"_blank\">https://api-ninjas.com/api/randomuser</a> API 创建、更新、删除和查看数据</strong></p><h3>1. <strong>从 API 获取数据·</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用Fetch获取远程API数据。</li></ol><h3>2. <strong>学习如何将结果保存到变量中</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个回调（Callback）函数。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建变量并进行赋值。</li></ol><h3>3. <strong>显示结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>获取变量。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 map 函数显示结果。</li></ol><h3>4. <strong>修改结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用扩展运算符（spread operator）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释还有哪些其他方法可以做到这一点，以及为什么应该避免使用它们。</li></ol><h3>5. <strong>删除结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 filter 函数。</li></ol><h3>6. <strong>添加结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个输入框。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何从输入框获取值。</li></ol><h3>7. <strong>创建一个搜索框（SearchBox）</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生学习如何从输入框获取值。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生应该能够使用 filter 函数过滤结果。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生应该能够将值重新赋给变量，以便正确显示。</li></ol><h3>8. <strong>添加排序功能</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教授并添加排序功能。</li></ol><h3>9. <strong>总结</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾今天学到的内容，例如：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES6 函数：.map、filter 等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>var/let/const 的使用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>异步等待（async await）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>扩展运算符（spread operators）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>fetch 的使用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回调函数（Callback）。</li></ol><h1>JS Q&amp;A</h1><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>问答环节</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回答学员在实际操作中遇到的问题。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1c9"
        },
        {
          "code": "L42",
          "title": "REACT(2): Make it stateful",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>深入 React——JSX、组件和 Props</strong></p><p><strong>课程目标</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 JSX 的语法和作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握 React 组件的创建和使用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 Props 的基本概念及其在组件通信中的作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何在 React 中应用 CSS。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>JSX</strong>为什么需要 JSX</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>语法规则和转换原理</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>表达式插入和条件渲染</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>组件（Component）</strong>函数组件和类组件的对比</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件的生命周期（可选，或留至后续课程）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件嵌套与组合</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Props</strong>什么是 Props</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何传递和接收 Props</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props 的只读属性和默认值设置</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 和 CSS</strong>内联样式</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CSS 模块化</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>tailwind</li></ol><p><strong>实验/练习</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 JSX 编写一个包含多种元素和表达式的 React 组件。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个函数组件和一个类组件，并让它们互相嵌套。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过 Props 在父子组件间传递数据。</li></ol><p><strong>课后作业</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读官方文档中关于 JSX、组件和 Props 的部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>修改第一节课创建的 React 应用，加入新学到的 JSX 和组件技术。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1ca"
        },
        {
          "code": "L43",
          "title": "React (2): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment: Enhance the MOOC CourseCard</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add a Difficulty Level PropAdd a new prop called difficulty to the CourseCard component. This prop should represent the difficulty level of the course (e.g., \"Beginner\", \"Intermediate\", \"Advanced\").</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the difficulty level on each course card.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: You will pass the difficulty prop from the parent component (e.g., App.js).</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Change Button Text Based on Difficulty LevelModify the button text to reflect the course difficulty:For \"Beginner\" courses, the button should display \"Start Learning Now!\"</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>For \"Intermediate\" and \"Advanced\" courses, the button should display \"Enroll Now\".</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: You can use conditional rendering within the CourseCard component.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add a Review Button with StateAdd a new button labeled \"Leave a Review\" to the CourseCard.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use state to toggle between showing the \"Leave a Review\" button and a simple text input where the user can enter a review. After the user submits the review, show \"Review Submitted\" instead of the button.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: You’ll need a second piece of state to track whether the review input is visible or not.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Bonus (Optional): Track and Display Enrollment CountKeep track of how many times a course has been enrolled in using state.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Each time a user clicks the \"Enroll Now\" button, the enrollment count for that course should increase.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the enrollment count below the button, e.g., \"Enrolled: 3 times\".</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1cb"
        },
        {
          "code": "L44",
          "title": "REACT(3): Make it interactive",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 State 的基础概念及其在 React 中的重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握 State Lifting（状态提升）以及如何在组件间共享状态。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习条件渲染的基本概念和应用场景。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习 React 的思维范式，以简化代码和提高可维护性。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>State（状态）</strong>State 的定义和作用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在组件中初始化和更新 State</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>setState</strong> 的异步性质</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>State Lifting（状态提升）</strong>什么是 State Lifting</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何通过 State Lifting 实现组件间的状态共享</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>状态提升的使用场景</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>条件渲染</strong>什么是条件渲染</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用条件运算符和逻辑运算符进行条件渲染</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>列表渲染与条件渲染的结合</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 思维范式</strong>单向数据流（One-way data flow）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件化思维（Composability）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>声明式编程（Declarative Programming）</li></ol><p><strong>实验/练习</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在一个 React 组件中初始化和更新 State。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建两个或更多的组件并实践状态提升。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在一个实际应用场景中运用 React 的思维范式。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1cc"
        },
        {
          "code": "L45",
          "title": "React(3): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>Assignment: Enhance Your React Skills with Event Handling, Lists and Keys, and State Lifting</strong></h3><p><strong>Requirements:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Make use of state to manage the enrollment count and toggle features.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Implement event handling to trigger actions like submitting a review or starting a course.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use lists and keys to efficiently render the CourseCard components and manage multiple courses.</li></ol><p><strong>1. Add Course Duration Prop to CourseCard</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task: Add a new prop called duration to the CourseCard component. This prop should represent the total duration of the course (e.g., \"2 hours\", \"5 hours\", \"10 hours\").</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Requirement:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the course duration on each course card, beneath the course description.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: You will pass the duration prop from the parent component (e.g., CourseCatalog).</li></ol><p><strong>2. Customize Button Text Based on Course Completion</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task: Modify the button text to reflect whether the course is completed or not:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>If the course is completed, the button should display \"Revisit Course\".</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>If the course is not completed, the button should display \"Start Course\".</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Requirement:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add a boolean prop called isCompleted to the CourseCard component to determine the completion status.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: Use conditional rendering within the CourseCard component to change the button text based on the course's completion status.</li></ol><p><strong>3. Add a Review Button with State (Optional)</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task: Add a new button labeled \"Leave a Review\" to the CourseCard.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>When clicked, the button should toggle between showing the \"Leave a Review\" button and a simple text input where the user can enter a review.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>After the user submits the review, show \"Review Submitted\" instead of the button.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: You’ll need to add a second piece of state to track whether the review input is visible or not.</li></ol><p><strong>4. Bonus (Optional): Track and Display Enrollment Count</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task: Keep track of how many times a course has been enrolled in using state.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Each time a user clicks the \"Start Course\" button, the enrollment count for that course should increase.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the enrollment count below the button, e.g., \"Enrolled: 3 times\".</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1cd"
        },
        {
          "code": "L46",
          "title": "Lab(7)：使用React和Hooks创建分页应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React和Hooks创建分页应用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1ce"
        },
        {
          "code": "L47",
          "title": "Tutorial 05 (React) ",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>本节内容：</p><p>React常见的问题和错误</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍React和过去前端开发方式的不同，让同学们体会 （20分钟）</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React的单向数据流，提供一些flow chart供同学们参考和理解，并加深课堂知识理解(20分钟)</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>setState的异步性质，讲解并演示其中的重要步骤，加深课堂知识理解（30分钟）</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>条件渲染可能出现的问题，good practices和bad practices（30分钟）</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Q&amp;A答疑 （20分钟）</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1cf"
        },
        {
          "code": "L48",
          "title": "REACT(4): Talk to remote",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 Hooks 的基础概念和使用场景。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 Hooks 进行状态管理和副作用处理。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何调用远端 API 来获取数据。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何在 React 中渲染一个列表。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 React 组件的生命周期。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Hooks</strong>什么是 Hooks，为什么需要它</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>常用的基础 Hooks（<strong>useState</strong>, <strong>useEffect</strong> 等）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>自定义 Hooks</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>调用远端 API</strong>使用 <strong>fetch</strong> 或 <strong>axios</strong> 进行 API 调用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>异步操作和错误处理</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据渲染和更新</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>列表渲染</strong>使用 <strong>.map()</strong> 方法进行列表渲染</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>列表的 <strong>key</strong> 属性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>条件渲染与列表渲染的结合</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>组件生命周期</strong>生命周期的三个主要阶段（Mounting, Updating, Unmounting）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>生命周期方法（如 <strong>componentDidMount</strong>, <strong>componentDidUpdate</strong>, <strong>componentWillUnmount</strong>）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>生命周期与 Hooks（如 <strong>useEffect</strong>）的关联</li></ol><p><strong>实验/练习</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 <strong>useState</strong> 和 <strong>useEffect</strong> 在一个组件中管理状态和副作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用一个公开 API（例如 JSONPlaceholder）来获取数据，并在组件中展示。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用从 API 获得的数据进行列表渲染。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过一个简单的类组件展示生命周期方法的使用。</li></ol><p><strong>课后作业</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读官方文档关于 Hooks 和 API 调用的部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在之前的 React 应用中实现一个功能，该功能使用 Hooks 和 API 调用。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1d0"
        },
        {
          "code": "L49",
          "title": "React (4): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>Assignment: Fetch and Display Lecturers List</strong></h3><p><strong>Basic Assignment (For all students)</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Fetch the list of lecturers from the API endpoint: <a href=\"https://my-json-server.typicode.com/JustinHu8/courseCardMock/lecturers\" rel=\"noopener noreferrer\" target=\"_blank\">https://my-json-server.typicode.com/JustinHu8/courseCardMock/lecturers</a>.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the list of lecturers in the application using the existing components or create a new component, e.g., LecturerCard.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Requirements:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use fetch() with Promises to get the list of lecturers.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new state to hold the lecturers list.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Display the lecturers with their name and title on each card.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use a key for rendering the list of lecturers to avoid React warnings.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: Similar to how you fetched the course content, you will need to call fetch() in useEffect, handle the response, and update the state with the list of lecturers.</li></ol><p><strong>Advanced Assignment (For advanced students)</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Complete the basic assignment using fetch() and Promises.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>After completing the above, refactor the code to use async/await to fetch and display the lecturers.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Finally, try fetching the lecturers using the Axios library for comparison.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Requirements:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Fetch the lecturers using fetch() (Promise style) and async/await.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the code to use async/await for fetching the lecturers.Install Axios and fetch the lecturers using Axios.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Compare the experience and behavior.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ensure to handle errors properly in all three implementations.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hint: Start with fetch(), then refactor to async/await, and finally install Axios using npm install axios and rewrite the fetching logic using Axios.</li></ol><p>&nbsp;</p><p><strong>基础作业（适合所有学生）</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>任务：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用&nbsp;API 端点 <a href=\"https://my-json-server.typicode.com/JustinHu8/courseCardMock/lecturers\" rel=\"noopener noreferrer\" target=\"_blank\">https://my-json-server.typicode.com/JustinHu8/courseCardMock/lecturers</a> 获取讲师列表。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在应用中显示讲师列表，可以使用现有组件或创建一个新组件，如 LecturerCard。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>要求：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用&nbsp;fetch() 和 Promise 获取讲师列表。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个新状态来保存讲师列表。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>显示讲师的姓名和头衔，每个讲师都用卡片展示。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>渲染讲师列表时使用&nbsp;key 以避免 React 警告。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提示：与获取课程内容类似，你需要在&nbsp;useEffect 中调用 fetch()，处理响应并使用讲师列表更新状态。</li></ol><p><strong>高级作业（适合高级学生）</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>任务：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用&nbsp;fetch() 和 Promise 完成基础作业。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>完成后，将代码重构为使用 async/await 获取并显示讲师。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>最后，使用 Axios 库获取讲师，并比较不同方式的使用体验。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>要求：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用&nbsp;fetch()（Promise 方式）和 async/await 获取讲师。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>重构代码以使用 async/await 获取讲师数据。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>安装 Axios 并使用 Axios 获取讲师列表，比较不同实现方式的行为。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保在所有三种实现方式中妥善处理错误。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提示：先使用 fetch()，然后重构为 async/await，最后使用 npm install axios 安装 Axios 并使用 Axios 重写获取逻辑。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1d1"
        },
        {
          "code": "L50",
          "title": "REACT(5) : Thinking in React",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握 \"Thinking in React\" 的核心思想和应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解澳洲的前端开发文化。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阐述和理解代码质量（Quality of Code）的重要性。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Thinking in React</strong>React 的单向数据流</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何分解 UI 成为多个组件</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 思维范式的实际应用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>澳洲前端文化</strong>澳洲前端开发的独特点和趋势</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>常用的工具和库</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>工作流和团队协作的澳洲特色</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>代码质量的重要性</strong>代码可读性、可维护性和可扩展性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码审查和测试的重要性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>持续集成和持续部署（CI/CD）在保证代码质量中的角色</li></ol><p><strong>实验/练习</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过一个实际项目来应用 \"Thinking in React\" 的概念。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析一些在澳洲流行的前端开发项目或库。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实施代码审查和基础测试以提升代码质量。</li></ol><p><strong>课后作业</strong></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读 React 官方文档中关于 \"Thinking in React\" 的部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对一个小型项目进行代码审查，并提出改进意见。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>研究如何在您的项目中实施 CI/CD。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1d3"
        },
        {
          "code": "L51",
          "title": "React (5): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong><img src=\"https://image.jracademy.com.au/lesson/editor/66ea93794c2e690012cb7825/111085e1f5d7035dd8a2e56ae90f0658.png\"></strong></p><p><strong>Objective:</strong></p><p>Analyze the structure and functionality of the weather app design (as shown in the image) using the principles of Thinking in React. Write a detailed plan on how to approach each step in building the app. Group discussions will be conducted during the tutor session, and advanced learners may attempt to build the components.</p><p><strong>Tasks:</strong></p><p>UI Breakdown and Component Hierarchy Analysis:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Analyze the weather app design and break it down into components.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Which components do you think the weather app UI should be broken into? List each component and its functionality.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Identify parent-child relationships and determine which components will pass props to their children.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How would you organize these components into a hierarchy? Draw a component hierarchy diagram or describe the hierarchy in writing.</li></ol><p>Static Version Planning:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Plan how to create a static version of the app.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How will you structure the layout when building the static version of the app using React? List the static data each component will display.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>In your static version, which parts of the UI will be reusable components? List them and explain how they will be used.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How will these components be reused to improve the maintainability of the code?</li></ol><p>State Identification and Management:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Analyze which parts of the app require state.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Which parts of the app do you think need to use state to store dynamic data? List all necessary states.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How will you handle user interaction such as searching for a city or clicking on a city card? Describe how state will manage these interactions.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How will you implement these interactions?</li></ol><p>State Lifting Strategy:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Plan how to lift state when multiple components need access to shared data.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How will you lift the state so that multiple components can share the same data? Explain how you will pass data between different components.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Which component will manage the shared state (e.g., selected city), and how will it pass down the necessary data?</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Give an example of how data will flow between parent and child components.</li></ol><p>Bonus Challenge for Advanced Learners (Optional):</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced learners can attempt to plan how they would integrate a real weather API into the app.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>How will you call the API and handle the returned data? Describe the data flow and processing logic.</li></ol><p>Advanced Task (Optional):</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced learners can attempt to build the components as planned.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Based on your analysis, try to implement the components you have planned.</li></ol><p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c1d4"
        },
        {
          "code": "L52",
          "title": "Lab(8)：使用React和localStorage构建笔记卡片应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React和localStorage构建笔记卡片应用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1d5"
        },
        {
          "code": "L53",
          "title": "Lab(9)：使用React构建收支管理应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React构建收支管理应用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1d6"
        },
        {
          "code": "L54",
          "title": "Tutorial 06 (React)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Recap</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">setState asynchronous or synchronous?</strong></p><p><span style=\"background-color: transparent; color: rgb(0, 0, 0);\">语法上是同步函数，但是behaviour上是异步的 (调用多次会批量batchUpdate执行, 出于性能考虑)</span></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">List and keys</strong></p><p><span style=\"background-color: transparent; color: rgb(0, 0, 0);\">key? [].map((item) =&gt; &lt;div key={item.id}&gt;) id should be unique</span></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">Hooks</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">useState, useEffect(不同的生命周期调用)，useMemo, useCallback, useId, useContext</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">Component lifecycle(Mounting, Updating, Unmounting)</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">useEffect(() =&gt; {console.log(“mounting”)}, []) // mounting</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">useEffect(() =&gt; {console.log(“after updating enrollCount”)}, [enrollCount]) // updating</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">useEffect(() =&gt; {return () =&gt; {console.log(“unmounting”)}}, []) // unmounting</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">use case: remove event listener(onClick, setTimeInterval, mouseHover, windowResize, onKeyDown)</strong></p><p><strong style=\"background-color: transparent; color: rgb(0, 0, 0);\">pure function / function with side effect (fetch data, invoke callback function, etc)</strong></p><p><br></p><p><span style=\"background-color: transparent; color: rgb(0, 0, 0);\">React Assignment 3</span></p><p><span style=\"background-color: transparent; color: rgb(0, 0, 0);\">React Assignment 4</span></p><p><span style=\"background-color: transparent; color: rgb(0, 0, 0);\">React Assignment 5</span></p><p><span style=\"background-color: transparent; color: rgb(0, 0, 0);\">Q &amp; A</span></p><p><br></p>",
          "_id": "67c6cb1f6a041b1fcf12c1d7"
        },
        {
          "code": "L55",
          "title": "Project 2 介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>项目背景：</strong></h3><p>这个项目的灵感来源于MongoDB的面试题。在现代互联网应用中，与远程API的交互成为了一个关键技能。为了提高你的API交互技巧，我们为你设计了这个挑战：创建一个天气预报应用。</p><p><strong>原始 MongoDB 面试项目题</strong></p><p>The coding exercise we’d like to work on is building an app where you can input a city name to show the current weather in that city area and the forecast for the upcoming 3 days. You may use <a href=\"http://www.weatherapi.com/\" rel=\"noopener noreferrer\" target=\"_blank\">www.weatherapi.com</a>, which provides a free API to query weather data. It does require signing up to generate an API key but there is an - <a href=\"https://www.weatherapi.com/api-explorer.aspx\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.weatherapi.com/api-explorer.aspx</a> - that makes it easy to check the response.</p><p>You are free to use any frontend libraries to build this web application. Once you have built the application please send the code back to us in a .zip file (without any modules that can be fetched from the internet) so that we can clone the repository and check its functionality locally on our machine. Please provide some instructions on how to run it locally in the readme. Feel free to comment on the readme any design decisions or assumptions that were made while you built this application.</p><p>We will spend some time discussing your solution during the programming interview. Please treat this task like a feature you would build as an engineer using developer best practices and deploy in a production ready state.</p><p>Please ensure add some unit test &amp; e2e test if possible.</p><h3><br></h3><h3><strong>项目要求：</strong></h3><p><strong>核心功能</strong>：</p><ul><li class=\"ql-indent-1\">允许用户输入城市名称。</li><li class=\"ql-indent-1\">显示该城市当前的天气情况。</li><li class=\"ql-indent-1\">提供未来三天的天气预报。</li></ul><p><strong>数据来源</strong>：请使用<a href=\"http://www.weatherapi.com/\" rel=\"noopener noreferrer\" target=\"_blank\">www.weatherapi.com</a>。它提供了一个免费的API来查询天气数据。需要https://www.weatherapi.com/api-explorer.aspx 可以轻松检查响应。</p><p><strong>技术栈选择</strong>：你可以自由选择任何前端库来构建此网络应用。</p><p><strong>项目提交</strong>：</p><ul><li class=\"ql-indent-1\">请将代码上传到github中（不包括可以从互联网获取的模块）并提交，这样我们可以Clone repo并在我们的机器上本地检查其功能。</li><li class=\"ql-indent-1\">在readme中提供关于如何在本地运行的说明。</li><li class=\"ql-indent-1\">在readme中，你可以评论在构建此应用程序时做出的任何设计决策或假设。</li></ul><p><strong>代码质量</strong>：我们希望你像处理真正的工程任务那样对待这个任务，使用开发者的最佳实践，并确保它处于生产就绪状态。</p><p><strong>测试</strong>：请确保添加一些单元测试和e2e测试（如果可能的话）。</p><h3><br></h3><h3><strong>项目目标：</strong></h3><ul><li>提高与API的交互能力。</li><li>熟悉前端框架和库的使用。</li><li>加强代码组织和架构设计技能。</li><li>提高测试驱动开发的能力</li></ul>",
          "_id": "67c6cb1f6a041b1fcf12c1d9"
        },
        {
          "code": "L56",
          "title": "Project 2 Tutorial 01",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>介绍</strong></p><p>在这部分，我们将概述整个项目的框架。你们将了解到，我们为什么选择天气预报应用作为学习项目，以及它如何帮助你们在现实世界中应用编程技能。这将是一次从零开始构建一个完整网络应用的旅程。</p><p><strong>天气应用项目的要求</strong></p><p>我们将详细讨论项目的具体要求，包括用户能够输入城市名称、查看当前天气状况以及获取未来三天的天气预报等功能。这将帮助你们理解项目的核心目标和功能。</p><p><strong>完成项目的目标</strong></p><p>这个环节会让你们明白，完成这个项目不仅仅是为了制作一个应用，而是为了提升你们的技术能力，如 API 交互、前端框架的应用、代码组织和架构设计技能，以及测试驱动开发的实践。</p><p><strong>项目的设计图介绍与分析</strong></p><p>我们将一起审视项目的设计图，分析应用的用户界面和用户体验方面。这将帮助你们理解如何从用户的角度来思考，并将这种思维转化为实际的代码和设计实现。</p><p><strong>完成这个项目需要的技术栈</strong></p><p>在这个环节，我们将讨论构建该应用所需的技术栈，包括前端框架、API 请求处理、状态管理等。无论你们是刚接触前端开发，还是希望巩固已有知识，这都将是一个极好的学习机会。</p><p><strong>React 项目框架搭建</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>环境设置</strong>：通过配置开发环境来搭建 React 项目，包括安装必要的依赖和工具。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目结构</strong>：创建项目的基础结构，包括设置路由、状态管理等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>基础代码编写</strong>：编写一些基础代码，确保项目能够顺利运行。</li></ol><p><strong>组件命名</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>命名规则</strong>：明确组件命名的最佳实践，这有助于提高代码的可读性和可维护性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实际操作</strong>：我们将实际命名一些将在项目中使用的组件，并解释这些命名背后的逻辑。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1da"
        },
        {
          "code": "L57",
          "title": "利用AWS部署前端spa项目",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>利用AWS部署前端spa项目</p>",
          "_id": "67c6cb1f6a041b1fcf12c1db"
        },
        {
          "code": "L58",
          "title": "Tutorial 07 (C#开发环境设置)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "67c6cb1f6a041b1fcf12c1dc"
        },
        {
          "code": "L59",
          "title": "Project 2 Tutorial 02",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>布局设计</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>用户界面规划</strong>：首先，我们将对天气应用的用户界面进行详细规划。这包括定义主要视图（如主页、详细天气页）及其组件（如天气摘要、预报列表、搜索栏）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>信息架构</strong>：深入探讨如何组织信息，使用户能够轻松理解和访问天气数据。这涉及到决定哪些信息是首要显示的，以及如何逻辑地组织次要信息。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>交互设计</strong>：考虑用户与应用交互的方式，如搜索城市、切换温度单位等。这将影响布局的设计和组件的放置。</li></ol><p><strong>静态页面实现</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>HTML结构</strong>：创建HTML文档结构，构建应用的骨架。这包括定义必要的HTML元素，如头部、导航栏、内容区域和底部。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>组件化开发</strong>：将界面分解为可重用的组件，这有助于提高代码的可维护性和可扩展性。例如，将天气卡片、搜索栏等元素作为独立组件。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>布局技术</strong>：创建响应式布局，确保内容在不同屏幕大小下都能有效地展示。</li></ol><p><strong>样式和响应式</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>样式定义</strong>：利用CSS或CSS预处理器来定义样式。这包括设置颜色主题、字体、边距、间隔等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>视觉吸引力</strong>：强调视觉吸引力和品牌一致性，确保应用的外观既美观又专业。包括颜色搭配、字体选择、图标使用等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>响应式设计</strong>：实现响应式设计，确保应用在不同设备上都能提供良好的用户体验。这可能涉及到使用媒体查询、弹性布局等技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>交互动效</strong>：考虑添加一些CSS动画和过渡效果来提升用户体验，如加载动画、按钮悬停效果等。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1dd"
        },
        {
          "code": "L60",
          "title": ".NET(1):C#编程语言基础",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C#编程语言基础</p>",
          "_id": "67c6cb1f6a041b1fcf12c1de"
        },
        {
          "code": "L61",
          "title": ".NET(1): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><p>1&gt;变量练习：</p><p>定义四个变量,分别存储一个人的姓名、性别(Gender)、年龄、电话 TelephoneNumber)。然后打印在屏幕上 (我叫X,我今年 X岁了,我是X生, 我的电话是XX)(电话号用什么类型,如:010-12345)</p><p>2&gt;算数运算符练习： 某商店T恤(T-shirt)的价格为35元/件, 裤子(trousers)的价格为120元/条.小明在该店买了3件T恤和2条裤子, 请计算并显示小明应该付多少钱?</p><p>3&gt;占位符练习： 编程实现计算几天(如46天)是几周零几 天. 6周零4天</p><p>4&gt;$练习： 编程实现107653秒是几天几小时几分钟几秒?</p><p>5&gt;if 语句练习： 提示用户输入用户名，然后再提示输入密码，如果用户名是“admin”并且密码是“88888”， 则提示正确，否则，如果用户名不是admin还提示用户用户名不存在, 如果用户名是admin则提示密码错误.</p><p>6&gt;switch case 练习： 李四的年终工作评定,如果定为A级,则工资涨500元,如果定为B级, 则工资涨200元,如果定为C级,工资不变,如果定为D级工资降200元, 如果定为E级工资降500元. 设李四的原工资为5000,请用户输入李四的评级,然后显示李四来年的工资</p><p>7&gt;请用户输年份,再输入月份,输出该月的天数，判断输入的是不是闰年</p><p>8&gt;while 练习： 老师问学生,这道题你会做了吗?如果学生答\"会了(y)\", 如果学生不会做(n),则老师再讲一遍,再问学生是否会做了...... 直到学生会为止,才可以放学. 直到学生会或老师给他讲了10遍还不会,都要放学</p><p>9&gt; do-while 练习： 不断要求用户输入学生姓名,输入q结束.</p><p>10&gt;for 循环练习： 找出100-999间的水仙花数? 水仙花数指的就是 这个百位数字的 百位的立方+十位的立方+个位的立方==当前这个百位数字</p><p>11&gt;循环嵌套练习：打印乘法口诀表</p><p>12&gt; 循环嵌套练习(必会的简单算法）： int[] nums = { 1, 4, 3, 9, 6, 8, 11 }; 对这个数组元素做升序排序</p><p>13&gt;方法练习： 计算两个整数之间的最大值并且将最大值返回</p><p>14&gt;.数组和方法的练习： 计算一个整数类型数组的总和</p><p>15&gt;.方法out 练习： //分别的提示用户输入用户名和密码 你写一个方法来判断用户输入的是否正确 返回给用户一个登陆结果，并且还要单独的返回给用户一个登陆信息 如果用户名错误，除了返回登陆结果之外，还要返回一个 \"用户名错误\"</p><p>16&gt;.ref 练习： 使用方法来交换两个int类型的变量</p><p> </p><h2>Advanced Assignment：</h2><p>开发一个简单的控制台小游戏。这个游戏有以下几部分：</p><p><strong>需求说明：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>游戏头：首先绘制游戏的标题和说明。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化地图：加载地图资源，将整数数组中的数字转换为控制台显示的特殊字符串，这个过程就是初始化地图。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>绘制地图：显示初始化后的地图，并在控制台中展示玩家的位置和特殊事件。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>游戏逻辑：定义游戏的规则，处理玩家的移动和触发的事件。</li></ol><p><strong>游戏规则：</strong></p><p>• 踩到玩家B：玩家A踩到玩家B时，玩家B退6格。</p><p>• 踩到地雷：玩家踩到地雷，退6格。</p><p>• 踩到时空隧道：玩家踩到时空隧道，前进10格。</p><p>• 踩到幸运轮盘：幸运轮盘有两种可能：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>交换位置。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>轰炸对方，使对方退6格。</li></ol><p>• 踩到暂停：暂停一回合。</p><p>• 踩到方块：什么都不做。</p><p><strong>实现步骤：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义地图中的元素：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>玩家 A 和 B。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>特殊事件：地雷、时空隧道、幸运轮盘、暂停、普通方块。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>控制台特殊符号显示：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>玩家A：A</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>玩家B：B</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>地雷：X</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>时空隧道：O</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>幸运轮盘：L</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>暂停：P</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>普通方块：[]</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1df"
        },
        {
          "code": "L62",
          "title": "Project 2 Tutorial 03",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>功能实现</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>交互实现</strong>：为页面添加交互功能，包括处理用户输入、显示数据、以及响应用户操作等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>状态管理</strong>：管理组件状态，如表单输入验证、条件渲染等。</li></ol><p><strong>连接 API</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>API 集成</strong>：我们将学习如何使用 HTTP 客户端（如 axios 或 fetch）连接到 Weather API，获取所需的天气数据。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>数据处理</strong>：处理 API 响应，包括解析数据、错误处理以及状态更新。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>动态显示数据</strong>：将从 API 获取的数据动态展示在用户界面上。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>调试与测试</strong>：编写测试来验证 API 集成的功能。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1e0"
        },
        {
          "code": "L63",
          "title": ".NET(2): Basic OOP Fundamental",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>面向对象编程（OOP）四大基本原则</strong>：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>抽象（Abstraction）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>封装（Encapsulation）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>继承（Inheritance）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多态（Polymorphism）</li></ol><p><strong>类和对象</strong>：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过实践创建类（class）来深入理解</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>构造函数（Constructor）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>访问控制：public / protected / private</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Partial 类 / Static 静态类 / Seal 类</li></ol><p><strong>通过 C# 代码详细介绍 OOP 四大原则</strong>：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>封装（Encapsulation）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码演示和解释封装的实现方法</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>继承（Inheritance）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释继承的作用：代码重用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示基类（base class）与派生类（derived class）的关系</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>抽象（Abstract）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义抽象：隐藏细节，提炼出定义</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>抽象的好处：可扩展性、易于测试、解耦、防止误修改</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 C# 中实现抽象的方式：接口（interface）和抽象类（abstract class）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>多态（Polymorphism）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>浅显易懂地解释多态：初次接触，晦涩难懂的概念简化</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多态的分类：静态多态（编译时）和动态多态（运行时）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>C# 代码实践：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过方法重载（overload）实现静态多态</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过方法重写（override）实现动态多态</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过 override 实现的动态多态，无需修改原有代码即可扩展功能</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1e1"
        },
        {
          "code": "L64",
          "title": ".NET(2): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2>Assignment</h2><p>创建一个console app，设计几个类，除了下面的属性或者字段，可以添加其他信息</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类及其成员的定义 定义一个 基类 Course class，包含 ID 课程名 分数 学生ID数组（因为有可能多个学生选同样的课）课时数（属性或者字段，推荐属性）</li></ol><p>Student class，包含 ID 姓名 年龄 课程数组（因为一个学生可以选择多个课程 这里的课程可以是课程的ID或者是课程的Object）</p><p>Teacher class，包含 ID 姓名 所授课程数组（考虑到一个老师肯能教授多个课 这里的课程可以是课程的ID或者是课程的Object）</p><p><br></p><p>2. 继承 定义继承于 Course class的子类 - C# 课程，HTML课程，React课程</p><p>3. 使用上面定义的类，学习如何应用类和继承</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.1 初始化对象 - 课程对象数组（3门课程），Teachers数组（3个 Teachers对应三个不同的课程），学生对象数组（若干 例如10 个学生 对象）（使用new 调用构造函数来创建对象）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.2 将老师-学生-课程 关联起来（例如 A老师教授 C#课程，有3个同学报名学习，B老师教授 HTML课程，有2个同学报名学习 ......）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.3 在Teacher class 中定义一个方法 打印出 该老师 所授课 以及报名学生的信息</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.4 在Course class中定义一个方法 打印出 该课程成绩 Top3 的学生的信息</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1e2"
        },
        {
          "code": "L65",
          "title": "Tutorial 08",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "67c6cb1f6a041b1fcf12c1e3"
        },
        {
          "code": "L66",
          "title": "Tutorial 10（Web API环境配置）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Web API环境配置</p>",
          "_id": "67c6cb1f6a041b1fcf12c1e4"
        },
        {
          "code": "L67",
          "title": ".NET(3): 高级面向对象",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>高级面向对象</p>",
          "_id": "67c6cb1f6a041b1fcf12c1e5"
        },
        {
          "code": "L68",
          "title": ".NET(3): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>本次作业在第一节面向对象的作业基础上</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习多态 - 方法重载overload 和重写override</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>选择接口和抽象类</li></ol><p><br></p><p>1. 自行选择一个类 在其中创建 至少两个重载方法并调用 目的是理解 什么是编译时多态(静态多态)</p><p>2. 创建一个base class - Faculty, 并在其中定义</p><p>2.1 Properties – (please consider whether need abstract)</p><p>Activities (教学目标, 可以是string[], List&lt;string&gt;, 或者自定义一个Activity Class)</p><p>Lectures (教学资料/讲义, 定义类型同上)</p><p>2.2 abstract methods - PlanLearningActivities</p><p>- PreparationLectures</p><p>2.3 virtual methods （with default implementation）</p><p>- DefineLearningObjectives() //自己决定需不需要参数并定义参数的类型和数量</p><p>2.4 定义继承于 Faculty 的类, 并实现上述的abstract/virtual methods</p><p>Professor</p><p>Tutor</p><p>Instructor</p><p>3. 定义一个Interface – IRefer with a method ReferTheJob. 只有Professor有refer job的功能. 请在Professor中实现该接口, 具体要求是 仅给 Grade A 的同学refer job.</p><p>定义一个Interface – IAssess with method AssessStudentGrade. 只有Tutor有给学生打分评级的功能</p><p>定义另一个Interface – INotify with a method Notification. 只有Instructor有notify的职责来通知student上课。</p><p>4. 请创建一个Professor object, 一个Tutor object, 一个Instructor, 打印出各自的</p><p>Learning Activities</p><p>Prepared Lectures</p><p><br></p><p>请创建10个学生，仅仅需要一个C# Course，不需要多个Course</p><p>实现</p><p>Instructor通知学生上课</p><p>Tutor给学生打分评级</p><p>Professor推荐Grade A同学job. （可以通过Console.WriteLine()输出模拟）</p>",
          "_id": "67c6cb1f6a041b1fcf12c1e6"
        },
        {
          "code": "L69",
          "title": ".NET(4): C# 常用集合类型详解",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C# 常用集合类型详解</p>",
          "_id": "67c6cb1f6a041b1fcf12c1e7"
        },
        {
          "code": "L70",
          "title": ".NET(4): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Please create a collection of students with the courses - C#, HTML and React, please set the scores of the courses</strong></p><p><br></p><p>1. Please select the proper collection type to print out the unique scores for each course, no duplicated scores printed out</p><p>e.g. C# course, scores are 70, 80, 90, 95, 96, 99.</p><p>HTML course, scores are 75, 81, 94, 96, 98, 99.</p><p>React course, scores are 85, 88, 64, 76, 99, 100.</p><p><br></p><p>2. Please select one collection type from HashTable/Dictionary/SortedList to store the scores for each course of each student and print them out:</p><p>Note: Please use the \"student Name + course Name\" as the key, and score as the value, e.g.</p><p><br></p><p>Key: James Hush C#</p><p>Value: 80</p><p><br></p><p>One edge case: Please test the edge case - two students with same Name, for same course, is it possible to store both of them in the selected collection (HashTable/Dictionary/SortedList)?</p><p><br></p><p>3. Please use Lookup to represents a collection of keys each mapped to one or more values.</p><p>Need store the course score and student names, then print out:</p><p>e.g. for C# course, please use the score as the key, student name as the values, Print the student course scores in grouping format</p><p><br></p><p>Key: 80</p><p>Value: James Hush, Luck Linton, Jack Matt, ......</p><p>Print output:</p><p>80: James Hush, Luck Linton, Jack Matt, ......</p><p><br></p><p>Key: 90</p><p>Value: Mike Lu, Jimmy Hugh, Penny A, ......</p><p>Print output:</p><p>90: Mike Lu, Jimmy Hugh, Penny A, ......</p><p><br></p><p>4. Implement Undo and Redo features</p><p>Given an array of strings Q[], consisting of queries of the following types:</p><p><br></p><p>“WRITE X”: Write a character X into the array.</p><p>“UNDO”: Erases the last change made to the array.</p><p>“REDO”: Restores the most recent UNDO operation performed on the array.</p><p>“READ”: Reads and prints the contents of the array.</p><p><br></p><p>Examples:</p><p>Input: Q = {“WRITE A”, “WRITE B”, “WRITE C”, “UNDO”, “READ”, “REDO”, “READ”}</p><p>Output: AB ABC</p><p>Explanation:</p><p>Perform “WRITE A” on the document. Therefore, the document contains only “A”.</p><p>Perform “WRITE B” on the document. Therefore, the document contains “AB”.</p><p>Perform “WRITE C” on the document. Therefore, the document contains “ABC”.</p><p>Perform “UNDO” on the document. Therefore, the document contains “AB”.</p><p>Perform \"READ” to Print the contents of the document, i.e. “AB”</p><p>Perform “REDO” on the document. Therefore, the document contains “ABC”.</p><p>Perform \"READ” to Print the contents of the document, i.e. “ABC”</p><p><br></p><p>Input: Q = {“WRITE x”, “WRITE y”, “UNDO”, “WRITE z”, “READ”, “REDO”, “READ”}</p><p>Output:xz xzy</p><p><br></p><p>Approach: The problem can be solved using Stack. Follow the steps below to solve the problem:</p><p><br></p><p>Initialize two stacks, say Undo and Redo.</p><p>Traverse the array of strings, Q, and perform the following operations:</p><p>If “WRITE” string is encountered, push the character to Undo stack</p><p>If “UNDO” string is encountered, pop the top element from Undo stack and push it to Redo stack.</p><p>If “REDO” string is encountered, pop the top element of Redo stack and push it into the Undo stack.</p><p>If “READ” string is encountered, print all the elements of the Undo stack in reverse order.</p><p><br></p><p>Define below string array, after invoking the method, print out the correct result:</p><p>string[] Q = { \"WRITE A\", \"WRITE B\", \"WRITE C\", \"UNDO\", \"READ\", \"REDO\", \"READ\" };</p><h3><strong>QUERY(Q);</strong></h3>",
          "_id": "67c6cb1f6a041b1fcf12c1e8"
        },
        {
          "code": "L71",
          "title": "Tutorial 09",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "67c6cb1f6a041b1fcf12c1e9"
        },
        {
          "code": "L72",
          "title": ".NET(5): 构建WEB API项目以及相关技术-概念介绍,管道 中间件,MVC",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">概念API 与 Web API </strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">什么是 API？ API 有什么作用？</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 是什么？</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">HTTP 请求类型 &amp;状态码</span></li></ol><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">.Net 项目中的Web API</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">怎么创建Web API 在Visual Studio</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 项目结构</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">builder.Services--依赖注入容器</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">管道 中间件</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">MVC 架构模式，模型&amp;控制器</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Controller（控制器） 和 Action（动作方法）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 最常用返回类型--JsonResult </span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">路由(Routing) &amp; 属性路由（Attribute Routing）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">路由传值</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Postman 测试api</span></li></ol><p><br></p>",
          "_id": "67c6cb1f6a041b1fcf12c1ea"
        },
        {
          "code": "L73",
          "title": ".NET(5): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业要求：</strong></p><p>使用 Web API 和 REST API 实现增删改查操作，支持多种传参方式，并使用模型类和模型验证。所有 API 都需要在 Postman 中测试通过，返回类型为 JsonResult。</p><p><br></p><p><strong>基本要求：</strong></p><p><strong>1.UserController：</strong></p><p>○ 使用 普通 Web API 实现用户的增删改查操作，支持以下三种传参方式：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路径参数（Route Parameters）：通过 URL 路径传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>查询字符串参数（Query String Parameters）：通过 ? 后的查询字符串传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>请求体参数（Request Body Parameters）：通过 POST、PUT 请求的请求体传递复杂的对象。 ○ 要求在 POST 和 PUT 请求中尝试使用 [FromBody] 和 [FromForm] 两种不同方式传递数据。 ○ 所有 API 返回类型为 JsonResult。</li></ol><p><br></p><p><strong>2. TeacherController：</strong></p><p>○ 使用 RESTful API 实现教师的增删改查操作，支持同样的三种传参方式：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路径参数（Route Parameters）：通过 URL 路径传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>查询字符串参数（Query String Parameters）：通过 ? 后的查询字符串传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>请求体参数（Request Body Parameters）：通过 POST、PUT 请求的请求体传递复杂的对象。 ○ 同样要求在 POST 和 PUT 请求中尝试使用 [FromBody] 和 [FromForm] 两种不同方式传递数据。 ○ 所有 API 返回类型为 JsonResult。</li></ol><p><br></p><p><strong>模型类与验证要求：</strong></p><p><strong>User 模型：</strong></p><p>• <strong>字段包括： </strong></p><p>○ UserName：用户的姓名。</p><p>○ Email：用户的邮箱地址。</p><p>○ Adress：用户的地址。</p><p>○ Gender：用户的性别（枚举类型：Male, Female, Other）。</p><p>○ Password：用户的密码。</p><p>○ Phone：用户的电话。</p><p>• <strong>验证要求：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>UserName：不能为空。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Email：必须符合电子邮件格式。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Phone：必须符合自定义的澳洲电话号码格式（通过自定义模型验证实现）。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Gender：必须为枚举类型 Male, Female 或 Other。</li></ol><p><br></p><p><strong>Teacher 模型：</strong></p><p><strong>• 字段包括： </strong></p><p>○ UserId：外键，指向 User 表，必须提供。</p><p>○ Department：教师所在的部门，不能为空。</p><p>○ Description：教师的描述，最长 500 字符。</p><p>○ Specialty：教师擅长的课程。</p><p>• <strong>验证要求：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Description：长度不能超过 500 字符。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>UserId：必须提供，指向 User 表的外键。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Department：不能为空。</li></ol><p><br></p><p><strong>传参方式详细功能：</strong></p><p><strong>1. 路径参数传值：</strong></p><p>○ 通过 URL 路径传递参数，示例：</p><p>§ /api/user/{id}：通过用户 ID 获取用户信息。</p><p>§ /api/teacher/{id}：通过教师 ID 获取教师信息。</p><p><strong>2. 查询字符串传值：</strong></p><p>○ 通过 ? 后面的查询字符串传递参数，示例：</p><p>§ /api/user?email=user@example.com：根据用户的 Email 获取用户信息。</p><p>§ /api/teacher?email=teacher@example.com：根据教师的 Email 获取教师信息。</p><p><strong>3. 请求体参数传值：</strong></p><p>○ 通过 POST 或 PUT 请求体传递对象，使用 [FromBody] 或 `[FromForm]：</p><p>§ 使用 POST 请求创建用户，将完整的用户数据以 JSON 格式或表单格式放入请求体中。</p><h3>§ 使用 PUT 请求更新教师数据，将完整的教师数据以 JSON 格式或表单格式放入请求体中。</h3>",
          "_id": "67c6cb1f6a041b1fcf12c1eb"
        },
        {
          "code": "L74",
          "title": "Tutorial 11",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(3) 作业讲评&amp;答疑</p><p>.NET(4) 作业讲评&amp;答疑</p>",
          "_id": "67c6cb1f6a041b1fcf12c1ec"
        },
        {
          "code": "L75",
          "title": ".NET(6)：构建WEB API项目相关技术 - 特性，模型验证，自定义模型验证，切面编程，过滤器，自定义中间件",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">Web API 相关技术</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">泛型概念及用法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">.Net 内置的泛型集合</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入（Dependency Injection, DI)&amp;控制反转（Inversion of Control, IoC）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入生命周期</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">在Web Api 常见的依赖注入应用</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web Api 中的异步编程</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">扩展方法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Restful API</span></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1ed"
        },
        {
          "code": "L76",
          "title": ".NET(6): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><p>1&gt; 在第一次Web API 作业的基础上，新增的要求是引入统一的返回类型，要求所有 API 的返回结构保持一致，以提高代码的可读性、可维护性，并确保每个 API 都能够提供一致的响应格式，方便前端和其他调用方处理返回数据。</p><p>统一返回类型要求： • 统一返回结构： 所有 API 返回类型应包含以下几个属性：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Success: 用于表示操作是否成功。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Message: 操作成功或失败的消息。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Data: 返回的具体数据，可以为空。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Errors: 若操作失败时，返回错误信息列表。 • 使用泛型（Generic）： 通过泛型类实现统一返回结构，确保不同类型的数据也能够通过统一的返回结构进行传递。</li></ol><p><br></p><p>2&gt; 实现一个继承自 ActionFilterAttribute 的自定义过滤器，并在每个 Action 执行前拦截请求，获取 Action 名称和参数信息。</p><p><br></p><p>3&gt; 创建一个 CustomExceptionFilter 类，实现 IExceptionFilter 接口。 在 API 中抛出的所有异常都应被过滤器捕获，并返回带有统一结构的类型（之前的统一返回）响应。 要求在所有控制器中应用此 ExceptionFilter。</p><p><br></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>4&gt; 创建一个 Result Filter： 该过滤器应在 Action 执行结束后，对结果进行拦截并进行必要的修改。 在项目中应用 Result Filter： 要求在所有控制器中应用这个过滤器，并对返回结果进行统一的处理。 返回格式： 保证返回结果依旧使用之前定义的统一返回格式，并且可以在成功的响应中添加成功的时间戳。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1ee"
        },
        {
          "code": "L77",
          "title": ".NET(7)：构建WEB API项目相关技术 - 泛型，依赖注入声明周期，异步编程，扩展方法",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">Web API 相关技术</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">泛型概念及用法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">.Net 内置的泛型集合</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入（Dependency Injection, DI)&amp;控制反转（Inversion of Control, IoC）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入生命周期</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">在Web Api 常见的依赖注入应用</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web Api 中的异步编程</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">扩展方法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Restful API</span></li></ol><p><br></p>",
          "_id": "67c6cb1f6a041b1fcf12c1ef"
        },
        {
          "code": "L78",
          "title": ".NET(7): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Assignment: CRUD Operations with MySQL and <a href=\"http://ado.net/\" rel=\"noopener noreferrer\" target=\"_blank\">ADO.NET</a></h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup</strong></li></ol><p>Task: Create a user table in MySQL with the following columns: id (Primary Key, int, auto-increment)</p><p>username (varchar(45))</p><p>password (varchar(45))</p><p>email (varchar(200))</p><p>age (int)</p><p>gender (int) </p><p>active (bool, corresponds to BINARY(1) in the database)</p><p>address (varchar(500))</p><p><strong>2. UserService Implementation</strong></p><p>Task: Create a UserService class that implements the IUserService interface. Use <a href=\"http://ado.net/\" rel=\"noopener noreferrer\" target=\"_blank\">ADO.NET</a> to implement the following methods:</p><p>Insert (Create new user)</p><p>Update (Modify user details)</p><p>Delete (Remove a user)</p><p>Search (Query users)</p><p>Data Retrieval Methods:</p><p>Implement two ways to retrieve data:</p><p>Row-by-Row reading (using MySqlDataReader)</p><p>MySqlDataAdapter for data handling.</p><p><strong>3. UserController</strong></p><p>Task: Create a UserController class and write the necessary Action methods to handle CRUD operations (Create, Read, Update, Delete) by calling the methods from UserService.</p><p>Use Dependency Injection to inject UserService into UserController.</p><p>Register the IUserService interface and its implementation (UserService) in the DI container for proper service resolution.</p><p><strong>4. API Testing with Postman</strong></p><p>Task: Test the CRUD operations using Postman to ensure all API endpoints for creating, reading, updating, and deleting users work as expected.</p>",
          "_id": "67c6cb1f6a041b1fcf12c1f0"
        },
        {
          "code": "L79",
          "title": "REACT(6): Redux & Redux Thunk",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握 Single Page Application（SPA）中路由的基础概念和应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解和应用 React 的 Context API。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 Redux 的基础概念。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比 Context 和 Redux，了解各自的优缺点和适用场景。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>SPA与路由</strong>什么是 SPA，为什么需要路由</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用 <strong>react-router-dom</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路由参数和路由守卫</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context 的作用</strong>什么是 Context，为什么需要它</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建和使用 Context</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Context 与全局状态管理的关系</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Redux 基础概念</strong>什么是 Redux，Redux 的三大原则</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Redux 的工作流程（Action, Reducer, Store）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在 React 应用中集成 Redux</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context 与 Redux 的对比</strong>使用场景</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优缺点分析</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际应用中的选择依据</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>SPA、Context 和 Redux 的结合</strong>使用 Context 或 Redux 管理路由状态</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实例：用户认证状态管理</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态路由与 Context 或 Redux 的结合</li></ol><p><strong>实验/练习</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个简单的 SPA，实现基础路由功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 SPA 中应用 Context API 和 Redux 来管理全局状态（例如，用户登录状态）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>结合路由、Context 和 Redux，实现一个具有用户认证的小型应用。</li></ol><p><strong>课后作业</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读官方文档关于 <strong>react-router-dom</strong>、Context API 和 Redux 的部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为一个现有的 SPA 添加路由守卫功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Context 和 Redux 进一步优化您的 SPA。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1f2"
        },
        {
          "code": "L80",
          "title": "React (6): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>Assignment:&nbsp;Enhance Your React Skills with Routing, Context API, and Redux</strong></h3><h3><strong>Implement Routing and Authentication Using Context API</strong></h3><p><strong>Task 1: Implement Navigation and Routing</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add a navigation system using React Router with the following routes:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>/: Home page (Displays a welcome message)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>/courses: Course list page (Displays a list of courses)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>/profile: User profile page (Accessible only when logged in)</li></ol><p>Requirements:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use React Router's Link component for navigation.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Set up a route for each page in your app using Route.</li></ol><p>Hint:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>You can create simple placeholder components for each page (e.g., &lt;HomePage /&gt;, &lt;CoursesPage /&gt;, and &lt;ProfilePage /&gt;).</li></ol><p><strong>Task 2: Add User Authentication with Context API</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use Context API to manage the user authentication state (logged-in or not).</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add a login button on the home page that sets the user as logged in.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Restrict access to the Profile Page so that only logged-in users can view it. If a user is not logged in, redirect them to the login page.</li></ol><p>Requirements:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create an AuthContext that manages user and isAuthenticated state.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use the useContext hook in components to check if the user is logged in.</li></ol><p>Hint:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Implement conditional routing with Redirect to protect the profile page.</li></ol><p><strong>(Optional task for fast learner): Implement Global State with Redux</strong></p><p>Task: Add Course Enrollment State Using Redux</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Implement global state management using Redux to track enrolled courses across different components.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add an \"Enroll\" button to each course card that, when clicked, adds the course to a list of enrolled courses.</li></ol><p>Requirements:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use Redux to manage the list of enrolled courses in the global state.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use useDispatch to dispatch an action when a user enrolls in a course.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use useSelector to display enrolled courses on the Profile Page.</li></ol><p>Hint:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create an enroll action and a corresponding reducer to handle course enrollment.</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1f3"
        },
        {
          "code": "L81",
          "title": "Tutorial 12",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(5) 作业讲评&amp;答疑</p><p>.NET(6) 作业讲评&amp;答疑</p>",
          "_id": "67c6cb1f6a041b1fcf12c1f4"
        },
        {
          "code": "L82",
          "title": "Lab(10)：使用React, Hooks和Redux Toolkit构建图书馆应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React, Hooks和Redux Toolkit构建图书馆应用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1f5"
        },
        {
          "code": "L83",
          "title": "Lab(11)：使用React和Express构建图像上传应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React和Express构建图像上传应用</p>",
          "_id": "67c6cb1f6a041b1fcf12c1f6"
        },
        {
          "code": "L84",
          "title": ".NET(8): 构建WEB API项目相关技术 - 数据库，SQL Script，ADO.NET",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">数据库 &amp; SQL Script</strong></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">ADO.NET</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">ADO.NET 的主要功能</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 如何使用ado.net</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">用ADO.NET 写insert 和seache 方法</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Using的用法和参数化查询 防止sql 注入</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\"> ADO.NET 读取数据的三种方式</span></li></ol><p><span style=\"color: rgb(0, 0, 0);\"> </span></p>",
          "_id": "67c6cb1f6a041b1fcf12c1f7"
        },
        {
          "code": "L85",
          "title": ".NET(8): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>创建模型并生成数据库表</strong>Category 模型：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>属性：</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Id（主键）</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>categoryName：分类名称</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CategoryLevel：分类级别（用于表示是一级分类还是二级分类）</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ParentId：父分类的 Id，用于实现分类的层级关系。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>说明：这个模型主要用于表示分类层次关系，比如 IT 是一级分类，software 是 IT 的子分类。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Course 模型：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>属性：</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Id（主键）</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CourseName：课程名称</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Description：课程描述</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CategoryId：外键，关联 Category，表示课程所属的分类。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>关系：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>一个 Category 可以有多个 Course，即 Category 与 Course 是一对多的关系。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Category 模型本身也有自关联，ParentId 用来实现分类的父子关系。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>在 DbContext 中实现模型和关系</strong>在 EF Core 的 DbContext 中，创建 DbSet&lt;Category&gt; 和 DbSet&lt;Course&gt;，并通过 Fluent API 或数据注解来配置 Category 与 Course 之间的一对多关系，以及 Category 的自关联（ParentId）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>配置数据库连接</strong>在项目的 appsettings.json 或 Program.cs 中配置数据库连接字符串。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 EF Core Migrations 生成数据库表。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实现 REST API 和普通 API</strong>Category 的 API：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 REST API 设计，提供增删改查（CRUD）操作。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>例如：GET /api/category 获取所有分类，POST /api/category 创建新分类。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Course 的 API：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供常规的增删改查 API。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>例如：GET /api/course 获取所有课程，POST /api/course 创建新课程。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>配置 NLog</strong>参考 NLog 官方文档。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在你的 API 操作或服务层中，针对重要的操作（例如，创建、删除、更新数据）写日志，记录这些操作的执行情况和错误。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>配置 Swagger</strong>参考 Swagger 官方文档。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置 Swagger 来自动生成 API 文档，并通过 Swagger UI 测试 API 的各个 endpoint。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>进阶部分（JWT 身份验证）</strong>JWT 配置：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现 JWT 生成功能，在用户登录时生成 Token。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 API 中校验前端传来的 Token 是否有效，使用 JWT 来保护 API 路由。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Swagger 的 Authorization：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 Swagger 中配置 Authorization，使得 Swagger UI 能够发送带有 JWT 的请求，以便测试受保护的 API。</li></ol><h3>完整的流程：</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建 Category 和 Course 模型，定义好表的关系。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 DbContext 中配置这些模型。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置数据库连接并生成数据库表。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现 Category 和 Course 的 API，完成 CRUD 操作。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置 NLog，记录日志信息。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置 Swagger，生成 API 文档并测试 API。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>进阶部分：使用 JWT 实现身份验证，并配置 Swagger 进行 JWT 保护的 API 测试。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c1f8"
        },
        {
          "code": "L86",
          "title": "Project 3介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>项目背景</strong></h3><p>在现实世界中，创业公司通常需要快速开发产品并应对市场的变化。这个项目将模拟一个创业公司的实际情景，让你和你的团队合作，创建一个创新的软件产品。</p><h3><br></h3><h3><strong>项目任务</strong></h3><p>你将加入到一个由你的同学组成的团队中，该团队将一起创建一个新的Web Application。你的任务是在团队中发挥作用，贡献你的技能，共同推动项目的成功。</p><h3><br></h3><h3><strong>项目要求</strong></h3><p><strong>项目选题</strong>: 你的团队可以自由选择一个创新的项目主题，但它必须包括以下要素：</p><ul><li class=\"ql-indent-1\">前端：使用React，Redux，Nextjs，Styled-Components等。</li><li class=\"ql-indent-1\">后端：使用Node.js，Express.js，Koa，Passport.js等。</li><li class=\"ql-indent-1\">数据库：Mongodb，PostgreSQL，DynamoDB等，选择合适的数据库来存储和管理数据。</li><li class=\"ql-indent-1\">部署：将你的应用部署到云端，如AWS、Azure等。</li></ul><p><strong>敏捷开发</strong>: 使用敏捷开发方法，将项目拆分成多个迭代，并定期交付新的功能。使用敏捷工具（如Trello或JIRA）来跟踪任务和进度。</p><p><strong>协作与沟通</strong>: 团队协作和沟通至关重要。定期召开站会（stand-up meetings）以更新团队成员，确保每个人都了解项目的状态和任务分配。</p><p><strong>Quality and Testing</strong>: 保证你的应用程序质量良好。编写单元测试和端到端测试，并确保每个功能都经过充分测试。</p><p><strong>Documentation</strong>: 创建清晰的文档，包括项目计划、需求文档、系统架构和部署说明。这些文档对于团队成员和潜在用户都非常重要。</p><p><strong>Presentation and Demonstration</strong>: 在项目结束时，团队需要准备一个演示，展示你的应用程序功能和亮点。这也是你展示你的项目成果的机会。</p><h3><br></h3><h3><strong>项目交付</strong></h3><p>项目完成后，你的团队需要准备一个综合性的项目报告，其中包括以下内容：</p><ul><li>Detailed project description, including the theme and objectives.</li><li>Project plan and progress reports, documenting various phases and completion status.</li><li>System architecture and technology stack of the application.</li><li>Deployment documentation, explaining how to deploy your application on a cloud platform.</li><li>Testing reports, including the results of unit tests and end-to-end tests.</li><li>Materials for project presentation and demonstration, including screenshots or demo videos of the user interface.</li></ul><h3><br></h3><h3><strong>项目评估</strong></h3><p>项目将根据以下标准进行评估：</p><ul><li>项目完成度：项目是否按计划完成，是否满足了项目要求。</li><li>代码质量：代码是否整洁、可维护，并遵循最佳实践。</li><li>功能实现：应用程序是否实现了所需的功能和特性。</li><li>文档质量：项目文档是否详尽清晰，便于他人理解。</li><li>团队协作：团队协作和沟通是否良好。</li><li>演示与展示：演示是否能够生动地展示项目的价值。</li></ul>",
          "_id": "67c6cb1f6a041b1fcf12c1f9"
        },
        {
          "code": "L87",
          "title": "Project 3 Bootstrap",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Project 3：创造、展示、协作的新篇章</strong></p><p>课程概述</p><p>欢迎踏入新的阶段，一个专注于实践、创新和团队协作的全新教育体验！在这里，你不仅学习技术，更将参与到真实的项目中，与团队一起创造有意义的作品。我们的目标是培养能够独立思考、卓越创新的匠人，让每位学员在技术路上更进一步。</p><p><br></p><p><br></p><h3><br></h3><p>1. 匠人培训 5.0 的含义</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实践与创新</strong>：超越传统理论教学，强调通过实际项目的开发来掌握和应用技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>团队协作</strong>：重视团队合作，通过小组项目培养沟通和协作技能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>持续成长</strong>：不仅提供知识，更注重培养学习和解决问题的能力。</li></ol><p>2. 项目展示</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>最终展示</strong>：每个项目组会在课程末尾线上展示他们的作品，全面介绍项目成果和学习体验。</li></ol><p>3. 项目分组与导师组</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目如何分组</strong>：学员将根据兴趣和技能分入不同的项目组，每组承担一个独特的项目。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>导师组与自拟项目组</strong>：导师组由经验丰富的老师领导，指导项目实施；自拟项目组则更加自由，学员可以根据自己的想法创建和实施项目。</li></ol><p>4. 项目组规定的重要性</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>规定的目的</strong>：确保每个成员都能在公平、有序的环境中学习和贡献。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>遵守的必要性</strong>：有助于提升团队效率，保证项目顺利完成。</li></ol><p><br></p><p><strong>加入我们的匠人培训5.0，开启你的技术创新之旅，与我们一起成长！</strong></p><p>在这个课程中，每一步都充满了挑战和机遇。我们期待看到你的参与和你的作品，一起来创造令人惊叹的项目！</p>",
          "_id": "67c6cb1f6a041b1fcf12c1fa"
        },
        {
          "code": "L88",
          "title": "AWS 基础",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>老师：Michel Su</p>\n<p>公司：Atlassian</p>\n<p>职位：SRE</p>\n<p>内容：</p>\n<p>1. AWS的基础知识，已经AWS是什么，为什么使用Cloud云计算服务</p>\n<p>2. 云计算的优势是什么，云计算的种类，为什么要用AWS</p>\n<p>3. IAM是什么，如何定义IAM，Users，Groups，Roles分别是什么，如何进行实施</p>\n<p>4. s3的基本操作，如何创建S3的bucket</p>\n<p>5. ec2是什么，如何启用ec2。ec2 ，ecs，lambda区别是什么，如何设计</p>\n<p>6. Load Balancer是什么，Application Load Balancer用来做什么的。Network的协议是什么</p>\n<p>7. AWS考试以及证书是什么</p>\n<p>8. API gateway的实施</p>\n<p>9. 使用老师提供的项目build一个Serverless的Web Application</p>",
          "_id": "67c6cb1f6a041b1fcf12c1fb"
        },
        {
          "code": "L89",
          "title": "Workshop: AWS IAM 的基本用法和高级使用",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop 分享人： Henry</p>\n<p>内容：</p>\n<ul>\n<li>AWS IAM 创建账户</li>\n<li>IAM 的 policy 如何设置</li>\n<li>IAM 的 role 如何设置</li>\n<li>当用户的 Policy 抵达上限，如何解决</li>\n<li>IAM 如何设置 boundary，如何限制 User 只能使用悉尼地区服务</li>\n<li>针对 Non-production 和 Production 如何配置权限</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c1fc"
        },
        {
          "code": "L90",
          "title": "什么是Agile SDLC, Waterfall, Agile介绍",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. Agile 的由来、开发宣言、原则、主要关注点，什么是价值 </p><p>2. 传统的项目管理如何进行的：悉尼歌剧院，悉尼轻轨 </p><p>3. Software Development Life Cycle(SDLC)是什么, 具体的每个阶段是什么 </p><p>4. SDLC-Waterfall和V Model是什么 </p><p>5. Project Management Methodologies有什么 </p><p>6. Lean Startup是什么 </p><p>7. 为什么使用敏捷开发，什么是敏捷开发，与Waterfall有什么区别 </p><p>8. Agile的价值观是什么，Agile Manifesto是什么，12个原则是什么</p>",
          "_id": "67c6cb1f6a041b1fcf12c1fd"
        },
        {
          "code": "L91",
          "title": "Agile Methodologies",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. 敏捷开发采用的具体方法，什么是Scrum，什么是Kanban </p><p>2. 结合实际工作讲解各个流程：scrum planning，daily standup，scrum board，scrum review meeting，spring retrospective meeting </p><p>3. Kanban的几个阶段，具体每个阶段的意义是什么 </p><p>4. Scrum在敏捷开发中的定义是什么 </p><p>5. Scrum里面的roles是什么，Artifacts是什么，Scrum里面包含的Events有什么 </p><p>6. SCRUM的3355原则是什么，Value Propositions是什么 </p><p>7. Retrospective meeting主要用来作什么的 </p><p>8. Scrum的Teams Roles: Product Owner, Development Team, Scrum Master，分别是什么 </p><p>9. Kanban具体的步骤是什么 </p><p>10. 怎样写 backlog，怎样写用户故事：“完成”的定义，故事拆分和故事估算 </p><p>11. User Story是什么，具体的User Story该怎么写 </p><p>12. Sprint Planning是什么</p>",
          "_id": "67c6cb1f6a041b1fcf12c1fe"
        },
        {
          "code": "L92",
          "title": "Agile Case研究：微软Microsoft Case Study",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>来自微软曾获得MVP的Ray老师，讲述以微软Windows交付使用Agile的流程 </p><p>1. 微软是如何使用Agile的，如何使用Agile敏捷开发以及采用DevOps文化 </p><p>2. Windows的发布周期 </p><p>3. Waas是什么，Windows as a Service，其中Rings是什么 </p><p>4. 微软的开发团队分布 </p><p>5. Windows开发具体的周期 </p><p>6. Up-front Planning开发，Code Test Stabilize 过程 </p><p>7. Windows的开发流程如何转型的，如何提升效率和成功率的 </p><p>8. Agile在项目开发中的好处是什么</p>",
          "_id": "67c6cb1f6a041b1fcf12c1ff"
        },
        {
          "code": "L93",
          "title": "Tutorial 14",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>SCRUM Review</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>SCRUM Master</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Team members</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Product Owner</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Daily Scrum</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Retro</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Planning</li></ol><p>Common problems</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Leave Comments</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Delays</li></ol><p>JIRA</p><p>Bitbucket</p><p>开发人员日常工作流程图</p><p>Meeting → tickets → review MR's → completed ticket → retro…..</p>",
          "_id": "67c6cb1f6a041b1fcf12c200"
        },
        {
          "code": "L94",
          "title": "Agile 方法论: 解锁团队的协作潜力",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>1. Agile敏捷开发：历史与哲学探究</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从传统瀑布模型到敏捷方法的革命性变革。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷哲学：为什么它如此强大？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agile 哲学：为什么\"Agile\"变得如此重要？</li></ol><p><strong>2. 深入Agile Manifesto (敏捷宣言)</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷的四个核心价值观：从\"个体与互动\"到\"响应变化\"。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>十二条开发原则的解析：如何将价值观付诸实践？</li></ol><p><strong>3. Scrum、Kanban：敏捷的支柱</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Scrum 框架的各个流程概述，“3355”方法论</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Scrum：迭代开发、自组织团队的奇妙之处。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Kanban：可视化工作流、持续改进的精髓。</li></ol><p><strong>4. 深入Scrum</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Product Backlog：需求的生命线。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Sprints：高效迭代与交付的秘密。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>日常站立会议 (Daily Standups)：团队默契的塑造。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Sprint Retrospectives：持续改进的动力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>结合实际工作讲解各个流程：scrum planning，daily standup，scrum board，scrum review meeting，spring retrospective meeting</li></ol><p><strong>5. 用户故事与验收标准：需求的精髓</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>打造高质量用户故事的策略。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Acceptance Criteria：确保交付符合预期的关键。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>怎样写 backlog，怎样写用户故事：“完成”的定义，故事拆分和故事估算</li></ol><p><strong>6. 实践出真知：构建自己的敏捷看板</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用现代工具 (如Trello、JIRA) 建立工作流程。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际操作：从构建产品积压到完成冲刺。</li></ol><p><strong>7. 敏捷在企业中的演进</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大型组织的敏捷转型：成功的案例分析。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>避免常见陷阱：敏捷实施中的挑战与解决。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>怎样改进流程、提高效率，为什么企业需要 T 型人才</li></ol><p><strong>8. 敏捷的未来展望</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷开发不断演进的趋势。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何将敏捷原则融入日常工作。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c201"
        },
        {
          "code": "L95",
          "title": "REACT(7): Unit Test",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解软件测试的基本概念和重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握 React 组件和应用的基础测试方法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会使用测试工具如 Jest 和 React Testing Library。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>软件测试的基本概念</strong>为什么需要测试</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>测试的种类（单元测试、集成测试、端到端测试）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>测试的重要性</strong>代码质量保证</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>团队协作和项目可维护性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CI/CD 中的测试</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 组件测试</strong>使用 Jest 进行基础测试</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 React Testing Library 测试组件交互</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 应用测试</strong>路由测试</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>全局状态（Context 或 Redux）测试</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Mocking API calls</li></ol><p><strong>实验/练习</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建单元测试以验证一个 React 组件的功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现一个集成测试案例，检查几个组件间的交互。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 CI/CD 流程中集成您的测试案例。</li></ol><p><strong>课后作业</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读 Jest 和 React Testing Library 的官方文档。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为您的项目或一个开源项目添加测试。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解如何在澳洲的前端开发文化中应用测试。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c202"
        },
        {
          "code": "L96",
          "title": "React (7): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Read Official Documentation:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Explore the official documentation of Jest and React Testing Library.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add Tests to Your Project:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add meaningful tests to your current project or contribute tests to an open-source project.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Explore Testing Culture in Australian Frontend Development:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Understand the role of testing in the software development culture in Australia.</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c203"
        },
        {
          "code": "L97",
          "title": ".NET(12): Unit Test",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Unit Test</p>",
          "_id": "67c6cb1f6a041b1fcf12c204"
        },
        {
          "code": "L98",
          "title": ".NET(12): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Assignment：</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a xUnit test project for the Web API project, which is from the Lecture Web API 项目</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add package moq to the xUnit test project</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Decide which controller/service need the unit test (for public method)</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Write the unit test for your selected API methods, if possible, can write you own public methods including the logic or calculation, which is better feasible for unit test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Given a few examples:</li></ol><p><em>UserController.TestServcies method,</em></p><p><em>TeacherController.Post method,</em></p><p><em>TeacherService.GetUser method</em></p><p>5. Trying to use moq package to simulate the DBContext –e.g.CourseCategoryService.Add method in unit test</p><p>6. Trying to use some fake external API in your Web API methods and write the unit test to mock this external API.</p><p>Below are some candidates could be used from the fake external API - <a href=\"https://jsonplaceholder.typicode.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://jsonplaceholder.typicode.com</a></p><p>7. Trying to run the power shell script and generate the report - please go through the ps script and remember to replace the below value to your solution name</p><p><strong> # Run the Coverlet.Collector - REPLACING YOUR SOLUTION NAME!!!</strong></p><p><br></p><h3>$output = [string] (&amp; dotnet test ../YOURSOLUTION.sln --collect:\"XPlat Code Coverage\" 2&gt;&amp;1)</h3>",
          "_id": "67c6cb1f6a041b1fcf12c205"
        },
        {
          "code": "L99",
          "title": "Tutorial 16",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Q&amp;A</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解答学习 React 中的疑问。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解答学习 .NET 中的疑问。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c206"
        },
        {
          "code": "L100",
          "title": ".NET(11): C# 事件与委托",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C# 事件与委托</p>",
          "_id": "67c6cb1f6a041b1fcf12c207"
        },
        {
          "code": "L101",
          "title": ".NET(11): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Assignment:</p><p>1. Define the delegates, please practice the different types:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>single delegate - the delegate only used by score top 1 student</li></ol><p><br></p><p>e.g. define the delegate HonourBonus for the top 1 score student, associate the top 1 student's ReceiveBonus method with this delegate</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>multicast delegate</li></ol><p><br></p><p>e.g. define the delegate CourseStarting for all students, associate the all student's Start method with this delegate</p><p>In the main method, please initiate the instance of delegate to call associated methods and print out the result (in console log)</p><p><br></p><p>2. Define the events</p><p>Please consider the difference when using event keyword with the above delegate.</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Update existing Course class which will be treated as Subject/Observable/Publisher, to add an event - ScheduledTimeChanged (means the course time updated/changed)</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Update the existing Student class, which will be the Observer/Subscriber, to add the event handler (method) to listen above event and accordingly update the behavior (print out something in console log)</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Simulate some students could quite the course, please remove the subscription from these students</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Imaging new students joined and interested in the course, please add the new subscriptions for the event.</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Please trigger the time changed event, and print out all subscriber/observer reactions (print out something in console log)</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c208"
        },
        {
          "code": "L102",
          "title": "REACT(8): Iteration 0, CI/CD, ESLint 和 Commit Hook",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 Iteration 0 在软件开发生命周期中的作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握持续集成（CI）和持续部署（CD）的基本概念。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 ESLint 进行代码规范检查。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握 Commit Hook 的应用和设置。</li></ol><p><strong>详细教学内容</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Iteration 0 的概念和重要性</strong>什么是 Iteration 0</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Iteration 0 的目标和产出</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>CI/CD 基础</strong>什么是 CI/CD</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CI/CD 的优点和应用场景</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>ESLint 的应用</strong>什么是 ESLint，为什么需要它</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何配置和使用 ESLint</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ESLint 在 CI 流程中的角色</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Commit Hook 的设置与应用</strong>什么是 Commit Hook</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用工具（如 Husky）设置 Commit Hook</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Commit Hook 在代码质量控制中的作用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>综合应用：Iteration 0 与 CI/CD</strong>在 Iteration 0 中如何整合 ESLint 和 Commit Hook</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际案例和最佳实践</li></ol><p><strong>实验/练习</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为一个简单的 React 应用设置 CI/CD（可选工具：GitHub Actions, Jenkins）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在该应用中集成 ESLint 和 Commit Hook。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论如何在 Iteration 0 的背景下，整合这些工具和流程。</li></ol><p><strong>课后作业</strong></p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读有关 CI/CD、ESLint 和 Commit Hook 的官方文档和相关资料。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为一个现有或新建的项目进行 Iteration 0 规划，并实践集成 ESLint 和 Commit Hook。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c209"
        },
        {
          "code": "L103",
          "title": "React (8): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>观摩范例&nbsp;<a href=\"https://github.com/JustinHu8/react-8-ci-cd**\" rel=\"noopener noreferrer\" target=\"_blank\">https://github.com/JustinHu8/react-8-ci-cd</a></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>研究ESLint是如何设置的，哪些文件需要configuration changes</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>复习pre-commit hook, husky 和lint-staged, 网上查阅如何从零开始设置，尝试自行设置</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>复习Github Actions, 大致了解其与CI/CD的关系</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读有关CI/CD、ESLint和CommitHook的官方文档和相关资料。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为一个现有或新建的项目进行Iteration0规划，并实践集成ESLint和CommitHook。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c20a"
        },
        {
          "code": "L104",
          "title": "Tutorial 17",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Q&amp;A</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>.NET Unit Test 答疑。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>针对 React CI/CD 和代码质量的答疑 </strong>解答学员关于 CI/CD 流程、ESLint 和 Commit Hook 配置的问题。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c20b"
        },
        {
          "code": "L105",
          "title": "React(9): Authentication Lab",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>实际操作 - 创建一个 Authentication Form</strong></p><p><strong>课程目标</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解身份认证在现代应用中的重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何在 React 应用中实现基础的身份认证。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过实际操作，创建一个完整的 Authentication Form。</li></ol><p><strong>详细教学内容</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>身份认证的基础知识</strong>什么是身份认证</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>JWT</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 中的身份认证概念</strong>使用 Context 管理认证状态</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Hooks 进行身份验证</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Authentication Form 的设计与实现</strong>创建登录和注册表单</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>表单验证</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>后端 API 调用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>安全性考虑</strong>密码加密与存储</li></ol><p><strong>实验/练习</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从头开始创建一个简单的 React 应用，包含登录和注册功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现前端表单验证和后端 API 调用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将身份认证状态存储并全局可访问。</li></ol><p><strong>课后作业</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读有关身份认证和安全性的文献。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优化你的 Authentication Form，加入更多高级功能（如多因素认证）。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c20c"
        },
        {
          "code": "L106",
          "title": "React (9): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Review Each Part of Authentication Implementation</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Managing Authentication State</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Authentication Form</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Backend API Integration for Authentication</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Client-side Validation</li></ol><p>&nbsp;&nbsp;&nbsp;2. Try to build a frontend authentication solution yourself with reference provided.</p><p>&nbsp;&nbsp;&nbsp;3. Optional: Try to improve the implementation such as client-side validation, add a registration form</p><p>&nbsp;</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>复习认证实现的每个部分：</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>管理认证状态</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认证表单</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>与后端 API 集成进行认证</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>客户端验证</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>尝试参考提供的资料自行构建一个前端认证解决方案。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>可选：</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>尝试改进实现，例如客户端验证</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>添加一个注册表单</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c20d"
        },
        {
          "code": "L107",
          "title": "Next.js 和不同的渲染模式",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>课程目标</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 Next.js 在现代前端开发中的作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握不同的渲染模式（SSR、SSG、CSR）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过实际操作，创建一个带分页功能的列表。</li></ol><p><strong>详细教学内容</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Next.js 概述</strong>什么是 Next.js</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Next.js 的优点和特性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>渲染模式的对比</strong>客户端渲染（CSR）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>服务端渲染（SSR）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>静态生成（SSG）</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实战：创建带分页功能的列表</strong>初始化 Next.js 项目</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个基础的列表展示</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现分页逻辑</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>高级特性与最佳实践</strong>使用 <strong>getStaticProps</strong> 和 <strong>getServerSideProps</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据预取和优化</li></ol><p><strong>实验/练习</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个 Next.js 项目，实现一个带有分页功能的列表。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>尝试使用不同的渲染模式来实现该列表，并比较它们的优缺点。</li></ol><p><strong>课后作业</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读 Next.js 官方文档，了解其更多高级特性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>扩展你的列表应用，添加搜索或筛选功能。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c20e"
        },
        {
          "code": "L108",
          "title": "课后补充知识：什么是SSR，CSR，SSG",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>服务器端渲染（SSR）</strong></p>\n<ul>\n<li class=\"ql-indent-1\">介绍SSR的工作原理和主要特点。</li>\n<li class=\"ql-indent-1\">探索SSR的优势，如更快的首屏加载时间和更好的SEO。</li>\n</ul>\n<p>&nbsp;</p>\n<p><strong>客户端渲染（CSR）</strong></p>\n<ul>\n<li class=\"ql-indent-1\">讲解CSR如何在浏览器端动态生成页面内容。</li>\n<li class=\"ql-indent-1\">分析CSR的优点，例如更丰富的交互和更好的用户体验。</li>\n</ul>\n<p><strong>静态站点生成（SSG）</strong></p>\n<ul>\n<li class=\"ql-indent-1\">说明SSG的概念和生成静态网页的过程。</li>\n<li class=\"ql-indent-1\">探讨SSG的使用场景，如博客、文档站点等。</li>\n</ul>\n<p><strong>选择最适合的渲染技术</strong></p>\n<ul>\n<li class=\"ql-indent-1\">根据不同的项目需求和目标，讨论如何选择最合适的渲染方式。</li>\n</ul>",
          "_id": "67c6cb1f6a041b1fcf12c20f"
        },
        {
          "code": "L109",
          "title": "Tutorial 18",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>本节内容：</p><h3>答疑</h3><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 身份认证相关问题解答 </strong>回答关于 React 中身份认证的基础知识、JWT 的使用、Context 和 Hooks 在认证中的应用等问题。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Next.js 渲染模式相关问题解答 </strong>解答有关 Next.js 的概述、不同渲染模式（CSR、SSR、SSG）的特点和应用场景的问题。</li></ol><h3>实践练习</h3><h3>练习1: React 身份认证表单实现</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>任务</strong>: 创建一个 React 应用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登录</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>注册</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登出</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>删除帐户</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>表单验证</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现基础前端验证逻辑，</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现检查输入是否为空，格式是否正确等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>模拟 API 调用</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 mock service worker（MSW）或其他工具模拟后端 API 响应。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>状态管理</strong>: 使用 React 的 Context API 来管理用户的登录状态。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建 Context API</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解码 JWT Token</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>保存用户信息</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示用户信息</li></ol><h3>练习2: Next.js 分页列表实现 (额外)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>任务</strong>: 使用 Next.js 创建一个列表应用，该列表包含分页功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>数据源</strong>: 可以使用公开的 API 或静态数据作为列表的数据源。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>渲染模式探索</strong>: 尝试使用 CSR、SSR 和 SSG 等不同渲染模式，并了解每种模式的特点和适用场景。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>分页逻辑</strong>: 实现分页组件，允许用户在列表数据间导航。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c210"
        },
        {
          "code": "L110",
          "title": "Tutorial 19 (Azure AI Preparation)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>课程内容：</p><p>注册Azure账号，开通Speech Service，开通OpenAI API</p><p>具体任务：</p><p>学员在导师指导下注册Azure账号，</p><p><a href=\"https://azure.microsoft.com/en-au/free/ai-services\" rel=\"noopener noreferrer\" target=\"_blank\">https://azure.microsoft.com/en-au/free/ai-services</a></p><p>开通Speech Service</p><p><a href=\"https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices\" rel=\"noopener noreferrer\" target=\"_blank\">https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices</a></p><p>入口文档</p><p><a href=\"https://learn.microsoft.com/en-au/azure/ai-services/speech-service/overview#try-the-speech-service-for-free\" rel=\"noopener noreferrer\" target=\"_blank\">https://learn.microsoft.com/en-au/azure/ai-services/speech-service/overview#try-the-speech-service-for-free</a></p><p>开通Open AI API</p><p><a href=\"https://platform.openai.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://platform.openai.com</a></p><p><a href=\"https://chatgpt.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://chatgpt.com</a></p>",
          "_id": "67c6cb1f6a041b1fcf12c211"
        },
        {
          "code": "L111",
          "title": "Azure AI Service和TTS",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>微软云Azure AI Service 提前注册</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Icebreaking，导师自我介绍，学员自我介绍</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI 简介</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么葫芦里的什么药</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么药（是什么，能干什么）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么葫芦（几种实现技术）</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>传统算法</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深度学习</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>机器学习</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大语言模型（机器学习的一种分支）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI相关的几个典型岗位</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Algorithm Engineer (算法工程师 - 大牛)</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hyperparameter tuning engineer （调参侠）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Prompt Engineer （提示工程师 - 调整优化提示）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Application Engineer (应用工程师 - 大部分的程序员， 调用AI的API实现商业价值)</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI在澳洲的企业应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus的应用案例</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus 机器人</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus 数字人</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Service NSW的应用案例</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>客户输入自然语言的理解</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>语言之间的翻译</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure AI Service 的简要介绍</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure是什么？Azure有什么？</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure AI Service 是什么？有什么？</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示Azure Protal</li></ol><p><strong>课堂实操练习</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在Azure Portal上面体验文字转语音和语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登陆Azure Portal</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>进入Speech Studio</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作文字转语音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作上传语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作用麦克风录入语音转文字</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，用React写一个最简单的文字转语音（TTS - Text To Speech）Web应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读练习说明，写一个form，包括 input，和 submit，输入文字，用window.speechSynthesis控件播放语音</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>===============中场休息10分钟==============</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure API 介绍</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure API 怎么读</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，用React写一个最简单的语音转文字（STT - Speech To Text）Web应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个form，包括三个按钮：开始录音，暂停录音，停止录音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用microsoft-cognitiveservices-speech-sdk实现实时语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个文本显示框，显示转换之后的文字</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 - 练习2 和 练习3 的局限和潜在风险</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用云AI服务的text to speech 对比 直接用浏览器自带的text to speech 空间的好处和坏处是什么，不同的应用场景</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习3的实际应用中一个重要安全性问题 - 你的API Key会暴露在客户端</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍另一种验证方式：Token</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>引入后端，跟随练习说明，用.net写一个获取token的后端</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化一个Web API</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置好Web API</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个controller，提供一个API /api/VoiceController/get-speech-token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在这个controller里面调用Azure cognitive 服务获取token并作为Response返回</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 - 本次课堂体验小结</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现效果<img src=\"data:image/png;base64,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aA11Gp2NE8Mph9vALmo2C0vG21kZfiPvG6F7VxZhTRv7eP9l3ySCBzrIciMCIiACIiACIiACIiACIiACIhAEOmEbIjUEcB39jfKaV9pQFhHgImRtGy3r6tbreBo4/lHmApcGmCO4fWXLbE5VOHRbiWADpCQCIiACIiACIiACIiACIiACIjAcgRSdfY9ducvaVpxiF8IZ5Upk10uKGCY/mpC64QHr/Lkl1C6CF1tftDbFofcnETzKUlsiIAIiIAIiIAIiIAIiIAIiIALLJjAa9U2BG1FbD9h6D1FONiVtEcelf8RwyNlSgGWa9tq4hdWlgPa+rNBFMpWmjimTCHZSWoiACIiACIiACIiACIiACIiACAxHwKRnmYKMwI18qtciazs1a92m1GWN8o1tVl3MN0YXVWlfjdj80QM19Mc//qPU+y/9SQRXzJQVAREQAREQAREQAREQAREQAREYggBy1D4uPEOwki3a1kUpFqQUy2HlJd4O+9Ct1GBdLLxhtV3KXfiWDjLCnGsfirvW26HBoCQCIiACIiACIiACIiACIiACIjAggVa89kQpQhZhyocqPiFUe/HeUofsDRfkaOdL8xLbXkDWa2PpGpmsNQy7aONFtlAkGBJKIiACIiACIiACIiACIiACIiACgxGI6G4rR02Pmhy1T0ZmU9giajOfnacN23jAJlL4cGFbhK83dmXslmYWsteXXcPo32opWl28aSUCIiACIiACIiACIiACIiACIiACgxPwqC9ei3ANgYwgjWd1a9HrZq6KW+VrRXUei2gbORPW9i99zrnwzWeAw4LmbuObejFWoaKVCIiACIiACIiACIiACIiACIjAUARc2Bbt6gLVhW2Gb5nW3BfAtdDNPJFfIsW0y7aRjXgvo+0EMK2w5d/8XProytKHpkPDTUkEREAEREAEREAEREAEREAERGAwAiF8w11EekOUennRp4STE7sAACIMSURBVCmEsepEbWwR0KU+1uGntiGym8nt2MC4lIdwtk3TznX/qGqJYGApiYAIiIAIiIAIiIAIiIAIiIAIDEgAQRrRWwRp6NMQqV7j0d0UqCldqSFFdLcVsi5skb2IYrNxsy4y3ObcJ9OjMUlftoEQrsokgg2GkgiIgAiIgAiIgAiIgAiIgAiIwJAEQppGFNZ0KAK1iNQUt614bbvNEluXEHBo5a58xYqQsFkSTS1GHIberm7T9l/FmiWCW+DKiIAIiIAIiIAIiIAIiIAIiIAIDEGgFZ8pTotTyqNuJFa7U5cZ7PUIstWGyM14bhXlxR//imh2oe1mYUO7eho14loieCfcKhABERABERABERABERABERABERiGQBGoODMB2mni0VhuTFjOHruXXYU9PrKO2c0x5dlLXOTWkWYrzU5sHaJ7zk3dhZVJBHcslRMBERABERABERABERABERABERiAQOpQl6ypd12UFsFa+minMZuw7VKI1/qx3q7OcpVpCuKILltdGxGmRYrpaJARYYlg2CiJgAiIgAiIgAiIgAiIgAiIgAgMR6CK3KZqRagieiM62+VDrNZdU2fbrl2LgI2VB4zDT9jPzc9Vmtg6pWFl60Lat33StDdaXXelvAiIgAiIgAiIgAiIgAiIgAiIgAgsm4Cr2J29pBCmhnykEMYhkEuRKdmoZyoz+TTNeG5pWfpZYQYmnXGaDtp1RouLgtZ06JaMMiIgAiIgAiIgAiIgAiIgAiIgAruMgL+kykQr4rYWw9Fhit5Ox8ZU6Qzr5rBM5PJfLXZdAGe9V9tG1w55THL5bP1rOrTj0EIEREAEREAEREAEREAEREAERGBoAiFWu+jszuK36zFEr4nVIpRHo7r4CGEbMV8kbUR+03tGfFv5S3URwG0vJpglglsayoiACIiACIiACIiACIiACIiACAxJoI7mThLAZUZz0bxIWp/YnJo3ng9uBxXitxW31jhF73xjzwcjoNPWMl1tEcRWLxGcgLQWAREQAREQAREQAREQAREQARHYDQRCpuaU5pzZHGKWpX1SGdtW1EftvL0IK1Qv06fjp4+6AYdNt42rLGulsUTwCCBtiIAIiIAIiIAIiIAIiIAIiIAIDEIAkRtCtxOgHo/1CG100U2BpoaUtrRNDUtZlLf2mLYCl41+CvtWKFe2igT3WWlbBERABERABERABERABERABERg2QQQrCFaIxpLPoStbZe6nCKdUWGrsH5T8NZDsPIICWe1VYbf2irytC99pI219anRtpYI3pmYSkRABERABERABERABERABERABJZBoBW1LlxD1LburKyLEFPX1WektyryZh7Idc3LM7/xL9t1rXHFFoZRimU/SQT3iWhbBERABERABERABERABERABERgWQRctOKhU68ufF3ktpVugFH5pDgmilv0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YtcFcNZ7tW107ZDHJJfP1r+mQzsOLURABERABERABERABERABERABIYmEGK1i87uLH67HkP0mlgtQnk0qouPELYR80XSRuQ3vWfEt5W/VBcB3PZiglkiuKWhjAiIgAiIgAiIgAiIgAiIgAiIwJAE6mjuJAFcZjQXzYuk9YnNqXnj+eB2UCF+W3FrjVP0zjf2fDACOm0t09UWQWz1EsEJSGsREAEREAEREAEREAEREAEREIHdQCBkak5pzpnNIWZZ2ieVsW1FfdTO24uwQvUyfTp++qgbcNh027jKslYaSwSPANKGCIiACIiACIiACIiACIiACIjAIAQQuSF0OwHq8ViP0EYX3RRoakhpS9vUsJRFeWuPaStw2einsG+FcmWrSHCflbZFQAREQAREQAREQAREQAREQASWTQDBGqI1orHkQ9jadqnLKdIZFbYK6zcFbz0EK4+QcFZbZfitrSJP+9JH2lhbnxpta4ngnYmpRAREQAREQAREQAREQAREQAREYBkEWlHrwjVEbevOyroIMXVdfUZ6qyJv5oFc17w88xv/sl3XGldsYRilWPaTRHCfiLZFQAREQAREQAREQAREQAREQASWRcBFKx469erC10VuW+kGGJVPimOiuEXPFg3r2hbzImrrF161wplq8925L9HfUu6C2ColggGiJAIiIAIiIAIiIAIiIAIiIAIiMCABhC0phW288dkjwKZoU6iybp/bbSO4Ec11m1ikK1+7AEYnFydt1DmsQmy7ii6SGXepom29uthpJQIiIAIiIAIiIAIiIAIiIAIiIAKDEECYhkatIrMIV/PudZbrxGvYhE7FIm0QsbwBOsrcIUa26W1DK7sYbn3RL77biDHN2S5921qRYIOgJAIiIAIiIAIiIAIiIAIiIAIiMByBFMB4RKCmSM015RnJZR3lSNVILnttETZdeQpgLy/auPbplqUc8Usi0uw2CGj7SAQHYy1FQAREQAREQAREQAREQAREQAQGIoDezIRgddFqhehS8ojSFK+xRrCmaLXGlg0fUWZbVp9OqcQk6tx36azNu2mxL/37luUlgvPIaC0CIiACIiACIiACIiACIiACIjAIgRCjRYRWipgsopf6FKyWHUl1+ahAxpBP+M0pzymm3Un2hdPSfbvGwOolgp2UFiIgAiIgAiIgAiIgAiIgAiIgAkMRGBGmReWiSVPgolA7m1TBqVrNsGQ7gUxBfuKZ385X7dd1blnQYfnYikQbieBgoaUIiIAIiIAIiIAIiIAIiIAIiMBABEKghrhF7PKpRWuo0+hsnBhOOdwGdlGzWVgy3s7K8Bt53wjdu7IIa9rYx/sv+yYRPNBBlhsREAEREAEREAEREAEREAEREIEg0AnbEKkhgOvob5TXvNKGsogAFyFr22hZV7dex9PA8Y8yF7g0wBzB7StbZnOqwqHbSgQbICUREAEREAEREAEREAEREAEREIHhCKTo7Hvsyl3WtuIUuxDOKFciu15SxDD50YTUDQ9Yl0gwqtcFL7b4KeLZM11/EsGORgsREAEREAEREAEREAEREAEREIHhCIxGfVPgRtTWA7beVZSTTUlbxGoZCGI45GwpwDJNe23cwupSQHtfVugimcoybVoi2ElpIQIiIAIiIAIiIAIiIAIiIAIiMBwBk55lCjICN/KpXous7dSsdZtSlzXKN7ZZdTHfGF1UpX01YvNHD9TQH//4j1Lvv/QnEVwxU1YEREAEREAEREAEREAEREAERGAIAshR+7jwDMFKtmhbF6VYkFIsh5WXeDvsQ7dSg3Wx8IbVdil34Vs6yAhzrn0o7lpvhwaDkgiIgAiIgAiIgAiIgAiIgAiIwIAEWvHaE6UIWYSpT1U2TUt1CNVevLfUIXvDBTna+dK8xLYXkPXaWLpGJmsNwy7aeJEtFAmGhJIIiIAIiIAIiIAIiIAIiIAIiMBgBCK628pRj/ZSlpHZFLaI2sxn52nDNh5CULNlkjaFbRG+3tiVsVuGTS67hqVd+FqNKyUREAEREAEREAEREAEREAEREAER2BUEPOqL4yJcQyAjSONZ3Vr0upmr4k5AhxQeHVnXxoS1/Uufcy588xng0sZcuY1vzisSPIpSWyIgAiIgAiIgAiIgAiIgAiIgAssl4CK16FgXqC5sM3zLtOa+AB4neon8EimmXbaNbE5zRt6mAMYDef7Nz3X+six9aDr0co+u2ouACIiACIiACIiACIiACIiACIwQcGFadGtEbUOUennRpymEadiJ2tgioEt9rMN1bUNkN5PbsYFxKfd+KLMx1P2jqiWCAaMkAiIgAiIgAiIgAiIgAiIgAiIwIAEEaahgBGno0xCpXuPR3RSoKV2pIUV0txWyLmyRvYhis3GzLjLc5twn06MxSV+2gRCuyiSCDYaSCIiACIiACIiACIiACIiACIjAkARCmkYU1nQoArWI1BS3rXhtu80SW5cQcGjlrnzFipCwWRJNLUYcht6ubtP2X8WaJYJb4MqIgAiIgAiIgAiIgAiIgAiIgAgMQaAVnylOi1PKo24kVrtTlxns9Qiy1YbIzXhuFeXFH/+KaHah7WZhQ7t6GjXiWiJ4J9wqEAEREAEREAEREAEREAEREAERGIZAEag4MwHaaeLRWG5MWM4eu5ddhT0+so7ZzTHl2Utc5NaRZivNTmwdonvOTd2FlUkEdyyVEwEREAEREAEREAEREAEREAERGIBA6lCXrKl3XZQWwVr6aKcxm7DtUojX+rHers5ylWkK4oguW10bEaZFiulokBFhiWDYKImACIiACIiACIiACIiACIiACAxHoIrcpmpFqCJ6Izrb5UOs1l1TZ9uuXYuAjZUHjMNP2M/Nz1Wa2DqlYWXrQtq3fdK0N1pdd6W8CIiACIiACIiACIiACIiACIiACCybgKvYnb2kEKaGfKQQxiGQS5Ep2ahnKjP5NM14bmlZ+llhBiadcZoO2nVGi4uC1nTolowyIiACIiACIiACIiACIiACIiACu4yAv6TKRCvithbD0WGK3k7HxlTpDOvmsEzk8l8tdl0AZ71X20bXDnlMcvls/Ws6tOPQQgREQAREQAREQAREQAREQAREYGgCIVa76OzO4rfrMUSvidUilEejuvgIYRsxXyRtRH7Te0Z8W/lLdRHAbS8mmCWCWxrKiIAIiIAIiIAIiIAIiIAIiIAIDEmgjuZOEsBlRnPRvEhan9icmjeeD24HFeK3FbfWOEXvfGPPByOg09YyXW0RxFYvEZyAtBYBERABERABERABERABERABEdgNBEKm5pTmnNkcYpalfVIZ21bUR+28vQgrVC/Tp+Onj7oBh023jassa6WxRPAIIG2IgAiIgAiIgAiIgAiIgAiIgAgMQgCRG0K3E6Aej/UIbXTRTYGmhpS2tE0NS1mUt/aYtgKXjX4K+1YoV7aKBPdZaVsEREAEREAEREAEREAEREAERGDZBBCsIVojGks+hK1tl7qcIp1RYauwflPw1kOw8ggJZ7VVht/aKvK0L32kjbX1qdG2lgjemZhKREAEREAEREAEREAEREAEREAElkGgFbUuXEPUtu6srIsQU9fVZ6S3KvJmHsh1zcszv/Ev23WtccUWhlGKZT9JBPeJaFsEREAEREAEREAEREAEREAERGBZBFy04qFTry58XeS2lW6AUfmkOCaKW/Rs0bCubTEvorZ+4VUrnKk23537Ev0t5S6IrVIiGCBKIiACIiACIiACIiACIiACIiACAxJA2JJS2MYbnz0CbIo2hSrr9rndNoIb0Vy3iUW68rULYHRycdJGncMqxLar6CKZcZcq2tari51WIiACIiACIiACIiACIiACIiACIjAIAYRpaNQqMotwNe9eZ7lOvIZN6FQs0gYRyxugo8wdYmSb3ja0sovh1hf94ruNGNOc7dK3rRUJNghKIiACIiACIiACIiACIiACIiACwxFIAYxHBGqK1FxTnpFc1lGOVI3kstcWYdOVpwD28qKNa59uWcoRvyQizW6DgLaPRHAw1lIEREAEREAEREAEREAEREAERGAgAujNTAhWF61WiC4ljyhN8RprBGuKVmts2fARZbZl9emUSkyizn2Xztq8mxb70r9vWV4iOI+M1iIgAiIgAiIgAiIgAiIgAiIgAoMQCDFaRGiliMkieqlPwWrZkVSXjwpkDPmE35zynGLanWRfOC3dt2sMrF4i2ElpIQIiIAIiIAIiIAIiIAIiIAIiMBSBEWFaVC6aNAUuCrWzSRWcqtUMS7YTyBTkJ5757XzVfl3nlgUdlo+tSLSRCA4WWoqACIiACIiACIiACIiACIiACAxEIARqiFvELp9atIY6jc7GieGUw21gFzWbhSXj7awMv5H3jdC9K4uwpo19vP+ybxLBAx1kuREBERABERABERABERABERABEQgCnbANkRoCuI7+RnnNK20oiwhwEbK2jZZ1det1PA0c/yhzgUsDzBHcvrJlNqcqHLqtRLABUhIBERABERABERABERABERABERiOQIrOvseu3GVtK06xC+GMciWy6yVFDJMfTUjd8IB1iQSjel3wYoufIp490/UnEexotBABERABERABERABERABERABERiOwGjUNwVuRG09YOtdRTnZlLRFrJaBIIZDzpYCLNO018YtrC4FtPdlhS6SqSzTpiWCnZQWIiACIiACIiACIiACIiACIiACwxEw6VmmICNwI5/qtcjaTs1atyl1WaN8Y5tVF/ON0UVV2lcjNn/0QA398Y//KPX+S38SwRUzZUVABERABERABERABERABERABIYggBy1jwvPEKxki7Z1UYoFKcVyWHmJt8M+dCs1WBcLb1htl3IXvqWDjDDn2ofirvV2aDAoiYAIiIAIiIAIiIAIiIAIiIAIDEigFa89UYqQRZj6VGXTtFSHUO3Fe0sdsjdckKOdL81LbHsBWa+NpWtkstYw7KKNF9lCkWBIKImACIiACIiACIiACIiACIiACAxGIKK7rRz1aC9lGZlNYYuozXx2njZs4yEENVsmaVPYFuHrjV0Zu2XY5LJrWNqFr9W4UhIBERABERABERABERABERABERCBXUHAo744LsI1BDKCNJ7VrUWvm7kq7gR0SOHRkXVtTFjbv/Q558I3nwEubcyV2/jmvCLBoyi1JQIiIAIiIAIiIAIiIAIiIAIisFwCLlKLjnWB6sI2w7dMa+4L4HGil8gvkWLaZdvI5jRn5G0KYDyQ59/8XOcvy9KHpkMv9+iqvQiIgAiIgAiIgAiIgAiIgAiIwAgBF6ZFt0bUNkSplxd9mkKYhp2ojS0CutTHOlzXNkR2M7kdGxiXcu+HMhtD3T+qWiIYMEoiIAIiIAIiIAIiIAIiIAIiIAIDEkCQhgpGkIY+DZHqNR7dTYGa0pUaUkR3WyHrwhbZiyg2GzfrIsNtzn0yPRqT9GUbCOGqTCLYYCiJgAiIgAiIgAiIgAiIgAiIgAgMSSCkaURhTYciUItITXHbite22yyxdQkBh1buylesCAmbJdHUYsRh6O3qNm3/VaxZIrgFrowIiIAIiIAIiIAIiIAIiIAIiMAQBFrxmeK0OKU86kZitTt1mcFejyBbbYjcjOdWUV788a+IZhfabhY2tKunUSOuJYJ3wq0CERABERABERABERABERABERCBYQgUgYozE6CdJh6N5caE5eyxe9lV2OMj65jdHFOevcRFbh1pttLsxNYhuufc1F1YmURwx1I5ERABERABERABERABERABERCBAQikDnXJmnrXRWkRrKWPdhqzCdsuhXitH+vt6ixXmaYgjuiy1bURYVqkmI4GGRGWCIaNkgiIgAiIgAiIgAiIgAiIgAiIwHAEqshtqlaEKqI3orNdPsRq3TV1tu3atQjYWHnAOPyE/dz8XKWJrVMaVrYupH3bJ017o9V1V8qLgAiIgAiIgAiIgAiIgAiIgAiIwLIJuIrd2UsKYWrIRwphHAK5FJmSjXqmMpNP04znlpalnxVmYNIZp+mgXWe0uChoTYduySgjAiIgAiIgAiIgAiIgAiIgAiKwywj4S6pMtCJuazEcHabo7XRsTJXOsG4Oy0Qu/9Vi1wVw1nu1bXTtkMckl8/Wv6ZDOw4tREAEREAEREAEREAEREAEREAEhiYQYrWLzu4sfrseQ/SaWC1CeTSqi48QthHzRdJG5De9Z8S3lb9UFwHc9mKCWSK4paGMCIiACIiACIiACIiACIiACIjAkATqaO4kAVxmNBfNi6T1ic2peeP54HZQIX5bcWuNU/TON/Z8MAI6bS3T1RZBbPUSwQlIaxEQAREQAREQAREQAREQAREQgd1AIGRqTmnOmc0hZlnaJ5WxbUV91M7bi7BC9TJ9On76qBtw2HTbuMqyVhpLBI8A0oYIiIAIiIAIiIAIiIAIiIAIiMAgBBC5IXQ7AerxWI/QRhfdFGhqSGlL29SwlEV5a49pK3DZ6Kewb4VyZatIcJ+VtkVABERABERABERABERABERABJZNAMEaojWiseRD2Np2qcsp0hkVtgrrNwVvPQQrj5BwVltl+K2tIk/70kfaWFufGm1rieCdialEBERABERABERABERABERABERgGQRaUevCNURt687KuggxdV19RnqrIm/mgVzXvDzzG/+yXdcaV2xhGKVY9pNEcJ+ItkVABERABERABERABERABERABJZFwEUrHjr16sLXRW5b6QYYlU+KY6K4Rc8WDevaFvMiausXXrXCmWrz3bkv0d9S7oLYKiWCAaIkAiIgAiIgAiIgAiIgAiIgAiIwIAGELSmFbbzx2SPApmhTqLJun9ttI7gRzXWbWKQrX7sARicXJ23UOaxCbLuKLpIZd6mibb262GklAiIgAiIgAiIgAiIgAiIgAiIgAoMQQJiGRq0iswhX8+51luvEa9iETsUibRCxvAE6ytwhRrbpbUMruxhufdEvvtuIMc3ZLn3bWpFgg6AkAiIgAiIgAiIgAiIgAiIgAiIwHIEUwHhEoKZIzTXlGcllHeVI1Ugue20RNl15CmAvL9q49umWpRzxSyLS7DYIaPtIBAdjLUVABERABERABERABERABERABAYigN7MhGB10WqF6FLyiNIUr7FGsKZotcaWDR9RZltWn06pxCTq3HfprM27abEv/fuW5SWC88hoLQIiIAIiIAIiIAIiIAIiIAIiMAiBEKNFhFaKmCyil/oUrJYdSXX5qEDGkE/4zSnPKabdSfaF09J9u8bA6iWCnZQWIiACIiACIiACIiACIiACIiACQxEYEaZF5aJJU+CiUDubVMGpWs2wZDuBTEF+4pnfzlft13VuWdBh+diKRBuJ4GChpQiIgAiIgAiIgAiIgAiIgAiIwEAEQqCGuEXs8qlFa6jT6GycGE453AZ2UbNZWDLezsrwG3nfCN27sghr2tjH+y/7JhE80EGWGxEQAREQAREQAREQAREQAREQgSDQCdsQqSGA6+hvlNe80oayiAAXIWvbaFlXt17H08DxjzIXuDTAHMHtK1tmc6rCodtKBBsgJREQAREQAREQAREQAREQAREQgeEIpOjse+zKXda24hS7EM4oVyK7XlLEMPnRhNQND1iXSDCq1wUvtvgp4tkzXX8SwY5GCxEQAREQAREQAREQAREQAREQgeEIjEZ9U+BG1NYDtt5VlJNNSVvEahkIYjjkbCnAMk17bdzC6lJAe19W6CKZyjJtWiLYSWkhAiIgAiIgAiIgAiIgAiIgAiIwHAGTnmUKMgI38qlei6zt1Kx1m1KXNco3tll1Md8YXVSlfTVi80cP1NAf//iPUu+/9Pf/AwHKrwI0NGrmAAAAAElFTkSuQmCC\"></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c212"
        },
        {
          "code": "L112",
          "title": "Integrate Azure AI Service and Streaming",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>完成课程Azure AI Service和TTS</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Warmup，回顾上一节的练习和下一步练习</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾后端获取短期token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>下一步：前端用token通过Stream 模式和AI Service通讯，</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，写一个React App，调用后端获取token， 并进行Stream实现TTS和STT</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用上面的后端获取token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从麦克风录音转换成文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传文件转换成文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文字阅读（文字转语音）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文字阅读的暂停和继续</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现STT和TTS - Pros &amp; Cons ？</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论：继续优化Azure AI（1）练习的安全性</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明更新上一节的 .net 后端应用，提供一个API，接受一个音频文件，调用Azure AI转化成文字，并作为Reponse 返回 -</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>增加一个API endpoint /api/VoiceController/upload 接受一个webm文件</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>保存文件并转换成wav</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用SpeechRecognizer 把文件传至Azure识别出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习解释： 为什么要转换成wav ？</li></ol><p>===============中场休息10分钟==============</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>更新上一节的 React 前端，把录到的语音传给上面的API，获取文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用react-mic录音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传文件</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure Speech Translation （语音翻译）介绍</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：在Azure Portal 上体验翻译功能</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：基于上一个练习增加一个API，实现语音翻译成文字功能</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：基于上一个练习的前端，增加一个按钮，调用新增的翻译API，实现语音翻译成文字功能</li></ol><p>讨论：回顾这两天Azure AI的使用体验</p>",
          "_id": "67c6cb1f6a041b1fcf12c213"
        },
        {
          "code": "L113",
          "title": "如何撰写IT专业简历",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">清晰的格式和布局</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：使用易于阅读的字体和清晰的布局。保持简历的长度适中，通常不超过两页。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">个人信息和联系方式</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：包括你的姓名、职业头衔（如软件工程师、系统管理员等）、联系电话、电子邮箱和 LinkedIn 个人页面链接。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">专业摘要或目标声明</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：简洁地概述你的职业背景、技能和你寻求的职位类型。这部分应该具有吸引力且针对你申请的职位量身定制。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">技术技能</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：明确列出你的技术技能，如编程语言（例如 Java、Python）、框架（如 Spring、React）、数据库（如 MySQL、MongoDB）和工具（如 Git、Docker）。根据求职职位的要求来调整技能列表。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">工作经验</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：按时间顺序列出你的工作经历，包括公司名称、职位、工作时间和职责描述。突出具体成就和使用的技术。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">项目经历</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：如果你有相关的项目经验（包括学校项目、个人项目或自由职业项目），请列出来，说明你的角色、使用的技术和项目成果。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">教育背景</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：提供你的最高学历信息，包括学校名称、学位、专业和毕业时间。如果你是新毕业生，可以更详细地说明你的教育背景。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">证书和培训</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：如果你有相关的行业证书（如 AWS Certified Solutions Architect、Cisco 的 CCNA）或完成了重要的专业培训，务必列出。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">其他信息</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：如语言能力、志愿者经验、获奖情况等，如果它们对你申请的职位有帮助，可以选择性地加入。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">定制你的简历</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：针对每个职位调整你的简历，确保它符合职位描述中的关键字和要求。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">校对和审核</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：在提交前，请仔细校对你的简历，确保没有拼写和语法错误。有可能的话，让你的同事或朋友帮你复查。</span></li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c214"
        },
        {
          "code": "L114",
          "title": "Project Management Workshop",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Project Management Workshop</p>",
          "_id": "67c6cb1f6a041b1fcf12c215"
        },
        {
          "code": "L115",
          "title": "5分钟手动部署Web Application 到 AWS S3 静态网站",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前端App部署基础</strong></p>\n<ul>\n<li class=\"ql-indent-1\">介绍如何准备前端应用以便于部署。</li>\n<li class=\"ql-indent-1\">指导如何选择合适的部署平台和服务。</li>\n</ul>\n<p><strong>创建AWS S3 Bucket</strong></p>\n<ul>\n<li class=\"ql-indent-1\">逐步演示如何在AWS S3中创建一个新的Bucket。</li>\n<li class=\"ql-indent-1\">讨论Bucket命名规则和配置选项。</li>\n</ul>\n<p><strong>编写Bucket策略</strong></p>\n<ul>\n<li class=\"ql-indent-1\">学习如何为Bucket编写安全策略。</li>\n<li class=\"ql-indent-1\">分析策略语法和关键要素。</li>\n</ul>\n<p><strong>Bucket的日常操作</strong></p>\n<ul>\n<li class=\"ql-indent-1\">演示如何上传、下载和管理Bucket中的文件。</li>\n<li class=\"ql-indent-1\">探索如何监控和维护Bucket。</li>\n</ul>",
          "_id": "67c6cb1f6a041b1fcf12c216"
        },
        {
          "code": "L116",
          "title": "GraphQL 101: 剥离RESTful的银行系统开发实践—Gary Sun",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Gary</p>\n<p>内容：</p>\n<p><strong>RESTFul与GraphQL对比</strong></p>\n<ul>\n<li>探讨两种API设计范式的优缺点。</li>\n<li>分析何时使用RESTFul，何时更适合选择GraphQL。</li>\n</ul>\n<p><strong>GraphQL的核心概念</strong></p>\n<ul>\n<li>详细介绍GraphQL的工作原理和主要特性。</li>\n<li>讨论GraphQL如何改善数据获取和管理。</li>\n</ul>\n<p><strong>GraphQL查询语言</strong></p>\n<ul>\n<li>学习如何构建高效的查询，获取精确的数据。</li>\n<li>实践GraphQL的强大灵活性，适应复杂的应用需求。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c217"
        },
        {
          "code": "L117",
          "title": "AWS Lambda 基础知识",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Shaun</p>\n<p>内容：</p>\n<p>1. Serverles 基础概念</p>\n<p>2. Faas 基础概念 Function-as-a-Service 概念</p>\n<p>3. Lambda 如何使用，Lambda 的特点，优缺点</p>\n<p>4. Lambda 在匠人学院 App 里的使用</p>\n<p>5. 简单的 Lambda Demo</p>",
          "_id": "67c6cb1f6a041b1fcf12c218"
        },
        {
          "code": "L118",
          "title": "Docker  Introduction",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Docker 视频学习： <a href=\"https://youtu.be/gAkwW2tuIqE\" target=\"_blank\" rel=\"noopener noreferrer\">https://youtu.be/gAkwW2tuIqE</a></p>\n<p><strong>本节知识点：</strong></p>\n<ol>\n<li>docker 原理与介绍</li>\n<li>docker 命令行与 gui 的使用</li>\n<li>docker 中的端口映射，以及外部调用</li>\n<li>如何通过 docker 打包我们的项目</li>\n<li>docker compose 一键启动本地开发环境</li>\n</ol>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c219"
        },
        {
          "code": "L119",
          "title": "SpringBoot的Production部署到AWS ECS Fargate，如何使用Microservice with docker",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: Xiaokai &amp; Yinhang</p>\n<p>内容：</p>\n<ul>\n<li>Springboot 的 Docker 部署到 AWS</li>\n<li>ECS AWS</li>\n<li>ECS 如何进行 CICD</li>\n<li>Task 是什么，如何使用</li>\n<li>VPC 是什么</li>\n<li>Subnet 是什么，如何使用</li>\n<li>Microservice 是什么</li>\n</ul>",
          "_id": "67c6cb1f6a041b1fcf12c21a"
        },
        {
          "code": "L120",
          "title": "Workshop: 持续集成(CI)/持续部署(CD)的概念以及Jenkins的使用",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Roger</p>\n<p>内容：</p>\n<ul>\n<li>持续集成(CI)/持续部署(CD)的概念</li>\n<li>Jenkins 如何一步一步部署上的</li>\n<li>Jenkins 的 Docker Image 如何部署的</li>\n<li>如何实现 Nodejs 后端的自动化部署</li>\n<li>如何实现 React 前端的自动化部署</li>\n</ul>",
          "_id": "67c6cb1f6a041b1fcf12c21b"
        },
        {
          "code": "L121",
          "title": "CI CD基础 使用Jenkins和AWS CodePipeline 手把手部署一个Web App",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p>\n<p>内容：</p>\n<p>1. Jenkins和AWS Codedeploy的区别是什么，有什么优点好处</p>\n<p>2. 代码里的Jenkinsfile逐行解读</p>\n<p>3. Jenkins如何开一个新的pipeline部署到Branch上</p>\n<p>4. 如何使用AWS CodePipeline部署</p>",
          "_id": "67c6cb1f6a041b1fcf12c21c"
        },
        {
          "code": "L122",
          "title": "Open AI Huggingface讲解 - Guang",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>OpenAI概览</strong></p>\n<ul>\n<li>介绍OpenAI的发展历程、愿景和主要成果。</li>\n</ul>\n<p><strong>提示词工程与高级使用</strong></p>\n<ul>\n<li>探讨如何精准地使用提示词来提高模型的效果。</li>\n<li>分析高级应用技巧和策略。</li>\n</ul>\n<p><strong>OpenAI的其他模型</strong></p>\n<ul>\n<li>了解OpenAI提供的各种AI模型及其特点和用途。</li>\n</ul>\n<p><strong>开源AI模型对比</strong></p>\n<ul>\n<li>探讨与OpenAI相似的开源模型，比较它们的优势和局限。</li>\n</ul>\n<p><strong>产品和运维中的应用</strong></p>\n<ul>\n<li>分析OpenAI在实际产品开发和运维中的应用案例。</li>\n<li>探索如何将AI模型融入生产实践。</li>\n</ul>",
          "_id": "67c6cb1f6a041b1fcf12c21d"
        },
        {
          "code": "L123",
          "title": "用 Kafka 实践 Event First 设计思维—虎头锤",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 虎头锤</p>\n<p>内容:</p>\n<p><strong>Kafka简介</strong></p>\n<ul>\n<li>介绍Kafka的功能和在现代数据处理中的重要性。</li>\n<li>讨论Kafka的主要组件，包括生产者、消费者、主题和分区。</li>\n</ul>\n<p><strong>Event First设计</strong></p>\n<ul>\n<li>解析Event First设计方法的原则和优势。</li>\n<li>分析如何使用Kafka构建事件驱动的系统架构。</li>\n</ul>\n<p><strong>Kafka实战应用</strong></p>\n<ul>\n<li>演示如何设置和配置Kafka环境。</li>\n<li>指导如何创建Kafka主题，发送和接收消息。</li>\n</ul>",
          "_id": "67c6cb1f6a041b1fcf12c21e"
        },
        {
          "code": "L124",
          "title": "如何准备澳洲大厂开发类岗位面试",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>老师：Xuecong，就职于悉尼 AWS，SDE</p><p>内容：</p><p>1. 澳洲大厂开发类岗位面试常见流程</p><p>2. 如何‘管理'整个面试流程</p><p>3. 如何准备面试申请</p><p>4. 准备面试，哪些专业能力需要提高</p><p>5. 如何准备大厂面试，体现价值观和企业文化</p><p>6. 面试当天注意事项</p><p>7. 如何接受，拒绝，协商 Offer</p>",
          "_id": "67c6cb1f6a041b1fcf12c21f"
        },
        {
          "code": "L125",
          "title": "求职国内秋招大厂前端开发岗，需要做哪些准备",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p><p>内容：</p><ul><li>国内大厂前端岗位如何细分？</li><li>获得前端岗位 Offer 所需的几大要素</li><li>如何准备面试中的八股文、算法等硬核考点？</li><li>怎样的实习经历可以让你在校招求职中脱颖而出？</li></ul>",
          "_id": "67c6cb1f6a041b1fcf12c220"
        },
        {
          "code": "L126",
          "title": "如何准备国内秋招，才能获得大厂 Offer?",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Chen</p><p>内容：</p><p><strong>秋招时间规划</strong></p><ul><li>解析秋招的主要时间节点，帮助你合理安排准备时间。</li><li>讨论如何在学习、实习和求职之间平衡。</li></ul><p><strong>准备秋招的步骤</strong></p><ul><li>提供详细的秋招准备指南，包括市场调研、目标公司筛选等。</li><li>强调技能提升和实战经验积累的重要性。</li></ul><p><strong>笔试准备技巧</strong></p><ul><li>分析常见的笔试题型和应对策略。</li><li>提供实用的学习资源和练习方法。</li></ul><p><strong>面试技巧训练</strong></p><ul><li>探讨如何在面试中有效展现你的能力和潜力。</li><li>分享面试中的常见问题和最佳回答技巧。</li></ul><p><br></p>",
          "_id": "67c6cb1f6a041b1fcf12c221"
        },
        {
          "code": "L127",
          "title": "在澳洲如何找到一份Java Developer的工作 -- 虎头锤",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：虎头锤</p>\n<p>内容:</p>\n<p><strong>澳洲Java工作市场分析</strong></p>\n<ul>\n<li>探索澳洲Java开发岗位的市场需求和主要工作要求。</li>\n<li>分析技术技能和行业经验在职场中的重要性。</li>\n</ul>\n<p><strong>回答行为面试问题</strong></p>\n<ul>\n<li>提供实用的策略和技巧，帮助你准备和回答行为面试中的问题。</li>\n<li>分析常见的行为问题及其背后的意图。</li>\n</ul>\n<p><strong>简历撰写和个人品牌打造</strong></p>\n<ul>\n<li>教你如何撰写一份突出你技能和经验的简历。</li>\n<li>讨论如何在简历中有效地展示你的项目经验和技术能力。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c222"
        },
        {
          "code": "L128",
          "title": "澳洲程序员找工作必备哪些后端知识",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 老虎</p>\n<p>内容:</p>\n<p><strong>澳洲后端开发者必备知识</strong></p>\n<ul>\n<li>分析澳洲后端开发职位的常见要求和技能需求。</li>\n<li>探讨关键的编程语言（如Java、Python、Node.js）和框架。</li>\n</ul>\n<p><strong>数据库技能</strong></p>\n<ul>\n<li>介绍常用的数据库技术，包括关系型数据库（如MySQL、PostgreSQL）和非关系型数据库（如MongoDB）。</li>\n</ul>\n<p><strong>API开发与RESTful服务</strong></p>\n<ul>\n<li>学习如何设计和实现高效的RESTful API。</li>\n</ul>\n<p><strong>版本控制和代码协作</strong></p>\n<ul>\n<li>强调Git等版本控制系统的重要性，并探索代码协作的最佳实践。</li>\n</ul>\n<p><strong>云服务和容器化技术</strong></p>\n<ul>\n<li>介绍云计算服务（如AWS、Azure）和容器技术（如Docker、Kubernetes）。</li>\n</ul>\n<p><strong>软件工程最佳实践</strong></p>\n<ul>\n<li>探讨如何编写可维护、高效的代码，以及软件测试和持续集成的重要性。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c223"
        },
        {
          "code": "L129",
          "title": "在澳洲，IT学生如何准备System Design面试-----Ben",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Ben</p><p>内容：</p><p><strong>系统设计面试的基本功</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>概念理解</strong>：讲解系统设计面试中经常涉及的关键概念，如可扩展性、可靠性、效率等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>技能要点</strong>：强调分析问题、沟通思路、考虑权衡的重要性，并提供实用技巧帮助你在面试中脱颖而出。</li></ol><p><strong>面试准备方法</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>资源梳理</strong>：介绍高质量的学习资源和实践工具，帮助你系统地准备系统设计面试。</li></ol><p><strong>Monolith架构解析</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>定义和特点</strong>：详细解释Monolith（单体架构）的概念，并探讨其优缺点。</li></ol><p><strong>Microservice架构探索</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>核心理念</strong>：深入讲解Microservice（微服务架构）的基本原则和结构。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c224"
        },
        {
          "code": "L130",
          "title": "从0到1打造React/Node 全栈IoT实时应用——Bryan",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>主讲人：Bryan</p><p>内容 ：</p><p><strong>IoT概览</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍IoT的定义、发展历程和关键技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析IoT在不同行业中的应用案例。</li></ol><p><strong>IoT架构与最佳实践</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论IoT系统的典型架构和组件。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索IoT项目的设计原则和最佳实践。</li></ol><p><strong>实时应用与技术栈</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解析构建IoT实时应用的技术栈和框架。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析物联网的数据处理和通信技术。</li></ol><p><strong>案例研究和演示</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过具体的项目示例展示IoT技术的应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何实现IoT解决方案，并讨论其实际效果。</li></ol>",
          "_id": "67c6cb1f6a041b1fcf12c225"
        },
        {
          "code": "L131",
          "title": "Google大佬教你，如何突破年薪20w澳币天花板 -- 韭天",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 韭天</p>\n<p>内容:</p>\n<p><strong>薪资的组成</strong></p>\n<ul>\n<li>深入了解薪资的不同组成部分，包括基本工资、奖金、福利等。</li>\n</ul>\n<p><strong>提升薪资的方法</strong></p>\n<ul>\n<li>探讨如何通过技能提升、职位晋升等方式增加薪资。</li>\n<li>分析职业发展中关键的技能和资格认证。</li>\n</ul>\n<p><strong>优质雇主的选择</strong></p>\n<ul>\n<li>比较不同类型的公司及其提供的薪资水平。</li>\n<li>讨论如何选择能够提供更好薪资和职业发展机会的公司。</li>\n</ul>\n<p><strong>职业生涯规划</strong></p>\n<ul>\n<li>指导如何根据个人目标和市场趋势规划职业生涯。</li>\n<li>分析长期职业规划对薪资和职业满意度的影响。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "67c6cb1f6a041b1fcf12c226"
        },
        {
          "code": "L132",
          "title": "Elastic Search基础知识分享Workshop",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p>\n<p>内容：</p>\n<ol>\n<li>Logging Saas 服务商横向比较：Elastic Search，Splunk，Sumo Logic，Datadog，New Relic 等</li>\n<li>Elastic Search 是什么，Elastic 的优势是什么</li>\n<li>Elastic Search 架构 Log，Beats，Logstash，Elasticsearch，Kibana</li>\n<li>Beats 的使用，Beats 的特点</li>\n<li>Elastic Search 在匠人的架构，Lambda 如何使用</li>\n<li>Elastic Search 的如何创建 Dashboard</li>\n<li>Elastic Search 的如何查询 Logging 信息，如何做筛选</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c227"
        },
        {
          "code": "L133",
          "title": "关于如何解决Error Messages，几个步骤",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>应对error message的几个步骤： 1. 详细阅读一下error message，看报错的内容是什么，是否和自己操作的步骤有关，你是否能从报错的内容中找到出错位置，以及出错原因 2. 如果自己无法理解错误信息，尝试提炼出error message中的关键语句，在google上搜索。这一步很重要。如果全盘复制error message，有可能会因为字符数太多而无法详细匹配到你要找的答案。所以如何精炼错误信息的同时又精准的找到网上的答案，也是锻炼搜索能力的重要一步 3. 尝试从google的搜索结果当中，逐一比较，是否和你的错误信息相关。如果是，可以尝试google提出的解决方案。通常情况下你找到的第一个不一定是能解决你问题的那个一个。有可能需要尝试五六个/六七个不同的方案，才最终能找到你想要的内容 4. 如果google上的内容也无法帮你解决问题，可以截图错误信息，注意截图中要包含你所跑的命令和详细的错误信息，发到群里，大家帮你参考。</p>",
          "_id": "67c6cb1f6a041b1fcf12c228"
        },
        {
          "code": "L134",
          "title": "澳洲工作职场介绍",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"澳洲公司全景：行业领袖与职业机遇\"</strong></p>\n<ol>\n<li><strong>澳洲公司的市场概况</strong>：深入介绍澳洲主要行业和领先公司，包括它们的市场定位、企业文化和核心价值。</li>\n<li><strong>澳洲公司的职业前景</strong>：探讨在澳洲各种类型公司工作的优势和挑战，以及如何在这些环境中发展职业生涯。</li>\n</ol>\n<p><strong>\"就业方向解析：产品与咨询服务\"</strong></p>\n<ol>\n<li><strong>产品方向的职业机遇</strong>：探讨在产品管理、开发和策略等领域的职业路径，以及如何在这些领域成功发展。</li>\n<li><strong>咨询服务方向的职业途径</strong>：深入分析咨询行业的工作性质、职业晋升路径和必备技能，以及如何在咨询服务领域建立成功的职业。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c229"
        },
        {
          "code": "L135",
          "title": "澳洲企业招聘流程",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"澳洲企业招聘全攻略：三大关键阶段深度解析\"</strong></p>\n<ol>\n<li><strong>简历和求职信的制作与提交</strong>：学习如何撰写针对澳洲市场的高效简历和求职信，包括格式、内容和展现个人特色的技巧。</li>\n<li><strong>面试的全面准备</strong>：深入分析招聘过程中的各种面试类型，包括初步面试、在线评估、技术面试和管理层面试。提供准备技巧、常见问题解答和成功策略。</li>\n<li><strong>Offer 阶段的策略</strong>：探讨如何在收到工作邀约时进行有效的沟通和谈判，包括薪资、福利和其他工作条件。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c22a"
        },
        {
          "code": "L136",
          "title": "招聘官挑选简历的标准",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>招聘官在挑选简历时通常会根据以下几个标准进行筛选：</p>\n<ol>\n<li><strong>符合职位要求</strong>：首先会检查应聘者的教育背景、工作经验、技能和资格是否符合岗位的具体要求。</li>\n<li><strong>清晰、专业的简历格式</strong>：一份清晰、逻辑性强、格式规范、无拼写错误的简历更容易获得青睐。</li>\n<li><strong>关键字匹配</strong>：许多公司使用自动跟踪系统（ATS）来筛选简历，这些系统会根据职位描述中的关键字来评估简历的相关性。</li>\n<li><strong>成就和成绩</strong>：与其仅仅列出职责，招聘官更倾向于看到具体的成就和成绩，例如销售额、成本节约、项目成功实施等量化的结果。</li>\n<li><strong>职业发展的连贯性</strong>：职业路径中的逻辑发展和进步表明了候选人的职业目标和职业规划。</li>\n<li><strong>个性和文化契合度</strong>：简历中的个人陈述或兴趣爱好部分可以体现出候选人是否可能与公司文化和团队精神相契合。</li>\n<li><strong>职业目标</strong>：简历应该传达出候选人的职业目标与申请职位是如何对齐的。</li>\n<li><strong>社交媒体和在线存在</strong>：有时候招聘官也会查看LinkedIn等专业网络或其他社交媒体来了解候选人的专业背景和行为表现。</li>\n<li><strong>推荐信和联系人</strong>：提供可以证实候选人能力和表现的推荐人可以是一个加分项。</li>\n<li><strong>附加技能</strong>：除了基本技能之外，候选人显示的任何额外技能或证书也会让其简历更加突出。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c22b"
        },
        {
          "code": "L137",
          "title": "简历常见问题",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"简历制作艺术：重点、加减分项及编写原则\"</strong></p>\n<ol>\n<li><strong>简历的重点内容</strong>：指导您如何突出简历中的重点内容，包括职业经历、技能、成就和教育背景，确保雇主能够快速抓住您的核心优势。</li>\n<li><strong>避免的简历减分项</strong>：教您识别和避免简历中的常见错误和不利因素，如过度冗长、格式不当或信息不准确等。</li>\n<li><strong>简历的加分元素</strong>：提供策略和建议，帮助您在简历中加入能够提升吸引力的元素，如特定技能证明、相关项目经验或突出成就等。</li>\n<li><strong>编写简历的基本原则</strong>：探讨在编写简历时应遵循的基本原则，包括清晰性、专业性和针对性，以及如何根据目标职位定制简历。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c22d"
        },
        {
          "code": "L138",
          "title": "如何利用 ChatGPT 写简历",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"利用 ChatGPT 提升简历撰写技巧：指南与实践\"</strong></p>\n<ol>\n<li><strong>ChatGPT 基本使用方法</strong>：本节课将介绍 ChatGPT 的基础功能和操作方法，帮助学员快速掌握如何有效使用这一先进的工具。</li>\n<li><strong>ChatGPT 在简历撰写中的应用技巧</strong>：这部分将指导学员如何充分利用 ChatGPT 在简历撰写中的潜力，包括格式建议、内容生成和优化技巧，以打造一份吸引眼球的简历。</li>\n<li><strong>与 ChatGPT 进行个性化交互</strong>：教授学员如何与 ChatGPT 进行有效的个性化交互，以获取更加符合职业目标和个人特色的简历内容。</li>\n<li><strong>ChatGPT 实例演示</strong>：通过实际操作演示，展示 ChatGPT 在简历撰写和改进方面的应用，帮助学员更好地理解和掌握实际操作技巧。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c22e"
        },
        {
          "code": "L139",
          "title": "手把手带着运营 LinkedIn",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"LinkedIn 职业建设：完善个人资料与网络拓展\"</strong></p>\n<ol>\n<li><strong>维护完整、专业的 LinkedIn 个人资料</strong>：指导您如何创建和维护一个展现您职业经历、技能和成就的专业 LinkedIn 资料。这包括头像选择、经历描述、技能展示和获取推荐等关键元素。</li>\n<li><strong>加入与行业和兴趣相关的 LinkedIn 群组</strong>：教您如何找到和加入与您的职业领域和兴趣相关的 LinkedIn 群组，以便进行行业交流、拓展职业网络和获取行业最新动态。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c22f"
        },
        {
          "code": "L140",
          "title": "如何利用 LinkedIn 准备面试",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"求职成功攻略：职位描述解析、面试准备与公司研究\"</strong></p>\n<p>这个课程旨在全面指导您如何在求职过程中取得成功。本课程将包括：</p>\n<ol>\n<li><strong>职位描述深度解析</strong>：教您如何仔细分析职位描述，理解职位要求的核心内容和隐含条件，从而更有效地准备申请材料和面试。</li>\n<li><strong>面试准备技巧</strong>：提供面试准备的策略，包括如何针对面试描述准备回答问题、展示自己的优势，以及如何应对常见面试问题。</li>\n<li><strong>利用 LinkedIn 搜索目标公司</strong>：指导您如何有效利用 LinkedIn 平台搜索并研究目标公司，包括公司背景、文化、行业地位等信息，以增强您的求职策略。</li>\n</ol>",
          "_id": "67c6cb1f6a041b1fcf12c230"
        },
        {
          "code": "L141",
          "title": "Next.js",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Next.js</p>",
          "_id": "67d3e2c07dd4a4f885efcd05"
        },
        {
          "code": "L142",
          "title": "The Four Prototyping Patterns: Prompting, Fine-Tuning, RAG, Agents",
          "type": "Lesson",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>The Four Prototyping Patterns: Prompting, Fine-Tuning, RAG, Agents</strong></p><p>BY THE END OF THE SESSION</p><p>• Prompting \"giving the LLM more context\" Prompting = asking questions in a better way with better context</p><p>• Fine Tuning \"teaching the LLM how to act\" 3 types: task training, constraining I/0 schema, and language training</p><p>• RAG \"giving the LLM access to new knowledge\" Retrieval Augmented Generation = Dense Vector Retrieval + In-Context Learning</p><p>• Agents</p><p>\"giving the LLM access to tools\"</p><p>Agents = reasoning, action, repeat</p><p>• Prompting \"giving the LLM more context\" Prompting = asking questions in a better way with better context</p><p>• Fine Tuning \"teaching the LLM how to act\" 3 types: task training, constraining I/0 schema, and language training</p><p>• RAG \"giving the LLM access to new knowledge\" Retrieval Augmented Generation = Dense Vector Retrieval + In-Context Learning</p><p>• Agents</p><p>\"giving the LLM access to tools\"</p><p>Agents = reasoning, action, repeat</p><p><strong>Prompting</strong></p><p>Prompt is nothing but what you said to AI.</p><p><strong>Prompt Engineering</strong> is the art of crafting effective prompts that elicit desired responses from LLMs. It's the foundation of interacting with these models, and its effectiveness can significantly impact the quality and relevance of the output.</p><p>A typical prompt can be broken down into several key components:</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Priming:</strong> This sets the context for the LLM, providing information about the desired task, persona, or style. For example, you might prime the model by saying, \"You are a friendly chatbot that helps users with their travel plans.\"</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Instructions:</strong> These guide the LLM on how to handle specific aspects of the task, such as the tone of voice, the format of the output, or how to handle edge cases. For example, you might instruct the model to \"use a conversational tone\" or \"provide a bulleted list of recommendations.\"</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>User Inquiry:</strong> This is the dynamic content of the prompt, the specific question or request that the user provides. It's the input that changes with each interaction.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Output Formatting:</strong> This specifies the desired format of the LLM's response. It could be plain text, a structured format like JSON, or even a specific template.</li></ol><p><br></p><p><strong>Example:</strong></p><p>Priming: You are a helpful and informative chatbot that answers questions about history.</p><p>Instructions: Provide concise and accurate answers, using bullet points to list key facts.</p><p>User Inquiry: What were the major causes of World War II?</p><p>Output Formatting: A bulleted list of key causes.</p><p>Another famous the COSTAT:</p><p><strong>The COSTAR Framework Explained:</strong></p><p><strong>Context :</strong> Providing background information helps the LLM understand the specific scenario.</p><p><strong>Objective (O):</strong> Clearly defining the task directs the LLM’s focus.</p><p><strong>Style (S):</strong> Specifying the desired writing style aligns the LLM response.</p><p><strong>Tone (T):</strong> Setting the tone ensures the response resonates with the required sentiment.</p><p><strong>Audience (A):</strong> Identifying the intended audience tailors the LLM’s response to be targeted to an audience.</p><p><strong>Response (R):</strong> Providing the response format, like text or json, ensures the LLM outputs, and help build pipelines.</p><p><strong>Benefits of Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Control over Output:</strong> Prompt Engineering allows you to guide the LLM's behavior and ensure that the output aligns with your specific needs.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Customization:</strong> You can tailor prompts to specific tasks, audiences, and contexts.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Efficiency:</strong> Well-crafted prompts can reduce the need for extensive fine-tuning, saving time and resources.</li></ol><p><strong>Limitations of Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context Window:</strong> LLMs have a limited context window, meaning they can only process a certain amount of text at a time. This can limit the complexity of prompts and the amount of information that can be provided.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Lack of Factual Grounding:</strong> LLMs are trained on massive datasets of text, but they don't store specific facts. They predict the most likely word based on the context, which can lead to inaccuracies or inconsistencies.</li></ol><p><br></p><p>=========================================</p><p><strong>Fine-Tuning</strong></p><p><strong>Fine-tuning</strong> is a powerful technique that allows you to customize the behavior of an LLM by training it on a specific dataset of examples. This process adjusts the LLM's internal parameters, enabling it to perform better on tasks related to the training data.</p><p><strong>How Fine-tuning Works:</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Training Data:</strong> A dataset of prompt-completion pairs is created, where each pair consists of a prompt and the desired response. This data represents the specific task or style that you want the LLM to learn.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Model Training:</strong> The LLM is trained on the provided dataset, adjusting its internal parameters to better predict the desired responses for the given prompts.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Evaluation:</strong> The fine-tuned model is evaluated on a separate dataset to assess its performance and ensure that it has learned the desired behavior.</li></ol><p><strong>Example:</strong></p><p>Imagine you want to fine-tune an LLM to write product descriptions in a specific style.</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Training Data:</strong> You create a dataset of product descriptions written in your desired style, along with the corresponding product names.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Model Training:</strong> The LLM is trained on this dataset, learning to generate product descriptions that match the style and tone of the training data.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Evaluation:</strong> You evaluate the fine-tuned model by providing it with new product names and assessing the quality of the generated descriptions.</li></ol><p><strong>Benefits of Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Improved Performance:</strong> Fine-tuning can significantly improve the LLM's performance on specific tasks, such as writing in a particular style, generating creative content, or answering questions in a specific domain.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Style and Tone Customization:</strong> Fine-tuning allows you to bake in your desired style, tone, and formatting into the LLM's output.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Reduced Prompt Length:</strong> Fine-tuning can reduce the need for extensive instructions in the prompt, allowing for a larger context window and more complex outputs.</li></ol><p><strong>Limitations of Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Data Requirements:</strong> Fine-tuning requires a dataset of examples, which can be time-consuming and resource-intensive to create.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Overfitting:</strong> If the training data is too small or not representative of the desired behavior, the model may overfit to the training data and perform poorly on unseen examples.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Cost and Resources:</strong> Fine-tuning can be computationally expensive, requiring significant resources and time.</li></ol><p><br></p><p><strong>RAG</strong></p><p><strong>RAG</strong> addresses the limitations of prompt engineering by incorporating external knowledge sources into the LLM's decision-making process. It allows LLMs to access and utilize factual information from databases, websites, or other sources, enhancing their ability to provide accurate and relevant responses.</p><p><strong>How RAG Works:</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup:</strong> A database is created containing relevant information, which can be text from websites, documents, or internal knowledge bases. This information is then split into smaller chunks, such as paragraphs or sections, to ensure that related text is kept together.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Embedding Generation:</strong> Each chunk of text is converted into a vector representation called an embedding. Embeddings capture the semantic meaning of the text, allowing for efficient comparison and retrieval.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval:</strong> When a user inquiry is received, it is also converted into an embedding. This embedding is then compared to the embeddings in the database using a vector search algorithm. The most similar chunks of text are retrieved.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Prompt Augmentation:</strong> The retrieved information is then incorporated into the prompt, providing the LLM with the necessary context to answer the user's question.</li></ol><p><strong>Example:</strong></p><p>Imagine a user asks, \"How do I fix a leaky faucet?\"</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval:</strong> The user's inquiry is converted into an embedding and compared to the embeddings in a database containing a plumber's handbook. The most relevant section, \"Fixing Common Leaks,\" is retrieved.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Prompt Augmentation:</strong> The retrieved section is added to the prompt, providing the LLM with the necessary information to answer the question.</li></ol><p><strong>Benefits of RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Factual Accuracy:</strong> RAG allows LLMs to access and utilize factual information from external sources, improving the accuracy and reliability of their responses.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Real-time Knowledge Updates:</strong> The database can be updated in real time, ensuring that the LLM has access to the latest information.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Expanded Knowledge Base:</strong> RAG enables LLMs to access a much larger knowledge base than what is available within their training data.</li></ol><p><strong>Limitations of RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup and Maintenance:</strong> Creating and maintaining a comprehensive and accurate database can be time-consuming and resource-intensive.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval Accuracy:</strong> The accuracy of the retrieved information depends on the quality of the database and the effectiveness of the vector search algorithm.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context Window:</strong> The retrieved information is still subject to the LLM's context window limitations.</li></ol><p><br></p><p><strong>Agents</strong></p><p>Agent is nothing but a fancy RAG</p><p><strong>Introduction to LLM Agents</strong></p><p>LLM agents represent the next frontier in artificial intelligence, moving beyond simple text input-output models to interactive, reasoning-capable systems.</p><p><strong>What are LLM Agents?</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Definition: Systems that use Large Language Models (LLMs) as their core for reasoning and planning, enabling interaction with external environments.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Key difference from traditional LLMs: Ability to observe, plan, and take actions in diverse environments.</li></ol><p><strong>Components of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agent/Brain/Core:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Core LLM for processing and understanding language</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Customizable prompts and personas</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Planning:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ability to create and execute plans for complex tasks</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Memory:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Short-term memory: Temporary storage for ongoing conversations</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Long-term memory: Persistent storage for learning and recall</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Tool Use:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Integration with external tools and APIs</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ability to leverage specialized knowledge bases</li></ol><p><strong>Capabilities of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced Problem Solving:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Executing complex tasks efficiently</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Generating project plans, writing code, creating summaries</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Self-Reflection and Improvement:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Analyzing and critiquing their own output</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Continuous enhancement through learning</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-Agent Collaboration:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Interaction and cooperation between multiple agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Division of tasks and specialization</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Environment Interaction:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Web browsing, API usage, physical world interaction (in robotics)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-modal input processing (text, images, sensory data)</li></ol><p><strong>Applications of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Software Development:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Code generation and debugging</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Project planning and management</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Workflow Automation:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task planning and execution in business processes</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Intelligent personal assistants</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Research and Analysis:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Information gathering and synthesis</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Report generation and data analysis</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Customer Service:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced chatbots and virtual assistants</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-step problem resolution</li></ol><p><strong>Frameworks and Tools for LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>LangChain and LangGraph:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open-source frameworks for building LLM applications</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Components for agent creation, memory management, and tool integration</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agentic Search:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Enhanced search capabilities for agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Retrieval of multiple answers in agent-friendly formats</li></ol><p><strong>Challenges and Considerations</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ethical Concerns:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ensuring responsible use of autonomous agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Privacy and data security considerations</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Limitations:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Current constraints in reasoning capabilities</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Need for precise instructions and prompts</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ongoing Research Areas:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Improving long-term memory and learning</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Enhancing multi-modal capabilities</li></ol><p><strong>Conclusion</strong></p><p>LLM agents represent a significant advancement in AI, offering powerful tools for complex problem-solving and automation. As research progresses, we can expect these agents to become increasingly capable and integrated into various aspects of work and daily life.This lecture outline provides a comprehensive overview of LLM agents, covering their core concepts, capabilities, applications, and challenges. It can be expanded with specific examples and case studies to create a full-length lecture on the topic.</p><p><br></p><h3>Benefits and When to Use</h3><p><strong>Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Easy to implement, rapid prototyping, intuitive for guiding LLM behavior.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need quick and simple control over LLM output, when you don't have a large dataset for fine-tuning, or when you want to experiment with different prompts.</li></ol><p><strong>RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Access to external knowledge sources, real-time knowledge updates, expanded knowledge base.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need to provide LLMs with factual information, when you want to leverage external databases or knowledge bases, or when you need to ensure that the LLM's responses are grounded in real-world data.</li></ol><p><strong>Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Improved performance on specific tasks, style and tone customization, reduced prompt length.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need to train an LLM to perform a specific task, when you want to customize the LLM's output style or tone, or when you want to reduce the need for extensive instructions in the prompt.</li></ol><p><strong>Agent:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Advanced problem-solving: LLM agents can handle complex, multi-step tasks efficiently by breaking them down into manageable subtasks.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When tasks require sequential reasoning, planning, and memory. They excel in situations where simple text generation or information retrieval is not sufficient, and more complex problem-solving or decision-making is needed</li></ol>",
          "_id": "67da95667dd4a4f8852945ab"
        },
        {
          "code": "L143",
          "title": "Introduction to Embeddings",
          "type": "Lesson",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><p>- 掌握Embeddings的基本概念及其在自然语言处理、信息检索等领域的应用</p><p>- 学习如何生成和使用文本嵌入向量表示语义关系</p><p>- 理解不同Embedding模型的工作原理及其对文本表示的影响</p><p>- 提升在实际项目中使用Embeddings进行文本分类、相似性搜索等任务的能力</p><p>知识点介绍</p><p>**Embeddings基础**</p><p>- 了解什么是Embeddings，如何将文本或其他数据转化为向量</p><p>- 学习Embeddings的核心概念，如语义空间和向量表示</p><p>**常见的Embedding模型**</p><p>- 掌握常见的Embedding模型，如Word2Vec、GloVe、BERT等的工作原理</p><p>- 学习如何选择合适的Embedding模型以满足不同的任务需求</p><p>**文本嵌入的生成与应用**</p><p>- 学习如何生成文本嵌入，并应用于相似性搜索、分类和聚类等任务</p><p>- 理解如何通过嵌入向量表示语义相似性，进行语义搜索和推荐</p><p>**模型性能与优化**</p><p>- 探索如何评估和优化Embedding模型的性能，确保其生成的向量具有高语义关联性</p><p>- 学习如何通过微调Embedding模型提升在特定任务中的表现</p><p>**实际应用场景**</p><p>- 了解Embeddings在信息检索、自然语言处理和推荐系统中的应用</p><p>- 探讨如何在项目中应用Embeddings进行高效的文本处理和语义分析</p><p>通过这些知识点，学员将能够理解并应用Embeddings技术，用于各种自然语言处理任务，并通过优化和调优提升模型的表现。</p>",
          "_id": "67da95d07dd4a4f885294abf"
        },
        {
          "code": "L144",
          "title": "Introduction to Retrieval Augmented Generation (RAG)",
          "type": "Lesson",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><p>- 掌握Retrieval Augmented Generation (RAG)的基本概念，理解其在生成式AI中的作用</p><p>- 学习如何通过RAG结合信息检索与生成模型，提高生成内容的相关性和准确性</p><p>- 掌握RAG系统的核心组件，包括文档检索、嵌入生成与生成模型的集成</p><p>- 提升在实际项目中构建和优化RAG系统的能力，满足复杂信息生成需求</p><p>知识点介绍</p><p>**RAG基础概念**</p><p>- 了解RAG的架构和工作原理，学习如何通过文档检索增强生成模型的表现</p><p>- 探索RAG系统中的主要组件：Document Retrieval、Embedding Generation与Generative Models</p><p>**文档检索与生成的集成**</p><p>- 学习如何通过RAG系统结合文档检索和生成模型，提升生成内容的上下文相关性</p><p>- 理解如何在生成过程中动态调用检索信息，确保生成内容的准确性与完整性</p><p>**RAG系统的优化与调优**</p><p>- 学习如何优化RAG系统中的检索和生成流程，提高响应速度和生成质量</p><p>- 掌握如何通过Prompt Engineering和检索策略的调整，提升RAG系统的效果</p><p>**应用场景与案例分析**</p><p>- 探讨RAG在知识问答、文档生成、智能客服等应用中的实际案例</p><p>- 学习如何根据具体业务需求定制RAG系统，提升系统的智能化和用户体验</p><p>通过这些知识点，学员将能够理解并应用Retrieval Augmented Generation (RAG)技术，构建具有高相关性和高准确性的生成系统，并通过优化和调优提升系统性能。</p>",
          "_id": "67da95fd7dd4a4f885294fba"
        },
        {
          "code": "L145",
          "title": "Building RAG from Scratch in JavaScript",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何使用JavaScript从零开始构建一个完整的Retrieval Augmented Generation (RAG)系统</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解RAG系统的核心组件，包括Information Retrieval、Embeddings和Generative Models</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何将检索模块与生成模块无缝集成，以处理复杂的文本检索和生成任务</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何在JavaScript中优化RAG系统的性能，确保在实际应用中的高效运行</li></ol>",
          "_id": "67db8f057dd4a4f885306f75"
        },
        {
          "code": "L146",
          "title": "Integrate Azure AI and OpenAI",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>完成课程 Integrate Azure AI Service and Streaming</p><p>已注册ChatGPT/Open AI并开通Open AI API服务 （需要预存5美金）</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上次课程（Azure语音转文字和翻译）的回顾</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Generative AI</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>几个最常见的Generative AI产品</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ChatGPT 和 Open AI 简介</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ChatGPT vs OpenAI</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open AI API 简介 及其 价钱</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open AI Platform</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Assistant</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Playground</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Other</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在澳洲企业的实际应用案例 （如何玩转Prompt）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Employment Hero - 简历阅读和评判</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Service NSW - ChatGPT 与 Azure CLU的PK</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：Open AI API 初体验 - Open AI Playground 的体验</li></ol><p>=============中场休息10分钟===============</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基于上一章练习（Azure AI 2）的后端应用，改动后端API，提供同样的语音转文字功能，但背后调用的是Open AI，而不是Azure AI</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用Open AI 的 Rest API 把文件传至OpenAI识别出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>整合上一节应用的前端测试（原则上前端无任何改动，实际上需要有一处小改动）</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基于上一节的后端应用，增加一个API，提供对话功能</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用Open AI 的 Rest API 把文件传至OpenAI，让OpenAI回答文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>前端改动，调用新增的这个API，测试</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>做一个chatgpt的马甲：支持文字或语音输入，文字回答 - 40-60分</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>OpenAI on Azure AI Service - 60-80</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI 体验的小结和讨论 - 80-85分</li></ol><p><br></p><p><img src=\"https://image.jracademy.com.au/post/image/image_1754219707714_image.png.image/png\"></p>",
          "_id": "67db8fc57dd4a4f88530803b"
        },
        {
          "code": "L147",
          "title": "Student Showcase: Stripe Integration in Practice",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Student Showcase: Stripe Integration in Practice</p>",
          "_id": "67f633ec33685a211e5474d7"
        },
        {
          "code": "L148",
          "title": "学会撰写IT专业简历",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学会撰写IT专业简历</p>",
          "_id": "67f72f8b7cf9a503e51ac121"
        },
        {
          "code": "L149",
          "title": "LinkedIn & CV",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>LinkedIn &amp; CV</p>",
          "_id": "67f730b27cf9a503e51af6e5"
        },
        {
          "code": "L150",
          "title": "手把手教你运营LinkedIn",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>🌟 <strong>课程简介</strong></p><p>在澳洲找工作，LinkedIn是你不可忽视的第二张名片。本课程将手把手教你打造高吸引力的LinkedIn主页，拓展高质量人脉，并通过运营策略提升个人品牌影响力，让HR和猎头主动联系你。</p><p>💼 <strong>你将学到：</strong></p><p>✅ 从零开始优化LinkedIn主页</p><p>✅ 拓展500+精准职业人脉</p><p>✅ 学会发帖与私信，提升曝光</p><p>✅ 简历与LinkedIn一致性策略，提升求职成功率</p>",
          "_id": "68073f6cb5d34ab45f0e7c98"
        },
        {
          "code": "L151",
          "title": "Workshop: Agile Project Management",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop: Agile Project Management</p>",
          "_id": "680a0a01bc3576956e2fe163"
        },
        {
          "code": "L152",
          "title": "React基础(1) - 代码质量",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码规范的重要性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>课堂实践：写出可读性高的代码 - Income Tax Calculator</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写出符合人类思维方式的代码</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码质量的核心概念：可读性、可维护性、可扩展性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>SOLID 原则</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：写出一个高质量的 getFlightsStops 函数</li></ol>",
          "_id": "682443c9754b6a4959bac082"
        },
        {
          "code": "L153",
          "title": "React基础(2) - 为什么需要 React",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>传统开发 vs 组件化开发</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 的核心概念（声明式 UI、组件化、单向数据流）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用 JS 操作 DOM vs 用 React 渲染 UI（对比体验）</li></ol>",
          "_id": "68244438754b6a4959bae372"
        },
        {
          "code": "L154",
          "title": "开发环境与工具",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是打包工具？(Webpack)</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Babel 介绍：JSX 如何转换成 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是脚手架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目（Vite）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：用 Vite 启动一个 React 应用环境</li></ol>",
          "_id": "68244461754b6a4959baebfc"
        },
        {
          "code": "L155",
          "title": "React基础(3) - 开发环境与工具",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是打包工具？(Webpack)</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Babel 介绍：JSX 如何转换成 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是脚手架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目（Vite）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：用 Vite 启动一个 React 应用环境</li></ol>",
          "_id": "6824448c754b6a4959baf078"
        },
        {
          "code": "L156",
          "title": "React基础(4) - 组件 & JSX 语法",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>JSX 语法规则</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在 JSX 里写 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件的 Props（属性传递）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：编写一个简单的 Button 组件，支持不同文本</li></ol>",
          "_id": "682444b4754b6a4959bafea1"
        },
        {
          "code": "L157",
          "title": "React基础(5) - 条件渲染 & 列表渲染",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>if / 三元运算符 ? : / &amp;&amp; 渲染组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组 .map() 生成组件列表</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么 key 很重要？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：渲染一个 Todo List</li></ol>",
          "_id": "682444ec754b6a4959bb06e6"
        },
        {
          "code": "L158",
          "title": "React基础(6) - 组件的状态",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件是如何保存状态的？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>useState 的基本用法</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>事件处理（onClick、onChange）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>状态提升（Lifting State Up）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：制作一个带开关的灯泡组件（点击按钮切换亮/灭）</li></ol>",
          "_id": "6824453f754b6a4959bb1539"
        },
        {
          "code": "L159",
          "title": "React基础(7) - React 组件生命周期 & 使用 API 获取数据",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件的生命周期（挂载、更新、卸载）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>useEffect 介绍</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>清理副作用（避免内存泄漏）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：制作一个自动倒计时的组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用 fetch 请求 API</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>处理加载中 &amp; 错误状态</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：请求 GitHub API 并显示用户信息</li></ol>",
          "_id": "6824457a754b6a4959bb21fc"
        },
        {
          "code": "L160",
          "title": "React 进阶(1) - Thinking in React",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 1: Break The UI Into A Component Hierarchy</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 2: Build A Static Version in React</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 3: Identify The Minimal (but complete) Representation Of UI State</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 4: Identify Where Your State Should Live</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 5: Add Inverse Data Flow</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>And That’s It</li></ol>",
          "_id": "682445ba754b6a4959bb3025"
        },
        {
          "code": "L161",
          "title": "React 进阶(2) - 测试和 a11y",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>测试金字塔</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Unit Test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>vitest</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>react testing lib</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>js-dom</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>accessibility</li></ol>",
          "_id": "6824460b754b6a4959bb4382"
        },
        {
          "code": "L162",
          "title": "Workshop：前端技术干货分享",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop：前端技术干货分享</p>",
          "_id": "6836d0b6705ef70538c77ded"
        },
        {
          "code": "L163",
          "title": "Workshop：如何使用最新AI工具高效编程",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop：如何使用最新AI工具高效编程</p>",
          "_id": "68380a5b705ef70538dff21f"
        },
        {
          "code": "L164",
          "title": "Tutorial 13",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>作业讲评：</p><p>.NET(2): Assignment</p><p>.NET(3): Assignment</p><p>.NET(4): Assignment</p>",
          "_id": "68527dd36aa070c1cd9f10fc"
        },
        {
          "code": "L165",
          "title": ".NET(9): 构建WEB API项目相关技术 - Entity Framework Core，Linq，Sweager，nlog",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>构建WEB API项目相关技术 - Entity Framework Core，Linq，Sweager，nlog</p>",
          "_id": "685374ff6aa070c1cdae8fac"
        },
        {
          "code": "L166",
          "title": ".NET(10): 构建WEB API项目相关技术 - Web API认证与授权（JWT Authentication & RBAC Authorization）",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>构建WEB API项目相关技术 - Web API认证与授权（JWT Authentication &amp; RBAC Authorization）</p>",
          "_id": "685375ab6aa070c1cdae9f9b"
        },
        {
          "code": "L167",
          "title": "Tutorial 15",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "685376276aa070c1cdaeaac7"
        },
        {
          "code": "L168",
          "title": "Scrum User Story: 实现标准化用户管理 API 与全局过滤器",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Scrum User Story: 实现标准化用户管理&nbsp;API 与全局过滤器</strong></p><p>&nbsp;</p><p><strong>As a</strong>&nbsp;developer,</p><p><strong>I want to</strong>&nbsp;build a UserController that supports CRUD operations for users with validation and consistent API response structure,</p><p><strong>So that</strong>&nbsp;front-end developers and consumers can reliably interact with the API and handle results and errors uniformly.</p><p>&nbsp;</p><p><strong>Acceptance Criteria (AC):</strong></p><p><strong>AC1: 实现用户基本信息模型与验证</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a User class with the following properties:</li></ol><p>- UserName: Required</p><p>- Email: Must be a valid email format</p><p>- Phone: Must match Australian phone number format via custom validation</p><p>- Gender: Enum with values Male, Female, Other</p><p>- Address: Must be 10-50 characters</p><p>- Password: Required，less than 10 characters&nbsp;via custom validation</p><p>&nbsp;</p><p>Use data annotations and custom validation for Password&nbsp;and phone</p><p><br></p><p><strong>AC2: 实现&nbsp;CRUD API</strong></p><p>1.Create a UserController with endpoints:</p><p>- POST /api/user: Add a new user</p><p>- GET /api/user/{id}: Get user by ID</p><p>- PUT /api/user/{id}: Update user by ID</p><p>- DELETE /api/user/{id}: Delete user by ID</p><p>2.Post, put API must use the User model as a parameter</p><p><br></p><p><strong>AC3: 统一&nbsp;API 返回格式</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>All API responses must follow a common structure:</li></ol><p>{</p><p>&nbsp;&nbsp;\"success\": true/false,</p><p>&nbsp;&nbsp;\"message\": \"Operation result message\",</p><p>&nbsp;&nbsp;\"data\": null or object,</p><p>&nbsp;&nbsp;\"errors\": [] or null</p><p>}</p><p>&nbsp;</p><p><strong>AC4: 创建&nbsp;ActionFilter 拦截器</strong></p><p>1.Implement a class inheriting ActionFilterAttribute</p><p>2.Log or capture:</p><p>- Action name</p><p>- Parameter names and values</p><p>3.Apply globally or decorate on the controller</p><p><br></p><p><strong>&nbsp;AC5: 创建&nbsp;ExceptionFilter 异常过滤器</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create CustomExceptionFilter class implementing IExceptionFilter</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Catch all unhandled exceptions</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Return a unified error response using the API structure above</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Apply globally to all controllers</li></ol><p><strong>&nbsp;</strong></p><p><strong>AC6: 创建&nbsp;ResultFilter 响应结果拦截器</strong></p><p>1.Implement a ResultFilter that:</p><p>- Adds a timestamp to all successful responses</p><p>- Ensures response remains in unified format</p><p>2.Apply globally to all controllers</p><p><br></p><p><strong>AC7: 添加一个自定义中间件</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Middleware to log all incoming request paths and timestamps</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ensure it runs before controller processing</li></ol><p><br></p><p><strong>Definition of Done:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>All code builds and runs successfully</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>All endpoints return the correct JSON format</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Validation errors are returned clearly under errors</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Filters and middleware work across all actions</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Tested using Postman with various valid/invalid inputs</li></ol>",
          "_id": "685754266aa070c1cdeec15f"
        },
        {
          "code": "L169",
          "title": "AI Coding & Vibe Coding Workshop",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>AI Coding &amp; Vibe Coding Workshop</p>",
          "_id": "6892f5841872983abefe6244"
        },
        {
          "code": "L170",
          "title": "Project 2 Tutorial 01（全栈25期）",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">介绍</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">在这部分，我们将概述整个项目的框架。你们将了解到，我们为什么选择天气预报应用作为学习项目，以及它如何帮助你们在现实世界中应用编程技能。这将是一次从零开始构建一个完整网络应用的旅程。</span></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">天气应用项目的要求</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">我们将详细讨论项目的具体要求，包括用户能够输入城市名称、查看当前天气状况以及获取未来三天的天气预报等功能。这将帮助你们理解项目的核心目标和功能。</span></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">完成项目的目标</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">这个环节会让你们明白，完成这个项目不仅仅是为了制作一个应用，而是为了提升你们的技术能力，如 API 交互、前端框架的应用、代码组织和架构设计技能，以及测试驱动开发的实践。</span></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">项目的设计图介绍与分析</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">我们将一起审视项目的设计图，分析应用的用户界面和用户体验方面。这将帮助你们理解如何从用户的角度来思考，并将这种思维转化为实际的代码和设计实现。</span></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">完成这个项目需要的技术栈</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">在这个环节，我们将讨论构建该应用所需的技术栈，包括前端框架、API 请求处理、状态管理等。无论你们是刚接触前端开发，还是希望巩固已有知识，这都将是一个极好的学习机会。</span></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">React 项目框架搭建</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">环境设置</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：通过配置开发环境来搭建 React 项目，包括安装必要的依赖和工具。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">项目结构</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：创建项目的基础结构，包括设置路由、状态管理等。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">基础代码编写</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：编写一些基础代码，确保项目能够顺利运行。</span></li></ol><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">组件命名</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">命名规则</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：明确组件命名的最佳实践，这有助于提高代码的可读性和可维护性。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">实际操作</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：我们将实际命名一些将在项目中使用的组件，并解释这些命名背后的逻辑。</span></li></ol>",
          "_id": "68c23491715ffd88cde00553"
        },
        {
          "code": "L171",
          "title": "Project 2 Tutorial 02（全栈25期）",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">布局设计</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">用户界面规划</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：首先，我们将对天气应用的用户界面进行详细规划。这包括定义主要视图（如主页、详细天气页）及其组件（如天气摘要、预报列表、搜索栏）。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">信息架构</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：深入探讨如何组织信息，使用户能够轻松理解和访问天气数据。这涉及到决定哪些信息是首要显示的，以及如何逻辑地组织次要信息。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">交互设计</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：考虑用户与应用交互的方式，如搜索城市、切换温度单位等。这将影响布局的设计和组件的放置。</span></li></ol><p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">静态页面实现</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">HTML结构</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：创建HTML文档结构，构建应用的骨架。这包括定义必要的HTML元素，如头部、导航栏、内容区域和底部。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">组件化开发</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：将界面分解为可重用的组件，这有助于提高代码的可维护性和可扩展性。例如，将天气卡片、搜索栏等元素作为独立组件。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">布局技术</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：创建响应式布局，确保内容在不同屏幕大小下都能有效地展示。</span></li></ol><p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">样式和响应式</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">样式定义</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：利用CSS或CSS预处理器来定义样式。这包括设置颜色主题、字体、边距、间隔等。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">视觉吸引力</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：强调视觉吸引力和品牌一致性，确保应用的外观既美观又专业。包括颜色搭配、字体选择、图标使用等。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">响应式设计</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：实现响应式设计，确保应用在不同设备上都能提供良好的用户体验。这可能涉及到使用媒体查询、弹性布局等技术。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">交互动效</strong><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">：考虑添加一些CSS动画和过渡效果来提升用户体验，如加载动画、按钮悬停效果等。</span></li></ol>",
          "_id": "68c2358e715ffd88cde0719e"
        },
        {
          "code": "L172",
          "title": "Project 2 Tutorial 03（全栈25期）",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">功能实现</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">交互实现</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：为页面添加交互功能，包括处理用户输入、显示数据、以及响应用户操作等。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">状态管理</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：管理组件状态，如表单输入验证、条件渲染等。</span></li></ol><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">连接 API</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">API 集成</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：我们将学习如何使用 HTTP 客户端（如 axios 或 fetch）连接到 Weather API，获取所需的天气数据。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">数据处理</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：处理 API 响应，包括解析数据、错误处理以及状态更新。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">动态显示数据</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：将从 API 获取的数据动态展示在用户界面上。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">调试与测试</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：编写测试来验证 API 集成的功能。</span></li></ol>",
          "_id": "68c23646715ffd88cde0a2c3"
        },
        {
          "code": "L173",
          "title": "AI in Programming Workshop",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>AI in Programming Workshop</p>",
          "_id": "68c7a2df360f12aea632042d"
        },
        {
          "code": "L174",
          "title": "如何撰写IT专业简历",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">清晰的格式和布局</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：使用易于阅读的字体和清晰的布局。保持简历的长度适中，通常不超过两页。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">个人信息和联系方式</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：包括你的姓名、职业头衔（如软件工程师、系统管理员等）、联系电话、电子邮箱和 LinkedIn 个人页面链接。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">专业摘要或目标声明</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：简洁地概述你的职业背景、技能和你寻求的职位类型。这部分应该具有吸引力且针对你申请的职位量身定制。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">技术技能</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：明确列出你的技术技能，如编程语言（例如 Java、Python）、框架（如 Spring、React）、数据库（如 MySQL、MongoDB）和工具（如 Git、Docker）。根据求职职位的要求来调整技能列表。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">工作经验</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：按时间顺序列出你的工作经历，包括公司名称、职位、工作时间和职责描述。突出具体成就和使用的技术。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">项目经历</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：如果你有相关的项目经验（包括学校项目、个人项目或自由职业项目），请列出来，说明你的角色、使用的技术和项目成果。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">教育背景</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：提供你的最高学历信息，包括学校名称、学位、专业和毕业时间。如果你是新毕业生，可以更详细地说明你的教育背景。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">证书和培训</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：如果你有相关的行业证书（如 AWS Certified Solutions Architect、Cisco 的 CCNA）或完成了重要的专业培训，务必列出。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">其他信息</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：如语言能力、志愿者经验、获奖情况等，如果它们对你申请的职位有帮助，可以选择性地加入。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">定制你的简历</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：针对每个职位调整你的简历，确保它符合职位描述中的关键字和要求。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">校对和审核</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：在提交前，请仔细校对你的简历，确保没有拼写和语法错误。有可能的话，让你的同事或朋友帮你复查。</span></li></ol>",
          "_id": "690449988e9052303811926a"
        },
        {
          "code": "L175",
          "title": "Lab(9)：使用React构建收支管理应用",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691fd6fa83c15bc978860e60"
        },
        {
          "code": "L176",
          "title": "Vibe Coding",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6941227fbc0df65b1893d060"
        }
      ]
    },
    {
      "name": "AI Web全栈班27期.NET寒假班",
      "color": "#10b981",
      "summary": "",
      "test": {
        "questions": 0,
        "passRate": 0,
        "unlocks": ""
      },
      "lessons": [
        {
          "code": "L01",
          "title": "课前须知",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>课前须知：</p><p>欢迎来到Web全栈开发课程！为了帮助大家更好地投入学习并取得最佳效果，我们特别准备了以下课前须知，请仔细阅读：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>预习材料</strong>：建议同学们提前自学W3Cschool中的HTML、CSS和JavaScript部分内容，多加练习可以帮助你更好地理解课堂内容。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>课堂设备准备</strong>：为了提高学习效率，建议大家在上课时使用多个屏幕。你可以通过外接显示器或使用iPad来播放课程视频，同时在电脑端进行代码练习和做笔记，这样的方式将帮助你更好地掌握课程内容。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>做笔记的重要性</strong>：良好的文档管理能力是成为专业人士的重要技能之一。上课时建议大家积极做笔记，可以在匠人课堂的线上平台完成笔记记录，也可以选择私下整理笔记。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutorial 环节</strong>：本课程设置了专门的Tutorial环节，旨在为大家解答学习中的疑惑。请充分利用这个时间段，解决你在学习中遇到的问题。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实践至上</strong>：学习IT技能的最佳方法就是多加实践。请勇敢迈出编写代码的第一步，只要不断练习和动手操作，你离成功就不远了。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>积极提问</strong>：由于课程采用线上教学模式，老师不在身边，因此在遇到问题时，请务必通过分享屏幕或截屏的方式向老师提问，这样有助于老师更准确地理解你的问题并提供帮助。</li></ol><p>期待大家在这门课程中有所收获，并取得优异的成绩！如果有任何疑问，请随时提问，老师们会在第一时间为你解答。让我们一起努力，迈向成为全栈开发工程师的目标！</p>",
          "_id": "68491cffcf1221161b82ae6d"
        },
        {
          "code": "L02",
          "title": "课程准备",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>为确保同学们在全栈开发课程中获得最佳学习体验，请参考以下准备指南：</p>\n<ol>\n<li><strong>基础知识预习</strong>：建议您在正式课程开始前，访问 <a href=\"https://www.w3schools.com/\">W3Schools</a> 等在线资源，自学 HTML、CSS 和 JavaScript 等基础知识。多次复习这些基本概念将为您加入全栈班级打下坚实的基础。</li>\n<li><strong>课前准备</strong>：请务必查阅我们为您准备的 PPT，以便做好充分的课前准备。这将帮助您更好地理解即将学习的内容。</li>\n<li><strong>课程笔记和项目</strong>：\n<ul>\n<li>课程笔记可在此处查看： <a href=\"https://github.com/australiaitgroup/full-stack-bootcamp-wiki\" aria-invalid=\"true\">https://github.com/australiaitgroup/full-stack-bootcamp-wiki</a></li>\n<li>我们的课程包括三个实践项目，您可以参考以下信息：<a href=\"https://github.com/australiaitgroup/jr-full-stack-projects\">https://github.com/australiaitgroup/jr-full-stack-projects</a></li>\n</ul>\n</li>\n<li><strong>编辑器工具</strong>：您可以根据个人喜好选择任意一款代码编辑器，如 VS Code、Webstorm、Intellij 等。</li>\n<li><strong>Node.js 安装</strong>：请自行安装 16 版本以上的 Node.js LTS（长期支持）版本。</li>\n</ol>\n<p>我们期待着与你在全栈班的旅程中携手前行，并助你成为一名出色的全栈开发者！</p>\n<p>&nbsp;</p>",
          "_id": "69e329409f9cc30e74196cc7"
        },
        {
          "code": "L03",
          "title": "Introduction & Career",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2><strong>Web全栈班课程内容介绍</strong></h2><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>匠人学院概述学院背景与发展</strong>: 匠人学院（JR Academy）成立于2017年，总部位于澳大利亚布里斯班，目前在悉尼、墨尔本、阿德莱德等主要城市设有分部。学院致力于为澳洲华人提供高质量的IT教育，帮助学员提升技能，实现职业发展。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>使命与愿景</strong>: 我们的使命是通过技术赋能教育，以专业和匠心服务用户，助力学员开启他们的第一份澳洲IT工作。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学员与导师的覆盖范围及影响力</strong>: 学院已培训超过4000名IT学员，拥有600多位全球导师，举办200多场线上线下活动，并成功帮助数千名学员拿到offer。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Web全栈班课程简介基础课程</strong>（3.5个月）：涵盖HTML、CSS、JavaScript、数据库、Web框架等核心技能，帮助学员打下扎实的技术基础。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目实战</strong>（3个月）：学员将参与3个实际项目，包括商业级个人/公司Landing Page开发、Web Application Delivery，以及Agile Team Project Delivery。在项目实战中，学员不仅能巩固所学，还能积累团队协作和项目管理经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>AIGC新内容</strong>：课程新增人工智能生成内容（AIGC）模块，帮助学员掌握最新的AI技术，增强竞争力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>职业辅导</strong>（2个月）：在Career Coaching阶段，学员将接受全方位的职业辅导，内容涵盖职业规划、简历优化、面试准备、谈薪技巧等，确保学员在求职时有充足的准备。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>简历内推库</strong>（12个月）：学员将享受为期一年的简历内推服务，简历将由专业导师审核优化，并推荐至行业内相关岗位，增加就业机会。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>导师与辅导团队导师背景与专业领域</strong>: 我们的导师团队由来自全球知名IT公司的行业专家组成，涵盖软件开发、云计算、DevOps、数据分析等多个领域。导师不仅具备丰富的技术背景，还拥有多年的教学与面试经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>辅导老师与班主任角色</strong>: 每期课程配备专属辅导员和班主任，负责学员的日常学习辅导、作业批改、课程反馈与建议，确保每位学员都能得到个性化的指导和支持。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学习模式与平台课程授课</strong>：由一线大厂导师主讲，传授前沿技术和实用经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutorial</strong>：通过课堂和项目Tutorial，学员在学习中得到及时的答疑和作业批改反馈。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目实战</strong>：学员将在导师的指导下，完成商业级项目，积累实际工作经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>IT Career Coaching Bootcamp</strong>：职业辅导包括求职技巧、职业发展规划，帮助学员更快适应职场。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>元宇宙互动学习平台</strong>: 学院独创的线上互动学习平台，将元宇宙场景融入学习中，打破远程学习的社交壁垒，提供24小时线上自习室和团队协作环境。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>线上自习室与团队协作</strong>: 学员可以在元宇宙平台上找到学习伙伴，共同学习并参与项目，快速建立紧密的团队协作氛围。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>职业发展与就业支持简历内推库与求职指导</strong>: 匠人学院为毕业学员打造了专属的简历内推库，每份简历都经过专业导师的审核与优化，并优先推荐给合作企业，帮助学员缩短求职路径。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Career Coaching Bootcamp</strong>: 该课程提供为期2个月的职业指导，涵盖职业规划、简历优化、面试技巧、薪资谈判等内容，帮助学员全面提升就业能力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实习与工作内推课程</strong>: 学院与多家一线IT公司合作，提供实习机会和工作内推服务，为学员搭建与企业接轨的桥梁。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实战项目与案例分析项目背景与设计原则</strong>: 每个项目都源自真实商业场景，要求学员与客户合作，理解并实现他们的需求，从而锻炼实际开发能力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目提交要求与评估标准</strong>: 项目需提交完整的代码、文档和展示链接，评估标准包括代码质量、功能实现、用户体验等方面。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>真实商业项目体验</strong>: 学员将参与多个真实商业项目，如个人或公司Landing Page、Web应用程序开发、云服务集成等，积累宝贵的项目经验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学员社区与支持体系班长与课代表制度</strong>: 学员可以竞选班长或课代表，协助导师管理课程，解答同学疑问，并参与课程反馈，锻炼领导能力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>社区互助与资源共享</strong>: 学院拥有活跃的学员社区，成员间互帮互助，共享内推资源与学习资料，形成良好的学习氛围。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学员信息统计与社区互动</strong>: 学院定期统计学员信息，了解学员需求，组织线上线下的互动活动，增强社区凝聚力。</li></ol>",
          "_id": "6834079e705ef70538933632"
        },
        {
          "code": "L04",
          "title": "【课后阅读】“计算机专业要学哪些？\"10 分钟带你白嫖完三年科班程序员的必修课",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>面向对象编程（OOP）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 OOP 的核心概念</li></ol><p>前端（Front-end）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 HTML、CSS、JavaScript 的魔法</li></ol><p>系统编程（System Programming）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解系统编程的重要性</li></ol><p>图像处理</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>图像在设计和计算机视觉中的奥秘</li></ol><p>互联网协议（Internet Protocols）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>互联网协议的秘密</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 TCP/IP 和 HTTP</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>网络通信的魔法</li></ol>",
          "_id": "69e329409f9cc30e74196cdb"
        },
        {
          "code": "L05",
          "title": "开课讲解会",
          "type": "Lesson",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>主要内容：</strong></p><p>1. 课表查看</p><p>2. 课程资料查找</p><p>3. 课程回放查找</p><p>4. 学习平台资源</p><p>5. Jobpin简历生成器使用</p>",
          "_id": "6834079e705ef70538933633"
        },
        {
          "code": "L06",
          "title": "HTML & CSS 的奥秘",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>网页的心跳: 网页如何呈现给用户</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>网页旅程: 探究一个网页如何从服务器传输到你的屏幕的背后原理。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML标签揭秘: 网络的基石。熟悉最常用的标签并理解它们的功能。</li></ol><p>深入HTML的构架</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML结构: 学习HTML的基本框架和其重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>头部(Head)解析: 头部标签里包含了什么? 为什么它是如此重要?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML的观众: HTML是为了人类还是机器而创建的？或者两者兼而有之？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>元素之间的区别: 什么是Block元素? 什么是Inline元素? 为什么需要区分?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>常用标签探讨: 深入了解和实践常用的HTML标签。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签的语义性: 为什么选择正确的标签很重要？如何提高代码的可读性和无障碍访问性。</li></ol><p>HTML的其他要素</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML注释的艺术: 为什么注释是重要的，以及如何正确地使用它们。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跨浏览器的兼容性: 在不同的浏览器上，为什么同一代码会显示不同的样子？如何确保你的代码对所有用户都是友好的？</li></ol><p>现代HTML5新增特性</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>新的语义标签: 如&lt;article&gt;, &lt;section&gt;, &lt;nav&gt;, &lt;header&gt;, &lt;footer&gt;等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多媒体标签: 如何使用&lt;audio&gt;和&lt;video&gt;标签嵌入音频和视频。</li></ol><p>表单与用户互动</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>表单基础: 输入类型、标签和属性的详细介绍。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据验证: 如何使用HTML自带的验证功能确保用户输入的数据有效。</li></ol><p>网页的布局基础</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Box Model: 详细解析边距、边框、填充和内容如何共同作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Position: 学习static、relative、absoulute和fixed定位的基本知识。</li></ol><p>响应式Web设计入门</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Viewport: 什么是Viewport？为什么它对移动设备如此重要？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Media Query: 基础介绍，如何根据不同的设备和屏幕尺寸应用不同的CSS样式。</li></ol><p>与其他技术的交互</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>嵌入JavaScript: 简单介绍如何在HTML中使用JavaScript增强互动。</li></ol><p><br></p><p>作业：registration_form</p>",
          "_id": "69e329419f9cc30e74196ce8"
        },
        {
          "code": "L07",
          "title": "HTML & CSS的奥秘: Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>创建Registration Form</strong></p><p><strong>作业背景：</strong></p><p>网页表单是任何交互性网站的核心部分，无论是注册、登录、提问还是购物，表单都扮演了关键角色。为了强化你对HTML和基础CSS的理解，我们为你设计了这个作业，让你从实践中学习。</p><p><strong>作业要求：</strong></p><p><strong>表单结构</strong>：你的表单应该至少包含以下字段：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>First Name (text input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Last Name (text input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Email Address (appropriate input type)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Password (password input field with appropriate attributes to ensure security)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Confirm Password (password input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Date of Birth (date picker)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Gender (radio buttons: Male/Female/Other)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>About Me (textarea)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Choose Your Profession (dropdown list with options like \"Web Development\", \"Data Analytics\", \"UI/UX Design\", etc.)</li></ol><p><strong>布局和样式</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用CSS为你的表单元素添加基本样式，如边框、背景颜色、文本颜色等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保所有元素在各种设备和屏幕尺寸上都有清晰的布局和良好的可读性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>考虑元素间的间距，确保表单整体布局美观。</li></ol><p><strong>交互</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为提交按钮添加hover效果。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用HTML5验证功能确保在提交之前填写了所有必需字段。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保电子邮件和密码字段有适当的格式限制。</li></ol><p><strong>代码清晰性</strong>：确保你的代码结构清晰，HTML和CSS均应有合适的注释说明。</p><p><br></p><p><strong>参考UI图：</strong></p><p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnIAAAS+CAIAAADKtlE3AAAgAElEQVR4Aezd/ZMc5WHoe37wn+I/YktVVE1FweMjCBwRSIQBxbaIj/HLXcyWfbyOUV7swD0Qr0qVa6WufCEQTlG2MaiwsOwYg7HLPhgI8ZEtq+zCsQMS6HW1WjGndpOUya3unu55el5Ws7vPTM9Mf1xbeHZ2pqf7M6P9Pk93z+w1/+l/BAgQIECAQCSBayItx2IIECBAgACB/5RVLwICBAgQIBBNYGBWf/e7363/+3/8n/V/a62t+yJAgAABAgQKgf+z/m/r//4fv/vd73pr3D+r6//+H8WdXSBAgAABAgT6Cqz/+390lbVPVtf+7d/73tmVBAgQIECAQJfA2r/9e1jW7qyap3Z5+ZYAAQIECGwsEM5ZS1n93e9+t/E9/ZQAAQIECBDoFSiOs5ayaqraK+UaAgQIECBwVYFiwlrKqvN+rwrnBgQIECBAoFfg/6z/W3aEtZTV3tu5hgABAgQIEBhGQFa9H5cAAQIECEQTkNVolMOMYtyGAAECBGZbQFZllQABAgQIRBOQ1WiUsz3+snUECBAgMIyArMoqAQIECBCIJiCr0SiHGcW4DQECBAjMtoCsyioBAgQIEIgmIKvRKGd7/GXrCBAgQGAYAVmVVQIECBAgEE1AVqNRDjOKcZtJFli5eOK7X1m6685br2vumms0069djRtuvXHfZ/768Zd/tTLgpXLi0O72jZO7zB8dcLO1Cbj+6GK+Xc25xt6lEwNX6fjBvZ1b7jl0fBJW3joQmBIBWR34m2WSA2DdYgusvnL4k+/bmaV0wH933vLhwz+92PsPW1Z7TVxDoMYCsiqrBFqvHfzQjmDG2ZmodV+565aDP1vp+n0hq10gviVQbwFZFZW6C6y88MWd3fkcMGFNbrbnCz9pxZ4rj+spsBO43r/up/V1O23PmqyO6zfatL0yavMv8OITnyiOpDbnGjfc9LknfnjyXHtn75WL/3ryxaX/dks4l23s/8G04siqf4YERi8gq7Jac4EfLL6/MzdtfuGl7n28yT/C3xz6k85t5qb3FB5ZHf2v1GkdcpGJJyCrNY+KzT82H+wBvvHAzzb9a/Hqx1ZbZ39+5L59d/zedWmbd9543Z3/fenZXyYT4rBzpVqHa5Wdsrv682cPLfRdyPC/DsKH2/KZwOFC0nW++NsXDy3efeOuG7Jj0tfuuuPOvzry04tTu6t8eE+3JNBPQFZ1peYCr3zhpmAmuvNDX3jxdL8J62Clq2T17Hf23xbuQy7Oh9r5p4+99nTwjpcNsvqjl+7f245WcffsQrKQK4PXrevffFjEOFn922898en+Z1Bfd8d93zu76TFK1wr7lsAUCsjq0L+SpvDZ9UttCIHWd/7spq5WXftf777vKy++cmZ1iLuvtzbK6sWjn725a+Hhtzt2Bod1B2b1pp3XBzcL5tbZonYfPDnUenZNjqNkdeeuviOG9jbuvGXh2xeHXTf/vgjMioCsymrtBX792O0D3rF67a59dz34xA9fv7jR/HVwVrvOMd7xh/d99efJolYu/ss/PnTXtV2BHJjVbNfxbfc+eeLslfXWlYs/ffze0qnLNz304yF/H0WfraabsOMPPn3of/1rsk975dwrT953Q4h5/RefG34yPeRWuBmByRaQ1dpHZbJfoOOZ65w+ulgKVVfwGs0dzQ9+8uB3ft73g5YGZrV8jvH7P/3kmfDF1nrtQPBJRo1m+Uyo8Nhq77t6umbYHz38RrjkwZdHkdXu7Vrvwrz9kVPjeRI9CoEJEZDVwb+D9KZOAqd/dOjDf7DRvtZkx+Z1dyw8/evumeugrF45Nh/M2/rsqi3fYKOsliay6St26ECWftEMfa+NPrywtJDmnsO/KT1E8popnzh999fP1umF1KPhN0ztBGS1dk+5f/aDBZKzbT/5gRs3Ol7YuOGP/9/yscxBWT3+tzd2Zr23fuEnva+0i4/fHZwtVWpneba6cKx7nUtt2+jTfUt3HPpeQ2f1jgeP927X+msH7ugcQn7/F5+TVQJ1EpDVPr8USr+J6vRqsOGZQP6Z+7u7D39mmdz50cO/Dl42g7I6RMN+/MCtnfwMzmqft/2UHrTCrPbf/3z2ifnOdjUWj/hHRKBOArIa/H6s0xOvoEMJrJx75dlDn7yzu6+lPbqlwgV/wWaIrA6eFJZmq6WHy16lpQeNn9XBvS+/13ZQMkvbLqt+ydRLQFbr9XwP1RLDix6Biyf/vzuCA6Vz4V7ZUuE2l9XB9RpNVkv7pTeK8ZGFQXunu7LafyFmq/6h1VlAVmW1zgK/Onh70I8NT64plWaYrJYatq1jq9Fmq788fEvncG/fs42yF8PJpT0BS7ix3W9+vWnxhT6vn9Kx1eHf/9Mzmqnzr2bbPr0Cstrnl8L0Pp3WfLMCpfli4+b5owM+GOjMNz8efHTwjs/+Y+eBBs1Wyyf69knjhac/Es6ABx9b7XPf0oP2nzJ21rCTq3+8N3zE6xePlN7z0/630PUOmeYDr5QWVdrB2+z3KcrOBPZbpdYCslrrp7/067Lzy7dOJv90YFcwgUv/gs2j3/3nt5IPXkhAWmdP/eqHj//5TdnH+bZvuesjXw8+PKhUuGAn8Fq0963Gy2p5lbK3DD3+8on250m1zp46/sxDXX/OvWc+Ws7q3M4PLR0vffxv+UMwylb1fI3Z6poJyGqdElKzF/dwg4arfL5gcEZrvl/05od+HH5y0MCsrq/85KGw2cGnLJ346md7Pih4HLPV9daJw7eEE9bSkCLfwODKHbcfPt71sunKatLmu+5//l/anwDV9SlLXVZdi/ItgVkUkFVZrb3AlZ8t3X61D4IoSnPdXQfLk7MNPxO49dz+jT4TuNTs8WR1rfXaIx/f+COlOmvVu7Hdx1Z3XXvdYLqeiexwA53avyBnsTS1eupl1b9hAuutK79+8nN39H+XahHURvPaP/rzJ39V2uGZ/LIYPFtNf5WcPfLZ0l9Bz6O164b93/3KPcEEcUxZTfZs//bb95d3awerkW/vtX90/7Nv9mxsd1b3Lg366zrX3XX/jwYcqJYNAjMtIKuiQqAtsHLxxDMHH7jrzlub+Z8OTRJ43e7mrXd/4sFHv5t+Sn6fQfdVsppm7MVHFvbd1sj2vl63+8Z99//9q8mfnyudXXz74V90fteM5g02neWvt66cfunxpU/su6N5Q/ipUjf83k133Pmppb/PPjo/vH1xubQTOD1bKlnU/XfenC1nV+OGfXc9eKT/5ycXC3GBwOwKyKqoEKhMoJTVrvexTOwvnd6sTuyqWjECVQjIamW/UvvMe6p4BViNkQmcXNq7u3nnPQsPPvq1F47/S5+/3lp6I8otX/7VyNYk6otcVv07JbChgKxG/Y2zofV0/NK0CdEEWkcWwtN5dt1y4Cdvtf+0XPJWlvLJwH96KPyc4WjrMIKXt6xO8rNj3SZAQFZH8HtnAp5XCZ8Ega432OQnK/U5P2jnZ/9xav56mqz6B05gQwFZlVUCoxNo/fbbX7zhKu8T3fW++a//Mnwj7Ib/YqsfLsjqhD9BVq9qAVkd3a9USyaQCqz88rtf6TnndueN1920766/PPTMoBOMq/7VMLDfsjqxT40VmwwBWfWrnwABAgQIRBOQ1WiUA0f3kzGAsnoECBAgMAYBWZVVAgQIECAQTUBWo1GOYRDkIQgQIEBgwgVkVVYJECBAgEA0AVmNRjnhAyirR4AAAQJjEJBVWSVAgAABAtEEZDUa5RgGQR6CAAECBCZcQFZllQABAgQIRBOQ1WiUEz6AsnoECBAgMAYBWZVVAgQIECAQTUBWo1GOYRDkIQgQIEBgwgVkVVYJECBAgEA0AVmNRjnhAyirR4AAAQJjEJBVWSVAgAABAtEEZDUa5RgGQR6CAAECBCZcQFZllQABAgQIRBOQ1WiUEz6AsnoECBAgMAYBWZVVAgQIECAQTUBWo1GOYRDkIQgQIEBgwgVkVVYJECBAgEA0AVmNRjnhAyirR4AAAQJjEJBVWSVAgAABAtEEZDUa5RgGQR6CAAECBCZcQFZllQABAgQIRBOQ1WiUEz6AsnoECBAgMAYBWZVVAgQIECAQTUBWo1GOYRDkIQgQIEBgwgVkVVYJECBAgEA0AVmNRjnhAyirR4AAAQJjEJBVWSVAgAABAtEEZDUa5RgGQR6CAAECBCZcQFZllQABAgQIRBOQ1WiUEz6AsnoECBAgMAYBWZVVAgQIECAQTUBWo1GOYRDkIQgQIEBgwgVkVVYJECBAgEA0gQnK6vOv/2LfU4ff+6V73/P5O9/z+Tvf+6V79z11+PnXf7HFgcmvH7t9Z3Ousev2R34zYAm/OfzhXXON5s6FY6fXooEOeKzu5R8/uHeu0Zw/2n39kHff1M1iPNax+UZzbs+h45uEWvnVNxfu3H1toznXaO740GO/2uTdN7WZbkyAAIFJEJiUrO576vA1n/tA3699Tx3emtSvHvnojkZzbuf842f61Ov0E/PJT6+/7+iFPj/d2iMOf68YqRt2tWM81tay+tP7b05GNo0P3LOwuH/h0X8e3sctCRAgMKUCE5HV33/4/r5BLa78/Yfv35Lv2cfvTuajO+7+evd89MzX9yVz2ZsXX2htacnDJm3QwmOkbrvrMGjdol1/4ev7Gs25mx76sUkqAQIEaiNQfVY3mKcWWb3mcx/Y4py1nc9d+544G9SindtdD7yyUtEzXYusnji0e0u7joNnauKHDhW9fhARIDCxAhVn9fnXfxG2c+PLWzvO2t7Z+/5PP5nvCs6u2XH7odeudH5rr7z5w0P37ruumcxu567bfeO++796cjV42k4u7WnONfYunejcpbW2ntVx98GT7VumIdl98KUXD37yfTubcztvvP7/euJEv9+8eVbPvnj4v9+cPuiO5m13/tWRn6+Ult9aW7948sh9++5or1hjV+OGfZ88/MPfBmveWlv9+ZP333lrfgizecut9x761q86s/D8scIlh3dJlrnw5C8v9lvPXKBrJ3D67cKxlTd/uPTxO37vuuTQ6bW79n3y8Ev5XoGMK7k+/1o80l5+90P3bE64ni4TIEBgygQqzuqQU9Ust1ucsK6156aNe76Z/NI/882Pv785t/NDS8c74Tn9o4duSc9vyo4CfmLfH6dn2dw8f7SY424iq43rb96x88abP7Z/4WMf/MMDP83LVHplZKnb9Ye37Wjset8HP7OweE87rn94/3PBsd7TRxd3JoeH06Ut7l/42L6sYTs/+49n25VqvXbwQzsazR3ND961uH9h8TN33nxjekT5o4d/3X7EnqyePbJwczZ6uPVj+xc+dfd/Sbu44alb/bL6J5/60+vzx/3YBxsJYHPn/h+kOwBOffNv9i/Mf7DRaM69/4MfTVbsf/5kbb115dePfyJ76D++81P7O1tdHuL0FXMlAQIEpkKg4qy+90v3bjxDDX/63i/du0XTLKXJkdSzRz9781xj1y1fzueXa+utC/947/XJcdb5p08X+4Tbod1ZxGkTWZ1r3PTxp4sel2parH+WutKDXjn9ZFq7vEzrrSsvfKZnBNAeFjTmH8/qmx2/vPmhH3fmr60fP7Dn2l233vVo+xTorqye/fq9SYZvf+jFfPreOnNsPhW474f917a11i+ryUnU3yzmzSvH/zbZ5btz8UixJj07gY9/OR0B3P63rxST8jy0na3eaNI8aPVcT4AAgUkRqDir7/n8nWE4N778ns/fWWRpsxdOP/3pZOZ03Q3XNpo7Plx6p8dvHvnoXKPZWDiWz//az83LD+2ZazSbD7ySPtZmsvr+Lz53tTZkqWv82QtFyJNHufD0R5Jdx3mZXvgfu2648dqFY6XbrJXXJEvXnzyywXtXylk9dfjDzbnGrft/1Jmst9bWzz4xf+2uW2/7f342ALZvVrt2iZdXbG291Z3VHyy+v8+O9PZWFwOFq9ENWMNJ+Rdl9QgQqLlAXbLaWjv75D03JXs+e95vc/SzyfHUjz9dykzysjj+tzc2mnO3H/5F8ou+pxnpb/+sWF3HVuc+/NhvrtaG7I49D9pu3hd+UorEysW3/uXky9986omlv/xMfgy1SNqP70smms1r/+iev/7Kd374+sVyg5PllLOaBnLnfUevtoblfxj9stqzkCML5Wp2ZfWXh29pNOdu/dvXuh+69eQ9yftw7v12aavLK+BHBAgQmA6BirM6pp3A2e/xo4tJVheOlX9fZyW748HjPU9Y6f0hm8lq90P0LLmduj4Pmpap8zERyccpfCA9Vto+92dX44bb3lee860cP3x7dqZV9qkLzdvuXDz0THC+VSmrXanrLlyfVU25+mW159MhrpLVF76Y7DC455u94f/xA7fONZr7nrhYfmoGrYzrCRAgMLkCFWd1LKcs5fpby2p7dlVFVtsfFHXDTR9bOvTUi6/865tvJYck+63JlYu//F9P/PWn7r6+09fO+VbTktWeuXv+xA3bfrcnQIBA9QIVZ3UMb7DpTID6Z3V94E7gnzzU3NpO4GFnq51Zab6SpalzNodrfuGl8vSuX1aD8Fz87ct//9nbkpOBbz7wcnp9KatXvvnxZE94jJ3Am52tDtwJfPHxu+0Erv53Qf4itCYECGxLoOKsttbWh5ywbvXdNYHOgKxufMpSY/8Psl836R7OmxZfCBa4lvWg2X1sdeisdifzzBMfTN6R0j7jqWuHcPu33q8f2ZPs7G0fW33jq59p3nDjrvZ5Vfm6Ze1stN8qWsrq2m8O/UmfU5ZaP3moed3u5uK3Brx7NcZO4LWNT1n66OE38vUPRgl+1xMgQGC6BKrPamttfWQfXlj+NT0gqxu+weZDB/PPf8hODA7e3Nn67dPpm0obW8/q3M4PPfha/qET+VtNikhns9X2222z0qz89MHb0w+syLPayir7/k9/9c3OKVft057zM6fKWV3PPw2j9C6XQ8lfHdj1ka8POroZJavrG73BpvNO3PKzJrEECBCYKoGJyOrGc9YI89TsKRmU1bX1QR8H8ZEnft3ZAds+0tm89r/e/YnF/XclZxLtumXh0zduPau33nL7zXONG/7Lvs7HQVy793Dns59OHE4/pKL9iAvpRy7s+INPf+5TyQk++V+/aX8cRPGREe3Psgg+76Irq6214uMgSp/JEIwYesMWJ6uDPw4ieBPtVP37ma5BtLUlQGAMApOS1dbaeuQ/DNf723lwVltr61f78MKkNCu/+uZ9+25LP05oV+Pmu+97+tcr6Ym1xfyy/U7NYXcC7106cfbFg/dk5xmlH/7X9amEyScXFn9YLbnBwe/8fCV5j2nwhtr1rX94YfZ5TOkHIi48/r/zzx3sbep6/4+D2Oyx1fYz4sML+wq7kgCBGRGYoKyOYRDhIQgQIECAwEgFZHVGxkcjfZVYOAECBAgMKSCrskqAAAECBKIJyGo0yiEHMm5GgAABAjMsIKuySoAAAQIEognIajTKGR582TQCBAgQGFJAVmWVAAECBAhEE5DVaJRDDmTcjAABAgRmWEBWZZUAAQIECEQTkNVolDM8+LJpBAgQIDCkgKzKKgECBAgQiCYgq9EohxzIuBkBAgQIzLCArMoqAQIECBCIJiCr0ShnePBl0wgQIEBgSAFZlVUCBAgQIBBNQFajUQ45kHEzAgQIEJhhAVmVVQIECBAgEE1AVqNRzvDgy6YRIECAwJACsiqrBAgQIEAgmoCsRqMcciDjZgQIECAwwwKyKqsECBAgQCCagKxGo5zhwZdNI0CAAIEhBWRVVgkQIECAQDSB6rJ64tDuRnOu52v3wZOttfXjB/fO7Tl0fG1z23lkYe/SiT53ObLQnGv0/ChdgfmjfW4/5JDEzQgQIECAQJdAxVmNWbWji33amYY5zWqzu9OyuslRS9dLx7cECBAg0CtQp6w2mtlUuK0gq7JKgAABArEFJjSrwU7gY/ONvUsHF9PdxdmO3JNLezp7j7P5bnL7fH9yqZ2pVzJb3XNoKdkVvHikEOzKavptsZBiGp2tyZHO8pN16DxceU91e1qcrElpn3Ny/cKx3kGNawgQIEBgxgSmIqthDtOmFokKd/yGl4t2Blk9vnZsvhHkLcxqeDk7spt3sV3Q9iOmS+gspLTAtKl5tpOVaRZtnrEXjc0hQIAAgUEC05HVYAKalCz4Njjh6OpZbc8y27ULUppNSTtnSHX9KE9sa2291M7s22zCGtwls05uWZ7LDnoOXE+AAAECMyNQcVaLna7tC/k0NOhc0tFw2peGrV+xhshqay3bgZzOKXtC2D4DOd+ZnD1oOlvN56A9pygX7ey6WfL6SNanc8eZecXYEAIECBDYQKDirIa9DNdyg6x2xa9zzHKorK630pom9wqzml2ZBjVZpeBHXb0MViyZKJez2jnimw8XZDXYnVDeMx8+3S4TIEBgZgSmMquFftq8fJ/wkFktDp0eTd44m3W9qGN7yVvMqoiKKAECBOouMN1Zbc8Xs13HQ2c13xWcTC7TrCZ7hsPjtVmts+IOOVtNd/mWzv7tmtcWQwEXCBAgQGCGBaYuq+VTloJpZW/YiqetezK6lu8KDmerxXHQfIdwFtphs9p1NlO4YnZ+EiBAgEBtBKYuq+ut7H0y+YlFwSwzfz9rft7TRlltV7A4GSq/b/stp513zgyf1fw84fYR1myym61D0vWetSpWzwUCBAgQmBmB6rJam5HLzLxWbAgBAgQIXFVAVut+dP2qLxE3IECAAIHhBWRVVgkQIECAQDQBWY1GOfxYxi0JECBAYFYFKs7q8urqW+cvvHnm7Bu+CBAgQIBAVIE3z5x96/yF5dXVcSa8yqyeu7Ry6tz5ty8un7204osAAQIECEQXePvi8qlz589dWhlbWSvL6vLq6unzF6ILWiABAgQIEOgSOD3GOWtlWT1jkmqOToAAAQLjEjhzcXk8E1ZZtf+ZAAECBGZfYPaz2jVD9y0BAgQIEBipwIzPVkdqZ+EECBAgQKBLQFZnf6dE11PuWwIECBAYnYCsyioBAgQIEIgmIKvRKEc39rFkAgQIEJgWAVmVVQIECBAgEE1AVqNRTstIynoSIECAwOgEZFVWCRAgQIBANAFZjUY5urGPJRMgQIDAtAjIqqwSIECAAIFoArIajXJaRlLWkwABAgRGJyCrskqAAAECBKIJyGo0ytGNfSyZAAECBKZFQFZllQABAgQIRBOQ1WiU0zKSsp4ECBAgMDoBWZVVAgQIECAQTUBWo1GObuxjyQQIECAwLQKyKqsECBAgQCCagKxGo5yWkZT1JECAAIHRCciqrBIgQIAAgWgCshqNcnRjH0smQIAAgWkRkFVZJUCAAAEC0QRkNRrltIykrCcBAgQIjE5AVmWVAAECBAhEE5DVaJSjG/tYMgECBAhMi4CsyioBAgQIEIgmIKvRKKdlJGU9CRAgQGB0ArIqqwQIECBAIJqArEajHN3Yx5IJECBAYFoEZFVWCRAgQIBANAFZjUY5LSMp60mAAAECoxOQVVklQIAAAQLRBGQ1GuXoxj6WTIAAAQLTIiCrskqAAAECBKIJyGo0ymkZSVlPAgQIEBidgKzKKgECBAgQiCYgq9EoRzf2sWQCBAgQmBYBWZVVAgQIECAQTUBWo1FOy0jKehIgQIDA6ARmPKvnLqkmAQIECBAYk8C5SyszntULl1dHNySxZAIECBAgEApcuLw641ldeeedcINdJkCAAAECoxNYeeedGc9qa219+Yqyjmnvx+heqZZMgACByRdYvjKmprbW1v8z/d812f9l/x1Pz7NHudxqXbi86jjr5L8orSEBAgSmTuDcpZULl1cvt1rj7FrFWR3npnosAgQIECAwagFZXR81seUTIECAQH0EZFVWCRAgQIBANAFZjUZZn7GYLSVAgACBQQKyKqsECBAgQCCagKxGoxw0cnE9AQIECNRHQFZllQABAgQIRBOQ1WiU9RmL2VICBAgQGCQgq7JKgAABAgSiCchqNMpBIxfXEyBAgEB9BGRVVgkQIECAQDQBWY1GWZ+xmC0lQIAAgUECsiqrBAgQIEAgmoCsRqMcNHJxPQECBAjUR0BWZZUAAQIECEQTkNVolPUZi9lSAgQIEBgkIKuySoAAAQIEognIajTKQSMX1xMgQIBAfQRkVVYJECBAgEA0AVmNRlmfsZgtJUCAAIFBArIqqwQIECBAIJqArEajHDRycT0BAgQI1EdAVmWVAAECBAhEE5DVaJT1GYvZUgIECBAYJCCrskqAAAECBKIJyGo0ykEjF9cTIECAQH0EZFVWCRAgQIBANAFZjUZZn7GYLSVAgACBQQKyKqsECBAgQCCagKxGoxw0cnE9AQIECNRHQFZllQABAgQIRBOQ1WiU9RmL2VICBAgQGCRQXVZPHNrdaM4fjVa1Iwt7l070W9rRxblGc/fBk2WCk0t7mnMLx8pX9rv7misJECBAgMCwArOS1aSdG2W156eyOuxLxMiDAAECBIYXqE9Wm3N7Dh3vTD1lVVYJECBAIL7ApGY13UU812hmX8G+4jSH5euPH9xb3LJnZ+96K5vIHkx2BXcvp7MTuLTYzs7hZDX2Lh1N9ldnD5Esv7NupflxuBrBA60n15eKHv9ZHH4Y5ZYECBAgMFKBicxq+bBrmqssYOUpZrjjN7zcmZKmAct/dGShOddYPNL+abio8PJ6Vs12ntsFbd8rXUJnIeECg5UsL6FrZXxLgAABAjMtMIlZ7Z7edSp7bL7PyUeldvYZg+RZbc8y2zPUIKXJ8sN5Z9ePgtOdkkUFU95iyWvdK5ZWtki46SkBAgQI1EVgErNapDGNU2k/cHu+2LtPtVO4nmcu+FG2wHQPbdDOYtzUnpumj5jVt1P0dLFdAS6WXFwoLSpMdc9aFbd0gQABAgRmSGAisxrkLUlguW1hazsHQXvDVjxJpR+lNU12BYdZza4sahr8qPzQ6ZoEsSyWnFxo5z+4ENyyWBkXCBAgQGCmBSYxq8mUNJyPdrUtf2sNhG8AACAASURBVD6yvrYPghaFy39aTHnbpywVb2lNl7b74LHO+1a777u1rIqoGTkBAgQIrE9gVpOqhSf0Bntuu5+wJMDZ3truNAa37PlRZ76b3jf5tqfi7cV2FT35NshnseSum61lpx87tho8C73DHdcQIEBgFgUmMKvr4Rm27fOM2mcqlc8MCmNWFK73Serzo3yvbyfJxYlI+Y+y0IYPsZbtju6X1bX0XTSd4pbXs3eVXEOAAAECMypQcVaDI5HZsclshpe3LTlguXfpRFKp/DBqejk/kBlMavO7ZKUMn60+Wc1mk8Uysyi2D47uPniy0/Whs9pql7WzkGIvdPdsOFw3lwkQIEBgtgSqy+psORYRdYEAAQIE6iwgq47/ESBAgACBaAKyGo2yzqMz206AAAECmYCsyioBAgQIEIgmUHFWl1dX3zp/4c0zZ9/wRYAAAQIEogq8eebsW+cvLK+ujnMmXWVWz11aOXXu/NsXl89eWvFFgAABAgSiC7x9cfnUufPnLq2MrayVZXV5dfX0+QvRBS2QAAECBAh0CZwe45y1sqyeMUk1RydAgACBcQmcubg8ngmrrNr/TIAAAQKzLzD7We2aofuWAAECBAiMVGDGZ6sjtbNwAgQIECDQJSCrs79Tousp9y0BAgQIjE5AVmWVAAECBAhEE5DVaJSjG/tYMgECBAhMi4CsyioBAgQIEIgmIKvRKKdlJGU9CRAgQGB0ArIqqwQIECBAIJqArEajHN3Yx5IJECBAYFoEZFVWCRAgQIBANAFZjUY5LSMp60mAAAECoxOQVVklQIAAAQLRBGQ1GuXoxj6WTIAAAQLTIiCrskqAAAECBKIJyGo0ymkZSVlPAgQIEBidgKzKKgECBAgQiCYgq9EoRzf2sWQCBAgQmBYBWZVVAgQIECAQTUBWo1FOy0jKehIgQIDA6ARkVVYJECBAgEA0AVmNRjm6sY8lEyBAgMC0CMiqrBIgQIAAgWgCshqNclpGUtaTAAECBEYnIKuySoAAAQIEognIajTK0Y19LJkAAQIEpkVAVmWVAAECBAhEE5DVaJTTMpKyngQIECAwOgFZlVUCBAgQIBBNQFajUY5u7GPJBAgQIDAtArIqqwQIECBAIJqArEajnJaRlPUkQIAAgdEJyKqsEiBAgACBaAKyGo1ydGMfSyZAgACBaRGQVVklQIAAAQLRBGQ1GuW0jKSsJwECBAiMTkBWZZUAAQIECEQTkNVolKMb+1gyAQIECEyLgKzKKgECBAgQiCYgq9Eop2UkZT0JECBAYHQCM57Vc5dUkwABAgQIjEng3KWVGc/qhcuroxuSWDIBAgQIEAgFLlxenfGsrrzzTrjBLhMgQIAAgdEJrLzzzoxntbW2vnxFWce092N0r1RLJkCAwOQLLF8ZU1Nba+v/mf7vmuz/sv+Op+fZo1xutS5cXnWcdfJflNaQAAECUydw7tLKhcurl1utcXat4qyOc1M9FgECBAgQGLWArK6PmtjyCRAgQKA+ArIqqwQIECBAIJqArEajrM9YzJYSIECAwCABWZVVAgQIECAQTUBWo1EOGrm4ngABAgTqIyCrskqAAAECBKIJyGo0yvqMxWwpAQIECAwSkFVZJUCAAAEC0QRkNRrloJGL6wkQIECgPgKyKqsECBAgQCCagKxGo6zPWMyWEiBAgMAgAVmVVQIECBAgEE1AVqNRDhq5uJ4AAQIE6iMgq7JKgAABAgSiCchqNMr6jMVsKQECBAgMEpBVWSVAgAABAtEEZDUa5aCRi+sJECBAoD4CsiqrBAgQIEAgmoCsRqOsz1jMlhIgQIDAIAFZlVUCBAgQIBBNQFajUQ4aubieAAECBOojIKuySoAAAQIEognIajTK+ozFbCkBAgQIDBKQVVklQIAAAQLRBGQ1GuWgkYvrCRAgQKA+ArIqqwQIECBAIJqArEajrM9YzJYSIECAwCABWZVVAgQIECAQTUBWo1EOGrm4ngABAgTqIyCrskqAAAECBKIJyGo0yvqMxWwpAQIECAwSqC6rJw7tbjTn+nwtHlmLlLqji3ONbGknl/Y0dx88OUjB9QQIECBAIIpAxVmdPxqpoFcpsayOx9mjECBAoO4Cslr3V0CU0ZmFECBAgEAmMLlZPbLQnFs4lvy3vaM42Z3b+XbhWOcpLO9P7syA++8EPjbfaHZuc5VprugSIECAAIFNCEx2Vhv5AdE8nO3jo+m34eUik8cP7p1r7F06kRL0z+omdDrlVl8CBAgQIDCEQMVZzWeixZQ0maFmMUsnpsXpS8nB0bk9h463Nyn9Nr1l0tHO9euttLjtysrqEK8AQwcCBAgQiChQcVaLWWbvJiVZDXqZfJsXt7XWyWpxx3Se2s6zrBYsLhAgQIDAOAWmP6v5/uG57Iip2aoZKgECBAhUJzD1We2a1NoJPM5BmcciQIAAgS6Bac9q9xtSs13BdgJ3Pc2+JUCAAIHxCEx7VrO33ORnNuU7hNsnCTtlqbrdION5+XoUAgQITJpAxVntcyZw/qbSrr27g09ZSk9far+3de/SieRtqe2Tm/pn1ftWvcWIAAECBEYlUF1WTaQIECBAgMDMCcjqqAYsk7ZfwvoQIECAwBgEZFVWCRAgQIBANAFZjUY5hkGQhyBAgACBCReoOKvLq6tvnb/w5pmzb/giQIAAAQJRBd48c/at8xeWV1fHWeIqs3ru0sqpc+ffvrh89tKKLwIECBAgEF3g7YvLp86dP3dpZWxlrSyry6urp89fiC5ogQQIECBAoEvg9BjnrJVl9YxJqjk6AQIECIxL4MzF5fFMWGXV/mcCBAgQmH2B2c9q1wzdtwQIECBAYKQCMz5bHamdhRMgQIAAgS4BWZ39nRJdT7lvCRAgQGB0ArIqqwQIECBAIJqArEajHN3Yx5IJECBAYFoEZFVWCRAgQIBANAFZjUY5LSMp60mAAAECoxOQVVklQIAAAQLRBGQ1GuXoxj6WTIAAAQLTIiCrskqAAAECBKIJyGo0ymkZSVlPAgQIEBidgKzKKgECBAgQiCYgq9EoRzf2sWQCBAgQmBYBWZVVAgQIECAQTUBWo1FOy0jKehIgQIDA6ARkVVYJECBAgEA0AVmNRjm6sY8lEyBAgMC0CMiqrBIgQIAAgWgCshqNclpGUtaTAAECBEYnIKuySoAAAQIEognIajTK0Y19LJkAAQIEpkVAVmWVAAECBAhEE5DVaJTTMpKyngQIECAwOgFZlVUCBAgQIBBNQFajUY5u7GPJBAgQIDAtArIqqwQIECBAIJqArEajnJaRlPUkQIAAgdEJyKqsEiBAgACBaAKyGo1ydGMfSyZAgACBaRGQVVklQIAAAQLRBGQ1GuW0jKSsJwECBAiMTkBWZZUAAQIECEQTkNVolKMb+1gyAQIECEyLgKzKKgECBAgQiCYgq9Eop2UkZT0JECBAYHQCsiqrBAgQIEAgmoCsRqMc3djHkgkQIEBgWgRkVVYJECBAgEA0AVmNRjktIynrSYAAAQKjE5jxrJ67pJoECBAgQGBMAucurcx4Vi9cXh3dkMSSCRAgQIBAKHDh8uqMZ3XlnXfCDXaZAAECBAiMTmDlnXdmPKuttfXlK8o6pr0fo3ulWjIBAgQmX2D5ypia2lpb/8/0f9dk/5f9dzw9zx7lcqt14fKq46yT/6K0hgQIEJg6gXOXVi5cXr3cao2zaxVndZyb6rEIECBAgMCoBWR1fdTElk+AAAEC9RGQVVklQIAAAQLRBGQ1GmV9xmK2lAABAgQGCciqrBIgQIAAgWgCshqNctDIxfUECBAgUB8BWZVVAgQIECAQTUBWo1HWZyxmSwkQIEBgkICsyioBAgQIEIgmIKvRKAeNXFxPgAABAvURkFVZJUCAAAEC0QRkNRplfcZitpQAAQIEBgnIqqwSIECAAIFoArIajXLQyMX1BAgQIFAfAVmVVQIECBAgEE1AVqNR1mcsZksJECBAYJCArMoqAQIECBCIJiCr0SgHjVxcT4AAAQL1EZBVWSVAgAABAtEEZDUaZX3GYraUAAECBAYJyKqsEiBAgACBaAKyGo1y0MjF9QQIECBQHwFZlVUCBAgQIBBNQFajUdZnLGZLCRAgQGCQgKzKKgECBAgQiCYgq9EoB41cXE+AAAEC9RGQVVklQIAAAQLRBGQ1GmV9xmK2lAABAgQGCciqrBIgQIAAgWgCshqNctDIxfUECBAgUB8BWZVVAgQIECAQTUBWo1HWZyxmSwkQIEBgkEB1WT1xaHejOX+0u2pHFppzew4dX+u+ftAGuJ4AAQIECEyOgKzqNwECBAgQiCYgq9EoJ2esZE0IECBAoCqByc5quqN4rtFMvxaPBHuGjx/cm18f7kk+ubSnOX8w2b08l+5hTm6259CRzo33Lp0IOnp0sVjIXKP40bH55L7Jf9s/XTjWWut8W95x3bnevuuqXsQelwABApMjMMFZLR98DY+5pk3NK5jebPfBk6lpktUgkOvt+iZdXG+tpT8tDtwmTc0XsraeLL+RlTsrZftHeb/Db4t7pbdsLzxcQlDuYCgwOc+6NSFAgACBEQlMcFbL2Qu2P4lZ3tEkYGn5siKm4cw7V/5RmrpgmUlHg1u2Oj8qxbJVyvZ69m02YQ0eN+to94oF6yy0BAgQIFALgQnOar7fNSxoEqpO//JnKClfNoNMshrePilfMT3te9/2PDXb35stpKuOybedHb+dOXR3wlvZosJUm6oSIECAQM0EJjKrnTKl6cqPcbbblmQ1P+rZubD5rHaWk963U+vNZLWzAvkqdVY+r37NXlLm6AQIEKizQHVZTSejnVlguz19poDp05P1tat/vd1KbjbcbLXngbaWVRE1aCBAgACBQKDCrHYnMM1neY9rsKLZubhJhju7YfOsJkXsHFsdLqvdD5SesrSpncDpOUrhHub0lKjw0es8XrPtBAgQqKdAhVnNjpIGhy03PFM3PD8ovZwlcD3LbR6z7lQPPraazlaLKOY7hNPZ85A7gdsPXZz3FK5hPV9MtpoAAQIEKs3qWnvq2TlW2rVPNa9deoOio8kkNW1Y+3Bm3tT2W2iCb9ObFe3sPmUpyWf+0ItHOmf8Dp/VvKzt5ZTeWeu1RYAAAQI1FKg6q6XdvPlOXVcSIECAAIHpFJBVLSdAgAABAtEEZDUaZQ33ddhkAgQIEOgSkFVZJUCAAAEC0QQqzury6upb5y+8eebsG74IECBAgEBUgTfPnH3r/IXl1dWuCeVIv60yq+curZw6d/7ti8tnL634IkCAAAEC0QXevrh86tz5c5dWRprScOGVZXV5dfX0+QvRBS2QAAECBAh0CZwe45y1sqyeMUk1RydAgACBcQmcubgczilHd1lW7X8mQIAAgdkXmP2sds3QfUuAAAECBEYqMLoZarjkymarI7WzcAIECBAg0CUQxm90l2V19nd9dL2wfEuAAIF6CowupeGSZVVWCRAgQKAWAmH8RndZVmvxYqrnyNRWEyBAIBQYXUrDJcuqrBIgQIBALQTC+I3usqzW4sUUjtdcJkCAQD0FRpfScMmyKqsECBAgUAuBMH6juyyrtXgx1XNkaqsJECAQCowupeGSZVVWCRAgQKAWAmH8RndZVmvxYgrHay4TIECgngKjS2m4ZFmVVQIECBCohUAYv9FdltVavJjqOTK11QQIEAgFRpfScMmyKqsECBAgUAuBMH6juyyrtXgxheM1lwkQIFBPgdGlNFyyrMoqAQIECNRCIIzf6C7Lai1eTPUcmdpqAgQIhAKjS2m4ZFmVVQIECBCohUAYv9FdltVavJjC8ZrLBAgQqKfA6FIaLllWZZUAAQIEaiEQxm90l2W1Fi+meo5MbTUBAgRCgdGlNFyyrMoqAQIECNRCIIzf6C7Lai1eTOF4zWUCBAjUU2B0KQ2XLKuySoAAAQK1EAjjN7rLslqLF1M9R6a2mgABAqHA6FIaLllWZZUAAQIEaiEQxm90l2W1Fi+mcLzmMgECBOopMLqUhkuWVVklQIAAgVoIhPEb3WVZrcWLqZ4jU1tNgACBUGB0KQ2XLKuySoAAAQK1EAjjN7rLslqLF1M4XnOZAAEC9RQYXUrDJcuqrBIgQIBALQTC+I3usqzW4sVUz5GprSZAgEAoMLqUhkuWVVklQIAAgVoIhPEb3WVZrcWLKRyvuUyAAIF6CowupeGSZVVWCRAgQKAWAmH8RndZVmvxYqrnyNRWEyBAIBQYXUrDJcuqrBIgQIBALQTC+I3usqzW4sUUjtdcJkCAQD0FRpfScMmVZfXcJT0jQIAAAQJjEjh3aSWM3+guV5bVC5dX6zlcstUECBAgMH6BC5dXR5fScMmVZXXlnXfGz+oRCRAgQKCeAivvvBPGb3SXK8tqa219+YqyjmnvRz3/FdlqAgQIZALLV8bU1NbaepVZba2tX261LlxedZzVS58AAQIEogucu7Ry4fLq5VZrdHPT3iVXnNXeFXINAQIECBCYXgFZXZ/eJ8+aEyBAgMCkCciqrBIgQIAAgWgCshqNctJGTNaHAAECBMYvIKuySoAAAQIEognIajTK8Y+JPCIBAgQITJqArMoqAQIECBCIJiCr0SgnbcRkfQgQIEBg/AKyKqsECBAgQCCagKxGoxz/mMgjEiBAgMCkCciqrBIgQIAAgWgCshqNctJGTNaHAAECBMYvIKuySoAAAQIEognIajTK8Y+JPCIBAgQITJqArMoqAQIECBCIJiCr0SgnbcRkfQgQIEBg/AKyKqsECBAgQCCagKxGoxz/mMgjEiBAgMCkCciqrBIgQIAAgWgCshqNctJGTNaHAAECBMYvIKuySoAAAQIEognIajTK8Y+JPCIBAgQITJqArMoqAQIECBCIJiCr0SgnbcRkfQgQIEBg/AKyKqsECBAgQCCagKxGoxz/mMgjEiBAgMCkCciqrBIgQIAAgWgCshqNctJGTNaHAAECBMYvIKuySoAAAQIEognIajTK8Y+JPCIBAgQITJqArMoqAQIECBCIJiCr0SgnbcRkfQgQIEBg/ALVZfXEod2N5lz31+KRtenq3MmlPc25hWPjf+Y8IgECBAhMoEDFWZ0/WorokYXmXGO6yiqrpWdwAl/iVokAAQLjFJisrLbWjs03ml2tHSfH5h9LVmWVAAECBDoCk5jV3QdPtvN2dDHYS7x36US+3qUdyMHsts/1Xdkrf5vcvlhsUvT84YJlHl2c23NoKZlGN+f2HDqe7KNOF5LdeOGQncCbH4vkz+OU7fC32gQIELi6wIRlNe1ie7aaNLVo3npn/3B4m7X0+qx2A64/fnBvnsP1VnqbzrfJQ6QFza7PD5F2HmttvZWlPf9Ru6ntvmZr5djq1V9n0kuAAIGaCExUVrNZYHummLStE7Msb2lly7ntPE9DXJ8mdu/u/PBt8RDJhbyU6QKTmWt70ty12K5v073WpfU0AyNAgACBGgtUnNV8p2u+97XUtvYcKJ07ZjfIJq/tvbWdfcXt52+j67MZ8JGF5vzR5Gbpt8WF8p7hdGmd0CYd7ewTLs19k1v2uW+n9DV+YUEgQIBAPQUqzupGZyclPQtqWpomBkc3S6c49b8+n5Uem08DeWQhnYkmO36zXib36or0oKx2rs+TmS/cjlACBAgQILA+sVntmQWWslo8c1lHO4dg88FR6fr2FPPEod3pbDj79kjnmGvPY2WHbLNd0Gar+QAity3wXSBAgACBboGJzWqxh7a9xsmkMDiDKfgV333L/EfB9cnEdO/8wt7wcOnuYIbaMwdN7hvcuLMTOD2DKax4ckvHVnPz7peX6wkQIFA3gYnNajqDLA615juEk53G5WlrMvXM9uUOur44AtrZXZy2MIz0Vc4EDrKaHUzNVyyNvayqKQECBAi0BSY2q+vZR0Pkh1cXj6TlC2aQ+VlOYR3z+qb3CueUwftzisrmacxHUllr08WGP0qWGWY1P03J+1btHCZAgACBHoHqstqzKnneDHkIECBAgMC0CsjqtD5zRiEECBAgMIECsiqrBAgQIEAgmoCsRqOcwEGTVSJAgACBMQtUnNXl1dW3zl9488zZN3wRIECAAIGoAm+eOfvW+QvLq6vjLGuVWT13aeXUufNvX1w+e2nFFwECBAgQiC7w9sXlU+fOn7u0MrayVpbV5dXV0+cvRBe0QAIECBAg0CVweoxz1sqyesYk1RydAAECBMYlcObi8ngmrLJq/zMBAgQIzL7A7Ge1a4buWwIECBAgMFKBGZ+tjtTOwgkQIECAQJeArM7+Tomup9y3BAgQIDA6AVmVVQIECBAgEE1AVqNRjm7sY8kECBAgMC0CsiqrBAgQIEAgmoCsRqOclpGU9SRAgACB0QnIqqwSIECAAIFoArIajXJ0Yx9LJkCAAIFpEZBVWSVAgAABAtEEZDUa5bSMpKwnAQIECIxOQFZllQABAgQIRBOQ1WiUoxv7WDIBAgQITIuArMoqAQIECBCIJiCr0SinZSRlPQkQIEBgdAKyKqsECBAgQCCagKxGoxzd2MeSCRAgQGBaBGRVVgkQIECAQDQBWY1GOS0jKetJgAABAqMTkFVZJUCAAAEC0QRkNRrl6MY+lkyAAAEC0yIgq7JKgAABAgSiCchqNMppGUlZTwIECBAYnYCsyioBAgQIEIgmIKvRKEc39rFkAgQIEJgWAVmVVQIECBAgEE1AVqNRTstIynoSIECAwOgEZFVWCRAgQIBANAFZjUY5urGPJRMgQIDAtAjIqqwSIECAAIFoArIajXJaRlLWkwABAgRGJyCrskqAAAECBKIJyGo0ytGNfSyZAAECBKZFQFZllQABAgQIRBOQ1WiU0zKSsp4ECBAgMDoBWZVVAgQIECAQTUBWo1GObuxjyQQIECAwLQKyKqsECBAgQCCagKxGo5yWkZT1JECAAIHRCcx4Vs9dUk0CBAgQIDAmgXOXVmY8qxcur45uSGLJBAgQIEAgFLhweXXGs7ryzjvhBrtMgAABAgRGJ7DyzjszntXW2vryFWUd096P0b1SLZkAAQKTL7B8ZUxNba2t/2f6v2uy/8v+O56eZ49yudW6cHnVcdbJf1FaQwIECEydwLlLKxcur15utcbZtYqzOs5N9VgECBAgQGDUArK6PmpiyydAgACB+gjIqqwSIECAAIFoArIajbI+YzFbSoAAAQKDBGRVVgkQIECAQDQBWY1GOWjk4noCBAgQqI+ArMoqAQIECBCIJiCr0SjrMxazpQQIECAwSEBWZZUAAQIECEQTkNVolINGLq4nQIAAgfoIyKqsEiBAgACBaAKyGo2yPmMxW0qAAAECgwRkVVYJECBAgEA0AVmNRjlo5OJ6AgQIEKiPgKzKKgECBAgQiCYgq9Eo6zMWs6UECBAgMEhAVmWVAAECBAhEE5DVaJSDRi6uJ0CAAIH6CMiqrBIgQIAAgWgCshqNsj5jMVtKgAABAoMEZFVWCRAgQIBANAFZjUY5aOTiegIECBCoj4CsyioBAgQIEIgmIKvRKOszFrOlBAgQIDBIQFZllQABAgQIRBOQ1WiUg0YuridAgACB+gjIqqwSIECAAIFoArIajbI+YzFbSoAAAQKDBGRVVgkQIECAQDQBWY1GOWjk4noCBAgQqI+ArMoqAQIECBCIJiCr0SjrMxazpQQIECAwSEBWZZUAAQIECEQTkNVolINGLq4nQIAAgfoIyKqsEiBAgACBaAKyGo2yPmMxW0qAAAECgwRkVVYJECBAgEA0AVmNRjlo5OJ6AgQIEKiPgKzKKgECBAgQiCYgq9Eo6zMWs6UECBAgMEhAVmWVAAECBAhEE5DVaJSDRi6uJ0CAAIH6CMiqrBIgQIAAgWgCshqNsj5jMVtKgAABAoMEZFVWCRAgQIBANAFZjUY5aOTiegIECBCoj4CsyioBAgQIEIgmIKvRKOszFrOlBAgQIDBIQFZllQABAgQIRBOQ1WiUg0YuridAgACB+gjIqqwSIECAAIFoArIajbI+YzFbSoAAAQKDBGRVVgkQIECAQDQBWY1GOWjk4noCBAgQqI+ArMoqAQIECBCIJiCr0SjrMxazpQQIECAwSEBWZZUAAQIECEQTkNVolINGLq4nQIAAgfoIyKqsEiBAgACBaAKyGo2yPmMxW0qAAAECgwRkVVYJECBAgEA0AVmNRjlo5OJ6AgQIEKiPgKzKKgECBAgQiCYgq9Eo6zMWs6UECBAgMEhAVmWVAAECBAhEE5DVaJSDRi6uJ0CAAIH6CMiqrBIgQIAAgWgCshqNsj5jMVtKgAABAoMEZFVWCRAgQIBANAFZjUY5aOTiegIECBCoj4CsyioBAgQIEIgmIKvRKOszFrOlBAgQIDBIQFZllQABAgQIRBOQ1WiUg0YuridAgACB+gjIqqwSIECAAIFoArIajbI+YzFbSoAAAQKDBGRVVgkQIECAQDQBWY1GOWjk4noCBAgQqI+ArMoqAQIECBCIJiCr0SjrMxazpQQIECAwSEBWZZUAAQIECEQTkNVolINGLq4nQIAAgfoIyKqsEiBAgACBaAKyGo2yPmMxW0qAAAECgwRkVVYJECBAgEA0AVmNRjlo5OJ6AgQIEKiPgKzKKgECBAgQiCYgq9Eo6zMWs6UECBAgMEhAVmWVAAECBAhEE5DVaJSDRi6uJ0CAAIH6CMiqrBIgQIAAgWgCshqNsj5jMVtKgAABAoME6pLViye/s7R49427bphrNOcazR3NW2792NJXf35xZa1PVi++9siH7//HDtmJQ7sbzbmFY51r+t1rDD89fnDvXKO5++DJzT3WldPP/tV///KJPlu60XK6tvroYkI3AQgbrXNFz4tVIkCAQCEwQVl9/vVf7Hvq8Hu/dO97Pn/nez5/53u/dO++pw4///ovinXd6oWzLz5017VpTa/dte+uxf0Li5+589bd6TW73jf/9V9eKffml4dv6epHV2Cq+929tawe/eyuucbeJVmt7onb6ku3/Mq0j/+qWQAAIABJREFU/gQITIPApGR131OHr/ncB/p+7Xvq8DZ+K509snBzMj39g0//fXluevG3L96/N5m87rj90GthWXsj2ntNRU/t1rJ6ZKG5lax2baPZaheIbwkQINBPYCKy+vsP3983qMWVv//w/Vsr69lv37ez0Zy7fvHImX4D/ys/W7p9V/du1d6I9l7Tj3Jra7ipe8nqprjcmAABAuMXqD6rG8xTi6xe87kPbGnO+ptDf9Kca+z6yNcvDpJd+clDuxrNuff/5XfSCWs6sUsOvra/skOJeVYvnjxy377bGjuTZTZuvvu+p3/ddWh25c3X/v6v7r6+maR67rrdN3780PNvtsKHTru4d+lHLy39t1t2JId4b/vo//xVeIPS5ZVffvVz+37vumRlrv2v9yz96GzfrCaHje9t3yw5Zvy5Iz9fyccQ2ZoXmxPuCl755Vf/6u4bb7hxR3Gw+d5HSmubb3V7lXpmqytv/vDQvfuuyza2ccPv3Xr3fY//79MVDThKbtaBAAEC1QlUnNXnX/9F2M6NL2/6OOsbj92eNOPTT4b7eLutX/nCTUkm7/12kqKfPLp/Yf6DjUZzbvfHFhb3Lzz6z8nv6yww19/yvp3N7OjsJ/b9cXZo9vZHflP8Ql85/tifXJ8l8O5PLO5v32bnh5aOd8qadvGmndfv2tH84F2L++/6wAcf/Kc8gV0rdubYfLC0uz5w447GzbfcfmvX3Pr09754Q5b5D9yzkCwwzWQxO3/jOw8s7r9zd3OucdMfzu9fWDzwzTfSh2svfFcjvdfC4j23ZidzXX/f0Qv5+myc1fYSbvgv+z6TQH2s3fWd+3/QNdQofFwgQIBAHQQqzuqQU9Ust5uesGYTrD2HjncVq/xtNkPtnF7blZMiq43m7i+8VMzGTj/96aS+Nx94ub20k0t7kjzf8kBwm6OL6S7oLz6Xdz2bbs69/9NP9t0p3Vmxi0cWbkoK2nnE1m+fTpcWngl84dj8+5tzjZs/8kQxb269dvBDyTz4w4/9Kl9az7HV1nf+7KZkVQ/+LEjg2SfvSR5x3xP5zL7LoTxb/fEDt841du174mznH8mZr++77sbrbv4f380ft/Mj1xAgQKA2AhVn9b1funfjGWr40/d+6d5N/ab+zSMfTXbG3vPNIB75VCx4gtupK9460pWTIqv5juJ8HX6wmCRt8Ui6qJXv/WW5stkDtQNW7IXOHqux/wf5QvqsT/KjC1/fF+yazm988YlPlI4E/+rwnyanXH3i6bPB5rTWsl3fe+7P58E9WX3xL26+pXHd4pE89tnys3UbOLwoZzVd5k2f+V5nIp6v5IAtKq2h2xAgQGBmBSrO6ns+f2cYzo0vv+fzd27qd/cvvvyhJKtFLwf8Zh82q7cf/kVpCdn0dP7xdK9pOntr3njgZ11ruPL0p5Pyfbb9LtjssW5/5FTXzbq//fZ9ySHPngFBNlDIy3fx8buTfc4ff7q7ba8duGOu0bzly+2jtj1ZzV/NVy7+67/+6ofHnnn04AOf2HdHdhA3X3i+67vQK2f1N//w8WQNd95y2+KhR184/lZxNLdElD+QKwkQIFAbgVnOamu4ncDp2zqDz1gYNFstAtN+cWRZbb8fNE1X830f+lxyoDH8yo7U5juis6zOH71ab9I1bz7wSndu0+vz8mUr8Af/9ePlR1zcv7Dvj8PxRJ+sXvn1k5/7YHruVfvkrB3NW67/g3S3c/FZE10O5ay21s4e+Vx2gDlbwg2/d+c9f/34a78tz4C71782/65sOAECtRWoOKsj3Qncyk5Z2tm9t7P8ZLePic4fzed8XTkpdgIPkdUkZn2/RpjVAY8YTNN7svqbwx9OdiZf+0f3/PVXnvnuP7/5L2dWW2vrm9oJnBlePHP8mYMP3HVn9tkayZp0vwlYRwkQIFAzgYqzOtpTltpHGctn1pSf4K432CS12FJWs53Avftjywlvp+vqs9UBO4GzXcr5bDXbCXzHg8evMvftzupPHmo2mnM3/d8vlmeWW8hqZ+uuXPzpswfSE6E3ejtT5/blZ8H1BAgQmBmBirM62jfYrK2vvPDFkX0cRGkn8MrRxR2NZuPPXhjm9KirZ/XC0x/Z2Zzbee8Txdtdkg5lJ0B19ldnIdxzuPMmn76vy+6sdu/OzaqcnejUWXj38KJ0r5cfuO3W37uufVy5eNDsmG5e/avEvriXCwQIEJglgYqz2lpbH3LCuul317TnQxef+6vbkpNrrv/4oZ+UPlh/5c0fbvThhR9+7DfFjKp3/pr8qJTV1pVXvnBz8l6X+adPd8p65fSTCzfP7bzxxr95OXvRDHtsda313P7kMxd3LnyzOFp5Onu7TvgGmzNf35fU90MPvpbsxW1/rfz0wdt3zV23+xNfPZNdk2b1psUX8htks9XSm3xWXzmQvC2n9KbYrq0uZTUP/N/89GLxuFd+9mDyFqPggYofuUCAAIHaCFSf1dba+ug+vDDtSvFR+7saN/R81P5/e6z0gcBr660rx+aTD1i4+Y8+tX/h4VeSRnYFpv3iKGd1bX3l+OE/Tj4RKfkApk8s7l/4VPvjlnb8wX3FRycOndX1Vv7BitkHR2QfLrHz+qS14XTw9NH73pesbXLGUPixDNfuPVxsV/agO/7wkwuLS0//OhkQHEw/snHuuj++81P7Fxbvubm5a27nLR/7i88kO4eLQ8hdW13K6nqr/GkV7YUk44BjxVt7O6WvzT8nm0yAAIGJyOrGc9atzlPzyVn6O/3ib1/+++Cz+q7ddeut9x56pvzh+/mrofXLp/88KU2jOXfr3742dFZba+vlz/NLKv7Jg9/pfJRgflrQ1XcCZx268utvPXRP9lGIO5q33flX3/zl08lfZwuz2lpbTz9Ssf32mKSvyYcIls/IPfPS0sfbZ+22j/4GH4s4d93uhOLkavvNsjc99OPs0TfOavfG+vDC0ustfy25kgCB2glMSlZba+sj+8NwtXtS/U4nQIAAgaoEJiirVRF4XAIECBAgEEtAVs1lCRAgQIBANAFZjUYZa6RjOQQIECAwvQKyKqsECBAgQCCagKxGo5zesZU1J0CAAIFYArIqqwQIECBAIJqArEajjDXSsRwCBAgQmF4BWZVVAgQIECAQTUBWo1FO79jKmhMgQIBALAFZlVUCBAgQIBBNQFajUcYa6VgOAQIECEyvgKzKKgECBAgQiCYgq9Eop3dsZc0JECBAIJaArMoqAQIECBCIJiCr0ShjjXQshwABAgSmV0BWZZUAAQIECEQTkNVolNM7trLmBAgQIBBLQFZllQABAgQIRBOQ1WiUsUY6lkOAAAEC0ysgq7JKgAABAgSiCchqNMrpHVtZcwIECBCIJSCrskqAAAECBKIJyGo0ylgjHcshQIAAgekVqC6rJw7tbjTnyl+7D54sKI8f3Du359Dxtb7ZOzZf/Ojo4lxj8Uj/m4X3Pbm0p/vhBi8/vGP78pGFvUsn+lxfrLALBAgQIECg4qzOHw1ClYY2LOugp+fIQrNTxE1ldeFYuMxkOUMleb2VPIqsBk/W1ccxbkyAAIE6CkxSVtfWk86VyxdWsLgcK6uttXQKO8QjymqB7wIBAgQIbCAwuVkNdgIfm2/sXTq4mO4x/sAH/7DYl5tOH7PZavLf9vWlGXBnUjWgoF3T0PKu6WxRyZrkCy8m0+lMN3vE0ix2yJHBBk+JHxEgQIDA9ApMUlaTpHWOkpazWtpb2zNb7ewTTmvXWUjwxAzIatrRdonDy2vraU3zZJbrW3qUtOgDWl7HHSCBuc0nQIBA7QQqzmoxC8wv5BnLqtY+L+nYfKNZTBNb2b7i0ilLnXu1ymkMfsUPyOpasvDOrLRY7Np6aVFhVnseopT5zvy4di+mQNu2EyBAoKYCFWe1PMlLCleci9Q1Ww1vWcpYErxgetrTvPx3/dWzmt8ym6eWdykHWU1nscEjrmUnNJWvEVcCBAgQqKXARGW1dMLtmLIaZji9nM2bk4qHP+rOanF8t7ggqzUdmRajMRcIECDQWluvfVaDyW5pEjx4J3Cf2WotR2T+/RAgQIBAr8AEZrU97RvLbDXcM5xcDo/gpvlsH3YtvcEmmLlmoMGqmrERIECAQK0FJiqrpVOTglZ1zirKMlaaVgbTzeSn4Z7b0iQyLGj7KU+WExyXLX2b7xBuh7ac0t5bhod+ewcvriFAgACBmghUnNX8BOD2EcruyWJwJnCpW3nzkis3ldX87aftxw3P+00anKa3fZu9SyfSU6jaHxaR/yj/7Ii0rOXTmtKKJ9fnt6nJa8hmEiBAgEAhUF1WS1PJWu8xKJ4MFwgQIEBg2gVkVdEJECBAgEA0AVmNRjntIyzrT4AAAQLbF6g4q8urq2+dv/DmmbNv+CJAgAABAlEF3jxz9q3zF5ZXV7cfy+GXUGVWz11aOXXu/NsXl89eWvFFgAABAgSiC7x9cfnUufPnLq0M38Vt3rKyrC6vrp4+fyG6oAUSIECAAIEugdNjnLNWltUzJqnm6AQIECAwLoEzF5e3OQ0d8u6yav8zAQIECMy+wOxntWuG7lsCBAgQIDBSgSGnm9u8WWWz1ZHaWTgBAgQIEOgS2GYvh7y7rM7+ro+uF5ZvCRAgUE+BIbu4zZvJqqwSIECAQC0EttnLIe8uq7V4MdVzZGqrCRAgEAoM2cVt3kxWZZUAAQIEaiGwzV4OeXdZrcWLKRyvuUyAAIF6CgzZxW3eTFZllQABAgRqIbDNXg55d1mtxYupniNTW02AAIFQYMgubvNmsiqrBAgQIFALgW32csi7y2otXkzheM1lAgQI1FNgyC5u82ayKqsECBAgMHECzz7/o299/8e9+R90fe8te6/ZZi+HvLusTtyLqfel4BoCBAjUTeDJbz335Lee693qQdf33rL3miG7uM2byaqsEiBAgMCkCLxx5tzzL7361Lefz/I56L9Pffv551969c2z53rbucE12+zlkHeX1au+mP7p8b979PFXr3qzLd/g9Wf+4dEvP/f6Bi+Fs5c2uM2oV2/L2+WOBAgQ2LTAd3/48qCU9l7/vR+/suFvzu5HH7KL27yZrHa7dz1JP3/uaw/+w/d/Pro/tPvq0Qf/7ugPrrJ8Wb3K09T1rPmWAIEpFXjq29/rzeega5769vOb2sxt9nLIu8vqxr+vk56Ncqq68oOnrzpVXTFb3dS/HDcmQGB6BQYVdND1m9rSIbu4zZvJ6oZZHWoqueESNp6Gvv79L//d1555/apLMFu9KpEbECAwCwJPfuu5l3/2i2Fi+fLPftH3nKYN7rvNXg559wnPapKT8j7Y5FDig0//09lLxYX8lZQkKp35JS0sTTGTHblZvTb4Ub/+DZhKZlPYdAWSByourKRr9bVnXk3WJHnE4sKAcCYrlmxLvgnlC+lqP/pgsqjkKzz++oOnO9d3beygpbmeAAECky8gq+tD1rv3ZsM+u0kIg/lcMH1Mq9M5Kpl82z4Imsa4k6twqrfBj3raNnAqmS4kXassb4+/muzL7cQ+OVZa3CZ89K6HSHo8aA9zeetKC0keq3O4d6OFDItczrl7ESBAoCoBWR19VssnwZanj2FRkvB0EhXU92xSx059z27wo3Jdgk535TBNZprtvKalrKbTyiKExYWuhayU1qT80NlcvLM5IUJ37EOEnofoXqwbECBAYKIFZHUMWQ3y012UlU75wlgmLenErChfPvja4Efhq22DXCVLyHbeFgvPLyT3Gi6rndXIVyx49O4tDW7cvaUbrGewQH0lQIDANAjI6liymh5GffzVNKKdXbtpM/L8lGexyY/y4v7T4+E+5PRVtcGPOoXrrleYqBhZzde884ilV3xXLIOsdt+x65bherpMgACBKROQ1fFkNWvk1/qeNJtME//ha6XdvO0+pRPHf+h7TtAGP8pegkHGSrXr/HSbs9V8djvoFd8pdzbzDk5ZSle+/fERyWWnLA0YmgyydT0BApMrIKtjymqf836L2iWzt9JZssUv2WRW2jNVzX66wY+SG3TPCLtegp3mFXXMLxTNK8JcXAgXktwsOHQa/qi43E5mVs3SdDzd5PT04K8983qy/KstqlimCwQIEJhogae+/b2fHD9R/Brf4MLLx09849vf2+AGvT/qPXl2FNdM+Btsiqd/cIcGJzDf2VsspHNhgx+dvVScf9S5fe/Ts51rNn707SzZfQkQIDDVAt/90cvPfO8HL//sF1f9eua7L/rwwtLUdjNPfGd22HOvYnbYk8Dk4GjwzpxidnspOwdqwI+Smw1OeLiQrV/uO3/tWf+tL9+iCBAgMK0Cb5w5970fv/KNq32E4VPffv6Fn/io/bUtZDXfEdp1plJ7P233hyRk0U138KafxtDzIQwb/Kgn2NP6orQhBAgQINBXYBS7fHuXOS07gUWOAAECBAhsS6A3gaO4Rla39ST1HRC5kgABAgQmUGAUEe1dpqzKKgECBAjUQqA3gaO4RlZr8WKawGGjVSJAgMCYBUYR0d5lyqqsEiBAgEAtBHoTOIprZLUWL6YxDwk9HAECBCZQYBQR7V2mrMoqAQIECNRCoDeBo7hGVmvxYprAYaNVIkCAwJgFRhHR3mXKqqwSIECAQC0EehM4imtktRYvpjEPCT0cAQIEJlBgFBHtXaasyioBAgQI1EKgN4GjuKayrJ7zUfIECBAgQGBcAucurYwior3LrCyrFy6vTuAuAqtEgAABAjMpcOHyam8CR3FNZVldeeedmXzmbBQBAgQITKDAyjvvjCKivcusLKuttfXlK8pai+MZE/gPzCoRIFArgeUrY2pqa229yqy21tYvt1oXLq86zlqr17eNJUCAwHgEzl1auXB59XKr1TunHN01FWd1dBtmyQQIECBAYPwCsro+fnSPSIAAAQKzKiCrskqAAAECBKIJyGo0ylkdedkuAgQIEBheQFZllQABAgQIRBOQ1WiUw49l3JIAAQIEZlVAVmWVAAECBAhEE5DVaJSzOvKyXQQIECAwvICsyioBAgQIEIgmIKvRKIcfy7glAQIECMyqgKzKKgECBAgQiCYgq9EoZ3XkZbsIECBAYHgBWZVVAgQIECAQTUBWo1EOP5ZxSwIECBCYVQFZlVUCBAgQIBBNQFajUc7qyMt2ESBAgMDwArIqqwQIECBAIJqArEajHH4s45YECBAgMKsCsiqrBAgQIEAgmoCsRqOc1ZGX7SJAgACB4QVkVVYJECBAgEA0AVmNRjn8WMYtCRAgQGBWBWRVVgkQIECAQDQBWY1GOasjL9tFgAABAsMLyKqsEiBAgACBaAKyGo1y+LGMWxIgQIDArArIqqwSIECAAIFoArIajXJWR162iwABAgSGF5BVWSVAgAABAtEEZDUa5fBjGbckQIAAgVkVkFVZJUCAAAEC0QRkNRrlrI68bBcBAgQIDC8gq7JKgAABAgSiCUxAVo8uzjWana+FY8MPCoa75cmlPc25+IuN9hwMtxUejgABAgSmQKDarKbBayweWSukjs0niQ2vKX605QuyumU6dyRAgACBzQlUmdUjC825PYeOd5qarXpS1t0HT8abw8nq5l4T8eQ9LgECBGonUGFWk3zOH+0jfmRh7/zRTlaPH9xb7CIObp/dPZvdpvuQS7t5s3lwdv2hrp3ASc7bu533Lp3IV+Do4tyeQ0vZj9LYJ4/bp/r57btHA64nQIAAAQLr1WU1OaR69Z29aVPz+J04tLszkc2Cmv8oPUCbRzdtal7EdkTz6Kbf5o8b3is7xJvfzIyNAAECBAhsQaCyrKa9zPM2cOaXtDPcIRzcq+tHwZ7eJJB5bpMlpwHOepmGOa9vMqrq7IjuvpcxFwECBAgQ2LTA5GQ12G1bnLXUm7qki1kyk1gGgexktWfnbflHXVPk5CHSuhcXBjZ+07hbGOa4CwECBAhMtUBlWW0NzlhnSprcpjgOWly4SlY7E9A8kMk16Ww1XXKxnOKCrBoxECBAgEAcgeqy2rM/thielLMa7s4NtznSbDVP7waZL1bMBQIECBAgsLFAdVkNj2sWbUsvdLLam97OHHdgVtNAhjEOjq0mdw9/tJ48VnZyU2fJYbxdJkCAAAECmxCoMquttex4ati59hHW4jSlNLHFDZJA5j8anNVsscOcCRxmW1bLg5uNh2N+SoAAAQJ9BarNatr/pGfFYc4+HxCRlrV9g7yp7fN7+56ylG5nO8/Jkhc2eN9qcNJTT1Y7E1m9IUCAAAECwwlMQFaHW9G+gwJXEiBAgACBiRKQ1U3sMZ+oZ87KECBAgMAECsiqrBIgQIAAgWgCshqNcgIHTVaJAAECBMYsIKuySoAAAQIEognIajTKMQ+IPBwBAgQITKBA9Vk9c375he+/9Ohj3zhw4OEDBx5+9LFvvPD9l86cX+6Plb0bp+/fmUnfhBq8A2dQL7ve8DroZq4nQIAAAQKbFqg4q6++diKrafrfRw4ceKT49tXXTvQpa5LVvbv3FB8KUWxw9+dI9Llv+508slqguUCAAAECkQWqzGrR1Gefff7UqbffTf936tTbzz77fBbXPmVNszq/kH/iYPGe16OLcwuLwWcwbcAkqxvg+BEBAgQIbEugsqyeOb+ctfPlV45nKxH+9+VXjmc/7d4bnGZ16Wjx5+HaG39koTl/NOllsBM4+KCl5LOWjuXz13JW013H7Y956txmW6b5A1kIAQIECNROoLKsvvD9lw4cePjZZ58PaxpezuasL3z/pVKlsqyeSJIZFPTYfPI3U8Ospk0tMlk67BpktXR9epf8k4RLD1rMiV0gQIAAAQIbClSW1ewcpVOn3g5TGl4+dert7AymUuHaWQ3+8szaevIna5KCBllNell8QP96+zP925XtZLX7L7OmlQ0+Z7h2g6wS9YavG7ckQIAAgb4ClWU13cf7yLvvvhumNLz87rvvZmcwldY7z2rw19+SWWbawiCrRRLSUpb38RZZ7b191yRYVgkQIECAwOYEpjar6dw0qWkSzsUjSUfDTKZ7dLM/jJNMUtNvu2erye1Lfzwn/TbYt7w5ylL+i667QIAAAQJ1Eqgsq9vcCdzK/gr6wrHkz7cFvWxHsZjUtp/LgVkVUaMBAgQIEIgoUFlWt3fKUjKPzP7C+e72HuDSbLX7T6Vmu4KD+qY7jcPWZhPTYv+weSoBAgQIENiKQGVZ3dYbbE6km9o+bprtAS5lNT3yWvyJ8nyHcPss36Cd6RKKCWv3GUx12msRcaRmUQQIEKizQGVZba2tb/njIJayrJaOmJaz2p7Ltg+d7j54MklmcAi2c7pvu83pLb27xkiCAAECBLYnUGVWw7JmJwZf/cMLt7e1dR5A2XYCBAgQGINAxVltra1v7qP2ZZUAAQIECEywQPVZHcPYwUMQIECAAIHxCMjqVk70Gs9z41EIECBAYOoEZFVWCRAgQIBANAFZjUY5dUMqK0yAAAEC0QVkVVYJECBAgEA0AVmNRhl9yGOBBAgQIDB1ArIqqwQIECBAIJqArEajnLohlRUmQIAAgegCsiqrBAgQIEAgmoCsRqOMPuSxQAIECBCYOoHqs7q5Dy8MPxk/+CPkxV+hGeETkPwN1+Kv5YgxAQIECBDoI1BxVos/YjPsR+2nWe38/ZlxfiykrI5T22MRIEBgOgWqzGrR1Gefff7UqbffTf936tTbzz77fFrZh1997UT37FNWp/N11v082goCBAjMqEBlWd3inzG/albDvcQLx4rf5snfW104lv7V1eyPsCa7czvfBrdshUtoFH8LfT390+idncDHD+6dy/dCVzN7ntFXZPGUuUCAAIFpFKgsqy98/6UDBx5+9tnnszXo/W82Z33h+y+VWDfOavrT/DjryaU9zbn8L5NnBW3/KA9n+G14uchk2s697b+aHuwELl1fetA++9lL66+FBAgQIDDTApVl9dHHvnHgwMOnTr3dG9TsmlOn3j5w4OFHH/tGKUsbZjVpZ97R5F7BjdOsFnPNUnFba+m36YQ16eWAJQSz1WPzjWYe76SjaWWLhSsrAQIECNRXoLKsZucovfvuu4Oy+u677x448MiBAw/3ZrXY+9q+0N6F2127rJdZ/7qKm3zb2fHbyWrxWGkps93F+X7gYraaXMinsNmYK+l3+ZqZHosVSi4QIECAQJfAVGa12Elb3pgkq93FzaeVw2Y1neBmC0keJZjvdmarSVZ7H0hW6zs4Lb8OORAgUGuByrI6gp3AvbPVzlM7ZFa7bjY4qyLasRUVAgQIECgEKsvqCE5Z6t2Xm4Q2m9p29TL5ts9O4GQJPQdNe3YCh1PYbGdvsX/Yvl8CBAgQqLdAZVkdyRts0uAVXQxTGl5uZW+t6ZPV7C03+clH+Q7h9gKDdpbOBF7baJZcjF9cIECAAIE6CFSW1dba+kg+DiJvYXL4Mzind8ists8Kbh863bt0Ij1emwU4yGp+9m/7CGsR8jq8YmwjAQIECGwgUGVWw7IO++GF9d63sMET6UcECBAgMAkCFWe1tba+uY/al1UCBAgQIDDBAtVndRIGF9aBAAECBAhEEZBVbxQhQIAAAQLRBGQ1GmWUYY6FECBAgMBUC8iqrBIgQIAAgWgCshqNcqqHV1aeAAECBKIIyKqsEiBAgACBaAKyGo0yyjDHQggQIEBgqgVkVVYJECBAgEA0AVmNRjnVwysrT4AAAQJRBGRVVgkQIECAQDQBWY1GGWWYYyEECBAgMNUC1Wd1a58JnP5ptvYfkJlr9P5R8WPzxZ+vKf/lmal+tqw8AQIECEy4QMVZLf423Gb+gk3658ob+V9FXVtvJeEs/fnx0p+Bk9UJ/kzqCf/nYfUIECCwWYEqs1o09dlnnz916u130/+dOvX2s88+n1b24VdfO9G7PaVkFsFI/8zq/NH2Ht3SbWS1UHKBAAECBEYsUFlWz5xfztr58ivHs5UI//vyK8ezn545v1wqazmf4Y/ylGZz2Wz/cLpzOMtqOqNN/rZ5o1nUN7lgcjmeAAAgAElEQVR7+GfPsz9XnoonO5kXDi3tSZcTXB8+ossECBAgQKBLoLKsvvD9lw4cePjZZ58PaxpezuasL3z/pdIabzD1DH6UJzadvGZBzQ+1Jj8qdiCnTd198GT6EGmP85tlx27zHzmtiQABAgQIDCVQWVYffewbBw48fOrU22FKw8unTr194MDDjz72jTCrae2Co6rhXD7JZ/vcpZ6sBuc0BfPd0s3ymWs2l93ogcIHdZkAAQIECAQClWU1O0fp3XffDVMaXn733XcPHHjkwIGHY2Q1KHEnq8fmyyc6tdaSCWs2Q02yms9cwxVwmQABAgQIbCAwZVlNT/oNGhkMEMIflaahwc7hBKKc1exoa/hfWd3g5eJHBAgQILCxQGVZ3dpO4CCK3fu4w5SGl8PcJhblrA46emq2uvHrxk8JECBAoK9AZVnd4ilLa+ulZBaz1U4sk9yWbjNwtpqeo1Q6yzfZLdw5tmoncMHrAgECBAgMJ1BZVrf4Bptkq7K30AS7gtNzfcN553BZbc9cizuG9zJb7TsKcyUBAgQIbCxQWVZba+tb+ziIbHvSM3UHf3hhOnltv0V14Gw13Y2c3zI5vBpMT2V149eNnxIgQIBAX4EqsxqWNTsxODv1N/sgiL4fsdR3G1xJgAABAgQmRKDirLbW1rf2UfsTwmc1CBAgQIBAKFB9VsO1cZkAAQIECEy1gKx2v1Fnqp9OK0+AAAEC1QrIqqwSIECAAIFoArIajbLa8ZFHJ0CAAIFJEJBVWSVAgAABAtEEZDUa5SSMkqwDAQIECFQrIKuySoAAAQIEognIajTKasdHHp0AAQIEJkFAVmWVAAECBAhEE5DVaJSTMEqyDgQIECBQrYCsyioBAgQIEIgmIKvRKKsdH3l0AgQIEJgEAVmVVQIECBAgEE1AVqNRTsIoyToQIECAQLUCsiqrBAgQIEAgmoCsRqOsdnzk0QkQIEBgEgRkVVYJECBAgEA0AVmNRjkJoyTrQIAAAQLVCsiqrBIgQIAAgWgCshqNstrxkUcnQIAAgUkQkFVZJUCAAAEC0QRkNRrlJIySrAMBAgQIVCsgq7JKgAABAgSiCchqNMpqx0cenQABAgQmQUBWZZUAAQIECEQTkNVolJMwSrIOBAgQIFCtgKzKKgECBAgQiCYgq9Eoqx0feXQCBAgQmAQBWZVVAgQIECAQTUBWo1FOwijJOhAgQIBAtQKyKqsECBAgQCCagKxGo6x2fOTRCRAgQGASBGRVVgkQIECAQDQBWY1GOQmjJOtAgAABAtUKyKqsEiBAgACBaAKyGo2y2vGRRydAgACBSRCQVVklQIAAAQLRBGQ1GuUkjJKsAwECBAhUKyCrskqAAAECBKIJyGo0ymrHRx6dAAECBCZBQFZllQABAgQIRBOQ1WiUkzBKsg4ECBAgUK2ArMoqAQIECBCIJiCr0SirHR95dAIECBCYBAFZlVUCBAgQIBBNQFajUU7CKMk6ECBAgEC1ArIqqwQIECBAIJqArEajrHZ85NEJECBAYBIEZFVWCRAgQIBANAFZjUY5CaMk60CAAAEC1QrIqqwSIECAAIFoArIajbLa8ZFHJ0CAAIFJEJBVWSVAgAABAtEEZDUa5SSMkqwDAQIECFQrIKuySoAAAQIEognIajTKasdHHp0AAQIEJkFAVmWVAAECBAhEE5DVaJSTMEqyDgQIECBQrYCsyioBAgQIEIgmIKvRKKsdH3l0AgQIEJgEAVmVVQIECBAgEE1AVqNRTsIoyToQIECAQLUCsiqrBAgQIEAgmoCsRqOsdnzk0QkQIEBgEgRkVVYJECBAgEA0AVmNRjkJoyTrQIAAAQLVCsiqrBIgQIAAgWgCshqNstrxkUcnQIAAgUkQkFVZJUCAAAEC0QRkNRrlJIySrAMBAgQIVCsgq7JKgAABAgSiCchqNMpqx0cenQABAgQmQUBWZZUAAQIECEQTkNVolJMwSrIOBAgQIFCtQPVZPX5w71yjmX8tHlkbZedOHNq9cKxacY9OgAABAjMsUG1Wj803mnN7Dh3PU5oldv7oiMp6cmlPc05Wc+0ZflnbNAIECFQlUGVWjyyUmpoRJFc2RjRnldURjVcslgABAgTaAtVl9cSh3Y1mn4np0WPhfuBwF/Hugyfz0UcSyODb9aDQyQx4/mg6D872Lbenp8E1abaTJS8cSuavjebcwt/MN0oLbB1dnGvsXTrhhUKAAAECBDYhUF1Wk25dZVaazlzztqUZzlN6lax2ipg8ShHv0mw1C3a+wDDMCV/Q6U1o5tV3FwIECBCoqUBlWU2rtmFWe6azwV2uktUilq21MKXh5fVgaelzX5qeJlPbYCE1fXEYJRAgQIDAZgUmOKulzqVh64T2KlkN9i2HKQ0vp1kNzpZqrQUp7X1op/kQIECAAIEhBCrLanrwcsPZatK28g1Gm9VOaO0B3uzozO0JECBAIBOoLqudRpZ3sRbX904Zkx9lh1pHMVtdb7WXH0xbhxiYeCURIECAAIFCoLqsDjgtKD1NKZ2kFn3N2xYcDS3tzm0fQG3v0U2iuKWdwOvZcnYvLObxLvc+X43CzgUCBAgQINAlUGVWs8OZG3wcxOAzgdMzdfNdxGlui7fAbier2XlMxaJklQABAgQIbE6g2qwm65q2c+CHF7aTmb4DNZiDtmeW7Y88XDiW3Ozqs9X19IBuM3v7TXCXgCydIjsHuGvw5VsCBAgQGFKg+qwOuaJjulnvAV37fgkQIECAwNACshpMVbOpsw8NHvrVM6axjvUhQIDA9AjIajur5QO0pdaKBwECBAgQGFKg4qwur66+df7Cm2fOvuGLAAECBAhEFXjzzNm3zl9YXl0dsohRblZlVs9dWjl17vzbF5fPXlrxRYAAAQIEogu8fXH51Lnz5y6tREnmMAupLKvLq6unz1+ILmiBBAgQIECgS+D0GOeslWX1jEmqOToBAgQIjEvgzMXlYeaa27+NrNr/TIAAAQKzLzD7We2aofuWAAECBAiMVGD7M9FhllDZbHWkdhZOgAABAgS6BIaJ4vZvI6uzv+uj64XlWwIECNRTYPvJHGYJsiqrBAgQIFALgWGiuP3byGotXkz1HJnaagIECIQC20/mMEuQVVklQIAAgVoIDBPF7d9GVmvxYgrHay4TIECgngLbT+YwS5BVWSVAgACBWggME8Xt30ZWa/FiqufI1FYTIEAgFNh+ModZgqzKKgECBAjUQmCYKG7/NrJaixdTOF5zmQABAvUU2H4yh1mCrMoqAQIECNRCYJgobv82slqLF1M9R6a2mgABAqHA9pM5zBKmMav/9PjfPfrl514PsVwmQIAAAQIbCwwTxe3fZrKz+vr3v/x3jz4YfD3+6srZSxtkNfnRg0//08ayfkqAAAECNRTYfjKHWcLkZvXnz33twa5Z6evf//I/fP/nsjquv/pbw391NpkAgRkWGCaK27/NpGY1nacO2NO7wWzVgVICBAgQINBfYPvJHGYJE5rVHzz96IN/d/QH/adl7axm09lkF3Eyhc0QX3/mH/KdwGmYH391JV1Uuie52Dn86tFwx3Jw9/7PxAyP3WwaAQIEJlDg0OGvPPDgQ70r9sCDDx06/JXe64e8Zpgobv82E5rVpI6dWHbVLj2A2tk/HB5P7c7qg3/3aHo4duVsOP199Whw/DW8e9cD+ZYAAQIEKhB4cGnpmmuu+bP9fx728s/2//k111zz4NJSeOWmLm8/mcMsYUKzuuGZR+3ZaqGZzEfbDe7OarupyVw2+FF5EpzMegcmvILXU7FdLhAgQKC2AllEi7J2fbs1lmGiuP3bzEJW073B2R7joJ35TuBCP6hv+3TiYFfwoB3OskqAAAEC1QgUKS0uFL/Pt3Zh+8kcZgkTmtXOIdLyzDKl7J6tbjar7YOy+aHW4O7VvHS29vpwLwIECMy8QBbU3h3CW9vwYaK4/dtMaFaHOWWpYA26OMxsdYMqyyoBAgQITJbAX3zxi3/xxS8Wv/C3c2H7yRxmCROa1dIZRt0T1g26KKuT9e9hO/8A3JcAAQJxBYaJ4vZvM6lZvbSS7aotvXV1wMdBbHK2mqY3P0cpe5TBb+ZRKQIECBCYEYHtJ3OYJUxuVpNBSnraUXBi0deeeb3PhxduMqul85W+/Nzrwd1n5KUTd3xnaQQIEJgNgWGiuP3bTHZWu3f/yh4BAgQIENiiwPaTOcwSZHWLT89sjN1sBQECBOojMEwUt38bWZVVAgQIEKiFwPaTOcwSZLUWL6b6jEZtKQECBAYJDBPF7d9GVmWVAAECBGohsP1kDrMEWa3Fi2nQ2M31BAgQqI/AMFHc/m1kVVYJECBAoBYC20/mMEuQ1Vq8mOozGrWlBAgQGCQwTBS3fxtZlVUCBAgQqIXA9pM5zBJktRYvpkFjN9cTIECgPgLDRHH7t5FVWSVAgACBWghsP5nDLEFWa/Fiqs9o1JYSIEBgkMAwUdz+bWRVVgkQIECgFgLbT+YwS6gsq+d8jD4BAgQIEBiXwLlLK8NEcfu3qSyrFy6vDpqnu54AAQIECMQVuHB5dfvJHGYJlWV15Z134pJZGgECBAgQGCSw8s47w0Rx+7epLKuttfXlK8pai+MZg17lridAgMB4BJavjKmprbX1KrPaWlu/3GpduLzqOOt4XlgehQABAv9/e3fzG8WRh3F8/yyO3Dj4Qm6c4JgjSKNVFClSOGWljeTIWQm02iREiyIlJBZ5k5co2rxJIcYRi4wNGPESGwgmmBhijzUz2EOvqrq7XnqqxzPxr2bcM98IJeOe7nr5dFNPVU+PM1YCv60/XXv2x7N6fe9r0N5LGHKs9t5Q9kQAAQQQQGD/CxCrzf1/kmghAggggEBVBIhVYhUBBBBAAAExAWJVjLIqMynaiQACCCAQT4BYJVYRQAABBBAQEyBWxSjjzX0oGQEEEECgKgLEKrGKAAIIIICAmACxKkZZlZkU7UQAAQQQiCdArBKrCCCAAAIIiAkQq2KU8eY+lIwAAgggUBUBYpVYRQABBBBAQEyAWBWjrMpMinYigAACCMQTIFaJVQQQQAABBMQEiFUxynhzH0pGAAEEEKiKALFKrCKAAAIIICAmQKyKUVZlJkU7EUAAAQTiCRCrxCoCCCCAAAJiAsSqGGW8uQ8lI4AAAghURYBYJVYRQAABBBAQEyBWxSirMpOinQgggAAC8QSIVWIVAQQQQAABMQFiVYwy3tyHkhFAAAEEqiJArBKrCCCAAAIIiAkQq2KUVZlJ0U4EEEAAgXgCxCqxigACCCCAgJgAsSpGGW/uQ8kIIIAAAlURIFaJVQQQQAABBMQEiFUxyqrMpGgnAggggEA8AWKVWEUAAQQQQEBMgFgVo4w396FkBBBAAIGqCBCrxCoCCCCAAAJiAsSqGGVVZlK0EwEEEEAgngCxSqwigAACCCAgJkCsilHGm/tQMgIIIIBAVQSIVWIVAQQQQAABMQFiVYyyKjMp2okAAgggEE+AWCVWEUAAAQQQEBMgVsUo4819KBkBBBBAoCoCxCqxigACCCCAgJgAsSpGWZWZFO1EAAEEEIgnQKwSqwgggAACCIgJEKtilPHmPpSMAAIIIFAVAWKVWEUAAQQQQEBMgFgVo6zKTIp2IoAAAgjEEyBWiVUEEEAAAQTEBIhVMcp4cx9KRgABBBCoigCxSqwigAACCCAgJkCsilFWZSZFOxFAAAEE4gkQq8QqAggggAACYgLEqhhlvLkPJSOAAAIIVEWAWCVWEUAAAQQQEBMgVsUoqzKTop0IIIAAAvEEiFViFQEEEEAAATEBYlWMMt7ch5IRQAABBKoiQKwSqwgggAACCIgJEKtilFWZSdFOBBBAAIF4AsQqsYoAAggggICYALEqRhlv7kPJCCCAAAJVESBWiVUEEEAAAQTEBIhVMcqqzKRoJwIIIIBAPAFilVhFAAEEEEBATIBYFaOMN/ehZAQQQACBqggQq8QqAggggAACYgLEqhhlVWZStBMBBBBAIJ4AsUqsIoAAAgggICZArIpRxpv7UDICCCCAQFUEiFViFQEEEEAAATEBYlWMsiozKdqJAAIIIBBPgFglVhFAAAEEEBATIFbFKOPNfSgZAQQQQKAqAsQqsYoAAggggICYALEqRlmVmRTtRAABBBCIJ0CsEqsIIIAAAgiICRCrYpTx5j6UjAACCCBQFQFilVhFAAEEEEBATIBYFaOsykyKdiKAAAIIxBMgVolVBBBAAAEExASIVTHKeHMfSkYAAQQQqIoAsUqsIoAAAgggICZArIpRVmUmRTsRQAABBOIJEKvEKgIIIIAAAmICxKoYZby5DyUjgAACCFRFgFglVhFAAAEEEBATIFbFKKsyk6KdCCCAAALxBIhVYhUBBBBAAAExAWJVjDLe3IeSEUAAAQSqIkCsEqsIIIAAAgiICRCrYpRVmUnRTgQQQACBeALEKrGKAAIIIICAmACxKkYZb+5DyQgggAACVREgVolVBBBAAAEExASIVTHKqsykaCcCCCCAQDwBYpVYRQABBBBAQEyAWBWjjDf3oWQEEEAAgaoIEKvEKgIIIIAAAmICxKoYZVVmUrQTAQQQQCCewNBideHazffOfPzWW+92+fPemY8Xrt3s0vn5qaMHjpyabzTrjeuTRw4dqM102XnfvzVzPOtLs/7FqwcOvnpe9WvPf1RRh8J/THV7r2XgJZyvHcpPfZhI7WA6Lt/TXq+3+amjx79IW6gOeWnqusA5Hbg2bUYAgd4FhharZ97/pEugmrfOvP9Jl86MUqzumhNdHHp8S3FJpfWwR/ZuXIunXjrozbF0xB6dXAwHcI96/m69xapuSR6rgrVTFAII7F+BocVqGpxp9WX/TvfxhzOP0onVpho6q7xa7ZYTQhk2HrEaDDy9UXLNGqzFuzjVdUusCl26XQYB3kJgvwmMTqzOTx1N77ClWXterczS24BqmaITRf/YZWz17pf6i5t0AZQW6JbQy3Yb9jPHDx46/oX6d9q2/JagHqOd1jo3gdVbL03NqFvcnbWnt77T7bVTu94GD8Sq237bTlXp8Sm95lMN1npHTvVE6hq6UIXh1d3toKHu3lk9c8oRJstuAquSTYE25+a/mNEfFmRb7PVw0L0xWzxB/kTNOU1FbXtO7f0At4/KNu2duQkcOqSR3/93jnUWu04D9HnZb6MJ7UEAgXqjOTqxak5nNmJmIZEPXu6PNj/ssKuTzA7H+rZh/ummHuPM6GaXlWXbdVZ5kZkFTNaYrChvN50ZJodUyWnt2UgaOkS/lfUlH3CDXcsjrRirXgN0CVkD0tKsRq+kqtnmKLd5jnOWHGa3NCx37ay7Wz5JMlx5B+uNbAbgJqi5MMwLfXLzBngI6QnK3/LOr+uTB3yqrUswAexdOfqt/MpRJWRXRZdDdKXmY2OnNN/To/Z5HQ3TZV4ggMDABEY1VvORseENx/X0x9BwrMYvN5OcYav4Vj5sddvuVmHHVj1qO7W4OadKM0ep2p2kcQ6xu9l99Kjqj9TBC8itLkBh2+mP4GlW2bwsJS2UH2xDVq/TI2dCU6zXdta2LY0Qvafhys9IoFPOW1l7ikWlIZ1qqxOUz4f85+Cc60GXY0+lbWRWl1OIV5dqc1p4t0MKFdkSnGI7O8UWBBDYNwKjGqvpKKmGYDXWO+Nvx4hWnOmrHdz7sY2y4az37WY8VYfkaxeThdkMwGuYjUxzbNZOs5t5kaeXTho3rjouMj/2Ottv6jIvskr9A8tJdQYcKPSxoxl5g/M1n9JOEYr12j5akKKDKS19YQ8pq7eQW94noIUTZEkLV5Hz5Lndx7TEtsGGYhbSOla7HlLoqVOCKvagM/cq6yDbEUBgqALEajZM6zVTGqh6iLeDb2GozffXcetlZHYi1f55MNsXejztKEoNmsOM1ZJ2FuOt11hVAm73s66ZvMleKNsgdbFek0+FBnTOlkwVHflnzlf+opBbvcWqaYmpSG1Rk5him70VsxOKzp5dDyk0zyshXVjnF1XXKZRpJy8QQGDAAsRqOtqqka7kJrDKCefGYD46972KzSLHS2Ib3nrpZlbVdmwtDsFmfDcv8iumowsd8zU/nMr65a6rss76B5avVr0a03y1tw1K22kRSjvrPMOVNamj+/l5saXlW9JWme3mhWmtndyoNjsnyJJ2pLV5y7yw1eWJW3gS2PSu6yGqeQ6aH6u5YZavocvSNsPszAsEEBikALGaDkOF8TS9P2nvTHqJmw3HgcFRn7nO7aZwnTTOIsMdrL2csGOrGYuz4dLuZvfRb+nxN9ROO8766dilncVK/QN7jNU0VDoXrEbD6dGuN4GL6aIbb2YhJiDVi85+5RvT/YtFpRFlP1sNxqrzAXDabHsq7RnJmqHeygLPq8uqdjskdFqdJtmzqQpxrqVBjhrUhQACXQSI1XSc8odpNbSpW23ZcKZ/NEObzZiy7XowNSsJZwzVY7Ep1htz+16t+vmh229Gcy9m7EBsW57uUNpOGwDppVM4UP3oRJrpYGE3s92//rpQF+t1S1Cv82Wcrqj8U0bdLzdy9LE24L0fPYRC5OumZtHlNVuXkKeaX53bTv97q07vuhxSGqtOWns3ru359Z3ZjgACwxEgVo17lnk6UF8974222d28/BPB4j26XbbbBEpHxlPmw1cT1WpATIfaNHTt2OqMxToL1ahtC9RjvZ4BpN9tNVkeHGELsedWqrrgF+sWVThQ/Wh39iYEWeBlH506UF7Sl1F372x6C0F/snjkVOn3VrOKrIzftex0u+10zoJqmPOjLsSuCJ0yu3xv1ZHJPmfNbAu9cxDcQ+yp103VV0XeJOeQ3aZQwQuAjQggMACBocWqyC8vHACQaBVqWHTjSrzwfPw1cwVeIIAAAggMVGBosbpw7eY7735kfvdv8MWuv2pfNJYG4C4Zq3q9ZW9s6h/LVocD6BpVIIAAAggogaHFatUSUeRykYxVe4NxlzuuIi2nEAQQQACBngSI1Z6YxnISgAwCCCCAQN8CxGrfZEQsAggggAACZQLEKrGKAAIIIICAmACxKkZZNnNhOwIIIIDA+AgQq8QqAggggAACYgLEqhjl+MzF6CkCCCCAQJkAsUqsIoAAAgggICYw5Fi9sDpbW5w6PFebuHSCPwgggAACCAgKHJ6r1RanLqzOlq0sY2wfZqyevjMtyEdRCCCAAAIIBAVO35mOkaDBMocWqxdWZ4OdZyMCCCCAAALiAgNbsw4tVmuLU+JqFIgAAggggEBQoLY4FVxcim8cWqzyeWrwxLMRAQQQQCCGwOG5mniCBgscWqzGUKNMBBBAAAEEygSCKSi+kVjlCWQEEEAAgbEQEE/QYIHE6lhcTGVzN7YjgAAC4yMQTEHxjcQqsYoAAgggMBYC4gkaLJBYHYuLaXxmo/QUAQQQKBMIpqD4RmKVWEUAAQQQGAsB8QQNFkisjsXFVDZ3YzsCCCAwPgLBFBTfSKwSqwgggAACYyEgnqDBAonVsbiYxmc2Sk8RQACBMoFgCopvJFaJVQQQQACBsRAQT9BggcTqWFxMZXM3tscUeOPNR7cebm+39V+ydruxtnX9q+XTx9T/A/GbW0mSPL86Kf7/Q3x4L0mSWw+LV/V0PUmSjYt3ittjdp+6ENh3AsEUFN9IrO67E89INxIC/5jebLSTpN2uP9xavrH5IMvXLEq/urqzVW/8/HdiVVyAAhEoFxBP0GCBxCqxikAEgeXrG0nSbl7+2xVb+Ms3//Pz5mX5Fao7iLBadTV4jYAvEExB8Y3Eqh31RmKRRHf2h4COt0dP3im5qPRN4Po3+bsnX7t/dSW9Xfyitba5dHvH3CJO9/zO7NBu11fWPtR3kkM97SFWJ9c31A3hX85+vvm08SJJkp1G65dPb53MGxMq1h+b2BOBigqIJ2iwQGKVQQSBCAL3b7eSpLX13SvhQPJi9ZWH9xpJsv38/sXH33/2+Ortlv44NrtdrPd8sbOd7Gw2H9zYXH2qgrC1cL8kBXuN1Xb7RdJuP1vZXL7d3NpOkqS9fG4xgkO4+1SEwHAEgikovpFYHc7Zrehcj2b3LPDBDy31rNL29trtZ5fPrfz7r/PulebE6pUL19pJ8nzhbXu7+IOLz/3VavvhV7ffyKq+efm3JGlvfh1uSa+xur2ydvblLPNOvq3Wr8nq2j/DZRKNCIyKgHiCBgskVt3BjtcIyAnMn/38j7VNtbhM/9nZbF7/aCldZTqx+utyO0lWfpt0Iq0jVu3t4hMTl75eepEk3hanzb3Gqv9U8NLcalJe5qgMqY6wI0bvxkkgmILiG9O/8H/J/+ar/4rXESyQSxyB8RA4eXzp3NnHV2801YPB+b1WG6v6k87G/1bcgb57rOp3ZWM1/cJP64r8k8njNGSPx/XsXqjVex0MI/GNxGr1rgz+9lZT4OQHm9tJ0l76Nf/eqo5GHaubs3fd63Cvsdp5O9f93mr2yJL3HVYd81s/niAFERhpAfEEDRZIrLrDGa8RiCjwyuPH+e9qsKvVY6sPkiS5s+o+grSHWL278DRJnq5/6M88Jme2kiS5N61HzECs6pvArY0Z/6iIFFSEwFAEgikovpFYZexAQF5g8vdflx5Pv2afQjoxceXDi+ohpvVvb3qr1Yn0EaStH80zw8eW/nuj+AUb81WcExOXut4ETh+Aat+bvm47dezuwnqSJM2518Oxmj6yVP508UgvX4YyuFPpsATEEzRYILFqR59hnWnqHT0BvSJMkhfbG+pbMcs3ttY22up3Lj1ZT79yalerE5cmz222smeGs6+7qG+/5L/a0N0zvVa7xuqlE+nXddo7v99Y/+mzR99/mz429eLZxbvZgjht2/bz1Z+ffP/Zo58u1je2k6RR/8bk+uidDnqEQCoQTEHxjcQqsYpABIH5d/71+PpKq9HKngTeaTxfm39kvtPih+WV9z/NfjNDu7W9evH+l7PPzXO5/p5q4bhLrE5cOsiJJfYAAANSSURBVPna/cu3TdUvWk+bt9zf9qBjtbGycX+tvaMeomrXV9a/9BbWLE8RGFEB8QQNFkisRhhSR/SKZMI7KIGZhXb5N1P3fHUFPlvdc5mDkuFvKwJ7EgimoPhGYnVPJ4nRBAFxgWMrSxtJe/mR+01WyauUWBU/ZRRYFQHxBA0WSKxKDlhVubZo574SmPz9yUbzwdX0o9Bn6tcTtltXnV+6JHyJEqv76uzTmEEKBFNQfCOxKjxmDfISoa7REHj90crTnZb6xbzqk87G2uYPb3q/6VD4EiVWR+OyoRd/QkA8QYMFEqvCY9afONMcggACCCAwAIFgCopvJFaJVQQQQACBsRAQT9BggcTqWFxMA5gGUgUCCCCwzwWCKSi+kVglVhFAAAEExkJAPEGDBRKrY3Ex7fMpJM1DAAEEBiAQTEHxjUOL1cNztQEgUgUCCCCAAAITl04cnquJJ2iwwKHFam1xijONAAIIIIDAYARqi1PBFBTfOLRYvbA6OxhKakEAAQQQQODC6qx4ggYLHFqs1hvN03emOdMIIIAAAgjEFjh9ZzoYgTE2DjNW643mhdXZ2uIUn7PGvqQoHwEEEBhDgcNztdri1MDWqWlIDzlWY8wUKBMBBBBAAIFhCRCrzWHRUy8CCCCAwOgJEKvEKgIIIIAAAmICxKoY5ejNuegRAggggEC/AsQqsYoAAggggICYALEqRtnvjIb9EUAAAQRGT4BYJVYRQAABBBAQEyBWxShHb85FjxBAAAEE+hUgVolVBBBAAAEExASIVTHKfmc07I8AAgggMHoCxCqxigACCCCAgJgAsSpGOXpzLnqEAAIIINCvALFKrCKAAAIIICAmQKyKUfY7o2F/BBBAAIHREyBWiVUEEEAAAQTEBIhVMcrRm3PRIwQQQACBfgWIVWIVAQQQQAABMQFiVYyy3xkN+yOAAAIIjJ4AsUqsIoAAAgggICZArIpRjt6cix4hgAACCPQrQKwSqwgggAACCIgJEKtilP3OaNgfAQQQQGD0BIhVYhUBBBBAAAExAWJVjHL05lz0CAEEEECgXwFilVhFAAEEEEBATIBYFaPsd0bD/ggggAACoydArBKrCCCAAAIIiAkQq2KUozfnokcIIIAAAv0KpLH6f8ZGRx7t6SOSAAAAAElFTkSuQmCC\"></p><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p>方式一：GitHub链接提交</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的HTML和CSS 文件上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol><p>方式二：ZIP文件提交</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS代码保存在一个名为 \"Registration_Form\" 的文件夹中；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将文件夹压缩为 ZIP 文件；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传zip文件，点击“确认提交”，提交成功。</span></li></ol><p>请确保提交的代码结构完整、清晰，并能够正常运行。</p>",
          "_id": "69e329419f9cc30e74196cf2"
        },
        {
          "code": "L08",
          "title": "Lab(1)：使用Chrome Debugger和实现Responsive List",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用Chrome Debugger和实现Responsive List</p>",
          "_id": "69e329419f9cc30e74196cff"
        },
        {
          "code": "L09",
          "title": "HTML&CSS (Part 2)",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>CSS概念</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义：CSS (级联样式表) 是用来装饰和布局网页的语言。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>作用：让网页内容更加美观，为HTML元素设置样式。</li></ol><p>Emmet语法</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义：一个高效的编码快捷工具，帮助快速编写HTML/CSS。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>示例：输入ul&gt;li*5后，可快速展开为5个列表项的无序列表。</li></ol><p>选择器的种类及其作用</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签选择器：针对特定HTML标签应用样式。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类选择器：一个或多个HTML元素的自定义样式。例如，.classname。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类选择器多类名使用：一个元素可以应用多个类名，例如&lt;div class=\"class1 class2\"&gt;。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ID选择器：针对特定ID的HTML元素应用样式。例如，#idname。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通配符选择器 (``)：选取所有元素应用统一样式。</li></ol><p>CSS字体与文本属性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>字体属性：如font-family, font-size, font-weight等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>复合属性：例如font: 12px Arial, sans-serif;可以一次性设置多个字体相关的属性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文本样式：如text-align, text-decoration, text-transform等用于控制文本的显示效果。</li></ol><p>CSS样式表的种类</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>内部样式表：直接在HTML文件的&lt;head&gt;中使用&lt;style&gt;标签。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>行内样式：直接在HTML元素上使用style属性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>外部样式表：通过.css文件链接到HTML，使样式与内容分离。</li></ol><p>选择器的进阶使用</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>后代选择器：如div p选择所有div内的p元素。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>子元素选择器：如div &gt; p只选择div的直接子元素p。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>并集选择器：例如h1, h2, h3可以同时为多个标签设置样式。</li></ol><p>链接伪类选择器</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如:hover, :active, :visited等，用于定义链接或其他元素在不同状态下的样式。</li></ol><p>元素显示模式</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>行内元素：如span，不独占一行。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>块元素：如div，独占一行。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>元素模式转化：使用display属性，如display: block;或display: inline;。</li></ol><p>背景属性 (background)</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如background-color, background-image, background-repeat等，用于设置元素的背景。</li></ol><p>CSS的三大特性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>层叠性：当有多个相互冲突的样式规则时，哪一个会生效。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>继承性：某些样式会被子元素继承。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优先级 &amp; 权重叠加：如!important, 选择器的权重等。</li></ol><p>CSS盒模型 (Box Model)</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括：内容(content), 填充(padding), 边框(border), 外边距(margin)。</li></ol><p>边距的特性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Margin水平居中：如margin: 0 auto;可以使块元素在容器中水平居中。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Margin合并塌陷：当两个垂直边距相遇时，它们将形成一个边距。</li></ol><p>Flex布局</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍：一个为设计复杂布局而生的模型，主要用于调整元素在不同设备和屏幕大小上的显示。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基本概念：如flex-container, flex-item, justify-content, align-items等。</li></ol><p>Flex属性</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如flex-grow, flex-shrink, flex-basis等，用于控制flex容器内元素的大小和排列。</li></ol>",
          "_id": "6834079e705ef70538933636"
        },
        {
          "code": "L10",
          "title": "HTML&CSS (Part 2): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业背景：</strong></p><p>卡片式设计（Card UI Design）是现代Web设计中常见的一种模式，广泛用于产品展示、新闻摘要、个人资料等。此次作业，你将会获得一些预先设计好的Card UI Design图。你的任务是使用HTML和CSS来实现这些设计，将其从静态图像转变为实际的Web元素。</p><p>选择一个提供的UI设计，完成作业。</p><p>参考图一：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66ebbcbab6f2210012886fe6/6b41a24aa27f883bed79cf9329e6beb0.png\"></p><p>参考图二：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66ebbcbab6f2210012886fe6/ed57f5b8462e237bd62872ff63e7bd51.png\"></p><p><br></p><p><strong>作业要求：</strong></p><p><strong>精确还原</strong>：尽量确保你的代码实现与给定的UI设计图在视觉上相匹配，包括颜色、尺寸、字体和间距。</p><p><strong>响应式设计</strong>：尽管设计图可能是针对特定的屏幕尺寸，但你需要确保你的卡片设计在各种设备和屏幕尺寸上都能正常显示。</p><p><strong>使用选择器和属性</strong>：你应该在CSS中应用至少以下选择器和属性：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签选择器、类选择器、ID选择器。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文本样式、背景属性、padding、margin、flexbox。</li></ol><p><strong>代码清晰性</strong>：代码应该是清晰的、整洁的，并且有适当的注释。</p><p><strong>交互效果</strong>：考虑为你的卡片添加一些基本的交互效果，如hover状态。</p><p><br></p><p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">作业提交：</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">方式一：GitHub链接提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS 文件上传到 GitHub 仓库，确保项目结构清晰且完整；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传可访问的仓库链接，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">方式二：ZIP文件提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS代码保存在一个名为 \"Card_UI_Implementation\" 的文件夹中；确保所有必要的资源（如图片、字体）都已包含在此文件夹中，并使用相对路径链接到你的HTML中。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将文件夹压缩为 ZIP 文件；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传zip文件，点击“确认提交”，提交成功。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">请确保提交的代码结构完整、清晰，并能够正常运行。</span></li></ol>",
          "_id": "69e329419f9cc30e74196d12"
        },
        {
          "code": "L11",
          "title": "Tutorial 01 (HTML)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>自我介绍以及上课要求 </strong></p><p><strong>手把手练习</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>页面仿写练习</strong>:</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 HTML 和 CSS 仿写 <a href=\"https://jiangren.com.au/\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"color: inherit;\">https://jiangren.com.au/</a> 网站的主页布局和样式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学会如何分析网页元素的结构和样式。</strong></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>学会如何用Chrome Inspect分析网页元素和拿取图片。</strong></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Head部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 head, title, description 以及解释 SEO</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Header部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 input, button, div, options, img alt, span…..</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Menu部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 ul, li, menu, img, alt, button, a, span</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Banner部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 section, div, img, alt, a, span…..</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Footer部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 ul, li, a, button, img, alt, p, span….</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li></ol><p> </p><p><strong>作业点评&amp;答疑</strong></p><p><strong>创建 Registration Form</strong>:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>答疑注册表单作业。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供反馈和改进建议，聚焦于表单结构、字段校验、和响应式设计。</li></ol><p><strong>HTML&amp;CSS 问答</strong></p><p><strong>问答环节</strong>:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回答学员在学习 HTML 和 CSS 过程中提出的问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供解决常见问题的策略和技巧。</li></ol>",
          "_id": "6834079e705ef70538933638"
        },
        {
          "code": "L12",
          "title": "CSS & Sass",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Card Design作业评议与SVG编辑</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾与讨论学生提交的card design作业。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何编辑SVG图像以增强设计效果。</li></ol><p>box-sizing的实际应用</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释box-sizing属性如何影响元素的宽高计算。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示content-box与border-box之间的区别。</li></ol><p>CSS长度单位探讨</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>绝对单位：如px, pt, cm等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>相对单位：如em, rem, vw, vh等。</li></ol><p>文本溢出处理</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解`word-wrap`和`word-break`属性如何帮助控制文本溢出。</li></ol><p>伪类与伪元素的使用</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如:hover, ::before, ::after等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何使用它们增强页面样式和效果。</li></ol><p>float的应用技巧</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍float属性的常见用途，如创建多列布局或水平菜单。</li></ol><p>选择器的特异性 (specificity)</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解如何计算选择器的权重，以及为何某些样式没有被应用。</li></ol><p>响应式设计基础</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么响应式设计是必要的。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用媒体查询创建适应不同屏幕大小的布局。</li></ol><p>Bootstrap与Semantic UI</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简介Bootstrap，展示如何使用Bootstrap实现响应式设计。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Semantic UI框架并比较其与Bootstrap的异同。</li></ol><p>CSS预处理器简介:&nbsp;</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是Sass、Less等预处理器？为什么它们在现代网页开发中很有用？</li></ol><p>CSS的挑战与Sass解决方案</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论在大型项目中CSS可能面临的问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Sass (SCSS) 如何简化CSS编写，以及如何使用变量、嵌套等功能。</li></ol><p>深入Flexbox</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Flexbox如何解决传统布局问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索`flex`, `flex-grow`, `flex-shrink`等属性的使用。</li></ol><p>UI设计原则与组件库</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习创建出色UI的基本原则。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍流行的组件库，如Material-UI或Ant Design。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示个人网站设计案例，启发学生的设计灵感。</li></ol><p>&nbsp;</p><p>作业指导</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>要求使用本节课学到的技能完成四个Card布局。</li></ol>",
          "_id": "6834079e705ef7053893363a"
        },
        {
          "code": "L13",
          "title": "Lab(2)：使用Grid和Flexbox实现卡片布局",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用Grid和Flexbox实现卡片布局</p>",
          "_id": "69e329429f9cc30e74196d2d"
        },
        {
          "code": "L14",
          "title": "JavaScript ",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>JavaScript的奇幻之旅：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随时间的轨迹，了解JavaScript如何从一个小小的脚本语言成为Web的重要组成部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解其如何成为Web的核心语言。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验Node.js的魅力，看看如何轻松地在这个环境中运行你的JS代码。</li></ol><p>探索js的秘密：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解JavaScript的独特Data Types，感知数据的生命力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认识变量命名背后的Naming Conventions，并感受到Hoisting带来的惊喜。</li></ol><p>动态的数据操作：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习Operators的秘密语言，看它们如何让数据生动起来。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解==与===的精确差异</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入探讨JavaScript的Type Conversion，体验其动态特性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>揭示数字计算中的Precision问题，学会安全的数据处理技巧。</li></ol><p>数组的神秘世界：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从创建到访问，全方位认识Arrays。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索数组的神奇方法，无论是sort还是filter，并学会使用break和continue来调控循环的行为。</li></ol><p>控制代码的流程：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验如何使用Conditional Statements让代码做出决策。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>利用Loops让魔法反复施放，直到完成神奇的任务。</li></ol><p>Dive into Functions:</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何将神奇的咒语封装成Functions，随时随地召唤。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义和调用函数，了解Scope和参数传递的机制。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Strict Mode，为什么它是良好编程实践的一部分。</li></ol><p>Objects：模型化复杂的现实世界</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Objects，看它们如何代表复杂的事物。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验Objects和Arrays的冒险，了解它们在JavaScript世界中的地位。</li></ol><p>最佳实践和注意事项：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Strict Mode，掌握其在现代JavaScript开发中的重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认识一些常见的JavaScript陷阱，并学会如何避免它们。</li></ol>",
          "_id": "6834079e705ef7053893363b"
        },
        {
          "code": "L15",
          "title": "JavaScript Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>JavaScript 入门作业: 购物清单管理</strong></p><p>作业目标:</p><p>通过这次的作业，你将会练习JavaScript中的基本数据类型、数组、对象、条件语句、循环语句和函数的应用。</p><p>作业要求:</p><p><strong>数据与变量：</strong></p><p>创建一个购物清单数组，例如:</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/36160717-8966-4f0a-8b7b-02f2afda4063.png\"></p><p><strong>数组应用：</strong></p><p>向购物清单中添加两样物品，并输出更新后的清单。</p><p>从购物清单中删除最后一项物品，并输出结果。</p><p><strong>条件与循环：</strong></p><p>创建一个函数，当购物清单中的物品超过5项时，在控制台输出\"你的购物车满了\"。</p><p>使用循环语句遍历购物清单，将每一项物品在控制台上以编号的形式输出。例如：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/1108680f-6d20-48ff-b6d6-a6a13cf6d313.png\"></p><p><strong>函数与对象：</strong></p><p>创建一个函数，该函数接受物品名称作为参数，并返回该物品是否在购物清单中。</p><p>创建一个购物物品对象，其中包括物品名称、价格和数量。例如:</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/e66a7c88-b85f-4641-9f2e-9d1890ceccf8.png\"></p><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">方式一：GitHub链接提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">将你的JavaScript 文件（如：ShoppingList.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">上传可访问的仓库链接，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">方式二：ZIP文件提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">请将你的代码保存在一个名为 \"</span>ShoppingList<span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">\" 的文件夹中；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">将文件夹压缩为 ZIP 文件；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">上传zip文件，点击“确认提交”，提交成功。</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">请确保提交的代码结构完整、清晰，并能够正常运行。</span></li></ol>",
          "_id": "69e329429f9cc30e74196d42"
        },
        {
          "code": "L16",
          "title": "Tutorial 02 (CSS)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>手把手练习</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>页面仿写</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实时演示如何分析和利用HTML和CSS构建 <a href=\"https://jiangren.com.au/\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"color: inherit;\">https://jiangren.com.au/</a></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 HTML 和 CSS 进行布局设计，并实现响应式特性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Header部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 flex, :hover, color, font-size, font-family…etc</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 button</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Menu部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 flex, :hover, color, width, height, font-family…etc</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Banner部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 section, div, img, alt, a, span…..</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 maxwith, flexwrap, color…etc</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutor示范如何用HTML创建Footer部分</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括 ul, li, a, button, img, alt, p, span….</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生练习</li></ol><p><br></p><p><strong>作业点评</strong></p><p><strong>创建 Card UI Design</strong>:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>答疑卡片 UI 设计作业。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论不同设计方法，以及如何使用 CSS 来提高界面的吸引力。</li></ol><p><br></p><p><strong>HTML&amp;CSS 问答</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>问答环节</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回答学员在学习 HTML 和 CSS 过程中提出的问题。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供解决常见问题的策略和技巧。</li></ol>",
          "_id": "6834079e705ef7053893363d"
        },
        {
          "code": "L17",
          "title": "Git Introduction",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>探索版本控制的魔法</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么我们都爱版本控制？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分布式(Distributed) vs 集中式(Centralized)：Git的独特之处。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是分布式版本控制系统</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>主流的 git 系统介绍</li></ol><p><strong>开启你的Git旅程</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>一步步引导你安装和配置Git。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为Git设定你的身份：告诉Git你是谁。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化Git空间: **git init**的魔力。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>mkdir</strong>：快速创建你的项目目录。</li></ol><p><strong>创建并驾驭你的代码宝库（Repository）</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化你的第一个Git仓库。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何管理和跟踪你的代码变更。</li></ol><p><strong>保护与跟踪你的代码</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何安全地保存你的代码更改？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解**add**, **commit**以及它们如何帮助你管理更改。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解**git log**：用美化的log追溯你的代码历史。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>.gitignore</strong>：掌握哪些文件不应纳入版本控制。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索日常工作中使用Git的标准流程。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>远程仓库(Remote Repository)的创建与管理：掌握**clone**, <strong>push</strong>, <strong>pull</strong>。</li></ol><p><strong>Sourcetree：让Git操作可视化</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么需要图形化工具？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用Sourcetree提高工作效率。</li></ol><p><strong>出错了怎么办：撤回与修复</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握reset, <strong>revert</strong>, <strong>amend</strong>：让你的代码时光倒流。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>checkout和stash</strong>：两种保存和切换的策略，它们的不同之处。</li></ol><p><strong>更进一步：分支管理与合作</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何merge、处理代码冲突。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>rebase</strong>：为什么和何时使用它。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>pull request与代码审查：如何高效、规范地合作。</li></ol><p><strong>当代码世界相撞：冲突(Conflict)解决大师</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当代码出现纷争，我们该如何和平解决？</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用rebase<strong>与</strong>merge的策略，成为解决冲突的高手。</li></ol><p><strong>Git的小贴士和技巧</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍神奇的.gitignore文件：让某些文件“隐形”。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>快速、有效地查看你的代码历史。</li></ol><p><strong>Git遇见GitHub：开放的代码舞台</strong></p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>GitHub: 一个开发者的乐园。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在GitHub上展示你的才华，与全球开发者共舞。</li></ol><p>&nbsp;</p><p><strong>Links:</strong></p><p><br></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git client: <a href=\"https://git-scm.com/\" rel=\"noopener noreferrer\" target=\"_blank\">https://git-scm.com/</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>SourceTree: <a href=\"https://www.sourcetreeapp.com/\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.sourcetreeapp.com/</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Visualizing Git: <a href=\"http://git-school.github.io/visualizing-git/#free\" rel=\"noopener noreferrer\" target=\"_blank\">http://git-school.github.io/visualizing-git/#free</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Windows Terminal: <a href=\"https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Powerline for Windows Terminal: <a href=\"https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup</a></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Windows Subsystem for Linux: <a href=\"https://docs.microsoft.com/en-us/windows/wsl/install-win10\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.microsoft.com/en-us/windows/wsl/install-win10</a></li></ol>",
          "_id": "6834079e705ef70538933640"
        },
        {
          "code": "L18",
          "title": "Git Introduction Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git 简答作业</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git 练习作业</li></ol><p><br></p><p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">作业提交：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">在你的GitHub上面创建一个仓库，上传GitHub仓库链接，点击“确认提交”，提交成功。</span></li></ol>",
          "_id": "69e329439f9cc30e74196d60"
        },
        {
          "code": "L19",
          "title": "Lab(3)：创建Responsive定价卡片",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>创建Responsive定价卡片</p>",
          "_id": "69e329439f9cc30e74196d6f"
        },
        {
          "code": "L20",
          "title": "Lab(4)：Git实践练习",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Git实践练习</p>",
          "_id": "69e329439f9cc30e74196d76"
        },
        {
          "code": "L21",
          "title": "探索现代 JavaScript —— ES6 (ECMAScript 2015) 之魅力",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>可供学生预习大纲：</p><p><br></p><h3>1. 重新定义\"变量\"：let, const</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为何var不再流行？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>const: 不仅仅是常量</li></ol><h3>2. 模板字符串 (Template Literals)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>无痛多行与字符串嵌入 Seamless multi-line support &amp; string interpolation</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态字符串制造器 • Dynamic string generation</li></ol><h3>3. 解构 (Destructuring)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组、对象，一切尽在掌握</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>函数参数的魔法展示</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从对象和数组中轻松提取信息，让数据处理变得更高效</li></ol><h3>4. 箭头函数 (Arrow Functions)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>this 的革命</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简洁与力量的完美结合</li></ol><h3>5. 展开与收纳: 扩展操作符 (Spread &amp; Rest)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组、对象的新演绎</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>收纳与释放的双重魔法</li></ol><h3>6. 可选与默认: 参数默认值</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>告别undefined</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态、简洁、高效</li></ol><p><strong>本节知识点：</strong></p><p>同学们可以根据自己时间精力设置前端整体学习目标</p><p>以下是项目参考</p><p><a href=\"https://docs.google.com/spreadsheets/d/1Sk_ovYC8tsEBpXns4Yt4ZzC77riF-P8H1D6KTtW0tSM/edit?usp=sharing\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.google.com/spreadsheets/d/1Sk_ovYC8tsEBpXns4Yt4ZzC77riF-P8H1D6KTtW0tSM/edit?usp=sharing</a></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/6641b52c65fec700459ad763/5487aa0a936bd7bd8454aaa6be1e06e4.png\" height=\"655\" width=\"974\"></p><p>根据十节课学完同学们能够掌握项目编程的基本前端技能为目标，我们可以倒推分解一下重点概念知识点的学习计划</p><p>11 个大知识模块</p><p>知识点已经精心筛选，精华重点</p><p>每一个概念都是必须到熟练运用的程度</p><p><a href=\"https://docs.google.com/spreadsheets/d/1jB3HThHu95NGC7YUCPkgzU5yUfKuU79S_wULg_AVeX4/edit?usp=sharing\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.google.com/spreadsheets/d/1jB3HThHu95NGC7YUCPkgzU5yUfKuU79S_wULg_AVeX4/edit?usp=sharing</a></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/6641b52c65fec700459ad763/20dd19a97d209ba4b88538a060be953e.png\" height=\"807\" width=\"1603\"></p><p>概念掌握程度自测Cheatsheet</p><p><a href=\"https://docs.google.com/spreadsheets/d/143KPucgIBlc6XILUqV77Im-I-IxccXqR7W3oOYqoyAA/edit?usp=sharing\" rel=\"noopener noreferrer\" target=\"_blank\">https://docs.google.com/spreadsheets/d/143KPucgIBlc6XILUqV77Im-I-IxccXqR7W3oOYqoyAA/edit?usp=sharing</a></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/6641b52c65fec700459ad763/f29e11d0b143b0f44d1f7c46634531bc.png\" height=\"541\" width=\"1446\"></p>",
          "_id": "69e329439f9cc30e74196d81"
        },
        {
          "code": "L22",
          "title": "ES6 Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业1</strong>. Let, Const 和 Var</p><p><strong>任务</strong>: 将以下代码重写为使用 let 和 const 代替 var。解释为什么在每种情况下 let 或 const 更合适。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/aad961274d2af066d5d9a9a389e7ee99.png\"></p><p><strong>作业2</strong>. 箭头函数 (Arrow Functions)</p><p><strong>任务</strong>: 将以下函数转换为箭头函数。然后解释箭头函数如何与常规函数不同地处理 this 关键字。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/ae8c82473e613e9b02e26748ab400d85.png\" height=\"134\" width=\"729\"></p><p><strong>作业3</strong>: 模板字面量 (Template Literals)</p><p><strong>任务</strong>: 使用模板字面量重写以下字符串拼接代码。在字符串中添加一个新行。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/b2497dc3997022b4848567e706738f09.png\" height=\"57\" width=\"769\"></p><p><strong>作业4</strong>.解构赋值 (Destructuring)</p><p><strong>任务</strong>: 使用解构赋值从 person 对象中提取 name 和 age 属性。然后编写一个函数，在参数列表中解构对象的属性。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/592150c13d124922e483fd8de02aa3ca.png\"></p><p><strong>作业5. </strong>默认参数（Default Parameters）</p><p><strong>任务</strong>：编写一个计算机行面积的函数。如果没有提供高度，假设它是一个正方形。使用默认参数为高度设置默认值。<img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/5e316117aafda1e7332a033196f5da30.png\" height=\"326\" width=\"1858\"></p><p><strong>作业6</strong>. Rest/Spread 运算符</p><p><strong>任务</strong>: 使用 Rest 运算符创建一个函数，能够将任意数量的参数相加。然后使用 Spread 运算符合并两个数组。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/59114f7c3eac62881de33210ca86b521.png\" height=\"224\" width=\"838\"></p><p><br></p><p><strong>作业提交：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的JavaScript 文件（如：Homework_ES6.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "6834079e705ef70538933658"
        },
        {
          "code": "L23",
          "title": "Tutorial 03 (JavaScript, Git)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>练习: Git Flow 实操</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Git Flow 背景介绍</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是 git flow ?</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么我们需要和原因 git flow ?</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大概概述它是如何工作的</li></ol><p><img src=\"https://image.jracademy.com.au/post/image/image_1752651482874_Git.png.image/png\"></p><p><br></p><p><strong>团队协作模拟</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git clone Repo</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学员分对，协作创建新的 feature 分支，模拟日常开发流程。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实践如何在 feature 分支上进行 add、commit 和 push 操作。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>正确 commit message</li></ol><p><strong>创建合并冲突</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学员故意制造分支间的冲突，以模拟实际工作中可能遇到的情况。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 Git 命令来处理和解决合并冲突。</li></ol><p><strong>合并到 dev 和 master</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习将 feature 分支合并到 dev 分支，再从 dev 分支合并到 master。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论何时应该合并到 master，以及合并请求 (MR/PR) 的最佳实践。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>正確 MR title and description</li></ol><p><br></p><p><strong>Thunk Base development 介绍</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是 git thunk base development?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>git flow vs git thunk base development?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大概概述它是如何工作的</li></ol><p><img src=\"https://image.jracademy.com.au/post/image/image_1752651555000_Git(2).png.image/png\"></p><p><br></p><h3>Assignment 答疑</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>JavaScript Assignment 答疑：</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>答疑学员提交的购物清单管理作业。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Git Introduction Assignment 答疑：</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析和点评学员提交的 Git 作业。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 Git 的基本操作，如 clone、commit、push 等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>强调好的提交习惯，例如提交信息的撰写(git convention commit)。</li></ol><p><strong>Git Q&amp;A</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>问答环节</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回答学员在实际操作中遇到的问题。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供解决实际问题的 Git 命令和策略。</li></ol>",
          "_id": "6834079e705ef70538933643"
        },
        {
          "code": "L24",
          "title": "ES6 进阶技巧与实践",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Promises &amp; Async/Await：轻松应对异步挑战！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Promises：利用then()精简代码、用catch()处理异常，以及finally()的应用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际场景中的 Promise 链式调用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>异步编程新姿势：使用async/await实现更简洁、易读的代码。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Destructuring（解构赋值）：一步到位，快速提取值！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从对象和数组中轻松提取信息，让数据处理变得更高效。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Spread &amp; Rest Operators（展开和剩余操作符）：更便捷地操作数据！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何利用...操作符展开数组和对象。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何收集函数参数。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Enhanced Object Literals（增强的对象字面量）：定义对象，更佳清晰！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简化属性和方法的定义。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态属性名。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Iterators &amp; Generators（迭代器和生成器）：掌控数据流！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是Iterators？如何自定义迭代。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创造自己的生成器函数，了解其强大之处。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>New Data Structures：Map &amp; Set — 探索新的数据结构！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Map和Set的应用，它们与传统对象和数组的差异。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>高效地存储唯一值。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Modules（模块化）：组织和重用代码的新方式！</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES6模块化的基本概念。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何import和export模块。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol><p>Symbols &amp; Well-Known Symbols</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Symbol 的高级应用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>内置 Symbols 的实用性</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>随堂练习</li></ol>",
          "_id": "69e329449f9cc30e74196d9e"
        },
        {
          "code": "L25",
          "title": "ES6 (Part2) & TypeScript Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Post-Lesson Exercise: Practicing Callbacks, Promises, and Async/Await</h3><p><strong>Objective:</strong> This exercise is designed to help students reinforce their understanding of asynchronous programming in JavaScript by practicing callbacks, promises, and async/await.</p><p><strong>Part 1: Callbacks</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a function fetchData that simulates fetching data from a server. This function should take two arguments: a url (string) and a callback function. Use setTimeout to simulate a delay of 2 seconds before calling the callback function with the fetched data.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The fetchData function should print \"Fetching data from [url]...\" when it starts.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>After 2 seconds, it should call the callback function with the data: \"Data from [url]\".</li></ol><p><strong>Part 2: Promises</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the fetchData function to return a promise instead of using a callback.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The function should still simulate a 2-second delay before resolving the promise with the data: \"Data from [url]\".</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>If the url is empty or not provided, reject the promise with an error message: \"Invalid URL\".</li></ol><p><strong>Part 3: Async/Await</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the code to use async/await to fetch data and handle errors.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create an async function named loadData that calls fetchData with a given url.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use try/catch to handle any errors that occur during the data fetching process.</li></ol><h3><strong>After-Class Homework: Learning the Basics of TypeScript</strong></h3><p><strong>Objective:</strong></p><p>This homework is designed to help students get started with TypeScript, a strongly typed superset of JavaScript. Students will learn about basic TypeScript concepts, including types, interfaces, classes, and functions.</p><p><strong>Part 1: Setting Up TypeScript</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Install TypeScript on your machine and set up a new TypeScript project.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use npm (Node Package Manager) to install TypeScript globally</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new project directory and initialize it with a tsconfig.json file</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new TypeScript file called index.ts in the project directory.</li></ol><p><strong>Part 2: Basic Type Annotations</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Write a function in index.ts that takes two numbers as parameters and returns their sum. Use TypeScript to annotate the types of the parameters and the return value.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define the function add with type annotations.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Compile the TypeScript file to JavaScript using the tsc command and run the resulting JavaScript file.</li></ol><p><strong>Part 3: Working with Interfaces</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define an interface Person with properties name (string) and age (number). Create a function greet that takes a Person object as a parameter and prints a greeting message.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define the Person interface and use it to type the parameter of the greet function.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a Person object and pass it to the greet function.</li></ol><p>&nbsp;</p><p><strong>作业提交：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的JavaScript 文件（如：Homework_ES6.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "68775ca664f9daa7d652f479"
        },
        {
          "code": "L26",
          "title": "Lab(5)：构建一个JavaScript天气应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>构建一个JavaScript天气应用</p>",
          "_id": "69e329449f9cc30e74196dad"
        },
        {
          "code": "L27",
          "title": "Lab(6)：使用Promise和ES6创建进度条",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用Promise和ES6创建进度条</p>",
          "_id": "69e329459f9cc30e74196db3"
        },
        {
          "code": "L28",
          "title": "Technical SEO 基础知识",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. SEO是什么，SEO是怎么工作的，影响SEO由哪四大要素影响</p><p>2. SEO用什么工具查看</p><p>3. Technical SEO具体如何进行有优化</p><p>4. 网页的结构应该如何进行优化</p><p>5. 面对SEO规则，HTML里如何进行优化，如何使用Canonical，301等</p><p>6. 怎样进行提升网站Performance，Page Speed如何提升</p>",
          "_id": "69e329459f9cc30e74196db9"
        },
        {
          "code": "L29",
          "title": "Project 1 介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2><strong>Project One: 商业级个人/公司Landing Page</strong></h2><h3><br></h3><h3><strong>﻿项目背景:</strong></h3><p>在实际工作中，很多时候我们需要与多方合作，包括客户、设计师、运营、产品经理等。理解并转化他们的需求是开发的关键。在这个项目中，你将扮演开发者的角色，与一个“甲方”合作（可以是你的朋友、律师、PT、会计、设计师、小咖啡店或公司等），理解并实现他们的网站需求。</p><h3><strong>1. 项目描述:</strong></h3><p>学员需要与“甲方”合作，创建一个网站，可以是个人展示网站、公司或产品的landing page、咖啡店的菜单页面等等。该网站应该清晰地传达“甲方”的主题和信息，并在设计上展现出专业感。</p><h3><strong>2. 基本要求:</strong></h3><p><strong>实战练习：</strong>课上由老师手把手带领同学实现一个landing page。</p><p><strong>课后练习：</strong></p><ul><li class=\"ql-indent-1\"><strong>需求沟通:</strong> 与“甲方”进行深入沟通，了解其具体需求、目标用户、核心内容等。</li><li class=\"ql-indent-1\"><strong>设计原则:</strong> 清晰、简洁且富有吸引力。</li><li class=\"ql-indent-1\"><strong>响应式设计:</strong> 网站需要在手机、平板和桌面设备上均有良好的显示效果。</li><li class=\"ql-indent-1\"><strong>HTML结构:</strong> 使用语义化的HTML标签，确保内容有条理。</li><li class=\"ql-indent-1\"><strong>CSS &amp; Sass样式:</strong> 充分利用CSS和Sass来美化网页，并使用flexbox或Bootstrap进行布局。</li><li class=\"ql-indent-1\"><strong>JavaScript &amp; jQuery:</strong> 根据需要，增加基本的交互功能，如滑动效果、导航条切换等。</li><li class=\"ql-indent-1\"><strong>页面内容:</strong> 至少包括：主页、关于我们/关于我、产品或服务展示、联系方式。</li></ul><h3><strong>3. 加分项:</strong></h3><ul><li><strong>动画效果:</strong> 使用CSS或JavaScript添加过渡或动画效果，增强用户体验。</li><li><strong>表单功能:</strong> 如联系表单或订阅表单，用于收集用户信息或反馈。</li><li><strong>原创性:</strong> 尽量减少模板的使用，展现自己的原创设计和创意。</li><li><strong>页面加载速度:</strong> 优化图片和代码，确保页面快速加载。</li></ul>",
          "_id": "69e329459f9cc30e74196dbf"
        },
        {
          "code": "L30",
          "title": "Project 1 Tutorial",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目启动</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 Landing Page 的重要性和应用场景。</li></ol><p><strong>布局与样式设计</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>逐步构建页面结构，使用语义化 HTML 标签。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用 CSS/Sass 技巧，打造视觉吸引力十足的界面。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论响应式设计的要点，确保页面在不同设备上均表现完美。</li></ol><p><strong>互动功能实现</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教你如何利用 JavaScript/jQuery 增加页面动态效果。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现用户交互功能，如滑动效果、导航条切换等。</li></ol><p><strong>细节打磨</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优化页面元素，提升用户体验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分享专业技巧，如加载速度优化、SEO 最佳实践等。</li></ol><p><strong>实现效果</strong></p><p>参考网站：<a href=\"https://elisc-react.vercel.app/index-one-page\" rel=\"noopener noreferrer\" target=\"_blank\">https://elisc-react.vercel.app/index-one-page</a></p><p><u>参考代码： https://github.com/jessieyu1/portfolio-landing-page</u></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c9/841979b9-6eb1-4a11-b755-a0a9d0ee1089.png\"></p>",
          "_id": "6834079e705ef7053893364a"
        },
        {
          "code": "L31",
          "title": "Node.js 如何安装",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>To install Node.js, you can follow these general steps. The exact process may vary slightly depending on your operating system:</p>\n<h3>Windows or macOS</h3>\n<ol>\n<li><strong>Download the Installer</strong>:</li>\n</ol>\n<ul>\n<li class=\"ql-indent-1\">Go to the <a href=\"https://nodejs.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js website</a>.</li>\n<li class=\"ql-indent-1\">Choose the version you need. The LTS (Long Term Support) version is recommended for most users, as it's more stable.</li>\n</ul>\n<ol>\n<li><strong>Run the Installer</strong>:</li>\n</ol>\n<ul>\n<li class=\"ql-indent-1\">After downloading, run the installer.</li>\n<li class=\"ql-indent-1\">Follow the installation prompts, including agreeing to the license agreement and choosing the installation location.</li>\n<li class=\"ql-indent-1\">The installer typically includes Node.js and npm (Node Package Manager).</li>\n</ul>\n<ol>\n<li><strong>Verify Installation</strong>:</li>\n</ol>\n<ul>\n<li class=\"ql-indent-1\">Open a command prompt (Windows) or terminal (macOS).</li>\n<li class=\"ql-indent-1\">Type <code>node -v</code> and press Enter. This should display the Node.js version, confirming it's installed.</li>\n<li class=\"ql-indent-1\">Type <code>npm -v</code> to check npm's version.</li>\n</ul>\n<h3>Linux</h3>\n<p>The process can vary based on the Linux distribution. Here are the steps for Ubuntu:</p>\n<ol>\n<li><strong>Update Package Index</strong>:</li>\n</ol>\n<pre class=\"ql-syntax\" spellcheck=\"false\">sudo apt update\n</pre>\n<ol>\n<li><strong>Install Node.js</strong>:</li>\n</ol>\n<ul>\n<li>You can install Node.js from the Ubuntu repository:</li>\n</ul>\n<pre class=\"ql-syntax ql-indent-1\" spellcheck=\"false\">sudo apt install nodejs\n</pre>\n<ul>\n<li>For the latest version, you might prefer using a PPA (Personal Package Archive):</li>\n</ul>\n<pre class=\"ql-syntax\" spellcheck=\"false\">curl -sL &lt;https://deb.nodesource.com/setup_16.x&gt; | sudo -E bash -\nsudo apt-get install -y nodejs\n</pre>\n<ol>\n<li><strong>Verify Installation</strong>:</li>\n</ol>\n<ul>\n<li>Check Node.js version:</li>\n</ul>\n<pre class=\"ql-syntax ql-indent-1\" spellcheck=\"false\">node -v\n</pre>\n<ul>\n<li>Check npm version:</li>\n</ul>\n<pre class=\"ql-syntax ql-indent-1\" spellcheck=\"false\">npm -v\n</pre>\n<p>Remember to replace <code>16.x</code> with the version you want if you're using the PPA method. For other Linux distributions, the process will be similar but might require different commands to update packages or add repositories.</p>",
          "_id": "69e329459f9cc30e74196dd3"
        },
        {
          "code": "L32",
          "title": "React 如何安装",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>React 安装、配置及创建项目教学文档</h3><h3>1. 环境要求</h3><p>首先，确保您的开发环境包括以下：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Node.js：React 需要 Node.js 环境。请访问 <a href=\"https://nodejs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">Node.js 官网</a> 下载并安装最新版本。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>npm（Node 包管理器）：通常会与 Node.js 一起安装。</li></ol><h3>2. 安装 Create React App</h3><p>Create React App 是一个官方支持的方式，用于创建单页 React 应用程序。它提供了一个现代化的构建设置，无需配置。</p><p>在终端或命令提示符中运行以下命令来安装 Create React App：</p><p>npx create-react-app my-app</p><p>这将在当前目录下创建一个名为 my-app 的新目录。</p><h3>3. 进入项目目录</h3><p>安装完成后，进入项目目录：</p><p>cd my-app</p><h3>4. 启动开发服务器</h3><p>在项目目录中，运行以下命令启动开发服务器：</p><p>npm start</p><p>此命令将启动一个本地服务器，并在默认浏览器中打开 http://localhost:3000。当您对代码进行更改时，页面将实时重新加载。</p><h3>5. 编辑 React 组件</h3><p>打开项目文件夹，您会看到一些预创建的文件。最重要的是 src/App.js，这是您的 React 应用程序的主要组件。</p><p>您可以开始编辑 src/App.js，并在浏览器中看到您的更改。例如，尝试更改文本并保存文件，您的更改将立即反映在浏览器中。</p><h3>6. 构建和部署</h3><p>当您准备好将应用程序部署到生产环境时，运行以下命令以构建应用程序：</p><p>npm run build</p><p>这将在 build 目录中创建一个优化的生产构建。</p><h3>7. 后续步骤</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习 React 基础：建议浏览 <a href=\"https://reactjs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">React 官方文档</a>，了解更多关于 React 的知识。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件编写：实践通过编写不同的组件来构建复杂的 UI。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>状态管理：学习使用 React 的状态管理，例如使用 Hooks。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路由：如果您的应用需要导航，尝试使用如 react-router-dom 等库。</li></ol>",
          "_id": "69e329629f9cc30e741974cb"
        },
        {
          "code": "L33",
          "title": "React项目快速上手",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>React 框架的起源与版本演进历程：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 框架的起源和发展历程，包括重要版本的发布和主要特性的改进。</li></ol><p>快速上手 React：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置开发环境：指导学生安装 Node.js 和 VS Code，以便开始 React 应用程序的开发。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>快速上手 create-react-app：介绍 create-react-app 工具，以及如何使用它来快速创建 React 项目的基本结构。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验 React 核心概念：通过编写简单的示例代码，让学生体验 JSX 语法以及 useState 和 useEffect 等 React 核心概念的使用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>拆分组件：引导学生学习如何将 React 应用程序拆分为可维护的组件，提高代码的复用性和可维护性。</li></ol>",
          "_id": "6834079e705ef7053893364d"
        },
        {
          "code": "L34",
          "title": "React组件基础",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>组件基础：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用 SASS 与 Bootstrap 构建组件的外观：介绍如何利用 SASS 预处理器和 Bootstrap 框架来快速构建组件的外观和样式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>强大的模板语法 JSX：深入了解 JSX 语法的特点和优势，以及如何在 React 组件中编写 JSX 代码。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props &amp; State：解释组件中的 props 和 state 的概念，以及它们分别用于什么目的。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props 与 State 的区别和联系：对比 props 和 state 的区别，以及它们之间的联系和作用范围。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件间通讯：讨论不同组件之间如何进行通讯，包括父子组件通讯和兄弟组件通讯等方式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>综合实例：构建一个结构复杂的页面，通过实际例子来理解 React 切分组件的思想，以及如何合理组织组件结构和通讯。</li></ol>",
          "_id": "6834079e705ef7053893364e"
        },
        {
          "code": "L35",
          "title": "React Router",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>快速上手 React Router:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索 React Router，这个强大的库可让你构建单页应用程序的导航系统，快速开始你的路程。</li></ol><p>嵌套路由:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解嵌套路由，通过分层结构创建复杂的页面布局和导航。</li></ol><p>HashRouter 与 BrowserRouter:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比 HashRouter 和 BrowserRouter，了解它们之间的区别，以及何时使用哪一个来管理 URL。</li></ol><p>React Router 运行机制:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 React Router 的内部机制，从路由匹配到组件渲染，掌握它如何使一切无缝运转。</li></ol>",
          "_id": "6834079e705ef7053893364f"
        },
        {
          "code": "L36",
          "title": "React表单处理",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>非受控表单:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解非受控表单，它们是表单元素的一种处理方式，适用于简单的表单，但缺乏状态控制和验证。</li></ol><p>受控表单:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索受控表单，这种表单通过React组件状态来控制表单元素的值和行为，使数据流更可控。</li></ol><p>表单校验 (Form Validation):</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会如何对表单进行校验，确保用户输入的数据满足特定的要求，提高数据的有效性和安全性。</li></ol>",
          "_id": "6834079e705ef70538933650"
        },
        {
          "code": "L37",
          "title": "React服务端交互",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>典型交互方式：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨与服务器通信的经典方式，包括 Ajax、Fetch 和 Axios，并介绍它们各自的用途和优势。</li></ol><p>快速上手 Axios：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何迅速上手 Axios，了解其基本用法和常见配置，以及如何发起 HTTP 请求并处理响应。</li></ol><p>拦截器处理通用操作：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解如何使用 Axios 拦截器来处理通用的操作，如请求和响应的日志记录、身份验证、错误处理等。</li></ol><p>封装可复用的 Axios 服务：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会将 Axios 封装为可复用的服务，以便在整个应用程序中共享和维护一致的 HTTP 请求配置，提高代码的可维护性和可扩展性。</li></ol><p>React 组件的生命周期：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 React 组件的生命周期方法，包括挂载、更新和卸载阶段，并学会如何在组件的生命周期中处理各种操作。</li></ol><p>VDOM：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍虚拟 DOM（VDOM）的概念，以及其在 React 中的作用和优势，理解 VDOM 的工作原理。</li></ol><p>类组件与函数式组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比类组件和函数式组件的特点和用法，并解释为什么函数式组件越来越受欢迎。</li></ol><p>复合组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用复合组件将多个组件组合在一起，以构建更复杂和灵活的 UI。</li></ol><p>高阶组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍高阶组件的概念和用法，以及如何使用高阶组件来增强组件的功能和复用性。</li></ol><p>开源组件库与企业业务组件库：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨开源组件库的特点和优势，以及如何选择和使用适合项目需求的组件库；同时，讨论企业业务组件库的重要性和设计原则。</li></ol><p>动态生成页面与 React 低代码：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍动态生成页面的概念和 React 低代码的特点，了解如何利用 React 技术栈实现动态页面和低代码开发。</li></ol>",
          "_id": "6834079e705ef70538933651"
        },
        {
          "code": "L38",
          "title": "React Hooks",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>React Hooks：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 内置的 Hooks，如 useState 和 useEffect，并解释它们的作用和用法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 useState Hook，包括如何在函数组件中管理状态并进行状态更新。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 useEffect Hook，包括如何处理副作用、订阅和取消订阅等操作。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何自定义 Hooks，以便在应用程序中共享和重用状态逻辑。</li></ol><p>用 useTranslation 钩子实现组件的 i18n：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨如何使用第三方库中提供的 useTranslation 钩子来实现组件的国际化（i18n），以支持多语言应用程序的开发。</li></ol><p>状态管理：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解状态管理的基本概念，包括状态、单一数据源、不可变性等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 内置的 Context API，以及如何使用 Context 在组件之间共享状态。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍 React Redux，作为一种常用的状态管理中间件，以及其与 Context 的区别和优势。</li></ol><p>自动化测试：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何进行单元测试，包括安装配置 Jest 测试框架和详解 Jasmine 语法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何进行集成测试，包括安装配置 Cypress 测试框架和运行集成测试用例。</li></ol>",
          "_id": "6834079e705ef70538933652"
        },
        {
          "code": "L39",
          "title": "React基础(1) - 代码质量",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码规范的重要性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>课堂实践：写出可读性高的代码 - Income Tax Calculator</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写出符合人类思维方式的代码</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码质量的核心概念：可读性、可维护性、可扩展性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>SOLID 原则</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：写出一个高质量的 getFlightsStops 函数</li></ol>",
          "_id": "6834079e705ef70538933653"
        },
        {
          "code": "L40",
          "title": "Tutorial 04 (ES6)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>练习</h3><p><strong>使用 <a href=\"https://api-ninjas.com/api/randomuser\" rel=\"noopener noreferrer\" target=\"_blank\">https://api-ninjas.com/api/randomuser</a> API 创建、更新、删除和查看数据</strong></p><h3>1. <strong>从 API 获取数据·</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用Fetch获取远程API数据。</li></ol><h3>2. <strong>学习如何将结果保存到变量中</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个回调（Callback）函数。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建变量并进行赋值。</li></ol><h3>3. <strong>显示结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>获取变量。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 map 函数显示结果。</li></ol><h3>4. <strong>修改结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用扩展运算符（spread operator）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释还有哪些其他方法可以做到这一点，以及为什么应该避免使用它们。</li></ol><h3>5. <strong>删除结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 filter 函数。</li></ol><h3>6. <strong>添加结果</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个输入框。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何从输入框获取值。</li></ol><h3>7. <strong>创建一个搜索框（SearchBox）</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生学习如何从输入框获取值。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生应该能够使用 filter 函数过滤结果。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学生应该能够将值重新赋给变量，以便正确显示。</li></ol><h3>8. <strong>添加排序功能</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教授并添加排序功能。</li></ol><h3>9. <strong>总结</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾今天学到的内容，例如：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>var/let/const 的使用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES6 函数：.map、filter 等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>异步等待（async await）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>扩展运算符（spread operators）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>fetch 的使用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回调函数（Callback）。</li></ol><p><strong>JS Q&amp;A</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>问答环节</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回答学员在实际操作中遇到的问题。</li></ol>",
          "_id": "6834079e705ef70538933654"
        },
        {
          "code": "L41",
          "title": "React基础(2) - 为什么需要 React",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>传统开发 vs 组件化开发</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 的核心概念（声明式 UI、组件化、单向数据流）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用 JS 操作 DOM vs 用 React 渲染 UI（对比体验）</li></ol>",
          "_id": "6834079e705ef70538933655"
        },
        {
          "code": "L42",
          "title": "开发环境与工具",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是打包工具？(Webpack)</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Babel 介绍：JSX 如何转换成 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是脚手架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目（Vite）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：用 Vite 启动一个 React 应用环境</li></ol>",
          "_id": "6834079e705ef70538933657"
        },
        {
          "code": "L43",
          "title": "Lab(7)：使用React和Hooks创建分页应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React和Hooks创建分页应用</p>",
          "_id": "69e329489f9cc30e74196eb8"
        },
        {
          "code": "L44",
          "title": "Tutorial 05 (React) ",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>React常见的问题和错误：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍React和过去前端开发方式的不同，让同学们体会</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React的单向数据流，提供一些flow chart供同学们参考和理解，并加深课堂知识理解</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>setState的异步性质，讲解并演示其中的重要步骤，加深课堂知识理解</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>条件渲染可能出现的问题，good practices和bad practices</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Q&amp;A答疑</li></ol>",
          "_id": "6834079e705ef70538933659"
        },
        {
          "code": "L45",
          "title": "React基础(3) - 开发环境与工具",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是打包工具？(Webpack)</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Babel 介绍：JSX 如何转换成 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是脚手架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目（Vite）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：用 Vite 启动一个 React 应用环境</li></ol>",
          "_id": "6834079e705ef7053893365b"
        },
        {
          "code": "L46",
          "title": "React基础(4) - 组件 & JSX 语法",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>JSX 语法规则</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在 JSX 里写 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件的 Props（属性传递）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：编写一个简单的 Button 组件，支持不同文本</li></ol>",
          "_id": "6834079e705ef7053893365c"
        },
        {
          "code": "L47",
          "title": "Lab(8)：使用React和localStorage构建笔记卡片应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React和localStorage构建笔记卡片应用</p>",
          "_id": "69e329499f9cc30e74196ee8"
        },
        {
          "code": "L48",
          "title": "Lab(9)：使用React构建收支管理应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React构建收支管理应用</p>",
          "_id": "69e3294a9f9cc30e74196eef"
        },
        {
          "code": "L49",
          "title": "Tutorial 08 (React)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>练习</h3><p><strong>继续升级Tutorial 04的练习，通过react改写并添加额外的功能</strong></p><p><strong>利用React，使用 <a href=\"https://api-ninjas.com/api/randomuser\" rel=\"noopener noreferrer\" target=\"_blank\">https://api-ninjas.com/api/randomuser</a> API 创建、更新、删除和查看数据</strong></p><h3>1. 新建React项目</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用vite创建react项目</li></ol><h3>2. <strong>创建一个搜索框（SearchBox）</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解并演示创建搜索框并使用Material UI</li></ol><h3>3. <strong>创建表单验证</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解并演示添加表单验证以添加新结果。</li></ol><h3>4. 使用Axios获取数据</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>安装Axios，使用axios获取远程数据</li></ol><h3>5. <strong>加载动画</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教学生如何使用 Chrome 减慢网络速度。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教学生如何创建加载动画。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释为什么能够同时获取数据和显示加载动画（async/await）。</li></ol><h3>6. <strong>错误处理</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教学生如何使用 Chrome 模拟网络故障。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 axios 中添加 try-catch 以进行错误处理。</li></ol><h3>7. <strong>总结</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾今天学到的内容，例如：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建react项目。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用UI组件库，比如Material UI。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何加载动画提升用户体验。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何处理错误。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>axios的使用。</li></ol><p><strong>React Q&amp;A</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>公开讨论</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>导师将解决学生对 React 的任何问题，从基本概念到更高级的主题。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>鼓励学生提出与他们刚刚做的练习相关的问题是有益的。</li></ol>",
          "_id": "69e329659f9cc30e74197606"
        },
        {
          "code": "L50",
          "title": "Project 2 介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>项目背景：</strong></h3><p>这个项目的灵感来源于MongoDB的面试题。在现代互联网应用中，与远程API的交互成为了一个关键技能。为了提高你的API交互技巧，我们为你设计了这个挑战：创建一个天气预报应用。</p><p><strong>原始 MongoDB 面试项目题</strong></p><p>The coding exercise we’d like to work on is building an app where you can input a city name to show the current weather in that city area and the forecast for the upcoming 3 days. You may use <a href=\"http://www.weatherapi.com/\" rel=\"noopener noreferrer\" target=\"_blank\">www.weatherapi.com</a>, which provides a free API to query weather data. It does require signing up to generate an API key but there is an - <a href=\"https://www.weatherapi.com/api-explorer.aspx\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.weatherapi.com/api-explorer.aspx</a> - that makes it easy to check the response.</p><p>You are free to use any frontend libraries to build this web application. Once you have built the application please send the code back to us in a .zip file (without any modules that can be fetched from the internet) so that we can clone the repository and check its functionality locally on our machine. Please provide some instructions on how to run it locally in the readme. Feel free to comment on the readme any design decisions or assumptions that were made while you built this application.</p><p>We will spend some time discussing your solution during the programming interview. Please treat this task like a feature you would build as an engineer using developer best practices and deploy in a production ready state.</p><p>Please ensure add some unit test &amp; e2e test if possible.</p><h3><br></h3><h3><strong>项目要求：</strong></h3><p><strong>核心功能</strong>：</p><ul><li class=\"ql-indent-1\">允许用户输入城市名称。</li><li class=\"ql-indent-1\">显示该城市当前的天气情况。</li><li class=\"ql-indent-1\">提供未来三天的天气预报。</li></ul><p><strong>数据来源</strong>：请使用<a href=\"http://www.weatherapi.com/\" rel=\"noopener noreferrer\" target=\"_blank\">www.weatherapi.com</a>。它提供了一个免费的API来查询天气数据。需要https://www.weatherapi.com/api-explorer.aspx 可以轻松检查响应。</p><p><strong>技术栈选择</strong>：你可以自由选择任何前端库来构建此网络应用。</p><p><strong>项目提交</strong>：</p><ul><li class=\"ql-indent-1\">请将代码上传到github中（不包括可以从互联网获取的模块）并提交，这样我们可以Clone repo并在我们的机器上本地检查其功能。</li><li class=\"ql-indent-1\">在readme中提供关于如何在本地运行的说明。</li><li class=\"ql-indent-1\">在readme中，你可以评论在构建此应用程序时做出的任何设计决策或假设。</li></ul><p><strong>代码质量</strong>：我们希望你像处理真正的工程任务那样对待这个任务，使用开发者的最佳实践，并确保它处于生产就绪状态。</p><p><strong>测试</strong>：请确保添加一些单元测试和e2e测试（如果可能的话）。</p><h3><br></h3><h3><strong>项目目标：</strong></h3><ul><li>提高与API的交互能力。</li><li>熟悉前端框架和库的使用。</li><li>加强代码组织和架构设计技能。</li><li>提高测试驱动开发的能力</li></ul>",
          "_id": "6834079e705ef70538933660"
        },
        {
          "code": "L51",
          "title": "Project 2 Tutorial 01",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>介绍</strong></p><p>在这部分，我们将概述整个项目的框架。你们将了解到，我们为什么选择天气预报应用作为学习项目，以及它如何帮助你们在现实世界中应用编程技能。这将是一次从零开始构建一个完整网络应用的旅程。</p><p><strong>天气应用项目的要求</strong></p><p>我们将详细讨论项目的具体要求，包括用户能够输入城市名称、查看当前天气状况以及获取未来三天的天气预报等功能。这将帮助你们理解项目的核心目标和功能。</p><p><strong>完成项目的目标</strong></p><p>这个环节会让你们明白，完成这个项目不仅仅是为了制作一个应用，而是为了提升你们的技术能力，如 API 交互、前端框架的应用、代码组织和架构设计技能，以及测试驱动开发的实践。</p><p><strong>项目的设计图介绍与分析</strong></p><p>我们将一起审视项目的设计图，分析应用的用户界面和用户体验方面。这将帮助你们理解如何从用户的角度来思考，并将这种思维转化为实际的代码和设计实现。</p><p><strong>完成这个项目需要的技术栈</strong></p><p>在这个环节，我们将讨论构建该应用所需的技术栈，包括前端框架、API 请求处理、状态管理等。无论你们是刚接触前端开发，还是希望巩固已有知识，这都将是一个极好的学习机会。</p><p><strong>React 项目框架搭建</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>环境设置</strong>：通过配置开发环境来搭建 React 项目，包括安装必要的依赖和工具。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目结构</strong>：创建项目的基础结构，包括设置路由、状态管理等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>基础代码编写</strong>：编写一些基础代码，确保项目能够顺利运行。</li></ol><p><strong>组件命名</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>命名规则</strong>：明确组件命名的最佳实践，这有助于提高代码的可读性和可维护性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实际操作</strong>：我们将实际命名一些将在项目中使用的组件，并解释这些命名背后的逻辑。</li></ol>",
          "_id": "6834079e705ef70538933661"
        },
        {
          "code": "L52",
          "title": "利用AWS部署前端spa项目",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>利用AWS部署前端spa项目</p>",
          "_id": "6834079e705ef70538933656"
        },
        {
          "code": "L53",
          "title": "Tutorial 06 (C#开发环境设置)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C#开发环境设置</p><p>文档：</p><p>https://www.notion.so/208681d7ed828091b950eb36209ebc82</p>",
          "_id": "69e329669f9cc30e7419762c"
        },
        {
          "code": "L54",
          "title": "Project 2 Tutorial 02",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>布局设计</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>用户界面规划</strong>：首先，我们将对天气应用的用户界面进行详细规划。这包括定义主要视图（如主页、详细天气页）及其组件（如天气摘要、预报列表、搜索栏）。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>信息架构</strong>：深入探讨如何组织信息，使用户能够轻松理解和访问天气数据。这涉及到决定哪些信息是首要显示的，以及如何逻辑地组织次要信息。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>交互设计</strong>：考虑用户与应用交互的方式，如搜索城市、切换温度单位等。这将影响布局的设计和组件的放置。</li></ol><p><strong>静态页面实现</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>HTML结构</strong>：创建HTML文档结构，构建应用的骨架。这包括定义必要的HTML元素，如头部、导航栏、内容区域和底部。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>组件化开发</strong>：将界面分解为可重用的组件，这有助于提高代码的可维护性和可扩展性。例如，将天气卡片、搜索栏等元素作为独立组件。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>布局技术</strong>：创建响应式布局，确保内容在不同屏幕大小下都能有效地展示。</li></ol><p><strong>样式和响应式</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>样式定义</strong>：利用CSS或CSS预处理器来定义样式。这包括设置颜色主题、字体、边距、间隔等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>视觉吸引力</strong>：强调视觉吸引力和品牌一致性，确保应用的外观既美观又专业。包括颜色搭配、字体选择、图标使用等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>响应式设计</strong>：实现响应式设计，确保应用在不同设备上都能提供良好的用户体验。这可能涉及到使用媒体查询、弹性布局等技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>交互动效</strong>：考虑添加一些CSS动画和过渡效果来提升用户体验，如加载动画、按钮悬停效果等。</li></ol>",
          "_id": "6834079e705ef70538933667"
        },
        {
          "code": "L55",
          "title": ".NET(1):C#编程语言基础",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C#编程语言基础</p>",
          "_id": "69e3294b9f9cc30e74196f2d"
        },
        {
          "code": "L56",
          "title": ".NET(1): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><p>1&gt;变量练习：</p><p>定义四个变量,分别存储一个人的姓名、性别(Gender)、年龄、电话 TelephoneNumber)。然后打印在屏幕上 (我叫X,我今年 X岁了,我是X生, 我的电话是XX)(电话号用什么类型,如:010-12345)</p><p>2&gt;算数运算符练习： 某商店T恤(T-shirt)的价格为35元/件, 裤子(trousers)的价格为120元/条.小明在该店买了3件T恤和2条裤子, 请计算并显示小明应该付多少钱?</p><p>3&gt;占位符练习： 编程实现计算几天(如46天)是几周零几 天. 6周零4天</p><p>4&gt;$练习： 编程实现107653秒是几天几小时几分钟几秒?</p><p>5&gt;if 语句练习： 提示用户输入用户名，然后再提示输入密码，如果用户名是“admin”并且密码是“88888”， 则提示正确，否则，如果用户名不是admin还提示用户用户名不存在, 如果用户名是admin则提示密码错误.</p><p>6&gt;switch case 练习： 李四的年终工作评定,如果定为A级,则工资涨500元,如果定为B级, 则工资涨200元,如果定为C级,工资不变,如果定为D级工资降200元, 如果定为E级工资降500元. 设李四的原工资为5000,请用户输入李四的评级,然后显示李四来年的工资</p><p>7&gt;请用户输年份,再输入月份,输出该月的天数，判断输入的是不是闰年</p><p>8&gt;while 练习： 老师问学生,这道题你会做了吗?如果学生答\"会了(y)\", 如果学生不会做(n),则老师再讲一遍,再问学生是否会做了...... 直到学生会为止,才可以放学. 直到学生会或老师给他讲了10遍还不会,都要放学</p><p>9&gt; do-while 练习： 不断要求用户输入学生姓名,输入q结束.</p><p>10&gt;for 循环练习： 找出100-999间的水仙花数? 水仙花数指的就是 这个百位数字的 百位的立方+十位的立方+个位的立方==当前这个百位数字</p><p>11&gt;循环嵌套练习：打印乘法口诀表</p><p>12&gt; 循环嵌套练习(必会的简单算法）： int[] nums = { 1, 4, 3, 9, 6, 8, 11 }; 对这个数组元素做升序排序</p><p>13&gt;方法练习： 计算两个整数之间的最大值并且将最大值返回</p><p>14&gt;.数组和方法的练习： 计算一个整数类型数组的总和</p><p>15&gt;.方法out 练习： //分别的提示用户输入用户名和密码 你写一个方法来判断用户输入的是否正确 返回给用户一个登陆结果，并且还要单独的返回给用户一个登陆信息 如果用户名错误，除了返回登陆结果之外，还要返回一个 \"用户名错误\"</p><p>16&gt;.ref 练习： 使用方法来交换两个int类型的变量</p><p><br></p><h2>Advanced Assignment：</h2><p>开发一个简单的控制台小游戏。这个游戏有以下几部分：</p><p><strong>需求说明：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>游戏头：首先绘制游戏的标题和说明。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化地图：加载地图资源，将整数数组中的数字转换为控制台显示的特殊字符串，这个过程就是初始化地图。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>绘制地图：显示初始化后的地图，并在控制台中展示玩家的位置和特殊事件。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>游戏逻辑：定义游戏的规则，处理玩家的移动和触发的事件。</li></ol><p><strong>游戏规则：</strong></p><p>• 踩到玩家B：玩家A踩到玩家B时，玩家B退6格。</p><p>• 踩到地雷：玩家踩到地雷，退6格。</p><p>• 踩到时空隧道：玩家踩到时空隧道，前进10格。</p><p>• 踩到幸运轮盘：幸运轮盘有两种可能：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>交换位置。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>轰炸对方，使对方退6格。</li></ol><p>• 踩到暂停：暂停一回合。</p><p>• 踩到方块：什么都不做。</p><p><strong>实现步骤：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义地图中的元素：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>玩家 A 和 B。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>特殊事件：地雷、时空隧道、幸运轮盘、暂停、普通方块。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>控制台特殊符号显示：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>玩家A：A</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>玩家B：B</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>地雷：X</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>时空隧道：O</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>幸运轮盘：L</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>暂停：P</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>普通方块：[]</li></ol>",
          "_id": "69e3294b9f9cc30e74196f34"
        },
        {
          "code": "L57",
          "title": "Project 2 Tutorial 03",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>功能实现</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>交互实现</strong>：为页面添加交互功能，包括处理用户输入、显示数据、以及响应用户操作等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>状态管理</strong>：管理组件状态，如表单输入验证、条件渲染等。</li></ol><p><strong>连接 API</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>API 集成</strong>：我们将学习如何使用 HTTP 客户端（如 axios 或 fetch）连接到 Weather API，获取所需的天气数据。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>数据处理</strong>：处理 API 响应，包括解析数据、错误处理以及状态更新。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>动态显示数据</strong>：将从 API 获取的数据动态展示在用户界面上。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>调试与测试</strong>：编写测试来验证 API 集成的功能。</li></ol>",
          "_id": "6834079e705ef7053893366d"
        },
        {
          "code": "L58",
          "title": ".NET(2): Basic OOP Fundamental",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>面向对象编程（OOP）四大基本原则</strong>：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>抽象（Abstraction）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>封装（Encapsulation）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>继承（Inheritance）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多态（Polymorphism）</li></ol><p><strong>类和对象</strong>：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过实践创建类（class）来深入理解</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>构造函数（Constructor）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>访问控制：public / protected / private</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Partial 类 / Static 静态类 / Seal 类</li></ol><p><strong>通过 C# 代码详细介绍 OOP 四大原则</strong>：</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>封装（Encapsulation）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码演示和解释封装的实现方法</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>继承（Inheritance）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释继承的作用：代码重用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示基类（base class）与派生类（derived class）的关系</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>抽象（Abstract）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义抽象：隐藏细节，提炼出定义</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>抽象的好处：可扩展性、易于测试、解耦、防止误修改</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 C# 中实现抽象的方式：接口（interface）和抽象类（abstract class）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>多态（Polymorphism）</strong>：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>浅显易懂地解释多态：初次接触，晦涩难懂的概念简化</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多态的分类：静态多态（编译时）和动态多态（运行时）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>C# 代码实践：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过方法重载（overload）实现静态多态</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过方法重写（override）实现动态多态</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过 override 实现的动态多态，无需修改原有代码即可扩展功能</li></ol>",
          "_id": "69e3294b9f9cc30e74196f46"
        },
        {
          "code": "L59",
          "title": ".NET(2): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2>Assignment</h2><p>创建一个console app，设计几个类，除了下面的属性或者字段，可以添加其他信息</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类及其成员的定义 定义一个 基类 Course class，包含 ID 课程名 分数 学生ID数组（因为有可能多个学生选同样的课）课时数（属性或者字段，推荐属性）</li></ol><p>Student class，包含 ID 姓名 年龄 课程数组（因为一个学生可以选择多个课程 这里的课程可以是课程的ID或者是课程的Object）</p><p>Teacher class，包含 ID 姓名 所授课程数组（考虑到一个老师肯能教授多个课 这里的课程可以是课程的ID或者是课程的Object）</p><p><br></p><p>2. 继承 定义继承于 Course class的子类 - C# 课程，HTML课程，React课程</p><p>3. 使用上面定义的类，学习如何应用类和继承</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.1 初始化对象 - 课程对象数组（3门课程），Teachers数组（3个 Teachers对应三个不同的课程），学生对象数组（若干 例如10 个学生 对象）（使用new 调用构造函数来创建对象）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.2 将老师-学生-课程 关联起来（例如 A老师教授 C#课程，有3个同学报名学习，B老师教授 HTML课程，有2个同学报名学习 ......）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.3 在Teacher class 中定义一个方法 打印出 该老师 所授课 以及报名学生的信息</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>3.4 在Course class中定义一个方法 打印出 该课程成绩 Top3 的学生的信息</li></ol>",
          "_id": "69e3294c9f9cc30e74196f4d"
        },
        {
          "code": "L60",
          "title": "Tutorial 07 (.NET)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C#编程语言基础</p>",
          "_id": "69e329679f9cc30e74197685"
        },
        {
          "code": "L61",
          "title": "Tutorial 11（Web API环境配置）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Web API环境配置</p>",
          "_id": "69e329689f9cc30e74197690"
        },
        {
          "code": "L62",
          "title": ".NET(3): 高级面向对象",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>高级面向对象</p>",
          "_id": "69e3294c9f9cc30e74196f61"
        },
        {
          "code": "L63",
          "title": ".NET(3): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>本次作业在第一节面向对象的作业基础上</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习多态 - 方法重载overload 和重写override</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>选择接口和抽象类</li></ol><p><br></p><p>1. 自行选择一个类 在其中创建 至少两个重载方法并调用 目的是理解 什么是编译时多态(静态多态)</p><p>2. 创建一个base class - Faculty, 并在其中定义</p><p>2.1 Properties – (please consider whether need abstract)</p><p>Activities (教学目标, 可以是string[], List&lt;string&gt;, 或者自定义一个Activity Class)</p><p>Lectures (教学资料/讲义, 定义类型同上)</p><p>2.2 abstract methods - PlanLearningActivities</p><p>- PreparationLectures</p><p>2.3 virtual methods （with default implementation）</p><p>- DefineLearningObjectives() //自己决定需不需要参数并定义参数的类型和数量</p><p>2.4 定义继承于 Faculty 的类, 并实现上述的abstract/virtual methods</p><p>Professor</p><p>Tutor</p><p>Instructor</p><p>3. 定义一个Interface – IRefer with a method ReferTheJob. 只有Professor有refer job的功能. 请在Professor中实现该接口, 具体要求是 仅给 Grade A 的同学refer job.</p><p>定义一个Interface – IAssess with method AssessStudentGrade. 只有Tutor有给学生打分评级的功能</p><p>定义另一个Interface – INotify with a method Notification. 只有Instructor有notify的职责来通知student上课。</p><p>4. 请创建一个Professor object, 一个Tutor object, 一个Instructor, 打印出各自的</p><p>Learning Activities</p><p>Prepared Lectures</p><p><br></p><p>请创建10个学生，仅仅需要一个C# Course，不需要多个Course</p><p>实现</p><p>Instructor通知学生上课</p><p>Tutor给学生打分评级</p><p>Professor推荐Grade A同学job. （可以通过Console.WriteLine()输出模拟）</p>",
          "_id": "69e3294c9f9cc30e74196f68"
        },
        {
          "code": "L64",
          "title": ".NET(4): C# 常用集合类型详解",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C# 常用集合类型详解</p>",
          "_id": "69e3294c9f9cc30e74196f6f"
        },
        {
          "code": "L65",
          "title": ".NET(4): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Please create a collection of students with the courses - C#, HTML and React, please set the scores of the courses</strong></p><p><br></p><p>1. Please select the proper collection type to print out the unique scores for each course, no duplicated scores printed out</p><p>e.g. C# course, scores are 70, 80, 90, 95, 96, 99.</p><p>HTML course, scores are 75, 81, 94, 96, 98, 99.</p><p>React course, scores are 85, 88, 64, 76, 99, 100.</p><p><br></p><p>2. Please select one collection type from HashTable/Dictionary/SortedList to store the scores for each course of each student and print them out:</p><p>Note: Please use the \"student Name + course Name\" as the key, and score as the value, e.g.</p><p><br></p><p>Key: James Hush C#</p><p>Value: 80</p><p><br></p><p>One edge case: Please test the edge case - two students with same Name, for same course, is it possible to store both of them in the selected collection (HashTable/Dictionary/SortedList)?</p><p><br></p><p>3. Please use Lookup to represents a collection of keys each mapped to one or more values.</p><p>Need store the course score and student names, then print out:</p><p>e.g. for C# course, please use the score as the key, student name as the values, Print the student course scores in grouping format</p><p><br></p><p>Key: 80</p><p>Value: James Hush, Luck Linton, Jack Matt, ......</p><p>Print output:</p><p>80: James Hush, Luck Linton, Jack Matt, ......</p><p><br></p><p>Key: 90</p><p>Value: Mike Lu, Jimmy Hugh, Penny A, ......</p><p>Print output:</p><p>90: Mike Lu, Jimmy Hugh, Penny A, ......</p><p><br></p><p>4. Implement Undo and Redo features</p><p>Given an array of strings Q[], consisting of queries of the following types:</p><p><br></p><p>“WRITE X”: Write a character X into the array.</p><p>“UNDO”: Erases the last change made to the array.</p><p>“REDO”: Restores the most recent UNDO operation performed on the array.</p><p>“READ”: Reads and prints the contents of the array.</p><p><br></p><p>Examples:</p><p>Input: Q = {“WRITE A”, “WRITE B”, “WRITE C”, “UNDO”, “READ”, “REDO”, “READ”}</p><p>Output: AB ABC</p><p>Explanation:</p><p>Perform “WRITE A” on the document. Therefore, the document contains only “A”.</p><p>Perform “WRITE B” on the document. Therefore, the document contains “AB”.</p><p>Perform “WRITE C” on the document. Therefore, the document contains “ABC”.</p><p>Perform “UNDO” on the document. Therefore, the document contains “AB”.</p><p>Perform \"READ” to Print the contents of the document, i.e. “AB”</p><p>Perform “REDO” on the document. Therefore, the document contains “ABC”.</p><p>Perform \"READ” to Print the contents of the document, i.e. “ABC”</p><p><br></p><p>Input: Q = {“WRITE x”, “WRITE y”, “UNDO”, “WRITE z”, “READ”, “REDO”, “READ”}</p><p>Output:xz xzy</p><p><br></p><p>Approach: The problem can be solved using Stack. Follow the steps below to solve the problem:</p><p><br></p><p>Initialize two stacks, say Undo and Redo.</p><p>Traverse the array of strings, Q, and perform the following operations:</p><p>If “WRITE” string is encountered, push the character to Undo stack</p><p>If “UNDO” string is encountered, pop the top element from Undo stack and push it to Redo stack.</p><p>If “REDO” string is encountered, pop the top element of Redo stack and push it into the Undo stack.</p><p>If “READ” string is encountered, print all the elements of the Undo stack in reverse order.</p><p><br></p><p>Define below string array, after invoking the method, print out the correct result:</p><p>string[] Q = { \"WRITE A\", \"WRITE B\", \"WRITE C\", \"UNDO\", \"READ\", \"REDO\", \"READ\" };</p><h3><strong>QUERY(Q);</strong></h3>",
          "_id": "69e3294d9f9cc30e74196f76"
        },
        {
          "code": "L66",
          "title": "Tutorial 09（.NET）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(2) 作业讲评&amp;答疑</p><p>.NET(3) 作业讲评&amp;答疑</p>",
          "_id": "69e329699f9cc30e741976c5"
        },
        {
          "code": "L67",
          "title": ".NET(5): 构建WEB API项目以及相关技术-概念介绍，管道，中间件，MVC",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">概念API 与 Web API </strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">什么是 API？ API 有什么作用？</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 是什么？</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">HTTP 请求类型 &amp;状态码</span></li></ol><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">.Net 项目中的Web API</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">怎么创建Web API 在Visual Studio</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 项目结构</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">builder.Services--依赖注入容器</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">管道 中间件</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">MVC 架构模式，模型&amp;控制器</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Controller（控制器） 和 Action（动作方法）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 最常用返回类型--JsonResult </span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">路由(Routing) &amp; 属性路由（Attribute Routing）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">路由传值</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Postman 测试api</span></li></ol>",
          "_id": "69e329699f9cc30e741976cd"
        },
        {
          "code": "L68",
          "title": ".NET(5): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业要求：</strong></p><p>使用 Web API 和 REST API 实现增删改查操作，支持多种传参方式，并使用模型类和模型验证。所有 API 都需要在 Postman 中测试通过，返回类型为 JsonResult。</p><p><br></p><p><strong>基本要求：</strong></p><p><strong>1.UserController：</strong></p><p>○ 使用 普通 Web API 实现用户的增删改查操作，支持以下三种传参方式：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路径参数（Route Parameters）：通过 URL 路径传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>查询字符串参数（Query String Parameters）：通过 ? 后的查询字符串传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>请求体参数（Request Body Parameters）：通过 POST、PUT 请求的请求体传递复杂的对象。 ○ 要求在 POST 和 PUT 请求中尝试使用 [FromBody] 和 [FromForm] 两种不同方式传递数据。 ○ 所有 API 返回类型为 JsonResult。</li></ol><p><br></p><p><strong>2. TeacherController：</strong></p><p>○ 使用 RESTful API 实现教师的增删改查操作，支持同样的三种传参方式：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路径参数（Route Parameters）：通过 URL 路径传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>查询字符串参数（Query String Parameters）：通过 ? 后的查询字符串传递参数。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>请求体参数（Request Body Parameters）：通过 POST、PUT 请求的请求体传递复杂的对象。 ○ 同样要求在 POST 和 PUT 请求中尝试使用 [FromBody] 和 [FromForm] 两种不同方式传递数据。 ○ 所有 API 返回类型为 JsonResult。</li></ol><p><br></p><p><strong>模型类与验证要求：</strong></p><p><strong>User 模型：</strong></p><p>• <strong>字段包括： </strong></p><p>○ UserName：用户的姓名。</p><p>○ Email：用户的邮箱地址。</p><p>○ Adress：用户的地址。</p><p>○ Gender：用户的性别（枚举类型：Male, Female, Other）。</p><p>○ Password：用户的密码。</p><p>○ Phone：用户的电话。</p><p>• <strong>验证要求：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>UserName：不能为空。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Email：必须符合电子邮件格式。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Phone：必须符合自定义的澳洲电话号码格式（通过自定义模型验证实现）。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Gender：必须为枚举类型 Male, Female 或 Other。</li></ol><p><br></p><p><strong>Teacher 模型：</strong></p><p><strong>• 字段包括： </strong></p><p>○ UserId：外键，指向 User 表，必须提供。</p><p>○ Department：教师所在的部门，不能为空。</p><p>○ Description：教师的描述，最长 500 字符。</p><p>○ Specialty：教师擅长的课程。</p><p>• <strong>验证要求：</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Description：长度不能超过 500 字符。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>UserId：必须提供，指向 User 表的外键。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Department：不能为空。</li></ol><p><br></p><p><strong>传参方式详细功能：</strong></p><p><strong>1. 路径参数传值：</strong></p><p>○ 通过 URL 路径传递参数，示例：</p><p>§ /api/user/{id}：通过用户 ID 获取用户信息。</p><p>§ /api/teacher/{id}：通过教师 ID 获取教师信息。</p><p><strong>2. 查询字符串传值：</strong></p><p>○ 通过 ? 后面的查询字符串传递参数，示例：</p><p>§ /api/user?email=user@example.com：根据用户的 Email 获取用户信息。</p><p>§ /api/teacher?email=teacher@example.com：根据教师的 Email 获取教师信息。</p><p><strong>3. 请求体参数传值：</strong></p><p>○ 通过 POST 或 PUT 请求体传递对象，使用 [FromBody] 或 `[FromForm]：</p><p>§ 使用 POST 请求创建用户，将完整的用户数据以 JSON 格式或表单格式放入请求体中。</p><h3>§ 使用 PUT 请求更新教师数据，将完整的教师数据以 JSON 格式或表单格式放入请求体中。</h3>",
          "_id": "69e3294d9f9cc30e74196f8b"
        },
        {
          "code": "L69",
          "title": "Tutorial 10（.NET）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(4) 作业讲评&amp;答疑</p>",
          "_id": "69e329699f9cc30e741976dd"
        },
        {
          "code": "L70",
          "title": ".NET(6)：构建WEB API项目相关技术 - 特性，模型验证，自定义模型验证，切面编程，过滤器，自定义中间件",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">Web API 相关技术</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">泛型概念及用法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">.Net 内置的泛型集合</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入（Dependency Injection, DI)&amp;控制反转（Inversion of Control, IoC）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入生命周期</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">在Web Api 常见的依赖注入应用</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web Api 中的异步编程</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">扩展方法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Restful API</span></li></ol>",
          "_id": "69e3294e9f9cc30e74196f99"
        },
        {
          "code": "L71",
          "title": ".NET(6): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment：</strong></p><p>1&gt; 在第一次Web API 作业的基础上，新增的要求是引入统一的返回类型，要求所有 API 的返回结构保持一致，以提高代码的可读性、可维护性，并确保每个 API 都能够提供一致的响应格式，方便前端和其他调用方处理返回数据。</p><p>统一返回类型要求： • 统一返回结构： 所有 API 返回类型应包含以下几个属性：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Success: 用于表示操作是否成功。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Message: 操作成功或失败的消息。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Data: 返回的具体数据，可以为空。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Errors: 若操作失败时，返回错误信息列表。 • 使用泛型（Generic）： 通过泛型类实现统一返回结构，确保不同类型的数据也能够通过统一的返回结构进行传递。</li></ol><p><br></p><p>2&gt; 实现一个继承自 ActionFilterAttribute 的自定义过滤器，并在每个 Action 执行前拦截请求，获取 Action 名称和参数信息。</p><p><br></p><p>3&gt; 创建一个 CustomExceptionFilter 类，实现 IExceptionFilter 接口。 在 API 中抛出的所有异常都应被过滤器捕获，并返回带有统一结构的类型（之前的统一返回）响应。 要求在所有控制器中应用此 ExceptionFilter。</p><p><br></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>4&gt; 创建一个 Result Filter： 该过滤器应在 Action 执行结束后，对结果进行拦截并进行必要的修改。 在项目中应用 Result Filter： 要求在所有控制器中应用这个过滤器，并对返回结果进行统一的处理。 返回格式： 保证返回结果依旧使用之前定义的统一返回格式，并且可以在成功的响应中添加成功的时间戳。</li></ol>",
          "_id": "69e3294e9f9cc30e74196fa0"
        },
        {
          "code": "L72",
          "title": ".NET(7)：构建WEB API项目相关技术 - 泛型，依赖注入声明周期，异步编程，扩展方法",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">Web API 相关技术</strong></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">泛型概念及用法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">.Net 内置的泛型集合</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入（Dependency Injection, DI)&amp;控制反转（Inversion of Control, IoC）</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">依赖注入生命周期</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">在Web Api 常见的依赖注入应用</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web Api 中的异步编程</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">扩展方法</span></li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Restful API</span></li></ol>",
          "_id": "69e3294e9f9cc30e74196fa7"
        },
        {
          "code": "L73",
          "title": ".NET(7): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Assignment: CRUD Operations with MySQL and <a href=\"http://ado.net/\" rel=\"noopener noreferrer\" target=\"_blank\">ADO.NET</a></h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup</strong></li></ol><p>Task: Create a user table in MySQL with the following columns: id (Primary Key, int, auto-increment)</p><p>username (varchar(45))</p><p>password (varchar(45))</p><p>email (varchar(200))</p><p>age (int)</p><p>gender (int)</p><p>active (bool, corresponds to BINARY(1) in the database)</p><p>address (varchar(500))</p><p><strong>2. UserService Implementation</strong></p><p>Task: Create a UserService class that implements the IUserService interface. Use <a href=\"http://ado.net/\" rel=\"noopener noreferrer\" target=\"_blank\">ADO.NET</a> to implement the following methods:</p><p>Insert (Create new user)</p><p>Update (Modify user details)</p><p>Delete (Remove a user)</p><p>Search (Query users)</p><p>Data Retrieval Methods:</p><p>Implement two ways to retrieve data:</p><p>Row-by-Row reading (using MySqlDataReader)</p><p>MySqlDataAdapter for data handling.</p><p><strong>3. UserController</strong></p><p>Task: Create a UserController class and write the necessary Action methods to handle CRUD operations (Create, Read, Update, Delete) by calling the methods from UserService.</p><p>Use Dependency Injection to inject UserService into UserController.</p><p>Register the IUserService interface and its implementation (UserService) in the DI container for proper service resolution.</p><p><strong>4. API Testing with Postman</strong></p><p>Task: Test the CRUD operations using Postman to ensure all API endpoints for creating, reading, updating, and deleting users work as expected.</p>",
          "_id": "69e3294e9f9cc30e74196fae"
        },
        {
          "code": "L74",
          "title": "React基础(5) - 条件渲染 & 列表渲染",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>if / 三元运算符 ? : / &amp;&amp; 渲染组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组 .map() 生成组件列表</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么 key 很重要？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：渲染一个 Todo List</li></ol>",
          "_id": "6834079e705ef70538933671"
        },
        {
          "code": "L75",
          "title": "Tutorial 13（.NET）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(5) 作业讲评&amp;答疑</p><p>.NET(6) 作业讲评&amp;答疑</p>",
          "_id": "69e3296a9f9cc30e74197710"
        },
        {
          "code": "L76",
          "title": "Lab(10)：使用React, Hooks和Redux Toolkit构建图书馆应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React, Hooks和Redux Toolkit构建图书馆应用</p>",
          "_id": "69e3294f9f9cc30e74196fd5"
        },
        {
          "code": "L77",
          "title": "Lab(11)：使用React和Express构建图像上传应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>使用React和Express构建图像上传应用</p>",
          "_id": "69e3294f9f9cc30e74196fdc"
        },
        {
          "code": "L78",
          "title": ".NET(8): 构建WEB API项目相关技术 - 数据库，SQL Script，ADO.NET",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">数据库 &amp; SQL Script</strong></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"color: rgb(0, 0, 0);\">ADO.NET</strong></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">ADO.NET 的主要功能</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Web API 如何使用ado.net</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">用ADO.NET 写insert 和seache 方法</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\">Using的用法和参数化查询 防止sql 注入</span></li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0);\"> ADO.NET 读取数据的三种方式</span></li></ol>",
          "_id": "69e3294f9f9cc30e74196fe3"
        },
        {
          "code": "L79",
          "title": ".NET(8): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Assignment</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>创建模型并生成数据库表</strong>Category 模型：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>属性：</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Id（主键）</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>categoryName：分类名称</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CategoryLevel：分类级别（用于表示是一级分类还是二级分类）</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ParentId：父分类的 Id，用于实现分类的层级关系。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>说明：这个模型主要用于表示分类层次关系，比如 IT 是一级分类，software 是 IT 的子分类。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Course 模型：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>属性：</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Id（主键）</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CourseName：课程名称</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Description：课程描述</li><li data-list=\"bullet\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CategoryId：外键，关联 Category，表示课程所属的分类。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>关系：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>一个 Category 可以有多个 Course，即 Category 与 Course 是一对多的关系。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Category 模型本身也有自关联，ParentId 用来实现分类的父子关系。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>在 DbContext 中实现模型和关系</strong>在 EF Core 的 DbContext 中，创建 DbSet&lt;Category&gt; 和 DbSet&lt;Course&gt;，并通过 Fluent API 或数据注解来配置 Category 与 Course 之间的一对多关系，以及 Category 的自关联（ParentId）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>配置数据库连接</strong>在项目的 appsettings.json 或 Program.cs 中配置数据库连接字符串。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 EF Core Migrations 生成数据库表。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实现 REST API 和普通 API</strong>Category 的 API：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 REST API 设计，提供增删改查（CRUD）操作。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>例如：GET /api/category 获取所有分类，POST /api/category 创建新分类。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Course 的 API：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供常规的增删改查 API。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>例如：GET /api/course 获取所有课程，POST /api/course 创建新课程。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>配置 NLog</strong>参考 NLog 官方文档。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在你的 API 操作或服务层中，针对重要的操作（例如，创建、删除、更新数据）写日志，记录这些操作的执行情况和错误。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>配置 Swagger</strong>参考 Swagger 官方文档。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置 Swagger 来自动生成 API 文档，并通过 Swagger UI 测试 API 的各个 endpoint。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>进阶部分（JWT 身份验证）</strong>JWT 配置：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现 JWT 生成功能，在用户登录时生成 Token。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 API 中校验前端传来的 Token 是否有效，使用 JWT 来保护 API 路由。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Swagger 的 Authorization：</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 Swagger 中配置 Authorization，使得 Swagger UI 能够发送带有 JWT 的请求，以便测试受保护的 API。</li></ol><h3>完整的流程：</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建 Category 和 Course 模型，定义好表的关系。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在 DbContext 中配置这些模型。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置数据库连接并生成数据库表。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现 Category 和 Course 的 API，完成 CRUD 操作。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置 NLog，记录日志信息。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置 Swagger，生成 API 文档并测试 API。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>进阶部分：使用 JWT 实现身份验证，并配置 Swagger 进行 JWT 保护的 API 测试。</li></ol>",
          "_id": "69e3294f9f9cc30e74196fea"
        },
        {
          "code": "L80",
          "title": "Project 3介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>项目背景</strong></h3><p>在现实世界中，创业公司通常需要快速开发产品并应对市场的变化。这个项目将模拟一个创业公司的实际情景，让你和你的团队合作，创建一个创新的软件产品。</p><h3><br></h3><h3><strong>项目任务</strong></h3><p>你将加入到一个由你的同学组成的团队中，该团队将一起创建一个新的Web Application。你的任务是在团队中发挥作用，贡献你的技能，共同推动项目的成功。</p><h3><br></h3><h3><strong>项目要求</strong></h3><p><strong>项目选题</strong>: 你的团队可以自由选择一个创新的项目主题，但它必须包括以下要素：</p><ul><li class=\"ql-indent-1\">前端：使用React，Redux，Nextjs，Styled-Components等。</li><li class=\"ql-indent-1\">后端：使用Node.js，Express.js，Koa，Passport.js等。</li><li class=\"ql-indent-1\">数据库：Mongodb，PostgreSQL，DynamoDB等，选择合适的数据库来存储和管理数据。</li><li class=\"ql-indent-1\">部署：将你的应用部署到云端，如AWS、Azure等。</li></ul><p><strong>敏捷开发</strong>: 使用敏捷开发方法，将项目拆分成多个迭代，并定期交付新的功能。使用敏捷工具（如Trello或JIRA）来跟踪任务和进度。</p><p><strong>协作与沟通</strong>: 团队协作和沟通至关重要。定期召开站会（stand-up meetings）以更新团队成员，确保每个人都了解项目的状态和任务分配。</p><p><strong>Quality and Testing</strong>: 保证你的应用程序质量良好。编写单元测试和端到端测试，并确保每个功能都经过充分测试。</p><p><strong>Documentation</strong>: 创建清晰的文档，包括项目计划、需求文档、系统架构和部署说明。这些文档对于团队成员和潜在用户都非常重要。</p><p><strong>Presentation and Demonstration</strong>: 在项目结束时，团队需要准备一个演示，展示你的应用程序功能和亮点。这也是你展示你的项目成果的机会。</p><h3><br></h3><h3><strong>项目交付</strong></h3><p>项目完成后，你的团队需要准备一个综合性的项目报告，其中包括以下内容：</p><ul><li>Detailed project description, including the theme and objectives.</li><li>Project plan and progress reports, documenting various phases and completion status.</li><li>System architecture and technology stack of the application.</li><li>Deployment documentation, explaining how to deploy your application on a cloud platform.</li><li>Testing reports, including the results of unit tests and end-to-end tests.</li><li>Materials for project presentation and demonstration, including screenshots or demo videos of the user interface.</li></ul><h3><br></h3><h3><strong>项目评估</strong></h3><p>项目将根据以下标准进行评估：</p><ul><li>项目完成度：项目是否按计划完成，是否满足了项目要求。</li><li>代码质量：代码是否整洁、可维护，并遵循最佳实践。</li><li>功能实现：应用程序是否实现了所需的功能和特性。</li><li>文档质量：项目文档是否详尽清晰，便于他人理解。</li><li>团队协作：团队协作和沟通是否良好。</li><li>演示与展示：演示是否能够生动地展示项目的价值。</li></ul>",
          "_id": "6834079e705ef70538933679"
        },
        {
          "code": "L81",
          "title": "Project 3 Bootstrap",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Project 3：创造、展示、协作的新篇章</strong></p><p>课程概述</p><p>欢迎踏入新的阶段，一个专注于实践、创新和团队协作的全新教育体验！在这里，你不仅学习技术，更将参与到真实的项目中，与团队一起创造有意义的作品。我们的目标是培养能够独立思考、卓越创新的匠人，让每位学员在技术路上更进一步。</p><p><br></p><p><br></p><h3><br></h3><p>1. 匠人培训 5.0 的含义</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实践与创新</strong>：超越传统理论教学，强调通过实际项目的开发来掌握和应用技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>团队协作</strong>：重视团队合作，通过小组项目培养沟通和协作技能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>持续成长</strong>：不仅提供知识，更注重培养学习和解决问题的能力。</li></ol><p>2. 项目展示</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>最终展示</strong>：每个项目组会在课程末尾线上展示他们的作品，全面介绍项目成果和学习体验。</li></ol><p>3. 项目分组与导师组</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目如何分组</strong>：学员将根据兴趣和技能分入不同的项目组，每组承担一个独特的项目。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>导师组与自拟项目组</strong>：导师组由经验丰富的老师领导，指导项目实施；自拟项目组则更加自由，学员可以根据自己的想法创建和实施项目。</li></ol><p>4. 项目组规定的重要性</p><p><br></p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>规定的目的</strong>：确保每个成员都能在公平、有序的环境中学习和贡献。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>遵守的必要性</strong>：有助于提升团队效率，保证项目顺利完成。</li></ol><p><br></p><p><strong>加入我们的匠人培训5.0，开启你的技术创新之旅，与我们一起成长！</strong></p><p>在这个课程中，每一步都充满了挑战和机遇。我们期待看到你的参与和你的作品，一起来创造令人惊叹的项目！</p>",
          "_id": "6834079e705ef7053893367a"
        },
        {
          "code": "L82",
          "title": "AWS 基础",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>老师：Michel Su</p>\n<p>公司：Atlassian</p>\n<p>职位：SRE</p>\n<p>内容：</p>\n<p>1. AWS的基础知识，已经AWS是什么，为什么使用Cloud云计算服务</p>\n<p>2. 云计算的优势是什么，云计算的种类，为什么要用AWS</p>\n<p>3. IAM是什么，如何定义IAM，Users，Groups，Roles分别是什么，如何进行实施</p>\n<p>4. s3的基本操作，如何创建S3的bucket</p>\n<p>5. ec2是什么，如何启用ec2。ec2 ，ecs，lambda区别是什么，如何设计</p>\n<p>6. Load Balancer是什么，Application Load Balancer用来做什么的。Network的协议是什么</p>\n<p>7. AWS考试以及证书是什么</p>\n<p>8. API gateway的实施</p>\n<p>9. 使用老师提供的项目build一个Serverless的Web Application</p>",
          "_id": "69e329509f9cc30e74197005"
        },
        {
          "code": "L83",
          "title": "Workshop: AWS IAM 的基本用法和高级使用",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop 分享人： Henry</p>\n<p>内容：</p>\n<ul>\n<li>AWS IAM 创建账户</li>\n<li>IAM 的 policy 如何设置</li>\n<li>IAM 的 role 如何设置</li>\n<li>当用户的 Policy 抵达上限，如何解决</li>\n<li>IAM 如何设置 boundary，如何限制 User 只能使用悉尼地区服务</li>\n<li>针对 Non-production 和 Production 如何配置权限</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "69e329509f9cc30e7419700b"
        },
        {
          "code": "L84",
          "title": "什么是Agile SDLC, Waterfall, Agile介绍",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. Agile 的由来、开发宣言、原则、主要关注点，什么是价值 </p><p>2. 传统的项目管理如何进行的：悉尼歌剧院，悉尼轻轨 </p><p>3. Software Development Life Cycle(SDLC)是什么, 具体的每个阶段是什么 </p><p>4. SDLC-Waterfall和V Model是什么 </p><p>5. Project Management Methodologies有什么 </p><p>6. Lean Startup是什么 </p><p>7. 为什么使用敏捷开发，什么是敏捷开发，与Waterfall有什么区别 </p><p>8. Agile的价值观是什么，Agile Manifesto是什么，12个原则是什么</p>",
          "_id": "6834079e705ef70538933676"
        },
        {
          "code": "L85",
          "title": "Agile Methodologies",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. 敏捷开发采用的具体方法，什么是Scrum，什么是Kanban </p><p>2. 结合实际工作讲解各个流程：scrum planning，daily standup，scrum board，scrum review meeting，spring retrospective meeting </p><p>3. Kanban的几个阶段，具体每个阶段的意义是什么 </p><p>4. Scrum在敏捷开发中的定义是什么 </p><p>5. Scrum里面的roles是什么，Artifacts是什么，Scrum里面包含的Events有什么 </p><p>6. SCRUM的3355原则是什么，Value Propositions是什么 </p><p>7. Retrospective meeting主要用来作什么的 </p><p>8. Scrum的Teams Roles: Product Owner, Development Team, Scrum Master，分别是什么 </p><p>9. Kanban具体的步骤是什么 </p><p>10. 怎样写 backlog，怎样写用户故事：“完成”的定义，故事拆分和故事估算 </p><p>11. User Story是什么，具体的User Story该怎么写 </p><p>12. Sprint Planning是什么</p>",
          "_id": "6834079e705ef70538933677"
        },
        {
          "code": "L86",
          "title": "Agile Case研究：微软Microsoft Case Study",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>来自微软曾获得MVP的Ray老师，讲述以微软Windows交付使用Agile的流程 </p><p>1. 微软是如何使用Agile的，如何使用Agile敏捷开发以及采用DevOps文化 </p><p>2. Windows的发布周期 </p><p>3. Waas是什么，Windows as a Service，其中Rings是什么 </p><p>4. 微软的开发团队分布 </p><p>5. Windows开发具体的周期 </p><p>6. Up-front Planning开发，Code Test Stabilize 过程 </p><p>7. Windows的开发流程如何转型的，如何提升效率和成功率的 </p><p>8. Agile在项目开发中的好处是什么</p>",
          "_id": "6834079e705ef70538933678"
        },
        {
          "code": "L87",
          "title": "Workshop: Agile Project Management",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop: Agile Project Management</p>",
          "_id": "6834079e705ef70538933675"
        },
        {
          "code": "L88",
          "title": "Tutorial 15（.NET）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><br></p>",
          "_id": "69e3296d9f9cc30e7419778b"
        },
        {
          "code": "L89",
          "title": "Agile 方法论: 解锁团队的协作潜力",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>1. Agile敏捷开发：历史与哲学探究</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从传统瀑布模型到敏捷方法的革命性变革。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷哲学：为什么它如此强大？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agile 哲学：为什么\"Agile\"变得如此重要？</li></ol><p><strong>2. 深入Agile Manifesto (敏捷宣言)</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷的四个核心价值观：从\"个体与互动\"到\"响应变化\"。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>十二条开发原则的解析：如何将价值观付诸实践？</li></ol><p><strong>3. Scrum、Kanban：敏捷的支柱</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Scrum 框架的各个流程概述，“3355”方法论</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Scrum：迭代开发、自组织团队的奇妙之处。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Kanban：可视化工作流、持续改进的精髓。</li></ol><p><strong>4. 深入Scrum</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Product Backlog：需求的生命线。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Sprints：高效迭代与交付的秘密。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>日常站立会议 (Daily Standups)：团队默契的塑造。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Sprint Retrospectives：持续改进的动力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>结合实际工作讲解各个流程：scrum planning，daily standup，scrum board，scrum review meeting，spring retrospective meeting</li></ol><p><strong>5. 用户故事与验收标准：需求的精髓</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>打造高质量用户故事的策略。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Acceptance Criteria：确保交付符合预期的关键。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>怎样写 backlog，怎样写用户故事：“完成”的定义，故事拆分和故事估算</li></ol><p><strong>6. 实践出真知：构建自己的敏捷看板</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用现代工具 (如Trello、JIRA) 建立工作流程。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际操作：从构建产品积压到完成冲刺。</li></ol><p><strong>7. 敏捷在企业中的演进</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大型组织的敏捷转型：成功的案例分析。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>避免常见陷阱：敏捷实施中的挑战与解决。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>怎样改进流程、提高效率，为什么企业需要 T 型人才</li></ol><p><strong>8. 敏捷的未来展望</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷开发不断演进的趋势。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何将敏捷原则融入日常工作。</li></ol>",
          "_id": "69e329519f9cc30e74197031"
        },
        {
          "code": "L90",
          "title": "React基础(6) - 组件的状态",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件是如何保存状态的？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>useState 的基本用法</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>事件处理（onClick、onChange）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>状态提升（Lifting State Up）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：制作一个带开关的灯泡组件（点击按钮切换亮/灭）</li></ol>",
          "_id": "6834079e705ef7053893367b"
        },
        {
          "code": "L91",
          "title": ".NET(12): Unit Test",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Unit Test</p>",
          "_id": "69e329529f9cc30e74197049"
        },
        {
          "code": "L92",
          "title": ".NET(12): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Assignment：</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a xUnit test project for the Web API project, which is from the Lecture Web API 项目</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Add package moq to the xUnit test project</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Decide which controller/service need the unit test (for public method)</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Write the unit test for your selected API methods, if possible, can write you own public methods including the logic or calculation, which is better feasible for unit test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Given a few examples:</li></ol><p><em>UserController.TestServcies method,</em></p><p><em>TeacherController.Post method,</em></p><p><em>TeacherService.GetUser method</em></p><p>5. Trying to use moq package to simulate the DBContext –e.g.CourseCategoryService.Add method in unit test</p><p>6. Trying to use some fake external API in your Web API methods and write the unit test to mock this external API.</p><p>Below are some candidates could be used from the fake external API - <a href=\"https://jsonplaceholder.typicode.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://jsonplaceholder.typicode.com</a></p><p>7. Trying to run the power shell script and generate the report - please go through the ps script and remember to replace the below value to your solution name</p><p><strong> # Run the Coverlet.Collector - REPLACING YOUR SOLUTION NAME!!!</strong></p><p><br></p><h3>$output = [string] (&amp; dotnet test ../YOURSOLUTION.sln --collect:\"XPlat Code Coverage\" 2&gt;&amp;1)</h3>",
          "_id": "69e329529f9cc30e74197053"
        },
        {
          "code": "L93",
          "title": "Tutorial 12 (React, Context API)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Q&amp;A</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解答学习 React 中的疑问。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解答学习 .NET 中的疑问。</li></ol>",
          "_id": "69e3296e9f9cc30e741977b6"
        },
        {
          "code": "L94",
          "title": ".NET(11): C# 事件与委托",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>C# 事件与委托</p>",
          "_id": "69e329529f9cc30e74197062"
        },
        {
          "code": "L95",
          "title": ".NET(11): Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Assignment:</p><p>1. Define the delegates, please practice the different types:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>single delegate - the delegate only used by score top 1 student</li></ol><p><br></p><p>e.g. define the delegate HonourBonus for the top 1 score student, associate the top 1 student's ReceiveBonus method with this delegate</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>multicast delegate</li></ol><p><br></p><p>e.g. define the delegate CourseStarting for all students, associate the all student's Start method with this delegate</p><p>In the main method, please initiate the instance of delegate to call associated methods and print out the result (in console log)</p><p><br></p><p>2. Define the events</p><p>Please consider the difference when using event keyword with the above delegate.</p><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Update existing Course class which will be treated as Subject/Observable/Publisher, to add an event - ScheduledTimeChanged (means the course time updated/changed)</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Update the existing Student class, which will be the Observer/Subscriber, to add the event handler (method) to listen above event and accordingly update the behavior (print out something in console log)</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Simulate some students could quite the course, please remove the subscription from these students</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Imaging new students joined and interested in the course, please add the new subscriptions for the event.</li></ol><p><br></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Please trigger the time changed event, and print out all subscriber/observer reactions (print out something in console log)</li></ol>",
          "_id": "69e329529f9cc30e74197069"
        },
        {
          "code": "L96",
          "title": "React基础(7) - React 组件生命周期 & 使用 API 获取数据",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件的生命周期（挂载、更新、卸载）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>useEffect 介绍</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>清理副作用（避免内存泄漏）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：制作一个自动倒计时的组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用 fetch 请求 API</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>处理加载中 &amp; 错误状态</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：请求 GitHub API 并显示用户信息</li></ol>",
          "_id": "6834079e705ef70538933685"
        },
        {
          "code": "L97",
          "title": "Tutorial 18 (.NET)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Q&amp;A</h3><p>针对上节课C# 事件与委托的答疑和练习</p>",
          "_id": "69e3296e9f9cc30e741977df"
        },
        {
          "code": "L98",
          "title": "React 进阶(1) - Thinking in React",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 1: Break The UI Into A Component Hierarchy</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 2: Build A Static Version in React</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 3: Identify The Minimal (but complete) Representation Of UI State</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 4: Identify Where Your State Should Live</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 5: Add Inverse Data Flow</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>And That’s It</li></ol>",
          "_id": "6834079e705ef70538933687"
        },
        {
          "code": "L99",
          "title": "Tutorial 14（SCRUM）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>SCRUM 常见问题及其解决方案 (50 分钟)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>讨论常见问题</strong> (25 分钟)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 SCRUM 实施中常见的问题，</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如留言问题</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>延迟</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供解决这些问题的策略和最佳实践。</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何与 SCRUM master 沟通</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何与 Product Owner 沟通</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何与 Team member 沟通</li><li data-list=\"bullet\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何与 Team Leader 沟通</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>案例研究</strong> (25 分钟)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析真实的 SCRUM 案例，探讨如何处理复杂或棘手的问题。</li></ol><h3>JIRA 和 Bitbucket 工具使用 (50 分钟)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>JIRA 使用介绍</strong> (25 分钟)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示如何在 JIRA 中创建和管理工单（tickets）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解如何使用 JIRA 进行任务分配和进度追踪。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Bitbucket 的基本操作</strong> (25 分钟)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何在 Bitbucket 中进行代码审查（review MRs）和版本控制。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实践如何使用 Bitbucket 管理代码库和协作。</li></ol><h3>开发人员日常工作流程图制作 (20 分钟)</h3><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实践练习：制作工作流程图</strong>学员将根据所学内容，绘制一个描述开发人员日常工作流程的流程图。</li></ol>",
          "_id": "69e3296f9f9cc30e741977f3"
        },
        {
          "code": "L100",
          "title": "React 进阶(2) - 测试和 a11y",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>测试金字塔</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Unit Test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>vitest</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>react testing lib</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>js-dom</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>accessibility</li></ol>",
          "_id": "6834079e705ef70538933689"
        },
        {
          "code": "L101",
          "title": "课后补充知识：什么是SSR，CSR，SSG",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>服务器端渲染（SSR）</strong></p>\n<ul>\n<li class=\"ql-indent-1\">介绍SSR的工作原理和主要特点。</li>\n<li class=\"ql-indent-1\">探索SSR的优势，如更快的首屏加载时间和更好的SEO。</li>\n</ul>\n<p>&nbsp;</p>\n<p><strong>客户端渲染（CSR）</strong></p>\n<ul>\n<li class=\"ql-indent-1\">讲解CSR如何在浏览器端动态生成页面内容。</li>\n<li class=\"ql-indent-1\">分析CSR的优点，例如更丰富的交互和更好的用户体验。</li>\n</ul>\n<p><strong>静态站点生成（SSG）</strong></p>\n<ul>\n<li class=\"ql-indent-1\">说明SSG的概念和生成静态网页的过程。</li>\n<li class=\"ql-indent-1\">探讨SSG的使用场景，如博客、文档站点等。</li>\n</ul>\n<p><strong>选择最适合的渲染技术</strong></p>\n<ul>\n<li class=\"ql-indent-1\">根据不同的项目需求和目标，讨论如何选择最合适的渲染方式。</li>\n</ul>",
          "_id": "6834079e705ef70538933669"
        },
        {
          "code": "L102",
          "title": "Next.js",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Next.js</p>",
          "_id": "6834079e705ef7053893368c"
        },
        {
          "code": "L103",
          "title": "The Four Prototyping Patterns: Prompting, Fine-Tuning, RAG, Agents",
          "type": "Lesson",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>The Four Prototyping Patterns: Prompting, Fine-Tuning, RAG, Agents</strong></p><p>BY THE END OF THE SESSION</p><p>• Prompting \"giving the LLM more context\" Prompting = asking questions in a better way with better context</p><p>• Fine Tuning \"teaching the LLM how to act\" 3 types: task training, constraining I/0 schema, and language training</p><p>• RAG \"giving the LLM access to new knowledge\" Retrieval Augmented Generation = Dense Vector Retrieval + In-Context Learning</p><p>• Agents</p><p>\"giving the LLM access to tools\"</p><p>Agents = reasoning, action, repeat</p><p>• Prompting \"giving the LLM more context\" Prompting = asking questions in a better way with better context</p><p>• Fine Tuning \"teaching the LLM how to act\" 3 types: task training, constraining I/0 schema, and language training</p><p>• RAG \"giving the LLM access to new knowledge\" Retrieval Augmented Generation = Dense Vector Retrieval + In-Context Learning</p><p>• Agents</p><p>\"giving the LLM access to tools\"</p><p>Agents = reasoning, action, repeat</p><p><strong>Prompting</strong></p><p>Prompt is nothing but what you said to AI.</p><p><strong>Prompt Engineering</strong> is the art of crafting effective prompts that elicit desired responses from LLMs. It's the foundation of interacting with these models, and its effectiveness can significantly impact the quality and relevance of the output.</p><p>A typical prompt can be broken down into several key components:</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Priming:</strong> This sets the context for the LLM, providing information about the desired task, persona, or style. For example, you might prime the model by saying, \"You are a friendly chatbot that helps users with their travel plans.\"</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Instructions:</strong> These guide the LLM on how to handle specific aspects of the task, such as the tone of voice, the format of the output, or how to handle edge cases. For example, you might instruct the model to \"use a conversational tone\" or \"provide a bulleted list of recommendations.\"</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>User Inquiry:</strong> This is the dynamic content of the prompt, the specific question or request that the user provides. It's the input that changes with each interaction.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Output Formatting:</strong> This specifies the desired format of the LLM's response. It could be plain text, a structured format like JSON, or even a specific template.</li></ol><p><br></p><p><strong>Example:</strong></p><p>Priming: You are a helpful and informative chatbot that answers questions about history.</p><p>Instructions: Provide concise and accurate answers, using bullet points to list key facts.</p><p>User Inquiry: What were the major causes of World War II?</p><p>Output Formatting: A bulleted list of key causes.</p><p>Another famous the COSTAT:</p><p><strong>The COSTAR Framework Explained:</strong></p><p><strong>Context :</strong> Providing background information helps the LLM understand the specific scenario.</p><p><strong>Objective (O):</strong> Clearly defining the task directs the LLM’s focus.</p><p><strong>Style (S):</strong> Specifying the desired writing style aligns the LLM response.</p><p><strong>Tone (T):</strong> Setting the tone ensures the response resonates with the required sentiment.</p><p><strong>Audience (A):</strong> Identifying the intended audience tailors the LLM’s response to be targeted to an audience.</p><p><strong>Response (R):</strong> Providing the response format, like text or json, ensures the LLM outputs, and help build pipelines.</p><p><strong>Benefits of Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Control over Output:</strong> Prompt Engineering allows you to guide the LLM's behavior and ensure that the output aligns with your specific needs.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Customization:</strong> You can tailor prompts to specific tasks, audiences, and contexts.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Efficiency:</strong> Well-crafted prompts can reduce the need for extensive fine-tuning, saving time and resources.</li></ol><p><strong>Limitations of Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context Window:</strong> LLMs have a limited context window, meaning they can only process a certain amount of text at a time. This can limit the complexity of prompts and the amount of information that can be provided.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Lack of Factual Grounding:</strong> LLMs are trained on massive datasets of text, but they don't store specific facts. They predict the most likely word based on the context, which can lead to inaccuracies or inconsistencies.</li></ol><p><br></p><p>=========================================</p><p><strong>Fine-Tuning</strong></p><p><strong>Fine-tuning</strong> is a powerful technique that allows you to customize the behavior of an LLM by training it on a specific dataset of examples. This process adjusts the LLM's internal parameters, enabling it to perform better on tasks related to the training data.</p><p><strong>How Fine-tuning Works:</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Training Data:</strong> A dataset of prompt-completion pairs is created, where each pair consists of a prompt and the desired response. This data represents the specific task or style that you want the LLM to learn.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Model Training:</strong> The LLM is trained on the provided dataset, adjusting its internal parameters to better predict the desired responses for the given prompts.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Evaluation:</strong> The fine-tuned model is evaluated on a separate dataset to assess its performance and ensure that it has learned the desired behavior.</li></ol><p><strong>Example:</strong></p><p>Imagine you want to fine-tune an LLM to write product descriptions in a specific style.</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Training Data:</strong> You create a dataset of product descriptions written in your desired style, along with the corresponding product names.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Model Training:</strong> The LLM is trained on this dataset, learning to generate product descriptions that match the style and tone of the training data.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Evaluation:</strong> You evaluate the fine-tuned model by providing it with new product names and assessing the quality of the generated descriptions.</li></ol><p><strong>Benefits of Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Improved Performance:</strong> Fine-tuning can significantly improve the LLM's performance on specific tasks, such as writing in a particular style, generating creative content, or answering questions in a specific domain.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Style and Tone Customization:</strong> Fine-tuning allows you to bake in your desired style, tone, and formatting into the LLM's output.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Reduced Prompt Length:</strong> Fine-tuning can reduce the need for extensive instructions in the prompt, allowing for a larger context window and more complex outputs.</li></ol><p><strong>Limitations of Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Data Requirements:</strong> Fine-tuning requires a dataset of examples, which can be time-consuming and resource-intensive to create.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Overfitting:</strong> If the training data is too small or not representative of the desired behavior, the model may overfit to the training data and perform poorly on unseen examples.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Cost and Resources:</strong> Fine-tuning can be computationally expensive, requiring significant resources and time.</li></ol><p><br></p><p><strong>RAG</strong></p><p><strong>RAG</strong> addresses the limitations of prompt engineering by incorporating external knowledge sources into the LLM's decision-making process. It allows LLMs to access and utilize factual information from databases, websites, or other sources, enhancing their ability to provide accurate and relevant responses.</p><p><strong>How RAG Works:</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup:</strong> A database is created containing relevant information, which can be text from websites, documents, or internal knowledge bases. This information is then split into smaller chunks, such as paragraphs or sections, to ensure that related text is kept together.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Embedding Generation:</strong> Each chunk of text is converted into a vector representation called an embedding. Embeddings capture the semantic meaning of the text, allowing for efficient comparison and retrieval.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval:</strong> When a user inquiry is received, it is also converted into an embedding. This embedding is then compared to the embeddings in the database using a vector search algorithm. The most similar chunks of text are retrieved.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Prompt Augmentation:</strong> The retrieved information is then incorporated into the prompt, providing the LLM with the necessary context to answer the user's question.</li></ol><p><strong>Example:</strong></p><p>Imagine a user asks, \"How do I fix a leaky faucet?\"</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval:</strong> The user's inquiry is converted into an embedding and compared to the embeddings in a database containing a plumber's handbook. The most relevant section, \"Fixing Common Leaks,\" is retrieved.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Prompt Augmentation:</strong> The retrieved section is added to the prompt, providing the LLM with the necessary information to answer the question.</li></ol><p><strong>Benefits of RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Factual Accuracy:</strong> RAG allows LLMs to access and utilize factual information from external sources, improving the accuracy and reliability of their responses.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Real-time Knowledge Updates:</strong> The database can be updated in real time, ensuring that the LLM has access to the latest information.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Expanded Knowledge Base:</strong> RAG enables LLMs to access a much larger knowledge base than what is available within their training data.</li></ol><p><strong>Limitations of RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup and Maintenance:</strong> Creating and maintaining a comprehensive and accurate database can be time-consuming and resource-intensive.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval Accuracy:</strong> The accuracy of the retrieved information depends on the quality of the database and the effectiveness of the vector search algorithm.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context Window:</strong> The retrieved information is still subject to the LLM's context window limitations.</li></ol><p><br></p><p><strong>Agents</strong></p><p>Agent is nothing but a fancy RAG</p><p><strong>Introduction to LLM Agents</strong></p><p>LLM agents represent the next frontier in artificial intelligence, moving beyond simple text input-output models to interactive, reasoning-capable systems.</p><p><strong>What are LLM Agents?</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Definition: Systems that use Large Language Models (LLMs) as their core for reasoning and planning, enabling interaction with external environments.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Key difference from traditional LLMs: Ability to observe, plan, and take actions in diverse environments.</li></ol><p><strong>Components of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agent/Brain/Core:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Core LLM for processing and understanding language</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Customizable prompts and personas</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Planning:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ability to create and execute plans for complex tasks</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Memory:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Short-term memory: Temporary storage for ongoing conversations</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Long-term memory: Persistent storage for learning and recall</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Tool Use:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Integration with external tools and APIs</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ability to leverage specialized knowledge bases</li></ol><p><strong>Capabilities of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced Problem Solving:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Executing complex tasks efficiently</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Generating project plans, writing code, creating summaries</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Self-Reflection and Improvement:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Analyzing and critiquing their own output</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Continuous enhancement through learning</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-Agent Collaboration:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Interaction and cooperation between multiple agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Division of tasks and specialization</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Environment Interaction:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Web browsing, API usage, physical world interaction (in robotics)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-modal input processing (text, images, sensory data)</li></ol><p><strong>Applications of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Software Development:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Code generation and debugging</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Project planning and management</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Workflow Automation:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task planning and execution in business processes</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Intelligent personal assistants</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Research and Analysis:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Information gathering and synthesis</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Report generation and data analysis</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Customer Service:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced chatbots and virtual assistants</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-step problem resolution</li></ol><p><strong>Frameworks and Tools for LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>LangChain and LangGraph:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open-source frameworks for building LLM applications</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Components for agent creation, memory management, and tool integration</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agentic Search:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Enhanced search capabilities for agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Retrieval of multiple answers in agent-friendly formats</li></ol><p><strong>Challenges and Considerations</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ethical Concerns:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ensuring responsible use of autonomous agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Privacy and data security considerations</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Limitations:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Current constraints in reasoning capabilities</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Need for precise instructions and prompts</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ongoing Research Areas:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Improving long-term memory and learning</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Enhancing multi-modal capabilities</li></ol><p><strong>Conclusion</strong></p><p>LLM agents represent a significant advancement in AI, offering powerful tools for complex problem-solving and automation. As research progresses, we can expect these agents to become increasingly capable and integrated into various aspects of work and daily life.This lecture outline provides a comprehensive overview of LLM agents, covering their core concepts, capabilities, applications, and challenges. It can be expanded with specific examples and case studies to create a full-length lecture on the topic.</p><p><br></p><h3>Benefits and When to Use</h3><p><strong>Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Easy to implement, rapid prototyping, intuitive for guiding LLM behavior.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need quick and simple control over LLM output, when you don't have a large dataset for fine-tuning, or when you want to experiment with different prompts.</li></ol><p><strong>RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Access to external knowledge sources, real-time knowledge updates, expanded knowledge base.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need to provide LLMs with factual information, when you want to leverage external databases or knowledge bases, or when you need to ensure that the LLM's responses are grounded in real-world data.</li></ol><p><strong>Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Improved performance on specific tasks, style and tone customization, reduced prompt length.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need to train an LLM to perform a specific task, when you want to customize the LLM's output style or tone, or when you want to reduce the need for extensive instructions in the prompt.</li></ol><p><strong>Agent:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Advanced problem-solving: LLM agents can handle complex, multi-step tasks efficiently by breaking them down into manageable subtasks.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When tasks require sequential reasoning, planning, and memory. They excel in situations where simple text generation or information retrieval is not sufficient, and more complex problem-solving or decision-making is needed</li></ol>",
          "_id": "68340f6f705ef705389463bd"
        },
        {
          "code": "L104",
          "title": "Introduction to Embeddings",
          "type": "Lesson",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><p>- 掌握Embeddings的基本概念及其在自然语言处理、信息检索等领域的应用</p><p>- 学习如何生成和使用文本嵌入向量表示语义关系</p><p>- 理解不同Embedding模型的工作原理及其对文本表示的影响</p><p>- 提升在实际项目中使用Embeddings进行文本分类、相似性搜索等任务的能力</p><p>知识点介绍</p><p>**Embeddings基础**</p><p>- 了解什么是Embeddings，如何将文本或其他数据转化为向量</p><p>- 学习Embeddings的核心概念，如语义空间和向量表示</p><p>**常见的Embedding模型**</p><p>- 掌握常见的Embedding模型，如Word2Vec、GloVe、BERT等的工作原理</p><p>- 学习如何选择合适的Embedding模型以满足不同的任务需求</p><p>**文本嵌入的生成与应用**</p><p>- 学习如何生成文本嵌入，并应用于相似性搜索、分类和聚类等任务</p><p>- 理解如何通过嵌入向量表示语义相似性，进行语义搜索和推荐</p><p>**模型性能与优化**</p><p>- 探索如何评估和优化Embedding模型的性能，确保其生成的向量具有高语义关联性</p><p>- 学习如何通过微调Embedding模型提升在特定任务中的表现</p><p>**实际应用场景**</p><p>- 了解Embeddings在信息检索、自然语言处理和推荐系统中的应用</p><p>- 探讨如何在项目中应用Embeddings进行高效的文本处理和语义分析</p><p>通过这些知识点，学员将能够理解并应用Embeddings技术，用于各种自然语言处理任务，并通过优化和调优提升模型的表现。</p>",
          "_id": "68340fbe705ef70538946523"
        },
        {
          "code": "L105",
          "title": "Introduction to Retrieval Augmented Generation (RAG)",
          "type": "Lesson",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><p>- 掌握Retrieval Augmented Generation (RAG)的基本概念，理解其在生成式AI中的作用</p><p>- 学习如何通过RAG结合信息检索与生成模型，提高生成内容的相关性和准确性</p><p>- 掌握RAG系统的核心组件，包括文档检索、嵌入生成与生成模型的集成</p><p>- 提升在实际项目中构建和优化RAG系统的能力，满足复杂信息生成需求</p><p>知识点介绍</p><p>**RAG基础概念**</p><p>- 了解RAG的架构和工作原理，学习如何通过文档检索增强生成模型的表现</p><p>- 探索RAG系统中的主要组件：Document Retrieval、Embedding Generation与Generative Models</p><p>**文档检索与生成的集成**</p><p>- 学习如何通过RAG系统结合文档检索和生成模型，提升生成内容的上下文相关性</p><p>- 理解如何在生成过程中动态调用检索信息，确保生成内容的准确性与完整性</p><p>**RAG系统的优化与调优**</p><p>- 学习如何优化RAG系统中的检索和生成流程，提高响应速度和生成质量</p><p>- 掌握如何通过Prompt Engineering和检索策略的调整，提升RAG系统的效果</p><p>**应用场景与案例分析**</p><p>- 探讨RAG在知识问答、文档生成、智能客服等应用中的实际案例</p><p>- 学习如何根据具体业务需求定制RAG系统，提升系统的智能化和用户体验</p><p>通过这些知识点，学员将能够理解并应用Retrieval Augmented Generation (RAG)技术，构建具有高相关性和高准确性的生成系统，并通过优化和调优提升系统性能。</p>",
          "_id": "68341000705ef7053894691b"
        },
        {
          "code": "L106",
          "title": "Building RAG from Scratch in JavaScript",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何使用JavaScript从零开始构建一个完整的Retrieval Augmented Generation (RAG)系统</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解RAG系统的核心组件，包括Information Retrieval、Embeddings和Generative Models</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何将检索模块与生成模块无缝集成，以处理复杂的文本检索和生成任务</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何在JavaScript中优化RAG系统的性能，确保在实际应用中的高效运行</li></ol>",
          "_id": "683410de705ef70538947dbc"
        },
        {
          "code": "L107",
          "title": "Tutorial 19 (Azure AI Preparation)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>课程内容：</p><p>注册Azure账号，开通Speech Service，开通OpenAI API</p><p>具体任务：</p><p>学员在导师指导下注册Azure账号，</p><p><a href=\"https://azure.microsoft.com/en-au/free/ai-services\" rel=\"noopener noreferrer\" target=\"_blank\">https://azure.microsoft.com/en-au/free/ai-services</a></p><p>开通Speech Service</p><p><a href=\"https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices\" rel=\"noopener noreferrer\" target=\"_blank\">https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices</a></p><p>入口文档</p><p><a href=\"https://learn.microsoft.com/en-au/azure/ai-services/speech-service/overview#try-the-speech-service-for-free\" rel=\"noopener noreferrer\" target=\"_blank\">https://learn.microsoft.com/en-au/azure/ai-services/speech-service/overview#try-the-speech-service-for-free</a></p><p>开通Open AI API</p><p><a href=\"https://platform.openai.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://platform.openai.com</a></p><p><a href=\"https://chatgpt.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://chatgpt.com</a></p>",
          "_id": "69e329549f9cc30e741970c3"
        },
        {
          "code": "L108",
          "title": "Azure AI Service和TTS",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>微软云Azure AI Service 提前注册</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Icebreaking，导师自我介绍，学员自我介绍</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI 简介</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么葫芦里的什么药</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么药（是什么，能干什么）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么葫芦（几种实现技术）</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>传统算法</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深度学习</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>机器学习</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大语言模型（机器学习的一种分支）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI相关的几个典型岗位</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Algorithm Engineer (算法工程师 - 大牛)</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hyperparameter tuning engineer （调参侠）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Prompt Engineer （提示工程师 - 调整优化提示）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Application Engineer (应用工程师 - 大部分的程序员， 调用AI的API实现商业价值)</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI在澳洲的企业应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus的应用案例</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus 机器人</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus 数字人</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Service NSW的应用案例</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>客户输入自然语言的理解</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>语言之间的翻译</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure AI Service 的简要介绍</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure是什么？Azure有什么？</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure AI Service 是什么？有什么？</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示Azure Protal</li></ol><p><strong>课堂实操练习</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在Azure Portal上面体验文字转语音和语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登陆Azure Portal</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>进入Speech Studio</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作文字转语音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作上传语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作用麦克风录入语音转文字</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，用React写一个最简单的文字转语音（TTS - Text To Speech）Web应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读练习说明，写一个form，包括 input，和 submit，输入文字，用window.speechSynthesis控件播放语音</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>===============中场休息10分钟==============</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure API 介绍</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure API 怎么读</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，用React写一个最简单的语音转文字（STT - Speech To Text）Web应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个form，包括三个按钮：开始录音，暂停录音，停止录音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用microsoft-cognitiveservices-speech-sdk实现实时语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个文本显示框，显示转换之后的文字</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 - 练习2 和 练习3 的局限和潜在风险</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用云AI服务的text to speech 对比 直接用浏览器自带的text to speech 空间的好处和坏处是什么，不同的应用场景</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习3的实际应用中一个重要安全性问题 - 你的API Key会暴露在客户端</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍另一种验证方式：Token</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>引入后端，跟随练习说明，用.net写一个获取token的后端</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化一个Web API</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置好Web API</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个controller，提供一个API /api/VoiceController/get-speech-token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在这个controller里面调用Azure cognitive 服务获取token并作为Response返回</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 - 本次课堂体验小结</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现效果<img src=\"data:image/png;base64,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aA11Gp2NE8Mph9vALmo2C0vG21kZfiPvG6F7VxZhTRv7eP9l3ySCBzrIciMCIiACIiACIiACIiACIiACIhAEOmEbIjUEcB39jfKaV9pQFhHgImRtGy3r6tbreBo4/lHmApcGmCO4fWXLbE5VOHRbiWADpCQCIiACIiACIiACIiACIiACIjAcgRSdfY9ducvaVpxiF8IZ5Upk10uKGCY/mpC64QHr/Lkl1C6CF1tftDbFofcnETzKUlsiIAIiIAIiIAIiIAIiIAIiIALLJjAa9U2BG1FbD9h6D1FONiVtEcelf8RwyNlSgGWa9tq4hdWlgPa+rNBFMpWmjimTCHZSWoiACIiACIiACIiACIiACIiACAxHwKRnmYKMwI18qtciazs1a92m1GWN8o1tVl3MN0YXVWlfjdj80QM19Mc//qPU+y/9SQRXzJQVAREQAREQAREQAREQAREQAREYggBy1D4uPEOwki3a1kUpFqQUy2HlJd4O+9Ct1GBdLLxhtV3KXfiWDjLCnGsfirvW26HBoCQCIiACIiACIiACIiACIiACIjAggVa89kQpQhZhyocqPiFUe/HeUofsDRfkaOdL8xLbXkDWa2PpGpmsNQy7aONFtlAkGBJKIiACIiACIiACIiACIiACIiACgxGI6G4rR02Pmhy1T0ZmU9giajOfnacN23jAJlL4cGFbhK83dmXslmYWsteXXcPo32opWl28aSUCIiACIiACIiACIiACIiACIiACgxPwqC9ei3ANgYwgjWd1a9HrZq6KW+VrRXUei2gbORPW9i99zrnwzWeAw4LmbuObejFWoaKVCIiACIiACIiACIiACIiACIjAUARc2Bbt6gLVhW2Gb5nW3BfAtdDNPJFfIsW0y7aRjXgvo+0EMK2w5d/8XProytKHpkPDTUkEREAEREAEREAEREAEREAERGAwAiF8w11EekOUennRp4STE7sAACIMSURBVCmEsepEbWwR0KU+1uGntiGym8nt2MC4lIdwtk3TznX/qGqJYGApiYAIiIAIiIAIiIAIiIAIiIAIDEgAQRrRWwRp6NMQqV7j0d0UqCldqSFFdLcVsi5skb2IYrNxsy4y3ObcJ9OjMUlftoEQrsokgg2GkgiIgAiIgAiIgAiIgAiIgAiIwJAEQppGFNZ0KAK1iNQUt614bbvNEluXEHBo5a58xYqQsFkSTS1GHIberm7T9l/FmiWCW+DKiIAIiIAIiIAIiIAIiIAIiIAIDEGgFZ8pTotTyqNuJFa7U5cZ7PUIstWGyM14bhXlxR//imh2oe1mYUO7eho14loieCfcKhABERABERABERABERABERABERiGQBGoODMB2mni0VhuTFjOHruXXYU9PrKO2c0x5dlLXOTWkWYrzU5sHaJ7zk3dhZVJBHcslRMBERABERABERABERABERABERiAQOpQl6ypd12UFsFa+minMZuw7VKI1/qx3q7OcpVpCuKILltdGxGmRYrpaJARYYlg2CiJgAiIgAiIgAiIgAiIgAiIgAgMR6CK3KZqRagieiM62+VDrNZdU2fbrl2LgI2VB4zDT9jPzc9Vmtg6pWFl60Lat33StDdaXXelvAiIgAiIgAiIgAiIgAiIgAiIgAgsm4Cr2J29pBCmhnykEMYhkEuRKdmoZyoz+TTNeG5pWfpZYQYmnXGaDtp1RouLgtZ06JaMMiIgAiIgAiIgAiIgAiIgAiIgAruMgL+kykQr4rYWw9Fhit5Ox8ZU6Qzr5rBM5PJfLXZdAGe9V9tG1w55THL5bP1rOrTj0EIEREAEREAEREAEREAEREAERGBoAiFWu+jszuK36zFEr4nVIpRHo7r4CGEbMV8kbUR+03tGfFv5S3URwG0vJpglglsayoiACIiACIiACIiACIiACIiACAxJoI7mThLAZUZz0bxIWp/YnJo3ng9uBxXitxW31jhF73xjzwcjoNPWMl1tEcRWLxGcgLQWAREQAREQAREQAREQAREQARHYDQRCpuaU5pzZHGKWpX1SGdtW1EftvL0IK1Qv06fjp4+6AYdNt42rLGulsUTwCCBtiIAIiIAIiIAIiIAIiIAIiIAIDEIAkRtCtxOgHo/1CG100U2BpoaUtrRNDUtZlLf2mLYCl41+CvtWKFe2igT3WWlbBERABERABERABERABERABERg2QQQrCFaIxpLPoStbZe6nCKdUWGrsH5T8NZDsPIICWe1VYbf2irytC99pI219anRtpYI3pmYSkRABERABERABERABERABERABJZBoBW1LlxD1LburKyLEFPX1WektyryZh7Idc3LM7/xL9t1rXHFFoZRimU/SQT3iWhbBERABERABERABERABERABERgWQRctOKhU68ufF3ktpVugFH5pDgmilv0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YtcFcNZ7tW107ZDHJJfP1r+mQzsOLURABERABERABERABERABERABIYmEGK1i87uLH67HkP0mlgtQnk0qouPELYR80XSRuQ3vWfEt5W/VBcB3PZiglkiuKWhjAiIgAiIgAiIgAiIgAiIgAiIwJAE6mjuJAFcZjQXzYuk9YnNqXnj+eB2UCF+W3FrjVP0zjf2fDACOm0t09UWQWz1EsEJSGsREAEREAEREAEREAEREAEREIHdQCBkak5pzpnNIWZZ2ieVsW1FfdTO24uwQvUyfTp++qgbcNh027jKslYaSwSPANKGCIiACIiACIiACIiACIiACIjAIAQQuSF0OwHq8ViP0EYX3RRoakhpS9vUsJRFeWuPaStw2einsG+FcmWrSHCflbZFQAREQAREQAREQAREQAREQASWTQDBGqI1orHkQ9jadqnLKdIZFbYK6zcFbz0EK4+QcFZbZfitrSJP+9JH2lhbnxpta4ngnYmpRAREQAREQAREQAREQAREQAREYBkEWlHrwjVEbevOyroIMXVdfUZ6qyJv5oFc17w88xv/sl3XGldsYRilWPaTRHCfiLZFQAREQAREQAREQAREQAREQASWRcBFKx469erC10VuW+kGGJVPimOiuEXPFg3r2hbzImrrF161wplq8925L9HfUu6C2ColggGiJAIiIAIiIAIiIAIiIAIiIAIiMCABhC0phW288dkjwKZoU6iybp/bbSO4Ec11m1ikK1+7AEYnFydt1DmsQmy7ii6SGXepom29uthpJQIiIAIiIAIiIAIiIAIiIAIiIAKDEECYhkatIrMIV/PudZbrxGvYhE7FIm0QsbwBOsrcIUa26W1DK7sYbn3RL77biDHN2S5921qRYIOgJAIiIAIiIAIiIAIiIAIiIAIiMByBFMB4RKCmSM015RnJZR3lSNVILnttETZdeQpgLy/auPbplqUc8Usi0uw2CGj7SAQHYy1FQAREQAREQAREQAREQAREQAQGIoDezIRgddFqhehS8ojSFK+xRrCmaLXGlg0fUWZbVp9OqcQk6tx36azNu2mxL/37luUlgvPIaC0CIiACIiACIiACIiACIiACIjAIgRCjRYRWipgsopf6FKyWHUl1+ahAxpBP+M0pzymm3Un2hdPSfbvGwOolgp2UFiIgAiIgAiIgAiIgAiIgAiIgAkMRGBGmReWiSVPg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hlGKZT9JBPeJaFsEREAEREAEREAEREAEREAERGBZBFy04qFTry58XeS2lW6AUfmkOCaKW/Rs0bCubTEvorZ+4VUrnKk23537Ev0t5S6IrVIiGCBKIiACIiACIiACIiACIiACIiACAxJA2JJS2MYbnz0CbIo2hSrr9rndNoIb0Vy3iUW68rULYHRycdJGncMqxLar6CKZcZcq2tari51WIiACIiACIiACIiACIiACIiACIjAIAYRpaNQqMotwNe9eZ7lOvIZN6FQs0gYRyxugo8wdYmSb3ja0sovh1hf94ruNGNOc7dK3rRUJNghKIiACIiACIiACIiACIiACIiACwxFIAYxHBGqK1FxTnpFc1lGOVI3kstcWYdOVpwD28qKNa59uWcoRvyQizW6DgLaPRHAw1lIEREAEREAEREAEREAEREAERGAgAujNTAhWF61WiC4ljyhN8RprBGuKVmts2fARZbZl9emUSkyizn2Xztq8mxb70r9vWV4iOI+M1iIgAiIgAiIgAiIgAiIgAiIgAoMQCDFaRGiliMkieqlPwWrZkVSXjwpkDPmE35zynGLanWRfOC3dt2sMrF4i2ElpIQIiIAIiIAIiIAIiIAIiIAIiMBSBEWFaVC6aNAUuCrWzSRWcqtUMS7YTyBTkJ5757XzVfl3nlgUdlo+tSLSRCA4WWoqACIiACIiACIiACIiACIiACAxEIARqiFvELp9atIY6jc7GieGUw21gFzWbhSXj7awMv5H3jdC9K4uwpo19vP+ybxLBAx1kuREBERABERABERABERABERABEQgCnbANkRoCuI7+RnnNK20oiwhwEbK2jZZ1det1PA0c/yhzgUsDzBHcvrJlNqcqHLqtRLABUhIBERABERABERABERABERABERiOQIrOvseu3GVtK06xC+GMciWy6yVFDJMfTUjd8IB1iQSjel3wYoufIp490/UnEexotBABERABERABERABERABERABERiOwGjUNwVuRG09YOtdRTnZlLRFrJaBIIZDzpYCLNO018YtrC4FtPdlhS6SqSzTpiWCnZQWIiACIiACIiACIiACIiACIiACwxEw6VmmICNwI5/qtcjaTs1atyl1WaN8Y5tVF/ON0UVV2lcjNn/0QA398Y//KPX+S38SwRUzZUVABERABERABERABERABERABIYggBy1jwvPEKxki7Z1UYoFKcVyWHmJt8M+dCs1WBcLb1htl3IXvqWDjDDn2ofirvV2aDAoiYAIiIAIiIAIiIAIiIAIiIAIDEigFa89UYqQRZj6VGXTtFSHUO3Fe0sdsjdckKOdL81LbHsBWa+NpWtkstYw7KKNF9lCkWBIKImACIiACIiACIiACIiACIiACAxGIKK7rRz1aC9lGZlNYYuozXx2njZs4yEENVsmaVPYFuHrjV0Zu2XY5LJrWNqFr9W4UhIBERABERABERABERABERABERCBXUHAo744LsI1BDKCNJ7VrUWvm7kq7gR0SOHRkXVtTFjbv/Q558I3nwEubcyV2/jmvCLBoyi1JQIiIAIiIAIiIAIiIAIiIAIisFwCLlKLjnWB6sI2w7dMa+4L4HGil8gvkWLaZdvI5jRn5G0KYDyQ59/8XOcvy9KHpkMv9+iqvQiIgAiIgAiIgAiIgAiIgAiIwAgBF6ZFt0bUNkSplxd9mkKYhp2ojS0CutTHOlzXNkR2M7kdGxiXcu+HMhtD3T+qWiIYMEoiIAIiIAIiIAIiIAIiIAIiIAIDEkCQhgpGkIY+DZHqNR7dTYGa0pUaUkR3WyHrwhbZiyg2GzfrIsNtzn0yPRqT9GUbCOGqTCLYYCiJgAiIgAiIgAiIgAiIgAiIgAgMSSCkaURhTYciUItITXHbite22yyxdQkBh1buylesCAmbJdHUYsRh6O3qNm3/VaxZIrgFrowIiIAIiIAIiIAIiIAIiIAIiMAQBFrxmeK0OKU86kZitTt1mcFejyBbbYjcjOdWUV788a+IZhfabhY2tKunUSOuJYJ3wq0CERABERABERABERABERABERCBYQgUgYozE6CdJh6N5caE5eyxe9lV2OMj65jdHFOevcRFbh1pttLsxNYhuufc1F1YmURwx1I5ERABERABERABERABERABERCBAQikDnXJmnrXRWkRrKWPdhqzCdsuhXitH+vt6ixXmaYgjuiy1bURYVqkmI4GGRGWCIaNkgiIgAiIgAiIgAiIgAiIgAiIwHAEqshtqlaEKqI3orNdPsRq3TV1tu3atQjYWHnAOPyE/dz8XKWJrVMaVrYupH3bJ017o9V1V8qLgAiIgAiIgAiIgAiIgAiIgAiIwLIJuIrd2UsKYWrIRwphHAK5FJmSjXqmMpNP04znlpalnxVmYNIZp+mgXWe0uChoTYduySgjAiIgAiIgAiIgAiIgAiIgAiKwywj4S6pMtCJuazEcHabo7XRsTJXOsG4Oy0Qu/9Vi1wVw1nu1bXTtkMckl8/Wv6ZDOw4tREAEREAEREAEREAEREAEREAEhiYQYrWLzu4sfrseQ/SaWC1CeTSqi48QthHzRdJG5De9Z8S3lb9UFwHc9mKCWSK4paGMCIiACIiACIiACIiACIiACIjAkATqaO4kAVxmNBfNi6T1ic2peeP54HZQIX5bcWuNU/TON/Z8MAI6bS3T1RZBbPUSwQlIaxEQAREQAREQAREQAREQAREQgd1AIGRqTmnOmc0hZlnaJ5WxbUV91M7bi7BC9TJ9On76qBtw2HTbuMqyVhpLBI8A0oYIiIAIiIAIiIAIiIAIiIAIiMAgBBC5IXQ7AerxWI/QRhfdFGhqSGlL29SwlEV5a49pK3DZ6Kewb4VyZatIcJ+VtkVABERABERABERABERABERABJZNAMEaojWiseRD2Np2qcsp0hkVtgrrNwVvPQQrj5BwVltl+K2tIk/70kfaWFufGm1rieCdialEBERABERABERABERABERABERgGQRaUevCNURt687KuggxdV19RnqrIm/mgVzXvDzzG/+yXdcaV2xhGKVY9pNEcJ+ItkVABERABERABERABERABERABJZFwEUrHjr16sLXRW5b6QYYlU+KY6K4Rc8WDevaFvMiausXXrXCmWrz3bkv0d9S7oLYKiWCAaIkAiIgAiIgAiIgAiIgAiIgAiIwIAGELSmFbbzx2SPApmhTqLJun9ttI7gRzXWbWKQrX7sARicXJ23UOaxCbLuKLpIZd6mibb262GklAiIgAiIgAiIgAiIgAiIgAiIgAoMQQJiGRq0iswhX8+51luvEa9iETsUibRCxvAE6ytwhRrbpbUMruxhufdEvvtuIMc3ZLn3bWpFgg6AkAiIgAiIgAiIgAiIgAiIgAiIwHIEUwHhEoKZIzTXlGcllHeVI1Ugue20RNl15CmAvL9q49umWpRzxSyLS7DYIaPtIBAdjLUVABERABERABERABERABERABAYigN7MhGB10WqF6FLyiNIUr7FGsKZotcaWDR9RZltWn06pxCTq3HfprM27abEv/fuW5SWC88hoLQIiIAIiIAIiIAIiIAIiIAIiMAiBEKNFhFaKmCyil/oUrJYdSXX5qEDGkE/4zSnPKabdSfaF09J9u8bA6iWCnZQWIiACIiACIiACIiACIiACIiACQxEYEaZF5aJJU+CiUDubVMGpWs2wZDuBTEF+4pnfzlft13VuWdBh+diKRBuJ4GChpQiIgAiIgAiIgAiIgAiIgAiIwEAEQqCGuEXs8qlFa6jT6GycGE453AZ2UbNZWDLezsrwG3nfCN27sghr2tjH+y/7JhE80EGWGxEQAREQAREQAREQAREQAREQgSDQCdsQqSGA6+hvlNe80oayiAAXIWvbaFlXt17H08DxjzIXuDTAHMHtK1tmc6rCodtKBBsgJREQAREQAREQAREQAREQAREQgeEIpOjse+zKXda24hS7EM4oVyK7XlLEMPnRhNQND1iXSDCq1wUvtvgp4tkzXX8SwY5GCxEQAREQAREQAREQAREQAREQgeEIjEZ9U+BG1NYDtt5VlJNNSVvEahkIYjjkbCnAMk17bdzC6lJAe19W6CKZyjJtWiLYSWkhAiIgAiIgAiIgAiIgAiIgAiIwHAGTnmUKMgI38qlei6zt1Kx1m1KXNco3tll1Md8YXVSlfTVi80cP1NAf//iPUu+/9Pf/AwHKrwI0NGrmAAAAAElFTkSuQmCC\"></li></ol>",
          "_id": "6834079e705ef7053893368e"
        },
        {
          "code": "L109",
          "title": "Integrate Azure AI Service and Streaming",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>完成课程Azure AI Service和TTS</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Warmup，回顾上一节的练习和下一步练习</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾后端获取短期token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>下一步：前端用token通过Stream 模式和AI Service通讯，</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，写一个React App，调用后端获取token， 并进行Stream实现TTS和STT</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用上面的后端获取token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从麦克风录音转换成文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传文件转换成文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文字阅读（文字转语音）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文字阅读的暂停和继续</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现STT和TTS - Pros &amp; Cons ？</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论：继续优化Azure AI（1）练习的安全性</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明更新上一节的 .net 后端应用，提供一个API，接受一个音频文件，调用Azure AI转化成文字，并作为Reponse 返回 -</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>增加一个API endpoint /api/VoiceController/upload 接受一个webm文件</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>保存文件并转换成wav</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用SpeechRecognizer 把文件传至Azure识别出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习解释： 为什么要转换成wav ？</li></ol><p>===============中场休息10分钟==============</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>更新上一节的 React 前端，把录到的语音传给上面的API，获取文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用react-mic录音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传文件</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure Speech Translation （语音翻译）介绍</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：在Azure Portal 上体验翻译功能</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：基于上一个练习增加一个API，实现语音翻译成文字功能</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：基于上一个练习的前端，增加一个按钮，调用新增的翻译API，实现语音翻译成文字功能</li></ol><p>讨论：回顾这两天Azure AI的使用体验</p>",
          "_id": "6834079e705ef7053893368f"
        },
        {
          "code": "L110",
          "title": "Integrate Azure AI and OpenAI",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>完成课程 Integrate Azure AI Service and Streaming</p><p>已注册ChatGPT/Open AI并开通Open AI API服务 （需要预存5美金）</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上次课程（Azure语音转文字和翻译）的回顾</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Generative AI</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>几个最常见的Generative AI产品</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ChatGPT 和 Open AI 简介</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ChatGPT vs OpenAI</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open AI API 简介 及其 价钱</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open AI Platform</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Assistant</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Playground</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Other</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在澳洲企业的实际应用案例 （如何玩转Prompt）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Employment Hero - 简历阅读和评判</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Service NSW - ChatGPT 与 Azure CLU的PK</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：Open AI API 初体验 - Open AI Playground 的体验</li></ol><p>=============中场休息10分钟===============</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基于上一章练习（Azure AI 2）的后端应用，改动后端API，提供同样的语音转文字功能，但背后调用的是Open AI，而不是Azure AI</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用Open AI 的 Rest API 把文件传至OpenAI识别出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>整合上一节应用的前端测试（原则上前端无任何改动，实际上需要有一处小改动）</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基于上一节的后端应用，改动后端API，提供翻译功能</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用Open AI 的 Rest API 把文件传至OpenAI翻译出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>前端不需要改动，测试</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>做一个chatgpt的马甲：基于上一节的后端应用实现语音输入，文字回答</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示：在自己的机器上装一个ChatGPT的大语言模型：Ollama</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI 体验的小结和讨论</li></ol>",
          "_id": "683411b9705ef70538948822"
        },
        {
          "code": "L111",
          "title": "Project Management Workshop",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Project Management Workshop</p>",
          "_id": "69e329559f9cc30e74197138"
        },
        {
          "code": "L112",
          "title": "Workshop：前端技术干货分享",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop：前端技术干货分享</p>",
          "_id": "69e329719f9cc30e7419787d"
        },
        {
          "code": "L113",
          "title": "Workshop：如何使用最新AI工具高效编程",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop：如何使用最新AI工具高效编程</p>",
          "_id": "69e329729f9cc30e741978d7"
        },
        {
          "code": "L114",
          "title": "5分钟手动部署Web Application 到 AWS S3 静态网站",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前端App部署基础</strong></p>\n<ul>\n<li class=\"ql-indent-1\">介绍如何准备前端应用以便于部署。</li>\n<li class=\"ql-indent-1\">指导如何选择合适的部署平台和服务。</li>\n</ul>\n<p><strong>创建AWS S3 Bucket</strong></p>\n<ul>\n<li class=\"ql-indent-1\">逐步演示如何在AWS S3中创建一个新的Bucket。</li>\n<li class=\"ql-indent-1\">讨论Bucket命名规则和配置选项。</li>\n</ul>\n<p><strong>编写Bucket策略</strong></p>\n<ul>\n<li class=\"ql-indent-1\">学习如何为Bucket编写安全策略。</li>\n<li class=\"ql-indent-1\">分析策略语法和关键要素。</li>\n</ul>\n<p><strong>Bucket的日常操作</strong></p>\n<ul>\n<li class=\"ql-indent-1\">演示如何上传、下载和管理Bucket中的文件。</li>\n<li class=\"ql-indent-1\">探索如何监控和维护Bucket。</li>\n</ul>",
          "_id": "69e329559f9cc30e7419713d"
        },
        {
          "code": "L115",
          "title": "GraphQL 101: 剥离RESTful的银行系统开发实践—Gary Sun",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Gary</p>\n<p>内容：</p>\n<p><strong>RESTFul与GraphQL对比</strong></p>\n<ul>\n<li>探讨两种API设计范式的优缺点。</li>\n<li>分析何时使用RESTFul，何时更适合选择GraphQL。</li>\n</ul>\n<p><strong>GraphQL的核心概念</strong></p>\n<ul>\n<li>详细介绍GraphQL的工作原理和主要特性。</li>\n<li>讨论GraphQL如何改善数据获取和管理。</li>\n</ul>\n<p><strong>GraphQL查询语言</strong></p>\n<ul>\n<li>学习如何构建高效的查询，获取精确的数据。</li>\n<li>实践GraphQL的强大灵活性，适应复杂的应用需求。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "69e329559f9cc30e74197142"
        },
        {
          "code": "L116",
          "title": "AWS Lambda 基础知识",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Shaun</p>\n<p>内容：</p>\n<p>1. Serverles 基础概念</p>\n<p>2. Faas 基础概念 Function-as-a-Service 概念</p>\n<p>3. Lambda 如何使用，Lambda 的特点，优缺点</p>\n<p>4. Lambda 在匠人学院 App 里的使用</p>\n<p>5. 简单的 Lambda Demo</p>",
          "_id": "69e329559f9cc30e7419715a"
        },
        {
          "code": "L117",
          "title": "Docker  Introduction",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Docker 视频学习： <a href=\"https://youtu.be/gAkwW2tuIqE\" target=\"_blank\" rel=\"noopener noreferrer\">https://youtu.be/gAkwW2tuIqE</a></p>\n<p><strong>本节知识点：</strong></p>\n<ol>\n<li>docker 原理与介绍</li>\n<li>docker 命令行与 gui 的使用</li>\n<li>docker 中的端口映射，以及外部调用</li>\n<li>如何通过 docker 打包我们的项目</li>\n<li>docker compose 一键启动本地开发环境</li>\n</ol>\n<p>&nbsp;</p>",
          "_id": "6834079e705ef70538933688"
        },
        {
          "code": "L118",
          "title": "SpringBoot的Production部署到AWS ECS Fargate，如何使用Microservice with docker",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: Xiaokai &amp; Yinhang</p>\n<p>内容：</p>\n<ul>\n<li>Springboot 的 Docker 部署到 AWS</li>\n<li>ECS AWS</li>\n<li>ECS 如何进行 CICD</li>\n<li>Task 是什么，如何使用</li>\n<li>VPC 是什么</li>\n<li>Subnet 是什么，如何使用</li>\n<li>Microservice 是什么</li>\n</ul>",
          "_id": "6834079e705ef70538933694"
        },
        {
          "code": "L119",
          "title": "Workshop: 持续集成(CI)/持续部署(CD)的概念以及Jenkins的使用",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Roger</p>\n<p>内容：</p>\n<ul>\n<li>持续集成(CI)/持续部署(CD)的概念</li>\n<li>Jenkins 如何一步一步部署上的</li>\n<li>Jenkins 的 Docker Image 如何部署的</li>\n<li>如何实现 Nodejs 后端的自动化部署</li>\n<li>如何实现 React 前端的自动化部署</li>\n</ul>",
          "_id": "6834079e705ef70538933695"
        },
        {
          "code": "L120",
          "title": "CI CD基础 使用Jenkins和AWS CodePipeline 手把手部署一个Web App",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p>\n<p>内容：</p>\n<p>1. Jenkins和AWS Codedeploy的区别是什么，有什么优点好处</p>\n<p>2. 代码里的Jenkinsfile逐行解读</p>\n<p>3. Jenkins如何开一个新的pipeline部署到Branch上</p>\n<p>4. 如何使用AWS CodePipeline部署</p>",
          "_id": "69e329569f9cc30e74197170"
        },
        {
          "code": "L121",
          "title": "Open AI Huggingface讲解 - Guang",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>OpenAI概览</strong></p>\n<ul>\n<li>介绍OpenAI的发展历程、愿景和主要成果。</li>\n</ul>\n<p><strong>提示词工程与高级使用</strong></p>\n<ul>\n<li>探讨如何精准地使用提示词来提高模型的效果。</li>\n<li>分析高级应用技巧和策略。</li>\n</ul>\n<p><strong>OpenAI的其他模型</strong></p>\n<ul>\n<li>了解OpenAI提供的各种AI模型及其特点和用途。</li>\n</ul>\n<p><strong>开源AI模型对比</strong></p>\n<ul>\n<li>探讨与OpenAI相似的开源模型，比较它们的优势和局限。</li>\n</ul>\n<p><strong>产品和运维中的应用</strong></p>\n<ul>\n<li>分析OpenAI在实际产品开发和运维中的应用案例。</li>\n<li>探索如何将AI模型融入生产实践。</li>\n</ul>",
          "_id": "6834079e705ef70538933697"
        },
        {
          "code": "L122",
          "title": "用 Kafka 实践 Event First 设计思维—虎头锤",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 虎头锤</p>\n<p>内容:</p>\n<p><strong>Kafka简介</strong></p>\n<ul>\n<li>介绍Kafka的功能和在现代数据处理中的重要性。</li>\n<li>讨论Kafka的主要组件，包括生产者、消费者、主题和分区。</li>\n</ul>\n<p><strong>Event First设计</strong></p>\n<ul>\n<li>解析Event First设计方法的原则和优势。</li>\n<li>分析如何使用Kafka构建事件驱动的系统架构。</li>\n</ul>\n<p><strong>Kafka实战应用</strong></p>\n<ul>\n<li>演示如何设置和配置Kafka环境。</li>\n<li>指导如何创建Kafka主题，发送和接收消息。</li>\n</ul>",
          "_id": "69e329579f9cc30e74197185"
        },
        {
          "code": "L123",
          "title": "如何准备澳洲大厂开发类岗位面试",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>老师：Xuecong，就职于悉尼 AWS，SDE</p><p>内容：</p><p>1. 澳洲大厂开发类岗位面试常见流程</p><p>2. 如何‘管理'整个面试流程</p><p>3. 如何准备面试申请</p><p>4. 准备面试，哪些专业能力需要提高</p><p>5. 如何准备大厂面试，体现价值观和企业文化</p><p>6. 面试当天注意事项</p><p>7. 如何接受，拒绝，协商 Offer</p>",
          "_id": "6834079e705ef705389336a3"
        },
        {
          "code": "L124",
          "title": "求职国内秋招大厂前端开发岗，需要做哪些准备",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p><p>内容：</p><ul><li>国内大厂前端岗位如何细分？</li><li>获得前端岗位 Offer 所需的几大要素</li><li>如何准备面试中的八股文、算法等硬核考点？</li><li>怎样的实习经历可以让你在校招求职中脱颖而出？</li></ul>",
          "_id": "6834079e705ef705389336a4"
        },
        {
          "code": "L125",
          "title": "如何准备国内秋招，才能获得大厂 Offer?",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Chen</p><p>内容：</p><p><strong>秋招时间规划</strong></p><ul><li>解析秋招的主要时间节点，帮助你合理安排准备时间。</li><li>讨论如何在学习、实习和求职之间平衡。</li></ul><p><strong>准备秋招的步骤</strong></p><ul><li>提供详细的秋招准备指南，包括市场调研、目标公司筛选等。</li><li>强调技能提升和实战经验积累的重要性。</li></ul><p><strong>笔试准备技巧</strong></p><ul><li>分析常见的笔试题型和应对策略。</li><li>提供实用的学习资源和练习方法。</li></ul><p><strong>面试技巧训练</strong></p><ul><li>探讨如何在面试中有效展现你的能力和潜力。</li><li>分享面试中的常见问题和最佳回答技巧。</li></ul><p><br></p>",
          "_id": "69e329579f9cc30e7419719c"
        },
        {
          "code": "L126",
          "title": "在澳洲如何找到一份Java Developer的工作 -- 虎头锤",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：虎头锤</p>\n<p>内容:</p>\n<p><strong>澳洲Java工作市场分析</strong></p>\n<ul>\n<li>探索澳洲Java开发岗位的市场需求和主要工作要求。</li>\n<li>分析技术技能和行业经验在职场中的重要性。</li>\n</ul>\n<p><strong>回答行为面试问题</strong></p>\n<ul>\n<li>提供实用的策略和技巧，帮助你准备和回答行为面试中的问题。</li>\n<li>分析常见的行为问题及其背后的意图。</li>\n</ul>\n<p><strong>简历撰写和个人品牌打造</strong></p>\n<ul>\n<li>教你如何撰写一份突出你技能和经验的简历。</li>\n<li>讨论如何在简历中有效地展示你的项目经验和技术能力。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "6834079e705ef705389336a6"
        },
        {
          "code": "L127",
          "title": "澳洲程序员找工作必备哪些后端知识",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 老虎</p>\n<p>内容:</p>\n<p><strong>澳洲后端开发者必备知识</strong></p>\n<ul>\n<li>分析澳洲后端开发职位的常见要求和技能需求。</li>\n<li>探讨关键的编程语言（如Java、Python、Node.js）和框架。</li>\n</ul>\n<p><strong>数据库技能</strong></p>\n<ul>\n<li>介绍常用的数据库技术，包括关系型数据库（如MySQL、PostgreSQL）和非关系型数据库（如MongoDB）。</li>\n</ul>\n<p><strong>API开发与RESTful服务</strong></p>\n<ul>\n<li>学习如何设计和实现高效的RESTful API。</li>\n</ul>\n<p><strong>版本控制和代码协作</strong></p>\n<ul>\n<li>强调Git等版本控制系统的重要性，并探索代码协作的最佳实践。</li>\n</ul>\n<p><strong>云服务和容器化技术</strong></p>\n<ul>\n<li>介绍云计算服务（如AWS、Azure）和容器技术（如Docker、Kubernetes）。</li>\n</ul>\n<p><strong>软件工程最佳实践</strong></p>\n<ul>\n<li>探讨如何编写可维护、高效的代码，以及软件测试和持续集成的重要性。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "6834079e705ef705389336a7"
        },
        {
          "code": "L128",
          "title": "在澳洲，IT学生如何准备System Design面试-----Ben",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Ben</p><p>内容：</p><p><strong>系统设计面试的基本功</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>概念理解</strong>：讲解系统设计面试中经常涉及的关键概念，如可扩展性、可靠性、效率等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>技能要点</strong>：强调分析问题、沟通思路、考虑权衡的重要性，并提供实用技巧帮助你在面试中脱颖而出。</li></ol><p><strong>面试准备方法</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>资源梳理</strong>：介绍高质量的学习资源和实践工具，帮助你系统地准备系统设计面试。</li></ol><p><strong>Monolith架构解析</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>定义和特点</strong>：详细解释Monolith（单体架构）的概念，并探讨其优缺点。</li></ol><p><strong>Microservice架构探索</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>核心理念</strong>：深入讲解Microservice（微服务架构）的基本原则和结构。</li></ol>",
          "_id": "6834079e705ef705389336a8"
        },
        {
          "code": "L129",
          "title": "从0到1打造React/Node 全栈IoT实时应用——Bryan",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>主讲人：Bryan</p><p>内容 ：</p><p><strong>IoT概览</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍IoT的定义、发展历程和关键技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析IoT在不同行业中的应用案例。</li></ol><p><strong>IoT架构与最佳实践</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论IoT系统的典型架构和组件。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索IoT项目的设计原则和最佳实践。</li></ol><p><strong>实时应用与技术栈</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解析构建IoT实时应用的技术栈和框架。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析物联网的数据处理和通信技术。</li></ol><p><strong>案例研究和演示</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过具体的项目示例展示IoT技术的应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何实现IoT解决方案，并讨论其实际效果。</li></ol>",
          "_id": "6834079e705ef705389336a9"
        },
        {
          "code": "L130",
          "title": "Google大佬教你，如何突破年薪20w澳币天花板 -- 韭天",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 韭天</p>\n<p>内容:</p>\n<p><strong>薪资的组成</strong></p>\n<ul>\n<li>深入了解薪资的不同组成部分，包括基本工资、奖金、福利等。</li>\n</ul>\n<p><strong>提升薪资的方法</strong></p>\n<ul>\n<li>探讨如何通过技能提升、职位晋升等方式增加薪资。</li>\n<li>分析职业发展中关键的技能和资格认证。</li>\n</ul>\n<p><strong>优质雇主的选择</strong></p>\n<ul>\n<li>比较不同类型的公司及其提供的薪资水平。</li>\n<li>讨论如何选择能够提供更好薪资和职业发展机会的公司。</li>\n</ul>\n<p><strong>职业生涯规划</strong></p>\n<ul>\n<li>指导如何根据个人目标和市场趋势规划职业生涯。</li>\n<li>分析长期职业规划对薪资和职业满意度的影响。</li>\n</ul>\n<p>&nbsp;</p>",
          "_id": "6834079e705ef705389336aa"
        },
        {
          "code": "L131",
          "title": "Elastic Search基础知识分享Workshop",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p>\n<p>内容：</p>\n<ol>\n<li>Logging Saas 服务商横向比较：Elastic Search，Splunk，Sumo Logic，Datadog，New Relic 等</li>\n<li>Elastic Search 是什么，Elastic 的优势是什么</li>\n<li>Elastic Search 架构 Log，Beats，Logstash，Elasticsearch，Kibana</li>\n<li>Beats 的使用，Beats 的特点</li>\n<li>Elastic Search 在匠人的架构，Lambda 如何使用</li>\n<li>Elastic Search 的如何创建 Dashboard</li>\n<li>Elastic Search 的如何查询 Logging 信息，如何做筛选</li>\n</ol>",
          "_id": "6834079e705ef705389336ab"
        },
        {
          "code": "L132",
          "title": "LinkedIn & CV",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>LinkedIn &amp; CV</p>",
          "_id": "6834079e705ef7053893369a"
        },
        {
          "code": "L133",
          "title": "Student Showcase: Stripe Integration in Practice",
          "type": "Workshop",
          "isLive": true,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Student Showcase: Stripe Integration in Practice</p>",
          "_id": "6834079e705ef705389336ad"
        },
        {
          "code": "L134",
          "title": "关于如何解决Error Messages，几个步骤",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>应对error message的几个步骤： 1. 详细阅读一下error message，看报错的内容是什么，是否和自己操作的步骤有关，你是否能从报错的内容中找到出错位置，以及出错原因 2. 如果自己无法理解错误信息，尝试提炼出error message中的关键语句，在google上搜索。这一步很重要。如果全盘复制error message，有可能会因为字符数太多而无法详细匹配到你要找的答案。所以如何精炼错误信息的同时又精准的找到网上的答案，也是锻炼搜索能力的重要一步 3. 尝试从google的搜索结果当中，逐一比较，是否和你的错误信息相关。如果是，可以尝试google提出的解决方案。通常情况下你找到的第一个不一定是能解决你问题的那个一个。有可能需要尝试五六个/六七个不同的方案，才最终能找到你想要的内容 4. 如果google上的内容也无法帮你解决问题，可以截图错误信息，注意截图中要包含你所跑的命令和详细的错误信息，发到群里，大家帮你参考。</p>",
          "_id": "6834079e705ef705389336ac"
        },
        {
          "code": "L135",
          "title": "澳洲工作职场介绍",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"澳洲公司全景：行业领袖与职业机遇\"</strong></p>\n<ol>\n<li><strong>澳洲公司的市场概况</strong>：深入介绍澳洲主要行业和领先公司，包括它们的市场定位、企业文化和核心价值。</li>\n<li><strong>澳洲公司的职业前景</strong>：探讨在澳洲各种类型公司工作的优势和挑战，以及如何在这些环境中发展职业生涯。</li>\n</ol>\n<p><strong>\"就业方向解析：产品与咨询服务\"</strong></p>\n<ol>\n<li><strong>产品方向的职业机遇</strong>：探讨在产品管理、开发和策略等领域的职业路径，以及如何在这些领域成功发展。</li>\n<li><strong>咨询服务方向的职业途径</strong>：深入分析咨询行业的工作性质、职业晋升路径和必备技能，以及如何在咨询服务领域建立成功的职业。</li>\n</ol>",
          "_id": "6834079e705ef7053893369b"
        },
        {
          "code": "L136",
          "title": "澳洲企业招聘流程",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"澳洲企业招聘全攻略：三大关键阶段深度解析\"</strong></p>\n<ol>\n<li><strong>简历和求职信的制作与提交</strong>：学习如何撰写针对澳洲市场的高效简历和求职信，包括格式、内容和展现个人特色的技巧。</li>\n<li><strong>面试的全面准备</strong>：深入分析招聘过程中的各种面试类型，包括初步面试、在线评估、技术面试和管理层面试。提供准备技巧、常见问题解答和成功策略。</li>\n<li><strong>Offer 阶段的策略</strong>：探讨如何在收到工作邀约时进行有效的沟通和谈判，包括薪资、福利和其他工作条件。</li>\n</ol>",
          "_id": "6834079e705ef7053893369c"
        },
        {
          "code": "L137",
          "title": "招聘官挑选简历的标准",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>招聘官在挑选简历时通常会根据以下几个标准进行筛选：</p>\n<ol>\n<li><strong>符合职位要求</strong>：首先会检查应聘者的教育背景、工作经验、技能和资格是否符合岗位的具体要求。</li>\n<li><strong>清晰、专业的简历格式</strong>：一份清晰、逻辑性强、格式规范、无拼写错误的简历更容易获得青睐。</li>\n<li><strong>关键字匹配</strong>：许多公司使用自动跟踪系统（ATS）来筛选简历，这些系统会根据职位描述中的关键字来评估简历的相关性。</li>\n<li><strong>成就和成绩</strong>：与其仅仅列出职责，招聘官更倾向于看到具体的成就和成绩，例如销售额、成本节约、项目成功实施等量化的结果。</li>\n<li><strong>职业发展的连贯性</strong>：职业路径中的逻辑发展和进步表明了候选人的职业目标和职业规划。</li>\n<li><strong>个性和文化契合度</strong>：简历中的个人陈述或兴趣爱好部分可以体现出候选人是否可能与公司文化和团队精神相契合。</li>\n<li><strong>职业目标</strong>：简历应该传达出候选人的职业目标与申请职位是如何对齐的。</li>\n<li><strong>社交媒体和在线存在</strong>：有时候招聘官也会查看LinkedIn等专业网络或其他社交媒体来了解候选人的专业背景和行为表现。</li>\n<li><strong>推荐信和联系人</strong>：提供可以证实候选人能力和表现的推荐人可以是一个加分项。</li>\n<li><strong>附加技能</strong>：除了基本技能之外，候选人显示的任何额外技能或证书也会让其简历更加突出。</li>\n</ol>",
          "_id": "6834079e705ef7053893369d"
        },
        {
          "code": "L138",
          "title": "学会撰写IT专业简历",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学会撰写IT专业简历</p>",
          "_id": "69e3295b9f9cc30e741972ea"
        },
        {
          "code": "L139",
          "title": "简历常见问题",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"简历制作艺术：重点、加减分项及编写原则\"</strong></p>\n<ol>\n<li><strong>简历的重点内容</strong>：指导您如何突出简历中的重点内容，包括职业经历、技能、成就和教育背景，确保雇主能够快速抓住您的核心优势。</li>\n<li><strong>避免的简历减分项</strong>：教您识别和避免简历中的常见错误和不利因素，如过度冗长、格式不当或信息不准确等。</li>\n<li><strong>简历的加分元素</strong>：提供策略和建议，帮助您在简历中加入能够提升吸引力的元素，如特定技能证明、相关项目经验或突出成就等。</li>\n<li><strong>编写简历的基本原则</strong>：探讨在编写简历时应遵循的基本原则，包括清晰性、专业性和针对性，以及如何根据目标职位定制简历。</li>\n</ol>",
          "_id": "6834079e705ef7053893369f"
        },
        {
          "code": "L140",
          "title": "如何利用 ChatGPT 写简历",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"利用 ChatGPT 提升简历撰写技巧：指南与实践\"</strong></p>\n<ol>\n<li><strong>ChatGPT 基本使用方法</strong>：本节课将介绍 ChatGPT 的基础功能和操作方法，帮助学员快速掌握如何有效使用这一先进的工具。</li>\n<li><strong>ChatGPT 在简历撰写中的应用技巧</strong>：这部分将指导学员如何充分利用 ChatGPT 在简历撰写中的潜力，包括格式建议、内容生成和优化技巧，以打造一份吸引眼球的简历。</li>\n<li><strong>与 ChatGPT 进行个性化交互</strong>：教授学员如何与 ChatGPT 进行有效的个性化交互，以获取更加符合职业目标和个人特色的简历内容。</li>\n<li><strong>ChatGPT 实例演示</strong>：通过实际操作演示，展示 ChatGPT 在简历撰写和改进方面的应用，帮助学员更好地理解和掌握实际操作技巧。</li>\n</ol>",
          "_id": "6834079e705ef705389336a0"
        },
        {
          "code": "L141",
          "title": "手把手带着运营 LinkedIn",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"LinkedIn 职业建设：完善个人资料与网络拓展\"</strong></p>\n<ol>\n<li><strong>维护完整、专业的 LinkedIn 个人资料</strong>：指导您如何创建和维护一个展现您职业经历、技能和成就的专业 LinkedIn 资料。这包括头像选择、经历描述、技能展示和获取推荐等关键元素。</li>\n<li><strong>加入与行业和兴趣相关的 LinkedIn 群组</strong>：教您如何找到和加入与您的职业领域和兴趣相关的 LinkedIn 群组，以便进行行业交流、拓展职业网络和获取行业最新动态。</li>\n</ol>",
          "_id": "6834079e705ef705389336a1"
        },
        {
          "code": "L142",
          "title": "如何利用 LinkedIn 准备面试",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"求职成功攻略：职位描述解析、面试准备与公司研究\"</strong></p>\n<p>这个课程旨在全面指导您如何在求职过程中取得成功。本课程将包括：</p>\n<ol>\n<li><strong>职位描述深度解析</strong>：教您如何仔细分析职位描述，理解职位要求的核心内容和隐含条件，从而更有效地准备申请材料和面试。</li>\n<li><strong>面试准备技巧</strong>：提供面试准备的策略，包括如何针对面试描述准备回答问题、展示自己的优势，以及如何应对常见面试问题。</li>\n<li><strong>利用 LinkedIn 搜索目标公司</strong>：指导您如何有效利用 LinkedIn 平台搜索并研究目标公司，包括公司背景、文化、行业地位等信息，以增强您的求职策略。</li>\n</ol>",
          "_id": "6834079e705ef705389336a2"
        },
        {
          "code": "L143",
          "title": "Tutorial 16（React Auth, Next.js）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>答疑 (30 分钟)</h3><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>React 身份认证相关问题解答 (15 分钟)</strong>回答关于 React 中身份认证的基础知识、JWT 的使用、Context 和 Hooks 在认证中的应用等问题。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Next.js 渲染模式相关问题解答 (15 分钟)</strong>解答有关 Next.js 的概述、不同渲染模式（CSR、SSR、SSG）的特点和应用场景的问题。</li></ol><h3>实践练习 (90 分钟)</h3><h3>练习1: React 身份认证表单实现</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>任务</strong>: 创建一个 React 应用</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登录</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>注册</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登出</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>删除帐户</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>表单验证</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现基础前端验证逻辑，</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现检查输入是否为空，格式是否正确等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>模拟 API 调用</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 mock service worker（MSW）或其他工具模拟后端 API 响应。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>状态管理</strong>: 使用 React 的 Context API 来管理用户的登录状态。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建 Context API</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解码 JWT Token</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>保存用户信息</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示用户信息</li></ol><h3>练习2: Next.js 分页列表实现 (额外)</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>任务</strong>: 使用 Next.js 创建一个列表应用，该列表包含分页功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>数据源</strong>: 可以使用公开的 API 或静态数据作为列表的数据源。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>渲染模式探索</strong>: 尝试使用 CSR、SSR 和 SSG 等不同渲染模式，并了解每种模式的特点和适用场景。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>分页逻辑</strong>: 实现分页组件，允许用户在列表数据间导航。</li></ol>",
          "_id": "69e329779f9cc30e74197a23"
        },
        {
          "code": "L144",
          "title": ".NET(9): 构建WEB API项目相关技术 - Entity Framework Core，Linq，Sweager，nlog",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(9): 构建WEB API项目相关技术 - Entity Framework Core，Linq，Sweager，nlog</p>",
          "_id": "69e329779f9cc30e74197a30"
        },
        {
          "code": "L145",
          "title": ".NET(10): 构建WEB API项目相关技术 - Web API认证与授权（JWT Authentication & RBAC Authorization）",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>.NET(10): 构建WEB API项目相关技术 - Web API认证与授权（JWT Authentication &amp; RBAC Authorization）</p>",
          "_id": "69e329789f9cc30e74197a39"
        },
        {
          "code": "L146",
          "title": "Tutorial 17（.NET）",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69e329789f9cc30e74197a44"
        },
        {
          "code": "L147",
          "title": "手把手教你运营 LinkedIn",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">\"LinkedIn 职业建设：完善个人资料与网络拓展\"</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">维护完整、专业的 LinkedIn 个人资料</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：指导您如何创建和维护一个展现您职业经历、技能和成就的专业 LinkedIn 资料。这包括头像选择、经历描述、技能展示和获取推荐等关键元素。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">加入与行业和兴趣相关的 LinkedIn 群组</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：教您如何找到和加入与您的职业领域和兴趣相关的 LinkedIn 群组，以便进行行业交流、拓展职业网络和获取行业最新动态。</span></li></ol>",
          "_id": "68ad66b46c178e09a0e064fa"
        },
        {
          "code": "L148",
          "title": "AI in Programming Workshop",
          "type": "Lesson",
          "isLive": false,
          "duration": 150,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>AI in Programming Workshop</p>",
          "_id": "68b7eb39dc96666921f1330a"
        },
        {
          "code": "L149",
          "title": "AI in Programming Workshop",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>AI in Programming Workshop</p>",
          "_id": "68c394f7715ffd88cd012686"
        },
        {
          "code": "L150",
          "title": "如何撰写IT专业简历",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">清晰的格式和布局</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：使用易于阅读的字体和清晰的布局。保持简历的长度适中，通常不超过两页。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">个人信息和联系方式</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：包括你的姓名、职业头衔（如软件工程师、系统管理员等）、联系电话、电子邮箱和 LinkedIn 个人页面链接。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">专业摘要或目标声明</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：简洁地概述你的职业背景、技能和你寻求的职位类型。这部分应该具有吸引力且针对你申请的职位量身定制。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">技术技能</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：明确列出你的技术技能，如编程语言（例如 Java、Python）、框架（如 Spring、React）、数据库（如 MySQL、MongoDB）和工具（如 Git、Docker）。根据求职职位的要求来调整技能列表。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">工作经验</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：按时间顺序列出你的工作经历，包括公司名称、职位、工作时间和职责描述。突出具体成就和使用的技术。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">项目经历</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：如果你有相关的项目经验（包括学校项目、个人项目或自由职业项目），请列出来，说明你的角色、使用的技术和项目成果。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">教育背景</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：提供你的最高学历信息，包括学校名称、学位、专业和毕业时间。如果你是新毕业生，可以更详细地说明你的教育背景。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">证书和培训</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：如果你有相关的行业证书（如 AWS Certified Solutions Architect、Cisco 的 CCNA）或完成了重要的专业培训，务必列出。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">其他信息</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：如语言能力、志愿者经验、获奖情况等，如果它们对你申请的职位有帮助，可以选择性地加入。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">定制你的简历</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：针对每个职位调整你的简历，确保它符合职位描述中的关键字和要求。</span></li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">校对和审核</strong><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">：在提交前，请仔细校对你的简历，确保没有拼写和语法错误。有可能的话，让你的同事或朋友帮你复查。</span></li></ol>",
          "_id": "68f9d62e3c7f6564ce3e46fd"
        },
        {
          "code": "L151",
          "title": "Vibe Coding",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69411cafbc0df65b18928b99"
        }
      ]
    },
    {
      "name": "AI Web全栈班28期Node.js方向",
      "color": "#f59e0b",
      "summary": "",
      "test": {
        "questions": 0,
        "passRate": 0,
        "unlocks": ""
      },
      "lessons": [
        {
          "code": "L01",
          "title": "课前须知",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>课前须知：</p><p>欢迎来到Web全栈开发课程！为了帮助大家更好地投入学习并取得最佳效果，我们特别准备了以下课前须知，请仔细阅读：</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>预习材料</strong>：建议同学们提前自学W3Cschool中的HTML、CSS和JavaScript部分内容，多加练习可以帮助你更好地理解课堂内容。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>课堂设备准备</strong>：为了提高学习效率，建议大家在上课时使用多个屏幕。你可以通过外接显示器或使用iPad来播放课程视频，同时在电脑端进行代码练习和做笔记，这样的方式将帮助你更好地掌握课程内容。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>做笔记的重要性</strong>：良好的文档管理能力是成为专业人士的重要技能之一。上课时建议大家积极做笔记，可以在匠人课堂的线上平台完成笔记记录，也可以选择私下整理笔记。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Tutorial 环节</strong>：本课程设置了专门的Tutorial环节，旨在为大家解答学习中的疑惑。请充分利用这个时间段，解决你在学习中遇到的问题。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实践至上</strong>：学习IT技能的最佳方法就是多加实践。请勇敢迈出编写代码的第一步，只要不断练习和动手操作，你离成功就不远了。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>积极提问</strong>：由于课程采用线上教学模式，老师不在身边，因此在遇到问题时，请务必通过分享屏幕或截屏的方式向老师提问，这样有助于老师更准确地理解你的问题并提供帮助。</li></ol><p>期待大家在这门课程中有所收获，并取得优异的成绩！如果有任何疑问，请随时提问，老师们会在第一时间为你解答。让我们一起努力，迈向成为全栈开发工程师的目标！</p>",
          "_id": "68f7497c7c93be3ff4bad76c"
        },
        {
          "code": "L02",
          "title": "课前准备",
          "type": "Information",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>为确保同学们在全栈开发课程中获得最佳学习体验，请参考以下准备指南：</p><ol><li><p><strong>基础知识预习</strong>：建议您在正式课程开始前，访问 <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://www.w3schools.com/\">W3Schools</a> 等在线资源，自学 HTML、CSS 和 JavaScript 等基础知识。多次复习这些基本概念将为您加入全栈班级打下坚实的基础。</p></li><li><p><strong>课前准备</strong>：请务必查阅我们为您准备的 PPT，以便做好充分的课前准备。这将帮助您更好地理解即将学习的内容。</p></li><li><p><strong>课程笔记和项目</strong>：</p></li><li><p>课程笔记可在此处查看： <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://github.com/australiaitgroup/full-stack-bootcamp-wiki\">https://github.com/australiaitgroup/full-stack-bootcamp-wiki</a></p></li><li><p>我们的课程包括三个实践项目，您可以在这里了解更多信息：<a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://github.com/australiaitgroup/jr-full-stack-projects\">https://github.com/australiaitgroup/jr-full-stack-projects</a></p></li><li><p><strong>编辑器工具</strong>：您可以根据个人喜好选择任意一款代码编辑器，如 VS Code、Webstorm、Intellij 等。</p></li><li><p><strong>Node.js 安装</strong>：请自行安装 16 版本以上的 Node.js LTS（长期支持）版本。</p></li><li><p>有 Mac 电脑的同学可以下载 Xcode，并且安装。</p></li><li><p>CareerMate AI设计：<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://scene.zeplin.io/project/6912d1514326499fef4cd161\">https://scene.zeplin.io/project/6912d1514326499fef4cd161</a></p></li></ol><p>我们期待着与你在全栈班的旅程中携手前行，并助你成为一名出色的全栈开发者！</p>",
          "_id": "68f7497c7c93be3ff4bad76d"
        },
        {
          "code": "L03",
          "title": "开营仪式 & 职业路线图：从AI学习者到AI工程师",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ul><li><p><strong>AI Engineer 职业路线图与能力结构</strong></p><ul><li><p>拆解 AI Engineer 的“五维能力”：<br><strong>- Full-stack 基础</strong>（前端/后端/API/数据库/工程协作）</p><ul><li><p>Prompt Engineering</p></li><li><p>AI Engineering（LLM 接入、RAG/Agent 工作流）</p></li><li><p>Cloud 部署能力</p></li><li><p>Data Thinking**</p></li></ul></li><li><p>说明这些能力如何对应澳洲真实岗位与面试要求，帮助你识别自身优势/短板与阶段性重点。</p></li></ul></li><li><p><strong>本期项目主线与 Project-Based Learning 方法</strong></p><ul><li><p>介绍 <strong>CareerMate AI</strong> 的最终交付目标与学习路线。</p></li><li><p>强调课堂以“跟着项目一步步交付”为核心；理论知识通过课后录屏/视频补充，确保每节课都有可见代码产出与可展示成果。</p></li><li><p>需要提前准备好ChatGPT Pro或者Claude Pro</p></li></ul></li><li><p><strong>Agile &amp; Kanban 学习底座</strong></p><ul><li><p>讲清为什么用 Agile 推进复杂项目：拆需求、写 <strong>User Story</strong>、设定验收标准与 <strong>DoD（Definition of Done）</strong>。</p></li><li><p>演示 Kanban 学习流程：后续每节课都会拆成任务卡，同学像真实团队成员一样领任务、提交代码/PR、持续迭代。</p></li></ul></li><li><p>CareerMate AI设计链接： <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://scene.zeplin.io/project/6912d1514326499fef4cd161\">https://scene.zeplin.io/project/6912d1514326499fef4cd161</a></p></li></ul>",
          "_id": "68f7497c7c93be3ff4bad76e"
        },
        {
          "code": "L04",
          "title": "学习平台使用指南",
          "type": "Lesson",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>你今天能学到什么</h3><p>通过这一节，你会掌握：</p><ol><li><p>怎么看课表、找上课入口</p></li><li><p>怎么快速找到课程资料</p></li><li><p>怎么看课程回放、补课</p></li><li><p>平台里还有哪些学习资源能帮你提分/提能力</p></li><li><p>怎么用 Jobpin AI 简历生成器做一份专业简历（用于找实习/工作）</p></li></ol>",
          "_id": "68f7497c7c93be3ff4bad76f"
        },
        {
          "code": "L05",
          "title": "HTML&CSS的奥秘",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>网页的心跳:网页如何呈现给用户</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>网页旅程:探究一个网页如何从服务器传输到你的屏幕的背后原理。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML标签揭秘:网络的基石。熟悉最常用的标签并理解它们的功能。</li></ol><p>深入HTML的构架</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML结构:学习HTML的基本框架和其重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>头部(Head)解析:头部标签里包含了什么?为什么它是如此重要?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML的观众:HTML是为了人类还是机器而创建的？或者两者兼而有之？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>元素之间的区别:什么是Block元素?什么是Inline元素?为什么需要区分?</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>常用标签探讨:深入了解和实践常用的HTML标签。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签的语义性:为什么选择正确的标签很重要？如何提高代码的可读性和无障碍访问性。</li></ol><p>HTML的其他要素</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTML注释的艺术:为什么注释是重要的，以及如何正确地使用它们。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跨浏览器的兼容性:在不同的浏览器上，为什么同一代码会显示不同的样子？如何确保你的代码对所有用户都是友好的？</li></ol><p>现代HTML5新增特性</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>新的语义标签:如&lt;article&gt;, &lt;section&gt;, &lt;nav&gt;, &lt;header&gt;, &lt;footer&gt;等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>多媒体标签:如何使用&lt;audio&gt;和&lt;video&gt;标签嵌入音频和视频。</li></ol><p>表单与用户互动</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>表单基础:输入类型、标签和属性的详细介绍。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据验证:如何使用HTML自带的验证功能确保用户输入的数据有效。</li></ol><p>网页的布局基础</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Box Model:详细解析边距、边框、填充和内容如何共同作用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Position:学习static、relative、absolute和fixed定位的基本知识。</li></ol><p>响应式Web设计入门</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Viewport:什么是Viewport？为什么它对移动设备如此重要？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Media Query:基础介绍，如何根据不同的设备和屏幕尺寸应用不同的CSS样式。</li></ol><p>与其他技术的交互</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>嵌入JavaScript:简单介绍如何在HTML中使用JavaScript增强互动。</li></ol><p>布置第一个作业：registration_form</p>",
          "_id": "68f7497c7c93be3ff4bad770"
        },
        {
          "code": "L06",
          "title": "HTML&CSS的奥秘: Assignment 01",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>创建Registration Form</strong></p><p><strong>作业背景：</strong></p><p>网页表单是任何交互性网站的核心部分，无论是注册、登录、提问还是购物，表单都扮演了关键角色。为了强化你对HTML和基础CSS的理解，我们为你设计了这个作业，让你从实践中学习。</p><p><strong>作业要求：</strong></p><p><strong>表单结构</strong>：你的表单应该至少包含以下字段：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>First Name (text input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Last Name (text input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Email Address (appropriate input type)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Password (password input field with appropriate attributes to ensure security)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Confirm Password (password input field)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Date of Birth (date picker)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Gender (radio buttons: Male/Female/Other)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>About Me (textarea)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Choose Your Profession (dropdown list with options like \"Web Development\", \"Data Analytics\", \"UI/UX Design\", etc.)</li></ol><p><strong>布局和样式</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用CSS为你的表单元素添加基本样式，如边框、背景颜色、文本颜色等。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保所有元素在各种设备和屏幕尺寸上都有清晰的布局和良好的可读性。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>考虑元素间的间距，确保表单整体布局美观。</li></ol><p><strong>交互</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为提交按钮添加hover效果。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用HTML5验证功能确保在提交之前填写了所有必需字段。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保电子邮件和密码字段有适当的格式限制。</li></ol><p><strong>代码清晰性</strong>：确保你的代码结构清晰，HTML和CSS均应有合适的注释说明。</p><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p>方式一：GitHub链接提交</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的HTML和CSS 文件上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol><p>方式二：ZIP文件提交</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS代码保存在一个名为 \"Registration_Form\" 的文件夹中；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将文件夹压缩为 ZIP 文件；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传zip文件，点击“确认提交”，提交成功。</span></li></ol><p>请确保提交的代码结构完整、清晰，并能够正常运行。</p><p><br></p><p>参考UI</p><p><img src=\"https://image.jracademy.com.au/post/image/image_1754890205153_UI.png.image/png\"></p>",
          "_id": "68f7497c7c93be3ff4bad771"
        },
        {
          "code": "L07",
          "title": "HTML&CSS (Part 2)",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>CSS概念</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义：CSS(级联样式表)是用来装饰和布局网页的语言。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>作用：让网页内容更加美观，为HTML元素设置样式。</li></ol><p>Emmet语法</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义：一个高效的编码快捷工具，帮助快速编写HTML/CSS。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>示例：输入ul&gt;li*5后，可快速展开为5个列表项的无序列表。</li></ol><p>选择器的种类及其作用</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签选择器：针对特定HTML标签应用样式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类选择器：一个或多个HTML元素的自定义样式。例如，.classname。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>类选择器多类名使用：一个元素可以应用多个类名，例如&lt;div class=\"class1 class2\"&gt;。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ID选择器：针对特定ID的HTML元素应用样式。例如，#idname。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通配符选择器(``)：选取所有元素应用统一样式。</li></ol><p>CSS字体与文本属性</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>字体属性：如font-family,font-size,font-weight等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>复合属性：例如font:12px Arial,sans-serif;可以一次性设置多个字体相关的属性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文本样式：如text-align,text-decoration,text-transform等用于控制文本的显示效果。</li></ol><p>CSS样式表的种类</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>内部样式表：直接在HTML文件的&lt;head&gt;中使用&lt;style&gt;标签。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>行内样式：直接在HTML元素上使用style属性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>外部样式表：通过.css文件链接到HTML，使样式与内容分离。</li></ol><p>选择器的进阶使用</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>后代选择器：如div p选择所有div内的p元素。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>子元素选择器：如div&gt;p只选择div的直接子元素p。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>并集选择器：例如h1,h2,h3可以同时为多个标签设置样式。</li></ol><p>链接伪类选择器</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如:hover,:active,:visited等，用于定义链接或其他元素在不同状态下的样式。</li></ol><p>元素显示模式</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>行内元素：如span，不独占一行。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>块元素：如div，独占一行。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>元素模式转化：使用display属性，如display:block;或display:inline;。</li></ol><p>背景属性(background)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如background-color,background-image,background-repeat等，用于设置元素的背景。</li></ol><p>CSS的三大特性</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>层叠性：当有多个相互冲突的样式规则时，哪一个会生效。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>继承性：某些样式会被子元素继承。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>优先级&amp;权重叠加：如!important,选择器的权重等。</li></ol><p>CSS盒模型(Box Model)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>包括：内容(content),填充(padding),边框(border),外边距(margin)。</li></ol><p>边距的特性</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Margin水平居中：如margin:0 auto;可以使块元素在容器中水平居中。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Margin合并塌陷：当两个垂直边距相遇时，它们将形成一个边距。</li></ol><p>Flex布局</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍：一个为设计复杂布局而生的模型，主要用于调整元素在不同设备和屏幕大小上的显示。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基本概念：如flex-container,flex-item,justify-content,align-items等。</li></ol><p>Flex属性</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如flex-grow,flex-shrink,flex-basis等，用于控制flex容器内元素的大小和排列。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad772"
        },
        {
          "code": "L08",
          "title": "HTML&CSS (Part 2): Assignment 02",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业背景：</strong></p><p>卡片式设计（Card UI Design）是现代Web设计中常见的一种模式，广泛用于产品展示、新闻摘要、个人资料等。此次作业，你将会获得一些预先设计好的Card UI Design图。你的任务是使用HTML和CSS来实现这些设计，将其从静态图像转变为实际的Web元素。</p><p>选择一个提供的UI设计，完成作业。</p><p>参考图一：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66ebbcbab6f2210012886fe6/6b41a24aa27f883bed79cf9329e6beb0.png\"></p><p>参考图二：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66ebbcbab6f2210012886fe6/ed57f5b8462e237bd62872ff63e7bd51.png\"></p><p><br></p><p><strong>作业要求：</strong></p><p><strong>精确还原</strong>：尽量确保你的代码实现与给定的UI设计图在视觉上相匹配，包括颜色、尺寸、字体和间距。</p><p><strong>响应式设计</strong>：尽管设计图可能是针对特定的屏幕尺寸，但你需要确保你的卡片设计在各种设备和屏幕尺寸上都能正常显示。</p><p><strong>使用选择器和属性</strong>：你应该在CSS中应用至少以下选择器和属性：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>标签选择器、类选择器、ID选择器。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文本样式、背景属性、padding、margin、flexbox。</li></ol><p><strong>代码清晰性</strong>：代码应该是清晰的、整洁的，并且有适当的注释。</p><p><strong>交互效果</strong>：考虑为你的卡片添加一些基本的交互效果，如hover状态。</p><p><br></p><p><strong style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">作业提交：</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">方式一：GitHub链接提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS 文件上传到 GitHub 仓库，确保项目结构清晰且完整；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传可访问的仓库链接，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">方式二：ZIP文件提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将你的HTML和CSS代码保存在一个名为 \"Card_UI_Implementation\" 的文件夹中；确保所有必要的资源（如图片、字体）都已包含在此文件夹中，并使用相对路径链接到你的HTML中。</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">将文件夹压缩为 ZIP 文件；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">上传zip文件，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">请确保提交的代码结构完整、清晰，并能够正常运行。</span></p>",
          "_id": "68f7497c7c93be3ff4bad773"
        },
        {
          "code": "L09",
          "title": "Lab(1)：使用Chrome Debugger和实现Responsive List",
          "type": "Lab",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>掌握 Chrome Debugger</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>介绍 Chrome Debugger</strong>: 简要介绍 Chrome Debugger 的功能和它在前端开发中的重要性。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>基本操作</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>打开和导航 Chrome DevTools。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习使用 Elements 面板来检查和修改 HTML/CSS。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Console 面板进行 JavaScript 调试。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>断点调试</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置和管理断点。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Watch 表达式监视变量。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解调用栈和事件监听器。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>网络和性能分析</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Network 面板分析资源加载情况。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 面板进行页面渲染性能分析。</li></ol><h3>实现响应式有序列表页面</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>页面设计要求</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设计一个有序列表，展示主题内容。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>列表应具备基本的样式美化。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实现响应式特性</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为不同屏幕尺寸实现不同的布局和样式。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>测试和调试</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Chrome Debugger 测试页面在不同设备上的表现。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调整媒体查询和 CSS 以修复任何响应式问题。</li></ol><p><br></p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160bc/ad1d8cc7-1b19-4da2-a3e0-6648cf14917a.png\"></p><h3><br></h3>",
          "_id": "68f7497c7c93be3ff4bad775"
        },
        {
          "code": "L10",
          "title": "CSS & Sass",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Card Design作业评议与SVG编辑</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾与讨论学生提交的card design作业。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何编辑SVG图像以增强设计效果。</li></ol><p>box-sizing的实际应用</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解释box-sizing属性如何影响元素的宽高计算。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示content-box与border-box之间的区别。</li></ol><p>CSS长度单位探讨</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>绝对单位：如px, pt, cm等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>相对单位：如em, rem, vw, vh等。</li></ol><p>文本溢出处理</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解`word-wrap`和`word-break`属性如何帮助控制文本溢出。</li></ol><p>伪类与伪元素的使用</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如:hover, ::before, ::after等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何使用它们增强页面样式和效果。</li></ol><p>float的应用技巧</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍float属性的常见用途，如创建多列布局或水平菜单。</li></ol><p>选择器的特异性 (specificity)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解如何计算选择器的权重，以及为何某些样式没有被应用。</li></ol><p>响应式设计基础</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么响应式设计是必要的。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用媒体查询创建适应不同屏幕大小的布局。</li></ol><p>Bootstrap与Semantic UI</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简介Bootstrap，展示如何使用Bootstrap实现响应式设计。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Semantic UI框架并比较其与Bootstrap的异同。</li></ol><p>CSS预处理器简介:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是Sass、Less等预处理器？为什么它们在现代网页开发中很有用？</li></ol><p>CSS的挑战与Sass解决方案</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论在大型项目中CSS可能面临的问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Sass (SCSS) 如何简化CSS编写，以及如何使用变量、嵌套等功能。</li></ol><p>深入Flexbox</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Flexbox如何解决传统布局问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索`flex`, `flex-grow`, `flex-shrink`等属性的使用。</li></ol><p>UI设计原则与组件库</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习创建出色UI的基本原则。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍流行的组件库，如Material-UI或Ant Design。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>展示个人网站设计案例，启发学生的设计灵感。</li></ol><p><br></p><p>作业指导</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>要求使用本节课学到的技能完成四个Card布局。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad776"
        },
        {
          "code": "L11",
          "title": "Lab(2):使用Grid和Flexbox实现卡片布局",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>CSS Grid 布局基础</strong></p><p><strong>构建网格系统</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个简单的网格布局，定义列和行。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索 grid-template-areas 和 grid-template-columns 的使用。</li></ol><p><strong>响应式网格</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用媒体查询调整网格布局。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实践如何在不同屏幕尺寸下重新排列网格项。</li></ol><p><strong>Flexbox 卡片布局</strong></p><p><strong>创建卡片组件</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设计一个简单的卡片组件，包含图片和文本。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用 Flexbox 创建卡片的标题、内容和动作区域。</li></ol><p><strong>卡片布局的响应式设计</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使卡片在不同设备上以不同方式排列（如单列或多列布局）。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调整卡片内容的排列，确保在所有设备上都易于阅读。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad777"
        },
        {
          "code": "L12",
          "title": "JavaScript 入门",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>JavaScript的奇幻之旅：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随时间的轨迹，了解JavaScript如何从一个小小的脚本语言成为Web的重要组成部分。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解其如何成为Web的核心语言。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验Node.js的魅力，看看如何轻松地在这个环境中运行你的JS代码。</li></ol><p>探索js的秘密：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解JavaScript的独特Data Types，感知数据的生命力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认识变量命名背后的Naming Conventions，并感受到Hoisting带来的惊喜。</li></ol><p>动态的数据操作：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习Operators的秘密语言，看它们如何让数据生动起来。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解==与===的精确差异</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入探讨JavaScript的Type Conversion，体验其动态特性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>揭示数字计算中的Precision问题，学会安全的数据处理技巧。</li></ol><p>数组的神秘世界：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从创建到访问，全方位认识Arrays。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索数组的神奇方法，无论是sort还是filter，并学会使用break和continue来调控循环的行为。</li></ol><p>控制代码的流程：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验如何使用Conditional Statements让代码做出决策。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>利用Loops让魔法反复施放，直到完成神奇的任务。</li></ol><p>Dive into Functions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何将神奇的咒语封装成Functions，随时随地召唤。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义和调用函数，了解Scope和参数传递的机制。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍Strict Mode，为什么它是良好编程实践的一部分。</li></ol><p>Objects：模型化复杂的现实世界</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Objects，看它们如何代表复杂的事物。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验Objects和Arrays的冒险，了解它们在JavaScript世界中的地位。</li></ol><p>最佳实践和注意事项：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Strict Mode，掌握其在现代JavaScript开发中的重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>认识一些常见的JavaScript陷阱，并学会如何避免它们。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad778"
        },
        {
          "code": "L13",
          "title": "JavaScript Assignment 03",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>作业目标:</p><p>通过这次的作业，你将会练习JavaScript中的基本数据类型、数组、对象、条件语句、循环语句和函数的应用。</p><p>作业要求:</p><p><strong>数据与变量：</strong></p><p>创建一个购物清单数组，例如:</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/36160717-8966-4f0a-8b7b-02f2afda4063.png\"></p><p><strong>数组应用：</strong></p><p>向购物清单中添加两样物品，并输出更新后的清单。</p><p>从购物清单中删除最后一项物品，并输出结果。</p><p><strong>条件与循环：</strong></p><p>创建一个函数，当购物清单中的物品超过5项时，在控制台输出\"你的购物车满了\"。</p><p>使用循环语句遍历购物清单，将每一项物品在控制台上以编号的形式输出。例如：</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/1108680f-6d20-48ff-b6d6-a6a13cf6d313.png\"></p><p><strong>函数与对象：</strong></p><p>创建一个函数，该函数接受物品名称作为参数，并返回该物品是否在购物清单中。</p><p>创建一个购物物品对象，其中包括物品名称、价格和数量。例如:</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/65ae1b1f32b918002c4160c4/e66a7c88-b85f-4641-9f2e-9d1890ceccf8.png\"></p><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">方式一：GitHub链接提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">将你的JavaScript 文件（如：ShoppingList.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">上传可访问的仓库链接，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">方式二：ZIP文件提交</span></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">请将你的代码保存在一个名为 \"</span>ShoppingList<span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">\" 的文件夹中；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">将文件夹压缩为 ZIP 文件；</span></li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">上传zip文件，点击“确认提交”，提交成功。</span></li></ol><p><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">请确保提交的代码结构完整、清晰，并能够正常运行。</span></p>",
          "_id": "68f7497c7c93be3ff4bad779"
        },
        {
          "code": "L14",
          "title": "Lab(3):创建Responsive定价卡片",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Lab: 创建响应式定价卡片</strong></p><p><strong>设计定价卡片</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析上传的定价表格设计。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建基础的 HTML 结构。</li></ol><p><strong>实现基础样式</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用基础 CSS 样式来模仿上传的设计。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Flexbox 或 Grid 系统来对卡片进行布局。</li></ol><p><strong>增加响应式特性</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用媒体查询创建多个断点，以适配不同的屏幕尺寸。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调整定价卡片的布局，使其在小屏幕上堆叠，在大屏幕上并排显示。</li></ol><p><strong>交互式元素</strong>:</p><p><br></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为购买按钮添加 :hover 和 :active 伪类样式。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现简单的 JavaScript 逻辑，模拟购买过程的响应。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad77b"
        },
        {
          "code": "L15",
          "title": "Git Introduction",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>探索版本控制的魔法</strong></p><ol><li><p>为什么我们都爱版本控制？</p></li><li><p>分布式(Distributed) vs 集中式(Centralized)：Git的独特之处。</p></li><li><p>什么是分布式版本控制系统</p></li><li><p>主流的 git 系统介绍</p></li></ol><p><strong>开启你的Git旅程</strong></p><ol><li><p>一步步引导你安装和配置Git。</p></li><li><p>为Git设定你的身份：告诉Git你是谁。</p></li><li><p>初始化Git空间: **git init**的魔力。</p></li><li><p><strong>mkdir</strong>：快速创建你的项目目录。</p></li></ol><p><strong>创建并驾驭你的代码宝库（Repository）</strong></p><ol><li><p>初始化你的第一个Git仓库。</p></li><li><p>如何管理和跟踪你的代码变更。</p></li></ol><p><strong>保护与跟踪你的代码</strong></p><ol><li><p>如何安全地保存你的代码更改？</p></li><li><p>了解**add**, **commit**以及它们如何帮助你管理更改。</p></li><li><p>深入理解**git log**：用美化的log追溯你的代码历史。</p></li><li><p><strong>.gitignore</strong>：掌握哪些文件不应纳入版本控制。</p></li><li><p>探索日常工作中使用Git的标准流程。</p></li><li><p>远程仓库(Remote Repository)的创建与管理：掌握**clone**, <strong>push</strong>, <strong>pull</strong>。</p></li></ol><p><strong>Sourcetree：让Git操作可视化</strong></p><ol><li><p>为什么需要图形化工具？</p></li><li><p>如何使用Sourcetree提高工作效率。</p></li></ol><p><strong>出错了怎么办：撤回与修复</strong></p><ol><li><p>掌握reset, <strong>revert</strong>, <strong>amend</strong>：让你的代码时光倒流。</p></li><li><p><strong>checkout和stash</strong>：两种保存和切换的策略，它们的不同之处。</p></li></ol><p><strong>更进一步：分支管理与合作</strong></p><ol><li><p>学习如何merge、处理代码冲突。</p></li><li><p><strong>rebase</strong>：为什么和何时使用它。</p></li><li><p>pull request与代码审查：如何高效、规范地合作。</p></li></ol><p><strong>当代码世界相撞：冲突(Conflict)解决大师</strong></p><ol><li><p>当代码出现纷争，我们该如何和平解决？</p></li><li><p>使用rebase<strong>与</strong>merge的策略，成为解决冲突的高手。</p></li></ol><p><strong>Git的小贴士和技巧</strong></p><ol><li><p>介绍神奇的.gitignore文件：让某些文件“隐形”。</p></li><li><p>快速、有效地查看你的代码历史。</p></li></ol><p><strong>Git遇见GitHub：开放的代码舞台</strong></p><ol><li><p>GitHub: 一个开发者的乐园。</p></li><li><p>如何在GitHub上展示你的才华，与全球开发者共舞。</p></li></ol><p></p><img class=\"max-w-full h-auto rounded-lg\" src=\"https://jr-image.s3.ap-southeast-2.amazonaws.com/lesson-descriptions/Weixin Image_2025-11-30_170255_322.png\"><p><br></p><p><strong>Links:</strong></p><ol><li><p>Git client: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://git-scm.com/\">https://git-scm.com/</a></p></li><li><p>SourceTree: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://www.sourcetreeapp.com/\">https://www.sourcetreeapp.com/</a></p></li><li><p>Visualizing Git: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"http://git-school.github.io/visualizing-git/#free\">http://git-school.github.io/visualizing-git/#free</a></p></li><li><p>Windows Terminal: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701\">https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701</a></p></li><li><p>Powerline for Windows Terminal: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup\">https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup</a></p></li><li><p>Windows Subsystem for Linux: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://docs.microsoft.com/en-us/windows/wsl/install-win10\">https://docs.microsoft.com/en-us/windows/wsl/install-win10</a></p></li></ol>",
          "_id": "68f7497c7c93be3ff4bad77c"
        },
        {
          "code": "L16",
          "title": "Git Introduction Assignment 04",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git 简答作业</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Git 练习作业</li></ol><p><br></p><p><strong style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">作业提交：</strong></p><p><span style=\"background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);\">在你的GitHub上面创建一个仓库，上传GitHub仓库链接，点击“确认提交”，提交成功。</span></p>",
          "_id": "68f7497c7c93be3ff4bad77d"
        },
        {
          "code": "L17",
          "title": "Lab(4): Git实践练习",
          "type": "Lab",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Git 基础</strong></p><p><strong>安装 Git</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保所有学员都安装了 Git。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过运行 git --version 来验证安装。</li></ol><p><strong>配置 Git 环境</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置用户的名字和电子邮件地址。</li></ol><p><strong>创建本地仓库</strong></p><p><strong>初始化仓库</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 git init 创建一个新的本地 git 仓库。</li></ol><p><strong>文件操作</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建新文件，学习 git status 命令的用法。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 git add 将文件添加到暂存区。</li></ol><p><strong>提交更改</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 git commit 提交暂存区的更改。</li></ol><p><strong>分支管理</strong></p><p><strong>创建和合并分支</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 git branch 创建分支。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 git checkout 切换分支。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过 git merge 将分支更改合并回主分支。</li></ol><p><strong>解决冲突</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>故意制造文件冲突，练习冲突解决。</li></ol><p><strong>远程仓库的使用</strong></p><p><strong>连接到远程仓库</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置一个远程仓库，如 GitHub 或 GitLab。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习 git remote 和 git push 命令。</li></ol><p><strong>从远程仓库拉取</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 git pull 或 git fetch 与 git merge 从远程仓库获取更新。</li></ol><p><strong>使用 .gitignore 文件</strong></p><p><strong>配置 . gitignore</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个 .gitignore 文件并配置它以忽略特定文件。</li></ol><p><strong>标签和日志</strong></p><p><strong>使用标签</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用 git tag 为提交打标签。</li></ol><p><strong>查看提交历史</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 git log 查看详细的提交历史。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad77e"
        },
        {
          "code": "L18",
          "title": "探索现代JavaScript —— ES6 (ECMAScript 2015)之魅力",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>闪回与展望: ES6简介</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>老师自我介绍</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES6 / ECMAScript 2015：现代前端的基石</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES5与ES6：旧时魔法与新时力量</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>谁在使用ES6？浏览器与Node.js的亲密拥抱</li></ol><p>重新定义\"变量\"：let, const</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为何var不再流行？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>const: 不仅仅是常量</li></ol><p>文字游戏: 模板字符串 (Template Literals)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>无痛多行与字符串嵌入 Seamless multi-line support &amp; string interpolation</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态字符串制造器 • Dynamic string generation</li></ol><p>赋值艺术: 解构 (Destructuring)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组、对象，一切尽在掌握</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>函数参数的魔法展示</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从对象和数组中轻松提取信息，让数据处理变得更高效</li></ol><p>对象的新姿态: 增强的对象字面量</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简洁、直观、强大</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态属性：令人惊叹的新技巧</li></ol><p>函数进化论: 箭头函数 (Arrow Functions)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>this 的革命</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简洁与力量的完美结合</li></ol><p>展开与收纳: 扩展操作符 (Spread &amp; Rest)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组、对象的新演绎</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>收纳与释放的双重魔法</li></ol><p>可选与默认: 参数默认值</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>告别undefined</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态、简洁、高效</li></ol><p>异步的新篇章: Promises</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回调地狱不再有</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>编程的艺术与优雅</li></ol><p>数据的新世界：Set &amp; Map</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>集合与映射：新玩家的加入</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>高效、强大、无与伦比</li></ol><p>遍历与创新: 迭代器 (Iterators) 与生成器 (Generators)</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据的流动与控制</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>迭代的未来与创新</li></ol>",
          "_id": "68f7497c7c93be3ff4bad77f"
        },
        {
          "code": "L19",
          "title": "ES6 Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>作业1</strong>. Let, Const 和 Var</p><p><strong>任务</strong>: 将以下代码重写为使用 let 和 const 代替 var。解释为什么在每种情况下 let 或 const 更合适。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/aad961274d2af066d5d9a9a389e7ee99.png\"></p><p><strong>作业2</strong>. 箭头函数 (Arrow Functions)</p><p><strong>任务</strong>: 将以下函数转换为箭头函数。然后解释箭头函数如何与常规函数不同地处理 this 关键字。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/ae8c82473e613e9b02e26748ab400d85.png\" height=\"134\" width=\"729\"></p><p><strong>作业3</strong>: 模板字面量 (Template Literals)</p><p><strong>任务</strong>: 使用模板字面量重写以下字符串拼接代码。在字符串中添加一个新行。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/b2497dc3997022b4848567e706738f09.png\" height=\"57\" width=\"769\"></p><p><strong>作业4</strong>.解构赋值 (Destructuring)</p><p><strong>任务</strong>: 使用解构赋值从 person 对象中提取 name 和 age 属性。然后编写一个函数，在参数列表中解构对象的属性。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/592150c13d124922e483fd8de02aa3ca.png\"></p><p><strong>作业5. </strong>默认参数（Default Parameters）</p><p><strong>任务</strong>：编写一个计算机行面积的函数。如果没有提供高度，假设它是一个正方形。使用默认参数为高度设置默认值。<img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/5e316117aafda1e7332a033196f5da30.png\" height=\"326\" width=\"1858\"></p><p><strong>作业6</strong>. Rest/Spread 运算符</p><p><strong>任务</strong>: 使用 Rest 运算符创建一个函数，能够将任意数量的参数相加。然后使用 Spread 运算符合并两个数组。</p><p><img src=\"https://image.jracademy.com.au/lesson/editor/66bf1b0a61b8040020238594/59114f7c3eac62881de33210ca86b521.png\" height=\"224\" width=\"838\"></p><p><br></p><p><strong>作业提交：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的JavaScript 文件（如：Homework_ES6.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad780"
        },
        {
          "code": "L20",
          "title": "ES6进阶技巧与实践",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Promises &amp; Async/Await：轻松应对异步挑战！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解Promises：利用then()精简代码、用catch()处理异常，以及finally()的应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际场景中的Promise链式调用</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>异步编程新姿势：使用async/await实现更简洁、易读的代码。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>Destructuring（解构赋值）：一步到位，快速提取值！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从对象和数组中轻松提取信息，让数据处理变得更高效。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>Spread &amp; Rest Operators（展开和剩余操作符）：更便捷地操作数据！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何利用...操作符展开数组和对象。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何收集函数参数。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>Enhanced Object Literals（增强的对象字面量）：定义对象，更佳清晰！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简化属性和方法的定义。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动态属性名。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>Iterators &amp; Generators（迭代器和生成器）：掌控数据流！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是Iterators？如何自定义迭代。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创造自己的生成器函数，了解其强大之处。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>New Data Structures：Map&amp;Set—探索新的数据结构！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Map和Set的应用，它们与传统对象和数组的差异。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>高效地存储唯一值。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>Modules（模块化）：组织和重用代码的新方式！</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ES6模块化的基本概念。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何import和export模块。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol><p>Symbols &amp; Well-Known Symbols</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Symbol的高级应用</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>内置Symbols的实用性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>👇随堂练习</li></ol>",
          "_id": "68f7497c7c93be3ff4bad782"
        },
        {
          "code": "L21",
          "title": "ES6 (Part2) & TypeScript Assignment",
          "type": "Assignment",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>Post-Lesson Exercise: Practicing Callbacks, Promises, and Async/Await</h3><p><strong>Objective:</strong> This exercise is designed to help students reinforce their understanding of asynchronous programming in JavaScript by practicing callbacks, promises, and async/await.</p><p><strong>Part 1: Callbacks</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a function fetchData that simulates fetching data from a server. This function should take two arguments: a url (string) and a callback function. Use setTimeout to simulate a delay of 2 seconds before calling the callback function with the fetched data.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The fetchData function should print \"Fetching data from [url]...\" when it starts.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>After 2 seconds, it should call the callback function with the data: \"Data from [url]\".</li></ol><p><strong>Part 2: Promises</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the fetchData function to return a promise instead of using a callback.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The function should still simulate a 2-second delay before resolving the promise with the data: \"Data from [url]\".</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>If the url is empty or not provided, reject the promise with an error message: \"Invalid URL\".</li></ol><p><strong>Part 3: Async/Await</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Refactor the code to use async/await to fetch data and handle errors.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create an async function named loadData that calls fetchData with a given url.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use try/catch to handle any errors that occur during the data fetching process.</li></ol><h3><strong>After-Class Homework: Learning the Basics of TypeScript</strong></h3><p><strong>Objective:</strong></p><p>This homework is designed to help students get started with TypeScript, a strongly typed superset of JavaScript. Students will learn about basic TypeScript concepts, including types, interfaces, classes, and functions.</p><p><strong>Part 1: Setting Up TypeScript</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Install TypeScript on your machine and set up a new TypeScript project.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Use npm (Node Package Manager) to install TypeScript globally</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new project directory and initialize it with a tsconfig.json file</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a new TypeScript file called index.ts in the project directory.</li></ol><p><strong>Part 2: Basic Type Annotations</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Write a function in index.ts that takes two numbers as parameters and returns their sum. Use TypeScript to annotate the types of the parameters and the return value.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define the function add with type annotations.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Compile the TypeScript file to JavaScript using the tsc command and run the resulting JavaScript file.</li></ol><p><strong>Part 3: Working with Interfaces</strong></p><p>Exercise Task:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define an interface Person with properties name (string) and age (number). Create a function greet that takes a Person object as a parameter and prints a greeting message.</li></ol><p>Instructions:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Define the Person interface and use it to type the parameter of the greet function.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Create a Person object and pass it to the greet function.</li></ol><p><br></p><p><strong>作业提交：</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将你的JavaScript 文件（如：Homework_ES6.js）上传到 GitHub 仓库，确保项目结构清晰且完整；</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传可访问的仓库链接，点击“确认提交”，提交成功。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad783"
        },
        {
          "code": "L22",
          "title": "Lab(5):构建一个JavaScript天气应用",
          "type": "Lab",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>目标概述</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍实验室的目标：构建一个能够展示选定城市天气的应用。</li></ol><p><strong>HTML 布局</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个表单以接收用户输入的城市名。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义显示天气信息的元素。</li></ol><p><strong>CSS 样式化</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用样式以匹配您提供的设计。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保应用是响应式的，能在不同设备上良好显示。</li></ol><p><strong>JavaScript 交互</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>编写 JavaScript 来处理表单提交，并阻止默认行为。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 fetch 函数从天气 API 获取数据。</li></ol><p><strong>数据处理与展示</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解析 API 返回的 JSON 数据。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将天气数据更新到页面上。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad784"
        },
        {
          "code": "L23",
          "title": "Lab(6):使用Promise和ES6创建进度条",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>进度条 UI</strong></p><p><strong>HTML 结构</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建进度条的基础 HTML 结构，包括步骤指示和前进/后退按钮。</li></ol><p><strong>CSS 样式化</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用样式以匹配您提供的设计，包括圆形步骤指示器和连接线。</li></ol><p><strong>动态样式</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 CSS 类来定义进度条的不同状态，例如当前步骤、完成步骤和待完成步骤。</li></ol><p><strong>JavaScript 逻辑</strong></p><p><strong>设置 Promise</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>编写 JavaScript 函数来模拟异步操作，返回一个 Promise。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 setTimeout 来模拟操作延迟。</li></ol><p><strong>连接 UI 和 Promise</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当用户点击“Next”时，启动一个异步操作，更新进度条状态。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当 Promise 解决时，进度条更新为下一个步骤。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当用户点击“Prev”时，进度条回退到上一个步骤。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad785"
        },
        {
          "code": "L24",
          "title": "Technical SEO基础知识",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>1. SEO是什么，SEO是怎么工作的，影响SEO由哪四大要素影响</p><p>2. SEO用什么工具查看</p><p>3. Technical SEO具体如何进行有优化</p><p>4. 网页的结构应该如何进行优化</p><p>5. 面对SEO规则，HTML里如何进行优化，如何使用Canonical，301等</p><p>6. 怎样进行提升网站，Page Speed如何提升</p>",
          "_id": "68f7497c7c93be3ff4bad786"
        },
        {
          "code": "L25",
          "title": "Node.js如何安装",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>To install Node.js, you can follow these general steps. The exact process may vary slightly depending on your operating system:</p><h3>Windows or macOS</h3><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Download the Installer</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Go to the <a href=\"https://nodejs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">Node.js website</a>.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Choose the version you need. The LTS (Long Term Support) version is recommended for most users, as it's more stable.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Run the Installer</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>After downloading, run the installer.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Follow the installation prompts, including agreeing to the license agreement and choosing the installation location.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>The installer typically includes Node.js and npm (Node Package Manager).</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Verify Installation</strong>:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open a command prompt (Windows) or terminal (macOS).</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Type node -v and press Enter. This should display the Node.js version, confirming it's installed.</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Type npm -v to check npm's version.</li></ol><h3>Linux</h3><p>The process can vary based on the Linux distribution. Here are the steps for Ubuntu:</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Update Package Index</strong>:</li></ol><p>sudo apt update</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Install Node.js</strong>:</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>You can install Node.js from the Ubuntu repository:</li></ol><p class=\"ql-indent-1\">sudo apt install nodejs</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>For the latest version, you might prefer using a PPA (Personal Package Archive):</li></ol><p>curl -sL &lt;https://deb.nodesource.com/setup_16.x&gt; | sudo -E bash -</p><p>sudo apt-get install -y nodejs</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Verify Installation</strong>:</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Check Node.js version:</li></ol><p class=\"ql-indent-1\">node -v</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Check npm version:</li></ol><p class=\"ql-indent-1\">npm -v</p><p>Remember to replace 16.x with the version you want if you're using the PPA method. For other Linux distributions, the process will be similar but might require different commands to update packages or add repositories.</p>",
          "_id": "68f7497c7c93be3ff4bad789"
        },
        {
          "code": "L26",
          "title": "React如何安装",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3>React 安装、配置及创建项目教学文档</h3><h3>1. 环境要求</h3><p>首先，确保您的开发环境包括以下：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Node.js：React 需要 Node.js 环境。请访问 <a href=\"https://nodejs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">Node.js 官网</a> 下载并安装最新版本。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>npm（Node 包管理器）：通常会与 Node.js 一起安装。</li></ol><h3>2. 安装 Create React App</h3><p>Create React App 是一个官方支持的方式，用于创建单页 React 应用程序。它提供了一个现代化的构建设置，无需配置。</p><p>在终端或命令提示符中运行以下命令来安装 Create React App：</p><p>npx create-react-app my-app</p><p>这将在当前目录下创建一个名为 my-app 的新目录。</p><h3>3. 进入项目目录</h3><p>安装完成后，进入项目目录：</p><p>cd my-app</p><h3>4. 启动开发服务器</h3><p>在项目目录中，运行以下命令启动开发服务器：</p><p>npm start</p><p>此命令将启动一个本地服务器，并在默认浏览器中打开 http://localhost:3000。当您对代码进行更改时，页面将实时重新加载。</p><h3>5. 编辑 React 组件</h3><p>打开项目文件夹，您会看到一些预创建的文件。最重要的是 src/App.js，这是您的 React 应用程序的主要组件。</p><p>您可以开始编辑 src/App.js，并在浏览器中看到您的更改。例如，尝试更改文本并保存文件，您的更改将立即反映在浏览器中。</p><h3>6. 构建和部署</h3><p>当您准备好将应用程序部署到生产环境时，运行以下命令以构建应用程序：</p><p>npm run build</p><p>这将在 build 目录中创建一个优化的生产构建。</p><h3>7. 后续步骤</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习 React 基础：建议浏览 <a href=\"https://reactjs.org/\" rel=\"noopener noreferrer\" target=\"_blank\">React 官方文档</a>，了解更多关于 React 的知识。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件编写：实践通过编写不同的组件来构建复杂的 UI。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>状态管理：学习使用 React 的状态管理，例如使用 Hooks。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>路由：如果您的应用需要导航，尝试使用如 react-router-dom 等库。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad78a"
        },
        {
          "code": "L27",
          "title": "React项目快速上手",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>React 框架的起源与版本演进历程：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 框架的起源和发展历程，包括重要版本的发布和主要特性的改进。</li></ol><p>快速上手 React：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置开发环境：指导学生安装 Node.js 和 VS Code，以便开始 React 应用程序的开发。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>快速上手 create-react-app：介绍 create-react-app 工具，以及如何使用它来快速创建 React 项目的基本结构。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>体验 React 核心概念：通过编写简单的示例代码，让学生体验 JSX 语法以及 useState 和 useEffect 等 React 核心概念的使用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>拆分组件：引导学生学习如何将 React 应用程序拆分为可维护的组件，提高代码的复用性和可维护性。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad78b"
        },
        {
          "code": "L28",
          "title": "React组件基础",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>组件基础：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用 SASS 与 Bootstrap 构建组件的外观：介绍如何利用 SASS 预处理器和 Bootstrap 框架来快速构建组件的外观和样式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>强大的模板语法 JSX：深入了解 JSX 语法的特点和优势，以及如何在 React 组件中编写 JSX 代码。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props &amp; State：解释组件中的 props 和 state 的概念，以及它们分别用于什么目的。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Props 与 State 的区别和联系：对比 props 和 state 的区别，以及它们之间的联系和作用范围。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件间通讯：讨论不同组件之间如何进行通讯，包括父子组件通讯和兄弟组件通讯等方式。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>综合实例：构建一个结构复杂的页面，通过实际例子来理解 React 切分组件的思想，以及如何合理组织组件结构和通讯。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad78c"
        },
        {
          "code": "L29",
          "title": "React Router",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>快速上手 React Router:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索 React Router，这个强大的库可让你构建单页应用程序的导航系统，快速开始你的路程。</li></ol><p>嵌套路由:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解嵌套路由，通过分层结构创建复杂的页面布局和导航。</li></ol><p>HashRouter 与 BrowserRouter:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比 HashRouter 和 BrowserRouter，了解它们之间的区别，以及何时使用哪一个来管理 URL。</li></ol><p>React Router 运行机制:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 React Router 的内部机制，从路由匹配到组件渲染，掌握它如何使一切无缝运转。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad78d"
        },
        {
          "code": "L30",
          "title": "React表单处理",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>非受控表单:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解非受控表单，它们是表单元素的一种处理方式，适用于简单的表单，但缺乏状态控制和验证。</li></ol><p>受控表单:</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索受控表单，这种表单通过React组件状态来控制表单元素的值和行为，使数据流更可控。</li></ol><p>表单校验 (Form Validation):</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会如何对表单进行校验，确保用户输入的数据满足特定的要求，提高数据的有效性和安全性。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad78e"
        },
        {
          "code": "L31",
          "title": "React服务端交互",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>典型交互方式：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨与服务器通信的经典方式，包括 Ajax、Fetch 和 Axios，并介绍它们各自的用途和优势。</li></ol><p>快速上手 Axios：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何迅速上手 Axios，了解其基本用法和常见配置，以及如何发起 HTTP 请求并处理响应。</li></ol><p>拦截器处理通用操作：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解如何使用 Axios 拦截器来处理通用的操作，如请求和响应的日志记录、身份验证、错误处理等。</li></ol><p>封装可复用的 Axios 服务：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会将 Axios 封装为可复用的服务，以便在整个应用程序中共享和维护一致的 HTTP 请求配置，提高代码的可维护性和可扩展性。</li></ol><p>React 组件的生命周期：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解 React 组件的生命周期方法，包括挂载、更新和卸载阶段，并学会如何在组件的生命周期中处理各种操作。</li></ol><p>VDOM：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍虚拟 DOM（VDOM）的概念，以及其在 React 中的作用和优势，理解 VDOM 的工作原理。</li></ol><p>类组件与函数式组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>对比类组件和函数式组件的特点和用法，并解释为什么函数式组件越来越受欢迎。</li></ol><p>复合组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何使用复合组件将多个组件组合在一起，以构建更复杂和灵活的 UI。</li></ol><p>高阶组件：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍高阶组件的概念和用法，以及如何使用高阶组件来增强组件的功能和复用性。</li></ol><p>开源组件库与企业业务组件库：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨开源组件库的特点和优势，以及如何选择和使用适合项目需求的组件库；同时，讨论企业业务组件库的重要性和设计原则。</li></ol><p>动态生成页面与 React 低代码：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍动态生成页面的概念和 React 低代码的特点，了解如何利用 React 技术栈实现动态页面和低代码开发。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad78f"
        },
        {
          "code": "L32",
          "title": "React Hooks",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>React Hooks：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 内置的 Hooks，如 useState 和 useEffect，并解释它们的作用和用法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 useState Hook，包括如何在函数组件中管理状态并进行状态更新。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入理解 useEffect Hook，包括如何处理副作用、订阅和取消订阅等操作。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何自定义 Hooks，以便在应用程序中共享和重用状态逻辑。</li></ol><p>用 useTranslation 钩子实现组件的 i18n：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨如何使用第三方库中提供的 useTranslation 钩子来实现组件的国际化（i18n），以支持多语言应用程序的开发。</li></ol><p>状态管理：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解状态管理的基本概念，包括状态、单一数据源、不可变性等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍 React 内置的 Context API，以及如何使用 Context 在组件之间共享状态。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>简要介绍 React Redux，作为一种常用的状态管理中间件，以及其与 Context 的区别和优势。</li></ol><p>自动化测试：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何进行单元测试，包括安装配置 Jest 测试框架和详解 Jasmine 语法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何进行集成测试，包括安装配置 Cypress 测试框架和运行集成测试用例。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad790"
        },
        {
          "code": "L33",
          "title": "React基础(1) - 代码质量",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码规范的重要性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>课堂实践：写出可读性高的代码 - Income Tax Calculator</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写出符合人类思维方式的代码</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>代码质量的核心概念：可读性、可维护性、可扩展性</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>SOLID 原则</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：写出一个高质量的 getFlightsStops 函数</li></ol>",
          "_id": "68f7497c7c93be3ff4bad791"
        },
        {
          "code": "L34",
          "title": "React基础(2) - 为什么需要 React",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>传统开发 vs 组件化开发</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 的核心概念（声明式 UI、组件化、单向数据流）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用 JS 操作 DOM vs 用 React 渲染 UI（对比体验）</li></ol>",
          "_id": "68f7497c7c93be3ff4bad793"
        },
        {
          "code": "L35",
          "title": "利用AWS部署前端spa项目",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><span style=\"color: rgb(25, 25, 25);\">利用AWS部署前端spa项目</span></p>",
          "_id": "68f7497c7c93be3ff4bad796"
        },
        {
          "code": "L36",
          "title": "开发环境与工具",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是打包工具？(Webpack)</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Babel 介绍：JSX 如何转换成 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是脚手架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目（Vite）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：用 Vite 启动一个 React 应用环境</li></ol>",
          "_id": "68f7497c7c93be3ff4bad798"
        },
        {
          "code": "L37",
          "title": "Lab(7):使用React和Hooks创建分页应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目初始化和组件结构</strong></p><p><strong>项目设置</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个新的 React 应用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置项目的文件结构，包括组件和样式文件。</li></ol><p><strong>组件规划</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>规划所需的组件，包括分页控件和文章列表。</li></ol><p><strong>构建静态组件</strong></p><p><strong>静态博客列表</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个博客列表组件，该组件包含静态的文章数据。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>应用基础的样式来匹配提供的截图设计。</li></ol><p><strong>分页控件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个分页控件组件，包括页码按钮。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>样式化分页控件以提供反馈，如当前激活的页码。</li></ol><p><strong>添加动态功能</strong></p><p><strong>状态管理</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 useState Hook 来管理文章列表和当前页码的状态。</li></ol><p><strong>分页逻辑</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现分页逻辑，以便在点击分页按钮时更新显示的文章列表。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 useEffect Hook 来处理组件的副作用，如 API 调用或数据过滤。</li></ol><p><strong>文章加载</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>若有可用的 API，使用 fetch 来动态加载文章数据。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>若没有 API，可以在本地状态中模拟一组文章数据。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad79a"
        },
        {
          "code": "L38",
          "title": "React基础(3) - 开发环境与工具",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是打包工具？(Webpack)</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Babel 介绍：JSX 如何转换成 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是脚手架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建第一个 React 项目（Vite）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：用 Vite 启动一个 React 应用环境</li></ol>",
          "_id": "68f7497c7c93be3ff4bad79b"
        },
        {
          "code": "L39",
          "title": "React基础(4) - 组件 & JSX 语法",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>JSX 语法规则</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在 JSX 里写 JavaScript？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>组件的 Props（属性传递）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：编写一个简单的 Button 组件，支持不同文本</li></ol>",
          "_id": "68f7497c7c93be3ff4bad79c"
        },
        {
          "code": "L40",
          "title": "Lab(8):使用React和localStorage构建笔记卡片应用",
          "type": "Lab",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目初始化和组件结构</strong></p><p><strong>项目初始化</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个新的 React 应用并设置项目结构。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义笔记卡片组件和笔记输入组件。</li></ol><p><strong>组件规划</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>规划应用中的状态管理逻辑。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确定哪些组件需要内部状态，哪些需要应用范围的状态。</li></ol><p><strong>构建静态组件</strong></p><p><strong>笔记输入组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现一个文本输入框，允许用户输入笔记内容。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>添加一个“保存”按钮，用户点击后可以保存笔记。</li></ol><p><strong>笔记卡片组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个显示笔记内容的卡片。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>每个卡片上应有一个“删除”按钮，允许用户删除笔记。</li></ol><p><strong>添加动态功能</strong></p><p><strong>状态管理与 Hooks</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 useState Hook 管理笔记内容的状态。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 useEffect Hook 来监听 localStorage 中数据的变化。</li></ol><p><strong>实现笔记保存逻辑</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在用户点击“保存”按钮时，将新笔记保存到 localStorage。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>保存后，自动在页面上展示新添加的笔记。</li></ol><p><strong>实现笔记删除逻辑</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当用户点击“删除”按钮时，从 localStorage 和页面上移除对应的笔记。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad79e"
        },
        {
          "code": "L41",
          "title": "Node.js (1): 引领现代后端的黑马",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Node.js与JavaScript的闪耀时刻</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么JavaScript不仅仅是浏览器的语言？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从浏览器到后端：Node.js的崛起与它的创始故事。</li></ol><p><strong>了解Node.js的特性与架构</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>事件驱动(Event-driven)、非阻塞I/O与高并发：Node.js的三大法宝。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>事件循环(Event Loop)与异步编程：实现高效运行的秘密。</li></ol><p><strong>熟悉Node.js开发环境</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何配置一个高效的Node.js开发环境。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索Node.js的命令行界面及其功能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Node.js的版本和nvm</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>验证你的安装：编写你的第一个Node.js脚本。</li></ol><p><strong>Node.js中的模块系统</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CommonJS规范简介。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何在Node.js中使用require<strong>和</strong>module.exports。</li></ol><p><strong>熟悉Node.js的核心模块</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文件系统fs：如何与服务器上的文件进行交互。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTTP模块：启动你的第一个Node.js服务器。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>其他内置模块：探索Node.js的强大生态系统。</li></ol><p><strong>搭建一个简单的webserver</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个简单的Node.js服务器，它可以返回\"Hello, World!\"到任何请求它的客户端。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>加入一个路由，让服务器可以响应/aboutURL，返回\"About Us\"信息。</li></ol><p><strong>碰到bug如何解决</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>遇事不决consolelog</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何开启Debug模式</li></ol><p><strong>实践练习：HelloNode!</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>任务：基于我们刚刚创建的webserver和关于fs的使用，尝试写一个notetakingapp，只需要支持写入和读取两种功能</li></ol>",
          "_id": "68f7497c7c93be3ff4bad79f"
        },
        {
          "code": "L42",
          "title": "MongoDB面试真题: Weather App项目介绍",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>项目背景：</strong></h3><p>这个项目的灵感来源于MongoDB的面试题。在现代互联网应用中，与远程API的交互成为了一个关键技能。为了提高你的API交互技巧，我们为你设计了这个挑战：创建一个天气预报应用。</p><p><strong>原始 MongoDB 面试项目题</strong></p><p>The coding exercise we’d like to work on is building an app where you can input a city name to show the current weather in that city area and the forecast for the upcoming 3 days. You may use <a href=\"http://www.weatherapi.com/\" rel=\"noopener noreferrer\" target=\"_blank\">www.weatherapi.com</a>, which provides a free API to query weather data. It does require signing up to generate an API key but there is an - <a href=\"https://www.weatherapi.com/api-explorer.aspx\" rel=\"noopener noreferrer\" target=\"_blank\">https://www.weatherapi.com/api-explorer.aspx</a> - that makes it easy to check the response.</p><p>You are free to use any frontend libraries to build this web application. Once you have built the application please send the code back to us in a .zip file (without any modules that can be fetched from the internet) so that we can clone the repository and check its functionality locally on our machine. Please provide some instructions on how to run it locally in the readme. Feel free to comment on the readme any design decisions or assumptions that were made while you built this application.</p><p>We will spend some time discussing your solution during the programming interview. Please treat this task like a feature you would build as an engineer using developer best practices and deploy in a production ready state.</p><p>Please ensure add some unit test &amp; e2e test if possible.</p><h3><br></h3><h3><strong>项目要求：</strong></h3><p><strong>核心功能</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>允许用户输入城市名称。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>显示该城市当前的天气情况。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供未来三天的天气预报。</li></ol><p><strong>数据来源</strong>：请使用<a href=\"http://www.weatherapi.com/\" rel=\"noopener noreferrer\" target=\"_blank\">www.weatherapi.com</a>。它提供了一个免费的API来查询天气数据。需要https://www.weatherapi.com/api-explorer.aspx 可以轻松检查响应。</p><p><strong>技术栈选择</strong>：你可以自由选择任何前端库来构建此网络应用。</p><p><strong>项目提交</strong>：</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>请将代码上传到github中（不包括可以从互联网获取的模块）并提交，这样我们可以Clone repo并在我们的机器上本地检查其功能。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在readme中提供关于如何在本地运行的说明。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在readme中，你可以评论在构建此应用程序时做出的任何设计决策或假设。</li></ol><p><strong>代码质量</strong>：我们希望你像处理真正的工程任务那样对待这个任务，使用开发者的最佳实践，并确保它处于生产就绪状态。</p><p><strong>测试</strong>：请确保添加一些单元测试和e2e测试（如果可能的话）。</p><h3><br></h3><h3><strong>项目目标：</strong></h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提高与API的交互能力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>熟悉前端框架和库的使用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>加强代码组织和架构设计技能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提高测试驱动开发的能力</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7a0"
        },
        {
          "code": "L43",
          "title": "Node.js (2) : API和RESTful API",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>深入理解URL</strong>结构</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>URL的组成部分与意义。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>默认端口</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>query param</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>hashtag</li></ol><p><strong>HTTP请求与响应</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTTP请求/响应的基本结构。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTTP方法概览：GET, POST, PUT, DELETE。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>HTTP中的常用Header：<strong>Content-Type</strong>、**Cookie**等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解常见的HTTP状态码：200, 404, 500等。</li></ol><p><strong>数据传输格式 - JSON</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是JSON</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么用JSON</li></ol><p><strong>API与RESTful API</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是API</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>RESTful 的含义与原则。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么 RESTful API 是构建现代 Web 应用的首选？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Restful API 设计规范</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>除了restful api，业界还有哪些常见的通讯方式</li></ol><p><strong>API中涉及到的authentication和authorization</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是authentication和authorization</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是token</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>token如何传递</li></ol><p><strong>Postman：API 开发者的利器</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么我们需要Postman？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Postman的基本使用：发送请求、查看响应、组织你的测试API</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>环境变量</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>收藏夹功能</li></ol><p><strong>实践练习：调用第三方API</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>任务：运用postman来调用第三方API （newsapi和pocketmon）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学会阅读api文档和掌握postman的使用</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7a2"
        },
        {
          "code": "L44",
          "title": "Working with API",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>一些网站的拥有者使用API，也就是应用程序编程接口，以便于数据提取。API充当了客户端（如你的计算机）与服务器之间的桥梁，使它们能够进行通信。客户端通过这座桥发送请求，服务器则以所需的数据进行响应。</p><p>想象一下这种用处：设想有两家公司，匠人学院和一个招聘网站，正在寻求合作。如果匠人学院想与招聘网站共享有关学生学习进度的最新信息，他们可以使用API。这样，招聘网站可以直接从匠人学院的服务器获取最新的学生数据。</p><p>这个过程涉及两个主要步骤：API请求和API响应。招聘网站通过API向匠人学院的服务器发送请求，之后服务器会以数据进行响应。</p><p>要将像OpenAI的GPT这样的基础模型集成到你的产品中，你需要连接OpenAI的API。这一连接对于发送请求和接收OpenAI服务的响应至关重要，让你可以在应用中使用他们的基础模型。掌握API的使用是AI开发者和工程师必备的另一项重要技能。</p>",
          "_id": "68f7497c7c93be3ff4bad7a3"
        },
        {
          "code": "L45",
          "title": "Lab(9):使用React构建收支管理应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目初始化和规划</strong></p><p><strong>项目设置</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 create-react-app 初始化一个新的 React 应用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置项目结构，包括组件、上下文和 reducer 文件。</li></ol><p><strong>组件设计</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>规划应用所需的组件，如余额显示、收支摘要、历史记录列表和新增交易表单。</li></ol><p><strong>构建静态组件</strong></p><p><strong>余额组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个显示当前余额的组件。</li></ol><p><strong>收支摘要组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现两个显示收入总额和支出总额的组件。</li></ol><p><strong>交易历史组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个列表组件来展示历史交易记录。</li></ol><p><strong>新增交易组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现一个表单，让用户能够输入交易名称和金额，并选择是收入还是支出。</li></ol><p><strong>实现应用逻辑</strong></p><p><strong>状态管理</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 useReducer 来处理应用状态的复杂逻辑。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>定义一个 reducer 函数来处理添加和删除交易的动作。</li></ol><p><strong>上下文管理</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个 Context 来跨组件共享状态。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 useContext Hook 在各组件中访问和更新状态。</li></ol><p><strong>交易逻辑</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在表单组件中处理新增交易的逻辑。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保交易被添加到列表中，并更新余额和摘要。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7a5"
        },
        {
          "code": "L46",
          "title": "Node.js (3) : NPM and Express.js",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>NPM与Node.js的关系</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是<strong>NPM</strong>？为什么每个Node.js开发者都应该了解它？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何选择一个可靠的npmpackage</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>其他类似于npm的工具</li></ol><p><strong>使用npm</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>npm是如何安装一个package的</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>npm是如何管理package的</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>几种不同的依赖方式</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>package的版本管理</li></ol><p><strong>探索常用的npm包</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>lodash</strong>：JavaScript实用工具库，提供模块化、性能高效、功能丰富的方法。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>dayjs：日期和时间的解析、验证、操作和格式化。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>axios</strong>：基于promise的HTTP客户端，用于浏览器和node.js。</li></ol><p><strong>Express.js：Web开发的新时代</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么选择<strong>Express.js</strong>作为我们的授课框架？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>有哪些基于express的高阶框架</li></ol><p><strong>了解Express的路由</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习基础路由概念以及处理不同的HTTP请求。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>一个http请求有哪些携带数据的方式</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>不同场景下该如何获取这些数据</li></ol><p><strong>Express中的中间件：工作流的灵魂</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是中间件？为何它在Express中起到核心作用？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解中间件的执行顺序</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7a6"
        },
        {
          "code": "L47",
          "title": "Express和RESTful API实践",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>Hands-on Practice实践</strong>：</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>构建一个简单的Express项目，</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现Restful API路由</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>运用postman和debugger进行调试</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>并借助npm包与中间件优化你的代码逻辑</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7a7"
        },
        {
          "code": "L48",
          "title": "Lab(10):使用Node.js和Express构建天气查询后端服务器",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目设置和 Express 基础</strong></p><p><strong>初始化项目</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 npm init 创建一个新的 Node.js 项目。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>安装 Express 作为项目依赖。</li></ol><p><strong>创建基本服务器</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置一个简单的 Express 服务器。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>添加一个路由，响应根路径 (/) 的 GET 请求。</li></ol><p><strong>添加天气路由</strong></p><p><strong>设置路由</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个新的路由处理器，专门用于天气数据查询。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>这个路由应该能够接受城市名作为参数。</li></ol><p><strong>集成天气 API</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如果有可用的第三方天气 API，编写代码来查询它。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如果没有 API，可以创建一个模拟数据作为响应。</li></ol><p><strong>处理 API 响应</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从天气 API 获取数据后，处理并格式化数据。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将格式化后的数据发送回前端应用。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7a9"
        },
        {
          "code": "L49",
          "title": "Node.js (4) :  Build express server with industry standard",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>express项目的文件结构</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何把不同文件、模块按职责划分</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>不同项目如何扩展现有的结构</li></ol><p><strong>日志</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么要记录日志</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>相关的package - winston和morgan</li></ol><p><strong>API 安全与限速</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Helmet的使用</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解 <strong>Rate Limiting</strong>：为什么和如何？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用中间件进行API限速。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>CORS</strong>问题及其解决策略。</li></ol><p><strong>API文档和版本控制</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>API文档的重要性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用工具如<strong>Swagger</strong>生成动态API文档。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>API版本控制的方法和最佳实践。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7aa"
        },
        {
          "code": "L50",
          "title": "Node.js (5): MongoDB",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>初探MongoDB</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>MongoDB</strong>的简介：为何它与Node.js成为绝配？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据模型：文档型数据库与传统关系型数据库的对比。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>CRUD: 针对MongoDB的CRUD</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习</li></ol><p><strong>数据之间的关联和MongoDB进阶</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何定义你的数据结构与关系。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是indexing，aggregation和transaction。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ac"
        },
        {
          "code": "L51",
          "title": "Node.js (6) : Mongoose & Authorization and Authentication",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>身份验证与授权的必要性</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么我们需要身份验证？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>区分身份验证（Authentication）和授权（Authorization）。</li></ol><p><strong>本地身份验证实战</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>进行本地身份验证：如何存储和验证密码。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>加密的重要性：了解如何使用<strong>bcrypt</strong>为用户密码加密。</li></ol><p><strong>JWT：无状态身份验证</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>JSON Web Tokens(JWT)介绍。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用JWT进行身份验证的优点。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实践：如何在Express.js中生成和验证JWT。</li></ol><p><strong>OAuth2.0与第三方身份验证</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是OAuth2.0？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Google,Facebook,Twitter等第三方身份验证是如何实现的。</li></ol><p><strong>Session管理与Cookie安全</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>了解Session与session：存储和使用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>和jwt比有什么不同</li></ol><p><strong>Role-Based Access Control(RBAC)</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>什么是<strong>RBAC</strong>？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何设计和实现基于角色的访问控制。</li></ol><p><strong>连接MongoDB：开始Node.js与数据库的对话</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>利用<strong>Mongoose</strong>：更高效、更简洁地与MongoDB进行交互。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设计模型：如何定义你的数据结构与关系。</li></ol><p><strong>CRUD操作实战与最佳实践</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用Mongoose进行的数据操作：创建、读取、更新和删除。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>高效查询：利用Mongoose进行数据查询的技巧与优化。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>修改与删除的保护性思路：确保数据操作的安全性。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为应用实现JWT身份验证，确保只有登录的用户可以进行某些操作。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ae"
        },
        {
          "code": "L52",
          "title": "React基础(5) - 条件渲染 & 列表渲染",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>if / 三元运算符 ? : / &amp;&amp; 渲染组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数组 .map() 生成组件列表</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为什么 key 很重要？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：渲染一个 Todo List</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7b0"
        },
        {
          "code": "L53",
          "title": "课后补充知识：什么是SSR，CSR，SSG",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>服务器端渲染（SSR）</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍SSR的工作原理和主要特点。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索SSR的优势，如更快的首屏加载时间和更好的SEO。</li></ol><p><br></p><p><strong>客户端渲染（CSR）</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解CSR如何在浏览器端动态生成页面内容。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析CSR的优点，例如更丰富的交互和更好的用户体验。</li></ol><p><strong>静态站点生成（SSG）</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>说明SSG的概念和生成静态网页的过程。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨SSG的使用场景，如博客、文档站点等。</li></ol><p><strong>选择最适合的渲染技术</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>根据不同的项目需求和目标，讨论如何选择最合适的渲染方式。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7b1"
        },
        {
          "code": "L54",
          "title": "Lab(11):使用React, Hooks和Redux Toolkit构建图书馆应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目初始化和规划</strong></p><p><strong>项目设置</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 create-react-app 初始化一个新的 React 应用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>安装 Redux Toolkit 和 React-Redux。</li></ol><p><strong>组件设计</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>规划应用所需的组件，如添加书籍表单和书籍列表。</li></ol><p><strong>构建静态组件</strong></p><p><strong>添加书籍组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个表单组件，允许用户输入书名和作者名。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>添加一个提交按钮，用于提交新书籍。</li></ol><p><strong>书籍列表组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个列表组件，用于展示添加的书籍。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>每本书旁边都有一个删除按钮。</li></ol><p><strong>集成 Redux Toolkit</strong></p><p><strong>设置 Redux Store</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 Redux Toolkit 配置 store。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个 books slice 来管理书籍的状态。</li></ol><p><strong>添加书籍逻辑</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在添加书籍组件中实现 dispatch 功能，以提交新书籍到 store。</li></ol><p><strong>删除书籍逻辑</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在书籍列表组件中实现删除书籍的功能。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7b3"
        },
        {
          "code": "L55",
          "title": "Agile方法论: 解锁团队的协作潜力",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>1. Agile敏捷开发：历史与哲学探究</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从传统瀑布模型到敏捷方法的革命性变革。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷哲学：为什么它如此强大？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agile 哲学：为什么\"Agile\"变得如此重要？</li></ol><p><strong>2. 深入Agile Manifesto (敏捷宣言)</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷的四个核心价值观：从\"个体与互动\"到\"响应变化\"。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>十二条开发原则的解析：如何将价值观付诸实践？</li></ol><p><strong>3. Scrum、Kanban：敏捷的支柱</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Scrum 框架的各个流程概述，“3355”方法论</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Scrum：迭代开发、自组织团队的奇妙之处。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Kanban：可视化工作流、持续改进的精髓。</li></ol><p><strong>4. 深入Scrum</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Product Backlog：需求的生命线。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Sprints：高效迭代与交付的秘密。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>日常站立会议 (Daily Standups)：团队默契的塑造。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Sprint Retrospectives：持续改进的动力。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>结合实际工作讲解各个流程：scrum planning，daily standup，scrum board，scrum review meeting，spring retrospective meeting</li></ol><p><strong>5. 用户故事与验收标准：需求的精髓</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>打造高质量用户故事的策略。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Acceptance Criteria：确保交付符合预期的关键。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>怎样写 backlog，怎样写用户故事：“完成”的定义，故事拆分和故事估算</li></ol><p><strong>6. 实践出真知：构建自己的敏捷看板</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用现代工具 (如Trello、JIRA) 建立工作流程。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实际操作：从构建产品积压到完成冲刺。</li></ol><p><strong>7. 敏捷在企业中的演进</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大型组织的敏捷转型：成功的案例分析。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>避免常见陷阱：敏捷实施中的挑战与解决。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>怎样改进流程、提高效率，为什么企业需要 T 型人才</li></ol><p><strong>8. 敏捷的未来展望</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>敏捷开发不断演进的趋势。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何将敏捷原则融入日常工作。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7b4"
        },
        {
          "code": "L56",
          "title": "Workshop: Agile Project Management",
          "type": "Workshop",
          "isLive": true,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop: Agile Project Management</p>",
          "_id": "68f7497c7c93be3ff4bad7b5"
        },
        {
          "code": "L57",
          "title": "什么是Agile SDLC, Waterfall, Agile介绍",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2>1. Agile 的由来、开发宣言、原则、主要关注点</h2><h3>1.1 Agile 的由来（为什么会出现）</h3><p><strong>背景：90年代的软件项目普遍失败：</strong></p><ul><li><p>需求变更频繁，但传统方法假设需求稳定</p></li><li><p>大项目周期长，交付晚，客户等到最后才看到结果</p></li><li><p>文档多、审批慢，团队士气低</p></li><li><p>做完才发现“做错了/不需要”</p></li></ul><p><strong>Agile 出现的核心原因：</strong></p><blockquote><p>软件开发是“高不确定性 + 高变化”的工作，需要一种能持续适应变化、快速验证方向的方式。</p></blockquote><h3>1.2 Agile Manifesto（敏捷开发宣言的四句话）</h3><p>敏捷宣言强调：</p><ol><li><p><strong>个体和互动</strong> 高于 流程和工具</p></li><li><p><strong>可工作的软件</strong> 高于 完备的文档</p></li><li><p><strong>客户协作</strong> 高于 合同谈判</p></li><li><p><strong>响应变化</strong> 高于 遵循计划</p></li></ol><blockquote><p>不是说右边不重要，而是“左边更重要”。</p></blockquote><h3>1.3 Agile 12 个原则（讲课时可分 3 组）</h3><p><strong>A. 价值与交付</strong></p><ul><li><p>最优先的是持续交付有价值的软件</p></li><li><p>频繁交付（几周到几月）</p></li><li><p>可工作的软件是进度的首要度量</p></li></ul><p><strong>B. 变化与协作</strong></p><ul><li><p>欢迎需求变化</p></li><li><p>业务方与开发者每天合作</p></li><li><p>通过面对面沟通效率最高</p></li><li><p>建立信任、赋能团队</p></li></ul><p><strong>C. 团队与改善</strong></p><ul><li><p>团队自组织</p></li><li><p>持续关注技术卓越和良好设计</p></li><li><p>简化（只做必要的事）</p></li><li><p>定期反思并调整</p></li></ul><h3>1.4 Agile 的主要关注点（3 个关键词）</h3><ol><li><p><strong>价值（Value）</strong></p></li><li><p><strong>反馈（Feedback）</strong></p></li><li><p><strong>适应（Adaptation）</strong></p></li></ol><h3>1.5 什么是“价值”（Value）？</h3><p>在 Agile 里，价值不是“我们做了多少功能”，而是：</p><ul><li><p><strong>用户真的用了吗？</strong></p></li><li><p><strong>解决了用户什么痛点？</strong></p></li><li><p><strong>对业务产生什么结果？</strong></p></li></ul><blockquote><p>价值 = 用户价值 + 业务价值（可衡量）</p></blockquote><p>举例：</p><ul><li><p>❌ 做了一个“高级搜索页面” = 功能</p></li><li><p>✅ 让用户找内容时间减少 50% = 价值</p></li></ul><hr><h2>2. 传统项目管理怎么做？（用悉尼歌剧院 / 悉尼轻轨讲）</h2><blockquote><p>这些是典型“传统/瀑布式”工程项目，适合需求稳定的大型基建。</p></blockquote><h3>2.1 传统项目管理核心思路</h3><ul><li><p>一次性做完整规划</p></li><li><p>需求与范围先锁死（Scope Fixed）</p></li><li><p>依靠详细文档与阶段审批</p></li><li><p>“按计划交付”优先于“按价值调整”</p></li></ul><h3>2.2 悉尼歌剧院（经典案例）</h3><p><strong>特征：</strong></p><ul><li><p>初期计划无法准确估算复杂度</p></li><li><p>设计持续变化</p></li><li><p>最终严重超预算、超工期</p></li><li><p>但仍被当作“工程奇迹”</p></li></ul><p><strong>课堂引导点：</strong></p><ul><li><p>在极高不确定性项目中，“先定死计划”是危险的</p></li><li><p>传统方法常把“变化”视为失败来源，但变化本身不可避免</p></li></ul><h3>2.3 悉尼轻轨（Sydney Light Rail）</h3><p><strong>特征：</strong></p><ul><li><p>涉及多方利益/政策/施工风险</p></li><li><p>审批链路长</p></li><li><p>需求/范围变化导致延期</p></li><li><p>最终也出现预算与时间偏差</p></li></ul><p><strong>课堂引导点：</strong></p><ul><li><p>传统方法在复杂系统中应对变化成本极高</p></li><li><p>这类“长期、多方、变化多”的项目其实更像软件开发</p></li></ul><hr><h2>3. SDLC（Software Development Life Cycle）是什么？</h2><h3>3.1 定义</h3><p>SDLC = 软件从“想法 → 交付 → 运维”的完整生命周期模型<br>它解决的是：</p><blockquote><p>软件开发到底要经历哪些阶段？</p></blockquote><h3>3.2 SDLC 常见阶段（你可以画一个环）</h3><ol><li><p><strong>Requirement Analysis（需求分析）</strong></p><ul><li><p>明确用户/业务要解决什么问题</p></li></ul></li><li><p><strong>Design（系统/架构/交互设计）</strong></p><ul><li><p>选择技术方案、数据流、UI草图</p></li></ul></li><li><p><strong>Implementation（开发）</strong></p><ul><li><p>写代码、集成模块</p></li></ul></li><li><p><strong>Testing（测试）</strong></p><ul><li><p>单元/集成/E2E/验收</p></li></ul></li><li><p><strong>Deployment（部署交付）</strong></p><ul><li><p>上线到 staging / production</p></li></ul></li><li><p><strong>Maintenance（维护迭代）</strong></p><ul><li><p>修Bug、性能优化、新功能</p></li></ul></li></ol><p>Agile 与 Waterfall 的差异，主要就是“怎么组织这些阶段”。</p><hr><h2>4. SDLC-Waterfall 和 V-Model 是什么？</h2><h3>4.1 Waterfall（瀑布模型）</h3><ul><li><p>阶段线性：需求 → 设计 → 开发 → 测试 → 交付</p></li><li><p>每个阶段结束后基本不回头</p></li><li><p><strong>适合需求稳定的项目</strong></p></li></ul><p><strong>问题：</strong></p><ul><li><p>反馈太晚（到测试才发现错）</p></li><li><p>变化成本高</p></li><li><p>交付周期长</p></li></ul><h3>4.2 V-Model（V字模型）</h3><p>V-model 是 Waterfall 的加强版：<br>左边是开发阶段，右边是对应测试阶段：</p><ul><li><p>需求 ↔ 验收测试</p></li><li><p>系统设计 ↔ 系统测试</p></li><li><p>架构设计 ↔ 集成测试</p></li><li><p>模块设计 ↔ 单元测试</p></li></ul><p><strong>优势：</strong></p><ul><li><p>强调“每个阶段都有对应验证”</p></li><li><p>更适合高可靠行业（医疗、航天、军工）</p></li></ul><p><strong>局限：</strong></p><ul><li><p>仍然是“计划驱动 + 变化昂贵”</p></li></ul><hr><h2>5. Project Management Methodologies 有哪些？</h2><p>你可以按 “适用领域” 讲：</p><h3>5.1 Predictive（预测式/计划驱动）</h3><ul><li><p><strong>Waterfall</strong></p></li><li><p><strong>PRINCE2</strong></p></li><li><p><strong>PMBOK / PMP 体系</strong></p></li><li><p><strong>Critical Path Method (CPM)</strong><br>适用：需求稳定、大型工程、强合规场景</p></li></ul><h3>5.2 Adaptive（适应式/变化驱动）</h3><ul><li><p><strong>Agile / Scrum / Kanban</strong></p></li><li><p><strong>XP（极限编程）</strong></p></li><li><p><strong>DSDM / Crystal 等</strong><br>适用：软件、互联网产品、创业团队</p></li></ul><h3>5.3 Hybrid（混合式）</h3><ul><li><p>需求大框架固定 + 研发用 Agile<br>适用：大企业数字化转型、政府项目</p></li></ul><hr><h2>6. Lean Startup 是什么？</h2><h3>6.1 一句话定义</h3><p>Lean Startup = <strong>用最小成本验证商业价值的创业方法论。</strong></p><h3>6.2 核心循环：Build–Measure–Learn</h3><ol><li><p><strong>Build（做最小可用产品 MVP）</strong></p></li><li><p><strong>Measure（收集真实用户数据）</strong></p></li><li><p><strong>Learn（学习并调整方向）</strong></p></li></ol><h3>6.3 Lean Startup 与 Agile 的关系</h3><ul><li><p>Agile：解决“怎么高效开发软件”</p></li><li><p>Lean Startup：解决“我们开发的软件是否值得存在”</p></li></ul><p><strong>Lean Startup 更偏“方向正确性”，Agile 更偏“交付效率”。</strong></p><p></p><h2>7. 为什么使用敏捷？什么是敏捷？和 Waterfall 有什么区别？</h2><h3>7.1 为什么要 Agile</h3><p>因为软件项目具备：</p><ul><li><p>需求不稳定</p></li><li><p>技术与市场变化快</p></li><li><p>用户反馈只能通过“用过才知道”</p></li></ul><p>Agile 用短周期交付来解决这些不确定性。</p><h3>7.2 什么是敏捷开发</h3><p>敏捷开发 = <strong>以用户价值为中心的迭代式交付方法</strong></p><ul><li><p>小步快跑</p></li><li><p>频繁反馈</p></li><li><p>持续改进</p></li><li><p>团队自组织</p></li></ul><p><strong>最重要结论：</strong></p><blockquote><p>Agile 不是“更快”，是“更能应对变化”。</p></blockquote><hr><h2>8. Agile 价值观 / Manifesto / 12 原则</h2><blockquote><p>这一段你可以做成“背诵式重点”，让学生面试能答。</p></blockquote><h3>8.1 Agile 价值观（四值观）</h3><ol><li><p>个体和互动 &gt; 流程和工具</p></li><li><p>可工作的软件 &gt; 完备文档</p></li><li><p>客户协作 &gt; 合同谈判</p></li><li><p>响应变化 &gt; 遵循计划</p></li></ol><h3>8.2 Agile Manifesto 是什么</h3><p>就是这一套价值观 + 原则的总称，2001年由一群软件工程师提出，用来对抗当时过度重流程的开发方式。</p><h3>8.3 12 原则（建议分组记忆）</h3><p>你可以让学生记三类：</p><ul><li><p>“交付价值”</p></li><li><p>“拥抱变化 &amp; 业务协作”</p></li><li><p>“团队自组织 &amp; 持续改进”</p></li></ul>",
          "_id": "68f7497c7c93be3ff4bad7b6"
        },
        {
          "code": "L58",
          "title": "Agile Methodologies",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h2>1. 敏捷开发采用的具体方法：Scrum / Kanban 是什么？</h2><h3>1.1 Agile 是什么（一句话）</h3><p><strong>Agile = 用短周期迭代、持续反馈，快速交付可用价值。</strong><br>不是“快点写完代码”，而是“早交付、早验证、早调整”。</p><h3>1.2 Scrum 是什么</h3><p>Scrum 是一种 <strong>迭代式敏捷框架</strong>，核心是：</p><ul><li><p>把工作切成固定周期的 <strong>Sprint（通常 1–2 周）</strong></p></li><li><p>每个 Sprint 交付一个 <strong>可演示的增量（Increment）</strong></p></li><li><p>用一系列事件（Planning / Daily / Review / Retro）来保证节奏与透明度</p></li></ul><p><strong>关键思想：</strong></p><blockquote><p>先交付最重要、最有价值的东西，再逐步完善。</p></blockquote><h3>1.3 Kanban 是什么</h3><p>Kanban 是一种 <strong>可视化 + 持续流（Continuous Flow）</strong> 的工作管理方法：</p><ul><li><p>不强调固定 Sprint</p></li><li><p>任务按“流动”方式从待做 → 进行中 → 完成</p></li><li><p>用 <strong>WIP Limit（在制品限制）</strong> 防止多任务并行导致堵塞</p></li></ul><p><strong>关键思想：</strong></p><blockquote><p>让工作流更顺畅、更可预测，持续交付。</p></blockquote><h2>2. 结合实际工作讲解 Scrum 流程与会议</h2><h3>2.1 Scrum Planning（Sprint Planning）</h3><p><strong>目的：</strong></p><ul><li><p>决定本 Sprint 做什么（Sprint Goal）</p></li><li><p>把 Backlog 切成 Sprint Backlog</p></li><li><p>让团队对目标形成共识</p></li></ul><p><strong>真实项目怎么做：</strong></p><ol><li><p>PO 给出优先级最高的 Backlog</p></li><li><p>Dev Team 讨论可行性、拆任务、估算</p></li><li><p>根据团队 Capacity（本周可投入的工时）选入 Sprint</p></li><li><p>明确 Definition of Done（DoD）</p></li></ol><p><strong>产出：</strong></p><ul><li><p>Sprint Goal</p></li><li><p>Sprint Backlog（含估算）</p></li></ul><hr><h3>2.2 Daily Standup（每日站会）</h3><p><strong>目的：</strong><br>同步进度 + 暴露阻塞（Blockers），不是汇报给老板。</p><p><strong>经典三问：</strong></p><ol><li><p>我昨天做了什么？</p></li><li><p>我今天打算做什么？</p></li><li><p>我遇到了什么阻碍？</p></li></ol><p><strong>原则：</strong></p><ul><li><p>站着说，<strong>15分钟内</strong></p></li><li><p>只讲和 Sprint Goal 有关的</p></li></ul><hr><h3>2.3 Scrum Board（看板）</h3><p>Scrum Board 是 Sprint 期间的任务可视化工具，常用列：</p><ul><li><p>To Do</p></li><li><p>In Progress</p></li><li><p>Code Review / Testing</p></li><li><p>Done</p></li></ul><p><strong>使用方法：</strong></p><ul><li><p>每日站会更新卡片状态</p></li><li><p>卡片必须指向一个 User Story 或 Task</p></li><li><p>任何阻塞要贴 “Blocked” 标签</p></li></ul><hr><h3>2.4 Scrum Review Meeting（评审会）</h3><p><strong>目的：</strong><br>向 Stakeholders 展示增量成果，收集反馈，决定是否调整 Backlog。</p><p><strong>应该发生什么：</strong></p><ul><li><p>Dev Team Demo</p></li><li><p>PO 验收</p></li><li><p>Stakeholders 给反馈</p></li><li><p>PO 更新 Backlog 优先级</p></li></ul><hr><h3>2.5 Sprint Retrospective（回顾会）</h3><p><strong>目的：</strong><br>聚焦“怎么让团队下个 Sprint 更好”，而不是追责。</p><p><strong>典型结构：</strong></p><ul><li><p>What went well?（做得好的）</p></li><li><p>What didn’t go well?（问题）</p></li><li><p>Action items（具体改进动作）</p></li></ul><p><strong>要求：</strong></p><ul><li><p>每次 Retro 必须产出 <strong>1–3 个可执行改进项</strong></p></li><li><p>下一 Sprint 要跟进</p></li></ul><hr><h2>3. Kanban 的几个阶段 &amp; 意义</h2><h3>常见列（可按团队自定义）</h3><ol><li><p><strong>Backlog / To Do</strong></p><ul><li><p>等待开始的需求池</p></li></ul></li><li><p><strong>Ready</strong></p><ul><li><p>已澄清、可开发</p></li></ul></li><li><p><strong>In Progress</strong></p><ul><li><p>正在开发</p></li></ul></li><li><p><strong>Review / Testing</strong></p><ul><li><p>代码审查、测试验证</p></li></ul></li><li><p><strong>Done / Deployed</strong></p><ul><li><p>完成并上线/交付</p></li></ul></li></ol><p><strong>每列的意义：</strong></p><ul><li><p><strong>让团队知道卡片卡在哪</strong></p></li><li><p><strong>发现瓶颈</strong>（比如 Review 堵住）</p></li><li><p>用 WIP 限制防止“开太多坑不填”</p></li></ul><hr><h2>4. Scrum 在敏捷开发中的定义</h2><p>Scrum 是 <strong>Agile 的一种实现框架</strong>，提供：</p><ul><li><p>角色（Roles）</p></li><li><p>制品（Artifacts）</p></li><li><p>事件（Events）</p></li><li><p>规则（Rules）</p></li></ul><p>它让敏捷从“理念”变成“可落地的工作节奏”。</p><hr><h2>5. Scrum 的 Roles / Artifacts / Events</h2><h3>5.1 Roles（角色）</h3><ul><li><p>Product Owner</p></li><li><p>Scrum Master</p></li><li><p>Development Team</p></li></ul><h3>5.2 Artifacts（制品）</h3><ul><li><p>Product Backlog</p></li><li><p>Sprint Backlog</p></li><li><p>Increment（可交付增量）</p></li></ul><h3>5.3 Events（事件）</h3><ul><li><p>Sprint</p></li><li><p>Sprint Planning</p></li><li><p>Daily Scrum</p></li><li><p>Sprint Review</p></li><li><p>Sprint Retrospective</p></li></ul><hr><h2>6. Scrum 的 “3355 原则” &amp; Value Propositions</h2><blockquote><p>不同机构的“3355”说法略有差异，但在教学中常用的解释是：<br><strong>3 个角色、3 个制品、5 个事件、5 个价值观/原则</strong></p></blockquote><h3>6.1 3 Roles</h3><p>PO / SM / Dev Team</p><h3>6.2 3 Artifacts</h3><p>Product Backlog / Sprint Backlog / Increment</p><h3>6.3 5 Events</h3><p>Sprint / Planning / Daily / Review / Retro</p><h3>6.4 5 Values（Scrum Values）</h3><ul><li><p>Commitment（承诺）</p></li><li><p>Courage（勇气）</p></li><li><p>Focus（专注）</p></li><li><p>Openness（开放）</p></li><li><p>Respect（尊重）</p></li></ul><h3>6.5 Value Propositions（价值主张）</h3><p>Scrum 能带来的价值：</p><ul><li><p>提前交付可用产品</p></li><li><p>快速验证方向</p></li><li><p>降低需求变更风险</p></li><li><p>增强团队透明度与协作</p></li><li><p>持续提升效率（通过 Retro）</p></li></ul><hr><h2>7. Retrospective meeting 主要用来做什么？</h2><p>一句话：<br><strong>Retro = 团队的持续改进引擎。</strong></p><p>核心目的：</p><ul><li><p>找到流程/协作中的“根因问题”</p></li><li><p>制定下一 Sprint 立刻能做的小改进</p></li><li><p>让团队越来越像一个“高效机器”</p></li></ul><hr><h2>8. Scrum Team Roles 详解</h2><h3>8.1 Product Owner（PO）</h3><p><strong>负责价值最大化的人。</strong></p><p>职责：</p><ul><li><p>管理 Product Backlog（排序 + 澄清）</p></li><li><p>定义需求目标</p></li><li><p>验收 Increment</p></li><li><p>与 Stakeholders 对齐方向</p></li></ul><p>不该做的：</p><ul><li><p>指挥 Dev Team 怎么写代码</p></li><li><p>把所有任务塞满 Sprint</p></li></ul><hr><h3>8.2 Development Team（开发团队）</h3><p><strong>负责交付 Increment 的人。</strong></p><p>职责：</p><ul><li><p>估算与承诺 Sprint Backlog</p></li><li><p>自组织（自己决定怎么做）</p></li><li><p>对交付质量负责</p></li></ul><p>特征：</p><ul><li><p>跨职能（前端/后端/DevOps/测试）</p></li><li><p>对结果共同负责，而非“谁写的谁背锅”</p></li></ul><hr><h3>8.3 Scrum Master（SM）</h3><p><strong>负责维持 Scrum 运转的人（服务型领导）。</strong></p><p>职责：</p><ul><li><p>保障 Scrum 流程正确落地</p></li><li><p>清理团队障碍（Blockers）</p></li><li><p>教练 PO 与 Dev Team 理解 Scrum</p></li><li><p>保护团队不被外界干扰</p></li></ul><hr><h2>9. Kanban 的具体步骤是什么？</h2><ol><li><p><strong>可视化工作流（画看板）</strong></p></li><li><p><strong>定义每列状态的“进入/退出标准”</strong></p></li><li><p><strong>设置 WIP Limit</strong></p></li><li><p><strong>任务按优先级拉取（Pull）</strong></p></li><li><p><strong>监控 Lead Time / Cycle Time</strong></p></li><li><p><strong>发现瓶颈，持续优化流程</strong></p></li></ol><hr><h2>10. 怎么写 Backlog / User Story / DoD / 拆分 / 估算</h2><h3>10.1 Backlog 是什么？</h3><p>产品需求池，按优先级排序。<br>Backlog 必须满足：<strong>可理解、可拆分、可估算、可排序。</strong></p><h3>10.2 User Story 拆分方式</h3><p>常见拆分逻辑：</p><ul><li><p>按用户流程拆</p></li><li><p>按功能拆</p></li><li><p>按复杂度拆（先简单后复杂）</p></li><li><p>按风险拆（高风险先做 PoC）</p></li></ul><h3>10.3 Definition of Done（完成定义）</h3><p>定义“什么才算真的完成”，例子：</p><ul><li><p>代码合并到主分支</p></li><li><p>单元测试通过</p></li><li><p>E2E 测试通过</p></li><li><p>PO 验收</p></li><li><p>已部署到 staging / production</p></li></ul><p>DoD 不清楚会导致：</p><blockquote><p>“看起来做了，但其实没交付”。</p></blockquote><h3>10.4 估算（Estimation）</h3><p>常用方法：</p><ul><li><p>Story Points（相对估算）</p></li><li><p>Planning Poker</p></li><li><p>T-shirt Size（S/M/L/XL）</p></li></ul><p>估算维度：</p><ul><li><p>工作量</p></li><li><p>技术难度</p></li><li><p>不确定性/风险</p></li></ul><hr><h2>11. User Story 是什么？怎么写？</h2><h3>11.1 定义</h3><p>User Story 是从用户价值角度描述需求的最小单元。</p><h3>11.2 标准模板</h3><p><strong>As a [用户角色], I want [需求/功能], so that [价值/目的].</strong></p><p>例子：<br>As a student, I want to save my quiz progress, so that I can continue later without losing data.</p><h3>11.3 好 Story 的标准（INVEST）</h3><ul><li><p><strong>I</strong>ndependent：可独立交付</p></li><li><p><strong>N</strong>egotiable：可讨论，不是死需求</p></li><li><p><strong>V</strong>aluable：有用户价值</p></li><li><p><strong>E</strong>stimable：可估算</p></li><li><p><strong>S</strong>mall：够小能在 Sprint 内完成</p></li><li><p><strong>T</strong>estable：可验证</p></li></ul><hr><h2>12. Sprint Planning 是什么？</h2><p>Sprint Planning 是 Scrum 节奏的起点，解决两件事：</p><ol><li><p><strong>Why：为什么做这些？</strong></p><ul><li><p>Sprint Goal（本 Sprint 的价值目标）</p></li></ul></li><li><p><strong>What + How：做什么？怎么做？</strong></p><ul><li><p>选 Backlog 进入 Sprint</p></li><li><p>拆任务 + 估算</p></li><li><p>确定交付路径</p></li></ul></li></ol><p><strong>成功的 Planning 标志：</strong></p><ul><li><p>每个人都知道这个 Sprint 的目标</p></li><li><p>每个 Story 都有清晰 DoD</p></li><li><p>团队觉得“可交付、可完成”</p></li></ul>",
          "_id": "68f7497c7c93be3ff4bad7b7"
        },
        {
          "code": "L59",
          "title": "Agile Case研究：微软Microsoft Case Study",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>来自微软曾获得MVP的Ray老师，讲述以微软Windows交付使用Agile的流程 </p><p>1. 微软是如何使用Agile的，如何使用Agile敏捷开发以及采用DevOps文化 </p><p>2. Windows的发布周期 </p><p>3. Waas是什么，Windows as a Service，其中Rings是什么 </p><p>4. 微软的开发团队分布 </p><p>5. Windows开发具体的周期 </p><p>6. Up-front Planning开发，Code Test Stabilize 过程 </p><p>7. Windows的开发流程如何转型的，如何提升效率和成功率的 </p><p>8. Agile在项目开发中的好处是什么</p>",
          "_id": "68f7497c7c93be3ff4bad7b8"
        },
        {
          "code": "L60",
          "title": "P3职业孵化器介绍",
          "type": "Information",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<h3><strong>项目背景</strong></h3>\n<p>在现实世界中，创业公司通常需要快速开发产品并应对市场的变化。这个项目将模拟一个创业公司的实际情景，让你和你的团队合作，创建一个创新的软件产品。</p>\n<h3>&nbsp;</h3>\n<h3><strong>项目任务</strong></h3>\n<p>你将加入到一个由你的同学组成的团队中，该团队将一起创建一个新的Web Application。你的任务是在团队中发挥作用，贡献你的技能，共同推动项目的成功。</p>\n<h3>&nbsp;</h3>\n<h3><strong>项目要求</strong></h3>\n<p><strong>项目选题</strong>: 你的团队可以自由选择一个创新的项目主题，但它必须包括以下要素：</p>\n<ul>\n<li class=\"ql-indent-1\">前端：使用React，Redux，Nextjs，Styled-Components等。</li>\n<li class=\"ql-indent-1\">后端：使用Node.js，Express.js，Koa，Passport.js等。</li>\n<li class=\"ql-indent-1\">数据库：Mongodb，PostgreSQL，DynamoDB等，选择合适的数据库来存储和管理数据。</li>\n<li class=\"ql-indent-1\">部署：将你的应用部署到云端，如AWS、Azure等。</li>\n</ul>\n<p><strong>敏捷开发</strong>: 使用敏捷开发方法，将项目拆分成多个迭代，并定期交付新的功能。使用敏捷工具（如Trello或JIRA）来跟踪任务和进度。</p>\n<p><strong>协作与沟通</strong>: 团队协作和沟通至关重要。定期召开站会（stand-up meetings）以更新团队成员，确保每个人都了解项目的状态和任务分配。</p>\n<p><strong>Quality and Testing</strong>: 保证你的应用程序质量良好。编写单元测试和端到端测试，并确保每个功能都经过充分测试。</p>\n<p><strong>Documentation</strong>: 创建清晰的文档，包括项目计划、需求文档、系统架构和部署说明。这些文档对于团队成员和潜在用户都非常重要。</p>\n<p><strong>Presentation and Demonstration</strong>: 在项目结束时，团队需要准备一个演示，展示你的应用程序功能和亮点。这也是你展示你的项目成果的机会。</p>\n<h3>&nbsp;</h3>\n<h3><strong>项目交付</strong></h3>\n<p>项目完成后，你的团队需要准备一个综合性的项目报告，其中包括以下内容：</p>\n<ul>\n<li>Detailed project description, including the theme and objectives.</li>\n<li>Project plan and progress reports, documenting various phases and completion status.</li>\n<li>System architecture and technology stack of the application.</li>\n<li>Deployment documentation, explaining how to deploy your application on a cloud platform.</li>\n<li>Testing reports, including the results of unit tests and end-to-end tests.</li>\n<li>Materials for project presentation and demonstration, including screenshots or demo videos of the user interface.</li>\n</ul>\n<h3>&nbsp;</h3>\n<h3><strong>项目评估</strong></h3>\n<p>项目将根据以下标准进行评估：</p>\n<ul>\n<li>项目完成度：项目是否按计划完成，是否满足了项目要求。</li>\n<li>代码质量：代码是否整洁、可维护，并遵循最佳实践。</li>\n<li>功能实现：应用程序是否实现了所需的功能和特性。</li>\n<li>文档质量：项目文档是否详尽清晰，便于他人理解。</li>\n<li>团队协作：团队协作和沟通是否良好。</li>\n<li>演示与展示：演示是否能够生动地展示项目的价值。</li>\n</ul>",
          "_id": "68f7497c7c93be3ff4bad7b9"
        },
        {
          "code": "L61",
          "title": "P3职业孵化器 Bootstrap",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>Project 3：创造、展示、协作的新篇章</strong></p><p>课程概述</p><p>欢迎踏入新的阶段，一个专注于实践、创新和团队协作的全新教育体验！在这里，你不仅学习技术，更将参与到真实的项目中，与团队一起创造有意义的作品。我们的目标是培养能够独立思考、卓越创新的匠人，让每位学员在技术路上更进一步。</p><h3><br></h3><p>1. 匠人培训 5.0 的含义</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>实践与创新</strong>：超越传统理论教学，强调通过实际项目的开发来掌握和应用技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>团队协作</strong>：重视团队合作，通过小组项目培养沟通和协作技能。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>持续成长</strong>：不仅提供知识，更注重培养学习和解决问题的能力。</li></ol><p>2. 项目展示</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>最终展示</strong>：每个项目组会在课程末尾线上展示他们的作品，全面介绍项目成果和学习体验。</li></ol><p>3. 项目分组与导师组</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目如何分组</strong>：学员将根据兴趣和技能分入不同的项目组，每组承担一个独特的项目。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>导师组与自拟项目组</strong>：导师组由经验丰富的老师领导，指导项目实施；自拟项目组则更加自由，学员可以根据自己的想法创建和实施项目。</li></ol><p>4. 项目组规定的重要性</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>规定的目的</strong>：确保每个成员都能在公平、有序的环境中学习和贡献。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>遵守的必要性</strong>：有助于提升团队效率，保证项目顺利完成。</li></ol><p><br></p><p><strong>加入我们的匠人培训5.0，开启你的技术创新之旅，与我们一起成长！</strong></p><p>在这个课程中，每一步都充满了挑战和机遇。我们期待看到你的参与和你的作品，一起来创造令人惊叹的项目！</p>",
          "_id": "68f7497c7c93be3ff4bad7ba"
        },
        {
          "code": "L62",
          "title": "React基础(6) - 组件的状态",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件是如何保存状态的？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>useState 的基本用法</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>事件处理（onClick、onChange）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>状态提升（Lifting State Up）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：制作一个带开关的灯泡组件（点击按钮切换亮/灭）</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7bb"
        },
        {
          "code": "L63",
          "title": "Lab(12):使用React和Express构建图像上传应用",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目设置和规划</strong></p><p><strong>项目初始化</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 create-react-app 初始化一个新的 React 应用。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个新的 Express 服务器项目。</li></ol><p><strong>组件设计</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>规划前端的组件，包括文件选择器和上传按钮。</li></ol><p><strong>构建前端组件</strong></p><p><strong>图像选择组件</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>创建一个允许用户选择图像文件的组件。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>确保组件能够显示用户选择的文件名。</li></ol><p><strong>上传按钮</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现一个上传按钮，用户点击后将文件发送到服务器。</li></ol><p><strong>上传状态指示</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设计并实现一个进度条，显示上传进度。</li></ol><p><strong>实现后端逻辑</strong></p><p><strong>设置 Express 服务器</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>设置路由来处理图像上传的 POST 请求。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用中间件如 multer 处理文件上传。</li></ol><p><strong>文件存储</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置服务器以将上传的图像保存到一个文件夹。</li></ol><p><strong>响应处理</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在文件上传后，服务器应响应一个包含图像 URL 的消息。</li></ol><p><strong>前后端集成</strong></p><p><strong>集成测试</strong>:</p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 React 的 fetch 或 axios 库来从前端发送文件到服务器。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>测试完整的上传流程，确保图像可以成功上传，并在前端显示。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7bd"
        },
        {
          "code": "L64",
          "title": "Node.js (7): Build a CRUD server (1)",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>数据的验证</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Mongoose中的数据验证。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>专门用于数据验证的package - joi。</li></ol><p><strong>错误处理</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何抛出一个错误。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何处理一个错误。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>有哪些常见的错误需要注意。</li></ol><p><strong>结合之前课程所学的内容，搭建一个全新的应用</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解新server的应用场景</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据结构设计与关联</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7be"
        },
        {
          "code": "L65",
          "title": "Node.js (8): Build a CRUD server (2)",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>项目搭建</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从主要资源出发，搭建单一资源的CRUD endpoint</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据的分页和实现基于查询参数的数据过滤</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>扩展到多个集合的数据处理</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>集合与集合的数据关系和逻辑关系</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7bf"
        },
        {
          "code": "L66",
          "title": "Node.js (9): Build a CRUD server (3)",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>完成项目</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>完成项目主体功能</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讲解单边绑定</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>性能优化话题讨论</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为部署做准备</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7c1"
        },
        {
          "code": "L67",
          "title": "Node.js (10) : Testing and Deploy",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>不同类型的测试</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>unit test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>integration test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>e2e test</li></ol><p><strong>Node.js中的测试</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>单元测试的重要性：为什么我们需要它？</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用jest：编写第一个单元测试。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用jest 进行mock</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用supertest编写integration test</li></ol><p><strong>部署的A至Z</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从开发环境到生产环境：关键的区别。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用<strong>PM2</strong>进 Node.js应用的进程管理。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>部署策略与最佳实践：持续集成与持续部署 (CI/CD)。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>将我们的server部署到aws elastic beanstalk</li></ol><p><strong>备份与灾难恢复</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>数据备份的重要性与实施。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>灾难恢复策略：怎么做才能确保最小的业务中断？</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7c2"
        },
        {
          "code": "L68",
          "title": "React基础(7) - React 组件生命周期 & 使用 API 获取数据",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>React 组件的生命周期（挂载、更新、卸载）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>useEffect 介绍</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>清理副作用（避免内存泄漏）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：制作一个自动倒计时的组件</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何使用 fetch 请求 API</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>处理加载中 &amp; 错误状态</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>小练习：请求 GitHub API 并显示用户信息</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7c4"
        },
        {
          "code": "L69",
          "title": "React 进阶(1) - Thinking in React",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 1: Break The UI Into A Component Hierarchy</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 2: Build A Static Version in React</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 3: Identify The Minimal (but complete) Representation Of UI State</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 4: Identify Where Your State Should Live</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Step 5: Add Inverse Data Flow</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>And That’s It</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7c6"
        },
        {
          "code": "L70",
          "title": "React 进阶(2) - 测试和 a11y",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>测试金字塔</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Unit Test</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>vitest</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>react testing lib</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>js-dom</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>accessibility</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7c7"
        },
        {
          "code": "L71",
          "title": "Next.js",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Next.js</p>",
          "_id": "68f7497c7c93be3ff4bad7c8"
        },
        {
          "code": "L72",
          "title": "The Four Prototyping Patterns: Prompting, Fine-Tuning, RAG, Agents",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>The Four Prototyping Patterns: Prompting, Fine-Tuning, RAG, Agents</strong></p><p>BY THE END OF THE SESSION</p><p>• Prompting \"giving the LLM more context\" Prompting = asking questions in a better way with better context</p><p>• Fine Tuning \"teaching the LLM how to act\" 3 types: task training, constraining I/0 schema, and language training</p><p>• RAG \"giving the LLM access to new knowledge\" Retrieval Augmented Generation = Dense Vector Retrieval + In-Context Learning</p><p>• Agents</p><p>\"giving the LLM access to tools\"</p><p>Agents = reasoning, action, repeat</p><p>• Prompting \"giving the LLM more context\" Prompting = asking questions in a better way with better context</p><p>• Fine Tuning \"teaching the LLM how to act\" 3 types: task training, constraining I/0 schema, and language training</p><p>• RAG \"giving the LLM access to new knowledge\" Retrieval Augmented Generation = Dense Vector Retrieval + In-Context Learning</p><p>• Agents</p><p>\"giving the LLM access to tools\"</p><p>Agents = reasoning, action, repeat</p><p><strong>Prompting</strong></p><p>Prompt is nothing but what you said to AI.</p><p><strong>Prompt Engineering</strong> is the art of crafting effective prompts that elicit desired responses from LLMs. It's the foundation of interacting with these models, and its effectiveness can significantly impact the quality and relevance of the output.</p><p>A typical prompt can be broken down into several key components:</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Priming:</strong> This sets the context for the LLM, providing information about the desired task, persona, or style. For example, you might prime the model by saying, \"You are a friendly chatbot that helps users with their travel plans.\"</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Instructions:</strong> These guide the LLM on how to handle specific aspects of the task, such as the tone of voice, the format of the output, or how to handle edge cases. For example, you might instruct the model to \"use a conversational tone\" or \"provide a bulleted list of recommendations.\"</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>User Inquiry:</strong> This is the dynamic content of the prompt, the specific question or request that the user provides. It's the input that changes with each interaction.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Output Formatting:</strong> This specifies the desired format of the LLM's response. It could be plain text, a structured format like JSON, or even a specific template.</li></ol><p><br></p><p><strong>Example:</strong></p><p>Priming: You are a helpful and informative chatbot that answers questions about history.</p><p>Instructions: Provide concise and accurate answers, using bullet points to list key facts.</p><p>User Inquiry: What were the major causes of World War II?</p><p>Output Formatting: A bulleted list of key causes.</p><p>Another famous the COSTAT:</p><p><strong>The COSTAR Framework Explained:</strong></p><p><strong>Context :</strong> Providing background information helps the LLM understand the specific scenario.</p><p><strong>Objective (O):</strong> Clearly defining the task directs the LLM’s focus.</p><p><strong>Style (S):</strong> Specifying the desired writing style aligns the LLM response.</p><p><strong>Tone (T):</strong> Setting the tone ensures the response resonates with the required sentiment.</p><p><strong>Audience (A):</strong> Identifying the intended audience tailors the LLM’s response to be targeted to an audience.</p><p><strong>Response (R):</strong> Providing the response format, like text or json, ensures the LLM outputs, and help build pipelines.</p><p><strong>Benefits of Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Control over Output:</strong> Prompt Engineering allows you to guide the LLM's behavior and ensure that the output aligns with your specific needs.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Customization:</strong> You can tailor prompts to specific tasks, audiences, and contexts.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Efficiency:</strong> Well-crafted prompts can reduce the need for extensive fine-tuning, saving time and resources.</li></ol><p><strong>Limitations of Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context Window:</strong> LLMs have a limited context window, meaning they can only process a certain amount of text at a time. This can limit the complexity of prompts and the amount of information that can be provided.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Lack of Factual Grounding:</strong> LLMs are trained on massive datasets of text, but they don't store specific facts. They predict the most likely word based on the context, which can lead to inaccuracies or inconsistencies.</li></ol><p><br></p><p>=========================================</p><p><strong>Fine-Tuning</strong></p><p><strong>Fine-tuning</strong> is a powerful technique that allows you to customize the behavior of an LLM by training it on a specific dataset of examples. This process adjusts the LLM's internal parameters, enabling it to perform better on tasks related to the training data.</p><p><strong>How Fine-tuning Works:</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Training Data:</strong> A dataset of prompt-completion pairs is created, where each pair consists of a prompt and the desired response. This data represents the specific task or style that you want the LLM to learn.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Model Training:</strong> The LLM is trained on the provided dataset, adjusting its internal parameters to better predict the desired responses for the given prompts.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Evaluation:</strong> The fine-tuned model is evaluated on a separate dataset to assess its performance and ensure that it has learned the desired behavior.</li></ol><p><strong>Example:</strong></p><p>Imagine you want to fine-tune an LLM to write product descriptions in a specific style.</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Training Data:</strong> You create a dataset of product descriptions written in your desired style, along with the corresponding product names.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Model Training:</strong> The LLM is trained on this dataset, learning to generate product descriptions that match the style and tone of the training data.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Evaluation:</strong> You evaluate the fine-tuned model by providing it with new product names and assessing the quality of the generated descriptions.</li></ol><p><strong>Benefits of Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Improved Performance:</strong> Fine-tuning can significantly improve the LLM's performance on specific tasks, such as writing in a particular style, generating creative content, or answering questions in a specific domain.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Style and Tone Customization:</strong> Fine-tuning allows you to bake in your desired style, tone, and formatting into the LLM's output.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Reduced Prompt Length:</strong> Fine-tuning can reduce the need for extensive instructions in the prompt, allowing for a larger context window and more complex outputs.</li></ol><p><strong>Limitations of Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Data Requirements:</strong> Fine-tuning requires a dataset of examples, which can be time-consuming and resource-intensive to create.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Overfitting:</strong> If the training data is too small or not representative of the desired behavior, the model may overfit to the training data and perform poorly on unseen examples.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Cost and Resources:</strong> Fine-tuning can be computationally expensive, requiring significant resources and time.</li></ol><p><br></p><p><strong>RAG</strong></p><p><strong>RAG</strong> addresses the limitations of prompt engineering by incorporating external knowledge sources into the LLM's decision-making process. It allows LLMs to access and utilize factual information from databases, websites, or other sources, enhancing their ability to provide accurate and relevant responses.</p><p><strong>How RAG Works:</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup:</strong> A database is created containing relevant information, which can be text from websites, documents, or internal knowledge bases. This information is then split into smaller chunks, such as paragraphs or sections, to ensure that related text is kept together.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Embedding Generation:</strong> Each chunk of text is converted into a vector representation called an embedding. Embeddings capture the semantic meaning of the text, allowing for efficient comparison and retrieval.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval:</strong> When a user inquiry is received, it is also converted into an embedding. This embedding is then compared to the embeddings in the database using a vector search algorithm. The most similar chunks of text are retrieved.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Prompt Augmentation:</strong> The retrieved information is then incorporated into the prompt, providing the LLM with the necessary context to answer the user's question.</li></ol><p><strong>Example:</strong></p><p>Imagine a user asks, \"How do I fix a leaky faucet?\"</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval:</strong> The user's inquiry is converted into an embedding and compared to the embeddings in a database containing a plumber's handbook. The most relevant section, \"Fixing Common Leaks,\" is retrieved.</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Prompt Augmentation:</strong> The retrieved section is added to the prompt, providing the LLM with the necessary information to answer the question.</li></ol><p><strong>Benefits of RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Factual Accuracy:</strong> RAG allows LLMs to access and utilize factual information from external sources, improving the accuracy and reliability of their responses.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Real-time Knowledge Updates:</strong> The database can be updated in real time, ensuring that the LLM has access to the latest information.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Expanded Knowledge Base:</strong> RAG enables LLMs to access a much larger knowledge base than what is available within their training data.</li></ol><p><strong>Limitations of RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Database Setup and Maintenance:</strong> Creating and maintaining a comprehensive and accurate database can be time-consuming and resource-intensive.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Retrieval Accuracy:</strong> The accuracy of the retrieved information depends on the quality of the database and the effectiveness of the vector search algorithm.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Context Window:</strong> The retrieved information is still subject to the LLM's context window limitations.</li></ol><p><br></p><p><strong>Agents</strong></p><p>Agent is nothing but a fancy RAG</p><p><strong>Introduction to LLM Agents</strong></p><p>LLM agents represent the next frontier in artificial intelligence, moving beyond simple text input-output models to interactive, reasoning-capable systems.</p><p><strong>What are LLM Agents?</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Definition: Systems that use Large Language Models (LLMs) as their core for reasoning and planning, enabling interaction with external environments.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Key difference from traditional LLMs: Ability to observe, plan, and take actions in diverse environments.</li></ol><p><strong>Components of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agent/Brain/Core:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Core LLM for processing and understanding language</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Customizable prompts and personas</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Planning:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ability to create and execute plans for complex tasks</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Memory:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Short-term memory: Temporary storage for ongoing conversations</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Long-term memory: Persistent storage for learning and recall</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Tool Use:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Integration with external tools and APIs</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ability to leverage specialized knowledge bases</li></ol><p><strong>Capabilities of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced Problem Solving:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Executing complex tasks efficiently</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Generating project plans, writing code, creating summaries</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Self-Reflection and Improvement:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Analyzing and critiquing their own output</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Continuous enhancement through learning</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-Agent Collaboration:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Interaction and cooperation between multiple agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Division of tasks and specialization</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Environment Interaction:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Web browsing, API usage, physical world interaction (in robotics)</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-modal input processing (text, images, sensory data)</li></ol><p><strong>Applications of LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Software Development:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Code generation and debugging</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Project planning and management</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Workflow Automation:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Task planning and execution in business processes</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Intelligent personal assistants</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Research and Analysis:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Information gathering and synthesis</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Report generation and data analysis</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Customer Service:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Advanced chatbots and virtual assistants</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Multi-step problem resolution</li></ol><p><strong>Frameworks and Tools for LLM Agents</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>LangChain and LangGraph:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open-source frameworks for building LLM applications</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Components for agent creation, memory management, and tool integration</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Agentic Search:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Enhanced search capabilities for agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Retrieval of multiple answers in agent-friendly formats</li></ol><p><strong>Challenges and Considerations</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ethical Concerns:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ensuring responsible use of autonomous agents</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Privacy and data security considerations</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Limitations:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Current constraints in reasoning capabilities</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Need for precise instructions and prompts</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Ongoing Research Areas:</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Improving long-term memory and learning</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Enhancing multi-modal capabilities</li></ol><p><strong>Conclusion</strong></p><p>LLM agents represent a significant advancement in AI, offering powerful tools for complex problem-solving and automation. As research progresses, we can expect these agents to become increasingly capable and integrated into various aspects of work and daily life.This lecture outline provides a comprehensive overview of LLM agents, covering their core concepts, capabilities, applications, and challenges. It can be expanded with specific examples and case studies to create a full-length lecture on the topic.</p><p><br></p><h3>Benefits and When to Use</h3><p><strong>Prompt Engineering:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Easy to implement, rapid prototyping, intuitive for guiding LLM behavior.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need quick and simple control over LLM output, when you don't have a large dataset for fine-tuning, or when you want to experiment with different prompts.</li></ol><p><strong>RAG:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Access to external knowledge sources, real-time knowledge updates, expanded knowledge base.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need to provide LLMs with factual information, when you want to leverage external databases or knowledge bases, or when you need to ensure that the LLM's responses are grounded in real-world data.</li></ol><p><strong>Fine-tuning:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Improved performance on specific tasks, style and tone customization, reduced prompt length.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When you need to train an LLM to perform a specific task, when you want to customize the LLM's output style or tone, or when you want to reduce the need for extensive instructions in the prompt.</li></ol><p><strong>Agent:</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>Benefits:</strong> Advanced problem-solving: LLM agents can handle complex, multi-step tasks efficiently by breaking them down into manageable subtasks.</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>When to Use:</strong> When tasks require sequential reasoning, planning, and memory. They excel in situations where simple text generation or information retrieval is not sufficient, and more complex problem-solving or decision-making is needed</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7c9"
        },
        {
          "code": "L73",
          "title": "Introduction to Embeddings",
          "type": "Video",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><p>- 掌握Embeddings的基本概念及其在自然语言处理、信息检索等领域的应用</p><p>- 学习如何生成和使用文本嵌入向量表示语义关系</p><p>- 理解不同Embedding模型的工作原理及其对文本表示的影响</p><p>- 提升在实际项目中使用Embeddings进行文本分类、相似性搜索等任务的能力</p><p>知识点介绍</p><p>**Embeddings基础**</p><p>- 了解什么是Embeddings，如何将文本或其他数据转化为向量</p><p>- 学习Embeddings的核心概念，如语义空间和向量表示</p><p>**常见的Embedding模型**</p><p>- 掌握常见的Embedding模型，如Word2Vec、GloVe、BERT等的工作原理</p><p>- 学习如何选择合适的Embedding模型以满足不同的任务需求</p><p>**文本嵌入的生成与应用**</p><p>- 学习如何生成文本嵌入，并应用于相似性搜索、分类和聚类等任务</p><p>- 理解如何通过嵌入向量表示语义相似性，进行语义搜索和推荐</p><p>**模型性能与优化**</p><p>- 探索如何评估和优化Embedding模型的性能，确保其生成的向量具有高语义关联性</p><p>- 学习如何通过微调Embedding模型提升在特定任务中的表现</p><p>**实际应用场景**</p><p>- 了解Embeddings在信息检索、自然语言处理和推荐系统中的应用</p><p>- 探讨如何在项目中应用Embeddings进行高效的文本处理和语义分析</p><p>通过这些知识点，学员将能够理解并应用Embeddings技术，用于各种自然语言处理任务，并通过优化和调优提升模型的表现。</p>",
          "_id": "68f7497c7c93be3ff4bad7ca"
        },
        {
          "code": "L74",
          "title": "Introduction to Retrieval Augmented Generation (RAG)",
          "type": "Video",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><p>- 掌握Retrieval Augmented Generation (RAG)的基本概念，理解其在生成式AI中的作用</p><p>- 学习如何通过RAG结合信息检索与生成模型，提高生成内容的相关性和准确性</p><p>- 掌握RAG系统的核心组件，包括文档检索、嵌入生成与生成模型的集成</p><p>- 提升在实际项目中构建和优化RAG系统的能力，满足复杂信息生成需求</p><p>知识点介绍</p><p>**RAG基础概念**</p><p>- 了解RAG的架构和工作原理，学习如何通过文档检索增强生成模型的表现</p><p>- 探索RAG系统中的主要组件：Document Retrieval、Embedding Generation与Generative Models</p><p>**文档检索与生成的集成**</p><p>- 学习如何通过RAG系统结合文档检索和生成模型，提升生成内容的上下文相关性</p><p>- 理解如何在生成过程中动态调用检索信息，确保生成内容的准确性与完整性</p><p>**RAG系统的优化与调优**</p><p>- 学习如何优化RAG系统中的检索和生成流程，提高响应速度和生成质量</p><p>- 掌握如何通过Prompt Engineering和检索策略的调整，提升RAG系统的效果</p><p>**应用场景与案例分析**</p><p>- 探讨RAG在知识问答、文档生成、智能客服等应用中的实际案例</p><p>- 学习如何根据具体业务需求定制RAG系统，提升系统的智能化和用户体验</p><p>通过这些知识点，学员将能够理解并应用Retrieval Augmented Generation (RAG)技术，构建具有高相关性和高准确性的生成系统，并通过优化和调优提升系统性能。</p>",
          "_id": "68f7497c7c93be3ff4bad7cb"
        },
        {
          "code": "L75",
          "title": "Building RAG from Scratch in JavaScript",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>学习目标</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何使用JavaScript从零开始构建一个完整的Retrieval Augmented Generation (RAG)系统</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解RAG系统的核心组件，包括Information Retrieval、Embeddings和Generative Models</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何将检索模块与生成模块无缝集成，以处理复杂的文本检索和生成任务</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何在JavaScript中优化RAG系统的性能，确保在实际应用中的高效运行</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7cc"
        },
        {
          "code": "L76",
          "title": "Tutorial (Azure AI Preparation)",
          "type": "Video",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>课程内容：</p><p>注册Azure账号，开通Speech Service，开通OpenAI API</p><p>具体任务：</p><p>学员在导师指导下注册Azure账号，</p><p><a href=\"https://azure.microsoft.com/en-au/free/ai-services\" rel=\"noopener noreferrer\" target=\"_blank\">https://azure.microsoft.com/en-au/free/ai-services</a></p><p>开通Speech Service</p><p><a href=\"https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices\" rel=\"noopener noreferrer\" target=\"_blank\">https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices</a></p><p>入口文档</p><p><a href=\"https://learn.microsoft.com/en-au/azure/ai-services/speech-service/overview#try-the-speech-service-for-free\" rel=\"noopener noreferrer\" target=\"_blank\">https://learn.microsoft.com/en-au/azure/ai-services/speech-service/overview#try-the-speech-service-for-free</a></p><p>开通Open AI API</p><p><a href=\"https://platform.openai.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://platform.openai.com</a></p><p><a href=\"https://chatgpt.com\" rel=\"noopener noreferrer\" target=\"_blank\">https://chatgpt.com</a></p>",
          "_id": "68f7497c7c93be3ff4bad7cd"
        },
        {
          "code": "L77",
          "title": "Azure AI Service和TTS",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>微软云Azure AI Service 提前注册</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Icebreaking，导师自我介绍，学员自我介绍</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI 简介</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么葫芦里的什么药</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么药（是什么，能干什么）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI是什么葫芦（几种实现技术）</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>传统算法</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深度学习</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>机器学习</li><li data-list=\"ordered\" class=\"ql-indent-3\"><span class=\"ql-ui\" contenteditable=\"false\"></span>大语言模型（机器学习的一种分支）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI相关的几个典型岗位</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Algorithm Engineer (算法工程师 - 大牛)</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Hyperparameter tuning engineer （调参侠）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Prompt Engineer （提示工程师 - 调整优化提示）</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Application Engineer (应用工程师 - 大部分的程序员， 调用AI的API实现商业价值)</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI在澳洲的企业应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus的应用案例</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus 机器人</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Optus 数字人</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Service NSW的应用案例</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>客户输入自然语言的理解</li><li data-list=\"ordered\" class=\"ql-indent-2\"><span class=\"ql-ui\" contenteditable=\"false\"></span>语言之间的翻译</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure AI Service 的简要介绍</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure是什么？Azure有什么？</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure AI Service 是什么？有什么？</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示Azure Protal</li></ol><p><strong>课堂实操练习</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在Azure Portal上面体验文字转语音和语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>登陆Azure Portal</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>进入Speech Studio</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作文字转语音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作上传语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>动手操作用麦克风录入语音转文字</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，用React写一个最简单的文字转语音（TTS - Text To Speech）Web应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>阅读练习说明，写一个form，包括 input，和 submit，输入文字，用window.speechSynthesis控件播放语音</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>===============中场休息10分钟==============</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure API 介绍</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure API 怎么读</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，用React写一个最简单的语音转文字（STT - Speech To Text）Web应用</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个form，包括三个按钮：开始录音，暂停录音，停止录音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用microsoft-cognitiveservices-speech-sdk实现实时语音转文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个文本显示框，显示转换之后的文字</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 - 练习2 和 练习3 的局限和潜在风险</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用云AI服务的text to speech 对比 直接用浏览器自带的text to speech 空间的好处和坏处是什么，不同的应用场景</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习3的实际应用中一个重要安全性问题 - 你的API Key会暴露在客户端</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍另一种验证方式：Token</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>引入后端，跟随练习说明，用.net写一个获取token的后端</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>初始化一个Web API</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>配置好Web API</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>写一个controller，提供一个API /api/VoiceController/get-speech-token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在这个controller里面调用Azure cognitive 服务获取token并作为Response返回</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论 - 本次课堂体验小结</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现效果</li></ol><p><img src=\"data:image/png;base64,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aA11Gp2NE8Mph9vALmo2C0vG21kZfiPvG6F7VxZhTRv7eP9l3ySCBzrIciMCIiACIiACIiACIiACIiACIhAEOmEbIjUEcB39jfKaV9pQFhHgImRtGy3r6tbreBo4/lHmApcGmCO4fWXLbE5VOHRbiWADpCQCIiACIiACIiACIiACIiACIjAcgRSdfY9ducvaVpxiF8IZ5Upk10uKGCY/mpC64QHr/Lkl1C6CF1tftDbFofcnETzKUlsiIAIiIAIiIAIiIAIiIAIiIALLJjAa9U2BG1FbD9h6D1FONiVtEcelf8RwyNlSgGWa9tq4hdWlgPa+rNBFMpWmjimTCHZSWoiACIiACIiACIiACIiACIiACAxHwKRnmYKMwI18qtciazs1a92m1GWN8o1tVl3MN0YXVWlfjdj80QM19Mc//qPU+y/9SQRXzJQVAREQAREQAREQAREQAREQAREYggBy1D4uPEOwki3a1kUpFqQUy2HlJd4O+9Ct1GBdLLxhtV3KXfiWDjLCnGsfirvW26HBoCQCIiACIiACIiACIiACIiACIjAggVa89kQpQhZhyocqPiFUe/HeUofsDRfkaOdL8xLbXkDWa2PpGpmsNQy7aONFtlAkGBJKIiACIiACIiACIiACIiACIiACgxGI6G4rR02Pmhy1T0ZmU9giajOfnacN23jAJlL4cGFbhK83dmXslmYWsteXXcPo32opWl28aSUCIiACIiACIiACIiACIiACIiACgxPwqC9ei3ANgYwgjWd1a9HrZq6KW+VrRXUei2gbORPW9i99zrnwzWeAw4LmbuObejFWoaKVCIiACIiACIiACIiACIiACIjAUARc2Bbt6gLVhW2Gb5nW3BfAtdDNPJFfIsW0y7aRjXgvo+0EMK2w5d/8XProytKHpkPDTUkEREAEREAEREAEREAEREAERGAwAiF8w11EekOUennRp4STE7sAACIMSURBVCmEsepEbWwR0KU+1uGntiGym8nt2MC4lIdwtk3TznX/qGqJYGApiYAIiIAIiIAIiIAIiIAIiIAIDEgAQRrRWwRp6NMQqV7j0d0UqCldqSFFdLcVsi5skb2IYrNxsy4y3ObcJ9OjMUlftoEQrsokgg2GkgiIgAiIgAiIgAiIgAiIgAiIwJAEQppGFNZ0KAK1iNQUt614bbvNEluXEHBo5a58xYqQsFkSTS1GHIberm7T9l/FmiWCW+DKiIAIiIAIiIAIiIAIiIAIiIAIDEGgFZ8pTotTyqNuJFa7U5cZ7PUIstWGyM14bhXlxR//imh2oe1mYUO7eho14loieCfcKhABERABERABERABERABERABERiGQBGoODMB2mni0VhuTFjOHruXXYU9PrKO2c0x5dlLXOTWkWYrzU5sHaJ7zk3dhZVJBHcslRMBERABERABERABERABERABERiAQOpQl6ypd12UFsFa+minMZuw7VKI1/qx3q7OcpVpCuKILltdGxGmRYrpaJARYYlg2CiJgAiIgAiIgAiIgAiIgAiIgAgMR6CK3KZqRagieiM62+VDrNZdU2fbrl2LgI2VB4zDT9jPzc9Vmtg6pWFl60Lat33StDdaXXelvAiIgAiIgAiIgAiIgAiIgAiIgAgsm4Cr2J29pBCmhnykEMYhkEuRKdmoZyoz+TTNeG5pWfpZYQYmnXGaDtp1RouLgtZ06JaMMiIgAiIgAiIgAiIgAiIgAiIgAruMgL+kykQr4rYWw9Fhit5Ox8ZU6Qzr5rBM5PJfLXZdAGe9V9tG1w55THL5bP1rOrTj0EIEREAEREAEREAEREAEREAERGBoAiFWu+jszuK36zFEr4nVIpRHo7r4CGEbMV8kbUR+03tGfFv5S3URwG0vJpglglsayoiACIiACIiACIiACIiACIiACAxJoI7mThLAZUZz0bxIWp/YnJo3ng9uBxXitxW31jhF73xjzwcjoNPWMl1tEcRWLxGcgLQWAREQAREQAREQAREQAREQARHYDQRCpuaU5pzZHGKWpX1SGdtW1EftvL0IK1Qv06fjp4+6AYdNt42rLGulsUTwCCBtiIAIiIAIiIAIiIAIiIAIiIAIDEIAkRtCtxOgHo/1CG100U2BpoaUtrRNDUtZlLf2mLYCl41+CvtWKFe2igT3WWlbBERABERABERABERABERABERg2QQQrCFaIxpLPoStbZe6nCKdUWGrsH5T8NZDsPIICWe1VYbf2irytC99pI219anRtpYI3pmYSkRABERABERABERABERABERABJZBoBW1LlxD1LburKyLEFPX1WektyryZh7Idc3LM7/xL9t1rXHFFoZRimU/SQT3iWhbBERABERABERABERABERABERgWQRctOKhU68ufF3ktpVugFH5pDgmilv0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YtcFcNZ7tW107ZDHJJfP1r+mQzsOLURABERABERABERABERABERABIYmEGK1i87uLH67HkP0mlgtQnk0qouPELYR80XSRuQ3vWfEt5W/VBcB3PZiglkiuKWhjAiIgAiIgAiIgAiIgAiIgAiIwJAE6mjuJAFcZjQXzYuk9YnNqXnj+eB2UCF+W3FrjVP0zjf2fDACOm0t09UWQWz1EsEJSGsREAEREAEREAEREAEREAEREIHdQCBkak5pzpnNIWZZ2ieVsW1FfdTO24uwQvUyfTp++qgbcNh027jKslYaSwSPANKGCIiACIiACIiACIiACIiACIjAIAQQuSF0OwHq8ViP0EYX3RRoakhpS9vUsJRFeWuPaStw2einsG+FcmWrSHCflbZFQAREQAREQAREQAREQAREQASWTQDBGqI1orHkQ9jadqnLKdIZFbYK6zcFbz0EK4+QcFZbZfitrSJP+9JH2lhbnxpta4ngnYmpRAREQAREQAREQAREQAREQAREYBkEWlHrwjVEbevOyroIMXVdfUZ6qyJv5oFc17w88xv/sl3XGldsYRilWPaTRHCfiLZFQAREQAREQAREQAREQAREQASWRcBFKx469erC10VuW+kGGJVPimOiuEXPFg3r2hbzImrrF161wplq8925L9HfUu6C2ColggGiJAIiIAIiIAIiIAIiIAIiIAIiMCABhC0phW288dkjwKZoU6iybp/bbSO4Ec11m1ikK1+7AEYnFydt1DmsQmy7ii6SGXepom29uthpJQIiIAIiIAIiIAIiIAIiIAIiIAKDEECYhkatIrMIV/PudZbrxGvYhE7FIm0QsbwBOsrcIUa26W1DK7sYbn3RL77biDHN2S5921qRYIOgJAIiIAIiIAIiIAIiIAIiIAIiMByBFMB4RKCmSM015RnJZR3lSNVILnttETZdeQpgLy/auPbplqUc8Usi0uw2CGj7SAQHYy1FQAREQAREQAREQAREQAREQAQGIoDezIRgddFqhehS8ojSFK+xRrCmaLXGlg0fUWZbVp9OqcQk6tx36azNu2mxL/37luUlgvPIaC0CIiACIiACIiACIiACIiACIjAIgRCjRYRWipgsopf6FKyWHUl1+ahAxpBP+M0pzymm3Un2hdPSfbvGwOolgp2UFiIgAiIgAiIgAiIgAiIgAiIgAkMRGBGmReWiSVPg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hlGKZT9JBPeJaFsEREAEREAEREAEREAEREAERGBZBFy04qFTry58XeS2lW6AUfmkOCaKW/Rs0bCubTEvorZ+4VUrnKk23537Ev0t5S6IrVIiGCBKIiACIiACIiACIiACIiACIiACAxJA2JJS2MYbnz0CbIo2hSrr9rndNoIb0Vy3iUW68rULYHRycdJGncMqxLar6CKZcZcq2tari51WIiACIiACIiACIiACIiACIiACIjAIAYRpaNQqMotwNe9eZ7lOvIZN6FQs0gYRyxugo8wdYmSb3ja0sovh1hf94ruNGNOc7dK3rRUJNghKIiACIiACIiACIiACIiACIiACwxFIAYxHBGqK1FxTnpFc1lGOVI3kstcWYdOVpwD28qKNa59uWcoRvyQizW6DgLaPRHAw1lIEREAEREAEREAEREAEREAERGAgAujNTAhWF61WiC4ljyhN8RprBGuKVmts2fARZbZl9emUSkyizn2Xztq8mxb70r9vWV4iOI+M1iIgAiIgAiIgAiIgAiIgAiIgAoMQCDFaRGiliMkieqlPwWrZkVSXjwpkDPmE35zynGLanWRfOC3dt2sMrF4i2ElpIQIiIAIiIAIiIAIiIAIiIAIiMBSBEWFaVC6aNAUuCrWzSRWcqtUMS7YTyBTkJ5757XzVfl3nlgUdlo+tSLSRCA4WWoqACIiACIiACIiACIiACIiACAxEIARqiFvELp9atIY6jc7GieGUw21gFzWbhSXj7awMv5H3jdC9K4uwpo19vP+ybxLBAx1kuREBERABERABERABERABERABEQgCnbANkRoCuI7+RnnNK20oiwhwEbK2jZZ1det1PA0c/yhzgUsDzBHcvrJlNqcqHLqtRLABUhIBERABERABERABERABERABERiOQIrOvseu3GVtK06xC+GMciWy6yVFDJMfTUjd8IB1iQSjel3wYoufIp490/UnEexotBABERABERABERABERABERABERiOwGjUNwVuRG09YOtdRTnZlLRFrJaBIIZDzpYCLNO018YtrC4FtPdlhS6SqSzTpiWCnZQWIiACIiACIiACIiACIiACIiACwxEw6VmmICNwI5/qtcjaTs1atyl1WaN8Y5tVF/ON0UVV2lcjNn/0QA398Y//KPX+S38SwRUzZUVABERABERABERABERABERABIYggBy1jwvPEKxki7Z1UYoFKcVyWHmJt8M+dCs1WBcLb1htl3IXvqWDjDDn2ofirvV2aDAoiYAIiIAIiIAIiIAIiIAIiIAIDEigFa89UYqQRZj6VGXTtFSHUO3Fe0sdsjdckKOdL81LbHsBWa+NpWtkstYw7KKNF9lCkWBIKImACIiACIiACIiACIiACIiACAxGIKK7rRz1aC9lGZlNYYuozXx2njZs4yEENVsmaVPYFuHrjV0Zu2XY5LJrWNqFr9W4UhIBERABERABERABERABERABERCBXUHAo744LsI1BDKCNJ7VrUWvm7kq7gR0SOHRkXVtTFjbv/Q558I3nwEubcyV2/jmvCLBoyi1JQIiIAIiIAIiIAIiIAIiIAIisFwCLlKLjnWB6sI2w7dMa+4L4HGil8gvkWLaZdvI5jRn5G0KYDyQ59/8XOcvy9KHpkMv9+iqvQiIgAiIgAiIgAiIgAiIgAiIwAgBF6ZFt0bUNkSplxd9mkKYhp2ojS0CutTHOlzXNkR2M7kdGxiXcu+HMhtD3T+qWiIYMEoiIAIiIAIiIAIiIAIiIAIiIAIDEkCQhgpGkIY+DZHqNR7dTYGa0pUaUkR3WyHrwhbZiyg2GzfrIsNtzn0yPRqT9GUbCOGqTCLYYCiJgAiIgAiIgAiIgAiIgAiIgAgMSSCkaURhTYciUItITXHbite22yyxdQkBh1buylesCAmbJdHUYsRh6O3qNm3/VaxZIrgFrowIiIAIiIAIiIAIiIAIiIAIiMAQBFrxmeK0OKU86kZitTt1mcFejyBbbYjcjOdWUV788a+IZhfabhY2tKunUSOuJYJ3wq0CERABERABERABERABERABERCBYQgUgYozE6CdJh6N5caE5eyxe9lV2OMj65jdHFOevcRFbh1pttLsxNYhuufc1F1YmURwx1I5ERABERABERABERABERABERCBAQikDnXJmnrXRWkRrKWPdhqzCdsuhXitH+vt6ixXmaYgjuiy1bURYVqkmI4GGRGWCIaNkgiIgAiIgAiIgAiIgAiIgAiIwHAEqshtqlaEKqI3orNdPsRq3TV1tu3atQjYWHnAOPyE/dz8XKWJrVMaVrYupH3bJ017o9V1V8qLgAiIgAiIgAiIgAiIgAiIgAiIwLIJuIrd2UsKYWrIRwphHAK5FJmSjXqmMpNP04znlpalnxVmYNIZp+mgXWe0uChoTYduySgjAiIgAiIgAiIgAiIgAiIgAiKwywj4S6pMtCJuazEcHabo7XRsTJXOsG4Oy0Qu/9Vi1wVw1nu1bXTtkMckl8/Wv6ZDOw4tREAEREAEREAEREAEREAEREAEhiYQYrWLzu4sfrseQ/SaWC1CeTSqi48QthHzRdJG5De9Z8S3lb9UFwHc9mKCWSK4paGMCIiACIiACIiACIiACIiACIjAkATqaO4kAVxmNBfNi6T1ic2peeP54HZQIX5bcWuNU/TON/Z8MAI6bS3T1RZBbPUSwQlIaxEQAREQAREQAREQAREQAREQgd1AIGRqTmnOmc0hZlnaJ5WxbUV91M7bi7BC9TJ9On76qBtw2HTbuMqyVhpLBI8A0oYIiIAIiIAIiIAIiIAIiIAIiMAgBBC5IXQ7AerxWI/QRhfdFGhqSGlL29SwlEV5a49pK3DZ6Kewb4VyZatIcJ+VtkVABERABERABERABERABERABJZNAMEaojWiseRD2Np2qcsp0hkVtgrrNwVvPQQrj5BwVltl+K2tIk/70kfaWFufGm1rieCdialEBERABERABERABERABERABERgGQRaUevCNURt687KuggxdV19RnqrIm/mgVzXvDzzG/+yXdcaV2xhGKVY9pNEcJ+ItkVABERABERABERABERABERABJZFwEUrHjr16sLXRW5b6QYYlU+KY6K4Rc8WDevaFvMiausXXrXCmWrz3bkv0d9S7oLYKiWCAaIkAiIgAiIgAiIgAiIgAiIgAiIwIAGELSmFbbzx2SPApmhTqLJun9ttI7gRzXWbWKQrX7sARicXJ23UOaxCbLuKLpIZd6mibb262GklAiIgAiIgAiIgAiIgAiIgAiIgAoMQQJiGRq0iswhX8+51luvEa9iETsUibRCxvAE6ytwhRrbpbUMruxhufdEvvtuIMc3ZLn3bWpFgg6AkAiIgAiIgAiIgAiIgAiIgAiIwHIEUwHhEoKZIzTXlGcllHeVI1Ugue20RNl15CmAvL9q49umWpRzxSyLS7DYIaPtIBAdjLUVABERABERABERABERABERABAYigN7MhGB10WqF6FLyiNIUr7FGsKZotcaWDR9RZltWn06pxCTq3HfprM27abEv/fuW5SWC88hoLQIiIAIiIAIiIAIiIAIiIAIiMAiBEKNFhFaKmCyil/oUrJYdSXX5qEDGkE/4zSnPKabdSfaF09J9u8bA6iWCnZQWIiACIiACIiACIiACIiACIiACQxEYEaZF5aJJU+CiUDubVMGpWs2wZDuBTEF+4pnfzlft13VuWdBh+diKRBuJ4GChpQiIgAiIgAiIgAiIgAiIgAiIwEAEQqCGuEXs8qlFa6jT6GycGE453AZ2UbNZWDLezsrwG3nfCN27sghr2tjH+y/7JhE80EGWGxEQAREQAREQAREQAREQAREQgSDQCdsQqSGA6+hvlNe80oayiAAXIWvbaFlXt17H08DxjzIXuDTAHMHtK1tmc6rCodtKBBsgJREQAREQAREQAREQAREQAREQgeEIpOjse+zKXda24hS7EM4oVyK7XlLEMPnRhNQND1iXSDCq1wUvtvgp4tkzXX8SwY5GCxEQAREQAREQAREQAREQAREQgeEIjEZ9U+BG1NYDtt5VlJNNSVvEahkIYjjkbCnAMk17bdzC6lJAe19W6CKZyjJtWiLYSWkhAiIgAiIgAiIgAiIgAiIgAiIwHAGTnmUKMgI38qlei6zt1Kx1m1KXNco3tll1Md8YXVSlfTVi80cP1NAf//iPUu+/9Pf/AwHKrwI0NGrmAAAAAElFTkSuQmCC\"></p>",
          "_id": "68f7497c7c93be3ff4bad7ce"
        },
        {
          "code": "L78",
          "title": "Integrate Azure AI Service and Streaming",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>完成课程Azure AI Service和TTS</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Warmup，回顾上一节的练习和下一步练习</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>回顾后端获取短期token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>下一步：前端用token通过Stream 模式和AI Service通讯，</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明，写一个React App，调用后端获取token， 并进行Stream实现TTS和STT</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用上面的后端获取token</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>从麦克风录音转换成文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传文件转换成文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文字阅读（文字转语音）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>文字阅读的暂停和继续</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>实现STT和TTS - Pros &amp; Cons ？</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论：继续优化Azure AI（1）练习的安全性</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>跟随练习说明更新上一节的 .net 后端应用，提供一个API，接受一个音频文件，调用Azure AI转化成文字，并作为Reponse 返回 -</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>增加一个API endpoint /api/VoiceController/upload 接受一个webm文件</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>保存文件并转换成wav</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用SpeechRecognizer 把文件传至Azure识别出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习解释： 为什么要转换成wav ？</li></ol><p>===============中场休息10分钟==============</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>更新上一节的 React 前端，把录到的语音传给上面的API，获取文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>用react-mic录音</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上传文件</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Azure Speech Translation （语音翻译）介绍</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：在Azure Portal 上体验翻译功能</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：基于上一个练习增加一个API，实现语音翻译成文字功能</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：基于上一个练习的前端，增加一个按钮，调用新增的翻译API，实现语音翻译成文字功能</li></ol><p>讨论：回顾这两天Azure AI的使用体验</p>",
          "_id": "68f7497c7c93be3ff4bad7cf"
        },
        {
          "code": "L79",
          "title": "Integrate Azure AI and OpenAI",
          "type": "Video",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前置条件</strong></p><p>完成课程 Integrate Azure AI Service and Streaming</p><p>已注册ChatGPT/Open AI并开通Open AI API服务 （需要预存5美金）</p><p><strong>课程内容</strong></p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>上次课程（Azure语音转文字和翻译）的回顾</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Generative AI</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>几个最常见的Generative AI产品</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ChatGPT 和 Open AI 简介</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>ChatGPT vs OpenAI</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open AI API 简介 及其 价钱</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Open AI Platform</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Assistant</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Playground</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Other</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>在澳洲企业的实际应用案例 （如何玩转Prompt）</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Employment Hero - 简历阅读和评判</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Service NSW - ChatGPT 与 Azure CLU的PK</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>练习：Open AI API 初体验 - Open AI Playground 的体验</li></ol><p>=============中场休息10分钟===============</p><ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基于上一章练习（Azure AI 2）的后端应用，改动后端API，提供同样的语音转文字功能，但背后调用的是Open AI，而不是Azure AI</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用Open AI 的 Rest API 把文件传至OpenAI识别出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>整合上一节应用的前端测试（原则上前端无任何改动，实际上需要有一处小改动）</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>基于上一节的后端应用，改动后端API，提供翻译功能</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>调用Open AI 的 Rest API 把文件传至OpenAI翻译出文字</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>返回文字到Response</li><li data-list=\"ordered\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>前端不需要改动，测试</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>做一个chatgpt的马甲：基于上一节的后端应用实现语音输入，文字回答</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示：在自己的机器上装一个ChatGPT的大语言模型：Ollama</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AI 体验的小结和讨论</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7d0"
        },
        {
          "code": "L80",
          "title": "Docker  Introduction",
          "type": "Information",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Docker 视频学习： <a href=\"https://youtu.be/gAkwW2tuIqE\" rel=\"noopener noreferrer\" target=\"_blank\">https://youtu.be/gAkwW2tuIqE</a></p>",
          "_id": "68f7497c7c93be3ff4bad7d1"
        },
        {
          "code": "L81",
          "title": "AWS基础",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>老师：Michel Su</p><p>公司：Atlassian</p><p>职位：SRE</p><p>内容：</p><p>1. AWS的基础知识，已经AWS是什么，为什么使用Cloud云计算服务</p><p>2. 云计算的优势是什么，云计算的种类，为什么要用AWS</p><p>3. IAM是什么，如何定义IAM，Users，Groups，Roles分别是什么，如何进行实施</p><p>4. s3的基本操作，如何创建S3的bucket</p><p>5. ec2是什么，如何启用ec2。ec2 ，ecs，lambda区别是什么，如何设计</p><p>6. Load Balancer是什么，Application Load Balancer用来做什么的。Network的协议是什么</p><p>7. AWS考试以及证书是什么</p><p>8. API gateway的实施</p><p>9. 使用老师提供的项目build一个Serverless的Web Application</p>",
          "_id": "68f7497c7c93be3ff4bad7d2"
        },
        {
          "code": "L82",
          "title": "Workshop: AWS IAM的基本用法和高级使用",
          "type": "Workshop",
          "isLive": true,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop 分享人： Henry</p><p>内容：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>AWS IAM 创建账户</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>IAM 的 policy 如何设置</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>IAM 的 role 如何设置</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当用户的 Policy 抵达上限，如何解决</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>IAM 如何设置 boundary，如何限制 User 只能使用悉尼地区服务</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>针对 Non-production 和 Production 如何配置权限</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7d3"
        },
        {
          "code": "L83",
          "title": "AWS Lambda基础知识",
          "type": "Workshop",
          "isLive": true,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Shaun</p><p>内容：</p><p>1. Serverles 基础概念</p><p>2. Faas 基础概念 Function-as-a-Service 概念</p><p>3. Lambda 如何使用，Lambda 的特点，优缺点</p><p>4. Lambda 在匠人学院 App 里的使用</p><p>5. 简单的 Lambda Demo</p>",
          "_id": "68f7497c7c93be3ff4bad7d4"
        },
        {
          "code": "L84",
          "title": "Workshop：如何利用mediasoup实现多人视频会议",
          "type": "Workshop",
          "isLive": true,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Workshop：如何利用mediasoup实现多人视频会议</p>",
          "_id": "68f7497c7c93be3ff4bad7d5"
        },
        {
          "code": "L85",
          "title": "5分钟手动部署Web Application到AWS S3静态网站",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>前端App部署基础</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍如何准备前端应用以便于部署。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>指导如何选择合适的部署平台和服务。</li></ol><p><strong>创建AWS S3 Bucket</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>逐步演示如何在AWS S3中创建一个新的Bucket。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论Bucket命名规则和配置选项。</li></ol><p><strong>编写Bucket策略</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何为Bucket编写安全策略。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析策略语法和关键要素。</li></ol><p><strong>Bucket的日常操作</strong></p><ol><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何上传、下载和管理Bucket中的文件。</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索如何监控和维护Bucket。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7d6"
        },
        {
          "code": "L86",
          "title": "GraphQL101: 剥离RESTful的银行系统开发实践—Gary Sun",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Gary</p><p>内容：</p><p><strong>RESTFul与GraphQL对比</strong></p><ul><li>探讨两种API设计范式的优缺点。</li><li>分析何时使用RESTFul，何时更适合选择GraphQL。</li></ul><p><strong>GraphQL的核心概念</strong></p><ul><li>详细介绍GraphQL的工作原理和主要特性。</li><li>讨论GraphQL如何改善数据获取和管理。</li></ul><p><strong>GraphQL查询语言</strong></p><ul><li>学习如何构建高效的查询，获取精确的数据。</li><li>实践GraphQL的强大灵活性，适应复杂的应用需求。</li></ul>",
          "_id": "68f7497c7c93be3ff4bad7d7"
        },
        {
          "code": "L87",
          "title": "SpringBoot的Production部署到AWS ECS Fargate，如何使用Microservice with docker",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: Xiaokai &amp; Yinhang</p><p>内容：</p><ul><li>Springboot 的 Docker 部署到 AWS</li><li>ECS AWS</li><li>ECS 如何进行 CICD</li><li>Task 是什么，如何使用</li><li>VPC 是什么</li><li>Subnet 是什么，如何使用</li><li>Microservice 是什么</li></ul>",
          "_id": "68f7497c7c93be3ff4bad7d8"
        },
        {
          "code": "L88",
          "title": "Workshop: 持续集成(CI)/持续部署(CD)的概念以及Jenkins的使用",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Roger</p><p>内容：</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>持续集成(CI)/持续部署(CD)的概念</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Jenkins 如何一步一步部署上的</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Jenkins 的 Docker Image 如何部署的</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何实现 Nodejs 后端的自动化部署</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>如何实现 React 前端的自动化部署</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7d9"
        },
        {
          "code": "L89",
          "title": "CI/CD基础:使用Jenkins和AWS CodePipeline手把手部署一个Web App",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p><p>内容：</p><p>1. Jenkins和AWS Codedeploy的区别是什么，有什么优点好处</p><p>2. 代码里的Jenkinsfile逐行解读</p><p>3. Jenkins如何开一个新的pipeline部署到Branch上</p><p>4. 如何使用AWS CodePipeline部署</p>",
          "_id": "68f7497c7c93be3ff4bad7da"
        },
        {
          "code": "L90",
          "title": "Open AI Huggingface讲解 - Guang",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>OpenAI概览</strong></p><ul><li>介绍OpenAI的发展历程、愿景和主要成果。</li></ul><p><strong>提示词工程与高级使用</strong></p><ul><li>探讨如何精准地使用提示词来提高模型的效果。</li><li>分析高级应用技巧和策略。</li></ul><p><strong>OpenAI的其他模型</strong></p><ul><li>了解OpenAI提供的各种AI模型及其特点和用途。</li></ul><p><strong>开源AI模型对比</strong></p><ul><li>探讨与OpenAI相似的开源模型，比较它们的优势和局限。</li></ul><p><strong>产品和运维中的应用</strong></p><ul><li>分析OpenAI在实际产品开发和运维中的应用案例。</li><li>探索如何将AI模型融入生产实践。</li></ul>",
          "_id": "68f7497c7c93be3ff4bad7db"
        },
        {
          "code": "L91",
          "title": "用Kafka实践Event First设计思维—虎头锤",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 虎头锤</p><p>内容:</p><p><strong>Kafka简介</strong></p><ul><li>介绍Kafka的功能和在现代数据处理中的重要性。</li><li>讨论Kafka的主要组件，包括生产者、消费者、主题和分区。</li></ul><p><strong>Event First设计</strong></p><ul><li>解析Event First设计方法的原则和优势。</li><li>分析如何使用Kafka构建事件驱动的系统架构。</li></ul><p><strong>Kafka实战应用</strong></p><ul><li>演示如何设置和配置Kafka环境。</li><li>指导如何创建Kafka主题，发送和接收消息。</li></ul>",
          "_id": "68f7497c7c93be3ff4bad7dc"
        },
        {
          "code": "L92",
          "title": "手把手带你打造高质量IT人的LinkedIn主页",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>手把手带你打造高质量IT人的LinkedIn主页</p>",
          "_id": "68f7497c7c93be3ff4bad7dd"
        },
        {
          "code": "L93",
          "title": "LinkedIn & CV",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><span style=\"color: #191919;\">1. 校招和社招的要求，entry level vs junior level vs mid level</span></p>\n<p><span style=\"color: #191919;\">2. 职场规划，沟通能力的重要性，team match 的重要性</span></p>\n<p><span style=\"color: #191919;\">3. 澳洲公司情况，产品方向 vs 咨询方向</span></p>\n<p><span style=\"color: #191919;\">4. 找工作网站的区别、建议</span></p>\n<p><span style=\"color: #191919;\">5. 工作类型，permanent vs contractor，薪资期待，福利待遇</span></p>\n<p><span style=\"color: #191919;\">6. 获取工作的方式：meetup、猎头、内推，如何区分和利用猎头，内推的作用</span></p>\n<p><span style=\"color: #191919;\">7. 如何经营 linkedin：提高 SEO 和可读性、扩大人脉、利用 open network、写好 profile</span></p>\n<p><span style=\"color: #191919;\">8. 招聘流程，怎样投简历，怎样说未来计划，怎样说 notice period</span></p>\n<p><span style=\"color: #191919;\">9. 怎样写简历，LMS 简历制作功能，怎样罗列自己的技能，怎样把项目经历写进简历</span></p>\n<p><span style=\"color: #191919;\">10. 求职信的作用，怎样写求职信</span></p>",
          "_id": "68f7497c7c93be3ff4bad7de"
        },
        {
          "code": "L94",
          "title": "澳洲工作职场介绍",
          "type": "Video",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"澳洲公司全景：行业领袖与职业机遇\"</strong></p>\n<ol>\n<li><strong>澳洲公司的市场概况</strong>：深入介绍澳洲主要行业和领先公司，包括它们的市场定位、企业文化和核心价值。</li>\n<li><strong>澳洲公司的职业前景</strong>：探讨在澳洲各种类型公司工作的优势和挑战，以及如何在这些环境中发展职业生涯。</li>\n</ol>\n<p><strong>\"就业方向解析：产品与咨询服务\"</strong></p>\n<ol>\n<li><strong>产品方向的职业机遇</strong>：探讨在产品管理、开发和策略等领域的职业路径，以及如何在这些领域成功发展。</li>\n<li><strong>咨询服务方向的职业途径</strong>：深入分析咨询行业的工作性质、职业晋升路径和必备技能，以及如何在咨询服务领域建立成功的职业。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7df"
        },
        {
          "code": "L95",
          "title": "澳洲企业招聘流程",
          "type": "Video",
          "isLive": false,
          "duration": 30,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"澳洲企业招聘全攻略：三大关键阶段深度解析\"</strong></p>\n<ol>\n<li><strong>简历和求职信的制作与提交</strong>：学习如何撰写针对澳洲市场的高效简历和求职信，包括格式、内容和展现个人特色的技巧。</li>\n<li><strong>面试的全面准备</strong>：深入分析招聘过程中的各种面试类型，包括初步面试、在线评估、技术面试和管理层面试。提供准备技巧、常见问题解答和成功策略。</li>\n<li><strong>Offer 阶段的策略</strong>：探讨如何在收到工作邀约时进行有效的沟通和谈判，包括薪资、福利和其他工作条件。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7e0"
        },
        {
          "code": "L96",
          "title": "招聘官挑选简历的标准",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>招聘官在挑选简历时通常会根据以下几个标准进行筛选：</p>\n<ol>\n<li><strong>符合职位要求</strong>：首先会检查应聘者的教育背景、工作经验、技能和资格是否符合岗位的具体要求。</li>\n<li><strong>清晰、专业的简历格式</strong>：一份清晰、逻辑性强、格式规范、无拼写错误的简历更容易获得青睐。</li>\n<li><strong>关键字匹配</strong>：许多公司使用自动跟踪系统（ATS）来筛选简历，这些系统会根据职位描述中的关键字来评估简历的相关性。</li>\n<li><strong>成就和成绩</strong>：与其仅仅列出职责，招聘官更倾向于看到具体的成就和成绩，例如销售额、成本节约、项目成功实施等量化的结果。</li>\n<li><strong>职业发展的连贯性</strong>：职业路径中的逻辑发展和进步表明了候选人的职业目标和职业规划。</li>\n<li><strong>个性和文化契合度</strong>：简历中的个人陈述或兴趣爱好部分可以体现出候选人是否可能与公司文化和团队精神相契合。</li>\n<li><strong>职业目标</strong>：简历应该传达出候选人的职业目标与申请职位是如何对齐的。</li>\n<li><strong>社交媒体和在线存在</strong>：有时候招聘官也会查看LinkedIn等专业网络或其他社交媒体来了解候选人的专业背景和行为表现。</li>\n<li><strong>推荐信和联系人</strong>：提供可以证实候选人能力和表现的推荐人可以是一个加分项。</li>\n<li><strong>附加技能</strong>：除了基本技能之外，候选人显示的任何额外技能或证书也会让其简历更加突出。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7e1"
        },
        {
          "code": "L97",
          "title": "如何撰写 IT 专业简历",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<ol><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>清晰的格式和布局</strong>：使用易于阅读的字体和清晰的布局。保持简历的长度适中，通常不超过两页。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>个人信息和联系方式</strong>：包括你的姓名、职业头衔（如软件工程师、系统管理员等）、联系电话、电子邮箱和 LinkedIn 个人页面链接。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>专业摘要或目标声明</strong>：简洁地概述你的职业背景、技能和你寻求的职位类型。这部分应该具有吸引力且针对你申请的职位量身定制。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>技术技能</strong>：明确列出你的技术技能，如编程语言（例如 Java、Python）、框架（如 Spring、React）、数据库（如 MySQL、MongoDB）和工具（如 Git、Docker）。根据求职职位的要求来调整技能列表。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>工作经验</strong>：按时间顺序列出你的工作经历，包括公司名称、职位、工作时间和职责描述。突出具体成就和使用的技术。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>项目经历</strong>：如果你有相关的项目经验（包括学校项目、个人项目或自由职业项目），请列出来，说明你的角色、使用的技术和项目成果。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>教育背景</strong>：提供你的最高学历信息，包括学校名称、学位、专业和毕业时间。如果你是新毕业生，可以更详细地说明你的教育背景。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>证书和培训</strong>：如果你有相关的行业证书（如 AWS Certified Solutions Architect、Cisco 的 CCNA）或完成了重要的专业培训，务必列出。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>其他信息</strong>：如语言能力、志愿者经验、获奖情况等，如果它们对你申请的职位有帮助，可以选择性地加入。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>定制你的简历</strong>：针对每个职位调整你的简历，确保它符合职位描述中的关键字和要求。</li><li data-list=\"ordered\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>校对和审核</strong>：在提交前，请仔细校对你的简历，确保没有拼写和语法错误。有可能的话，让你的同事或朋友帮你复查。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7e2"
        },
        {
          "code": "L98",
          "title": "简历常见问题",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"简历制作艺术：重点、加减分项及编写原则\"</strong></p>\n<ol>\n<li><strong>简历的重点内容</strong>：指导您如何突出简历中的重点内容，包括职业经历、技能、成就和教育背景，确保雇主能够快速抓住您的核心优势。</li>\n<li><strong>避免的简历减分项</strong>：教您识别和避免简历中的常见错误和不利因素，如过度冗长、格式不当或信息不准确等。</li>\n<li><strong>简历的加分元素</strong>：提供策略和建议，帮助您在简历中加入能够提升吸引力的元素，如特定技能证明、相关项目经验或突出成就等。</li>\n<li><strong>编写简历的基本原则</strong>：探讨在编写简历时应遵循的基本原则，包括清晰性、专业性和针对性，以及如何根据目标职位定制简历。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7e3"
        },
        {
          "code": "L99",
          "title": "如何利用 ChatGPT 写简历",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"利用 ChatGPT 提升简历撰写技巧：指南与实践\"</strong></p>\n<ol>\n<li><strong>ChatGPT 基本使用方法</strong>：本节课将介绍 ChatGPT 的基础功能和操作方法，帮助学员快速掌握如何有效使用这一先进的工具。</li>\n<li><strong>ChatGPT 在简历撰写中的应用技巧</strong>：这部分将指导学员如何充分利用 ChatGPT 在简历撰写中的潜力，包括格式建议、内容生成和优化技巧，以打造一份吸引眼球的简历。</li>\n<li><strong>与 ChatGPT 进行个性化交互</strong>：教授学员如何与 ChatGPT 进行有效的个性化交互，以获取更加符合职业目标和个人特色的简历内容。</li>\n<li><strong>ChatGPT 实例演示</strong>：通过实际操作演示，展示 ChatGPT 在简历撰写和改进方面的应用，帮助学员更好地理解和掌握实际操作技巧。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7e4"
        },
        {
          "code": "L100",
          "title": "手把手带着运营 LinkedIn",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"LinkedIn 职业建设：完善个人资料与网络拓展\"</strong></p>\n<ol>\n<li><strong>维护完整、专业的 LinkedIn 个人资料</strong>：指导您如何创建和维护一个展现您职业经历、技能和成就的专业 LinkedIn 资料。这包括头像选择、经历描述、技能展示和获取推荐等关键元素。</li>\n<li><strong>加入与行业和兴趣相关的 LinkedIn 群组</strong>：教您如何找到和加入与您的职业领域和兴趣相关的 LinkedIn 群组，以便进行行业交流、拓展职业网络和获取行业最新动态。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7e5"
        },
        {
          "code": "L101",
          "title": "如何利用 LinkedIn 准备面试",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>\"求职成功攻略：职位描述解析、面试准备与公司研究\"</strong></p>\n<p>这个课程旨在全面指导您如何在求职过程中取得成功。本课程将包括：</p>\n<ol>\n<li><strong>职位描述深度解析</strong>：教您如何仔细分析职位描述，理解职位要求的核心内容和隐含条件，从而更有效地准备申请材料和面试。</li>\n<li><strong>面试准备技巧</strong>：提供面试准备的策略，包括如何针对面试描述准备回答问题、展示自己的优势，以及如何应对常见面试问题。</li>\n<li><strong>利用 LinkedIn 搜索目标公司</strong>：指导您如何有效利用 LinkedIn 平台搜索并研究目标公司，包括公司背景、文化、行业地位等信息，以增强您的求职策略。</li>\n</ol>",
          "_id": "68f7497c7c93be3ff4bad7e6"
        },
        {
          "code": "L102",
          "title": "如何准备澳洲大厂开发类岗位面试",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>老师：Xuecong，就职于悉尼 AWS，SDE</p><p>内容：</p><p>1. 澳洲大厂开发类岗位面试常见流程</p><p>2. 如何‘管理'整个面试流程</p><p>3. 如何准备面试申请</p><p>4. 准备面试，哪些专业能力需要提高</p><p>5. 如何准备大厂面试，体现价值观和企业文化</p><p>6. 面试当天注意事项</p><p>7. 如何接受，拒绝，协商 Offer</p>",
          "_id": "68f7497c7c93be3ff4bad7e7"
        },
        {
          "code": "L103",
          "title": "求职国内秋招大厂前端开发岗，需要做哪些准备",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p><p>内容：</p><ul><li>国内大厂前端岗位如何细分？</li><li>获得前端岗位 Offer 所需的几大要素</li><li>如何准备面试中的八股文、算法等硬核考点？</li><li>怎样的实习经历可以让你在校招求职中脱颖而出？</li></ul>",
          "_id": "68f7497c7c93be3ff4bad7e8"
        },
        {
          "code": "L104",
          "title": "如何准备国内秋招，才能获得大厂Offer?",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Chen</p><p>内容：</p><p><strong>秋招时间规划</strong></p><ul><li>解析秋招的主要时间节点，帮助你合理安排准备时间。</li><li>讨论如何在学习、实习和求职之间平衡。</li></ul><p><strong>准备秋招的步骤</strong></p><ul><li>提供详细的秋招准备指南，包括市场调研、目标公司筛选等。</li><li>强调技能提升和实战经验积累的重要性。</li></ul><p><strong>笔试准备技巧</strong></p><ul><li>分析常见的笔试题型和应对策略。</li><li>提供实用的学习资源和练习方法。</li></ul><p><strong>面试技巧训练</strong></p><ul><li>探讨如何在面试中有效展现你的能力和潜力。</li><li>分享面试中的常见问题和最佳回答技巧。</li></ul>",
          "_id": "68f7497c7c93be3ff4bad7e9"
        },
        {
          "code": "L105",
          "title": "在澳洲如何找到一份Java Developer的工作 -- 虎头锤",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：虎头锤</p><p>内容:</p><p><strong>澳洲Java工作市场分析</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索澳洲Java开发岗位的市场需求和主要工作要求。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析技术技能和行业经验在职场中的重要性。</li></ol><p><strong>回答行为面试问题</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提供实用的策略和技巧，帮助你准备和回答行为面试中的问题。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析常见的行为问题及其背后的意图。</li></ol><p><strong>简历撰写和个人品牌打造</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>教你如何撰写一份突出你技能和经验的简历。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论如何在简历中有效地展示你的项目经验和技术能力。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ea"
        },
        {
          "code": "L106",
          "title": "澳洲程序员找工作必备哪些后端知识",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 老虎</p><p>内容:</p><p><strong>澳洲后端开发者必备知识</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析澳洲后端开发职位的常见要求和技能需求。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨关键的编程语言（如Java、Python、Node.js）和框架。</li></ol><p><strong>数据库技能</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍常用的数据库技术，包括关系型数据库（如MySQL、PostgreSQL）和非关系型数据库（如MongoDB）。</li></ol><p><strong>API开发与RESTful服务</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>学习如何设计和实现高效的RESTful API。</li></ol><p><strong>版本控制和代码协作</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>强调Git等版本控制系统的重要性，并探索代码协作的最佳实践。</li></ol><p><strong>云服务和容器化技术</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍云计算服务（如AWS、Azure）和容器技术（如Docker、Kubernetes）。</li></ol><p><strong>软件工程最佳实践</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨如何编写可维护、高效的代码，以及软件测试和持续集成的重要性。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7eb"
        },
        {
          "code": "L107",
          "title": "在澳洲，IT学生如何准备System Design面试-----Ben",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Ben</p><p>内容：</p><p><strong>系统设计面试的基本功</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>概念理解</strong>：讲解系统设计面试中经常涉及的关键概念，如可扩展性、可靠性、效率等。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>技能要点</strong>：强调分析问题、沟通思路、考虑权衡的重要性，并提供实用技巧帮助你在面试中脱颖而出。</li></ol><p><strong>面试准备方法</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>资源梳理</strong>：介绍高质量的学习资源和实践工具，帮助你系统地准备系统设计面试。</li></ol><p><strong>Monolith架构解析</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>定义和特点</strong>：详细解释Monolith（单体架构）的概念，并探讨其优缺点。</li></ol><p><strong>Microservice架构探索</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span><strong>核心理念</strong>：深入讲解Microservice（微服务架构）的基本原则和结构。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ec"
        },
        {
          "code": "L108",
          "title": "从0到1打造React/Node 全栈IoT实时应用——Bryan",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>主讲人：Bryan</p><p>内容 ：</p><p><strong>IoT概览</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>介绍IoT的定义、发展历程和关键技术。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析IoT在不同行业中的应用案例。</li></ol><p><strong>IoT架构与最佳实践</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论IoT系统的典型架构和组件。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探索IoT项目的设计原则和最佳实践。</li></ol><p><strong>实时应用与技术栈</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>解析构建IoT实时应用的技术栈和框架。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析物联网的数据处理和通信技术。</li></ol><p><strong>案例研究和演示</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过具体的项目示例展示IoT技术的应用。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>演示如何实现IoT解决方案，并讨论其实际效果。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ed"
        },
        {
          "code": "L109",
          "title": "Google大佬教你，如何突破年薪20w澳币天花板 -- 韭天",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人: 韭天</p><p>内容:</p><p><strong>薪资的组成</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>深入了解薪资的不同组成部分，包括基本工资、奖金、福利等。</li></ol><p><strong>提升薪资的方法</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>探讨如何通过技能提升、职位晋升等方式增加薪资。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析职业发展中关键的技能和资格认证。</li></ol><p><strong>优质雇主的选择</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>比较不同类型的公司及其提供的薪资水平。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>讨论如何选择能够提供更好薪资和职业发展机会的公司。</li></ol><p><strong>职业生涯规划</strong></p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>指导如何根据个人目标和市场趋势规划职业生涯。</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>分析长期职业规划对薪资和职业满意度的影响。</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ee"
        },
        {
          "code": "L110",
          "title": "Elastic Search基础知识分享Workshop",
          "type": "Video",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>分享人：Kevin</p><p>内容：</p><ol><li>Logging Saas 服务商横向比较：Elastic Search，Splunk，Sumo Logic，Datadog，New Relic 等</li><li>Elastic Search 是什么，Elastic 的优势是什么</li><li>Elastic Search 架构 Log，Beats，Logstash，Elasticsearch，Kibana</li><li>Beats 的使用，Beats 的特点</li><li>Elastic Search 在匠人的架构，Lambda 如何使用</li><li>Elastic Search 的如何创建 Dashboard</li><li>Elastic Search 的如何查询 Logging 信息，如何做筛选</li></ol>",
          "_id": "68f7497c7c93be3ff4bad7ef"
        },
        {
          "code": "L111",
          "title": "关于如何解决Error Messages，几个步骤",
          "type": "Information",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>应对error message的几个步骤：</p><p>1. 详细阅读一下error message，看报错的内容是什么，是否和自己操作的步骤有关，你是否能从报错的内容中找到出错位置，以及出错原因</p><p>2. 如果自己无法理解错误信息，尝试提炼出error message中的关键语句，在google上搜索。这一步很重要。如果全盘复制error message，有可能会因为字符数太多而无法详细匹配到你要找的答案。所以如何精炼错误信息的同时又精准的找到网上的答案，也是锻炼搜索能力的重要一步</p><p>3. 尝试从google的搜索结果当中，逐一比较，是否和你的错误信息相关。如果是，可以尝试google提出的解决方案。通常情况下你找到的第一个不一定是能解决你问题的那个一个。有可能需要尝试五六个/六七个不同的方案，才最终能找到你想要的内容</p><p>4. 如果google上的内容也无法帮你解决问题，可以截图错误信息，注意截图中要包含你所跑的命令和详细的错误信息，发到群里，大家帮你参考。</p>",
          "_id": "68f7497c7c93be3ff4bad7f0"
        },
        {
          "code": "L112",
          "title": "Student Showcase: Stripe Integration in Practice",
          "type": "Workshop",
          "isLive": true,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>Student Showcase: Stripe Integration in Practice</p>",
          "_id": "68f7497c7c93be3ff4bad7f1"
        },
        {
          "code": "L113",
          "title": "HTML入门实战：从空白到CareerMate网页框架",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>这是项目开发正式启动的第一节技术课。你将从零搭建 <strong>CareerMate AI 的 Landing Page 基础网页结构</strong>，完成一个可在浏览器打开、具备真实页面骨架的静态页面，为后续 CSS 布局、JavaScript 交互和 React 重构打下基础</p><h3>本节课目标</h3><ul><li><p>理解 <strong>HTML 在真实产品中的作用</strong>：结构层（Structure Layer）。</p></li><li><p>能独立写出 CareerMate Landing Page 的 <strong>页面骨架与主要区块结构</strong>。</p></li><li><p>建立“<strong>先搭结构 → 再做样式 → 再加交互</strong>”的工程化开发顺序。</p></li></ul><h3>核心内容</h3><ol><li><p><strong>HTML 基础与工程化写法</strong></p><ul><li><p>HTML 文档结构：<code>doctype / head / body</code></p></li><li><p>常见标签与语义化（Semantic HTML）：<code>header / nav / section / article / footer</code></p></li><li><p>页面结构分层思维：每一块页面 = 一个可维护的 section</p></li></ul></li><li><p><strong>CareerMate Landing Page 信息架构</strong></p><ul><li><p>解析 Landing Page 需要的核心模块（按真实产品信息流）：</p><ul><li><p><strong>Hero Section</strong>（产品一句话定位 + CTA）</p></li><li><p><strong>Features Section</strong>（核心功能亮点）</p></li><li><p><strong>How It Works / Workflow</strong>（用户使用流程）</p></li><li><p><strong>Testimonials / Social Proof</strong>（可先留占位）</p></li><li><p><strong>Footer</strong>（版权、链接、联系方式）</p></li></ul></li><li><p>用 HTML 先把这些模块 <strong>按顺序搭成页面框架</strong></p></li></ul></li><li><p><strong>从空白到可运行页面</strong></p><ul><li><p>新建项目目录与文件结构：</p><ul><li><p><code>index.html</code></p></li><li><p><code>assets/</code>（图片占位）</p></li><li><p><code>styles/</code>（先留空，CSS 下节课做）</p></li></ul></li><li><p>浏览器打开并验证页面结构正确</p></li></ul></li><li><p><strong>代码规范与可读性</strong></p><ul><li><p>缩进、注释、层级命名</p></li><li><p>每个 section 先写结构和占位文案（后面再逐步替换）</p></li></ul></li></ol>",
          "_id": "691abd061e1fa03b57b0faca"
        },
        {
          "code": "L114",
          "title": "CSS基础与产品风格打造：让页面“有感觉”",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>上一节我们完成了CareerMate AI网页的HTML结构搭建，本节你将正式“点亮”整个页面：加入色彩、排版、组件样式和响应式能力，为页面赋予专业、统一且可扩展的视觉风格。</p><p>这是你第一次从视觉角度“做出一个产品的感觉”。</p><h3>本节课目标</h3><ul><li><p>学会用CSS变量统一管理颜色、间距、阴影等视觉参数</p></li><li><p>为按钮、卡片等核心组件添加专业风格的样式</p></li><li><p>掌握网页布局的基础排版、留白与分区设计</p></li><li><p>建立初步响应式布局能力，适配不同屏幕宽度</p></li></ul><h3>核心内容</h3><p><strong>全局样式与设计变量（Design Tokens）</strong></p><ul><li><p>使用 <code>:root</code> 设置全局CSS变量（颜色、边框圆角、阴影、最大宽度等）</p></li><li><p>配置基础字体大小、行高、背景色、链接样式等</p></li><li><p>实现统一的视觉基调和清晰的页面节奏感</p></li></ul><blockquote><p>💡 例如：你只需改一个变量，就能全站换色、统一间距！</p></blockquote><p><strong>核心组件美化</strong></p><ul><li><p><strong>按钮 Button</strong>：</p><ul><li><p>主按钮（实心）：背景色 + 白色字体</p></li><li><p>次按钮（描边）：透明背景 + 有边框 + hover 效果</p></li></ul></li><li><p><strong>卡片 Card</strong>：</p><ul><li><p>白底、圆角、有阴影，看起来干净整洁</p></li></ul></li><li><p><strong>大号CTA横幅</strong>：</p><ul><li><p>使用渐变背景（蓝→紫），文字居中，突出视觉焦点</p></li></ul></li></ul><blockquote><p>所有组件都会对照原型截图效果，完成“像产品”的还原。</p></blockquote><p><strong>页面分区布局美化</strong></p><ul><li><p>每个 <code>&lt;section&gt;</code> 添加恰当的上下内边距（padding）</p></li><li><p>设置最大宽度容器（居中），让内容不“贴边”</p></li><li><p>统一区块标题样式，增强视觉层次</p></li><li><p>适当加上浅色背景、分割线等辅助元素</p></li></ul><p><strong>基础响应式设计</strong></p><ul><li><p><strong>移动优先</strong> 开发（Mobile-first）</p></li><li><p>用媒体查询（@media）添加断点（如768px、1024px）</p></li><li><p>内容列在小屏上垂直堆叠，避免横向滚动</p></li><li><p>字体、卡片、按钮在手机上依旧可读易点</p></li></ul><h3>小贴士</h3><ul><li><p>把网页想象成一本杂志，好的留白、对齐和分区让读者“看得舒服”。</p></li><li><p>样式变量就像是调色板和尺子，既节省时间又让设计专业统一。</p></li></ul>",
          "_id": "691abf4d1e1fa03b57b15c44"
        },
        {
          "code": "L115",
          "title": "JavaScript交互入门：让网页“动起来",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>写网页，不只是堆静态内容。本节课我们正式开启前端开发的“灵魂”：JavaScript，让你的CareerMate AI网页从静态页面变成真正“会动、能互动”的Web应用。</p><p>你将动手实现网页中的浮动按钮、用户表单交互、验证逻辑、接口请求等常见交互功能，完成从“展示型网页”向“可交互应用”的进阶。</p><h3>本节课目标</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>掌握如何用原生JavaScript为网页添加交互行为</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>能独立实现常见交互功能（按钮显示/隐藏、表单验证、数据提交）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>理解事件绑定、条件渲染、用户输入校验等JS基础核心概念</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>为后续学习React中的“状态管理”和“组件逻辑”打下基础</li></ol><h3>核心内容</h3><p>悬浮按钮浮出与回顶功能</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>添加一个「回到顶部」浮动按钮（右下角）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>当页面下滑一段距离后按钮才出现，点击后平滑滚动回到顶部（或跳转至Hero CTA）</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>自动适配移动端，确保不遮挡主要内容</li></ol><p>✨ 常见于电商官网或文档页的「Back to Top」，这节你也能自己实现！</p><p>联系表单功能开发</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>让已有的表单（Name / Email / Message）动起来</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>通过点击提交按钮收集数据，并反馈提交状态</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>提交前校验字段内容是否填写完整、格式是否正确</li></ol><p>前端表单校验逻辑</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>校验规则：</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Email 必须是合法格式</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>Message 长度不少于一定字符</li><li data-list=\"bullet\" class=\"ql-indent-1\"><span class=\"ql-ui\" contenteditable=\"false\"></span>所有字段为必填</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>校验失败：贴近字段显示错误提示</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>校验通过：允许发送请求</li></ol><p>🎯 这是实际开发中 90% 表单交互的核心逻辑，掌握即能通吃大部分业务需求！</p><p>模拟提交请求（Mock API）</p><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>使用 JavaScript 的 fetch 或 setTimeout 模拟“表单已发送”的请求流程</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>成功：清空表单，弹出绿色成功提示</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>失败：弹出红色错误提示，且保留输入内容以便修改重试</li></ol><p>💡 学会用 fetch 模拟接口请求，是后续开发任何功能（登录/注册/搜索/上传）的基础。</p><h3>学习小贴士</h3><ol><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>JavaScript 不是背语法，而是学“怎么让网页回应用户”</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>表单功能 = 用户输入 → 校验 → 反馈 → 发送 → 响应，这一整套流程理解后能套用到几乎所有功能</li><li data-list=\"bullet\"><span class=\"ql-ui\" contenteditable=\"false\"></span>想象你是网页的“灵魂控制器”：用户点击，你来决定网页做什么</li></ol><p>完成这节课，你的CareerMate网页就不再只是“能看”，而是“能用、能反馈”的真正产品雏形。欢迎进入JavaScript的世界，从此网页开始动起来了！</p><p><br></p><p>PPT： https://www.canva.com/design/DAG7pygSHKA/bMpu6GVYsOXJtCjxdWUTCw/edit?utm_content=DAG7pygSHKA&amp;utm_campaign=designshare&amp;utm_medium=link2&amp;utm_source=sharebutton</p>",
          "_id": "691ac1c71e1fa03b57b1b68a"
        },
        {
          "code": "L116",
          "title": "Git 版本管理的第一步：掌握Git并上传你的项目",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p><strong>探索版本控制的魔法</strong></p><ol><li><p>为什么我们都爱版本控制？</p></li><li><p>分布式(Distributed) vs 集中式(Centralized)：Git的独特之处。</p></li><li><p>什么是分布式版本控制系统</p></li><li><p>主流的 git 系统介绍</p></li></ol><p><strong>开启你的Git旅程</strong></p><ol><li><p>一步步引导你安装和配置Git。</p></li><li><p>为Git设定你的身份：告诉Git你是谁。</p></li><li><p>初始化Git空间: **git init**的魔力。</p></li><li><p><strong>mkdir</strong>：快速创建你的项目目录。</p></li></ol><p><strong>创建并驾驭你的代码宝库（Repository）</strong></p><ol><li><p>初始化你的第一个Git仓库。</p></li><li><p>如何管理和跟踪你的代码变更。</p></li></ol><p><strong>保护与跟踪你的代码</strong></p><ol><li><p>如何安全地保存你的代码更改？</p></li><li><p>了解**add**, **commit**以及它们如何帮助你管理更改。</p></li><li><p>深入理解**git log**：用美化的log追溯你的代码历史。</p></li><li><p><strong>.gitignore</strong>：掌握哪些文件不应纳入版本控制。</p></li><li><p>探索日常工作中使用Git的标准流程。</p></li><li><p>远程仓库(Remote Repository)的创建与管理：掌握**clone**, <strong>push</strong>, <strong>pull</strong>。</p></li></ol><p><strong>Sourcetree：让Git操作可视化</strong></p><ol><li><p>为什么需要图形化工具？</p></li><li><p>如何使用Sourcetree提高工作效率。</p></li></ol><p><strong>出错了怎么办：撤回与修复</strong></p><ol><li><p>掌握reset, <strong>revert</strong>, <strong>amend</strong>：让你的代码时光倒流。</p></li><li><p><strong>checkout和stash</strong>：两种保存和切换的策略，它们的不同之处。</p></li></ol><p><strong>更进一步：分支管理与合作</strong></p><ol><li><p>学习如何merge、处理代码冲突。</p></li><li><p><strong>rebase</strong>：为什么和何时使用它。</p></li><li><p>pull request与代码审查：如何高效、规范地合作。</p></li></ol><p><strong>当代码世界相撞：冲突(Conflict)解决大师</strong></p><ol><li><p>当代码出现纷争，我们该如何和平解决？</p></li><li><p>使用rebase<strong>与</strong>merge的策略，成为解决冲突的高手。</p></li></ol><p><strong>Git的小贴士和技巧</strong></p><ol><li><p>介绍神奇的.gitignore文件：让某些文件“隐形”。</p></li><li><p>快速、有效地查看你的代码历史。</p></li></ol><p><strong>Git遇见GitHub：开放的代码舞台</strong></p><ol><li><p>GitHub: 一个开发者的乐园。</p></li><li><p>如何在GitHub上展示你的才华，与全球开发者共舞。</p></li></ol><p></p><p><strong>Links:</strong></p><ol><li><p>Git client: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://git-scm.com/\">https://git-scm.com/</a></p></li><li><p>SourceTree: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://www.sourcetreeapp.com/\">https://www.sourcetreeapp.com/</a></p></li><li><p>Visualizing Git: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"http://git-school.github.io/visualizing-git/#free\">http://git-school.github.io/visualizing-git/#free</a></p></li><li><p>Windows Terminal: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701\">https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701</a></p></li><li><p>Powerline for Windows Terminal: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup\">https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup</a></p></li><li><p>Windows Subsystem for Linux: <a target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 underline hover:text-blue-800\" href=\"https://docs.microsoft.com/en-us/windows/wsl/install-win10\">https://docs.microsoft.com/en-us/windows/wsl/install-win10</a></p></li></ol>",
          "_id": "691aed701e1fa03b57b815d1"
        },
        {
          "code": "L117",
          "title": "GitHub Action + CICD自动部署上线：让你的CareerMate网页全球可见",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>CICD自动部署上线：让你的CareerMate网页全球可见</p>",
          "_id": "691aefcb1e1fa03b57b89a53"
        },
        {
          "code": "L118",
          "title": "网页布局与响应式：Flex + Grid 打造专业结构",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>本节课，你将正式掌握如何用现代 CSS 布局系统（Flexbox + Grid）构建出一个既美观又实用的网页结构。你会手把手完成 CareerMate AI 的各大核心页面区域，从导航栏、Hero 区、功能展示卡片到 Testimonials 和 Footer，用专业手法打造真正“像产品”的页面。</p><hr><h2>本节课目标</h2><ul><li><p>掌握 Flexbox 与 CSS Grid 的基本语法与常见应用场景</p></li><li><p>能根据设计图，搭建页面各区域结构并保持良好对齐</p></li><li><p>实现页面在不同设备尺寸下自动适配的响应式布局</p></li><li><p>理解开发中“移动优先”布局策略</p></li></ul><hr><h2>核心内容拆解</h2><h3>顶部导航栏布局（Flexbox）</h3><ul><li><p>左边：品牌 Logo</p></li><li><p>中间：功能导航链接（如 Features / Docs）</p></li><li><p>右边：登录按钮 + “Get Pro” CTA</p></li><li><p>使用 Flex 控制三栏对齐，确保横向缩放时元素自动换行或堆叠整齐</p></li></ul><blockquote><p>🧠 小技巧：用 justify-content: space-between + align-items: center 实现主流导航布局</p></blockquote><hr><h3>Hero 区块排布（Flex + Grid）</h3><ul><li><p>中心大标题 + 描述文字 + 横向 CTA 按钮组</p></li><li><p>下方是三张 preview 预览卡片（横向排列，移动端自动堆叠）</p></li></ul><blockquote><p>举例说明：PC 看起来像三张卡片横着排队站好，手机上则乖乖一个个叠起来，适应不同屏幕。</p></blockquote><hr><h3>“Still Struggling…” 对比区块（Grid）</h3><ul><li><p>左侧：痛点 bullet list（如“简历没人看”）</p></li><li><p>右侧：右边是渐变色 promo 卡片（吸睛的视觉引导）</p></li></ul><blockquote><p>使用 Grid 实现两栏对比展示，大屏并排、小屏自动垂直堆叠。</p></blockquote><hr><h3>Feature 功能卡片展示（Grid）</h3><ul><li><p>展示四大功能（AI 模拟面试、简历分析等），用 2×2 网格排布</p></li><li><p>移动端自动变成一列，提升可读性</p></li><li><p>控制卡片等高，保持整洁视觉效果</p></li></ul><hr><h3>AI Demo 互动示意（Grid + Flex）</h3><ul><li><p>左边模拟“使用流程”步骤（小图 + 说明）</p></li><li><p>右边模拟 AI 聊天窗口 Demo（图形或文字区域）</p></li><li><p>加一个悬浮按钮作为交互元素，位置固定不遮挡内容</p></li></ul><blockquote><p>这个模块是网页的“高光片段”，不仅功能清晰，布局也要稳定、灵活。</p></blockquote><hr><h3>Testimonials 与 Footer 区域（Grid）</h3><ul><li><p>用户评价卡片横向排布 + 自适应响应式结构</p></li><li><p>Footer 部分结构清晰，Logo + 链接 + 联系方式合理排布</p></li></ul><blockquote><p>注意统一的间距（padding/margin）与视觉平衡，提升页面“高级感”。</p></blockquote><hr><h3>响应式技巧穿插讲解</h3><ul><li><p>所有布局均采用“移动优先”开发方式</p></li><li><p>设置断点（768px、1024px）控制布局切换</p></li><li><p>避免横向滚动条、文字挤压、元素错位等常见错误</p></li></ul><hr><p>完成这节课，你将能熟练运用 Flex 和 Grid 两大排布神器，把之前搭好的结构“排得漂亮、看得舒服、改得方便”。你的 CareerMate 网页也将真正从“搭起来”进入“设计感 + 专业度兼具”的阶段。</p><blockquote><p>💬 一句话总结：布局学得好，页面不会“乱跑”。</p></blockquote>",
          "_id": "691af0131e1fa03b57b89ee9"
        },
        {
          "code": "L119",
          "title": "React起步：从零创建你的第一个前端应用&SOLID",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691c3da683c15bc97842e7cb"
        },
        {
          "code": "L120",
          "title": "登录界面开发：打造你的第一个可交互前端系统",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691c3de683c15bc97842f1f1"
        },
        {
          "code": "L121",
          "title": "注册界面开发：组件切换与复用逻辑",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691c451483c15bc9784488b5"
        },
        {
          "code": "L122",
          "title": "表单验证与用户体验优化",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691c455283c15bc978449220"
        },
        {
          "code": "L123",
          "title": "前端生产部署：S3 + CloudFront 静态托管",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691c45ac83c15bc9784499b2"
        },
        {
          "code": "L124",
          "title": "初识后端世界：Express 与 RESTful API 概念",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691d669983c15bc9785e3944"
        },
        {
          "code": "L125",
          "title": "连接数据库：让CareerMate的数据真正存起来",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691d66c783c15bc9785e3edf"
        },
        {
          "code": "L126",
          "title": "注册API开发：从前端输入到数据库存储,登录API开发：实现可验证的用户身份系统",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691d671883c15bc9785e42a6"
        },
        {
          "code": "L127",
          "title": "用户认证与权限保护：安全地管理用户状态",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "691d673883c15bc9785e43d6"
        },
        {
          "code": "L128",
          "title": "用户Dashboard设计与信息展示",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920340783c15bc97894f71c"
        },
        {
          "code": "L129",
          "title": "用户信息编辑与更新API",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920342783c15bc9789503ad"
        },
        {
          "code": "L130",
          "title": "删除与安全：实现账号删除功能",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69e329759f9cc30e74197964"
        },
        {
          "code": "L131",
          "title": "文件上传与头像管理功能",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69e329759f9cc30e7419796e"
        },
        {
          "code": "L132",
          "title": "AWS入门：从本地到云端的后端部署",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920347a83c15bc978951a0d"
        },
        {
          "code": "L133",
          "title": "全栈项目云端整合与测试",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920349283c15bc978951ff7"
        },
        {
          "code": "L134",
          "title": "AI模块导入与OpenAI API初体验 & Prompt Engineering：让AI更懂你",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "692034b683c15bc978952a69"
        },
        {
          "code": "L135",
          "title": "前端聊天UI设计与Streaming显示",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "692034cd83c15bc978952f76"
        },
        {
          "code": "L136",
          "title": "引入记忆与上下文：打造有思考的AI",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "692034e683c15bc9789534af"
        },
        {
          "code": "L137",
          "title": "Vector Database与RAG检索增强",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "692034fe83c15bc9789539ac"
        },
        {
          "code": "L138",
          "title": "从项目到产品：生产思维与上线规划",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920351b83c15bc978953f4f"
        },
        {
          "code": "L139",
          "title": "安全与稳定性：保护你的AI服务",
          "type": "Lesson",
          "isLive": false,
          "duration": 150,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920353383c15bc9789545d7"
        },
        {
          "code": "L140",
          "title": "性能与体验：优化AI响应速度",
          "type": "Lesson",
          "isLive": false,
          "duration": 150,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920354f83c15bc978954b29"
        },
        {
          "code": "L141",
          "title": "项目回顾与上线验收",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6920356d83c15bc978955231"
        },
        {
          "code": "L142",
          "title": "Tutorial (Git)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6927c369fd4d3eb9181cbe39"
        },
        {
          "code": "L143",
          "title": "HTML基础测试",
          "type": "Quiz",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>This quiz is designed to check your fundamental understanding of HTML before we move into CSS, JavaScript, and project development.<br>It covers core concepts such as document structure, common tags, semantic elements, attributes, lists, forms, and basic HTML rules.</p><p></p>",
          "_id": "692bcfc778a923b9d419cb0e"
        },
        {
          "code": "L144",
          "title": "Build Weather App",
          "type": "Lab",
          "isLive": false,
          "duration": 60,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "692c08f1200cd2c7adda19e6"
        },
        {
          "code": "L145",
          "title": "Tutorial (html, css, js)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "<p>在完成了前几节基础课程之后，你已经动手搭建了 CareerMate AI 的基础页面结构、样式和交互功能。这次 Tutorial 是一个“集中答疑 + 老师帮你看代码”的环节，帮助你：</p><ul><li><p>解决你在 HTML / CSS / JS 实战中遇到的技术卡点</p></li><li><p>帮你Review代码，优化你的结构与写法</p></li><li><p>通过对比其他同学的问题，拓展思路、少走弯路</p></li></ul><p>这堂课不会讲新知识点，而是由老师现场解答你提交的问题，并手把手分析你写的代码。欢迎带着“具体问题 + 具体代码”来提问！</p>",
          "_id": "692d46920c0e8cfa69b20663"
        },
        {
          "code": "L146",
          "title": "Github Page: Static Website Deployment",
          "type": "Roadmap",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "693f5574ae10f7af22f2ba69"
        },
        {
          "code": "L147",
          "title": "Vibe Coding",
          "type": "Lesson",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69411b72bc0df65b189276f1"
        },
        {
          "code": "L148",
          "title": "AI 模型对比参考",
          "type": "Information",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "696f1780120fcc1591163322"
        },
        {
          "code": "L149",
          "title": "Tutorial (React)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "697aef3dc8f1f94b64764f4b"
        },
        {
          "code": "L150",
          "title": "Tutorial (Node)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6982e47d7711f8c9cc8d670e"
        },
        {
          "code": "L151",
          "title": "Tutorial (React & Node)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "698950de69b2be043c1f5745"
        },
        {
          "code": "L152",
          "title": "页面路由和 React Context",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69894af37b20036344bc1e53"
        },
        {
          "code": "L153",
          "title": "用户注册和登陆，调用后端 API 并保存状态",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69894b427b20036344bc3d30"
        },
        {
          "code": "L154",
          "title": "CI/CD, 静态代码检查和单元测试",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69894b907b20036344bc4f50"
        },
        {
          "code": "L155",
          "title": "用户 Dashboard 页面开发: React 哲学训练",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69894d7d69b2be043c1b942a"
        },
        {
          "code": "L156",
          "title": "用户 Dashboard 页面开发: useEffect 获取 API 数据",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69894dc169b2be043c1bde2f"
        },
        {
          "code": "L157",
          "title": "前端产品上线，控制环境变量",
          "type": "Lesson",
          "isLive": false,
          "duration": 180,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "69894ea369b2be043c1cd3f5"
        },
        {
          "code": "L158",
          "title": "Tutorial (React & Node)",
          "type": "Tutorial",
          "isLive": false,
          "duration": 120,
          "steps": [],
          "labs": [],
          "learns": [],
          "description": "",
          "_id": "6982e70c7711f8c9cc8ddcf1"
        }
      ]
    }
  ],
  "program": {
    "_id": "6982e2367711f8c9cc8cfbff",
    "slug": "ai-engineer-全栈项目班30期",
    "name": "AI Engineer 全栈项目班30期",
    "programPhase": 30,
    "commenceCourseDate": "2026-04-12T00:00:00.000Z",
    "completeDate": "2026-07-29T00:00:00.000Z",
    "cohortStatus": "",
    "tuition": 5900,
    "promoTuition": 5360,
    "earlyBirdDueDate": "2026-04-05T00:00:00.000Z",
    "studentCount": 2
  },
  "programs": [
    {
      "_id": "6982e2367711f8c9cc8cfbff",
      "slug": "ai-engineer-全栈项目班30期",
      "name": "AI Engineer 全栈项目班30期",
      "programPhase": 30,
      "commenceCourseDate": "2026-04-12T00:00:00.000Z",
      "completeDate": "2026-07-29T00:00:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2026-04-05T00:00:00.000Z",
      "studentCount": 2
    },
    {
      "_id": "699e5cff66bd6c9af80ac5dc",
      "slug": "ai-engineer-全栈项目班29期-英文班",
      "name": "AI Engineer 全栈项目班29期（英文班）",
      "programPhase": 29,
      "commenceCourseDate": "2026-03-29T00:00:00.000Z",
      "completeDate": "",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2026-03-22T00:00:00.000Z",
      "studentCount": 19
    },
    {
      "_id": "68590ca7e676e200f4a2cbf5",
      "slug": "ai-web全栈班28期ai-engineer方向",
      "name": "AI Web全栈班28期AI Engineer方向",
      "programPhase": 28,
      "commenceCourseDate": "2025-11-30T00:00:00.000Z",
      "completeDate": "2026-04-05T00:00:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2025-11-23T00:00:00.000Z",
      "studentCount": 19
    },
    {
      "_id": "68429846c551510013b33361",
      "slug": "ai-web-27-net",
      "name": "AI Web全栈班27期.NET方向",
      "programPhase": 27,
      "commenceCourseDate": "2025-08-03T09:30:00.000Z",
      "completeDate": "2025-12-30T09:30:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2025-07-27T09:30:00.000Z",
      "studentCount": 3
    },
    {
      "_id": "6800b5d87f3232008c946e7c",
      "slug": "ai-web-27-node-js",
      "name": "AI Web全栈班27期Node.js方向",
      "programPhase": 27,
      "commenceCourseDate": "2025-08-03T08:05:56.000Z",
      "completeDate": "2025-12-30T08:03:36.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2025-07-27T08:03:36.000Z",
      "studentCount": 0
    },
    {
      "_id": "67244bd6ea33cf003687af94",
      "slug": "ai-web-26-net",
      "name": "AI Web全栈班26期.NET方向",
      "programPhase": 26,
      "commenceCourseDate": "2025-04-01T08:30:00.000Z",
      "completeDate": "2025-07-20T08:30:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2025-03-16T08:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "672448ecea33cf003687af93",
      "slug": "web-25-nodejs-ai",
      "name": "Web全栈班25期暑假特别班（NodeJS+AI）",
      "programPhase": 25,
      "commenceCourseDate": "2024-12-17T08:30:00.000Z",
      "completeDate": "2025-04-06T08:30:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2024-12-17T08:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "65efbf8ca66528006770d4dc",
      "slug": "web-24-nodejs-1",
      "name": "Web全栈班24期NodeJS方向",
      "programPhase": 24,
      "commenceCourseDate": "2024-10-27T08:30:00.000Z",
      "completeDate": "2025-02-09T08:30:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2024-10-13T08:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "6638754167e6a60037a163ee",
      "slug": "web-23-net",
      "name": "Web全栈班23期.NET方向",
      "programPhase": 23,
      "commenceCourseDate": "2024-08-04T09:30:00.000Z",
      "completeDate": "2024-11-16T09:30:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2024-07-21T09:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "65ae17ae32b918002c416076",
      "slug": "web-22-nodejs",
      "name": "Web全栈班22期 NodeJS方向",
      "programPhase": 22,
      "commenceCourseDate": "2024-04-07T09:30:00.000Z",
      "completeDate": "2024-07-15T09:30:00.000Z",
      "cohortStatus": "",
      "tuition": 5900,
      "promoTuition": 5360,
      "earlyBirdDueDate": "2024-04-07T09:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "64fad71929aa9f001324cee8",
      "slug": "web-21-nodejs",
      "name": "Web全栈班21期 NodeJS方向",
      "programPhase": 21,
      "commenceCourseDate": "2023-12-03T09:30:00.000Z",
      "completeDate": "2024-04-03T09:30:00.000Z",
      "cohortStatus": "",
      "tuition": 6900,
      "promoTuition": 5900,
      "earlyBirdDueDate": "2023-12-03T09:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "646c406ba3904380af7c9330",
      "slug": "web-20-nodejs",
      "name": "Web全栈班20期 NodeJS方向",
      "programPhase": 20,
      "commenceCourseDate": "2023-07-30T09:30:00.000Z",
      "completeDate": "2023-12-03T09:30:00.000Z",
      "cohortStatus": "",
      "tuition": 6900,
      "promoTuition": 5900,
      "earlyBirdDueDate": "2023-07-30T09:30:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "646c4142a3904380af7c9331",
      "slug": "web-20-java",
      "name": "Web全栈班20期 Java方向",
      "programPhase": 20,
      "commenceCourseDate": "2023-07-30T09:30:00.000Z",
      "completeDate": "2023-12-03T09:30:00.000Z",
      "cohortStatus": "",
      "tuition": 6900,
      "promoTuition": 5900,
      "earlyBirdDueDate": "2023-07-30T09:30:00.000Z",
      "studentCount": 1
    },
    {
      "_id": "63d364a17bba23ff32e9554b",
      "slug": "web-19-nodejs",
      "name": "Web全栈班19期 NodeJS方向",
      "programPhase": 19,
      "commenceCourseDate": "2023-03-19T08:00:00.000Z",
      "completeDate": "2023-06-30T05:44:01.000Z",
      "cohortStatus": "",
      "tuition": 6600,
      "promoTuition": 5900,
      "earlyBirdDueDate": "2023-03-19T05:44:01.000Z",
      "studentCount": 0
    },
    {
      "_id": "63293cf52734a87ca079a6d5",
      "slug": "web-18-java",
      "name": "Web全栈班18期 Java方向",
      "programPhase": 18,
      "commenceCourseDate": "2022-11-27T09:00:00.000Z",
      "completeDate": "2023-03-31T04:09:25.000Z",
      "cohortStatus": "",
      "tuition": 6600,
      "promoTuition": 0,
      "earlyBirdDueDate": "2022-11-18T04:09:25.000Z",
      "studentCount": 0
    },
    {
      "_id": "63293bff2734a87ca079a6d4",
      "slug": "web-18-nodejs",
      "name": "Web全栈班18期 NodeJS方向",
      "programPhase": 18,
      "commenceCourseDate": "2022-11-27T04:05:50.000Z",
      "completeDate": "2023-03-31T04:05:19.000Z",
      "cohortStatus": "",
      "tuition": 6600,
      "promoTuition": 0,
      "earlyBirdDueDate": "2022-11-18T04:05:19.000Z",
      "studentCount": 0
    },
    {
      "_id": "627c48dddaca15867a44ecea",
      "slug": "web-17-java",
      "name": "Web全栈班17期·Java方向",
      "programPhase": 17,
      "commenceCourseDate": "2022-07-31T09:00:00.000Z",
      "completeDate": "2022-11-30T12:00:00.000Z",
      "cohortStatus": "",
      "tuition": 6600,
      "promoTuition": 0,
      "earlyBirdDueDate": "2022-07-23T14:00:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "627c4a32daca15867a44eceb",
      "slug": "web-17-nodejs",
      "name": "Web全栈班17期 NodeJS方向",
      "programPhase": 17,
      "commenceCourseDate": "2022-07-31T09:00:00.000Z",
      "completeDate": "2022-11-30T12:00:00.000Z",
      "cohortStatus": "",
      "tuition": 6600,
      "promoTuition": 0,
      "earlyBirdDueDate": "2022-07-23T14:00:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "61e8e92f57f9a4d05d5d80fb",
      "slug": "web-16-nodejs",
      "name": "Web全栈班16期 NodeJS方向",
      "programPhase": 16,
      "commenceCourseDate": "2022-03-20T04:46:39.000Z",
      "completeDate": "2022-06-19T04:46:39.000Z",
      "cohortStatus": "",
      "tuition": 6600,
      "promoTuition": 0,
      "earlyBirdDueDate": "2022-03-13T04:46:39.000Z",
      "studentCount": 0
    },
    {
      "_id": "6153d5391a23b9885575c7f1",
      "slug": "web-15-java",
      "name": "Web全栈班15期·Java方向",
      "programPhase": 15,
      "commenceCourseDate": "2021-12-04T02:53:45.000Z",
      "completeDate": "2022-03-31T02:53:45.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2021-11-28T02:53:45.000Z",
      "studentCount": 0
    },
    {
      "_id": "6153d4941a23b9885575c7f0",
      "slug": "web-15-nodejs",
      "name": "Web全栈班15期·Nodejs方向",
      "programPhase": 15,
      "commenceCourseDate": "2021-12-04T02:51:00.000Z",
      "completeDate": "2022-03-31T02:51:00.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2021-11-28T02:51:00.000Z",
      "studentCount": 0
    },
    {
      "_id": "612331fecf0a40cf192b8f63",
      "slug": "web-14-5",
      "name": "Web全栈班第14.5期",
      "programPhase": 14.5,
      "commenceCourseDate": "2021-09-25T23:32:04.000Z",
      "completeDate": "2021-11-29T23:32:04.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2021-09-24T23:32:05.000Z",
      "studentCount": 0
    },
    {
      "_id": "60ab30e1c9ec202331ed03a8",
      "slug": "web-14-nodejs",
      "name": "Web全栈班14期·Nodejs方向",
      "programPhase": 14,
      "commenceCourseDate": "2021-07-17T04:51:45.000Z",
      "completeDate": "2021-12-01T04:51:45.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2021-07-16T04:51:45.000Z",
      "studentCount": 0
    },
    {
      "_id": "60e55cba53480b05fd98f949",
      "slug": "web-14-java",
      "name": "Web全栈班14期·Java方向",
      "programPhase": 14,
      "commenceCourseDate": "2021-07-07T07:50:18.000Z",
      "completeDate": "2021-12-01T07:50:18.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2021-07-07T07:50:18.000Z",
      "studentCount": 0
    },
    {
      "_id": "5ffcff6a7e3761127306835f",
      "slug": "web-13-java-and-nodejs",
      "name": "Web全栈班13期·Java&Nodejs方向",
      "programPhase": 13,
      "commenceCourseDate": "2021-03-27T01:46:18.000Z",
      "completeDate": "2021-08-31T01:46:18.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2021-03-20T01:46:18.000Z",
      "studentCount": 30
    },
    {
      "_id": "5f4d8f40b6a5ba72344d5dc6",
      "slug": "web-12-java",
      "name": "Web全栈班12期·Java方向",
      "programPhase": 12,
      "commenceCourseDate": "2020-12-06T00:01:04.000Z",
      "completeDate": "2021-05-10T00:01:04.000Z",
      "cohortStatus": "",
      "tuition": 5100,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-12-06T00:01:04.000Z",
      "studentCount": 30
    },
    {
      "_id": "5f4d8f01b6a5ba72344d5dc5",
      "slug": "web-12-nodejs",
      "name": "Web全栈班12期·Nodejs方向",
      "programPhase": 12,
      "commenceCourseDate": "2020-12-06T00:00:01.000Z",
      "completeDate": "2021-05-11T00:00:01.000Z",
      "cohortStatus": "",
      "tuition": 5800,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-12-06T00:00:01.000Z",
      "studentCount": 0
    },
    {
      "_id": "5e93d6e97962836b4bb42774",
      "slug": "web-nodejs-and-react-11",
      "name": "Web全栈班Nodejs&React第11期",
      "programPhase": 11,
      "commenceCourseDate": "2020-08-29T03:05:13.000Z",
      "completeDate": "2021-02-28T03:05:13.000Z",
      "cohortStatus": "",
      "tuition": 5500,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-08-31T03:05:13.000Z",
      "studentCount": 14
    },
    {
      "_id": "5e93d7b47962836b4bb42775",
      "slug": "web-10-5",
      "name": "Web全栈班第10.5期",
      "programPhase": 10,
      "commenceCourseDate": "2020-08-12T13:59:59.000Z",
      "completeDate": "2021-02-20T03:08:36.000Z",
      "cohortStatus": "",
      "tuition": 5500,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-09-05T03:08:36.000Z",
      "studentCount": 0
    },
    {
      "_id": "5e93d82d7962836b4bb42776",
      "slug": "web-java-and-react-11",
      "name": "Web全栈班Java&React第11期",
      "programPhase": 11,
      "commenceCourseDate": "2020-08-12T03:10:37.000Z",
      "completeDate": "2021-06-03T03:10:37.000Z",
      "cohortStatus": "",
      "tuition": 5500,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-08-12T03:10:37.000Z",
      "studentCount": 0
    },
    {
      "_id": "5e167a9b5486ff6f40292712",
      "slug": "web-java-and-react-10",
      "name": "墨尔本Web全栈班Java&React第10期",
      "programPhase": 10,
      "commenceCourseDate": "2020-04-01T00:58:03.000Z",
      "completeDate": "2020-06-22T00:58:03.000Z",
      "cohortStatus": "",
      "tuition": 5400,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-02-17T00:58:03.000Z",
      "studentCount": 0
    },
    {
      "_id": "5e09563ce2e1404966a34594",
      "slug": "web-16",
      "name": "布里斯班Web全栈班第10期",
      "programPhase": 10,
      "commenceCourseDate": "2020-03-31T01:43:24.000Z",
      "completeDate": "2020-06-30T01:43:24.000Z",
      "cohortStatus": "",
      "tuition": 5500,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-03-17T01:43:24.000Z",
      "studentCount": 0
    },
    {
      "_id": "5e0d5a37e2e1404966a345c1",
      "slug": "web-17",
      "name": "悉尼Web全栈第10期",
      "programPhase": 10,
      "commenceCourseDate": "2020-03-28T02:49:27.000Z",
      "completeDate": "2020-06-30T03:49:27.000Z",
      "cohortStatus": "",
      "tuition": 5500,
      "promoTuition": 0,
      "earlyBirdDueDate": "2020-03-01T02:49:27.000Z",
      "studentCount": 0
    }
  ],
  "generatedFrom": "training-outlines"
}