更新记录

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.jsonappid 留空。请使用自己有权限的 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, validationrows 每行是 {startMinute,endMinute,validation},保留拒绝行。状态有 idle/running/complete/cancelled/loading/stale/invalid/disposed;顶层 validation 是输入/查询错误,逐格结果在 rows。启动前完整快照校验仍同步,不能中途抢占;所有回调快照隔离,过期代次不再发布。

跨端边界与问题反馈

Web JSON 入口会去掉与原型/API 冲撞的保留键:__proto___resolveKeyPath_getValuetoJSONgetsetgetAnygetStringgetNumbergetBooleangetJSONgetArraytoMapforEach。业务 metadata 避免使用这些名称;它们不是协议字段。Web 可选字段的显式 undefined 按缺失语义处理;跨端 JSON 使用缺失字段,不传 undefined。不接收有副作用的 getter、Proxy 或函数。

问题复现请提供模块版本、HBuilderX 版本、目标端/系统/浏览器、最小操作步骤、合成输入、错误码与版本变化顺序。请去掉真实预约和账号资料。支持渠道与响应承诺由正式商品页明确,本候选不包含后台部署、支付接入或业务定制。

本模块及合成示例没有捆绑第三方运行依赖或下载图片;HBuilderX/uni-app x 平台工具链由使用者单独安装。本项目使用 AI 辅助设计、编码、测试和文案。此私有候选不是开源授权或公开再分发许可;正式试用/购买范围须与实际平台授权条款一致。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无,组件不申请额外系统权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

组件仅在调用方应用内存中处理传入的预约快照,不采集、上传或持久化数据;不向任何服务器发送预约数据,不包含第三方采集 SDK。插件的构建与付费授权可能使用 DCloud 平台服务,依平台流程处理。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无,组件不包含广告。

许可协议

MIT协议

暂无用户评论。