ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Grocy 4.4.2 更新深度解析:本地化条码识别、购物清单取整与打印设置持久化、权限层级 API 及 iframe 兼容修复

Grocy 4.4.2 更新深度解析:本地化条码识别、购物清单取整与打印设置持久化、权限层级 API 及 iframe 兼容修复 Grocy 4.4.2 更新深度解析本地化条码识别、购物清单取整与打印设置持久化、权限层级 API 及 iframe 兼容修复【免费下载链接】grocyERP beyond your fridge - Grocy is a web-based self-hosted groceries household management solution for your home项目地址: https://gitcode.com/GitHub_Trending/gr/grocy本篇技术指南以 changelog/79_4.4.2_2025-02-28.md 的更新日志为主线逐项拆解 Grocy 4.4.2 中库存、购物清单、自定义字段、通用对话框、API 五大模块的变更。结合仓库源码读者可以掌握 Open Food Facts 插件本地化商品名的实现原理、购物清单取整与打印选项的用户级设置机制、permission_hierarchy只读实体的数据结构与权限映射关系以及该版本在 Home Assistant Add-on 嵌入场景下的兼容性修复。一、更新概览一个面向日常使用体验的补丁版本Grocy 4.4.2 是 2025-02-28 发布的小版本更新上一版本为 4.4.1其更新重点不在新增大型功能而是集中在以下五个方向Stock库存优化内置 Open Food Facts 条码查询插件的本地化商品名支持修复库存条目页产品列被重排后筛选失效的问题。Shopping list购物清单数量向上取整设置现在会同步作用于最后价格总计与清单总价值打印选项显示表头、布局类型等改为按用户持久化保存并支持在config.php中定义全局默认值。Userfields自定义字段修复类型为Link (with title)的自定义字段保存失败问题。General通用修复 Grocy 以iframe方式嵌入例如 Home Assistant Add-on时多数对话框无法工作的问题。API对外暴露只读的permission_hierarchy实体GET /objects/permission_hierarchy提供权限名称与 id 的映射。下文将结合对应源码逐一展开。二、Stock 库存Open Food Facts 插件的本地化商品名优化2.1 变更内容更新日志原文指出Optimized that the built-in Open Food Facts external barcode lookup plugin now uses the localized product name (if provided by the Open Food Facts API, based on the set Grocy language of the current user)即当 Open Food Facts API 返回本地化商品名时Grocy 会根据当前用户设置的语言Grocy locale优先选用对应语言的商品名而不是始终回退到默认的product_name字段。2.2 源码实现插件如何选取本地化字段这一优化落地在 plugins/OpenFoodFactsBarcodeLookupPlugin.php。核心逻辑如下$productNameFieldLocalized product_name_ . substr(GROCY_LOCALE, 0, 2); $webClient new Client([http_errors false]); $response $webClient-request(GET, https://world.openfoodfacts.org/api/v2/product/ . preg_replace(/[^0-9]/, , $barcode) . ?fieldsproduct_name,image_url, . $productNameFieldLocalized, [...]);请求 URL 中通过fields参数显式请求product_name、image_url以及形如product_name_de、product_name_zh的语言后缀字段GROCY_LOCALE常量取自当前会话的语言设置取前两位作为语言代码如de、en、zh响应解析后若product_name_lang字段存在且非空则覆盖默认的product_name$name $data-product-product_name; if (isset($data-product-$productNameFieldLocalized) !empty($data-product-$productNameFieldLocalized)) { $name $data-product-$productNameFieldLocalized; }插件最终返回的映射数组还会根据用户设置product_presets_location_id、product_presets_qu_id预填默认库存位置与采购/库存计量单位未设置时回退到第一个可用位置/单位见同一文件 第 39-51 行。2.3 启用方式该插件并非默认启用需在data/config.php中显式配置参见 plugins/OpenFoodFactsBarcodeLookupPlugin.php 头部注释Setting(STOCK_BARCODE_LOOKUP_PLUGIN, OpenFoodFactsBarcodeLookupPlugin);启用后在库存购买流程中扫描条码即可触发外部查询相比 plugins/DemoBarcodeLookupPlugin.php 这类演示插件Open Food Facts 插件面向真实商品数据。其基类 helpers/BaseBarcodeLookupPlugin.php 负责注入位置、计量单位等上下文数据。2.4 库存条目页产品筛选修复同模块还修复了一个细节问题当用户在库存条目stock entries页面拖拽重排列、导致产品product列不再是第二列时产品筛选器失效。修复后筛选逻辑不再依赖列的固定顺序而是按列身份定位属于表格交互健壮性的提升。三、购物清单数量向上取整联动价格计算3.1 变更内容更新日志原文指出When the shopping list setting (top right corner settings menu) Round up quantity amounts to the nearest whole number is enabled, the Last price (Total) of each shopping list item and the total value of the shopping list are now also scaled up accordingly即在启用将数量金额向上取整到最接近的整数设置后每个清单项显示的数量、该项目的**最后价格总计以及清单总价值**都会按照取整后的数量同步缩放保证数量 × 单价 总计的显示一致性避免出现取整后的数量与金额对不上账的情况。3.2 对应设置项与默认值该设置的用户级键为shopping_list_round_up在 config-dist.php 中有明确的默认值声明与注释DefaultUserSetting(shopping_list_round_up, false); // When enabled, all quantity amounts on the shopping list are always displayed rounded up to the nearest whole number设置开关位于购物清单页面右上角设置菜单中对应视图控件定义在 views/shoppinglistsettings.blade.phpdata-setting-keyshopping_list_round_up属于 Grocy 标准的用户设置控件模式前端通过data-setting-key与用户设置系统双向绑定。3.3 前端如何汇总总价值购物清单总价值的计算与刷新在前端 public/viewjs/shoppinglist.js 中完成。当清单项被移除后会重新拉取uihelper_shopping_list数据并按last_price_total求和Grocy.Api.Get(objects/uihelper_shopping_list? ?query[]shopping_list_id $(#selected-shopping-list).val(), function (items) { $(#total-value).text(items.reduce((x, { last_price_total }) x last_price_total, 0)); RefreshLocaleNumberDisplay(); }, ...);可以看到总价值直接依赖每个清单项的last_price_total最后价格 × 数量。因此取整数量后若不同步缩放last_price_total就会出现数量显示 2取整自 1.3但金额仍按 1.3 计算的不一致。4.4.2 正是补齐了这一联动一旦启用shopping_list_round_up每项的last_price_total与清单汇总值都会按取整后的数量重新缩放保证显示口径统一。四、购物清单打印选项按用户持久化 全局默认值4.1 变更内容更新日志原文指出The print options (show header, layout type etc.) are now saved (as user settings, so global defaults can also defined inconfig.phpas usual)在此之前打印选项是一次性的每次打开打印对话框都需要重新选择现在这些选项作为用户设置持久化保存——每个用户只需配置一次且管理员可以通过config.php的DefaultUserSetting(...)为所有用户定义全局默认值。4.2 打印选项与全局默认值清单与本次变更直接相关的默认设置在 config-dist.php 中DefaultUserSetting(shopping_list_print_show_header, true); // 打印选项显示表头的默认值 DefaultUserSetting(shopping_list_print_group_by_product_group, true); // 打印选项按产品组分组的默认值 DefaultUserSetting(shopping_list_print_layout_type, table); // 打印选项布局类型的默认值table 或 list这三个设置分别对应打印对话框中的三个选项设置键含义可选值 / 默认值shopping_list_print_show_header是否在打印输出中显示表头true/false默认trueshopping_list_print_group_by_product_group是否按产品组分组打印true/false默认trueshopping_list_print_layout_type打印布局类型table表格或list列表默认table4.3 前端实现选项如何读写用户设置打印对话框由 public/viewjs/shoppinglist.js 中的#print-shopping-list-button点击处理器生成。生成对话框时先读取当前用户设置来预选控件状态var checkedPrintShowHeader ; if (BoolVal(Grocy.UserSettings.shopping_list_print_show_header)) { checkedPrintShowHeader checked; }随后在对话框 HTML 中每个选项都带有user-setting-control类与对应的data-setting-keyinput idprint-show-header checkedPrintShowHeader classform-check-input custom-control-input user-setting-control >DefaultUserSetting(shopping_list_print_layout_type, list);这也体现了 Grocy 的设置分层设计DefaultUserSetting定义全局默认单个用户可在界面中覆盖二者互不冲突。五、Userfields修复Link (with title)类型保存失败更新日志原文指出Fixed that saving Userfields of type Link (with title) did not work自定义字段Userfields是 Grocy 允许用户为产品、库存条目等对象附加自定义属性的机制支持多种字段类型。其中 Link (with title) 类型由链接文本与URL两个部分组成。4.4.2 修复了该类型字段在保存时失败的问题——此前多值结构未被正确序列化导致提交被拒绝。修复后该类型可正常保存并在对象编辑界面正常读写。字段类型定义可参考 localization/strings.pot 中的userfield_types词条类型枚举与多语言文案保持一致。六、通用iframe 嵌入场景下的对话框修复更新日志原文指出Fixed that most dialogs didnt work when hosting Grocy embedded in aniframe(affecting e.g. the Home Assistant Add-on)Grocy 常被作为 Home Assistant 的 Add-on 以 iframe 方式嵌入到 Home Assistant 的界面中。此类嵌入场景下对话框modal若依赖顶层窗口级联样式表或焦点管理可能无法正确显示或交互。4.4.2 修复了该问题使得绝大多数对话框在 iframe 内可以正常工作。这对Grocy 前端 Home Assistant 仪表盘组合的家庭自动化用户尤为重要无需在新窗口打开 Grocy就能在 HA 界面内完成库存、购物清单等日常操作。七、API新增只读permission_hierarchy实体7.1 变更内容更新日志原文指出Exposed thepermission_hierarchyentity (read only, GET /objects/permission_hierarchy) to provide a permission name / id mapping4.4.2 将权限层级表作为只读通用实体暴露给 REST API开发者可直接通过GET /objects/permission_hierarchy获取权限名称name与 id 的映射便于外部系统如自定义脚本、Home Assistant 集成以编程方式理解 Grocy 的权限体系而无需硬编码权限 id。7.2 数据模型permission_hierarchy表的递归层级该实体对应的表结构定义在 migrations/0110.sqlCREATE TABLE permission_hierarchy ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT NOT NULL UNIQUE, parent INTEGER NULL -- If the user has the parent permission, the user also has the child permission );这是典型的树形权限模型parent指向父权限拥有父权限即自动拥有全部子权限。初始化数据展示了完整层级骨架根权限ADMINparent NULL一级功能权限USERS、STOCK、SHOPPINGLIST、RECIPES、CHORES、BATTERIES、TASKS、EQUIPMENT、CALENDAR、MASTER_DATA_EDIT均挂在ADMIN之下二级操作权限挂在一级之下例如STOCK_PURCHASE、STOCK_CONSUME、STOCK_INVENTORY、STOCK_TRANSFER、STOCK_OPEN、STOCK_EDIT挂在STOCK之下SHOPPINGLIST_ITEMS_ADD、SHOPPINGLIST_ITEMS_DELETE挂在SHOPPINGLIST之下RECIPES_MEALPLAN挂在RECIPES之下等。同文件还定义了三个相关视图permission_tree用递归 CTE 将层级展开得到根权限 → 全部可达子权限的扁平映射user_permissions_resolved基于permission_tree解析每个用户实际拥有的全部权限名uihelper_user_permissions为 UI 提供user_id、permission_name、has_permission、parent等字段的辅助视图。因此GET /objects/permission_hierarchy返回的是原始层级表id / name / parent外部调用方可以自行递归构建权限树或借助上述视图做权限判断。7.3 API 文档中的引用在 grocy.openapi.json 中多组权限相关端点如用户权限查询接口的description均注明 SeeGET /objects/permission_hierarchyfor a permission name / id mapping说明该实体是理解这些接口返回的permission_id含义的官方索引同时该实体已被列入通用对象实体清单见grocy.openapi.json中对象类型枚举。7.4 使用示例获取完整权限映射只读操作需要具备对象读取权限的用户 API Keycurl -H GROCY-API-KEY: your-api-key \ https://your-grocy-host/api/objects/permission_hierarchy返回结果中每个条目包含id、name、parent三个字段parent为null表示根权限ADMIN。据此即可在外部系统中将任意permission_id反查为可读的权限名如4→STOCK。八、其他说明PWA 与 Grocy Desktop更新日志末尾附带了两条关于官方原生应用体验的提醒PWA渐进式 Web 应用Grocy 的 Web 前端具备响应式布局并且是可安装的 Web 应用PWA但不提供离线能力无需安装任何额外工具即可获得接近原生 App 的移动端体验——Android/Firefox 与 Android/Chrome 上均有官方视频演示。Grocy Desktop一种免维护 Web 服务器的桌面运行方式像普通Windows桌面应用一样使用提供经典.msi安装包与 Microsoft Store 应用两种分发渠道。桌面版本质上仍然是运行 Grocy 本体因此本篇文章所述的 4.4.2 各项修复对桌面版同样适用。九、升级与验证建议升级到 4.4.2 后建议按以下清单快速验证本次修复是否生效库存更换界面语言例如从英文切到德语/中文后用 Open Food Facts 插件扫描商品确认商品名采用对应语言若 API 提供该语言字段进入库存条目页把产品列拖到其他位置再次使用产品筛选器确认仍能正常过滤。购物清单在右上角设置菜单开启Round up quantity amounts to the nearest whole number检查各清单项的Last price (Total)与底部总价值是否随数量取整同步放大。打印在打印对话框中取消勾选显示表头、切换布局类型后关闭再重新打开确认选项被记住重启会话后仍然保持如需全局默认值在data/config.php中覆盖 config-dist.php 列出的shopping_list_print_*三个设置键。自定义字段新建一个类型为Link (with title)的字段并填入链接文本与 URL确认保存不再报错。iframe 嵌入若使用 Home Assistant Add-on 方式部署确认新增/编辑产品等对话框在嵌入界面内可正常打开与提交。API调用GET /objects/permission_hierarchy核对权限 id 与名称的映射关系供外部集成使用。十、小结Grocy 4.4.2 是一个典型的体验打磨型版本它没有引入新的领域功能却扎实地修复了条码识别本地化、购物清单金额口径、打印设置持久化、自定义字段保存、iframe 对话框以及权限 API 可编程性等一批直接影响日常使用与二次开发体验的问题。对于家庭用户最直观的收益是购物清单金额不再对不上账、打印选项一劳永逸对于开发者与集成方GET /objects/permission_hierarchy的开放让 Grocy 的权限体系第一次可以完全通过 API 进行程序化解析配合 grocy.openapi.json 中其他对象端点足以支撑更复杂的自动化与第三方集成场景。【免费下载链接】grocyERP beyond your fridge - Grocy is a web-based self-hosted groceries household management solution for your home项目地址: https://gitcode.com/GitHub_Trending/gr/grocy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表