KOReader阅读数据管道:SimpleUI如何把SQLite阅读记录解析成阅读连击与热力图
【免费下载链接】simpleui.kopluginA highly customizable UI plugin for KOReader that features a home screen, bottom navigation bar, top bar and desktop modules/widgets.项目地址https://gitcode.com/gh_mirrors/si/simpleui.koplugin点击查看免费下载SimpleUIsimpleui.koplugin是一个功能强大的 KOReader 阅读插件它为阅读统计建立了一条完整的数据管道直接读取 SQLite 数据库 statistics.sqlite3 中的page_stat翻页统计记录经过 SQL 聚合、按日缓存和连击推算最终渲染出首页阅读统计卡片、连续阅读天数Streak 连击、GitHub 风格阅读热力图与「星期几 × 小时」时段网格。本文带你从数据源一路读到渲染层看看这条管道是如何运转的。数据源头statistics.sqlite3 里的 page_stat一切数据都来自 KOReader 自带的阅读统计数据库statistics.sqlite3位于 KOReader 设置目录其中的page_stat视图记录了每一次翻页id_book、page、start_timeUnix 时间戳和duration阅读秒数。SimpleUI 通过 infra/sui_config.lua 中的Config.openStatsDB()以只读方式打开该数据库。这里有几个关键设计只读、绝不写入——插件从不动 KOReader 自己的统计表连「冻结日」也保存在 SimpleUI 自己的设置里infra/sui_streak.luapage_stat是视图、无法建索引插件直接查询其底表page_stat_data利用start_time上的索引把每次扫描限定在所需时间窗内若 Statistics 云端同步正在进行openStatsDB()会返回 nil 优雅降级而不是卡死界面统计中枢module_stats_provider 的 3 次查询modules/module_stats_provider.lua 是整条管道的核心它用最少的数据库往返取回首页所有数字一次冷缓存调用只需 3 条 SQL查询作用覆盖窗口查询 1a按日分桶用 CASE WHEN 一次算出今日 / 本周 / 近 7 天 / 本月近约一个月查询 1b简单 SUM 求和本年度 历史总计查询 2取近期活跃日列表交给连击算法自适应回溯几个值得注意的细节页面去重页数按DISTINCT page || || id_book计数同一天重复读某页只算一次周 vs 滚动 7 天「本周」以周一为界「近 7 天均值」则是真正的滚动窗口两者互不干扰按日缓存结果以「YYYY-MM-DD」为键缓存跨过午夜自动失效无需额外刷新逻辑跨进程快照最近一次结果还会镜像到磁盘modules/module_stats_provider.lua冷启动首页第一帧就不至于显示暂无数据阅读连击从日期列表到 Streak 推算连击Streak的计算被单独抽成纯函数位于 infra/sui_streak.lua 的computeCurrentDayStreak()。它的输入只是一份活跃日期列表输出是从今天或昨天往回数、连续有多少天有阅读自适应窗口查询先从最近 90 天开始取DISTINCT date(start_time)如果连击恰好延伸到窗口边缘就把窗口翻倍重试直到连击在窗口内部自然结束modules/module_stats_provider.lua冻结日合并Streak Manager 的「冻结」机制允许你消耗一次冻结来补上昨天的一天断档。冻结日期在推算前合并进活跃日集合全程不写回数据库奖励规则每累计阅读 500 分钟、或连击每达到 5 的倍数各奖励 1 次冻结infra/sui_streak.lua这套设计让首页卡片和「阅读洞察」窗口共享同一份推算逻辑——修一个 bug 只需改一处。热力图数据层两条 SQL 聚合engines/sui_heatmap_data.lua 是热力图专用的数据层只认数字和时间戳不含任何 UI 代码每日数据getDailyReadingData()按id_book/page/day分组后再按天汇总避免重复阅读把时间重复计入返回「日期 → 秒数」的映射时段数据getWeekdayHourReadingData()把阅读时间落到「星期几 × 小时」的 7×24 格子里帮你发现自己是晨型还是夜猫子读者历史分页getWeekBlockRange()把时间轴切成 N 周一个的区块配合getEarliestStartTime()取最早一条记录计算最多能往回翻多少页每日级缓存MAX(start_time)廉价探测没有新阅读就完全跳过重新查询渲染层把秒数变成像素数据变成格子的过程在 engines/sui_heatmap_widgets.lua 中两个纯函数把数据表转成 KOReader 控件同一套构建器同时服务于首页卡片modules/module_heatmap.lua和全屏弹层screens/sui_heatmap_popup.lua日历热力图GitHub 贡献图风格——每格一天、周一开始排周、列顶标月份默认展示 24 周时段热力图7 行周一到周日× 24 列小时的网格一眼看出你的阅读高峰时段五级着色每个格子与整个数据集中最忙的那一天/小时对比按 25% 分位划入 0–4 级灰度没读过的格子保持纯白而非浅灰全屏弹层固定以 26 周为一块可以用箭头翻回更早的历史区块阅读洞察窗口screens/sui_stats_windows.lua则在此基础上提供逐年月度图表与当年/最佳连击统计。管道全景一次刷新发生了什么把上面各环节串起来你在首页看到的每个数字背后是这样一条链路读Config.openStatsDB()只读打开 statistics.sqlite3聚合3 条或 2 条索引友好的 SQL 完成分桶、去重、求和推算日期列表交给computeCurrentDayStreak()纯函数得出连击缓存按日缓存 磁盘快照让重复渲染零成本激励累计时长与连击长度触发冻结奖励写入 SimpleUI 自己的设置画数据层 → 着色分级 → 控件构建秒数最终变成深浅不一的格子整个管道保持了严格的职责分离——数据库访问、日期运算、连击逻辑、UI 绘制各占一个文件——这也是它能以极低开销常驻首页的原因。如果你想深入某一层可以从 modules/module_stats_provider.lua 的注释开始读起每条 SQL 的作用都有详细批注。赞分享【免费下载链接】simpleui.kopluginA highly customizable UI plugin for KOReader that features a home screen, bottom navigation bar, top bar and desktop modules/widgets.项目地址https://gitcode.com/gh_mirrors/si/simpleui.koplugin点击查看免费下载相关推荐Librum阅读统计报告生成个性化阅读数据分析Librum阅读统计报告生成个性化阅读数据分析 你是否曾想过自己一年读了多少本书哪类书籍占据阅读时间最多Librum虽然尚未提供完整的统计功能但通过其内桌面应用跨平台Genesis World 机器人仿真平台从零构建物理AI应用的终极指南Genesis World 机器人仿真平台从零构建物理AI应用的终极指南 你是否曾为机器人仿真开发的复杂性而头疼面对繁琐的物理引擎配置、渲染管线集成和性能优物理引擎具身智能机器人人工智能告别阅读困扰开源阅读鸿蒙版如何重塑你的数字阅读体验告别阅读困扰开源阅读鸿蒙版如何重塑你的数字阅读体验 你是否遇到过这样的情况想读的小说分散在不同平台每个App都要注册登录精心整理的书单在更换设备时丢失创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI File Sorter GPU 加速调优指南:CUDA/Vulkan/CPU 后端选择与环境变量完整清单

AI File Sorter GPU 加速调优指南:CUDA/Vulkan/CPU 后端选择与环境变量完整清单

AI 应用大模型本地部署桌面应用 【免费下载链接】ai-file-sorter Cross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes. 项目地址&#xff1…

2026/10/11 17:52:33 阅读更多 →
运筹学建模训练闭环:从变量分层到影子价格的实战指南

运筹学建模训练闭环:从变量分层到影子价格的实战指南

简介:本资源为高校运筹学课程期末复习专用练习试卷,面向本科生及考研备考学生,聚焦线性规划建模、整数规划、网络计划(PERT/CPM)、对偶理论与运输问题等核心考点,助力系统梳理知识框架与提升解题实战能力。…

2026/10/12 19:50:41 阅读更多 →
【每天一个 Python 小案例04】Python 实现 1 到 100 求和

【每天一个 Python 小案例04】Python 实现 1 到 100 求和

【每天一个 Python 小案例04】Python 实现 1 到 100 求和 希望通过持续记录,把每天学习的 Python 知识逐渐积累起来,通过一个个小案例打好编程基础。 系列:《每天一个 Python 小案例》 第 4 篇: Python 实现 1 到 100 求和 关键词…

2026/10/12 19:55:31 阅读更多 →

最新新闻

claude-mem:为Claude Code打造自动跨会话记忆层

claude-mem:为Claude Code打造自动跨会话记忆层

最近一段时间一直在折腾一件事:让Claude Code在隔了一个晚上之后还能记得我昨天说过“这个模块用Python重写”以及“测试文件统一丢到tests目录”。中间试过各种“外置记忆”方案,最后真正解决问题的,是一个叫claude-mem的开源项目。claude-m…

2026/10/13 1:00:47 阅读更多 →
需求评审报告模板实战:六问六段把模糊需求拦在开工前

需求评审报告模板实战:六问六段把模糊需求拦在开工前

简介:软件需求评审报告模板是一份面向软件项目管理者、需求分析人员及测试团队的规范化Word文档,用于在项目早期对需求完整性、一致性与可行性进行系统性审查,避免后期因需求偏差引发返工。模板内含报告概述、项目概况、需求概述、评审结果、…

2026/10/13 1:00:47 阅读更多 →
Python+Neo4j构建医疗知识图谱问答系统:从实体识别到Cypher查询

Python+Neo4j构建医疗知识图谱问答系统:从实体识别到Cypher查询

简介:面向医疗知识图谱与问答系统入门者的Python项目资料,完整覆盖知识图谱构建、医疗实体/关系数据整理以及基于规则匹配的对话系统实现。资源共58个文件,包含设计报告Word文档、Python源码与医疗数据、项目运行截图等,其中py脚本…

2026/10/13 1:00:47 阅读更多 →
artcraft:将视觉创作拆解为可复用工序的标准化流程

artcraft:将视觉创作拆解为可复用工序的标准化流程

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的不是某个具体工具,而是一种很朴素的冲动——把“art”和“craft”这两个词捏在一起。art是艺术、审美、表达欲,craft是手艺、…

2026/10/13 1:00:47 阅读更多 →
HO-VMD-CNN轴承故障诊断:从参数优化到CNN分类的完整实战

HO-VMD-CNN轴承故障诊断:从参数优化到CNN分类的完整实战

简介:这份资源面向轴承故障诊断方向的研究生、算法工程师与信号处理学习者,提供一套将高阶变分模态分解与卷积神经网络结合的完整Matlab实现方案,用于解决西储大学驱动端振动信号中故障特征提取难、噪声干扰强、分类准确率不稳定等问题。压缩…

2026/10/13 1:00:47 阅读更多 →
400G多模光模块标准详解:SR8与SR4.2架构、链路预算及避坑指南

400G多模光模块标准详解:SR8与SR4.2架构、链路预算及避坑指南

简介:IEEE Std 802.3cm-2020是IEEE发布的以太网标准修正案,面向光通信产品开发与网络系统设计者,解决400Gbps以太网在多模光纤上的物理层规范与管理参数问题。该标准基于IEEE Std 802.3-2018及多个相关修正案,新增400GBASE-SR8与4…

2026/10/13 0:59:45 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →