news 2026/9/3 17:19:32

纪念一下自己第一个成型的项目【记得闪卡】(jidecards)基本完善(鸿蒙Next端原生闪卡式学习记忆软件)(原名记得闪卡)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
纪念一下自己第一个成型的项目【记得闪卡】(jidecards)基本完善(鸿蒙Next端原生闪卡式学习记忆软件)(原名记得闪卡)

【记得闪卡】算是我第一个真正做成型的项目。目前已经上架华为应用市场进行了多轮迭代。但是迭代无穷无尽,现在又往里面塞了个Agent,不知道3.0.0版本会不会因此被卡上线

项目地址:

jidecards-anki-harmonyos:基于 HarmonyOS 与 Anki 内核的闪卡学习客户端项目 - AtomGit

记得闪卡(jidecards),一个 HarmonyOS Next端原生闪卡应用,界面和应用层使用 ArkTS / ArkUI,底层直接接入 Anki 26.05 的 Rust 后端。目前牌组管理、复习、FSRS、统计、浏览编辑、图片遮挡、导入导出、AnkiWeb 同步、初步的 Agent 制卡和改卡这些主要部分都已经基本完成。

整体原理其实不复杂。没有重新实现一套 Anki。我直接把 Anki 的 Rust Core 接到了鸿蒙应用里。

整体调用链大致是:

ArkUI ↓ ArkTS Service ↓ BackendSession ↓ Node-API ↓ C ABI ↓ Rust ↓ Anki rslib

ArkUI 主要负责界面。

比如首页展示牌组,学习页展示卡片和四个评分按钮,浏览页展示卡片和笔记。真正涉及卡片数据、复习队列、FSRS 调度、模板渲染、数据库、同步等逻辑时,会通过 ArkTS 的 Service 层调用 Anki 后端。

ArkTS 和 Rust 中间不能直接调用,所以中间做了一层很薄的桥。

上层实际上主要通过类似下面的接口访问后端:

openBackend() runMethodRaw() closeBackend()

其中runMethodRaw()接收 service、method 和 protobuf 编码后的参数,然后通过 Node-API 进入 C++,再通过 C ABI 进入 Rust。

C++ 层基本不处理业务,只负责桥接。

Rust 层再把对应请求路由给 Anki rslib。

所以很多功能实际上都是直接使用 Anki 原本的实现。例如复习。进入一个牌组后,客户端先让 Anki Scheduler 获取当前学习队列,然后取出一张卡片。

卡片正反面也不是我自己重新解析模板,而是交给 Anki 的 Card Rendering 后端生成 HTML,再放进 HarmonyOS 的 Web 组件中显示。

用户点击 Again、Hard、Good、Easy 后,评分继续交给 Anki Scheduler。Scheduler 更新卡片状态并计算下一次复习时间,然后客户端继续取下一张卡。

基本就是:

取卡 → 渲染问题 → 显示答案 → 提交评分 → Anki Scheduler 更新 → 取下一张

FSRS 也是一样。

记得闪卡没有自己实现一套 FSRS,而是直接使用 Anki 当前的调度实现。客户端主要负责参数设置、用户操作和结果展示。

这样做最大的好处是不用重新维护一整套调度器,同时也能继续保持和 Anki 数据体系的兼容。

.apkg.colpkg、笔记类型、卡片模板、媒体、搜索语法、AnkiWeb 同步这些能力,本质上也都建立在 Anki Rust 后端上。

项目里我自己主要做的是鸿蒙这一侧。

包括 ArkUI 界面、应用状态、Service 封装、Native Bridge、卡片展示、统计界面、桌面服务卡片、学习提醒、TTS、牌组管理,以及后来加入的 AI Agent(雏形)

现在的结构是:

用户自然语言 ↓ Agent ↓ 受限工具 ↓ 生成修改草稿 ↓ 用户确认 ↓ 执行器 ↓ ArkTS Service ↓ Anki Rust

也就是说模型只能调用预先定义好的工具。

比如读取牌组结构、读取卡片、生成新卡草稿、修改字段等。

真正写入之前会先生成草稿,用户确认之后才执行。删除、修改模板、迁移笔记类型这类操作还会有更严格的确认。

这样模型只是负责理解自然语言和决定调用什么工具,真正的数据操作仍然走已有的应用逻辑。

目前整个项目的主要结构已经比较稳定了。

从最开始只能简单读取和复习卡片,到现在已经包含 ArkUI、ArkTS、C++、Rust、protobuf、SQLite、Web 渲染、同步、系统 API 和 LLM Agent,基本把一个完整应用会碰到的东西都碰了一遍。

其中尤其是Agent能力,让我出奇觉得还不错。

其实很多Anki高级兼容这方面我很多都没做,什么极度自定义的编辑器等等,这玩意接入麻烦一堆,而且我的理解是不需要。

不说手机操作困难问题,我重点觉得重点是可以交给Agent。我现在使用Anki制卡都是描述清楚需求后Agent,让后打包成apkg直接安装使用。对于很多耐心有限的用户来说显然放个公告来告知可以去下载个Agent软件来获取独属于你的牌组也是个问题。

所以我直接让codex帮我写了个轻量Agent。这个Agent也方便不少了,毕竟可以直接应用内使用。而且Agent新增闪卡也可以在现有牌组里面新增,Agent改卡更是可以直接修改看不爽的卡片。可以在学习到对应闪卡是进入右上角更多进入AI改卡界面,任何需求可以直接说,Agent已经锁定了当前指定的闪卡了。这样就会很方便。

因此我觉得这个Agent或许在适当完善后完全可以不作为外界Agent的平替,而成为记得闪卡不可替代的能力。

目前思路是让Agent具有很高的后端数据读取权力,但是操作权力受限。AI使用用户自己的API。

虽然效果还差点意思,但是有提升空间,虽然不知道这个版本会不会有AI这个因素而不让上架。

从最初尝试把Anki接入,到现在Agent雏形接入,也过去近一个月了。

虽然目前日活只有几十人的样子,但大概不再算是个Demo 了。

作为准大学生的第一个完整的投入许久的作品,只希望带着AI的3.0.0能顺利过审。不行的话只能在应用市场上先去掉AI功能了,现在搞了个AI,还得去了解一下AI资质和个人企业的事。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 17:17:32

基于Multisim的交通信号灯控制器设计与仿真实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 17:15:22

9 款 AI 写论文哪个好?实测看毕业论文全流程能力,书匠策 AI 官网[www.shujiangce.com](https://www.shujiangce.com)|微信公众号搜一搜 书匠策 AI

官网:www.shujiangce.com | 微信 公众号 :书匠策AI 临近毕业季,大量本科生、研究生都在寻找适配毕业论文的 AI 辅助工具,市面上 AI 科研产品层出不穷,很多同学分不清不同工具的实际边界。毕业论文不同于普通课程论…

作者头像 李华
网站建设 2026/9/3 17:14:48

构建高质量青光眼眼底图像分割数据集:从设计到标注的全流程实战

简介:本资源为面向医学图像分析研究者与AI医疗开发者的专业级青光眼眼底成像分割数据集,聚焦视盘、杯盘比及神经纤维层等关键结构的像素级标注,旨在支撑自动诊断模型训练与分割算法优化。压缩包含2000个文件(1020张PNG、979张JPG眼…

作者头像 李华
网站建设 2026/9/3 17:13:03

JavaScript零基础学习路线:从语法基础到项目实战与面试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 17:10:34

Git 版本管理

本文仅用于个人学习,若有侵权请联系相关文件 .gitignore 文件用于描述不进行版本管理的文件清单 测试连接性 ssh -T gitgithub.com 提交流程 git status git add . git status git commit -m "feat: update M1 baseline workflow" git push origin main拉…

作者头像 李华
网站建设 2026/9/3 17:09:05

SPW420张力闭环控制实战:卷径动态跟踪与多补偿PID

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华