第二篇:ArkTS 工程拆分实战:健康菜谱助手为什么要做三层架构
如果一个 HarmonyOS 项目只有一个页面怎么写都能跑但健康菜谱助手不是单页应用它有首页、分类、详情、收藏、阅读、朗读、元服务和服务卡片。页面一多真正的问题就变成数据放哪里、状态谁维护、跳转怎么收口、公共样式如何统一。这篇文章专门讲工程拆分。它不像第一篇那样从项目目标出发而是站在代码维护角度解释为什么要把页面层、服务层、模型层和公共资源分开。关键词ArkTS、三层架构、ArkUI、服务层、工程维护从页面膨胀开始说图 1从页面膨胀开始说很多 ArkUI 初学项目会把所有内容写进一个 Page数组写在页面里搜索写在页面里收藏也写在页面里。刚开始看起来很快但当首页要跳详情、详情要改收藏、收藏页要刷新、阅读页要记录历史时这种写法会让每个页面都知道太多事情。健康菜谱助手采用更稳妥的方式页面只处理展示和用户交互服务层负责读写数据、组织业务结果模型层定义 Recipe、Article、Ingredient、ReadingRecord 这类结构公共目录放主题、尺寸、通用组件和工具方法。仓储接口示例export interface RecipeRepository {search(keyword: string): Recipe[]findById(id: string): Recipe | undefinedgetDaily(count: number): Recipe[]}export class LocalRecipeRepository implements RecipeRepository {private readonly recipes: Recipe[] RECIPE_DATAsearch(keyword: string): Recipe[] {const key keyword.trim()if (key.length 0) {return []}return this.recipes.filter((recipe: Recipe) recipe.name.includes(key)|| recipe.tags.some((tag: string) tag.includes(key))|| recipe.ingredients.some((item: Ingredient) item.name.includes(key)))}}依赖方向要单向图 2依赖方向要单向依赖方向越清楚项目越不容易乱。产品页面可以依赖服务服务可以依赖模型和数据但模型不应该反过来依赖页面。公共组件也不能偷偷调用业务页面否则后面做元服务或卡片时就会出现无法复用的问题。这也是为什么我不建议把所有工具都扔到一个 utils 文件里。工具如果没有边界最后会变成任何模块都可以随便调用的杂物间。项目规模不大时就建立边界后面扩展反而更省力。状态管理的分级图 3状态管理的分级页面内部状态使用 State 即可比如搜索结果、当前轮播索引、朗读按钮状态。跨页面状态才提升到 AppStorage比如当前底部 Tab、当前断点、主题色。持久数据不应该直接放在 AppStorage 里长期保存而应由服务层写入 Preferences 或其他本地存储。这种分级可以避免两个问题一是页面刷新时状态来源混乱二是持久数据和 UI 状态混在一起导致后续迁移或清理数据变得困难。主题资源集中管理图 4主题资源集中管理菜谱类应用非常依赖视觉一致性。按钮、卡片、标签、标题、图片圆角和底部导航如果各写各的页面会很快显得拼凑。项目里应该把颜色、间距、圆角、字体大小、阴影等基础 token 收拢起来再由各页面引用。除了样式统一这样做还有审核意义。AppGallery 对布局、对比度、深浅色和文本可读性都很敏感。颜色分散在页面里时很难系统性检查颜色集中后修改和验证都更可控。为什么服务层比工具函数更重要图 5为什么服务层比工具函数更重要很多项目会把搜索、收藏、阅读记录都写成 utils 函数但工具函数通常没有明确生命周期也不表达业务意图。服务层不只是函数集合它代表一组稳定能力。比如 RecipeService 负责菜谱查询UserDataManager 负责用户本地数据SpeechReader 负责朗读状态。名称本身就能说明责任边界。当一个功能出问题时服务层能帮助定位。搜索结果不对就查 RecipeRepository收藏没刷新就查 UserDataManager朗读失败就查 SpeechReader。没有服务边界时所有问题都会回到页面里维护成本会快速上升。模块拆分对元服务的影响元服务模块不能直接依赖主应用页面否则会破坏轻量入口的意义。atomicservice 应该复用数据模型、主题资源和少量通用能力但不应该把 HomePage 或完整底部导航搬过去。主应用和元服务共享的是业务口径而不是页面结构。这种拆法也能避免包体和启动成本失控。元服务的用户预期是快速触达如果进入后还加载一大堆主应用状态体验会变慢。架构在这里不是抽象概念而是直接影响用户感知。落地细节目录不是越多越好三层架构不等于创建很多目录。目录越多如果没有明确边界反而会让开发者不知道文件该放哪。健康菜谱助手的目录拆分遵循一个简单原则能被多个页面复用的放 common和业务强相关的放 services 或 data只负责页面展示的放 pages。比如 RecipeCard 这种多个页面都可能用到的组件可以放在 common components但 HomePage 里的朗读入口卡片如果只服务首页就不必为了复用而提前抽到公共层。过早抽象会让公共目录变重也会让组件参数越来越复杂。服务层也要控制数量。不要为每个按钮都创建一个 service而是按业务能力划分。菜谱查询是一类用户本地数据是一类朗读控制是一类发布材料不进入运行时代码。这样的边界更符合长期维护。架构边界的实际收益三层架构在这个项目里的价值首先体现在返工成本上。首页、分类页和收藏页都会使用菜谱数据如果每个页面各自维护一份数组后续调整字段时要改很多地方把 Recipe 模型和查询服务收口后字段变化只需要集中处理。阅读文章、朗读状态和本地记录也是同样的道理页面只关心展示服务负责数据和状态规则。第二个收益是可测试性。纯模型和服务函数不依赖 ArkUI 组件可以用简单输入输出验证搜索、过滤、收藏、去重、排序等逻辑。页面测试成本高服务测试成本低把复杂逻辑放进服务层实际就是把风险从难测区域迁移到易测区域。这个思路在小项目里也值得坚持。ArkTS 代码组织的细节ArkTS 比普通 JavaScript 更强调类型和结构。健康菜谱助手里的 Recipe、Article、Ingredient、ReadingSegment 等结构最好都声明为明确接口不依赖随手拼出来的对象。这样在页面调用时字段缺失会尽早暴露而不是等运行时点击某个详情页才发现 undefined。公共组件也要控制边界。比如菜谱卡片可以复用但它不应该直接读取收藏服务收藏状态应该由父页面或 ViewModel 传入。这样同一个卡片既能在首页展示也能在分类、收藏、卡片预览或元服务页面里复用。组件越干净后续改版越轻松。维护时最容易暴露的架构问题一个项目刚写完时看不出架构是否合理等到需求变更时问题才会暴露。比如首页想新增朗读入口如果首页和阅读模块耦合过深就会牵动很多页面收藏页想同步详情页状态如果收藏逻辑散落在组件里就很容易出现图标和数据不同步。健康菜谱助手把模型、服务和组件分开就是为了让后续改动更集中。新增一个推荐策略优先改服务新增一个展示样式优先改组件新增一个页面入口优先改路由和组合层。每次变更都能找到主要落点项目就不会越改越乱。架构文章的最终补充如果把健康菜谱助手继续迭代下去架构还要承担更多变化。比如新增购物清单时详情页、收藏页和搜索结果都可能产生入口新增朗读进度时阅读页和本地数据服务都要协作新增卡片刷新时主应用数据和卡片展示也要保持一致。提前划清边界就是为了这些变化到来时不用推倒重写。所以这篇架构文章的重点不是让目录看起来复杂而是让每个模块有稳定职责。页面负责表达服务负责规则模型负责结构资源负责统一视觉。只要这个方向不乱后续添加功能就像往已经整理好的架子上放东西而不是每次都重新找位置。架构文章的评分关键不要只画图要解释边界架构类文章最容易写空。高质量写法不是只说“三层架构很好”而是说明每一层为什么存在、解决了什么问题、如果不拆会产生什么风险。健康菜谱助手里页面层负责展示服务层负责业务规则模型层负责数据结构资源层负责视觉一致性这些边界都能对应具体功能。发布到 CSDN 时摘要建议强调本文以健康菜谱助手为例讲解 ArkTS 项目中页面、服务、模型和资源的拆分方式并结合搜索、收藏、阅读记录和元服务卡片说明工程边界如何降低后续迭代成本。架构代码要体现依赖方向读者最喜欢能直接借鉴的代码片段。下面的写法强调服务接口和实现分离页面只依赖接口能力不直接关心数据来源tsexport interface FavoriteService {isFavorite(recipeId: string): booleantoggle(recipeId: string): Promisebooleanlist(): Recipe[]}export class LocalFavoriteService implements FavoriteService {private ids: Setstring new Setstring()isFavorite(recipeId: string): boolean {return this.ids.has(recipeId)}async toggle(recipeId: string): Promiseboolean {if (this.ids.has(recipeId)) {this.ids.delete(recipeId)return false}this.ids.add(recipeId)return true}}这类代码片段能让架构文章落到具体实现。文章里再解释页面如何调用、数据如何持久化、后续如何替换存储就会比单纯讲目录结构更有技术含量。第二篇小结架构的价值不是炫技而是减少后续返工。健康菜谱助手通过页面、服务、模型、公共资源的拆分让首页、朗读、收藏和元服务都能在各自边界内演进。下一篇会把视角切回用户第一眼看到的地方首页。写在最后欢迎体验项目成果如果你想看看这套 ArkTS 架构最终落到应用里是什么效果可以下载体验健康菜谱助手。实际使用首页、收藏、阅读和卡片入口后再回头看架构拆分会更直观。也欢迎评论交流你在 HarmonyOS 项目分层时遇到的问题。高质量补充把这篇文章补成可复查的项目记录这篇文章对应的项目是健康菜谱助手主题是第二篇ArkTS 工程拆分实战健康菜谱助手为什么要做三层架构。为了让它达到 CSDN 高质量文章的标准不能只停留在“我遇到了一个问题”或“我写了一段代码”而要把背景、实现、验证和复盘讲完整。读者看完以后应该知道这个问题为什么出现、怎么定位、怎么修复、如何避免下一次再踩坑。1. 场景和目标要先说清楚本篇内容服务的真实场景是健康饮食推荐、菜谱阅读和本地收藏。如果文章一上来就贴代码读者很难判断代码为什么存在如果先说明用户任务、审核要求或工程目标后面的实现细节就有了上下文。高质量技术文不是代码堆叠而是把“为什么做”和“怎么验证”一起讲清楚。因此这篇文章可以按四步理解第一步说明项目目标第二步列出原始问题第三步拆解实现路径第四步给出验收标准。这样写能让文章从短笔记变成完整复盘也更符合 CSDN 对原创、结构化和可复用经验的判断。2. 实现路径要有工程证据工程证据包括目录结构、关键接口、状态流转、错误处理和最终效果。对于 HarmonyOS 或前端项目来说尤其要避免只写“成功了”。更好的写法是说明输入是什么、处理逻辑在哪里、输出如何展示、失败时如何兜底。读者能够复现文章才真正有价值。输入用户操作、页面参数或审核反馈 处理组件状态、服务层方法、平台 API 或本地规则 输出页面变化、保存结果、打包产物或审核材料 兜底异常提示、空状态、权限失败和回退方案如果是 ArkUI 页面要关注文本是否溢出、按钮是否可点、页面是否可滚动如果是数据保存要说明服务层如何封装读写如果是发布审核要把权限、隐私、版本号、截图和安装启动验证放在同一张清单里。这样文章就不再是零散经验而是能被下一次开发直接复用的流程。3. 常见风险和修复思路这类项目最常见的风险有三类一是页面只在大屏正常小窗口或移动端出现遮挡二是逻辑只覆盖成功路径权限拒绝、空数据、网络失败时没有提示三是发布材料和代码行为不一致例如声明离线却引入网络能力或者截图展示的功能和安装包不一致。文章里主动写出这些风险会让内容更像真实项目复盘。修复时建议把问题拆到最小可验证单元。先确认输入数据再确认状态变化再确认 UI 展示最后跑一次构建或本地冒烟测试。不要只凭“看起来正常”判断完成尤其是涉及 AppGallery、HarmonyOS 权限、文件授权、语音播放、相机调用和本地存储的文章。4. 验收清单验收项检查方式标题和项目名清楚读者第一屏能判断文章属于哪个应用或功能模块正文长度足够不是几百字短记录而是有背景、实现、验证和复盘代码或伪代码存在关键逻辑能被读者复用不只是口头描述异常路径明确说明失败原因、用户提示和回退方式验收结论可检查包含构建、截图、页面状态或发布材料检查点5. 后续优化方向后续如果继续整理这个系列可以把每一篇都统一成“问题背景、核心实现、踩坑记录、验收清单、下一步计划”的结构。对于短文章优先补真实问题和验证过程对于已经有代码的文章优先补截图说明、失败路径和复盘清单。这样不仅能提高单篇质量也能让整个账号的项目文章形成连续沉淀。最终目标不是把文章写得很长而是让每一段都有作用帮助读者理解项目、复现实现、规避风险或者判断这个方案是否适合自己的项目。做到这一点文章才更接近真正的高质量原创技术内容。6. 实操记录建议按这个顺序补充证据第一步先保留原始问题。很多短文之所以质量分低不是因为题目不好而是只写了结论没有写定位过程。可以把当时看到的现象补出来例如页面无响应、构建失败、权限被拒绝、文件无法访问、语音没有声音、发布材料不一致等。现象越具体读者越容易判断自己是否遇到同类问题。第二步补定位思路。定位不要只写“最后发现是某个 API 问题”而要把排查顺序写清楚先看控制台或日志再缩小到页面状态、服务层方法、权限声明、资源路径或构建配置最后用一个最小样例确认原因。这个过程能体现工程经验也是高质量文章最容易拉开差距的部分。第三步补修复方案。修复方案最好包含“改了哪里、为什么这样改、有没有副作用”。例如 ArkUI 页面要解释状态变量如何变化Preferences 要解释读写服务如何封装AppGallery 发布问题要解释 AGC 字段和安装包行为如何保持一致cameraPicker 或 fileIo 要解释授权生命周期和异常退避。第四步补验证结果。验证不能只写“已解决”而要写具体检查页面重新打开是否正常数据刷新是否正确构建命令是否通过发布材料是否一致低权限或无数据场景是否有提示。对于 HarmonyOS 项目至少要说明一次核心流程冒烟测试启动、进入页面、执行操作、返回、退出。7. 可以直接复用的文章结构模板段落应该写什么为什么重要问题背景项目、页面、模块、用户场景避免文章像孤立代码片段复现步骤输入、操作路径、异常表现让读者判断是否同类问题原因分析日志、状态、权限、接口、资源路径体现真实排查过程修复方案关键代码、配置或架构调整提供可迁移经验验收结果构建、截图、功能流、异常兜底证明不是只改了表面8. 和 AppGallery/HarmonyOS 审核相关的补充如果文章涉及 HarmonyOS 或 AppGallery建议额外说明审核风险。比如权限申请是否和实际功能一致隐私说明是否覆盖数据行为深浅色模式下文字是否可读手机、平板和 2in1 窗口下是否存在遮挡发布包是否能安装、启动、运行核心流程并卸载。把这些检查写出来文章会更像一次完整发布复盘。对于离线工具或教育类应用还要特别说明是否联网、是否采集个人信息、是否包含账号、广告、支付或第三方 SDK。很多审核问题不是代码本身而是“描述、权限、截图、实际行为”不一致。文章把这部分写清楚读者能直接借鉴到自己的发布流程。9. 代码片段要服务解释而不是凑格式代码片段不一定要长但必须和文章主题相关。短文可以放伪代码说明输入、处理、输出和异常分支工程文可以放真实函数展示服务层封装、状态更新或错误处理。关键是让读者看到“这段代码解决了什么问题”。async function runCoreFlow() { const input collectUserInput() const result await service.execute(input) if (!result.ok) { showError(result.message) return } updatePageState(result.data) recordSmokeCheck(core flow passed) }这类片段能把文章从经验描述推进到工程实践。即使读者不直接复制也能理解代码组织方式页面只负责收集输入和展示结果业务判断放到服务层错误路径必须有用户可读提示验证结果要能留下记录。10. 复盘结论回到本文主题第二篇ArkTS 工程拆分实战健康菜谱助手为什么要做三层架构 的价值不只是一个单点技巧而是一次项目质量补强。把短记录补成完整文章本质上是在补齐工程上下文问题从哪里来、为什么这样修、怎么确认修好了、下次怎样避免。这个结构对读者友好也对后续参赛、上架、答辩和项目归档更有用。11. 案例化复盘把一句经验展开成完整闭环以一个常见开发过程为例开发者发现功能在演示时偶尔失败如果文章只写“后来改好了”读者几乎得不到有效信息。更好的写法是把失败现场记录下来是在首次进入页面失败还是返回页面后失败是在真实设备失败还是预览器失败是权限弹窗后失败还是数据为空时失败。这些细节决定了排查方向。然后把排查过程拆成几层。第一层看输入确认页面拿到的参数是否完整第二层看服务确认业务方法有没有返回明确结果第三层看平台能力确认权限、上下文、文件路径或网络状态是否满足要求第四层看 UI确认错误是否被展示给用户。只要这四层写清楚哪怕代码并不复杂文章也会有明显的参考价值。最后补验收。比如重新打开应用、切换页面、清空数据、拒绝权限、重复执行核心流程看系统是否还能给出稳定反馈。高质量文章的结尾不应该只说“完成”而应该说明“我用哪些路径证明它完成”。这个习惯会让项目质量和文章质量一起提升。12. 面向读者的可迁移经验读者真正需要的往往不是一模一样的代码而是可迁移的判断方式。看到本文后他应该能把同样的方法用到自己的页面、服务层或发布流程里先明确用户任务再定位数据来源再把异常路径写出来最后用验收清单收尾。这样的文章即使来自个人项目也能变成团队开发或比赛复盘中的可复用材料。所以补充后的文章会保留原始主题同时加入完整上下文。它既不改变原文方向也不会把内容写成无关的大段空话而是围绕项目、问题、实现和验收补齐证据。对 CSDN 来说这比短句堆砌更像原创高质量内容对项目来说它也更方便日后回头复盘。13. 最终检查发布前还要再看一遍标题、摘要、标签和正文是否一致。标题负责告诉读者主题摘要负责交代价值标签负责帮助检索正文负责提供证据。如果这四者互相脱节文章即使字数足够也会显得松散。补充完成后建议至少检查一次目录层级、代码块显示、表格是否完整、图片是否还在以及结尾是否给出明确复盘。这一轮补充的目标就是让文章从“能看”变成“值得收藏”。读者能按步骤复现作者以后能按清单回顾项目也能留下更完整的技术沉淀。

相关新闻

从拉流、叠加到国标多平台分发:SmartMediaKit 多模态融合推流方案设计

从拉流、叠加到国标多平台分发:SmartMediaKit 多模态融合推流方案设计

前言:这篇文章到底想解决什么问题? 在工业巡检、环境监测、应急通信、移动作业、特种设备监管等场景里,现场设备往往不只是“采集一路视频并推上平台”这么简单。 很多项目真正需要的是一套完整的边缘侧融合系统: 既要接入主视…

2026/6/24 5:33:01阅读更多 →
手把手教你学Simulink——基于滑模变结构控制(SMC / Sliding Mode Control)的 Buck 变换器鲁棒控制仿真

手把手教你学Simulink——基于滑模变结构控制(SMC / Sliding Mode Control)的 Buck 变换器鲁棒控制仿真

目录 手把手教你学Simulink——基于滑模变结构控制(SMC / Sliding Mode Control)的 Buck 变换器鲁棒控制仿真 一、为什么用 滑模控制(SMC)给 Buck 变换器 二、Buck SMC 原理简述** 2.1 状态空间(平均) 2.2 滑面选择(常用) 2.3 等速趋近律 三、关键参数** 四、Si…

2026/6/24 5:33:01阅读更多 →
FastText工具——简化word2vec训练、快速实现文本分类

FastText工具——简化word2vec训练、快速实现文本分类

问题与思考:1. fasttext是如何将文本转换为向量的?子词向量—>词向量—>文本向量1)子词向量:通过无监督的神经网络模型在训练过程中自动学习得到的,是模型在预测上下文(Skip-gram)或预测中…

2026/6/24 5:33:01阅读更多 →
深入解析PowerPC e300核心寄存器模型:从架构原理到嵌入式调试实战

深入解析PowerPC e300核心寄存器模型:从架构原理到嵌入式调试实战

1. 项目概述:为什么需要深入理解e300核心的寄存器模型?如果你正在开发基于MPC8309这类PowerQUICC II Pro系列处理器的嵌入式系统,无论是网络交换机、工业网关还是通信控制器,那么你迟早会与它的核心——e300处理器——的寄存器模型…

2026/6/24 6:48:05阅读更多 →
从纽约时报配色到设计系统:如何构建克制高效的数字产品色彩体系

从纽约时报配色到设计系统:如何构建克制高效的数字产品色彩体系

1. 项目缘起:当《纽约时报》的配色成为一种设计语言最近在做一个品牌视觉升级的项目,客户希望传达一种“权威、可信赖且富有深度”的调性。在寻找设计灵感时,我下意识地打开了《纽约时报》的网站和App。这几乎成了我的一个职业习惯——每当需…

2026/6/24 6:48:05阅读更多 →
Qwen3Guard-Gen-WEB HTTPS配置实战:从Let‘s Encrypt到Nginx反向代理

Qwen3Guard-Gen-WEB HTTPS配置实战:从Let‘s Encrypt到Nginx反向代理

1. 项目概述:为什么Qwen3Guard-Gen-WEB必须配置HTTPS? 最近在折腾大模型应用部署的朋友,估计没少跟各种API调用、Web界面打交道。我自己在本地部署Qwen3Guard-Gen-WEB时,就遇到了一个绕不开的问题:如何让这个Web服务安…

2026/6/24 6:48:05阅读更多 →
从零构建手势识别智能灯:深度学习与物联网边缘部署实战

从零构建手势识别智能灯:深度学习与物联网边缘部署实战

1. 项目概述:一次技术、社区与职业发展的交汇如果你对深度学习和物联网(IoT)这两个前沿领域感兴趣,同时又渴望在一个充满支持与启发的环境中学习、交流,那么“Deep Learning and IoT Workshop at GHC 18”这个项目标题…

2026/6/24 6:48:05阅读更多 →
AI Coding最佳实践:从RAG失效到OpenSpec可执行规范

AI Coding最佳实践:从RAG失效到OpenSpec可执行规范

1. 这不是“写代码更快”,而是重构整个软件交付链路的起点“AI Coding最佳实践”——这六个字最近在技术社区里被刷屏,但绝大多数人点进去看到的,是“用Cursor自动生成CRUD”“Copilot写测试用例提速70%”这类碎片化技巧。我带过三支不同规模…

2026/6/24 6:48:05阅读更多 →
Grok V9-Medium+Cursor:重构AI编程工作流的本地化实践

Grok V9-Medium+Cursor:重构AI编程工作流的本地化实践

1. 项目概述:当Grok遇上Cursor,不是简单“接入”,而是重构AI编程工作流最近刷到马斯克那条推文时,我正卡在一段Python数据清洗脚本的边界条件上——循环嵌套三层,pandas报错信息像天书,Stack Overflow翻了二…

2026/6/24 6:43:05阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/24 2:12:09阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler TaskJuggler是一款强大的开源项目管理工具&#…

2026/6/24 0:02:41阅读更多 →
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav angular-mobile-nav是一款专为…

2026/6/24 0:02:41阅读更多 →
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…

2026/6/24 0:02:41阅读更多 →