后台添加脚本

# 新建脚本 首先要有一个js文件的静态地址。 脚本的存储位置,可以放在oss或git仓库里,也可以放在ESC云服务器里。 这里我们放在ECS里。 文件目录为:phalapi/public/cloud/components/Module/aweme 在该目录下,新建一个js文件,名为“yanghao.js” ![image.png](https://cos.easydoc.net/52287695/files/lgqi1pox.png) 在文件里,写一个简单的字符串hello ![image.png](https://cos.easydoc.net/52287695/files/lgqi645v.png) 此文件的全路径为 /www/wwwroot/api-new-cloud.feiyunjs.cn/phalapi/public/cloud/components/Module/aweme/yanghao.js 因为绑定过域名,我们可以得到文件的静态地址: http://new-cloud.feiyunjs.cn/components/Module/aweme/yanghao.js 访问这个地址,就可以看到hello字样 # 新建脚本分组 创建一个名为“某音”的脚本分组 ![image.png](https://cos.easydoc.net/52287695/files/lgqi9qjk.png) # 添加脚本 在DY免root脚本菜单下,添加一个脚本 ![image.png](https://cos.easydoc.net/52287695/files/lgqiavxl.png) 脚本地址,为刚才得到的js文件静态地址 脚本平台分类,约定为aweme 任务编辑页面路径,我们设置为components/Module/aweme/yanghao.html 添加设置如下 ![image.png](https://cos.easydoc.net/52287695/files/lgqicwg8.png) 确定添加后,脚本列表就会多出来一个脚本 这里的脚本名称,是根据js文件名自动获取的。 如果你想显示中文,就把js文件命名为中文即可。 ![image.png](https://cos.easydoc.net/52287695/files/lgqif3eu.png) 脚本添加完以后,点击创建任务,会显示空页面。这是因为脚本任务编辑页面的html,我们还没有编写。 # 新建任务编辑页面 进入文件目录:phalapi/public/cloud/components/Module/aweme 在该目录下,新建一个html文件,名为“yanghao.html” 文件内容如下: ```html <div class="layui-fluid"> <!-- 分布表单开始 --> <div class="layui-tab layui-steps layui-steps-vertical layui-steps-readonly" lay-filter="formStepsStep" style="max-width: 800px;padding: 10px 0;"> <!-- 标题 --> <ul class="layui-tab-title" style="padding: 0 50px;"> <li class="layui-this"> <i class="layui-icon layui-icon-ok">1</i> <span class="layui-steps-title">脚本配置</span> </li> <li> <i class="layui-icon layui-icon-ok">2</i> <span class="layui-steps-title">选择设备</span> </li> <li> <i class="layui-icon layui-icon-ok">3</i> <span class="layui-steps-title">任务配置</span> </li> <li> <i class="layui-icon layui-icon-ok">4</i> <span class="layui-steps-title">完成</span> </li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <!-- 表单一 --> <div id="formStepForm1" class="layui-form" lay-filter="formStepForm1" style="max-width: 800px;margin: 0 auto;padding-top: 30px;"> <div class="layui-form-item layui-hide"> <label class="layui-form-label layui-form-required">脚本ID</label> <div class="layui-input-inline"> <input type="text" name="module_id" value="" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> </div> <div class="layui-form-item layui-hide"> <label class="layui-form-label layui-form-required">脚本名称</label> <div class="layui-input-inline"> <input type="text" name="module_name" value="" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> </div> <div class="layui-form-item layui-hide"> <label class="layui-form-label layui-form-required">脚本分组</label> <div class="layui-input-inline"> <input type="text" name="module_group_id" value="" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> </div> <div class="layui-form-item layui-hide"> <label class="layui-form-label layui-form-required">脚本地址</label> <div class="layui-input-inline" style="width: 600px;"> <input type="text" name="module_url" autocomplete="off" placeholder="" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">浏览数量</label> <div class="layui-input-inline little-input"> <input type="number" name="watch_num" value="3" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux">个<i class="fa fa-fw fa-lg fa-question-circle-o" lay-tips="本次任务总共浏览的作品数量" style="margin-left: 10px;"></i></div> </div> <div class="layui-form-item"> <label class="layui-form-label">浏览</label> <div class="layui-input-inline little-input"> <input type="number" name="watch_min" value="3" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux">-</div> <div class="layui-input-inline little-input"> <input type="number" name="watch_max" value="5" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux">秒</div> </div> <div class="layui-form-item" style="text-align:right;margin-top: 30px;"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="formStepSubmit1">下一步</button> </div> </div> </div> </div> <div class="layui-tab-item"> <!-- 表单二 --> <div class="layui-form" style="max-width: 800px;margin: 0 auto;padding-top: 30px;"> <!-- 设备树形列表 --> <div class="layui-form-item" id="deviceAll"> <label class="layui-form-label" style="border: none;background: none;"></label> <div class="layui-input-inline" id="deviceTree" style="width: 450px;min-height:100px;background: #FBFBFB;border-radius: 2px;border: 1px dashed #e6e6e6;padding:10px 10px 20px;"> </div> </div> <div class="layui-form-item" style="text-align:right;margin-top: 30px;"> <div class="layui-input-block"> <button type="button" class="layui-btn layui-btn-primary" data-steps="prev">上一步</button> <button class="layui-btn" lay-submit lay-filter="formStepSubmit2">下一步</button> </div> </div> </div> </div> <div class="layui-tab-item"> <!-- 表单3 --> <div class="layui-form" style="max-width: 800px;margin: 0 auto;padding-top: 30px;"> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">执行模式</label> <div class="layui-input-block"> <!-- <input type="radio" name="mode" lay-filter="mode" value="0" title="即时"/>--> <input type="radio" name="mode" lay-filter="mode" value="1" title="排队" checked /> <input type="radio" name="mode" lay-filter="mode" value="2" title="定时" /> </div> </div> <div class="layui-form-item layui-hide" id="startTime"> <label class="layui-form-label layui-form-required">开始时间</label> <div class="layui-input-inline"> <input type="text" name="start_time" class="layui-input" id="start_time" lay-verType="tips"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">时间限制</label> <div class="layui-input-block"> <input type="radio" name="is_limited_time" lay-filter="is_limited_time" value="0" title="不限时" checked /> <input type="radio" name="is_limited_time" lay-filter="is_limited_time" value="1" title="限时" /> </div> </div> <div class="layui-form-item layui-hide" id="limitTime"> <label class="layui-form-label layui-form-required">限定时长</label> <div class="layui-input-inline"> <input type="number" name="limit_time" value="600" class="layui-input" lay-verType="tips"> </div> <div class="layui-form-mid layui-word-aux">秒</div> </div> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">启动等待</label> <div class="layui-input-inline little-input"> <input type="number" name="wait_time_min" value="1" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> <div class="layui-form-mid layui-word-aux">-</div> <div class="layui-input-inline little-input"> <input type="number" name="wait_time_max" value="3" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> <div class="layui-form-mid layui-word-aux">秒<i class="fa fa-fw fa-lg fa-question-circle-o" lay-tips="同一批任务错开时间启动" style="margin-left: 10px;"></i></div> </div> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">全局延时</label> <div class="layui-input-inline little-input"> <input type="number" name="delay_min" value="1" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> <div class="layui-form-mid layui-word-aux">-</div> <div class="layui-input-inline little-input"> <input type="number" name="delay_max" value="3" placeholder="" autocomplete="off" class="layui-input" lay-verType="tips" lay-verify="required" required> </div> <div class="layui-form-mid layui-word-aux">秒<i class="fa fa-fw fa-lg fa-question-circle-o" lay-tips="根据设备的硬件配置和网络信号强度而定,低配的设备建议将延迟设置大一些。" style="margin-left: 10px;"></i></div> </div> <div class="layui-form-item"> <label class="layui-form-label">任务备注</label> <div class="layui-input-inline"> <input type="text" name="remarks" value="" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux"><i class="fa fa-fw fa-lg fa-question-circle-o" lay-tips="任务的简要说明,方便查找任务"></i></div> </div> <div class="layui-form-item" style="text-align:right;margin-top: 30px;"> <div class="layui-input-block"> <button type="button" class="layui-btn layui-btn-primary" data-steps="prev">上一步</button> <button class="layui-btn" lay-submit lay-filter="formStepSubmit3">创建任务</button> </div> </div> </div> </div> <div class="layui-tab-item text-center" style="padding-top: 30px;"> <div class="layui-hide" id="tableList" style="padding: 0 150px;text-align: left;"></div> <div style="text-align: center;margin-top: 30px;"> <button class="layui-btn" data-steps="next">再次创建</button> <button class="layui-btn layui-btn-primary end">关闭</button> </div> </div> </div> </div> <!-- //分布表单结束 --> </div> <!-- js部分 --> <script> layui.use(['layer', 'form', 'steps', 'notice', 'laydate', 'admin', 'setter', 'tree'], function () { var $ = layui.jquery; var layer = layui.layer; var form = layui.form; var steps = layui.steps; var notice = layui.notice; var laydate = layui.laydate; var admin = layui.admin; var setter = layui.setter; var tree = layui.tree; /* 表单1提交事件 */ var field_first = {}, field_second = {}; form.on('submit(formStepSubmit1)', function (data) { field_first = data.field; admin.putTempData(key, field_first, true); //保存表单数据 steps.next('formStepsStep'); return false; }); /* 表单2提交事件 */ var device_numbers = "", device_groups = "", device_models = "", num_device = 0, imeis = '' form.on('submit(formStepSubmit2)', function (data) { field_second = data.field; // 全部设备-------------------------------------------- //获得选中设备的节点 var checkData = tree.getChecked('demoId'), imeiArr = new Array(); checkData.forEach((item, index, array) => { if (item.title.indexOf("在线") > -1 || item.title.indexOf("离线") > -1) { imeiArr.push(item.id); }; let children = item.children; if (children) { children.forEach((cont, i, arr) => { if (cont.title.indexOf("在线") > -1 || cont.title.indexOf("离线") > -1) { imeiArr.push(cont.id); }; }); }; }); num_device = imeiArr.length; //设备数量 if (num_device > 0) { imeis = imeiArr.join(','); steps.next('formStepsStep'); //进入下一步 } else { return notice.msg('请选择设备', { icon: 2, timeout: 2000 }); }; return false; }); /* 表单3提交事件 */ form.on('submit(formStepSubmit3)', function (data) { let field = {}, field_zuhe = {}; $.extend(field_zuhe, field_first, field_second); //合并两个不同的对象 $.extend(field, field_zuhe, data.field); //合并两个不同的对象 // console.log(field) //向任务总表添加任务 $.ajax({ url: setter.baseServer, data: { service: "App.Task_Total.UpdateData", module_param: JSON.stringify(field), task_num: num_device, module_name: field.module_name, module_group_id: field.module_group_id, imeis: imeis, mode: field.mode, start_time: field.start_time, // device_way: field.device_way, // device_numbers: field.device_numbers, // device_groups: device_groups, // device_models: device_models, remarks: field.remarks, state: '1', access_token: setter.getToken().access_token, }, method: 'POST', //请求方式 crossDomain: true, complete: function (result, status, xhr) { result = JSON.parse(result.response || result.responseText); //反Json化 if (result.ret == 200) { steps.next('formStepsStep'); let taskMode = ''; //任务执行模式 switch (field.mode) { case '0': taskMode = '<span class="layui-badge layui-badge-green">即时</span>'; break; case '1': taskMode = '<span class="layui-badge layui-badge-blue">排队</span>'; break; case '2': taskMode = '<span class="layui-badge layui-badge-yellow">定时</span>'; break; }; var tr = $(['<table class="layui-table">' , '<colgroup>' , '<col width="150">' , '<col>' , '</colgroup>' , '<tbody>' , '<tr>' , '<td>任务ID</td>' , '<td>' + result.data.id + '</td>' , '</tr>' , '<tr>' , '<td>执行模式</td>' , '<td>' + taskMode + '</td>' , '</tr>' , '<tr>' , '<td>脚本分组</td>' , '<td>' + mUser.group_name + '</td>' , '</tr>' , '<tr>' , '<td>脚本名称</td>' , '<td>' + mUser.module_name + '</td>' , '</tr>' , '<tr>' , '<td>下发数量</td>' , '<td>' + num_device + '</td>' , '</tr>' , '<tr>' , '<td>任务备注</td>' , '<td>' + field.remarks + '</td>' , '</tr>' , '<tr>' , '<td>创建时间</td>' , '<td>' + result.data.add_time + '</td>' , '</tr>' , '</tbody>' , '</table>'].join('')); $('#tableList').removeClass("layui-hide").append(tr); } else { notice.msg(result.msg, { icon: 2, timeout: 2000 }); }; }, }); return false; }); //完成 $('.end').click(function () { layer.closeAll(); }); //查询设备树 $.ajax({ url: setter.baseServer, data: { service: "App.Device_Device.GetTreeData", access_token: setter.getToken().access_token, }, method: 'POST', //请求方式 crossDomain: true, complete: function (result, status, xhr) { //反Json化-将数据转换为 JavaScript 对象 result = JSON.parse(result.response || result.responseText); // console.log(result) if (result.ret === 200) { //开启复选框 tree.render({ elem: '#deviceTree' , data: result.data , showCheckbox: true , id: 'demoId' //定义索引 }); } }, }); var mUser = admin.getLayerData('#formStepForm1').tableData; // 列表页面传递的数据 var ws = admin.getLayerData('#formStepForm1').ws; form.val('formStepForm1', mUser); // 回显数据——这里一定要用formX.val,form.val不能回显跨iframe的数据 //读取上次保存的脚本配置 let reg = /.*\/(([^\/]+)(\/[^\/]+){1}\.[^\.]+)$/; let key = mUser.path.replace(reg, "$1").replace('.html', ''); //任务编辑页面路径中的文件名,不带.html后缀 let localStorage = admin.getTempData(key, true); //读取表单数据 if (localStorage) { form.val('formStepForm1', localStorage); // 回显数据——这里一定要用formX.val,form.val不能回显跨iframe的数据 $("input[name='module_url']").val(mUser.module_url); //重置脚本地址 //设置复选框状态 $("#formStepForm1 input[type='checkbox']").each(function () { let name = $(this).attr('name'); $(this).prop('checked', localStorage[name] === 'on' ? true : false); }); // //设置选择框状态 // $("#formStepForm1 select").each(function(){ // let name = $(this).attr('name'); // $(this).val(localStorage[name]); // form.render('select'); // }); }; form.render(); //日期时间选择器 laydate.render({ elem: '#start_time' , type: 'datetime' }); }); </script> ``` 这是通用的脚本任务编辑页面模版。 别看代码量比较多,其实很多地方都是固定的,不需要改动。 新开发脚本时,直接套用这个模版。 着重编写分布表单中,id为formStepForm1的form里的脚本运行参数即可。 其他部分基本不用改动。 以新增的这个脚本为例,我们只需要在html模版的第一个form中,添加如下代码即可 ```html <div class="layui-form-item"> <label class="layui-form-label">浏览数量</label> <div class="layui-input-inline little-input"> <input type="number" name="watch_num" value="3" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux">个<i class="fa fa-fw fa-lg fa-question-circle-o" lay-tips="本次任务总共浏览的作品数量" style="margin-left: 10px;"></i></div> </div> <div class="layui-form-item"> <label class="layui-form-label">浏览</label> <div class="layui-input-inline little-input"> <input type="number" name="watch_min" value="3" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux">-</div> <div class="layui-input-inline little-input"> <input type="number" name="watch_max" value="5" placeholder="" autocomplete="off" class="layui-input"> </div> <div class="layui-form-mid layui-word-aux">秒</div> </div> ``` 这是控制脚本运行的最重要参数。