├── .eslintrc.json ├── .gitattributes ├── .github └── workflows │ └── nextjs.yml ├── .gitignore ├── README.md ├── ads.txt ├── app ├── GoogleAnalytics.tsx ├── [language] │ ├── ClientSideTutorialTree.tsx │ ├── LanguageLayoutClient.tsx │ ├── LanguageLayoutServer.tsx │ ├── LanguageProvider.tsx │ ├── [...tutorial] │ │ └── page.tsx │ ├── [tutorial] │ │ └── page.tsx │ ├── layout.tsx │ ├── page.tsx │ └── tutorialUtils.ts ├── about │ └── page.tsx ├── api │ ├── available-languages │ │ └── route.ts │ ├── chat │ │ └── route.ts │ ├── language-layout │ │ └── route.ts │ ├── tutorial-content │ │ └── route.ts │ ├── tutorial-structure │ │ └── route.ts │ └── tutorials │ │ └── route.ts ├── components │ ├── AIChatHistory.tsx │ ├── AIChatWidget.tsx │ ├── ChatWindow.tsx │ ├── ErrorBoundary.tsx │ ├── SEO.tsx │ └── TutorialCard.tsx ├── contact │ └── page.tsx ├── favicon.ico ├── fonts │ ├── GeistMonoVF.woff │ └── GeistVF.woff ├── globals.css ├── layout.js ├── layout.tsx ├── page.tsx ├── privacy │ └── page.tsx ├── sitemap.ts ├── tutorials │ └── [lang] │ │ └── [slug] │ │ └── page.tsx └── types.ts ├── components.json ├── components ├── AIChatWidget.module.css ├── AIChatWidget.tsx ├── AdSense.tsx ├── ClientTranslation.tsx ├── GoogleAds.tsx ├── Header.js ├── LanguageSelector.tsx ├── Layout.js ├── TutorialSidebar.tsx ├── tutorial-layout.tsx └── ui │ ├── button.tsx │ ├── collapsible.tsx │ ├── dropdown-menu.tsx │ ├── scroll-area.tsx │ └── sheet.tsx ├── config └── languageOrder.ts ├── lib ├── tutorials.ts ├── useTranslation.ts └── utils.ts ├── next.config.js ├── next.config.mjs ├── package-lock.json ├── package.json ├── pages └── _app.js ├── postcss.config.mjs ├── process.env.NODE_ENV ├── public ├── chat.png ├── favicon.ico └── images │ ├── chat.png │ ├── default-og-image.jpg.png │ ├── default-twitter-image.jpg.png │ ├── logo.png │ └── logo_副本3.png ├── renamefold.js ├── robots.txt ├── styles └── AIChatWidget.css ├── tailwind.config.js ├── tailwind.config.ts ├── tsconfig.json └── tutorials ├── Angular ├── 001. 基础入门 │ ├── 001_Angular.md │ ├── 002_TypeScript.md │ ├── 003_Node.js npm Angular CLI.md │ ├── 004_Angular.md │ └── 005_Angular.md ├── 02. 组件基础 │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_article.md │ ├── 009_Vue.js.md │ └── 010_(Input Output).md ├── 03. 指令 │ ├── 011_AngularngIf ngFor ngSwitch.md │ ├── 012_CSS.md │ ├── 013_Angular.md │ └── 014_article.md ├── 04. 服务和依赖注入 │ ├── 015_article.md │ ├── 016_article.md │ ├── 017_-.md │ └── 018_article.md ├── 05. 路由 │ ├── 019_-.md │ ├── 020_React.md │ ├── 021_React.md │ ├── 022_Angular.md │ └── 023_article.md ├── 06. 表单处理 │ ├── 024_- Angular.md │ ├── 025_article.md │ ├── 026_article.md │ ├── 027_article.md │ └── 028_article.md ├── 07. HTTP 客户端 │ ├── 029_HttpClientNode.jsHTTP.md │ ├── 030_HTTP.md │ ├── 031_Java.md │ ├── 032_Python.md │ └── 033_Web.md ├── 08. RxJS 和响应式编程 │ ├── 034_Understanding Observables and Observers in Programming.md │ ├── 035_article.md │ ├── 036_Understanding Subject Types in Programming.md │ ├── 037_article.md │ └── 038_RxJS.md ├── 09. 模块化开发 │ ├── 039_NgModule - Angular.md │ ├── 040_article.md │ ├── 041_article.md │ ├── 042_article.md │ └── 043_article.md ├── 10. 组件进阶 │ ├── 044_article.md │ ├── 045_Vue.js.md │ ├── 046_-.md │ ├── 047_Shadow DOMWeb.md │ └── 048_article.md ├── 11. 变更检测 │ ├── 049_article.md │ ├── 050_Angular OnPush.md │ ├── 051_- Angular.md │ └── 052_article.md ├── 12. 动画 │ ├── 053_-.md │ ├── 054_article.md │ ├── 055_Web.md │ └── 056_article.md ├── 13. 国际化 (i18n) │ ├── 057_article.md │ ├── 058_-.md │ ├── 059_article.md │ └── 060_AOT.md ├── 14. 测试 │ ├── 061_JasmineKarma.md │ ├── 062_article.md │ ├── 063_article.md │ └── 064_(Protractor).md ├── 15. Angular Universal (SSR) │ ├── 065_article.md │ ├── 066_SEO.md │ ├── 067_SEO.md │ └── 068_article.md ├── 16. PWA 和离线功能 │ ├── 069_Service WorkerWeb.md │ ├── 070_WebApp Shell.md │ ├── 071_article.md │ └── 072_article.md ├── 17. 状态管理 │ ├── 073_NgRx.md │ ├── 074_article.md │ ├── 075_(Effects).md │ └── 076_NGXS Akita.md ├── 18. 性能优化 │ ├── 077_AOT.md │ ├── 078_(Tree Shaking).md │ ├── 079_article.md │ ├── 080_article.md │ └── 081_article.md ├── 19. 安全性 │ ├── 082_(XSS).md │ ├── 083_CSRF.md │ ├── 084_(CSP).md │ └── 085_Web.md ├── 20. 高级主题 │ ├── 086_article.md │ ├── 087_Angular.md │ ├── 088_WebAssembly.md │ └── 089_Angular ElementsWeb.md ├── 21. DevOps 和部署 │ ├── 090_CICD.md │ ├── 091_Docker.md │ ├── 092_Firebase Heroku.md │ └── 093_article.md ├── 22. 项目实战 │ ├── 094_article.md │ ├── 095_article.md │ └── 096_Web.md ├── 23. Angular 生态系统 │ ├── 097_UIMaterialPrimeNG.md │ ├── 098_IDE.md │ ├── 099_Angular.md │ └── 100_article.md └── Angular课程大纲.md ├── Bootstrap ├── 01. 基础入门 │ ├── 001_Bootstrap.md │ ├── 002_Bootstrap.md │ ├── 003_-.md │ ├── 004_article.md │ └── 005_article.md ├── 02. 排版和文本 │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_CSS.md │ ├── 009_article.md │ └── 010_HTMLCSS.md ├── 03. 组件 │ ├── 011_article.md │ ├── 012_article.md │ ├── 013_article.md │ ├── 014_Web.md │ └── 015_-.md ├── 04. 布局组件 │ ├── 016_Python.md │ ├── 017_article.md │ ├── 018_Flexbox.md │ ├── 019_article.md │ └── 020_CSS.md ├── 05. 表单 │ ├── 021_article.md │ ├── 022_article.md │ ├── 023_article.md │ ├── 024_article.md │ └── 025_-.md ├── 06. 实用工具类 │ ├── 026_CSS.md │ ├── 027_article.md │ ├── 028_CSS.md │ ├── 029_CSS.md │ └── 030_CSS.md ├── 07. JavaScript 组件 │ ├── 031_article.md │ ├── 032_article.md │ ├── 033_article.md │ ├── 034_article.md │ └── 035_article.md ├── 08. 自定义 Bootstrap │ ├── 036_Sass -.md │ ├── 037_article.md │ ├── 038_CSS.md │ ├── 039_- React.md │ └── 040_CSS.md ├── 09. 响应式设计进阶 │ ├── 041_article.md │ ├── 042_article.md │ ├── 043_article.md │ ├── 044_article.md │ └── 045_CSS.md ├── 10. 图标和图形 │ ├── 046_Bootstrap Icons.md │ ├── 047_Font Awesome.md │ ├── 048_SVG.md │ ├── 049_article.md │ └── 050_article.md ├── 11. 表格和数据展示 │ ├── 051_- HTMLCSS.md │ ├── 052_article.md │ ├── 053_article.md │ ├── 054_article.md │ └── 055_article.md ├── 12. 动画和过渡 │ ├── 056_CSS.md │ ├── 057_article.md │ ├── 058_article.md │ ├── 059_article.md │ └── 060_article.md ├── 13. 辅助功能和可访问性 │ ├── 061_ARIA.md │ ├── 062_article.md │ ├── 063_article.md │ ├── 064_article.md │ └── 065_article.md ├── 14. 性能优化 │ ├── 066_article.md │ ├── 067_article.md │ ├── 068_article.md │ ├── 069_CSS.md │ └── 070_article.md ├── 15. 集成第三方库 │ ├── 071_article.md │ ├── 072_article.md │ ├── 073_article.md │ ├── 074_article.md │ └── 075_article.md ├── 16. 跨浏览器兼容性 │ ├── 076_article.md │ ├── 077_Polyfills.md │ ├── 078_Web.md │ ├── 079_CSS.md │ └── 080_article.md ├── 17. 工作流和开发工具 │ ├── 081_npm.md │ ├── 082_Gulp Webpack.md │ ├── 083_GitSVN.md │ ├── 084_article.md │ └── 085_article.md ├── 18. 响应式邮件模板 │ ├── 086_article.md │ ├── 087_article.md │ ├── 088_article.md │ ├── 089_article.md │ └── 090_-.md ├── 19. 项目实战 │ ├── 091_article.md │ ├── 092_-.md │ ├── 093_article.md │ └── 094_article.md ├── 20. Bootstrap 生态系统 │ ├── 095_Bootstrap.md │ ├── 096_article.md │ ├── 097_Bootstrap.md │ └── 098_article.md └── Bootstrap课程大纲.md ├── CSS ├── 01. 基础入门 │ ├── 001_CSS.md │ ├── 002_CSS.md │ ├── 003_article.md │ ├── 004_CSS.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_CSS.md │ ├── 007_Flexbox.md │ ├── 008_CSS Grid.md │ ├── 009_article.md │ └── 010_CSS.md ├── 03. 高级特性 │ ├── 011_CSSSassLess.md │ ├── 012_CSS.md │ ├── 013_CSS ModulesCSS.md │ ├── 014_CSS-in-JS.md │ └── 015_CSS HoudiniCSS.md ├── 04. 性能优化 │ ├── 016_CSS.md │ ├── 017_CSS.md │ ├── 018_CSS.md │ ├── 019_article.md │ └── 020_article.md ├── 05. 最佳实践 │ ├── 021_CSS (BEM OOCSS).md │ ├── 022_CSSITCSSSMACSS.md │ ├── 023_article.md │ ├── 024_Web.md │ └── 025_(WCAG).md ├── 06. 工具和框架 │ ├── 026_CSS Normalize.css.md │ ├── 027_CSSBootstrapTailwind CSS.md │ ├── 028_PostCSS.md │ ├── 029_CSS-in-JSstyled-componentsEmotion.md │ └── 030_CSS.md ├── 07. 高级主题 │ ├── 031_CSS Hacks -.md │ ├── 032_CSS (CSS Variables).md │ ├── 033_CSS.md │ ├── 034_CSS.md │ └── 035_article.md ├── 08. 实战项目 │ ├── 036_article.md │ ├── 037_article.md │ ├── 038_CSS.md │ └── 039_article.md ├── 09. 工具和资源 │ ├── 040_CSS.md │ ├── 041_CSS.md │ ├── 042_CSS Sprite.md │ ├── 043_article.md │ └── 044_article.md ├── 10. 新特性和未来趋势 │ ├── 045_CSS Grid Level 2 -.md │ ├── 046_CSS.md │ ├── 047_Mastering CSS Layers A Comprehensive Guide.md │ ├── 048_Container QueriesCSS.md │ └── 049_CSS.md └── CSS课程大纲.md ├── CSharp ├── 01. 基础入门 │ ├── 001_C.md │ ├── 002_Visual Studio .NET SDK.md │ ├── 003_C (Hello World).md │ ├── 004_article.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_(OOP).md │ ├── 007_Python.md │ ├── 008_article.md │ ├── 009_Java.md │ └── 010_C.md ├── 03. 高级特性 │ ├── 011_Java.md │ ├── 012_C.md │ ├── 013_LINQ.md │ ├── 014_(asyncawait).md │ └── 015_C.md ├── 04. 内存管理和性能 │ ├── 016_article.md │ ├── 017_article.md │ ├── 018_using.md │ ├── 019_article.md │ └── 020_article.md ├── 05. 文件和数据处理 │ ├── 021_IO.md │ ├── 022_article.md │ ├── 023_ADO.NETEntity Framework.md │ ├── 024_XMLJSON.md │ └── 025_article.md ├── 06. 图形用户界面 (GUI) │ ├── 026_Windows Forms.md │ ├── 027_WPF (Windows Presentation Foundation).md │ ├── 028_XAML.md │ ├── 029_article.md │ └── 030_UI.md ├── 07. Web开发 │ ├── 031_ASP.NET Core.md │ ├── 032_MVCWeb.md │ ├── 033_ASP.NET Core Razor Pages.md │ ├── 034_Web API.md │ └── 035_Blazor.md ├── 08. 测试和调试 │ ├── 036_NUnitxUnit.md │ ├── 037_article.md │ ├── 038_article.md │ ├── 039_article.md │ └── 040_article.md ├── 09. 设计模式和最佳实践 │ ├── 041_article.md │ ├── 042_SOLID.md │ ├── 043_article.md │ ├── 044_article.md │ └── 045_article.md ├── 10. 高级主题 │ ├── 046_article.md │ ├── 047_SocketHTTP.md │ ├── 048_article.md │ ├── 049_article.md │ └── 050_article.md ├── 11. 项目实战 │ ├── 051_article.md │ ├── 052_Windows.md │ ├── 053_Web.md │ └── 054_(Xamarin).md ├── 12. 工具和资源 │ ├── 055_NuGet.md │ ├── 056_Git.md │ ├── 057_CICD.md │ └── 058_article.md ├── 13. 最新特性 │ ├── 059_C.md │ ├── 060_.NET 67.md │ └── 061_article.md └── C#课程大纲.md ├── Cpp ├── 01. 基础入门 │ ├── 001_C.md │ ├── 002_article.md │ ├── 003_C (Hello World).md │ ├── 004_article.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_if-else switch for while.md │ ├── 008_article.md │ ├── 009_C.md │ └── 010_C.md ├── 03. 面向对象编程 │ ├── 011_Python.md │ ├── 012_article.md │ ├── 013_C.md │ ├── 014_C.md │ └── 015_C.md ├── 04. 高级特性 │ ├── 016_article.md │ ├── 017_Python.md │ ├── 018_C.md │ ├── 019_C.md │ └── 020_JavaLambda.md ├── 05. 标准库 │ ├── 021_(iostream).md │ ├── 022_Cvector list map.md │ ├── 023_article.md │ ├── 024_article.md │ └── 025_article.md ├── 06. 内存管理 │ ├── 026_(new delete).md │ ├── 027_-.md │ ├── 028_(unique_ptr shared_ptr weak_ptr).md │ └── 029_article.md ├── 07. 现代C++特性 │ ├── 030_C11141720.md │ ├── 031_C.md │ ├── 032_Cautodecltype.md │ ├── 033_Cfor.md │ └── 034_Python.md ├── 08. 设计模式和最佳实践 │ ├── 035_C.md │ ├── 036_SOLID.md │ ├── 037_article.md │ └── 038_Web.md ├── 09. 项目实战 │ ├── 039_article.md │ ├── 040_(GUI).md │ └── 041_article.md ├── 10. 工具和资源 │ ├── 042_Git.md │ ├── 043_(CMake).md │ ├── 044_Google Test.md │ ├── 045_(Doxygen).md │ └── 046_-.md ├── 11. 高级主题 │ ├── 047_article.md │ ├── 048_CCLI.md │ ├── 049_article.md │ └── 050_C.md └── C++课程大纲.md ├── Django ├── 01. 基础入门 │ ├── 001_Django.md │ ├── 002_article.md │ ├── 003_-.md │ ├── 004_Understanding MVT (Model-View-Template) Architecture.md │ └── 005_Django.md ├── 02. 模型和数据库 │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_Django.md │ ├── 009_article.md │ └── 010_- Django.md ├── 03. 视图和 URL 配置 │ ├── 011_Django.md │ ├── 012_URL.md │ ├── 013_article.md │ ├── 014_Django.md │ └── 015_Web.md ├── 04. 模板系统 │ ├── 016_article.md │ ├── 017_Django.md │ ├── 018_Django.md │ ├── 019_- Django.md │ └── 020_article.md ├── 05. 表单处理 │ ├── 021_Django Form.md │ ├── 022_article.md │ ├── 023_DjangoModelForm.md │ ├── 024_Django (Formsets).md │ └── 025_article.md ├── 06. 认证和授权 │ ├── 026_article.md │ ├── 027_- Django.md │ ├── 028_Linux.md │ ├── 029_article.md │ └── 030_-.md ├── 07. Admin 站点 │ ├── 031_Admin -.md │ ├── 032_article.md │ ├── 033_Admin -.md │ ├── 034_Admin.md │ └── 035_article.md ├── 08. 会话和 Cookie │ ├── 036_article.md │ ├── 037_Cookie.md │ ├── 038_article.md │ └── 039_- JavaScriptHTML.md ├── 09. 缓存机制 │ ├── 040_article.md │ ├── 041_Web.md │ ├── 042_article.md │ ├── 043_API.md │ └── 044_article.md ├── 10. REST API 开发 │ ├── 045_Django REST framework.md │ ├── 046_Python.md │ ├── 047_DjangoWeb.md │ ├── 048_article.md │ └── 049_API.md ├── 11. 测试 │ ├── 050_article.md │ ├── 051_Python.md │ ├── 052_article.md │ ├── 053_article.md │ └── 054_article.md ├── 12. 安全性 │ ├── 055_CSRF -.md │ ├── 056_XSS Web.md │ ├── 057_SQL.md │ ├── 058_Web.md │ └── 059_article.md ├── 13. 部署 │ ├── 060_article.md │ ├── 061_article.md │ ├── 062_Gunicorn Nginx.md │ ├── 063_Docker.md │ └── 064_CICD.md ├── 14. 性能优化 │ ├── 065_article.md │ ├── 066_article.md │ ├── 067_Web.md │ ├── 068_(Celery).md │ └── 069_article.md ├── 15. 高级主题 │ ├── 070_- Django.md │ ├── 071_article.md │ ├── 072_article.md │ ├── 073_article.md │ └── 074_(Haystack).md ├── 16. 第三方集成 │ ├── 075_article.md │ ├── 076_article.md │ ├── 077_article.md │ ├── 078_(AWS S3).md │ └── 079_(Channels).md ├── 17. 项目结构和最佳实践 │ ├── 080_article.md │ ├── 081_article.md │ ├── 082_GitGitHub.md │ ├── 083_article.md │ └── 084_article.md ├── 18. Django 生态系统 │ ├── 085_article.md │ ├── 086_Django CMS.md │ ├── 087_WagtailCMS.md │ ├── 088_Django.md │ └── 089_article.md ├── 19. 项目实战 │ ├── 090_article.md │ ├── 091_article.md │ ├── 092_article.md │ └── 093_RESTful API.md └── Django课程大纲.md ├── Express.js ├── 01. 基础入门 │ ├── 001_Express.js.md │ ├── 002_Node.js npm.md │ ├── 003_Express.js.md │ ├── 004_Web.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_article.md │ ├── 009_EJSPug.md │ └── 010_Python.md ├── 03. 中间件和扩展 │ ├── 011_Web.md │ ├── 012_article.md │ ├── 013_article.md │ ├── 014_Web.md │ └── 015_article.md ├── 04. 数据库集成 │ ├── 016_MongoDB Mongoose.md │ ├── 017_SQL MySQL PostgreSQL.md │ ├── 018_Sequelize - ORM.md │ └── 019_-.md ├── 05. RESTful API 开发 │ ├── 020_RESTful.md │ ├── 021_API.md │ ├── 022_article.md │ └── 023_API (Swagger).md ├── 06. 性能优化和安全 │ ├── 024_Web.md │ ├── 025_GZIP.md │ ├── 026_article.md │ ├── 027_(CORS).md │ └── 028_article.md ├── 07. 测试和调试 │ ├── 029_MochaChaiJavaScript.md │ ├── 030_article.md │ ├── 031_article.md │ ├── 032_article.md │ └── 033_article.md ├── 08. 部署和运维 │ ├── 034_(Heroku AWS).md │ ├── 035_Docker.md │ ├── 036_PM2.md │ ├── 037_article.md │ └── 038_CICD.md ├── 09. 高级主题 │ ├── 039_WebSocket.md │ ├── 040_GraphQL Express.md │ ├── 041_article.md │ └── 042_(SSR).md ├── 10. 实战项目 │ ├── 043_article.md │ ├── 044_API.md │ └── 045_article.md ├── 11. 工具和资源 │ ├── 046_ExpressNode.js.md │ ├── 047_article.md │ ├── 048_article.md │ └── 049_article.md ├── 12. 版本更新 │ ├── 050_Express 5.x.md │ └── 051_article.md └── Express.js课程大纲.md ├── Go ├── 01. 基础入门 │ ├── 001_Go.md │ ├── 002_- GoGOPATH.md │ ├── 003_Go (Hello World).md │ ├── 004_article.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_Python.md │ ├── 007_if-else switch for.md │ ├── 008_Go.md │ ├── 009_Python(Map).md │ └── 010_Go.md ├── 03. 并发编程 │ ├── 011_GoGoroutines.md │ ├── 012_Understanding Channels in Go Programming.md │ ├── 013_SQLSelect.md │ ├── 014_MutexWaitGroup.md │ └── 015_article.md ├── 04. 包管理和模块 │ ├── 016_Python.md │ ├── 017_-.md │ ├── 018_Go Modules.md │ └── 019_article.md ├── 05. 标准库 │ ├── 020_Golang fmt.md │ ├── 021_Goioioutil.md │ ├── 022_Goos.md │ ├── 023_Go nethttp.md │ └── 024_Goencodingjson.md ├── 06. 错误处理和测试 │ ├── 025_Python.md │ ├── 026_GoPanicRecover.md │ ├── 027_article.md │ ├── 028_article.md │ └── 029_article.md ├── 07. Web 开发 │ ├── 030_HTTP.md │ ├── 031_article.md │ ├── 032_article.md │ ├── 033_RESTful API.md │ └── 034_SQLNoSQL.md ├── 08. 高级特性 │ ├── 035_Java.md │ ├── 036_Gounsafe.md │ ├── 037_CgoGoC.md │ ├── 038_article.md │ └── 039_article.md ├── 09. 工具和生态系统 │ ├── 040_Go.md │ ├── 041_linting.md │ ├── 042_article.md │ └── 043_article.md ├── 10. 最佳实践 │ ├── 044_article.md │ ├── 045_article.md │ ├── 046_article.md │ └── 047_article.md ├── 11. 部署和运维 │ ├── 048_article.md │ ├── 049_Docker.md │ ├── 050_CICD.md │ └── 051_article.md ├── 12. 实战项目 │ ├── 052_article.md │ ├── 053_Web.md │ └── 054_article.md ├── 13. 高级主题 │ ├── 055_Go.md │ ├── 056_Go.md │ └── 057_Go.md ├── 14. 版本更新 │ ├── 058_Go 1.x.md │ └── 059_article.md └── Go课程大纲.md ├── HTML ├── 01. 基础入门 │ ├── 001_HTML.md │ ├── 002_article.md │ ├── 003_HTML.md │ ├── 004_HTML.md │ └── 005_HTML5.md ├── 02. 核心概念 │ ├── 006_HTML5.md │ ├── 007_article.md │ ├── 008_article.md │ ├── 009_Web.md │ └── 010_HTML.md ├── 03. 样式和布局 │ ├── 011_HTMLCSS.md │ ├── 012_HTMLCSS.md │ ├── 013_CSS.md │ ├── 014_CSS.md │ └── 015_article.md ├── 04. 高级特性 │ ├── 016_HTML5 Canvas.md │ ├── 017_SVG.md │ ├── 018_Web localStorage sessionStorage.md │ ├── 019_API.md │ └── 020_article.md ├── 05. 可访问性和 SEO │ ├── 021_ARIAWeb.md │ ├── 022_SEO.md │ ├── 023_alt.md │ ├── 024_article.md │ └── 025_article.md ├── 06. 性能优化 │ ├── 026_article.md │ ├── 027_article.md │ ├── 028_article.md │ ├── 029_article.md │ └── 030_article.md ├── 07. 集成和扩展 │ ├── 031_JavaScript.md │ ├── 032_CSS (Bootstrap Tailwind).md │ ├── 033_article.md │ └── 034_CDN.md ├── 08. 最佳实践 │ ├── 035_article.md │ ├── 036_Web.md │ ├── 037_article.md │ ├── 038_article.md │ └── 039_Git.md ├── 09. 工具和开发流程 │ ├── 040_article.md │ ├── 041_HTML.md │ ├── 042_article.md │ ├── 043_(GitHub).md │ └── 044_article.md ├── 10. 实战项目 │ ├── 045_article.md │ ├── 046_article.md │ ├── 047_article.md │ └── 048_- HTML CSS.md ├── 11. 新特性和趋势 │ ├── 049_HTML5.1 HTML5.2.md │ ├── 050_PWA( Web ).md │ ├── 051_Web Components.md │ └── 052_HTML.md ├── 12. 资源和持续学习 │ ├── 053_W3C Web.md │ ├── 054_MDN Web.md │ ├── 055_article.md │ └── 056_article.md └── HTML课程大纲.md ├── Haskell ├── 01. 基础入门 │ ├── 001_Haskell.md │ ├── 002_Haskell (GHC Stack).md │ ├── 003_Haskell.md │ ├── 004_article.md │ └── 005_GHCi.md ├── 02. 函数和类型 │ ├── 006_-.md │ ├── 007_article.md │ ├── 008_article.md │ ├── 009_article.md │ └── 010_(Typeclasses).md ├── 03. 列表和元组 │ ├── 011_-.md │ ├── 012_Python.md │ ├── 013_Python.md │ └── 014_article.md ├── 04. 高阶函数 │ ├── 015_Mastering Map Filter and Fold Functions in Functional Programming.md │ ├── 016_article.md │ ├── 017_article.md │ └── 018_Python (Lambda).md ├── 05. 递归 │ ├── 019_article.md │ ├── 020_article.md │ ├── 021_article.md │ └── 022_article.md ├── 06. 代数数据类型 │ ├── 023_article.md │ ├── 024_article.md │ ├── 025_Maybe Either.md │ └── 026_article.md ├── 07. 类型类进阶 │ ├── 027_(Eq Ord Show Read).md │ ├── 028_Python.md │ ├── 029_Python.md │ └── 030_article.md ├── 08. Monads │ ├── 031_Monad.md │ ├── 032_Understanding the Maybe Monad in Functional Programming.md │ ├── 033_Understanding the List Monad in Haskell.md │ ├── 034_Understanding the IO Monad in Functional Programming.md │ └── 035_Monad.md ├── 09. 函子和应用函子 │ ├── 036_Functor.md │ ├── 037_Applicative.md │ └── 038_article.md ├── 10. 错误处理 │ ├── 039_Python.md │ ├── 040_Either.md │ └── 041_Monad.md ├── 11. 并发和并行编程 │ ├── 042_article.md │ ├── 043_Understanding Software Transactional Memory (STM).md │ ├── 044_article.md │ └── 045_article.md ├── 12. 输入输出 │ ├── 046_IO.md │ ├── 047_article.md │ ├── 048_article.md │ └── 049_article.md ├── 13. 模块系统 │ ├── 050_- Python.md │ ├── 051_Python.md │ ├── 052_article.md │ └── 053_CabalStack.md ├── 14. 高级类型系统特性 │ ├── 054_(Type Families).md │ ├── 055_(GADTs).md │ ├── 056_article.md │ └── 057_article.md ├── 15. 测试和调试 │ ├── 058_QuickCheck.md │ ├── 059_HUnit.md │ ├── 060_article.md │ └── 061_article.md ├── 16. 设计模式和架构 │ ├── 062_article.md │ ├── 063_(DSL).md │ └── 064_article.md ├── 17. 数据处理和分析 │ ├── 065_article.md │ ├── 066_JSON CSV.md │ └── 067_article.md ├── 18. Web 开发 │ ├── 068_Yesod.md │ ├── 069_RESTful API.md │ └── 070_(Persistent).md ├── 19. 性能优化 │ ├── 071_article.md │ ├── 072_article.md │ └── 073_article.md ├── 20. 项目实战 │ ├── 074_article.md │ ├── 075_Web.md │ └── 076_article.md ├── 21. Haskell 生态系统 │ ├── 077_Hackage.md │ ├── 078_Haskell.md │ └── 079_article.md └── Haskell课程大纲.md ├── Java ├── 01. 基础入门 │ ├── 001_Java.md │ ├── 002_JDK.md │ ├── 003_Java - Java.md │ ├── 004_Python.md │ └── 005_article.md ├── 02. 控制流程 │ ├── 006_if-else switch.md │ ├── 007_for while do-while.md │ └── 008_break continue return.md ├── 03. 面向对象编程基础 │ ├── 009_Python.md │ ├── 010_Java.md │ ├── 011_article.md │ ├── 012_Python.md │ ├── 013_Java.md │ └── 014_Java.md ├── 04. Java 核心类 │ ├── 015_StringStringBuilder.md │ ├── 016_Java.md │ ├── 017_API.md │ └── 018_article.md ├── 05. 异常处理 │ ├── 019_Python.md │ ├── 020_Understanding Try-Catch-Finally in Programming.md │ ├── 021_article.md │ └── 022_article.md ├── 06. 集合框架 │ ├── 023_Java List Set Map.md │ ├── 024_JavaArrayListLinkedList.md │ ├── 025_Java HashSet TreeSet.md │ ├── 026_JavaHashMapTreeMap.md │ └── 027_-.md ├── 07. 泛型 │ ├── 028_Java.md │ ├── 029_Java.md │ ├── 030_Java.md │ └── 031_article.md ├── 08. I │ └── O 操作 │ │ ├── 032_article.md │ │ ├── 033_Java.md │ │ ├── 034_Java.md │ │ └── 035_article.md ├── 09. 多线程编程 │ ├── 036_article.md │ ├── 037_article.md │ ├── 038_article.md │ └── 039_Java.md ├── 10. Java 8+ 新特性 │ ├── 040_Lambda.md │ ├── 041_Java Stream API.md │ ├── 042_JavaOptional.md │ ├── 043_Python.md │ └── 044_Java 9.md ├── 11. 函数式编程 │ ├── 045_Java.md │ ├── 046_Java.md │ └── 047_article.md ├── 12. JDBC 数据库编程 │ ├── 048_article.md │ ├── 049_SQL.md │ ├── 050_article.md │ └── 051_article.md ├── 13. Java Web 基础 │ ├── 052_ServletJSPWeb.md │ ├── 053_Web (Tomcat).md │ └── 054_MVC.md ├── 14. Spring 框架 │ ├── 055_Spring Core.md │ ├── 056_Spring MVC.md │ ├── 057_Spring Boot.md │ └── 058_(AOP).md ├── 15. 构建工具和项目管理 │ ├── 059_Maven.md │ ├── 060_Gradle.md │ └── 061_article.md ├── 16. 测试 │ ├── 062_JUnit.md │ ├── 063_(TDD).md │ └── 064_Mock.md ├── 17. Java 虚拟机 (JVM) │ ├── 065_JVM.md │ ├── 066_Java.md │ └── 067_article.md ├── 18. 设计模式 │ ├── 068_article.md │ └── 069_(SOLID) -.md ├── 19. 高级主题 │ ├── 070_Java.md │ ├── 071_article.md │ ├── 072_Java NIOIO.md │ └── 073_article.md ├── 20. 性能优化 │ ├── 074_article.md │ ├── 075_JVM - Java.md │ └── 076_article.md ├── 21. 项目实战 │ ├── 077_article.md │ ├── 078_Web.md │ └── 079_RESTful API.md ├── 22. Java 生态系统 │ ├── 080_article.md │ ├── 081_Java.md │ └── 082_article.md └── Java课程大纲.md ├── JavaScript ├── 01. 基础入门 │ ├── 001_JavaScript.md │ ├── 002_Node.js.md │ ├── 003_article.md │ ├── 004_article.md │ └── 005_article.md ├── 02. 控制流程 │ ├── 006_if else switch.md │ ├── 007_for while do-while.md │ └── 008_(try catch throw).md ├── 03. 函数 │ ├── 009_-.md │ ├── 010_article.md │ ├── 011_JavaScript.md │ └── 012_JavaScript.md ├── 04. 数据结构 │ ├── 013_article.md │ ├── 014_JavaScript.md │ ├── 015_Map Set.md │ └── 016_JSON.md ├── 05. DOM 操作 │ ├── 017_DOM -.md │ ├── 018_JavaScript.md │ └── 019_HTML.md ├── 06. 异步编程 │ ├── 020_JavaScript.md │ ├── 021_Understanding JavaScript Promises.md │ ├── 022_JavaScriptAsyncAwait.md │ └── 023_AJAX Fetch API.md ├── 07. ES6+ 特性 │ ├── 024_JavaScript let const.md │ ├── 025_JavaScript.md │ ├── 026_JavaScript.md │ ├── 027_JavaScript.md │ └── 028_(importexport).md ├── 08. 面向对象编程 │ ├── 029_JavaScript.md │ ├── 030_Python.md │ └── 031_Java.md ├── 09. 函数式编程 │ ├── 032_- JavaScript.md │ ├── 033_Mastering Map Filter and Reduce in JavaScript.md │ ├── 034_article.md │ └── 035_article.md ├── 10. 浏览器 API │ ├── 036_localStorage sessionStorage.md │ ├── 037_Geolocation API.md │ ├── 038_Web WorkersWeb.md │ └── 039_Service WorkersWeb.md ├── 11. Node.js 基础 │ ├── 040_Node.js.md │ ├── 041_Python.md │ ├── 042_article.md │ └── 043_HTTP.md ├── 12. 前端框架 │ ├── 044_React.js.md │ ├── 045_Vue.js.md │ └── 046_Angular - Angular.md ├── 13. 构建工具和模块打包器 │ ├── 047_npm.md │ ├── 048_Webpack.md │ └── 049_Babel.md ├── 14. 测试和调试 │ ├── 050_JestJavaScript.md │ ├── 051_article.md │ └── 052_article.md ├── 15. 安全性 │ ├── 053_(XSS).md │ ├── 054_(CSRF).md │ └── 055_article.md ├── 16. 前端性能优化 │ ├── 056_article.md │ ├── 057_article.md │ └── 058_Web.md ├── 17. 现代 Web 开发 │ ├── 059_Web(PWA).md │ ├── 060_WebAssembly.md │ └── 061_GraphQL.md ├── 18. 项目实战 │ ├── 062_(SPA).md │ ├── 063_WebSockets.md │ └── 064_Web.md ├── 19. JavaScript 生态系统 │ ├── 065_article.md │ ├── 066_article.md │ └── 067_JavaScript.md ├── JavaScript课程大纲.md └── basics │ └── variables.md ├── Kotlin ├── 01. 基础入门 │ ├── 001_Kotlin.md │ ├── 002_IntelliJ IDEAAndroid Studio.md │ ├── 003_Kotlin.md │ ├── 004_article.md │ └── 005_(var val).md ├── 02. 控制流 │ ├── 006_(if when).md │ ├── 007_for while do-while.md │ └── 008_break continue return.md ├── 03. 函数和 Lambda 表达式 │ ├── 009_-.md │ ├── 010_Python.md │ ├── 011_PythonLambda.md │ ├── 012_Lambda.md │ └── 013_JavaScript.md ├── 04. 类和对象 │ ├── 014_- Python.md │ ├── 015_Java.md │ ├── 016_article.md │ ├── 017_Java.md │ ├── 018_Kotlin.md │ └── 019_article.md ├── 05. Null 安全 │ ├── 020_article.md │ ├── 021_(.).md │ ├── 022_Elvis ().md │ ├── 023_TypeScript ().md │ └── 024_article.md ├── 06. 集合 │ ├── 025_Understanding List Set and Map in Programming.md │ ├── 026_Python.md │ ├── 027_filter map reduce.md │ └── 028_Python.md ├── 07. 函数式编程 │ ├── 029_article.md │ ├── 030_article.md │ ├── 031_article.md │ └── 032_article.md ├── 08. 协程 │ ├── 033_article.md │ ├── 034_Kotlin.md │ ├── 035_article.md │ ├── 036_Java.md │ └── 037_article.md ├── 09. 泛型 │ ├── 038_article.md │ ├── 039_article.md │ ├── 040_Java.md │ └── 041_Java.md ├── 10. 委托 │ ├── 042_Kotlin.md │ ├── 043_Kotlin.md │ └── 044_LazyObservable.md ├── 11. 反射 │ ├── 045_Python.md │ ├── 046_Python.md │ ├── 047_JavaScript.md │ └── 048_JavaAPI.md ├── 12. DSL 构建 │ ├── 049_- Kotlin.md │ ├── 050_article.md │ ├── 051_C.md │ └── 052_(DSL).md ├── 13. 互操作性 │ ├── 053_Kotlin Java.md │ ├── 054_Java Kotlin.md │ ├── 055_Kotlin Java.md │ └── 056_Java.md ├── 14. Android 开发 │ ├── 057_Kotlin for Android.md │ ├── 058_Android Jetpack Kotlin.md │ ├── 059_Android.md │ └── 060_article.md ├── 15. 服务器端开发 │ ├── 061_Ktor.md │ ├── 062_Spring Boot Kotlin.md │ └── 063_Exposed.md ├── 16. 测试 │ ├── 064_JUnit 5 Kotlin.md │ ├── 065_(Mockk).md │ └── 066_article.md ├── 17. 多平台开发 │ ├── 067_Kotlin Multiplatform.md │ ├── 068_article.md │ └── 069_article.md ├── 18. 工具和生态系统 │ ├── 070_Gradle Kotlin DSL Kotlin.md │ ├── 071_Kotlin.md │ └── 072_article.md ├── 19. 设计模式 │ ├── 073_Kotlin.md │ └── 074_article.md ├── 20. 性能优化 │ ├── 075_C.md │ ├── 076_article.md │ └── 077_article.md ├── 21. 项目实战 │ ├── 078_Android.md │ ├── 079_article.md │ └── 080_article.md ├── 22. Kotlin 生态系统 │ ├── 081_JetBrains -.md │ ├── 082_Kotlin.md │ └── 083_article.md └── Kotlin课程大纲.md ├── MATLAB ├── 01. 基础入门 │ ├── 001_MATLAB.md │ ├── 002_article.md │ ├── 003_MATLAB.md │ ├── 004_Python.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_-.md │ ├── 008_article.md │ ├── 009_if-else for while.md │ └── 010_article.md ├── 03. 数据可视化 │ ├── 011_2D.md │ ├── 012_3D.md │ ├── 013_article.md │ └── 014_article.md ├── 04. 高级特性 │ ├── 015_article.md │ ├── 016_article.md │ ├── 017_article.md │ ├── 018_article.md │ └── 019_article.md ├── 05. 应用领域 │ ├── 020_article.md │ ├── 021_article.md │ ├── 022_article.md │ ├── 023_article.md │ └── 024_article.md ├── 06. 编程技巧和最佳实践 │ ├── 025_article.md │ ├── 026_article.md │ ├── 027_article.md │ └── 028_article.md ├── 07. 工具箱和扩展 │ ├── 029_Simulink.md │ ├── 030_article.md │ └── 031_article.md ├── 08. GUI 开发 │ ├── 032_GUIDE.md │ ├── 033_App Designer.md │ └── 034_article.md ├── 09. 与其他语言集成 │ ├── 035_MEX (CC).md │ ├── 036_Python.md │ └── 037_Java.md ├── 10. 实战项目 │ ├── 038_article.md │ ├── 039_article.md │ └── 040_article.md ├── 11. 工具和资源 │ ├── 041_MATLAB.md │ ├── 042_article.md │ └── 043_File Exchange.md ├── 12. 版本更新 │ ├── 044_article.md │ └── 045_article.md └── MATLAB课程大纲.md ├── MongoDB ├── 01. 基础入门 │ ├── 001_MongoDB.md │ ├── 002_article.md │ ├── 003_article.md │ └── 004_MongoDB Shell.md ├── 02. 核心概念 │ ├── 005_CRUD.md │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_article.md │ └── 009_article.md ├── 03. 数据建模和设计 │ ├── 010_article.md │ ├── 011_article.md │ ├── 012_vs.md │ └── 013_article.md ├── 04. 高级特性 │ ├── 014_MongoDB.md │ ├── 015_MongoDB.md │ ├── 016_article.md │ ├── 017_article.md │ └── 018_article.md ├── 05. 部署和运维 │ ├── 019_article.md │ ├── 020_article.md │ ├── 021_article.md │ └── 022_-.md ├── 06. 与应用程序集成 │ ├── 023_Node.js Python Java.md │ ├── 024_MongooseNode.jsODM.md │ ├── 025_article.md │ └── 026_article.md ├── 07. 云端MongoDB │ ├── 027_MongoDB Atlas.md │ └── 028_(AWS Azure GCP).md ├── 08. 最佳实践 │ ├── 029_article.md │ ├── 030_article.md │ ├── 031_article.md │ └── 032_article.md ├── 09. 高级主题 │ ├── 033_BI.md │ ├── 034_MongoDB Realm.md │ ├── 035_article.md │ └── 036_article.md ├── 10. 实战项目 │ ├── 037_article.md │ ├── 038_article.md │ └── 039_article.md ├── 11. 工具和资源 │ ├── 040_MongoDB Compass.md │ ├── 041_MongoDB Charts.md │ ├── 042_article.md │ └── 043_article.md ├── 12. 版本更新 │ ├── 044_article.md │ └── 045_article.md └── MongoDB课程大纲.md ├── Next.js ├── 01. 基础入门 │ ├── 001_Next.js.md │ ├── 002_Next.js.md │ ├── 003_Next.js.md │ ├── 004_Next.js.md │ └── 005_Next.js.md ├── 02. 核心概念 │ ├── 006_Next.js (SSR).md │ ├── 007_Next.js (SSG).md │ ├── 008_Next.js.md │ ├── 009_Next.jsgetServerSideProps getStaticProps getStaticPaths.md │ └── 010_Next.js API.md ├── 03. 组件和样式 │ ├── 011_Next.jsReact.md │ ├── 012_Next.jsCSS Modules.md │ ├── 013_Next.js Sass.md │ └── 014_Next.jsStyled-components.md ├── 04. 高级特性 │ ├── 015_Next.js.md │ ├── 016_Next.jsAppDocument.md │ ├── 017_Next.js.md │ ├── 018_Next.js.md │ ├── 019_Next.js.md │ └── 020_Next.js.md ├── 05. 部署和优化 │ ├── 021_VercelNext.js.md │ ├── 022_Next.js.md │ ├── 023_Next.js.md │ └── 024_Next.js SEO.md ├── 06. 集成和扩展 │ ├── 025_Next.jsReduxMobX.md │ ├── 026_(MongoDB PostgreSQL) - Next.js.md │ ├── 027_Next.js.md │ └── 028_JestReact Testing LibraryNext.js.md ├── 07. 最佳实践 │ ├── 029_Next.js.md │ ├── 030_Next.js.md │ ├── 031_Next.js.md │ └── 032_Next.js.md ├── 08. 高级主题 │ ├── 033_Next.js TypeScript.md │ ├── 034_Webpack - Next.js.md │ ├── 035_Next.js.md │ └── 036_Next.js.md ├── 09. 实战项目 │ ├── 037_Next.js.md │ ├── 038_Next.js.md │ └── 039_Next.js.md ├── 10. 工具和资源 │ ├── 040_Next.js CLI.md │ ├── 041_Next.js.md │ ├── 042_Next.js.md │ └── 043_Next.js.md ├── 11. 版本更新 │ ├── 044_Next.js 13.md │ └── 045_Next.js.md └── next.js课程大纲.md ├── Node.js ├── 01. 基础入门 │ ├── 001_Node.js.md │ ├── 002_(nvm).md │ ├── 003_Node.js.md │ ├── 004_CommonJS ES Modules.md │ └── 005_npm yarn.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_Promise asyncawait.md │ ├── 008_Node.js(Streams)(Buffers).md │ ├── 009_article.md │ └── 010_HTTPHTTPS.md ├── 03. Web 开发 │ ├── 011_Express.js.md │ ├── 012_Node.js.md │ ├── 013_EJSPug.md │ ├── 014_RESTful API.md │ └── 015_article.md ├── 04. 数据库集成 │ ├── 016_SQL (MySQL PostgreSQL).md │ ├── 017_NoSQL (MongoDB).md │ ├── 018_ORM ODM Sequelize Mongoose.md │ └── 019_article.md ├── 05. 高级特性 │ ├── 020_article.md │ ├── 021_article.md │ ├── 022_WebSocket.md │ ├── 023_article.md │ └── 024_article.md ├── 06. 测试和调试 │ ├── 025_JestMochaJavaScript.md │ ├── 026_article.md │ ├── 027_article.md │ └── 028_article.md ├── 07. 部署和运维 │ ├── 029_Docker.md │ ├── 030_Heroku AWS Azure.md │ ├── 031_CICD.md │ └── 032_article.md ├── 08. 安全性 │ ├── 033_article.md │ ├── 034_article.md │ ├── 035_HTTPSSSLTLS.md │ └── 036_CORS.md ├── 09. 最佳实践 │ ├── 037_article.md │ ├── 038_article.md │ ├── 039_article.md │ └── 040_Linting.md ├── 10. 高级主题 │ ├── 041_TypeScript Node.js.md │ ├── 042_GraphQL API.md │ ├── 043_article.md │ └── 044_Serverless AWS Lambda Vercel Functions.md ├── 11. 实战项目 │ ├── 045_article.md │ ├── 046_article.md │ └── 047_API.md ├── 12. 工具和资源 │ ├── 048_VS CodePostman.md │ ├── 049_article.md │ ├── 050_article.md │ └── 051_article.md ├── 13. 新特性和趋势 │ ├── 052_Node.js.md │ ├── 053_ECMAScript Node.js.md │ └── 054_DenoBun.md └── Node.js课程大纲.md ├── PHP ├── 01. 基础入门 │ ├── 001_PHP.md │ ├── 002_XAMPPWAMP.md │ ├── 003_article.md │ ├── 004_article.md │ └── 005_article.md ├── 02. 控制结构 │ ├── 006_if-else switch.md │ ├── 007_for while do-while foreach.md │ └── 008_(break continue).md ├── 03. 函数 │ ├── 009_-.md │ ├── 010_Python.md │ ├── 011_article.md │ └── 012_article.md ├── 04. 数组 │ ├── 013_article.md │ ├── 014_article.md │ └── 015_article.md ├── 05. 字符串处理 │ ├── 016_Python.md │ └── 017_article.md ├── 06. 面向对象编程 │ ├── 018_Python.md │ ├── 019_article.md │ ├── 020_Java.md │ ├── 021_C.md │ └── 022_Rust (Traits).md ├── 07. 错误处理 │ ├── 023_Python.md │ └── 024_article.md ├── 08. 文件系统操作 │ ├── 025_article.md │ ├── 026_article.md │ └── 027_article.md ├── 09. 数据库操作 │ ├── 028_MySQL.md │ ├── 029_PDO.md │ ├── 030_CRUD.md │ └── 031_SQL.md ├── 10. Web 开发基础 │ ├── 032_HTTP.md │ ├── 033_GET POST.md │ ├── 034_Session Cookie.md │ └── 035_article.md ├── 11. 安全性 │ ├── 036_article.md │ ├── 037_XSS Web.md │ ├── 038_CSRF.md │ └── 039_SQL.md ├── 12. PHP 高级特性 │ ├── 040_C.md │ ├── 041_Python.md │ ├── 042_JavaAPI.md │ └── 043_Python.md ├── 13. 现代 PHP 开发 │ ├── 044_ComposerPHP.md │ ├── 045_PSRPHP.md │ └── 046_article.md ├── 14. PHP 框架 │ ├── 047_Laravel.md │ ├── 048_Symfony.md │ └── 049_CodeIgniter.md ├── 15. RESTful API 开发 │ ├── 050_API -.md │ ├── 051_RESTful API.md │ └── 052_API.md ├── 16. 性能优化 │ ├── 053_article.md │ ├── 054_MemcachedRedis.md │ └── 055_article.md ├── 17. 测试 │ ├── 056_PHPUnit.md │ ├── 057_article.md │ └── 058_(TDD).md ├── 18. 部署和服务器 │ ├── 059_Apache.md │ ├── 060_Nginx.md │ └── 061_PHP-FPM.md ├── 19. 项目实战 │ ├── 062_article.md │ ├── 063_article.md │ └── 064_article.md ├── 20. PHP 生态系统 │ ├── 065_CMSWordPressDrupal.md │ ├── 066_PHP.md │ ├── 067_PHP.md │ └── 068_article.md └── PHP课程大纲.md ├── Perl ├── 01. 基础入门 │ ├── 001_Perl.md │ ├── 002_Perl.md │ ├── 003_Perl.md │ ├── 004_article.md │ └── 005_article.md ├── 02. 控制结构 │ ├── 006_if unless elsif else.md │ ├── 007_for foreach while until.md │ └── 008_next last redo.md ├── 03. 数据结构 │ ├── 009_article.md │ ├── 010_article.md │ ├── 011_article.md │ └── 012_article.md ├── 04. 子程序 │ ├── 013_-.md │ ├── 014_Python.md │ ├── 015_article.md │ └── 016_article.md ├── 05. 文件操作 │ ├── 017_article.md │ ├── 018_article.md │ ├── 019_article.md │ └── 020_article.md ├── 06. 正则表达式 │ ├── 021_article.md │ ├── 022_article.md │ ├── 023_article.md │ └── 024_article.md ├── 07. 模块和包 │ ├── 025_Python.md │ ├── 026_- Python.md │ ├── 027_C.md │ └── 028_CPANPerl.md ├── 08. 面向对象编程 │ ├── 029_Python.md │ ├── 030_Python.md │ ├── 031_article.md │ └── 032_Java.md ├── 09. 引用和复杂数据结构 │ ├── 033_Python.md │ ├── 034_C.md │ ├── 035_article.md │ ├── 036_article.md │ └── 037_JavaScript.md ├── 10. 特殊变量 │ ├── 038_article.md │ ├── 039_article.md │ └── 040_article.md ├── 11. 进程和系统交互 │ ├── 041_article.md │ ├── 042_article.md │ └── 043_article.md ├── 12. 网络编程 │ ├── 044_article.md │ ├── 045_-.md │ └── 046_article.md ├── 13. Web 开发 │ ├── 047_CGI.md │ ├── 048_Mojolicious Web.md │ └── 049_article.md ├── 14. 数据库编程 │ ├── 050_DBI.md │ ├── 051_SQL.md │ └── 052_article.md ├── 15. 文本处理和报告生成 │ ├── 053_article.md │ ├── 054_article.md │ └── 055_PythonPDF.md ├── 16. XML 和 JSON 处理 │ ├── 056_XML.md │ ├── 057_JSON.md │ └── 058_article.md ├── 17. 性能优化 │ ├── 059_article.md │ ├── 060_article.md │ └── 061_article.md ├── 18. 测试和调试 │ ├── 062_article.md │ ├── 063_article.md │ └── 064_Python.md ├── 19. 安全编程 │ ├── 065_article.md │ ├── 066_article.md │ └── 067_article.md ├── 20. 项目实战 │ ├── 068_article.md │ ├── 069_article.md │ └── 070_Web.md ├── 21. Perl 生态系统 │ ├── 071_CPAN Perl.md │ ├── 072_Perl.md │ └── 073_article.md └── Perl课程大纲.md ├── PostgreSQL ├── 01. 基础入门 │ ├── 001_PostgreSQL.md │ ├── 002_article.md │ ├── 003_-.md │ ├── 004_SQL (SELECT INSERT UPDATE DELETE).md │ └── 005_PSQL.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_article.md │ ├── 009_article.md │ ├── 010_(Schema).md │ └── 011_ACID.md ├── 03. 高级查询 │ ├── 012_SQL.md │ ├── 013_SQL(JOIN).md │ ├── 014_UNION INTERSECT EXCEPT.md │ ├── 015_SQL.md │ └── 016_(CTE).md ├── 04. 数据库设计 │ ├── 017_article.md │ ├── 018_ER.md │ ├── 019_article.md │ ├── 020_Python.md │ └── 021_article.md ├── 05. 性能优化 │ ├── 022_article.md │ ├── 023_article.md │ ├── 024_article.md │ ├── 025_article.md │ └── 026_PostgreSQLVACUUMANALYZE.md ├── 06. 高级特性 │ ├── 027_article.md │ ├── 028_article.md │ ├── 029_article.md │ ├── 030_article.md │ └── 031_JSONJSONB - PostgreSQL.md ├── 07. 并发控制 │ ├── 032_article.md │ ├── 033_MVCC().md │ ├── 034_article.md │ └── 035_article.md ├── 08. 备份和恢复 │ ├── 036_pg_dumppg_restorePostgreSQL.md │ ├── 037_(PITR).md │ ├── 038_article.md │ └── 039_article.md ├── 09. 安全性 │ ├── 040_article.md │ ├── 041_article.md │ ├── 042_SSL.md │ └── 043_PostgreSQL.md ├── 10. 扩展和插件 │ ├── 044_PostGISpgcrypto.md │ ├── 045_article.md │ └── 046_(FDW).md ├── 11. 管理和监控 │ ├── 047_article.md │ ├── 048_article.md │ ├── 049_PgBouncer.md │ └── 050_article.md ├── 12. 与应用程序集成 │ ├── 051_JDBCODBC.md │ ├── 052_ORMHibernateSQLAlchemy.md │ └── 053_article.md ├── 13. 大数据和分析 │ ├── 054_article.md │ ├── 055_SQL.md │ ├── 056_article.md │ └── 057_Hadoop.md ├── 14. 云端PostgreSQL │ ├── 058_Amazon RDS for PostgreSQL.md │ ├── 059_Azure Database for PostgreSQL.md │ └── 060_Google Cloud SQL for PostgreSQL.md ├── 15. 版本更新和迁移 │ ├── 061_article.md │ ├── 062_article.md │ └── 063_PostgreSQL.md ├── 16. 实战项目 │ ├── 064_article.md │ ├── 065_article.md │ └── 066_article.md ├── 17. 工具和资源 │ ├── 067_pgAdminGUIPostgreSQL.md │ ├── 068_article.md │ └── 069_article.md └── PostgreSQL课程大纲.md ├── Python ├── 01. 基础入门 │ ├── 001_Python.md │ ├── 002_PythonIDE.md │ ├── 003_Python.md │ ├── 004_article.md │ └── 005_-.md ├── 02. 控制流程 │ ├── 006_(if elif else).md │ ├── 007_for while.md │ └── 008_(try except).md ├── 03. 数据结构 │ ├── 009_Python.md │ ├── 010_Python.md │ └── 011_article.md ├── 04. 函数和模块 │ ├── 012_-.md │ ├── 013_article.md │ ├── 014_Python.md │ └── 015_Pythonpip.md ├── 05. 面向对象编程 │ ├── 016_Python.md │ ├── 017_article.md │ └── 018_article.md ├── 06. 文件操作和I │ └── O │ │ ├── 019_article.md │ │ ├── 020_CSVJSON.md │ │ └── 021_article.md ├── 07. 高级特性 │ ├── 022_Python.md │ ├── 023_Python.md │ ├── 024_Python.md │ └── 025_article.md ├── 08. 标准库 │ ├── 026_Pythondatetimetime.md │ ├── 027_Pythonossys.md │ ├── 028_Pythonre.md │ └── 029_Python Collections.md ├── 09. 第三方库 │ ├── 030_NumPy Pandas.md │ ├── 031_Matplotlib.md │ ├── 032_PythonRequestsHTTP.md │ └── 033_FlaskDjango Web.md ├── 10. 数据库操作 │ ├── 034_SQLite.md │ ├── 035_MySQLPostgreSQL.md │ └── 036_SQLAlchemy ORM.md ├── 11. Web开发 │ ├── 037_HTML CSS.md │ ├── 038_Flask.md │ ├── 039_Django.md │ └── 040_RESTful API.md ├── 12. 数据科学和机器学习 │ ├── 041_Jupyter Notebook.md │ ├── 042_article.md │ ├── 043_Scikit-learn.md │ └── 044_TensorFlowPyTorch.md ├── 13. 项目实战 │ ├── 045_article.md │ ├── 046_Web.md │ ├── 047_article.md │ └── 048_article.md ├── 14. 高级主题 │ ├── 049_article.md │ ├── 050_TDD.md │ ├── 051_Python.md │ └── 052_Apache SparkPySpark.md ├── 15. 工具和最佳实践 │ ├── 053_Git.md │ ├── 054_(venv virtualenv).md │ ├── 055_Python (PEP 8).md │ └── 056_Sphinx.md ├── 16. Python 生态系统 │ ├── 057_Python.md │ ├── 058_article.md │ ├── 059_Python.md │ └── 060_article.md └── Python课程大纲.md ├── R ├── 01. 基础入门 │ ├── 001_R.md │ ├── 002_R RStudio -.md │ ├── 003_R.md │ ├── 004_article.md │ └── 005_article.md ├── 02. 数据导入和导出 │ ├── 006_CSV.md │ ├── 007_Excel - Python.md │ ├── 008_(SQL).md │ └── 009_Web.md ├── 03. 数据处理和转换 │ ├── 010_article.md │ ├── 011_Python.md │ ├── 012_(reshape2 ).md │ └── 013_article.md ├── 04. 数据可视化 │ ├── 014_article.md │ ├── 015_ggplot2 -.md │ ├── 016_Plotly.md │ └── 017_article.md ├── 05. 统计分析基础 │ ├── 018_article.md │ ├── 019_article.md │ ├── 020_article.md │ └── 021_article.md ├── 06. 高级统计方法 │ ├── 022_(ANOVA).md │ ├── 023_(PCA).md │ ├── 024_article.md │ └── 025_article.md ├── 07. 机器学习 │ ├── 026_article.md │ ├── 027_article.md │ ├── 028_article.md │ └── 029_article.md ├── 08. 文本挖掘和自然语言处理 │ ├── 030_article.md │ ├── 031_article.md │ ├── 032_article.md │ └── 033_LDABERTopic.md ├── 09. 大数据处理 │ ├── 034_R data.table.md │ ├── 035_dplyr tidyr.md │ ├── 036_article.md │ └── 037_article.md ├── 10. R Markdown 和报告生成 │ ├── 038_R Markdown.md │ ├── 039_-.md │ ├── 040_(Shiny).md │ └── 041_article.md ├── 11. 函数编程 │ ├── 042_-.md │ ├── 043_article.md │ ├── 044_article.md │ └── 045_(S3 S4 ).md ├── 12. 包开发 │ ├── 046_R R.md │ ├── 047_Roxygen2R.md │ ├── 048_testthatR.md │ └── 049_CRANR.md ├── 13. 高性能 R 编程 │ ├── 050_article.md │ ├── 051_Python.md │ ├── 052_Rcpp C.md │ └── 053_Rparallel.md ├── 14. 网络分析 │ ├── 054_igraph.md │ ├── 055_article.md │ └── 056_article.md ├── 15. 空间数据分析 │ ├── 057_Rspsf.md │ ├── 058_article.md │ ├── 059_article.md │ └── 060_article.md ├── 16. 生物信息学应用 │ ├── 061_Bioconductor.md │ ├── 062_article.md │ ├── 063_article.md │ └── 064_article.md ├── 17. 金融数据分析 │ ├── 065_article.md │ ├── 066_article.md │ ├── 067_article.md │ └── 068_Python.md ├── 18. Web 应用开发 │ ├── 069_Shiny.md │ ├── 070_article.md │ └── 071_Shiny.md ├── 19. 项目实战 │ ├── 072_article.md │ ├── 073_article.md │ └── 074_article.md ├── 20. R 生态系统 │ ├── 075_CRAN Bioconductor.md │ ├── 076_R.md │ └── 077_article.md └── R课程大纲.md ├── React ├── 01. 基础入门 │ ├── 001_React.md │ ├── 002_Node.js npm Create React App.md │ ├── 003_JSX.md │ ├── 004_article.md │ └── 005_ReactPropsState.md ├── 02. React 核心概念 │ ├── 006_React.md │ ├── 007_article.md │ ├── 008_React.md │ ├── 009_Keys.md │ └── 010_article.md ├── 03. 组件进阶 │ ├── 011_article.md │ ├── 012_(HOC) React.md │ ├── 013_Understanding Render Props in React.md │ ├── 014_React Context API.md │ └── 015_RefsDOM.md ├── 04. Hooks │ ├── 016_React HooksuseState useEffect.md │ ├── 017_ReactuseContext.md │ ├── 018_ReactuseReducer.md │ ├── 019_Hooks.md │ └── 020_Hooks.md ├── 05. 状态管理 │ ├── 021_Redux.md │ ├── 022_Redux Toolkit.md │ ├── 023_MobX -.md │ ├── 024_Recoil.md │ └── 025_article.md ├── 06. 路由 │ ├── 026_React Router.md │ ├── 027_Web.md │ ├── 028_React.md │ ├── 029_Angular.md │ └── 030_article.md ├── 07. 性能优化 │ ├── 031_React.memo useMemo.md │ ├── 032_Understanding useCallback in React.md │ ├── 033_article.md │ ├── 034_article.md │ └── 035_article.md ├── 08. 测试 │ ├── 036_Jest.md │ ├── 037_React Testing Library.md │ ├── 038_article.md │ ├── 039_article.md │ └── 040_(Cypress).md ├── 09. 样式处理 │ ├── 041_CSS-in-JSStyled-components.md │ ├── 042_CSS ModulesCSS.md │ ├── 043_Tailwind CSS.md │ └── 044_Web.md ├── 10. 表单处理 │ ├── 045_vs React.md │ ├── 046_article.md │ ├── 047_Formik.md │ └── 048_React Hook Form.md ├── 11. 数据获取 │ ├── 049_Fetch API.md │ ├── 050_AxiosJavaScriptHTTP.md │ ├── 051_React Query.md │ ├── 052_SWR.md │ └── 053_GraphQL Apollo Client.md ├── 12. 服务端渲染 (SSR) │ ├── 054_Next.js.md │ ├── 055_SSR vs CSR vs SSG.md │ ├── 056_article.md │ └── 057_SEO.md ├── 13. 动画 │ ├── 058_React Transition Group.md │ ├── 059_React SpringUI.md │ ├── 060_Framer MotionUI.md │ └── 061_SVG.md ├── 14. 国际化 │ ├── 062_React IntlReact.md │ ├── 063_i18next.md │ └── 064_article.md ├── 15. 无障碍性 (A11y) │ ├── 065_ARIA.md │ ├── 066_article.md │ ├── 067_Web.md │ └── 068_article.md ├── 16. TypeScript 集成 │ ├── 069_TypeScript.md │ ├── 070_React.md │ ├── 071_article.md │ └── 072_Hooks.md ├── 17. 安全性 │ ├── 073_XSS Web.md │ ├── 074_CSRF.md │ ├── 075_article.md │ └── 076_article.md ├── 18. 部署和优化 │ ├── 077_article.md │ ├── 078_Docker.md │ ├── 079_CICD.md │ └── 080_article.md ├── 19. 高级模式和最佳实践 │ ├── 081_article.md │ ├── 082_article.md │ ├── 083_React.md │ └── 084_article.md ├── 20. 项目实战 │ ├── 085_article.md │ ├── 086_article.md │ └── 087_article.md ├── 21. React 生态系统 │ ├── 088_article.md │ ├── 089_React Native.md │ ├── 090_React.md │ └── 091_article.md └── React课程大纲.md ├── Ruby ├── 01. 基础入门 │ ├── 001_Ruby.md │ ├── 002_Ruby.md │ ├── 003_IRB ( Ruby).md │ ├── 004_article.md │ └── 005_article.md ├── 02. 控制结构 │ ├── 006_if unless case.md │ ├── 007_while until for each.md │ └── 008_Ruby.md ├── 03. 方法和块 │ ├── 009_article.md │ ├── 010_article.md │ └── 011_RubyProcLambda.md ├── 04. 数组和哈希 │ ├── 012_article.md │ ├── 013_article.md │ └── 014_Python.md ├── 05. 字符串和符号 │ ├── 015_Python.md │ └── 016_article.md ├── 06. 面向对象编程 │ ├── 017_Python.md │ ├── 018_Python.md │ ├── 019_Java.md │ ├── 020_Python.md │ └── 021_article.md ├── 07. 模块和混入 │ ├── 022_Python.md │ ├── 023_(Mixin).md │ └── 024_C.md ├── 08. 文件和 I │ └── O 操作 │ │ ├── 025_article.md │ │ ├── 026_article.md │ │ └── 027_article.md ├── 09. 异常处理 │ ├── 028_Python.md │ ├── 029_article.md │ └── 030_Python.md ├── 10. Ruby 高级特性 │ ├── 031_JavaScript.md │ ├── 032_article.md │ ├── 033_Python.md │ └── 034_article.md ├── 11. 并发和线程 │ ├── 035_article.md │ ├── 036_article.md │ └── 037_(Fiber).md ├── 12. 测试 │ ├── 038_RSpec.md │ ├── 039_(TDD).md │ └── 040_article.md ├── 13. Ruby on Rails 基础 │ ├── 041_MVCWeb.md │ ├── 042_Web.md │ ├── 043_ActiveRecord.md │ └── 044_Web.md ├── 14. 数据库操作 │ ├── 045_ActiveRecord.md │ ├── 046_article.md │ └── 047_article.md ├── 15. Web 开发 │ ├── 048_Rack.md │ ├── 049_Sinatra.md │ └── 050_API.md ├── 16. 部署和运维 │ ├── 051_Capistrano.md │ ├── 052_Passenger Puma.md │ └── 053_Web.md ├── 17. Ruby 生态系统 │ ├── 054_RubyGems.md │ ├── 055_Bundler.md │ └── 056_Ruby Gems.md ├── 18. 设计模式和最佳实践 │ ├── 057_Ruby.md │ ├── 058_article.md │ └── 059_article.md ├── 19. 函数式编程概念 │ ├── 060_article.md │ ├── 061_JavaScript.md │ └── 062_article.md ├── 20. 项目实战 │ ├── 063_article.md │ ├── 064_Web.md │ └── 065_article.md ├── 21. Ruby 社区和资源 │ ├── 066_article.md │ ├── 067_article.md │ └── 068_article.md └── Ruby课程大纲.md ├── Rust ├── 01. 基础入门 │ ├── 001_Rust.md │ ├── 002_Rust rustup cargo.md │ ├── 003_Rust.md │ ├── 004_article.md │ └── 005_if loop while for.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_Rust.md │ ├── 008_React.md │ ├── 009_C.md │ └── 010_article.md ├── 03. 模块和包管理 │ ├── 011_Python.md │ ├── 012_CargoRust.md │ ├── 013_Rust Crate.md │ └── 014_article.md ├── 04. 高级特性 │ ├── 015_Java.md │ ├── 016_Rust (Traits).md │ ├── 017_Python.md │ ├── 018_C.md │ └── 019_article.md ├── 05. 内存管理和安全 │ ├── 020_article.md │ ├── 021_article.md │ ├── 022_Understanding Unsafe Rust.md │ └── 023_(Box Rc Arc).md ├── 06. 异步编程 │ ├── 024_Future asyncawait.md │ ├── 025_Tokio.md │ └── 026_IO.md ├── 07. 测试和文档 │ ├── 027_Python.md │ ├── 028_article.md │ ├── 029_article.md │ └── 030_article.md ├── 08. 性能优化 │ ├── 031_article.md │ ├── 032_article.md │ ├── 033_article.md │ └── 034_Introduction to SIMD Programming.md ├── 09. Rust 生态系统 │ ├── 035_serde rayon clap.md │ ├── 036_Web (Actix Rocket).md │ ├── 037_article.md │ └── 038_article.md ├── 10. 最佳实践 │ ├── 039_article.md │ ├── 040_article.md │ ├── 041_Rust.md │ └── 042_article.md ├── 11. 高级主题 │ ├── 043_article.md │ ├── 044_FFI.md │ ├── 045_Rust no_std.md │ └── 046_WebAssembly.md ├── 12. 实战项目 │ ├── 047_article.md │ ├── 048_Web.md │ └── 049_article.md ├── 13. 工具和资源 │ ├── 050_IDE (VS Code IntelliJ IDEA).md │ ├── 051_Rust Analyzer.md │ ├── 052_Clippy.md │ └── 053_article.md ├── 14. 版本更新 │ ├── 054_Rust.md │ └── 055_article.md ├── 15. 前沿技术 │ ├── 056_Rust.md │ ├── 057_Rust.md │ └── 058_Rust.md └── Rust课程大纲.md ├── SQL ├── 01. 基础入门 │ ├── 001_SQL.md │ ├── 002_article.md │ ├── 003_( MySQL PostgreSQL).md │ ├── 004_SQL.md │ └── 005_article.md ├── 02. 数据定义语言 (DDL) │ ├── 006_(CREATE TABLE) - SQL.md │ ├── 007_(ALTER TABLE).md │ ├── 008_(DROP TABLE).md │ ├── 009_article.md │ └── 010_article.md ├── 03. 数据操作语言 (DML) │ ├── 011_(INSERT) - SQL.md │ ├── 012_(UPDATE).md │ ├── 013_(DELETE) -.md │ ├── 014_(SELECT).md │ └── 015_WHERE - SQL.md ├── 04. 查询进阶 │ ├── 016_SQL (ORDER BY).md │ ├── 017_SQLGROUP BY.md │ ├── 018_SUM AVG COUNT MAX MIN.md │ ├── 019_SQLHAVING.md │ └── 020_SQL.md ├── 05. 多表查询 │ ├── 021_INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN.md │ ├── 022_SQL.md │ ├── 023_UNION UNION ALL.md │ └── 024_SQL.md ├── 06. 函数和表达式 │ ├── 025_Python.md │ ├── 026_article.md │ ├── 027_Python.md │ ├── 028_(CASE WHEN).md │ └── 029_article.md ├── 07. 事务管理 │ ├── 030_article.md │ ├── 031_ACID.md │ ├── 032_(BEGIN COMMIT ROLLBACK).md │ └── 033_article.md ├── 08. 索引和性能优化 │ ├── 034_-.md │ ├── 035_SQL.md │ ├── 036_article.md │ └── 037_article.md ├── 09. 存储过程和函数 │ ├── 038_SQL.md │ ├── 039_-.md │ ├── 040_Python.md │ └── 041_Python.md ├── 10. 触发器 │ ├── 042_article.md │ ├── 043_-.md │ ├── 044_BEFORE AFTER INSTEAD OF.md │ └── 045_article.md ├── 11. 视图 │ ├── 046_article.md │ ├── 047_-.md │ ├── 048_article.md │ └── 049_article.md ├── 12. 安全性和权限管理 │ ├── 050_article.md │ ├── 051_article.md │ ├── 052_article.md │ └── 053_article.md ├── 13. 高级查询技术 │ ├── 054_SQL.md │ ├── 055_(CTE).md │ ├── 056_article.md │ └── 057_PIVOT UNPIVOT.md ├── 14. 数据仓库概念 │ ├── 058_article.md │ ├── 059_article.md │ ├── 060_ETL.md │ └── 061_OLAP.md ├── 15. NoSQL 集成 │ ├── 062_NoSQL.md │ ├── 063_JSON.md │ └── 064_article.md ├── 16. 数据库设计 │ ├── 065_(ERD).md │ ├── 066_article.md │ └── 067_article.md ├── 17. 数据库管理和维护 │ ├── 068_article.md │ ├── 069_article.md │ ├── 070_article.md │ └── 071_article.md ├── 18. 大数据和分布式数据库 │ ├── 072_article.md │ ├── 073_article.md │ └── 074_article.md ├── 19. SQL 在应用开发中的应用 │ ├── 075_ORM.md │ ├── 076_article.md │ └── 077_article.md ├── 20. 项目实战 │ ├── 078_article.md │ ├── 079_article.md │ └── 080_article.md ├── 21. SQL 和数据库生态系统 │ ├── 081_MySQL PostgreSQL Oracle SQL Server.md │ ├── 082_SQL.md │ └── 083_article.md └── SQL课程大纲.md ├── Scala ├── 01. 基础入门 │ ├── 001_Scala.md │ ├── 002_JDKScala IDE.md │ ├── 003_Scala.md │ ├── 004_article.md │ └── 005_ifelse.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_article.md │ ├── 008_Python.md │ ├── 009_article.md │ └── 010_Python.md ├── 03. 高级特性 │ ├── 011_Rust (Traits).md │ ├── 012_JavaScript.md │ ├── 013_Java.md │ ├── 014_JavaScript.md │ └── 015_JavaScript.md ├── 04. 并发编程 │ ├── 016_Akka Actor.md │ ├── 017_JavaScriptFuturePromise.md │ ├── 018_article.md │ └── 019_article.md ├── 05. 工具和生态系统 │ ├── 020_SBTScala.md │ ├── 021_ScalaTest.md │ ├── 022_Scala REPL.md │ └── 023_CatsScalaz.md ├── 06. 最佳实践 │ ├── 024_article.md │ ├── 025_article.md │ ├── 026_article.md │ └── 027_article.md ├── 07. 高级主题 │ ├── 028_article.md │ ├── 029_article.md │ ├── 030_article.md │ └── 031_Java Java.md ├── 08. 实战项目 │ ├── 032_Web ( Play Framework).md │ ├── 033_( Apache Spark).md │ └── 034_RESTful API.md ├── 09. 工具和资源 │ ├── 035_IntelliJ IDEA Scala.md │ ├── 036_Scala.md │ └── 037_article.md ├── 10. 版本更新 │ ├── 038_Scala 3 (Dotty).md │ └── 039_Scala 2 Scala 3.md ├── 11. 前沿技术 │ ├── 040_Scala.js JavaScript.md │ ├── 041_Scala Native.md │ └── 042_ZIO.md └── Scala课程大纲.md ├── Swift ├── 01. 基础入门 │ ├── 001_Swift.md │ ├── 002_Xcode.md │ ├── 003_Swift Playground.md │ ├── 004_article.md │ ├── 005_article.md │ └── 006_article.md ├── 02. 控制流 │ ├── 007_if switch.md │ ├── 008_Swiftfor-in while repeat-while.md │ └── 009_(break continue).md ├── 03. 集合类型 │ ├── 010_article.md │ ├── 011_article.md │ └── 012_Python.md ├── 04. 函数和闭包 │ ├── 013_-.md │ ├── 014_article.md │ ├── 015_Swift.md │ └── 016_Swift.md ├── 05. 枚举和结构体 │ ├── 017_-.md │ ├── 018_Swift.md │ ├── 019_-.md │ └── 020_C.md ├── 06. 类和对象 │ ├── 021_- Python.md │ ├── 022_JavaScript.md │ ├── 023_article.md │ └── 024_article.md ├── 07. 协议和扩展 │ ├── 025_article.md │ ├── 026_Swift.md │ └── 027_article.md ├── 08. 错误处理 │ ├── 028_article.md │ ├── 029_Javathrowstry.md │ └── 030_article.md ├── 09. 泛型 │ ├── 031_article.md │ ├── 032_Java.md │ └── 033_article.md ├── 10. 内存管理 │ ├── 034_ARC()iOS.md │ └── 035_article.md ├── 11. 并发编程 │ ├── 036_GCD (Grand Central Dispatch).md │ ├── 037_iOS.md │ └── 038_article.md ├── 12. Swift 标准库 │ ├── 039_Swift Sequence Collection.md │ ├── 040_article.md │ └── 041_article.md ├── 13. 函数式编程 │ ├── 042_Pythonmap filter reduce.md │ ├── 043_JavaScript.md │ └── 044_article.md ├── 14. UI 开发基础 (UIKit) │ ├── 045_- iOS.md │ ├── 046_iOS.md │ └── 047_article.md ├── 15. SwiftUI 入门 │ ├── 048_UI.md │ ├── 049_-.md │ ├── 050_Python.md │ └── 051_article.md ├── 16. 网络编程 │ ├── 052_URLSessioniOS.md │ ├── 053_Codable Swift.md │ └── 054_JSON.md ├── 17. 数据持久化 │ ├── 055_Understanding UserDefaults in iOS Development.md │ ├── 056_Core Data.md │ └── 057_article.md ├── 18. 测试 │ ├── 058_XCTest iOS.md │ ├── 059_Python.md │ └── 060_UI.md ├── 19. 应用程序生命周期 │ ├── 061_App.md │ ├── 062_article.md │ └── 063_article.md ├── 20. 高级主题 │ ├── 064_Python.md │ ├── 065_article.md │ └── 066_Actor (Swift 5.5).md ├── 21. 设计模式 │ ├── 067_MVCMVVM.md │ ├── 068_C.md │ ├── 069_article.md │ └── 070_article.md ├── 22. 第三方库集成 │ ├── 071_CocoaPodsiOS.md │ └── 072_Swift Package Manager.md ├── 23. 项目实战 │ ├── 073_iOS.md │ ├── 074_macOS.md │ └── 075_Swift.md ├── 24. Swift 生态系统 │ ├── 076_Swift.md │ ├── 077_Swift.md │ └── 078_article.md └── Swift课程大纲.md ├── TypeScript ├── 01. 基础入门 │ ├── 001_TypeScript.md │ ├── 002_Node.js TypeScript.md │ ├── 003_TypeScript.md │ ├── 004_-.md │ └── 005_TypeScript (tsconfig.json).md ├── 02. TypeScript 类型系统 │ ├── 006_(number string boolean array tuple).md │ ├── 007_article.md │ ├── 008_TypeScript Any Unknown.md │ ├── 009_Understanding Void Null and Undefined in Programming.md │ ├── 010_TypeScript Never.md │ └── 011_TypeScript.md ├── 03. 函数 │ ├── 012_article.md │ ├── 013_Python.md │ ├── 014_JavaScript.md │ ├── 015_C.md │ └── 016_JavaScriptThis.md ├── 04. 接口和类型 │ ├── 017_article.md │ ├── 018_Python.md │ ├── 019_TypeScript.md │ ├── 020_- TypeScript.md │ ├── 021_Java.md │ └── 022_vs TypeScript.md ├── 05. 类 │ ├── 023_-.md │ ├── 024_article.md │ ├── 025_Javapublic private protected.md │ ├── 026_article.md │ └── 027_Java.md ├── 06. 高级类型 │ ├── 028_TypeScript.md │ ├── 029_TypeScript.md │ ├── 030_TypeScript.md │ ├── 031_null.md │ ├── 032_article.md │ └── 033_TypeScript.md ├── 07. 泛型 │ ├── 034_article.md │ ├── 035_Java.md │ ├── 036_Java.md │ └── 037_Java.md ├── 08. 模块和命名空间 │ ├── 038_ES6.md │ ├── 039_C.md │ └── 040_article.md ├── 09. 装饰器 │ ├── 041_Python.md │ ├── 042_Python.md │ ├── 043_Python.md │ └── 044_Python.md ├── 10. 高级特性 │ ├── 045_(Mixins).md │ ├── 046_TypeScript.md │ ├── 047_Python.md │ ├── 048_TypeScript infer.md │ └── 049_TypeScript Partial Readonly Pick.md ├── 11. 异步编程 │ ├── 050_Understanding JavaScript Promises.md │ ├── 051_AsyncAwaitJavaScript.md │ └── 052_article.md ├── 12. TypeScript 与 React │ ├── 053_React (Create React App with TypeScript).md │ ├── 054_article.md │ ├── 055_Props State.md │ ├── 056_article.md │ └── 057_React Hooks TypeScript.md ├── 13. TypeScript 与 Node.js │ ├── 058_TypeScript Node.js.md │ ├── 059_TypeScript (types).md │ └── 060_TypeScript Express.md ├── 14. 测试 │ ├── 061_Jest TypeScript.md │ ├── 062_article.md │ └── 063_article.md ├── 15. 工具和生态系统 │ ├── 064_TSLint ESLint.md │ ├── 065_Webpack TypeScript.md │ └── 066_TypeScript API.md ├── 16. 设计模式 │ ├── 067_TypeScript.md │ └── 068_article.md ├── 17. 性能优化 │ ├── 069_article.md │ └── 070_article.md ├── 18. 项目实战 │ ├── 071_TypeScript.md │ └── 072_TypeScript.md ├── 19. TypeScript 生态系统 │ ├── 073_TypeScript.md │ ├── 074_TypeScript.md │ └── 075_article.md └── TypeScript课程大纲.md ├── Vue.js ├── 01. 基础入门 │ ├── 001_Vue.js.md │ ├── 002_Vue CLI Vite.md │ ├── 003_Vue.md │ ├── 004_Vue.md │ └── 005_article.md ├── 02. 核心概念 │ ├── 006_article.md │ ├── 007_Props Events ProvideInject.md │ ├── 008_Vue.js.md │ ├── 009_article.md │ └── 010_-.md ├── 03. 组件和样式 │ ├── 011_Vue.js(.vue).md │ ├── 012_() - Vue.js.md │ ├── 013_Scoped CSSVue.js.md │ ├── 014_CSSSassLess.md │ └── 015_- Vue.js.md ├── 04. 高级特性 │ ├── 016_Vue Router.md │ ├── 017_Vuex.md │ ├── 018_(Mixins).md │ ├── 019_article.md │ └── 020_article.md ├── 05. 性能优化 │ ├── 021_DOM diff.md │ ├── 022_Vue.js.md │ ├── 023_Vue.js Keep-Alive.md │ └── 024_article.md ├── 06. 工具和生态系统 │ ├── 025_Vue DevToolsVue.js.md │ ├── 026_Vue Test UtilsVue.js.md │ ├── 027_Vue CLI.md │ └── 028_Nuxt.jsVue.js.md ├── 07. 最佳实践 │ ├── 029_article.md │ ├── 030_article.md │ ├── 031_article.md │ └── 032_Web.md ├── 08. 高级主题 │ ├── 033_TypeScript Vue.md │ ├── 034_JSX.md │ ├── 035_(SSR).md │ └── 036_(SSG).md ├── 09. 实战项目 │ ├── 037_article.md │ ├── 038_article.md │ └── 039_article.md ├── 10. 工具和资源 │ ├── 040_UI (Element UI Vuetify).md │ ├── 041_(Pinia).md │ ├── 042_article.md │ └── 043_article.md ├── 11. Vue 3 新特性 │ ├── 044_Vue 3Composition API.md │ ├── 045_Teleport - Vue.js.md │ ├── 046_Android Fragments.md │ └── 047_Vue 2 Vue 3.md ├── 12. 前沿技术 │ ├── 048_Vite.md │ ├── 049_Vue 3 TypeScript.md │ ├── 050_VueUse.md │ └── 051_().md └── Vue.js课程大纲.md └── restore.py /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next", 3 | "rules": { 4 | "react/no-unescaped-entities": "off", 5 | "@next/next/no-page-custom-font": "off" 6 | } 7 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /ads.txt: -------------------------------------------------------------------------------- 1 | google.com, pub-7522094408813551, DIRECT, f08c47fec0942fa0 -------------------------------------------------------------------------------- /app/GoogleAnalytics.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import Script from 'next/script'; 4 | 5 | export default function GoogleAnalytics() { 6 | return ( 7 | <> 8 | 21 | 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /app/[language]/ClientSideTutorialTree.tsx: -------------------------------------------------------------------------------- 1 | //ts-nocheck 2 | 3 | 'use client'; 4 | 5 | import { usePathname } from 'next/navigation' 6 | import Link from 'next/link' 7 | import { useState } from 'react' 8 | 9 | interface TutorialItem { 10 | title: string; 11 | path: string; 12 | items?: TutorialItem[]; 13 | } 14 | 15 | function RenderTutorialTree({ items, language, currentPath }: { items: TutorialItem[], language: string, currentPath: string }) { 16 | return ( 17 | 24 | ); 25 | } 26 | 27 | function TutorialTreeItem({ item, language, currentPath }: { item: TutorialItem, language: string, currentPath: string }) { 28 | const [isOpen, setIsOpen] = useState(false); 29 | const encodedPath = encodeURIComponent(item.path).replace(/%2F/g, '%2F'); 30 | const isActive = currentPath === `/${language}/${encodedPath}`; 31 | 32 | // 如果是目录(有子项目) 33 | if (item.items && item.items.length > 0) { 34 | return ( 35 |
36 |
setIsOpen(!isOpen)} 39 | > 40 | 41 | {isOpen ? '▼' : '▶'} 42 | 43 | 44 | {item.title} 45 | 46 |
47 | {isOpen && ( 48 | 49 | )} 50 |
51 | ); 52 | } 53 | 54 | // 如果是具体文章(没有子项目) 55 | return ( 56 |
57 |
58 | 62 | {item.title} 63 | 64 |
65 |
66 | ); 67 | } 68 | 69 | export default function ClientSideTutorialTree({ tutorials, language }: { tutorials: TutorialItem[], language: string }) { 70 | const currentPath = usePathname(); 71 | return ; 72 | } 73 | -------------------------------------------------------------------------------- /app/[language]/LanguageLayoutClient.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import TutorialSidebar from '@/components/TutorialSidebar' 4 | 5 | export default function LanguageLayoutClient({ 6 | children, 7 | tutorials, 8 | language 9 | }: { 10 | children: React.ReactNode, 11 | tutorials: any[], 12 | language: string 13 | }) { 14 | return ( 15 |
16 | 17 |
18 | {children} 19 |
20 |
21 | ) 22 | } -------------------------------------------------------------------------------- /app/[language]/LanguageLayoutServer.tsx: -------------------------------------------------------------------------------- 1 | import { LanguageProvider } from './LanguageProvider' 2 | import LanguageLayoutClient from './LanguageLayoutClient' 3 | 4 | export default async function LanguageLayoutServer({ 5 | children, 6 | params 7 | }: { 8 | children: React.ReactNode, 9 | params: { language: string } 10 | }) { 11 | const data = await LanguageProvider({ language: params.language }) 12 | 13 | return ( 14 | 15 | {children} 16 | 17 | ) 18 | } -------------------------------------------------------------------------------- /app/[language]/LanguageProvider.tsx: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path from 'path' 3 | import matter from 'gray-matter' 4 | import { Tutorial } from '@/lib/tutorials' 5 | 6 | const tutorialsDirectory = path.join(process.cwd(), 'tutorials') 7 | 8 | function getDirectoryStructure(dirPath: string, basePath: string): Tutorial[] { 9 | const items = fs.readdirSync(dirPath, { withFileTypes: true }) 10 | const structure = items.map(item => { 11 | const itemPath = path.join(dirPath, item.name) 12 | if (item.isDirectory()) { 13 | return { 14 | title: item.name, 15 | path: path.relative(path.join(tutorialsDirectory, basePath), itemPath), 16 | items: getDirectoryStructure(itemPath, basePath) 17 | } 18 | } else if (item.isFile() && item.name.endsWith('.md')) { 19 | try { 20 | const fileContents = fs.readFileSync(itemPath, 'utf8') 21 | const { data } = matter(fileContents) 22 | return { 23 | title: data.title || item.name.replace('.md', ''), 24 | path: path.relative(path.join(tutorialsDirectory, basePath), itemPath).replace('.md', '') 25 | } 26 | } catch (error) { 27 | console.error(`Error parsing file ${itemPath}:`, error) 28 | return { 29 | title: item.name.replace('.md', ''), 30 | path: path.relative(path.join(tutorialsDirectory, basePath), itemPath).replace('.md', '') 31 | } 32 | } 33 | } 34 | return null 35 | }).filter((item): item is Tutorial => item !== null) 36 | 37 | return structure 38 | } 39 | 40 | export async function LanguageProvider({ language }: { language: string }) { 41 | const languagePath = path.join(tutorialsDirectory, language) 42 | const tutorials = getDirectoryStructure(languagePath, language) 43 | return { tutorials, language } 44 | } -------------------------------------------------------------------------------- /app/[language]/[tutorial]/page.tsx: -------------------------------------------------------------------------------- 1 | // 导入所需的模块 2 | import { getTutorialContent } from "@/lib/tutorials" // 导入获取教程内容的函数 3 | import ReactMarkdown from 'react-markdown' // 导入用于渲染Markdown的组件 4 | import path from 'path' // 导入用于处理文件路径的模块 5 | 6 | // 定义TutorialPage组件,这是一个异步函数组件 7 | export default async function TutorialPage({ params }: { params: { language: string, tutorial: string[] } }) { 8 | // 从params中提取language和tutorial参数 9 | const language = decodeURIComponent(params.language) 10 | // 如果tutorial是数组,则将其join成字符串;否则直接使用 11 | const tutorialPath = Array.isArray(params.tutorial) 12 | ? params.tutorial.map(decodeURIComponent).join('/') 13 | : decodeURIComponent(params.tutorial) 14 | 15 | // 打印日志,显示正在获取的内容信息 16 | console.log(`Fetching content for language: ${language}, tutorial: ${tutorialPath}`) 17 | // 打印完整的文件路径 18 | console.log(`Full path: ${path.join(process.cwd(), 'tutorials', language, `${tutorialPath}.md`)}`) 19 | 20 | // 调用getTutorialContent函数获取教程内容 21 | const content = await getTutorialContent(language, tutorialPath) 22 | // 打印获取到的内容长度 23 | console.log(`Content fetched, length: ${content.length}`) 24 | 25 | // 如果内容获取失败,返回错误信息 26 | if (content === 'Tutorial content not found.' || content === 'Error loading tutorial content.') { 27 | return
{content}
28 | } 29 | 30 | // 如果内容获取成功,渲染教程内容 31 | return ( 32 |
33 | {content} 34 |
35 | ) 36 | } 37 | -------------------------------------------------------------------------------- /app/[language]/layout.tsx: -------------------------------------------------------------------------------- 1 | import LanguageLayoutServer from './LanguageLayoutServer' 2 | 3 | export default LanguageLayoutServer -------------------------------------------------------------------------------- /app/[language]/page.tsx: -------------------------------------------------------------------------------- 1 | import { getTutorialStructure } from '@/lib/tutorials' 2 | import { Suspense } from 'react' 3 | import ClientSideTutorialTree from './ClientSideTutorialTree' 4 | import { ErrorBoundary } from '../components/ErrorBoundary' 5 | 6 | export default async function Page({ params }: { params: { language: string } }) { 7 | const tutorials = await getTutorialStructure(params.language); 8 | const language = params.language; 9 | 10 | return ( 11 |
12 |

{decodeURIComponent(language)} Tutorials

13 |
14 | 15 | Loading...
}> 16 | 17 | 18 | 19 |
20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /app/[language]/tutorialUtils.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/about/page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Link from 'next/link' 3 | 4 | export default function About() { 5 | return ( 6 |
7 |

About CoderWithAI

8 |

9 | CoderWithAI is a comprehensive online learning platform designed to help individuals master various programming languages. Our goal is to provide high-quality, accessible tutorials for learners of all levels, from beginners to advanced programmers. 10 |

11 |

12 | Our platform features: 13 |

14 | 20 |

21 | We believe in the power of education and the importance of making programming knowledge accessible to everyone. Our team of experienced developers and educators work tirelessly to create content that is both informative and engaging. 22 |

23 |

24 | Whether you're looking to start a career in software development, enhance your current skills, or simply explore the world of programming, we're here to support your learning journey. 25 |

26 | 27 | Return to Home 28 | 29 |
30 | ) 31 | } -------------------------------------------------------------------------------- /app/api/available-languages/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server' 2 | import fs from 'fs' 3 | import path from 'path' 4 | 5 | const tutorialsDirectory = path.join(process.cwd(), 'tutorials') 6 | 7 | export async function GET() { 8 | try { 9 | const languages = fs.readdirSync(tutorialsDirectory) 10 | .filter(item => { 11 | const stats = fs.statSync(path.join(tutorialsDirectory, item)) 12 | return stats.isDirectory() && !item.startsWith('.') 13 | }) 14 | return NextResponse.json(languages) 15 | } catch (error) { 16 | console.error(`Error getting available languages: ${error}`) 17 | return NextResponse.json({ error: 'Error loading available languages' }, { status: 500 }) 18 | } 19 | } -------------------------------------------------------------------------------- /app/api/language-layout/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server' 2 | import { getTutorialStructure } from "@/lib/tutorials" 3 | 4 | export async function GET(request: Request) { 5 | const { searchParams } = new URL(request.url) 6 | const language = searchParams.get('language') 7 | 8 | if (!language) { 9 | return NextResponse.json({ error: 'Language is required' }, { status: 400 }) 10 | } 11 | 12 | const tutorials = await getTutorialStructure(language) 13 | return NextResponse.json({ tutorials, language: decodeURIComponent(language) }) 14 | } -------------------------------------------------------------------------------- /app/api/tutorial-content/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server' 2 | import fs from 'fs' 3 | import path from 'path' 4 | import matter from 'gray-matter' 5 | 6 | const tutorialsDirectory = path.join(process.cwd(), 'tutorials') 7 | 8 | export async function GET(request: Request) { 9 | const { searchParams } = new URL(request.url) 10 | const language = searchParams.get('language') 11 | const tutorialPath = searchParams.get('path') 12 | 13 | if (!language || !tutorialPath) { 14 | return NextResponse.json({ error: 'Invalid parameters' }, { status: 400 }) 15 | } 16 | 17 | try { 18 | const decodedLanguage = decodeURIComponent(language) 19 | const decodedPath = decodeURIComponent(tutorialPath) 20 | const fullPath = path.join(tutorialsDirectory, decodedLanguage, `${decodedPath}.md`) 21 | 22 | console.log('Attempting to read file:', fullPath) 23 | 24 | if (!fs.existsSync(fullPath)) { 25 | console.error('File not found:', fullPath) 26 | return NextResponse.json({ error: 'Tutorial not found' }, { status: 404 }) 27 | } 28 | 29 | const fileContents = fs.readFileSync(fullPath, 'utf8') 30 | const { content } = matter(fileContents) 31 | return new NextResponse(content) 32 | } catch (error) { 33 | console.error(`Error reading tutorial content: ${error}`) 34 | return NextResponse.json({ error: 'Error loading tutorial content' }, { status: 500 }) 35 | } 36 | } -------------------------------------------------------------------------------- /app/api/tutorials/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server' 2 | import { getTutorialStructure, getTutorialContent } from '@/lib/tutorials' 3 | 4 | interface Tutorial { 5 | title: string; 6 | path: string; 7 | items?: Tutorial[]; 8 | } 9 | 10 | function findFirstTutorial(tutorials: Tutorial[]): Tutorial | null { 11 | for (const item of tutorials) { 12 | if (item.items) { 13 | const found = findFirstTutorial(item.items) 14 | if (found) return found 15 | } else { 16 | return item 17 | } 18 | } 19 | return null 20 | } 21 | 22 | export async function GET(request: Request): Promise { 23 | const { searchParams } = new URL(request.url) 24 | const language = searchParams.get('language') 25 | 26 | if (!language) { 27 | return NextResponse.json({ error: 'Language is required' }, { status: 400 }) 28 | } 29 | 30 | const decodedLanguage = decodeURIComponent(language) 31 | const tutorials = await getTutorialStructure(decodedLanguage) 32 | let initialContent = 'Select a tutorial to begin.' 33 | 34 | if (tutorials.length > 0) { 35 | const firstTutorial = findFirstTutorial(tutorials) 36 | if (firstTutorial) { 37 | initialContent = await getTutorialContent(decodedLanguage, firstTutorial.path) 38 | } 39 | } 40 | 41 | return new Response(JSON.stringify({ tutorials, initialContent }), { 42 | headers: { 'Content-Type': 'application/json' }, 43 | }) 44 | } -------------------------------------------------------------------------------- /app/components/AIChatHistory.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface AIChatHistoryProps { 4 | message: string; 5 | } 6 | 7 | function AIChatHistory({ message }: AIChatHistoryProps) { 8 | return ( 9 |
10 |

{message}

11 |
12 | ); 13 | } 14 | 15 | export default AIChatHistory; 16 | -------------------------------------------------------------------------------- /app/components/AIChatWidget.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import ChatWindow from './ChatWindow'; 3 | import { FaExpand, FaCompress } from 'react-icons/fa'; 4 | import { Message } from '../types'; 5 | 6 | // AIChatWidget 组件:用于渲染 AI 聊天小部件 7 | function AIChatWidget() { 8 | // 状态管理 9 | const [isOpen, setIsOpen] = useState(false); // 控制聊天窗口是否打开 10 | const [isFullScreen, setIsFullScreen] = useState(false); // 控制聊天窗口是否全屏 11 | const [messages, setMessages] = useState([]); // 存储聊天消息,初始为空数组 12 | 13 | // 切换聊天窗口的开关状态 14 | const toggleChat = () => { 15 | console.log('Toggling chat, current state:', isOpen); // 记录当前状态 16 | setIsOpen(!isOpen); // 切换开关状态 17 | }; 18 | 19 | // 切换全屏模式 20 | const toggleFullScreen = () => setIsFullScreen(!isFullScreen); 21 | 22 | return ( 23 | // 主容器,根据状态添加相应的 CSS 类 24 |
25 | {isOpen && ( 26 | // 如果聊天窗口打开,渲染 ChatWindow 组件 27 | 33 | )} 34 | {!isOpen && ( 35 | // 如果聊天窗口关闭,显示打开聊天的按钮 36 |
37 | 40 | 43 |
44 | )} 45 |
46 | ); 47 | } 48 | 49 | export default AIChatWidget; 50 | -------------------------------------------------------------------------------- /app/components/ChatWindow.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import AIChatHistory from './AIChatHistory'; 3 | import { FaExpand, FaCompress } from 'react-icons/fa'; 4 | 5 | interface Message { 6 | content: string; 7 | // 添加其他必要的属性 8 | } 9 | 10 | interface ChatWindowProps { 11 | messages: Message[]; 12 | isFullScreen: boolean; 13 | onToggleFullScreen: () => void; 14 | onClose: () => void; 15 | } 16 | 17 | function ChatWindow({ messages, isFullScreen, onToggleFullScreen, onClose }: ChatWindowProps) { 18 | return ( 19 |
20 |
21 |

AI 助手

22 |
23 | 26 | 29 |
30 |
31 |
32 | {messages.map((message, index) => ( 33 | 34 | ))} 35 |
36 |
37 | {/* 这里添加聊天输入框 */} 38 |
39 |
40 | ); 41 | } 42 | 43 | export default ChatWindow; -------------------------------------------------------------------------------- /app/components/ErrorBoundary.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React from 'react' 4 | import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary' 5 | 6 | function ErrorFallback({error}: {error: Error}) { 7 | return ( 8 |
9 |

Something went wrong:

10 |
{error.message}
11 |
12 | ) 13 | } 14 | 15 | export function ErrorBoundary({ children }: { children: React.ReactNode }) { 16 | return ( 17 | 18 | {children} 19 | 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/components/SEO.tsx: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | 3 | interface SEOProps { 4 | title: string; 5 | description: string; 6 | keywords?: string; 7 | ogImage?: string; 8 | canonicalUrl?: string; 9 | datePublished?: string; 10 | category?: string; 11 | } 12 | 13 | export default function SEO({ 14 | title, 15 | description, 16 | keywords, 17 | ogImage, 18 | canonicalUrl, 19 | datePublished, 20 | category 21 | }: SEOProps) { 22 | const structuredData = { 23 | "@context": "https://schema.org", 24 | "@type": "Article", 25 | "headline": title, 26 | "description": description, 27 | "image": ogImage, 28 | "datePublished": datePublished, 29 | "author": { 30 | "@type": "Organization", 31 | "name": "CoderWithAI" 32 | }, 33 | "publisher": { 34 | "@type": "Organization", 35 | "name": "CoderWithAI", 36 | "logo": { 37 | "@type": "ImageObject", 38 | "url": "https://www.coderwith.ai/logo.png" 39 | } 40 | }, 41 | "mainEntityOfPage": { 42 | "@type": "WebPage", 43 | "@id": canonicalUrl 44 | }, 45 | "articleSection": category 46 | }; 47 | 48 | return ( 49 | 50 | {title} 51 | 52 | {keywords && } 53 | 54 | 55 | {ogImage && } 56 | 57 | {canonicalUrl && } 58 | {datePublished && } 59 | {category && } 60 | 63 | 64 | ); 65 | } -------------------------------------------------------------------------------- /app/components/TutorialCard.tsx: -------------------------------------------------------------------------------- 1 | import Image from 'next/image'; 2 | 3 | interface TutorialCardProps { 4 | tutorial: { 5 | title: string; 6 | description?: string; 7 | image?: string; 8 | // 添加其他必要的属性 9 | }; 10 | } 11 | 12 | export default function TutorialCard({ tutorial }: TutorialCardProps) { 13 | return ( 14 |
15 | {tutorial.image && ( 16 | {tutorial.title} 22 | )} 23 |

{tutorial.title}

24 | {tutorial.description &&

{tutorial.description}

} 25 |
26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /app/contact/page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Link from 'next/link' 3 | 4 | export default function Contact() { 5 | return ( 6 |
7 |

Contact Us

8 |

9 | We value your feedback and are always here to assist you. If you have any questions, suggestions, or concerns, please don't hesitate to reach out to us. 10 |

11 |

Get in Touch

12 |
    13 |
  • Email: support@programmingtutorials.com
  • 14 |
  • Phone: +1 (555) 123-4567
  • 15 |
  • Address: 123 Coding Street, Tech City, TC 12345
  • 16 |
17 |

Follow Us

18 |

19 | Stay updated with our latest tutorials and programming tips by following us on social media: 20 |

21 |
    22 |
  • Twitter: @ProgrammingTuts
  • 23 |
  • Facebook: /ProgrammingTutorials
  • 24 |
  • LinkedIn: /company/programming-tutorials
  • 25 |
26 |

27 | We aim to respond to all inquiries within 24-48 hours during business days. 28 |

29 | 30 | Return to Home 31 | 32 |
33 | ) 34 | } -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchaincyf/CoderWithAI/39bb28ec5ebd4299a7151e6cd8cf3931d6256a29/app/favicon.ico -------------------------------------------------------------------------------- /app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchaincyf/CoderWithAI/39bb28ec5ebd4299a7151e6cd8cf3931d6256a29/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchaincyf/CoderWithAI/39bb28ec5ebd4299a7151e6cd8cf3931d6256a29/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --background: 0 0% 100%; 7 | --foreground: 222.2 84% 4.9%; 8 | --card: 0 0% 100%; 9 | --card-foreground: 222.2 84% 4.9%; 10 | --popover: 0 0% 100%; 11 | --popover-foreground: 222.2 84% 4.9%; 12 | --primary: 222.2 47.4% 11.2%; 13 | --primary-foreground: 210 40% 98%; 14 | --secondary: 210 40% 96.1%; 15 | --secondary-foreground: 222.2 47.4% 11.2%; 16 | --muted: 210 40% 96.1%; 17 | --muted-foreground: 215.4 16.3% 46.9%; 18 | --accent: 210 40% 96.1%; 19 | --accent-foreground: 222.2 47.4% 11.2%; 20 | --destructive: 0 84.2% 60.2%; 21 | --destructive-foreground: 210 40% 98%; 22 | --border: 214.3 31.8% 91.4%; 23 | --input: 214.3 31.8% 91.4%; 24 | --ring: 222.2 84% 4.9%; 25 | --radius: 0.5rem; 26 | } 27 | 28 | .dark { 29 | --background: 222.2 84% 4.9%; 30 | --foreground: 210 40% 98%; 31 | --card: 222.2 84% 4.9%; 32 | --card-foreground: 210 40% 98%; 33 | --popover: 222.2 84% 4.9%; 34 | --popover-foreground: 210 40% 98%; 35 | --primary: 210 40% 98%; 36 | --primary-foreground: 222.2 47.4% 11.2%; 37 | --secondary: 217.2 32.6% 17.5%; 38 | --secondary-foreground: 210 40% 98%; 39 | --muted: 217.2 32.6% 17.5%; 40 | --muted-foreground: 215 20.2% 65.1%; 41 | --accent: 217.2 32.6% 17.5%; 42 | --accent-foreground: 210 40% 98%; 43 | --destructive: 0 62.8% 30.6%; 44 | --destructive-foreground: 210 40% 98%; 45 | --border: 217.2 32.6% 17.5%; 46 | --input: 217.2 32.6% 17.5%; 47 | --ring: 212.7 26.8% 83.9%; 48 | } 49 | 50 | * { 51 | @apply border-border; 52 | } 53 | 54 | body { 55 | @apply bg-background text-foreground; 56 | } 57 | -------------------------------------------------------------------------------- /app/layout.js: -------------------------------------------------------------------------------- 1 | import 'bootstrap/dist/css/bootstrap.min.css'; 2 | import 'bootstrap-icons/font/bootstrap-icons.css'; 3 | 4 | export default function RootLayout({ children }) { 5 | return ( 6 | 7 | {children} 8 | 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /app/privacy/page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Link from 'next/link' 3 | 4 | export default function Privacy() { 5 | return ( 6 |
7 |

Privacy Policy

8 |

9 | At CoderWithAI, we are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy outlines how we collect, use, and safeguard your data when you use our website. 10 |

11 |

Information We Collect

12 |

13 | We may collect the following types of information: 14 |

15 |
    16 |
  • Personal information (e.g., name, email address) when you voluntarily provide it
  • 17 |
  • Usage data (e.g., pages visited, time spent on the site)
  • 18 |
  • Technical data (e.g., IP address, browser type)
  • 19 |
20 |

How We Use Your Information

21 |

22 | We use the collected information to: 23 |

24 |
    25 |
  • Provide and improve our services
  • 26 |
  • Personalize your experience
  • 27 |
  • Communicate with you about our services
  • 28 |
  • Analyze and monitor usage of our website
  • 29 |
30 |

Data Security

31 |

32 | We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. 33 |

34 |

Your Rights

35 |

36 | You have the right to access, correct, or delete your personal information. If you have any questions or requests regarding your data, please contact us. 37 |

38 |

39 | This privacy policy is subject to change. We encourage you to review it periodically. 40 |

41 |

42 | Last updated: {new Date().toLocaleDateString()} 43 |

44 | 45 | Return to Home 46 | 47 |
48 | ) 49 | } -------------------------------------------------------------------------------- /app/sitemap.ts: -------------------------------------------------------------------------------- 1 | import { getAvailableLanguages, getTutorials } from "@/lib/tutorials"; 2 | 3 | export default async function sitemap() { 4 | const baseUrl = "https://www.codewithai.com"; 5 | const languages = await getAvailableLanguages(); 6 | 7 | const urls: string[] = []; 8 | 9 | for (const lang of languages) { 10 | const tutorials = await getTutorials(lang); 11 | urls.push(`${baseUrl}/${lang}`); 12 | tutorials.forEach((tutorial) => { 13 | urls.push(`${baseUrl}/${lang}/${tutorial.path}`); 14 | }); 15 | } 16 | 17 | return urls; 18 | } -------------------------------------------------------------------------------- /app/tutorials/[lang]/[slug]/page.tsx: -------------------------------------------------------------------------------- 1 | import { getTutorialContent } from "@/lib/tutorials" 2 | import ReactMarkdown from 'react-markdown' 3 | 4 | interface PageParams { 5 | lang: string; 6 | slug: string; 7 | } 8 | 9 | export default async function TutorialPage({ params }: { params: PageParams }) { 10 | const { lang, slug } = params; 11 | const content = await getTutorialContent(lang, slug); 12 | 13 | if (typeof content !== 'string') { 14 | return
Error: Unable to load tutorial content
; 15 | } 16 | 17 | return ( 18 | <> 19 |
20 | {content} 21 |
22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /app/types.ts: -------------------------------------------------------------------------------- 1 | export interface Message { 2 | content: string; 3 | role: 'user' | 'assistant'; 4 | } 5 | 6 | export interface Tutorial { 7 | title: string; 8 | path: string; 9 | description?: string; 10 | image?: string; 11 | items?: Tutorial[]; 12 | // 添加其他必要的属性 13 | } 14 | 15 | // 添加其他需要的接口或类型 16 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /components/AdSense.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/ClientTranslation.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/GoogleAds.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { useEffect } from 'react'; 4 | import Script from 'next/script'; 5 | 6 | // 添加这个类型声明 7 | declare global { 8 | interface Window { 9 | adsbygoogle: any[]; 10 | } 11 | } 12 | 13 | export default function GoogleAds() { 14 | useEffect(() => { 15 | try { 16 | (window.adsbygoogle = window.adsbygoogle || []).push({}); 17 | } catch (err) { 18 | console.error(err); 19 | } 20 | }, []); 21 | 22 | return ( 23 | <> 24 | 80 | ``` 81 | 82 | ### 2.3 实践练习 83 | 84 | 1. 在 `src/components` 目录下创建一个新的组件 `LocalComponent.vue`。 85 | 2. 在 `App.vue` 中局部注册并使用 `LocalComponent`。 86 | 87 | ## 3. 全局与局部组件的对比 88 | 89 | ### 3.1 适用场景 90 | 91 | - **全局组件**:适用于那些在整个应用中频繁使用的组件,如导航栏、页脚等。 92 | - **局部组件**:适用于那些只在特定场景下使用的组件,如表单组件、特定页面的组件等。 93 | 94 | ### 3.2 优缺点 95 | 96 | - **全局组件**: 97 | - **优点**:使用方便,无需重复导入。 98 | - **缺点**:可能会导致不必要的全局命名冲突,增加应用的启动时间。 99 | - **局部组件**: 100 | - **优点**:更加灵活,减少命名冲突的风险。 101 | - **缺点**:需要手动导入和注册,可能会增加代码量。 102 | 103 | ## 4. 总结 104 | 105 | 组件注册是 Vue.js 中一个重要的概念,理解全局和局部组件的注册方式有助于你更好地组织和管理应用的组件结构。通过实践练习,你可以更好地掌握这两种注册方式的实际应用。 106 | 107 | ## 5. 下一步 108 | 109 | 接下来,你可以学习如何使用 `Scoped CSS` 来为组件添加样式,或者探索 `Vue Router` 来构建多页面应用。继续深入学习,你将能够构建更加复杂和功能丰富的 Vue.js 应用。 -------------------------------------------------------------------------------- /tutorials/Vue.js/08. 高级主题/034_JSX.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 深入理解渲染函数与JSX 3 | date: 2023-10-05 4 | description: 本课程详细讲解了React中的渲染函数和JSX语法,帮助开发者掌握如何高效构建用户界面。 5 | slug: rendering-functions-and-jsx 6 | tags: 7 | - React 8 | - JSX 9 | - 前端开发 10 | category: 前端开发 11 | keywords: 12 | - 渲染函数 13 | - JSX 14 | - React开发 15 | --- 16 | 17 | # 渲染函数和 JSX 18 | 19 | ## 概述 20 | 21 | 在 Vue.js 中,渲染函数(Render Functions)和 JSX 是两种高级的视图渲染方式。它们允许开发者直接使用 JavaScript 来创建虚拟 DOM 节点,而不是通过模板语法。这种灵活性使得开发者能够更精细地控制组件的渲染过程,尤其是在需要动态生成复杂 DOM 结构时。 22 | 23 | ## 渲染函数 24 | 25 | ### 理论解释 26 | 27 | 渲染函数是 Vue.js 提供的一种直接使用 JavaScript 生成虚拟 DOM 的方式。通过渲染函数,开发者可以完全控制组件的渲染逻辑,而不依赖于模板语法。渲染函数返回一个虚拟 DOM 节点,Vue 会将其转换为实际的 DOM 节点。 28 | 29 | ### 代码示例 30 | 31 | ```javascript 32 | export default { 33 | data() { 34 | return { 35 | message: 'Hello, Vue!' 36 | }; 37 | }, 38 | render(h) { 39 | return h('div', { class: 'container' }, [ 40 | h('h1', this.message), 41 | h('p', 'This is a paragraph.') 42 | ]); 43 | } 44 | }; 45 | ``` 46 | 47 | ### 实践练习 48 | 49 | 1. 创建一个 Vue 组件,使用渲染函数动态生成一个包含标题和段落的 DOM 结构。 50 | 2. 尝试在渲染函数中使用条件语句来控制 DOM 节点的显示和隐藏。 51 | 52 | ## JSX 53 | 54 | ### 理论解释 55 | 56 | JSX 是一种 JavaScript 的语法扩展,允许开发者在 JavaScript 代码中编写类似 HTML 的结构。Vue.js 支持使用 JSX 来编写组件,这使得代码更加简洁和直观。JSX 最终会被编译成渲染函数。 57 | 58 | ### 代码示例 59 | 60 | ```javascript 61 | export default { 62 | data() { 63 | return { 64 | message: 'Hello, Vue with JSX!' 65 | }; 66 | }, 67 | render() { 68 | return ( 69 |
70 |

{this.message}

71 |

This is a paragraph.

72 |
73 | ); 74 | } 75 | }; 76 | ``` 77 | 78 | ### 实践练习 79 | 80 | 1. 创建一个 Vue 组件,使用 JSX 动态生成一个包含标题和段落的 DOM 结构。 81 | 2. 尝试在 JSX 中使用条件语句来控制 DOM 节点的显示和隐藏。 82 | 83 | ## 渲染函数与 JSX 的对比 84 | 85 | ### 灵活性 86 | 87 | - **渲染函数**:提供了最大的灵活性,可以直接操作虚拟 DOM,适合复杂的动态渲染需求。 88 | - **JSX**:提供了类似 HTML 的语法,代码更易读,适合中等复杂度的渲染需求。 89 | 90 | ### 学习曲线 91 | 92 | - **渲染函数**:需要理解虚拟 DOM 和渲染逻辑,学习曲线较高。 93 | - **JSX**:语法更接近 HTML,学习曲线较低。 94 | 95 | ### 适用场景 96 | 97 | - **渲染函数**:适用于需要高度自定义和动态渲染的场景。 98 | - **JSX**:适用于需要快速开发和维护的场景。 99 | 100 | ## 总结 101 | 102 | 渲染函数和 JSX 是 Vue.js 中两种强大的视图渲染方式。渲染函数提供了最大的灵活性,适合复杂的动态渲染需求;而 JSX 则提供了更简洁和直观的语法,适合中等复杂度的渲染需求。通过掌握这两种技术,开发者可以更灵活地控制组件的渲染过程,提升开发效率和代码质量。 103 | 104 | ## 下一步 105 | 106 | - 尝试在实际项目中使用渲染函数或 JSX 来优化组件的渲染逻辑。 107 | - 探索 Vue.js 的官方文档,了解更多关于渲染函数和 JSX 的高级用法。 108 | 109 | 希望这篇教程能帮助你更好地理解和应用 Vue.js 中的渲染函数和 JSX。祝你学习愉快! -------------------------------------------------------------------------------- /tutorials/Vue.js/Vue.js课程大纲.md: -------------------------------------------------------------------------------- 1 | # Vue.js 课程大纲 2 | 3 | ## 基础入门 4 | - Vue.js 简介和特性 5 | - 开发环境搭建 (Vue CLI, Vite) 6 | - 创建第一个 Vue 应用 7 | - Vue 实例和生命周期 8 | - 模板语法和数据绑定 9 | 10 | ## 核心概念 11 | - 组件化开发 12 | - 组件通信 (Props, Events, Provide/Inject) 13 | - 计算属性和侦听器 14 | - 条件渲染和列表渲染 15 | - 表单输入绑定 16 | 17 | ## 组件和样式 18 | - 单文件组件 (.vue 文件) 19 | - 组件注册 (全局和局部) 20 | - Scoped CSS 21 | - CSS 预处理器 (Sass, Less) 22 | - 动态样式和类绑定 23 | 24 | ## 高级特性 25 | - Vue Router 26 | - Vuex 状态管理 27 | - 混入 (Mixins) 28 | - 自定义指令 29 | - 插件系统 30 | 31 | ## 性能优化 32 | - 虚拟 DOM 和 diff 算法 33 | - 异步组件 34 | - keep-alive 组件缓存 35 | - 懒加载和代码分割 36 | 37 | ## 工具和生态系统 38 | - Vue DevTools 39 | - Vue Test Utils 40 | - Vue CLI 41 | - Nuxt.js (Vue.js 服务端渲染框架) 42 | 43 | ## 最佳实践 44 | - 项目结构组织 45 | - 代码风格和规范 46 | - 错误处理和调试技巧 47 | - 性能优化策略 48 | 49 | ## 高级主题 50 | - TypeScript 与 Vue 51 | - 渲染函数和 JSX 52 | - 服务端渲染 (SSR) 53 | - 静态站点生成 (SSG) 54 | 55 | ## 实战项目 56 | - 待办事项应用 57 | - 博客系统 58 | - 电商网站前端 59 | 60 | ## 工具和资源 61 | - 常用 UI 组件库 (Element UI, Vuetify) 62 | - 状态管理替代方案 (Pinia) 63 | - 社区插件和资源 64 | - 官方文档和学习资源 65 | 66 | ## Vue 3 新特性 67 | - Composition API 68 | - Teleport 组件 69 | - 片段 (Fragments) 70 | - 从 Vue 2 迁移到 Vue 3 71 | 72 | ## 前沿技术 73 | - Vite 构建工具 74 | - Vue 3 + TypeScript 75 | - 响应式框架 (如 VueUse) 76 | - 服务端组件 (实验性) -------------------------------------------------------------------------------- /tutorials/restore.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import tkinter as tk 4 | from tkinter import filedialog, messagebox 5 | import re 6 | 7 | def select_folders(): 8 | root = tk.Tk() 9 | root.withdraw() 10 | folders = [] 11 | while True: 12 | folder = filedialog.askdirectory(title="选择要整理的文件夹", initialdir=os.getcwd()) 13 | if folder: 14 | folders.append(folder) 15 | if not messagebox.askyesno("继续选择", "是否继续选择其他文件夹?"): 16 | break 17 | else: 18 | break 19 | return folders 20 | 21 | def find_course_md(folder): 22 | for file in os.listdir(folder): 23 | if file.endswith('.md') and '课程' in file: 24 | return os.path.join(folder, file) 25 | return None 26 | 27 | def parse_md_file(md_file): 28 | with open(md_file, 'r', encoding='utf-8') as f: 29 | content = f.read() 30 | 31 | sections = re.findall(r'## (.*?)\n((?:- .*?\n)*)', content, re.DOTALL) 32 | return [(title.strip(), len(items.strip().split('\n'))) for title, items in sections] 33 | 34 | def organize_files(folder, sections): 35 | md_files = [f for f in os.listdir(folder) if f.endswith('.md') and f != os.path.basename(find_course_md(folder))] 36 | md_files.sort() 37 | 38 | file_index = 0 39 | for index, (title, item_count) in enumerate(sections, start=1): 40 | new_folder = os.path.join(folder, f"{index}. {title}") 41 | os.makedirs(new_folder, exist_ok=True) 42 | 43 | # 如果是最后一个文件夹,多移动一个文件 44 | if index == len(sections): 45 | item_count += 1 46 | 47 | for i in range(item_count): 48 | if file_index < len(md_files): 49 | shutil.move(os.path.join(folder, md_files[file_index]), os.path.join(new_folder, md_files[file_index])) 50 | file_index += 1 51 | 52 | def main(): 53 | folders = select_folders() 54 | 55 | if not folders: 56 | print("未选择任何文件夹,程序退出。") 57 | return 58 | 59 | for folder in folders: 60 | course_md = find_course_md(folder) 61 | if course_md: 62 | sections = parse_md_file(course_md) 63 | organize_files(folder, sections) 64 | print(f"文件夹 {folder} 整理完成") 65 | else: 66 | print(f"在文件夹 {folder} 中未找到包含'课程'的md文件") 67 | 68 | if __name__ == "__main__": 69 | main() 70 | --------------------------------------------------------------------------------