深色模式
链接参数
查看态的链接就是接口。除了下面这几个保留字段,链接上其余的 key 一律当成报表的筛选条件。
https://report.example.com/?id=<报表id>&view=1[&其它参数]保留字段
| 参数 | 必填 | 说明 |
|---|---|---|
id | 是 | 报表 id,形如 r260922123456 |
view | 是 | 写 1 表示查看态;不写就是设计器 |
version | 否 | 看哪一版,默认当前发布版。见下方版本 |
lock | 否 | 哪些筛选条件只显示不让改,逗号分隔;写 all 锁住全部 |
chrome | 否 | 写 0 去掉报表自带的页头(标题、版本、刷新、导出) |
theme | 否 | 覆盖设计令牌,见外观与主题 |
筛选条件
条件的 id 在报表里定义(做报表的人能在属性面板看到),宿主按 id 传值。
| 条件类型 | 链接写法 | 例子 |
|---|---|---|
| 文本 | id=值 | &keyword=%E6%89%8B%E6%9C%AF |
| 数字 | id=值 | &min_qty=100 |
| 日期 | id=YYYY-MM-DD | &day=2026-08-31 |
| 月份 | id=YYYY-MM | &month=2026-08 |
| 日期区间 | id=起,止 或 id_from=起&id_to=止 | &range=2026-01-01,2026-03-31 |
| 数字区间 | id=小,大 或 id_min=小&id_max=大 | &amount=100,500 |
| 单选、树形下拉 | id=值 | &store=S001 |
| 多选下拉 | id=a,b 或重复写 id=a&id=b | &store=S001,S002 |
几条规则:
- 值要做 URL 编码。中文、空格、
&、#不编码会被浏览器截断,encodeURIComponent()一下就行。 - 写空串表示「不限」:
&month=会把报表里这个条件的默认值清掉,查全部。 - 链接上不写的条件用报表自己的默认值,不会被清空。
- 区间只写一头也行:
&range_from=2026-01-01就是「这天以后」。 - 数字位置写了非数字(
&min_qty=abc)按「不限」处理,不会报错也不会查出错数。
写错了会怎样
链接里写了、报表里没有这个条件 id,页面顶上会列出来:
链接里的
storeid不是这张报表的筛选条件,已忽略。处理:核对链接里的参数名与报表筛选栏一致。
报表照常显示,只是那个条件没生效。看到这句就去核对 id 的拼写。
锁住条件
宿主指定的口径不该让看的人改——比如按登录用户所在门店限定数据:
&store=S001&lock=storestore 显示出来但是灰的,改不了。多个用逗号:&lock=store,dept。全部锁死:&lock=all。
lock 是界面口径,不是数据权限
lock 只是把控件设成只读。它挡不住会改链接的人——把 lock 去掉、把 store 换个值,照样能看到别的门店。
真正的数据边界在服务端:只读账号、SQL 守卫,以及按登录身份下发的行级范围参数。要做到「这个人只能看到自己门店」,得走行级范围那条路,不是靠 lock。
版本
| 写法 | 看到的内容 |
|---|---|
| 不写 | 当前发布版。报表重新发布,这条链接自动跟到新版本 |
version=v2 | 钉死在第 2 版,之后再发布也不变 |
version=draft | 当前草稿。发布前自查用,不要发给客户 |
数据快照版(发布时选了「数据快照」)打开时不查数据库,数字和筛选条件都是发布那一刻固化下来的:条件一律只读,页头没有「刷新数据」,页面上会写明「这一版是数据快照」。
一条完整的链接
https://report.example.com/?id=r260922123456&view=1
&month=2026-08
&store=S001,S002
&lock=store
&chrome=0
&theme=primary:%232c6ecb(实际使用写成一行,不要换行。)
意思是:打开这张报表的当前发布版,看 2026 年 8 月、S001 与 S002 两家店,门店条件不让改,不要报表自带的页头,主色换成 #2c6ecb。
拼链接的代码
js
function reportUrl(base, id, params = {}, opts = {}) {
const q = new URLSearchParams({ id, view: '1' })
for (const [key, value] of Object.entries(params)) {
if (value === null || value === undefined) continue
q.set(key, Array.isArray(value) ? value.join(',') : String(value))
}
if (opts.lock) q.set('lock', Array.isArray(opts.lock) ? opts.lock.join(',') : opts.lock)
if (opts.chrome === false) q.set('chrome', '0')
if (opts.version) q.set('version', opts.version)
if (opts.theme) q.set('theme', Object.entries(opts.theme).map(([k, v]) => `${k}:${v}`).join(','))
return `${base}/?${q}`
}
// reportUrl('https://report.example.com', 'r260922123456',
// { month: '2026-08', store: ['S001', 'S002'] }, { lock: 'store', chrome: false })URLSearchParams 自己会做编码,不用再手工转义。
