更新记录
1.0.0(2026-09-19) 下载此版本
首次发布 SlotBoard X。支持单日多资源预约时段展示、独占与共享容量、预约前后缓冲、停用时段及冲突原因提示;提供受控候选、数据版本重校验和可取消的分段网格计算。组件仅向业务页面返回预约候选,不创建订单。
平台兼容性
uni-app(5.24)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.24)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| 153.0.8010.48 | - | 16.0 | - | - | - |
SlotBoard X · 单日多资源预约组件
1.0.0,适用于 uni-app x 的 easycom 组件及 UTS 规则 API。传入当天快照,显示每个资源的候选时段、整段最低余量和冲突原因,再把合法候选交给业务页面。组件不登录业务账号、不请求业务网络、不持久化预约、不创建订单。
授权价格以插件市场页面为准,普通授权与源码授权的范围按平台规则执行。
包含独占/共享容量、准备与清理缓冲、停用区间、版本重校验,以及可取消的主线程分段网格计算。分段不是后台线程:准备阶段与单个候选计算仍同步,取消停止尚未开始的工作。
安装与当前验证边界
将组件包中的 uni_modules/nubeslove-slotboardx 复制到 uni-app x 工程同名位置。使用 HBuilderX 5.24.2026081301;engines 是工具版本要求,不代表所有更高版本已逐一测试。不需要 npm 运行依赖。组件名为 <nubeslove-slotboard-x>;公开方法与类型仅从 @/uni_modules/nubeslove-slotboardx 导入。
配套演示包是独立 uni-app x 工程,其 manifest.json 的 appid 留空。请使用自己有权限的 DCloud 应用标识;不要复制作者 AppID。DCloud 构建与付费授权可能需要联网。
截至本候选文档编写时,HBuilderX 5.24.2026081301(VDOM)/ Windows 11 / 隔离 Chrome 上,干净源码演示的 Web 正式发行与 15/15 实际交互已通过,含真实 320px 布局且页面异常为 0。同步 UTS 核心的 Web 基线与 Android 16/API 36、x86_64 模拟器均已运行;本轮 Android 同步 1812/50/11/5/3 与分段 11 组、8,741 行对照通过,Web 分段也有 11 组、8,741 行证据。核心与干净发行结果保留作为基线;修复后的商品 UI 结果如下。
1.0.0 已包含以下组件修复:资源网格串行启动,每次只准备一个资源,终态后用 16ms 定时器安排下一资源,并保留 epoch 取消与旧结果淘汰;父页快照、模型和禁用状态的监听使用 flush: 'pre',避免父页批量更新 props 时同步触发事件或渲染造成重入;运行中的网格重绘以 50ms 定时器合并,全部任务结束时立即发布最终结果;确认条件直接核对当前原始快照和模型 props,在监听器尚未处理新值时也会禁止确认旧选择。16ms 与 50ms 是调度配置,不是实测响应时间或设备性能承诺。
修复后的最终组件在上述 Web 环境与 Google APIs Android 16/API 36 无窗口模拟器(ARM64 原生桥转译、VDOM)分别通过 15/15 实际商品场景;Web 页面异常为 0。Android 二十资源取消后重新完成 13,220 格的整个压力场景约 36 秒,仅代表此次模拟器实测,不承诺其他设备耗时。平台加密授权仍为 NOT RUN。 未验证 iOS、HarmonyOS、小程序、传统 uni-app、Android 真机或其他系统版本;本包不是平台授权凭证。
最小接入
以下内容可放入 uni-app x 的 .uvue 页面。页面提供纵向滚动容器,保证时段表下方的确认/取消控件可以到达。App VDOM 页面默认不会滚动,需显式使用有可用高度的 scroll-view;此例以 flex: 1 铺满页面,嵌入其他布局时也要给滚动区域明确高度。见 官方页面滚动说明。演示父页接受组件提出的候选,并单独接收已校验选择;业务侧不要用 modelValueJson 非空判断可以下单。
<template>
<scroll-view style="flex: 1" direction="vertical">
<nubeslove-slotboard-x
:input-json="inputJson"
:model-value-json="modelValueJson"
@update:modelValueJson="acceptModel"
@change="onChange"
@confirm="onConfirm"
/>
</scroll-view>
</template>
<script setup lang="uts">
const inputJson = ref('{"schemaVersion":1,"serviceDate":"2026-10-01","timezone":"UTC+08:00","resources":[{"id":"court-a","label":"球场 A","capacity":1}],"bookings":[{"id":"b1","resourceId":"court-a","startMinute":600,"endMinute":660,"quantity":1}],"blocked":[],"rules":{"openMinute":480,"closeMinute":1200,"stepMinute":15,"minDuration":30,"maxDuration":180,"bufferBefore":0,"bufferAfter":0},"dataVersion":"v1","loading":false}')
const modelValueJson = ref('null')
const selection = ref<UTSJSONObject | null>(null)
function acceptModel(value: string) { modelValueJson.value = value }
function onChange(value: UTSJSONObject | null) { selection.value = value }
function onConfirm(value: UTSJSONObject) {
// 把候选交给业务层;由服务端读取最新数据、重新校验并原子写入。
console.log('收到候选,尚未下单', JSON.stringify(value))
}
</script>
示例中 10:00–11:00 已占用;无缓冲时 11:00 开始、时长 60 分钟、数量 1 可选。增加 15 分钟后缓冲并更新快照后,应等待新结果再继续。
组件属性与事件
| 属性 | 类型 / 默认值 | 作用 |
|---|---|---|
inputJson |
必需 string |
完整 BoardInput 快照的 JSON;结构错误显示 INVALID_INPUT |
modelValueJson |
string / 'null' |
父页持有的候选尝试 JSON;父页可设置或清空 |
title |
string / '预约时段' |
标题 |
initialDuration |
number / 60 |
无受控候选时的时长建议,单位分钟;不绕过规则 |
initialQuantity |
number / 1 |
无受控候选时的数量建议 |
disabled |
boolean / false |
撤销有效选择并禁止确认 |
confirmText |
string / '确认时段' |
按钮文案;不会改变仅发出候选的行为 |
| 事件 | 载荷 | 父页处理 |
|---|---|---|
update:modelValueJson |
string |
候选或 null 的 JSON;回写属性表示接受,尝试可能非法 |
change |
UTSJSONObject \| null |
当前合法选择带当前 dataVersion;收到 null 立即撤销下一步 |
confirm |
UTSJSONObject |
点击后再次校验成功的候选;业务下单另行处理 |
validation-error |
Validation |
当前拒绝原因,不等于订单失败 |
cancel |
无 | 用户主动取消;任务停止并撤销选择 |
busy-change |
boolean |
当前组件任务是否在计算 |
父页新 modelValueJson 是权威输入,允许重新设置相同候选。拒绝回写时,不能确认未被父页接受的新尝试。异步回写由父页自行按请求序号丢弃旧响应;组件无法从相同 JSON 推断父页意图的时间先后。快照变化时先撤销有效选择,再用新数据重验保留的尝试;父页清空模型会停止当前排队任务。
数据与规则
全部类型从根入口导出,完整字段见 core/types.uts。
| 数据 | 字段 |
|---|---|
BoardInput |
schemaVersion: 1, serviceDate, timezone: 'UTC+08:00', resources, bookings, blocked, rules, dataVersion, loading;可选 stale |
Resource |
id, label, capacity |
Booking |
id, resourceId, startMinute, endMinute, quantity |
BlockedInterval |
resourceId, startMinute, endMinute |
Rules |
openMinute, closeMinute, stepMinute, minDuration, maxDuration, bufferBefore, bufferAfter |
Candidate |
resourceId, startMinute, endMinute, quantity;可选 dataVersion |
Validation |
valid, code, messageKey, remainingCapacity, dataVersion, details |
- 固定 UTC+8 单日,日期为有效公历
YYYY-MM-DD,不做系统时区换算;不支持跨日、任意时区、夏令时。 - 分钟为整数,原始预约/候选/停用满足
0 <= startMinute < endMinute <= 1440;半开区间[start, end),相邻无缓冲预约不重叠。 - 资源和预约 ID 分别唯一且引用存在;容量和数量为正安全整数。最多 20 个资源、2,000 条预约、2,000 条停用,超限拒绝,不截断。
- 共用营业时间、步长、时长范围和前后缓冲。起点锚定营业起点;持续时间也须是步长整数倍。已有预约无需对齐网格。
- 候选与已有预约均扩展缓冲;停用区间不扩展。候选含缓冲的整个有效区间须位于营业时间内。
- 按资源扫描同时占用峰值,同刻结束先于开始。任何资源的已有预约已超容量时,整个快照返回
INVALID_INPUT。 remainingCapacity是加入候选前的整段最低余量,仅OK/CAPACITY_EXCEEDED有数值;其余为null,不可显示为可预约。dataVersion是调用方提供的非空快照标识,不能证明服务器实时性。数据或规则变化时传入完整新快照并更新版本;加载标记loading: true、已知过期标记stale: true。加载中的结构仍须合法。
客户端校验用于界面反馈。并发下单必须由接入方服务端读取最新占用、校验并原子写入。
| 错误码 | 含义 |
|---|---|
OK |
当前本地快照允许该候选 |
INVALID_INPUT |
结构、引用、日期、数值、重复 ID、上限或已有超容量错误 |
DATA_LOADING |
正在加载 |
DATA_STALE |
快照过期,或候选版本与快照不同 |
DURATION_INVALID |
持续时间超范围 |
STEP_INVALID |
起点或持续时间未对齐步长 |
OUT_OF_HOURS |
含缓冲的候选超出营业时间 |
RESOURCE_BLOCKED |
含缓冲的候选与同资源停用相交 |
CAPACITY_EXCEEDED |
候选数量超过最低余量 |
校验优先级:输入结构 → loading → stale → 已有容量 → 候选结构 → 候选版本 → 时长 → 步长 → 营业 → 停用 → 容量。
同步 API 与会话
import {
validateCandidateJson,
validationToObject,
createValidationSessionJson,
} from '@/uni_modules/nubeslove-slotboardx'
const result = validateCandidateJson(inputJson, candidateJson)
const resultObject = validationToObject(result)
const session = createValidationSessionJson(inputJson)
session.selectJson(candidateJson)
session.updateJson(nextInputJson)
const snapshot = session.getState()
session.clear()
| API | 契约 |
|---|---|
validateCandidateJson(inputJson, candidateJson) |
JSON 字符串边界;解析失败进入非法输入校验 |
validateCandidate(input, candidate) |
JSON 值入口,含对象、数组、标量、null;拒绝不合法结构 |
validateTypedCandidate(input, candidate) |
结构完整的 BoardInput / Candidate UTS 类型实例入口 |
boardToObject / candidateToObject |
类型实例转为 UTSJSONObject,不通过 JSON 往返掩盖非有限数字 |
validationToObject |
转为可序列化对象,无诊断时省略 details |
createValidationSession / createValidationSessionJson |
创建隔离的同步快照会话 |
select / update / clear / getState |
返回 { generation, candidate, selection, validation } |
selectJson / updateJson / getStateJson |
会话 JSON 便利入口 |
每次 select/update/clear 增加代次;update 移除旧候选的版本标签,用当前快照重验,成功选择绑定新版本。非法结果 selection=null;输入和返回快照逐层隔离。会话代次本身不是取消机制。
UTS 类型实例在原生端会成为类,不能将任意类强制当成 UTSJSONObject;使用 typed API 或 boardToObject/candidateToObject。缺字段、显式 null、类型错误走 JSON 值入口。UTS 无诊断时 details=null,JSON 转换恢复省略形式。
可取消网格 API
createAvailabilityController(onUpdate, sliceSize=24) 返回 AvailabilityController;每片数量允许 1–64 的整数。在同一 UI/Looper 线程使用,页面卸载调用 dispose()。
| 方法 | 行为 |
|---|---|
start(input, query) / startJson(inputJson, queryJson) |
替换旧任务;query={resourceId,duration,quantity},一次计算一个资源 |
getState() |
返回完整隔离快照,不是增量 |
cancel() |
停止未开始工作,清空 rows,保留工作量计数 |
dispose() |
清理任务和监听器;重复调用安全,之后不会再启动任务 |
状态含 status, generation, dataVersion, query, total, processed, slices, rows, validation。rows 每行是 {startMinute,endMinute,validation},保留拒绝行。状态有 idle/running/complete/cancelled/loading/stale/invalid/disposed;顶层 validation 是输入/查询错误,逐格结果在 rows。启动前完整快照校验仍同步,不能中途抢占;所有回调快照隔离,过期代次不再发布。
跨端边界与问题反馈
Web JSON 入口会去掉与原型/API 冲撞的保留键:__proto__、_resolveKeyPath、_getValue、toJSON、get、set、getAny、getString、getNumber、getBoolean、getJSON、getArray、toMap、forEach。业务 metadata 避免使用这些名称;它们不是协议字段。Web 可选字段的显式 undefined 按缺失语义处理;跨端 JSON 使用缺失字段,不传 undefined。不接收有副作用的 getter、Proxy 或函数。
问题复现请提供模块版本、HBuilderX 版本、目标端/系统/浏览器、最小操作步骤、合成输入、错误码与版本变化顺序。请去掉真实预约和账号资料。支持渠道与响应承诺由正式商品页明确,本候选不包含后台部署、支付接入或业务定制。
本模块及合成示例没有捆绑第三方运行依赖或下载图片;HBuilderX/uni-app x 平台工具链由使用者单独安装。本项目使用 AI 辅助设计、编码、测试和文案。此私有候选不是开源授权或公开再分发许可;正式试用/购买范围须与实际平台授权条款一致。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 0
赞赏 0
下载 12619017
赞赏 1949
赞赏
京公网安备:11010802035340号