
✅一句话理解:ServerScript 运行在后端隔离 JS 沙箱,不在浏览器执行;专门用来接收前端 AJAX/Grid 请求、操作数据库、生成 Excel、返回 JSON,和前端
events里的 JS 完全分开 你之前 CRUD、主副表联动里的后端逻辑,全部写在这里
打开模块 XWL,选中根节点 Wb.Module → 属性面板找到 serverScript,点击编辑,所有后端 JS 写在这里。
一个 Module 只有一份 serverScript,通过
xaction区分不同接口动作(getList / save / delete / export)
// 安全写法:?占位符防SQL注入,禁止字符串拼接
let list = Wb.db.query("select emp_id,emp_name,dept from biz_employee where dept=?",["研发部"]);
return list;Grid 分页场景标准返回格式:
return {total:总条数, data:数组}
let cnt = Wb.db.execute("delete from biz_employee where emp_id=?",["EMP10001"]);
return {success:true, affected:cnt};return Wb.exportExcel({
filename:"员工表.xlsx",
sheetName:"员工",
headers:["ID","姓名","部门"],
data: list.map(r=>[r.emp_id,r.emp_name,r.dept])
});Wb.sendRowx("select * from wb_staff");适合极简示例,复杂业务推荐用 Wb.db.query 自主控制返回结构
Wb.log("调试信息"):后端日志打印,排查问题Wb.load("wb/libs/echarts.js"):加载后端类库(如 ECharts 服务端生成图表)Wb.sql():调用存储过程、复杂多结果集 SQL规范:前端统一传
xaction做路由分发,一套 serverScript 承载多个接口
// 标准入口:读取动作标识
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};
}"url":xpath + "/actions&xaction=getEmployeeList"调用 grid.load({params:{emp_name:"张三"}}) → 参数自动进Params
Wb.ajax({
url:xpath+"/actions&xaction=deleteEmployee",
params:{ids:"EMP10001,EMP10002"},
success(resp){Wb.tipDone("删除成功");}
})Wb.download(xpath+"/actions&xaction=exportEmployee",{emp_name:"张三"})?占位,防止注入
❌ 错误:"select * from t where emp_id='"+Params.emp_id+"'"
✅ 正确:Wb.db.query("select * from t where emp_id=?",[Params.emp_id])
events:{click:"..."} → 浏览器执行,只能 Wb.ajax 发请求,不能直接操作数据库{total:数字, data:数组},少 total 分页栏不生效
JSON.parse(Params.data)(grid.sync 批量保存就是这个机制)
Wb.log(Params) 打印全部入参;F12 网络面板看 ajax 返回报文原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。