权限控制需在table.render()前完成toolbar字符串的动态拼接,依据用户角色过滤搜索项,确保无权用户无法看到或提交搜索控件。

搜索项不是“显示/隐藏”出来的,而是在渲染前就按权限筛掉——toolbar 字符串里根本不能出现无权用户的搜索控件。
toolbar 拼接必须在 table.render() 之前完成权限过滤
layui 的 toolbar 参数只接受字符串或 DOM 节点,不支持运行时条件判断。所谓“根据权限显示搜索项”,本质是:在调用 table.render() 前,就用 window.USER_ROLE(或 localStorage、API 同步结果)决定要不要把搜索框 HTML 塞进 toolbar 字符串里。
- 错误做法:
toolbar: '<div><input name="keyword"></div>'全量写死,再用$('.search-input').toggle()控制显隐 —— DOM 还在,审查元素可直接修改并提交 - 正确路径:定义一个按钮/搜索项配置数组,每个带
role字段,例如[{type: 'search', name: 'keyword', role: ['admin', 'editor']}] - 拼接时用
filter().map().join(''),确保无权角色的搜索项根本不生成 HTML - 角色数据必须同步就绪:不能等
fetch('/api/user')回来再 render 表格,否则会闪出所有搜索项再隐藏
搜索表单的 name 和外层 class 不可省略
即使权限允许显示搜索框,HTML 结构不对也会导致 form.on('submit()') 拿不到值,或样式错乱。
-
name属性必须有,且要和form.on('submit(filter)')中的filter一致;没它,layui.form.on根本不会触发 - 外层必须包
<div class="layui-form"> 或 <code><form class="layui-form"></form>,否则 Layui 不接管事件委托,输入框可能不可聚焦 - 别用
lay-search这类自定义属性——那是给<select></select>用的,对 toolbar 里的 input 无效 - 示例合法写法:
"<div class="layui-form"><input type="text" name="keyword" placeholder="搜用户" class="layui-input"></div>" -
table.reload()第一个参数必须和table.render({ id: 'userTable' })中的id完全一致,大小写、拼写都不能错 - where 参数要合并而非覆盖:先读
table.config.where,再Object.assign({}, oldWhere, { keyword: val }),避免清掉时间筛选等其他条件 -
page: { curr: 1 }必须显式设置,否则用户在第 5 页搜,结果仍请求第 5 页数据(常为空) - 监听事件要写全:
table.on('toolbar(userTable)', function(obj){ if(obj.event === 'doSearch'){...} }),括号里填的是 render 时的 id 值
点击搜索后 reload 必须传对表 ID 并重置页码
权限控制只管“显示”,但搜索行为是否生效,取决于 table.reload() 调用是否精准。
最易被忽略的是:权限判断逻辑和搜索表单结构必须解耦——前者决定“有没有这个 input”,后者决定“这个 input 能不能被 submit 监听到”。两者都错一点,搜索就静默失败,连控制台都不会报错。











