尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Grocy 2.5.0 特性深度解析:自定义实体、浏览器扫码与库存管理全面升级

Grocy 2.5.0 特性深度解析:自定义实体、浏览器扫码与库存管理全面升级 Grocy 2.5.0 特性深度解析自定义实体、浏览器扫码与库存管理全面升级【免费下载链接】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本文基于 Grocy 仓库中的版本发布文档 changelog/52_2.5.0_2019-09-22.md 展开结合当前仓库的控制器、服务层、路由与配置源码逐项还原 2.5.0 版本带来的新特性、配置参数与 API 变更。读完本文你将掌握 Grocy 中自定义实体Userentities的运作机制、基于 QuaggaJS 的浏览器端条码扫码的启用与限制、产品变体与数量单位换算的实现原理以及库存、食谱、家务、购物清单等模块的升级点与对应配置项可作为升级评估、二次开发与日常运维的参考手册。Grocy 2.5.0 发布于 2019 年 9 月 22 日是本项目早期一次体量较大的功能迭代它不仅引入了自定义实体/对象/列表与设备摄像头扫码两个全新特性还对库存、购物清单、食谱、家务Chores、用户自定义字段Userfields和 API 做了系统性增强。下文按照原版发布文档的脉络逐节展开并在每节补充仓库源码级的实现证据与配置说明。新特性一自定义实体 / 对象 / 列表Userentities / Userobjects2.5.0 的核心亮点是引入了自定义实体Custom entities能力让 Grocy 不再局限于内置的库存、食谱、任务等模块而是可以按需创建任意类型的自定义列表。与 Userfields 的关系自定义实体建立在 Userfields用户自定义字段机制之上你可以先定义一组 Userfield字段再把它们挂到某个自定义实体上从而构成一张真正意义上的自定义数据表。每一个自定义实体下的具体记录被称为Userobject用户对象。从实现上看migrations/0085.sql 中创建了userentities表同时userobjects表通过userentity_id外键关联到具体实体services/UserfieldsService.php 的GetEntities()方法会把所有userentities表中的记录以userentity-{name}的命名形式合并进可用的实体清单供 Userfield 挂载使用foreach ($this-DB-userentities()-orderBy(name, COLLATE NOCASE) as $userentity) { $userEntities[] userentity- . $userentity-name; }使用路径与路由映射在界面中自定义实体位于Manage master data主数据管理→ Userentities 菜单下创建实体后即可在侧边栏获得一个独立的菜单入口直接进入该实体的对象列表页。对应的 Web 路由定义在 routes.php 中可以看到一整套针对自定义实体/对象/字段的页面路由$group-get(/userfields, [GenericEntityController::class, UserfieldsList]); $group-get(/userfield/{userfieldId}, [GenericEntityController::class, UserfieldEditForm]); $group-get(/userentities, [GenericEntityController::class, UserentitiesList]); $group-get(/userentity/{userentityId}, [GenericEntityController::class, UserentityEditForm]); $group-get(/userobjects/{userentityName}, [GenericEntityController::class, UserobjectsList]); $group-get(/userobject/{userentityName}/{userobjectId}, [GenericEntityController::class, UserobjectEditForm]);控制器 controllers/GenericEntityController.php 中的UserobjectsList()会按userentity_id取出该实体下的全部对象并同时加载userentity-{name}上挂载的 Userfield 及其取值用于列表渲染与编辑表单return $this-RenderPage($response, userobjects, [ userentity $userentity, userobjects $this-DB-userobjects()-where(userentity_id :1, $userentity-id), userfields UserfieldsService::GetInstance()-GetFields(userentity- . $args[userentityName]), userfieldValues UserfieldsService::GetInstance()-GetAllValues(userentity- . $args[userentityName]) ]);典型场景包括自建一份保险箱物品清单书籍收藏清单圣诞礼物采购计划等配合复选框、数字、链接等 Userfield 类型即可获得带独立侧边栏入口、可编辑、可搜索的数据管理页面。仓库还提供了一套供演示用的示例实体数据由 services/DemoDataGeneratorService.php 生成对应页面地址形如/userobjects/exampleuserentity。新特性二使用设备摄像头扫码浏览器端条码识别2.5.0 在任意支持条码输入的字段当时主要用于产品拣选/选择场景右侧新增了一个相机按钮点击后可直接调用设备摄像头进行条码识别无需额外硬件。实现方式与限制该功能基于QuaggaJS实现摄像头视频流的解析完全在浏览器本地客户端完成条码数据不会上传到服务器属于完全离线的识别方案。受浏览器安全策略getUserMedia API限制仅当 Grocy 通过 HTTPS 安全连接提供服务时摄像头扫码才可用HTTP 环境下浏览器会直接拒绝授予摄像头权限。这是部署时需要特别注意的前提条件。若不需要此功能可在config.php中设置DISABLE_BROWSER_BARCODE_CAMERA_SCANNING为true将其整体关闭默认false。故障排查页面与配置演进当条码识别不稳定时可使用内置的条码扫描器测试页页面路由为/barcodescannertesting对应 routes.php 中的SystemController::BarcodeScannerTesting该页面视图文件为 views/barcodescannertesting.blade.php可用于调校摄像头取景与识别参数。需要注意配置项的命名演变在后续版本 3.2.0 中DISABLE_BROWSER_BARCODE_CAMERA_SCANNING被重命名为FEATURE_FLAG_DISABLE_BROWSER_BARCODE_CAMERA_SCANNING见 changelog/66_3.2.0_2022-02-11.md并在 config-dist.php 中与另一项FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA相机自动开启手电筒默认true并列出现。升级到较新版本时请使用新名称配置Setting(FEATURE_FLAG_DISABLE_BROWSER_BARCODE_CAMERA_SCANNING, false); // 设为 true 关闭设备摄像头扫码浏览器 API Setting(FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA, true); // 设备支持时自动开启手电筒库存模块升级产品变体、单位换算与界面增强2.5.0 对库存模块做了大量增强涉及产品模型、数量单位、打印、概览页交互和配置开关等多个层面。产品变体嵌套产品 / Parent Product产品现在可以拥有变体即定义父产品与子产品的层级关系在产品编辑页可为产品指定其父产品层级仅允许一层——一个产品如果已被其他产品用作父产品则它自身不能再设置父产品。父产品与子产品都是普通产品各自独立管理库存这一点没有差异。在库存概览页上父产品的数量旁会以 sigma∑符号显示聚合后的总数量即父产品自身库存与各子产品库存的合计。在食谱需求判定中如果食谱需要某个父产品只要仓库中有足够的子产品库存该需求同样视为满足即子产品可以替代父产品满足食谱需求。从源码看products表通过parent_product_id字段表达该层级关系相关迁移脚本与字段定义分布在 migrations/0192.sql、migrations/0100.sql 等文件中库存服务 services/StockService.php 的GetProductDetails()、AddProduct()等方法在处理产品时都会读取父产品配置以计算聚合数量与替代满足逻辑。产品编辑页视图 views/productform.blade.php 中提供了父产品的选择控件。数量单位可关联单位换算 / Quantity Unit Conversion数量单位Quantity Unit之间现在可以建立关联换算关系在数量单位编辑页可为每个单位定义默认换算系数。产品会继承单位间的默认换算同时每个产品也可以自定义、覆盖默认换算系数。这为后续食谱配料使用任意产品相关单位、以及库存数量的跨单位折算提供了基础。路由层面可以看到相应的页面与数据接口$group-get(/quantityunitconversion/{quConversionId}, [StockController::class, QuantityUnitConversionEditForm]); $group-get(/quantityunitconversionsresolved, [StockController::class, QuantityUnitConversionsResolved]);后者/quantityunitconversionsresolved会展示换算关系最终解析后的完整结果方便核对继承与覆盖后的实际换算系数。Location Content Sheet地点库存表打印库存概览页顶部新增了打印地点库存表Location Content Sheet的按钮可以按地点输出当前库存清单。它的设计初衷是把纸单挂在存放地点日常手工记录消耗量之后再回填到 Grocy 中。对应页面路由为/locationcontentsheet见 routes.php视图为 views/locationcontentsheet.blade.php。库存概览页交互增强快捷操作更多/右键菜单context-menu中新增以当前产品打开采购 / 消耗 / 盘点页的选项并以弹窗popup/dialog方式预填当前产品减少操作跳转。加入购物清单可将当前产品直接添加到某个购物清单。反向搜索食谱可搜索包含当前产品的食谱。撤销库存流水库存操作成功后的提示消息中新增Undo撤销按钮可将刚发生的采购/消耗/盘点操作回滚——此前撤销功能仅存在于采购、消耗、盘点页面本身现在概览页的快捷操作也能享受同样能力。API 层对应的撤销端点为POST /stock/bookings/{bookingId}/undo见 routes.php 中StockApiController::UndoBooking。行刷新优化任何库存变动后概览页中对应产品的表格行会被正确刷新保证数据一致性。新的配置项与 Sub Feature Flags2.5.0 新增了一个库存相关的行为开关并引入了一组子功能开关用于裁剪 UIFEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT控制已开封产品是否计入最低库存量判定。默认true即开封产品默认会被视为缺货如需维持旧行为请显式改为false。以下子功能开关均默认true未配置时不改变任何现有行为设为false会隐藏对应的 UI 元素FEATURE_FLAG_STOCK_PRICE_TRACKING关闭产品价格追踪FEATURE_FLAG_STOCK_LOCATION_TRACKING关闭产品存放位置追踪FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING关闭产品保质期追踪FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING关闭产品开封状态追踪这些子开关在当前 config-dist.php 中仍然存在并且随版本演进扩展出了更多同类开关如FEATURE_FLAG_STOCK_PRODUCT_FREEZING、FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_FIELD_NUMBER_PAD等统一集中在Sub feature flags配置段例如Setting(FEATURE_FLAG_STOCK_PRICE_TRACKING, true); Setting(FEATURE_FLAG_STOCK_LOCATION_TRACKING, true); Setting(FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING, true); Setting(FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING, true);其他库存修正与字段扩展产品描述支持富文本格式HTML/WYSIWYG 编辑器与食谱描述一致。产品新增热量字段kcal按库存数量单位计为后续食谱卡路里统计提供数据基础。当产品启用了允许部分单位入库Allow partial units in stock时采购到库存数量单位的换算系数Factor purchase to stock quantity unit现在支持小数。修正了开启皮重tare weight处理的产品在采购/消耗/盘点时的成功提示金额显示问题。修复了产品卡片上损耗率Spoil rate与平均货架寿命Average shelf life在多数情况下计算错误的问题。产品编辑页保存后现在总是返回之前的页面避免打断操作流。购物清单备注与打印每个购物清单新增备注字段Notes同样使用 HTML/WYSIWYG 编辑器用于保存任意附加说明。购物清单支持直接打印新增/删除清单按钮旁边出现了打印按钮。结合后续版本的打印能力可在 config-dist.php 中看到面向清单打印的布局类默认用户设置如shopping_list_print_show_header、shopping_list_print_group_by_product_group、shopping_list_print_layout_type说明打印格式是可配置的。食谱模块卡路里、价格系数与搜索增强跨单位配料依托新引入的数量单位换算机制食谱配料现在可以使用与产品相关的任意单位用量会根据单位关系的换算系数自动计算。卡路里统计基于产品新增的热量字段食谱头部紧邻成本处会根据所选份数显示整道食谱的卡路里。价格系数price factor每个食谱配料新增价格系数选项默认1配料的最终成本 原成本 × 该系数。文档特别给出了典型用法例如在仅检查是否有一种单位在库存即只按整件判断的香料类配料上将系数设为一个很小的值避免把一整罐胡椒的完整价格计入一道菜的食谱成本。搜索增强食谱概览页的搜索框现在也会匹配配料的商品名称——也就是说可以直接用产品名反向搜出包含该产品的所有食谱。修复当某食谱已被加入膳食计划meal plan后被删除时膳食计划页面此前可能无法加载此问题在本版本修复。家务Chores模块用户分配、到期滚动与自动消耗任务分配Assignments家务现在可以分配给用户每个家务可配置不同的分配类型assignment type。仓库中 services/ChoresService.php 明确定义了全部分配类型常量const CHORE_ASSIGNMENT_TYPE_IN_ALPHABETICAL_ORDER in-alphabetical-order; const CHORE_ASSIGNMENT_TYPE_NO_ASSIGNMENT no-assignment; const CHORE_ASSIGNMENT_TYPE_RANDOM random; const CHORE_ASSIGNMENT_TYPE_WHO_LEAST_DID_FIRST who-least-did-first;分别对应按字母顺序轮流不分配随机谁做得最少谁先来。CalculateNextExecutionAssignment()方法会结合上次执行人、assignment_config可分配的用户集合与分配类型计算下一次的执行人当类型为random时从可用用户中随机选择if ($chore-assignment_type self::CHORE_ASSIGNMENT_TYPE_RANDOM) { if (count($assignedUsers) 1) { $nextExecutionUserId array_shift($assignedUsers)-id; } else { $nextExecutionUserId $assignedUsers[array_rand($assignedUsers)]-id; } }在家务概览页上列表可以按分配给当前登录用户或任意其他用户进行过滤。到期滚动Due Date Rollover每个家务新增到期日期滚动选项启用后家务永远不会逾期——每当到期日到达到期日会自动向后顺延一天shift forward适合每天/周期要做、但不能算逾期的常态化任务。执行时自动消耗产品家务新增执行家务时消耗产品Consume product on chore execution选项记录一次家务执行时自动消耗指定产品。源码中 services/ChoresService.php 的执行逻辑包含如下分支if ($chore-consume_product_on_execution 1 !empty($chore-product_id))即在consume_product_on_execution为真且配置了product_id时触发库存消耗。概览页过滤保持从家务概览页记录执行后之前应用的过滤条件会被重新应用例如你过滤为只看逾期家务执行后该家务不再逾期它会立即从列表消失交互反馈更即时。设备与用户字段Equipment Userfields修复增强设备Equipment修复了删除按钮偶尔没有删除当前选中设备项的问题。Userfield 新增类型Select list选择列表预定义一组可选值实体对象上可单选或多选。Link链接单行文本框输入内容在展示时渲染为可点击链接。对应的类型常量在 services/UserfieldsService.php 中可查USERFIELD_TYPE_LINK link。复选框显示优化类型为 Checkbox 的 Userfield在表格中勾选后现在渲染为勾选标记对勾而不再显示1。购物清单联动产品的 Userfield 现在也会渲染在购物清单上针对引用了产品的清单项。修复类型为Preset list的 Userfield 此前始终显示标题Product group而非配置的自定义标题本版本修复。通用改进与其他周数显示配置新增CALENDAR_SHOW_WEEK_OF_YEAR配置项控制日历是否显示周数默认true。该配置在 config-dist.php 中与CALENDAR_FIRST_DAY_OF_WEEK相邻定义// If calendars should show week numbers Setting(CALENDAR_SHOW_WEEK_OF_YEAR, true);修复日期时间选择器此前未遵循CALENDAR_FIRST_DAY_OF_WEEK配置本版本修复。禁用功能开关时的入口页处理优化了在禁用某些功能开关时应用选择哪个入口页entry page的逻辑。环境变量布尔值解析通过环境变量提供的布尔型设置字符串true/false现在可以被正确解析。这对应 config-dist.php 顶部说明的配置覆盖优先级/data/settingoverrides下的同名.txt文件 以GROCY_为前缀的同名环境变量 配置文件默认值。图片自动缩放所有已上传的图片当时针对产品和食谱在服务端返回时会被自动缩放到合适尺寸以提升页面加载速度。这需要 PHP 的gd扩展若未安装图片不会被缩放。数量单位复数形式测试数量单位编辑页新增测试按钮可验证当前语言的复数形式仅当当前语言需要多于 2 种复数形式时显示。对应的独立测试页面路由为/quantityunitpluraltesting见 routes.php 中StockController::QuantityUnitPluralFormTesting。登录页净化登录页上现在隐藏了侧边栏与顶部导航的所有菜单。新翻译新增丹麦语Danish与荷兰语Dutch翻译。演示站点本地化机制调整预发布版演示现在也提供全部已支持语言完成度达到 80% 的语言文件会每小时从翻译平台自动拉取一次实现翻译的即时预览。演示站点 URL 分为稳定版演示与当前 master 分支演示两个入口。API 改进与不兼容性说明非破坏性2.5.0 新增了多个 REST 端点均为向后兼容的非破坏性变更通用对象搜索新增GET /objects/{entity}/search/{searchString}按名称搜索对象包含式匹配。购物清单相关由社区贡献POST /stock/shoppinglist/add-product向购物清单添加产品。POST /stock/shoppinglist/remove-product从购物清单移除产品。对应控制器方法AddProductToShoppingList/RemoveProductFromShoppingList位于 controllers/Api/StockApiController.php底层服务实现在 services/StockService.php 的AddProductToShoppingList($productId, $amount, $quId, $note, $listId)。家务分配计算POST /chores/executions/calculate-next-assignments为单个或全部家务重新计算下一次用户分配。按条码操作库存新增一组按条码直操作端点方便扫码枪/扫码设备直接驱动库存变更POST /stock/products/by-barcode/{barcode}/add按条码入库。POST /stock/products/by-barcode/{barcode}/consume按条码出库消耗。POST /stock/products/by-barcode/{barcode}/inventory按条码盘点。POST /stock/products/by-barcode/{barcode}/open按条码将产品标记为已开封。同时新增GET /stock/products/by-barcode/{barcode}产品详情作为配套查询端点。这些路由在 routes.php 中均有注册对应的控制器方法如AddProductByBarcode、ConsumeProductByBarcode、InventoryProductByBarcode、OpenProductByBarcode。库存流水查询与行为修正新增GET /stock/bookings/{bookingId}查询单条库存流水记录。图片缩放扩展GET /files/{group}/{fileName}现在也支持图片缩放参数与上文提到的图片自动缩放能力配套。默认保质期自动计算通过stock/product/{productId}/add或stock/product/{productId}/inventory添加产品时如果省略保质期且该产品设置了默认保质期天数Default best before days则保质期会按该天数计算得出此前一律使用今天未提供日期且产品未设置默认保质期时仍沿用今天。stock_amount规范化GET /stock/products/{productId}返回的stock_amount字段在对应产品无库存时现在返回0而非null方便客户端做数值运算。/system/db-changed-time修复此前该端点几乎总是返回当前时间原因是返回的是数据库文件的修改时间而会话信息追踪导致数据库文件在每次请求时都被实际改写。本版本改为显式不更新数据库文件的修改时间针对会话追踪场景使该接口重新能够用于判断数据是否发生变化。API Key 传递方式扩展API Key 现在除了通过GROCY-API-KEY请求头传递外也可以通过同名查询参数传递?GROCY-API-KEY...为脚本、网页端与不支持自定义请求头的客户端提供了更灵活的鉴权方式。升级与配置小结2.5.0 是一次以数据模型扩展 交互体验 API 能力为主线的版本新增功能自定义实体Userentities与浏览器摄像头扫码二者都通过配置开关可完全裁剪FEATURE_FLAG_DISABLE_BROWSER_BARCODE_CAMERA_SCANNING。数据模型产品新增父产品变体层级与热量字段数量单位新增换算关系为食谱跨单位配料与卡路里统计铺路。行为开关新增FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT及一组默认开启的子功能开关价格/位置/保质期/开封追踪。家务体系引入用户分配随机、按字母顺序、谁做得最少先来、到期滚动与执行时自动消耗产品。API新增 10 余个端点与参数、行为修正均为非破坏性变更可放心升级全部端点可通过仓库根目录下的 grocy.openapi.json 查阅正式 OpenAPI 定义。若需要逐版本核对后续演进例如相机开关在 3.2.0 的重命名可参考 changelog 目录下按版本号排序的发布文档并以 config-dist.php 中实际保留的配置项名称为准。【免费下载链接】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),仅供参考
返回列表