首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Geejing WebBuilder|服务端脚本(ServerScript)使用指南

Geejing WebBuilder|服务端脚本(ServerScript)使用指南

原创
作者头像
技术挖掘官
发布2026-08-13 17:16:54
发布2026-08-13 17:16:54
770
举报

✅一句话理解:ServerScript 运行在后端隔离 JS 沙箱,不在浏览器执行;专门用来接收前端 AJAX/Grid 请求、操作数据库、生成 Excel、返回 JSON,和前端events里的 JS 完全分开 你之前 CRUD、主副表联动里的后端逻辑,全部写在这里

一、基础概念 & 放置位置

1)在哪里写?

打开模块 XWL,选中根节点 Wb.Module → 属性面板找到 serverScript,点击编辑,所有后端 JS 写在这里。

一个 Module 只有一份 serverScript,通过 xaction 区分不同接口动作(getList / save / delete / export)

2)两个内置全局对象(最重要)

  1. Params:接收前端传过来所有 URL 参数、ajax params、grid.load 参数(最常用) js 运行 // 前端 url: xpath+"/actions&xaction=getEmp&emp_name=张三" let xaction = Params.xaction; let empName = Params.emp_name;
  2. Wb:后端内置 API 集合(数据库、导出、日志、文件等)

二、最常用核心 API(日常 CRUD 必背)

✅ 1. Wb.db.query — 查询(返回数组,用于列表、下拉)

代码语言:javascript
复制
// 安全写法:?占位符防SQL注入,禁止字符串拼接
let list = Wb.db.query("select emp_id,emp_name,dept from biz_employee where dept=?",["研发部"]);
return list;

Grid 分页场景标准返回格式:return {total:总条数, data:数组}

✅ 2. Wb.db.execute — 增 / 删 / 改(返回受影响行数)

代码语言:javascript
复制
let cnt = Wb.db.execute("delete from biz_employee where emp_id=?",["EMP10001"]);
return {success:true, affected:cnt};

✅ 3. Wb.exportExcel — 导出 Excel(直接返回下载流)

代码语言:javascript
复制
return Wb.exportExcel({
  filename:"员工表.xlsx",
  sheetName:"员工",
  headers:["ID","姓名","部门"],
  data: list.map(r=>[r.emp_id,r.emp_name,r.dept])
});

✅ 4. Wb.sendRowx(简易快速查询,适合简单单表)

代码语言:javascript
复制
Wb.sendRowx("select * from wb_staff");

适合极简示例,复杂业务推荐用 Wb.db.query 自主控制返回结构

✅ 5. 其他高频 API

  • Wb.log("调试信息"):后端日志打印,排查问题
  • Wb.load("wb/libs/echarts.js"):加载后端类库(如 ECharts 服务端生成图表)
  • Wb.sql():调用存储过程、复杂多结果集 SQL

三、标准模板(直接复制,就是你 CRUD 里的骨架)

规范:前端统一传 xaction 做路由分发,一套 serverScript 承载多个接口

代码语言:javascript
复制
// 标准入口:读取动作标识
let xaction = Params.xaction;

if(xaction === "getEmployeeList"){
  // 分页查询列表
  let page = parseInt(Params.page||1);
  let pageSize = parseInt(Params.pageSize||10);
  let empName = Params.emp_name||"";

  let where = "WHERE 1=1";
  let args = [];
  if(empName){
    where += " AND emp_name LIKE ?";
    args.push("%"+empName+"%");
  }
  let total = Wb.db.query("select count(*) as total from biz_employee "+where,args)[0].total;
  let data = Wb.db.query("select * from biz_employee "+where+" limit ? offset ?",[...args,pageSize,(page-1)*pageSize]);
  return {total,data};
}
else if(xaction === "saveEmployee"){
  // 保存(新增+编辑)
  let rows = JSON.parse(Params.data||"[]");
  rows.forEach(r=>{
    if(r._isNew){
      Wb.db.execute("insert into biz_employee(emp_name) values(?)",[r.emp_name]);
    }else{
      Wb.db.execute("update biz_employee set emp_name=? where emp_id=?",[r.emp_name,r.emp_id]);
    }
  });
  return {success:true};
}
else if(xaction === "deleteEmployee"){
  let ids = (Params.ids||"").split(",");
  let ph = ids.map(()=>"?").join(",");
  Wb.db.execute(`delete from biz_employee where emp_id in (${ph})`,ids);
  return {success:true};
}

四、前端如何调用服务端脚本?3 种方式

方式 1:Wb.Grid 数据源(最常用,表格)

代码语言:javascript
复制
"url":xpath + "/actions&xaction=getEmployeeList"

调用 grid.load({params:{emp_name:"张三"}}) → 参数自动进Params

方式 2:手动 Wb.ajax(按钮、自定义查询)

代码语言:javascript
复制
Wb.ajax({
  url:xpath+"/actions&xaction=deleteEmployee",
  params:{ids:"EMP10001,EMP10002"},
  success(resp){Wb.tipDone("删除成功");}
})

方式 3:Wb.download 导出

代码语言:javascript
复制
Wb.download(xpath+"/actions&xaction=exportEmployee",{emp_name:"张三"})

五、⚠️ 强制规范 & 高频踩坑(重点)

  1. SQL 绝对不能字符串拼接!必须用?占位,防止注入 ❌ 错误:"select * from t where emp_id='"+Params.emp_id+"'" ✅ 正确:Wb.db.query("select * from t where emp_id=?",[Params.emp_id])
  2. 区分前端 JS(events)和后端 ServerScript
    • events:{click:"..."} → 浏览器执行,只能 Wb.ajax 发请求,不能直接操作数据库
    • serverScript → 后端沙箱,不能直接操作 DOM、app、grid
  3. Grid 分页返回格式固定:{total:数字, data:数组},少 total 分页栏不生效
  4. 数组 / 对象传到后端:前端 JSON.stringify,后端 JSON.parse(Params.data)(grid.sync 批量保存就是这个机制)
  5. 调试技巧:Wb.log(Params) 打印全部入参;F12 网络面板看 ajax 返回报文

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、基础概念 & 放置位置
    • 1)在哪里写?
    • 2)两个内置全局对象(最重要)
  • 二、最常用核心 API(日常 CRUD 必背)
    • ✅ 1. Wb.db.query — 查询(返回数组,用于列表、下拉)
    • ✅ 2. Wb.db.execute — 增 / 删 / 改(返回受影响行数)
    • ✅ 3. Wb.exportExcel — 导出 Excel(直接返回下载流)
    • ✅ 4. Wb.sendRowx(简易快速查询,适合简单单表)
    • ✅ 5. 其他高频 API
  • 三、标准模板(直接复制,就是你 CRUD 里的骨架)
  • 四、前端如何调用服务端脚本?3 种方式
    • 方式 1:Wb.Grid 数据源(最常用,表格)
    • 方式 2:手动 Wb.ajax(按钮、自定义查询)
    • 方式 3:Wb.download 导出
  • 五、⚠️ 强制规范 & 高频踩坑(重点)
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档