)
Wekan Statistics 视图解析基于服务端聚合的看板状态总览Stats View / Tilastot【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan在 Wekan 中Statistics芬兰语 Tilastot是与 Swimlanes、Lists、Calendar、Gantt、Table 并列的一种全宽看板视图从看板头部视图切换菜单进入后它一次性展示看板的卡片加载模式、泳道/列表/卡片/标签/成员/自定义字段数量以及工时汇总让你在打开任何看板之前先“一眼看清它有多大、处于什么状态”。读完本文你将掌握 Statistics 视图的完整字段含义、为什么它的计数必须由服务端boardStatus方法计算自适应懒加载下的正确性问题以及卡片加载模式auto/lazy/all的判定逻辑与源码位置。一、Statistics 是什么从哪进入Statistics 是看板视图切换器看板头部 caret 菜单中的一个全宽视图与其他看板视图一样占满整个看板区域见 boardBody.jade 中isViewStats → statsView、isViewTime → timeView的分支渲染视图菜单本身在 boardHeader.jade。它展示的是一组“状态快照”字段含义Card loading本看板当前实际生效的卡片加载模式Lazy (only visible cards)或All cards若实例使用自适应默认值且该模式是自动选定的会附带(Automatic …)后缀Swimlanes看板内未归档泳道数Lists未归档列表数Cards未归档卡片数Archived cards已归档卡片数Labels看板定义的标签数Members未停用的成员数Custom fields属于该看板的自定义字段数模板 statsView.jade 就是一张两列表格左列是 i18n 标签board-status、board-status-loading-mode等键右列是statsNum(key)读出的数值数据未返回前显示…占位符。注意版本演进工时汇总Total time spent / Cards with time spent / Overtime cards曾经是 Statistics 视图内的第二个章节现已拆分为独立的Time 看板视图timeView.jade / timeView.js但两者的汇总数据仍来自同一个服务端方法timeView.js的注释明确说明了这一拆分。二、为什么计数要在服务端算boardStatus方法这是本视图最关键的设计点。所有计数都来自一个单独的 Meteor 方法boardStatus(boardId)而不是浏览器本地数据。原因在于自适应卡片加载大看板在 lazy 模式下客户端 Minimongo 只持有可见窗口内的卡片通过boardCardsWindowpublication 按列表分批加载如果在本地对卡片集合做count()得到的只是可见窗口的大小而不是看板的真实规模。方法实现位于 server/publications/boards.js其调用链与取值逻辑如下权限校验先取看板文档要求board.isVisibleBy({ _id: this.userId })即任何能看见该看板的成员都可以读取状态否则抛not-authorized卡片范围卡片计数会并入看板的subtasksDefaultBoardId子任务默认所在看板即boardIds数组内archived: false/archived: true分别countAsync()其余计数泳道、列表通过ReactiveCache查询未归档文档后取length标签数直接读board.labels成员数过滤掉isActive false的成员工时汇总只拉取真正记录了工时的卡片spentTime 0且仅取spentTime与isOvertime两个字段再在内存中求和、计数、筛选超时的isOvertime卡片——源码注释强调这样即使在大型看板上也保持低成本返回结构{ mode, lazy, swimlanes, lists, cards, archivedCards, labels, members, customFields, timeSpentTotal, cardsWithTimeSpent, overtimeCards }。客户端侧statsView.js 在onCreated中建立ReactiveVar并用autorun监听Session.get(currentBoard)切换看板时自动重新Meteor.call(boardStatus, boardId, ...)把返回值存入status每个 helperswimlaneCount、listCount等都通过statsNum(key)从该变量取值未就绪时显示…。三、卡片加载模式的判定auto/lazy/all与阈值 500Statistics 视图第一行的 “Card loading” 展示的是该看板实际生效的模式其判定与服务端加载逻辑共用同一套函数models/lib/cardsLoading.js全局模式globalCardsMode()读自Meteor.settings.public.cardsLoading缺省为auto见 boards.js 的注释all把全部卡片/检查项推入 Minimongolazy一张都不推、各列表按需加载可见窗口auto默认按看板规模逐板判定阈值globalLazyThreshold()读自Meteor.settings.public.cardsLoadingLazyThreshold非法值回退到DEFAULT_LAZY_THRESHOLD 500boardStatus中的lazy布尔值由mode lazy || (mode ! all effectiveBoardCardsMode(auto, cards, threshold) lazy)得出——也就是说在默认auto模式下活跃卡片数达到阈值默认 500的看板走懒加载小的看板全量加载。前端 statsView.js 的loadingModeLabelhelper 据此拼接文案const inEffect s.lazy ? TAPi18n.__(cards-loading-lazy) : TAPi18n.__(cards-loading-all); return s.mode auto ? ${inEffect} (${TAPi18n.__(cards-loading-auto)}) : inEffect;即当全局配置为auto时显示形如 “All cards (Automatic …)” 或 “Lazy (only visible cards) (Automatic …)”提示用户该模式是系统根据看板大小自动选择的而非手工设定。这也解释了原文档的表述大看板懒加载、小看板全量加载。四、可用性设计可选文本与只读Statistics 视图在交互上有两个专门处理都围绕“这是一份可供复制的状态报告”文本可选择看板画布使用dragscroll类实现拖拽滚动会吞掉指针/触摸拖动事件。为此 statsView.js 注册了mousedown与touchstart的stopPropagation()使事件不落到画布层浏览器原生选择即可生效——鼠标拖选、触屏长按选择均支持任何数值计数、总工时都能高亮复制。配套样式 statsView.css 对整个视图设置了user-select: text内容区限宽 900px 居中数值列用text-align: end保证 LTR 右对齐、RTL 左对齐方便从数字末尾读起只读该视图不提供任何写操作打开它不会修改看板的任何数据——所有请求只有一次boardStatus读调用。拆分出去的 Time 视图同样复用这套选择逻辑timeView.js 中的同名事件处理器并额外调用boardChartData(boardId, time)方法获取按成员/按卡片的工时明细与截止日期剩余时间合计PDF/Excel 导出复用其他报表图表共用的chartKey: time导出管线。五、小结与延伸阅读Statistics 视图的价值不在于“数字多”而在于它把看板规模与实例性能状态加载模式放在同一张表里并保证在懒加载下依然准确计数走服务端countAsync()工时只拉spentTime 0的卡片二者都不会随看板变大而线性变慢。视图模板与逻辑statsView.jade、statsView.js、statsView.css工时视图timeView.jade、timeView.js视图分支渲染与切换boardBody.jade、boardHeader.jade服务端方法boardStatusboards.js加载模式与阈值cardsLoading.js相关功能文档Swimlanes · Lists · Cards · Custom fields【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考