更新记录

1.0.0(2026-08-12) 下载此版本

首个发布版本。

  • H5 / 微信小程序双端选座:只读渲染、点选、点按缩放、拖拽平移、双指捏合缩放
  • minimap 视口缩略图:分区轮廓 + 分区标签 + 视口指示框,点击缩略图跳转视口
  • 限购拦截:max-seats 上限可配(0 = 不限购),超额点选回调 limit-reached
  • 底部已选栏示例:chip 列表、单座删除、合计价格
  • 跨场馆座位尺寸一致(baseScale 锚定),放大上限封顶,杜绝无限放大
  • 万级座位性能:空间网格视口裁剪 + 座位节点分帧创建 + 手势期冻结结算
  • updateSectionSeats 按分区增量刷新座位状态(并发购票场景,已选座位变不可售自动取消)

平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × - - - × - - × ×

其他

多语言 暗黑模式 宽屏模式
× ×

seatmap-picker 座位图选座组件(uni-app 插件)

Leafer 画布实现的只读座位图选座组件,支持 H5微信小程序。与设计器同源数据模型,跨场馆座位尺寸一致。

安装

uni_modules/seatmap-picker 整个目录拷入你的 uni-app 项目 src/uni_modules/ 下(HBuilderX 可直接导入插件)。

组件按 easycom 自动注册,无需手动 import

npm 依赖:插件的 Leafer 运行时依赖需安装在宿主项目的 node_modules

npm i leafer-ui @leafer-ui/miniapp @leafer-in/view @leafer-in/viewport @leafer-in/animate

快速使用

<template>
    <view class="map-slot">
        <seatmap-picker
            :venue="venue"
            :max-seats="6"
            @selection-change="ion"
            @limit-reached="onLimit"
        />
    </view>
</template>

<script>
import { ref } from 'vue'
import { fromBackend } from '@/uni_modules/seatmap-picker/js_sdk/seatmap/core/datasource.js'

export default {
    setup() {
        const venue = ref(null)
        // 接入方自行从后端拉取场馆 + 座位,用 fromBackend 归一化后传给组件
        // (示例页 pages/seatmap-picker/index.vue 有完整请求封装)
        venue.value = fromBackend(venueData, seatlist)
        function ion(list) { /* list: [{ seat, row, section }] */ }
        function onLimit(limit) { /* 限购拦截 */ }
        return { venue, ion, onLimit }
    },
}
</script>

<style>
.map-slot { flex: 1; min-height: 0; width: 100%; position: relative; }
</style>

.map-slot 需要给组件一个确定高度(flex:1 或固定高度);组件根节点 width/height:100% 铺满。

Props

名称 类型 默认 说明
venue Object null fromBackend 之后的场馆模型;变化时整场馆重渲染
maxSeats Number 6 限购上限(0 = 不限购)
seatMaxPx Number 0 座位最大屏幕边长覆盖(px,默认 0 = 18 = 12+6);跨场馆"放大到底"尺寸一致
pixelRatio Number 0 小程序像素比封顶(0 = 不封顶;高分屏可传 min(设备DPR,2)

Events

名称 参数 说明
selection-change [{ seat, row, section }] 选中变化(选中/取消/清空都会触发)
limit-reached (limit) 达到上限后再点座位的拦截回调
error (msg) 画布初始化失败

组件方法(ref 调用)

方法 说明
setVenue(v) 整场馆重渲染
clearSelection() / getSelection() / deselectSeat(id) 选中管理
updateSectionSeats(sectionId, seats) 按分区批量刷新座位状态(并发购票场景)
getVisibleSectionIds() 当前视口可见分区 id(用于按需刷新)
zoomFit() 缩回全景
init() 小程序画布节点就绪后的兜底初始化

示例页

pages/seatmap-picker/index.vue:带价格图例、底部已选栏、限购提示的完整选座页示例。 在宿主 pages.json 注册该页面后,用 ?venue_id=xxx 打开:

{
    "path": "uni_modules/seatmap-picker/pages/seatmap-picker/index",
    "style": { "navigationBarTitleText": "在线选座" }
}

内部结构

uni_modules/seatmap-picker/
├── components/seatmap-picker/seatmap-picker.vue   # 复用组件(easycom 注册为 <seatmap-picker>)
├── js_sdk/seatmap/
│   ├── render.js            # Leafer 渲染器(视口裁剪 + 点选 + 点按缩放)
│   ├── leafer-loader.js     # 平台分流(#ifdef H5 / MP-WEIXIN 导入对应 Leafer 包)
│   └── core/                # 共享数据模型(fromBackend / model / geometry / path / color / text / constants)
└── pages/seatmap-picker/    # 示例页

注:core/ 与设计器 packages/core 同源复制。修改 core 时需两端同步,避免数据模型漂移。

隐私、权限声明

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

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

插件不采集任何数据。组件为纯前端渲染,venue 数据由接入方自行从后端拉取;示例页中的接口地址需替换为接入方自己的后端

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

许可协议

MIT协议

暂无用户评论。