//mysql首字母
firstconcat(LEFT(item_fd_name,1))
//删除多余的数据
var sql = ” DELETE FROM tlk_Fm_AttendaceResult WHERE “;
sql += ” id NOT IN ( “;
sql += ” SELECT dt.maxID FROM( SELECT MAX(id) AS maxID FROM tlk_Fm_AttendaceResult GROUP BY item_recdate , item_Fd_UserName) dt “;
sql += ” ) “;
deleteByDSName(“huahangl”,sql)
synchronizeSysUserToXT
//转JSON
var jsonstr = document.getElementsByName(“Fd_pieValue”)[0].value;
jsonstr = jsonstr.replace(/’/g, ‘”‘); //把单引号替换成双引号
var strJason1 = JSON.parse(jsonstr); //转换成jason格式
//mysql拆分一行变多行
SELECT a.item_Fd_Name AS ‘专业’,SUBSTRING_INDEX(SUBSTRING_INDEX(a.item_chiefEngineer,’;’,b.help_topic_id+1),’;’,-1) AS ‘总工’
FROM tlk_Fm_Professional_WH a
JOIN mysql.help_topic b ON b.help_topic_id < (LENGTH(a.item_chiefEngineer) – LENGTH(REPLACE(a.item_chiefEngineer,’;’,”))+1)
WHERE a.item_Fd_Perfession = ‘技术专业’ AND IFNULL(a.item_chiefEngineer,”) !=”
//死锁
SELECT * FROM information_schema.INNODB_TRX;
删除 trx_mysql_thread_id
KILL 107
//抄送角色和指定人员
#include “SystemRole”
var sp1 = getNewRoleIdByName2(“董事会”);
var sp2 = getCurrentDocument().getAuthor().getId(); //申请人
var allspr = sp1+”;”+sp2
var arr = splitText(allspr,”;”);
var userlist = createObject(“java.util.ArrayList”);
for (var i=0;i<arr.length;i++){
if(arr[i] != null && arr[i].trim().length() > 0){
userlist.add(getUserById(arr[i]));
}
}
userlist;
//删除t_document数据
DELETE FROM tlk_Fm_Make_Up_Attendance
DELETE FROM t_document WHERE formname LIKE ‘%Fm_Make_Up_Attendance%’
mysql查询语句-最有一行、最后一列合计(行和列都合计)
SELECT coalesce(字段1,’总计’),字段2,sum(字段3) as ‘总计’ from 表名 group by 字段1 WITH ROLLUP;
模糊查询HTML
<img name=”undefined” src=”ueditor/plugins/calctextfield/calctextfield.gif” classname=”cn.myapps.core.dynaform.form.ejb.CalctextField” id=”11ea-dc44-fcbfdb19-8374-2f0df6e6454c” valuescript=”@quot;@lt;div@nbsp;style=@#146;float:right;@#146;@gt;@quot;” hiddenscript=”” hiddenvalue=”” hiddenprintscript=”” printhiddenvalue=”” calculateonrefresh=”false”/>模糊查询:<input name=”Fd_SearchText” classname=”cn.myapps.core.dynaform.form.ejb.InputField” id=”11ea-dc44-a87a3700-8374-2f0df6e6454c” text=”text” texttype=”text” fieldtype=”VALUE_TYPE_VARCHAR” fieldkeyevent=”Tabkey” bordertype=”false” discript=”模糊查询” validaterule=”” valuescript=”” hiddenscript=”” hiddenvalue=”” hiddenprintscript=”” printhiddenvalue=”” readonlyscript=”” refreshonchanged=”true” calculateonrefresh=”false” mobile=”true” numberpattern=”” processdescription=”[];[]” filtercondition=”” validatelibs=”” editmode=”01″ style=””/><img name=”undefined” src=”ueditor/plugins/calctextfield/calctextfield.gif” classname=”cn.myapps.core.dynaform.form.ejb.CalctextField” id=”11ea-dc45-0322398a-8374-2f0df6e6454c” valuescript=”@quot;@lt;/div@gt;@quot;” hiddenscript=”” hiddenvalue=”” hiddenprintscript=”” printhiddenvalue=”” calculateonrefresh=”false”/>
创建人
#include “SystemFunction”;
getSystemAuthor( getCurrentDocument() )
创建时间
#include “SystemFunction”;
getSystemCreated( getCurrentDocument() )
//操作按钮[华瀚]
var buttons = “<div class=’ui-pg-div btn normalBtn radius’ οnclick=\”\”><span class=’ui-icon ui-icon-trash red’></span><span class=’text’>修改</span></div>”
superView 非本表数据的模糊查询============================
var objectUtil = new Packages.cn.myapps.util.ObjectUtil;
var map = objectUtil.getSuperViewFilters($WEB.getParamsTable());
println(map.get(“groupOp”)); //获取使用and还是or
if(map!=null){
var rules = createObject(“java.util.ArrayList”);
rules = map.get(“rules”);
println(rules);
println(“———–” + rules.size());
for(var i=0; i<rules.size(); i++){
println(rules.get(i)); //读取过滤的参数{“field”:”Fd_UserName”,”op”:”cn”,”data”:”22″}
}
}
//hashmap调用java的包
var map= createObject(“java.util.HashMap”);
map.put(“apple”, “新鲜的苹果”); //向集合中添加对象
map.put(“computer”, “配置优良的计算机”);
map.put(“book”, “堆积成山的图书”);
var key = “book”;
map.containsKey(key)
for(var iter2 = map.entrySet().iterator();iter2.hasNext();){
var maps = iter2.next();
var keyI = maps.getKey(); //key[员工编号]
}
//数量
map.size();
创建MAP
var key1 = ‘动态key1’;
var key2 = ‘动态key2’;
var map = {};
map[key1] = 1;
map[key2] = 2;
println(map[key1]);
println(map[key2]);
//如果遍历map
for(var prop in map){
if(map.hasOwnProperty(prop)){
println(‘key is ‘ + prop +’ and value is’ + map[prop]);
}
}
创建索引
SHOW INDEX FROM tlk_Fm_SaleOrderCK2
CREATE INDEX indexname ON tlk_Fm_SaleOrderCK2(parent)
DROP INDEX indexname ON tlk_Fm_SaleOrderCK2
查看mysql占用cpu高的原因
SHOW PROCESSLIST
修改审批记录的1张表,在gl的数据库里面
t_relationhis
数据库操作:多个审批环节的时候删除某个
SELECT * FROM t_flow_intervention WHERE docid=”11e9-5ab1-b2a9947f-b41b-fd2e1f293e2e”
SELECT * FROM t_flowstatert WHERE docid=”11e8-0700-ed8c9dce-bad4-558174c9ae7c”
SELECT * FROM t_nodert WHERE docid=”11e9-5ab1-b2a9947f-b41b-fd2e1f293e2e”
数据库操作:设置流程管理【挂起】
UPDATE t_nodert SET ISSUSPEND = 1 WHERE docid=’11e9-5a76-45242c17-b41b-fd2e1f293e2e’
0.取当前日期
var retvar =getItemValueAsDate(“Fd_Time”);
if(retvar==null) {
retvar = getToday();
}
format(retvar,”yyyy-MM-dd”);
流程审批人:
var val = getItemValueAsString(“Fd_YYB”);
var arr = splitString(val, “;”);
var userlist = createObject(“java.util.ArrayList”);
for (var i=0;i<arr.length;i++){
var userVO = getUserById(arr[i]);
userlist.add(userVO);
}
userlist;
1、权限:
var users = getUsersByRoleId(getRoleIdByName(“系统管理员”));
var flag=true;
for(var iter=users.iterator();users !=null && iter.hasNext();){
var user=iter.next();
if(getWebUser().getId().equals(user.getId()) ){flag=false; }
}
flag;
2、当前人名:
var rtn = getItemValue(‘申请人’);
if(rtn==null || rtn.trim().length()<=0){
rtn = getWebUser().getName();
}
rtn;
2.3.3获取其它表单字段值
说明:
/*列上通过SCRIPT代码实现。这里我们以根据物料编辑获取物料名称为例。*/
var code = getItemValueAsString(“code”);
var dql = “$formname=’物料表单’ and code='” + code + “‘”;
var doc = findByDQL(dql);
doc.getItemValueAsString(“name”);
获得其他表单字段。
var dql = “$formname = ‘数字函数表单'”;
var n = getOptionsByDQL(dql, “demoops”, false);
n;
示例4:判断当前表单处于新建还是编辑状态,并决定是否隐藏
/*这里我们以表单为编辑状态时显示字段值信息为例。“建单人”字段隐藏脚本。*/
var doc = getCurrentDocument();
doc.getIstmp();
删除的时候改变本单的值
var text = $WEB.getParameterAsText(“_selects”);
var docids = text.split(‘;’);
for (var i=0; i < docids.length; i++ ) {
var doc = findDocument(docids[i]);
doc.findItem(“isLook”).setValue(“1”); //替换”Fd_Money”的值
var process = getDocumentProcess(); //创建文档业务对象
process.doUpdate(doc); //更新文档
}
createAlert(“删除成功!”);
发送邮件:
sendEmailBySystemUser(“565106883@qq.com”,”没人”,”dsfsdfsd”);
视图:checkbox
名称:@@
内容:'<input type=”checkbox” name=”_selects” value=”‘+getCurrentDocument().getId()+'”>’
数据库加序号:
search = search + “SELECT (@y:=@y+1) as item_序号,c.* FROM tlk_Fm_OrderRK c,(SELECT @y:=0) d where c.istmp=0 “+cksql;
1.有流程的子单按钮权限设置
var curdoc = getCurrentDocument();
var rtn = true;
var sp1 = “0”;
var sp2 = “0”;
//审批环节匹配
var doc = getParentDocument();
if(doc.getStateLabel().equals(“申请人”)){
sp1 = “1”;
}
//审批人匹配
if(curdoc.getAuthor().getId().equals(getWebUser().getId())){
sp2 = “1”;
}
//当前审批环节是申请 并且当前审批人是申请人本人才能修改
if(sp1==”1″ &&sp2==”1″){
rtn = false;
}
rtn
====================================================
iscript调用sql查询语句
queryBySQL:
var dql2 = “select * from tlk_aa where istmp=0 “;
var datas2 = queryBySQLNoPage(dql2); //
if(datas2!=null && datas2.size()>0){
for(var iter2 = datas2.iterator();iter2.hasNext();){
var doc2 = iter2.next();
}
}
var dql1 = “select * from tlk_aa where istmp=0 “;
var datas1 = queryBySQLNoPage(dql1); //
if(datas1!=null && datas1.size()>0){
for(var iter1 = datas1.iterator();iter1.hasNext();){
var doc1 = iter1.next();
}
}
=====================================================
获取人的所有角色
var roles = getWebUser().getRoles();
var rolename=””;
for(var it = roles.iterator();roles!=null && it.hasNext();){
var role = it.next();
if(rolename.equals(“”)){
rolename += role.getName();//获取角色名
}else{
rolename += “;” + role.getName();//获取角色名
}
}
rolename
======================================================
视图自定义html 加链接
var id = getId();
var fid = getCurrentDocument().getFormid();
var url = “<a href=\”javaScript:viewDoc(‘”+ id +”‘, ‘”+fid+”‘, ‘false’,”)\” > ”
“<td rowspan=”+arr.length+”>”+url+getDocItemValueAsString(docid, “Fd_SaleNo”)+”</a></td>”
=====================================================
打开页面,可以传参 VIEW_TYPE_NORMAL是打开方式,277
openWindowByType(url,’选择’, VIEW_TYPE_NORMAL);
=====================================================
流程:当前审批人:
//返回的是对象
function getCurrentApproval(){
var doc = $CURRDOC.getCurrDoc();
var processor = “”;
if(doc.getState() != null) {
var actors = doc.getState().getActors();
if (actors != null) {
for(var it = actors.iterator(); it.hasNext(); ) {
var actorrt = it.next();
if (actorrt.getIsprocessed()) {
continue;
}
//processor += actorrt.getName() +”,”;//获取审批人姓名
processor += actorrt.getActorid() + “,”;//获取审批人ID
//processor += getUserById(actorrt.getActorid()).getLoginno()+ “,”;//获取审批人登录账号名
}
processor = processor.substring(0,processor.length-1);//去除最后一个多余的单引号
}
}
return processor;
}
=====================================================
根据部门id获取部门名称
var process = createProcess(“cn.myapps.core.department.ejb.DepartmentProcess”);//部门业务处理类
var dept=process.doView(id);//id为部门ID,获取部门对象
var name=dept.getName();//获取部门名称
=====================================================
默认部门
getWebUser().getDefaultDepartment();
=====================================================
下拉框
var opts=createOptions();
opts.add(“”,””);
var dql = “$formname=’Fm_ClientMsg'”;
var datas = queryByDQL(dql);
if(datas!=null && datas.size()>0){
for(var iter = datas.iterator();iter.hasNext();){
var doc = iter.next();
opts.add(doc.getItemValueAsString(“Fd_CilentName”),doc.getId());
}
}
opts;
========================= 流程 ==============================
Q:流程设计的表结构
A:流程设计的表结构:t_flowstatert 是存储当前文档流程状态的表 通过docid 与t_document 表关联
t_t_nodert 存储的是文档流程状态下的所处的节点信息 通过 flowstatert_id 与t_flowstatert关联
t_actorrt 储存的是文档流程状态所处的某个节点的处理人信息 通过 nodert_id与t_t_nodert 关联
========================= 流程审批人 ==========================
//会签
var sp1 = getItemValueAsString(“Fd_ProjPeo1”); //分项目负责人
var sp2 = getItemValueAsString(“Fd_ProjPeo2”); //助理
var sp3 = getItemValueAsString(“Fd_ProjPeo3”); //各专业总师
var sp4 = getItemValueAsString(“Fd_Peos”); //其他要求-个人
var sp5 = getItemValueAsString(“Fd_DesiMana”); //设计部
var sp6 = getItemValueAsString(“Fd_DesiManasd”);//设计所长(室)
var allspr = sp1+”;”+sp2+”;”+sp3+”;”+sp4+”;”+sp5+”;”+sp6;
var arr = splitText(allspr,”;”);
var userlist = createObject(“java.util.ArrayList”);
for (var i=0;i<arr.length;i++){
if(arr[i] != null && arr[i].trim().length() > 0){
userlist.add(getUserById(arr[i]));
}
}
userlist;
========================= 流程挂起 ==========================
具体也是在t_nodert这个表里面的state,1表示挂起,0表示正常
select * from t_nodert where docid = ’11e7-3c58-87857bc6-8c04-4b11864d5317′
========================= update数据库 ============================
var docId = getCurrentDocument().getId();
var sql = “update t_nodert set issuspend = true where docid = ‘”+docId+”‘” ;
updateByDSName(“apcegl” , sql);
========================= 获取手机号 ===============================
var user=getUserById(id) //根据用户Id获取用户对象
telephone=user.getTelephone()+”,”
========================= 当前人默认部门 ===============================
var id = getWebUser().getDefaultDepartment();
var rtn = “”;
if(id != null && id.trim().length() > 0){
var process = getDepartmentProcess();
rtn = process.doView(id).getName();
}
rtn;
========================= 根据名字更新为id ===============================
UPDATE jhkj_apcegl.tlk_fm_deptinfo o SET o.ITEM_FD_MAINAUTHOR=(select p.ID from jhkj_apce.t_user p where p.NAME =o.ITEM_FD_MAINAUTHOR)
============================================================
审批意见:getParameter(“_attitude”)
审批状态[0为同意,1为不同意]:getParameter(“Fd_OptionInfo”)
============================================================
不好用,去不掉上一个session。
传送参数
var request = $WEB.getParamsTable().getHttpRequest();
request.getSession().setAttribute(“test”,”111″);
接受参数
var request = $WEB.getParamsTable().getHttpRequest();
request.getSession().getAttribute(“test”);
============================================================
url传值:
var request = $WEB.getParamsTable().getHttpRequest();
var url1=”http://”+request.getServerName()+”:”+request.getServerPort()+request.getContextPath();
var wenhao = getItemValueAsString(“symbol”);
var _formid = “11e5-0a59-60a289d5-94de-f587d65dcac9”;
var application= “11de-f053-df18d577-aeb6-19a7865cfdb6”;
var _resourceid = “11e5-0a63-8eff3cd6-94de-f587d65dcac9”;
var url =url1+”/portal/dynaform/document/newWithPermission.action?_formid=”+_formid+”&_isJump=1&application=”+application+”&_resourceid=”+_resourceid+”&wenhao=”+encodeURI(wenhao)+”&_backURL=../../../portal/cool/closeTab.jsp”;
============================================================
设置按钮在同一行
<style>#btn1,#btn1 li{display:inline;}</style>
<div id=”btn1″>
</div>
=============================================================
删除数据:
DELETE FROM T_DOCUMENT WHERE id IN(SELECT a.ID FROM (SELECT ID FROM tlk_”+formname+” WHERE “+sql+”) as a)
===========================================================
截取字符串
IS:AA.substr(0,0)
mysql:
============================================================
计算的文本【签名】
var cuserid= getWebUser().getId(); //当前人ID
var cusername = getWebUser().getName(); //当前人姓名
var ctime = format(getToday(),”yyyy-MM-dd”); //当前时间
var docid = getCurrentDocument().getId(); //文档ID
var docid2 = replaceString(docid,”-“,””); //没有-的文档ID【用于函数】
var yunames=”Fd_pic4″; //签名的域名
var rtn = “<input type=’button’ value=’签名’ name=’btnSelectDept’ οnclick=’csingc”+docid2+”_”+yunames+”()’ class=’enterIndex’>”;
rtn+=” <input type=’button’ name=’btnDelete’ value=’取消’ “;
rtn+=” οnclick=\”document.getElementById(‘”+docid+”_”+yunames+”‘).value=” ;document.getElementById(‘”+docid+”_”+yunames+”singe’).innerHTML=”;doSave(’46’, ’11e8-1947-b0b38ed6-9986-030edc316749′) \” “;
rtn+=” class=’enterIndex’> “;
rtn+=”<script>”;
rtn+=” function csingc”+docid2+”_”+yunames+”(){ “;
rtn+=” document.getElementById(‘”+docid+”_”+yunames+”‘).value= \”<ul><li style=’float:left;’><img src=’/singe/”+cuserid+”.jpg’ title='”+cusername+”‘ />*”+ctime+”</li></ul>\” ; “;
rtn+=” var str1k = \”<ul><li style=’float:left;’><img src=’/uploads/singe/”+cuserid+”.jpg’ title='”+cusername+”‘ />”+ctime+”</li></ul>\” ;”;
rtn+=” document.getElementById(‘”+docid+”_”+yunames+”singe’).innerHTML=str1k;”;
rtn+=”doSave(’46’, ’11e8-1947-b0b38ed6-9986-030edc316749′);”;
rtn+=”}”
rtn+=”</script>”;
rtn
============================================================
IS:四舍五入到小数点后2位
round(val1*val2,2);
==============================================================
//打开层方法
function OpenDialog(url){
var opener = window.top;//从哪个页面打开弹出框,例如:window本页面/window.parent父页面/top顶级页面…
opener.JHKJ.dialog.show({
refreshOpener: false,//是否刷新弹出框的打开页面
refreshTrigger:false,//是否刷新触发弹出框的页面
trigger: window,//传入触发弹出框的本页面,默认值无值时为打开弹出框的页面
maximized: false,//是否允许弹出框最大化,默认不填则允许最大化
width: ‘1500’,//弹出框宽度
height: ‘800’,//弹出框高度,不能为百分比
url: url,//弹出框的地址
args: {},//传入弹出框的参数,这里的形式自己定义,可为数组/对象/字符串…
title: ”,//弹出框的标题
close: function(rtVal) {//弹出框的回调函数,返回值
dy_refresh(“”)
}
});
}
//普通打开
function openForms(url,backurl,target){
if(backurl==””){
backurl = window.location.href;
}if(target==””){
target = “_self”;
}
if(url.indexOf(“&”)!=-1){
window.open(url+”&_backURL=”+encodeURIComponent(backurl),target)
}else{
window.open(url+”?_backURL=”+encodeURIComponent(backurl),target)
}
}
============================================================
菜单自定义链接
var applicationid=”11e2-faba-29768458-ac72-af31f40dcc3f”;//固定死的软件id
var domainid=”11e2-faba-c7b9a680-ac72-af31f40dcc3f”;//固定死的企业域id
var sql=”select * from tlk_测试A”;
var process = getDocProcess(applicationid);
var datas=process.queryBySQL(sql,domainid).datas;//根据sql语句和企业域id获取数据集
excel导入:部门的值:
(function(){
var deparmentID = “”; // 办公室
var doc = getCurrentDocument();
var dValue = doc.getItemValueAsString(“Fd_Dept”); //获取到相应的部门名称【字段名称】,英文那个
println(“dValue—–>>>”+dValue);
if(dValue!=null&&dValue.trim().length()>0){
var process = getDepartmentProcess();
var domainid = getDomainid();
var deptId = “”;
var deptlist = process.getDepartmentByName(dValue,domainid);
if(deptlist!=null && deptlist.size()>0){
for(var iter = deptlist.iterator();iter.hasNext();){
var dept = iter.next();
return dept.getId();
}
}
}
return deparmentID;
println(“deparmentID—–>>>”+deparmentID);
})();
======================================================================
删除查看人员
DELETE FROM t_circulator WHERE doc_id=’11e8-589f-d3e1922d-94eb-b505bcc534ac’
======================================================================
修改审批记录
SELECT * FROM t_actorhis WHERE INSTR(ATTITUDE,’2018年版协议第五条,’)
//删除审批环节
select * from t_nodert where docid=’11e8-ab62-ed18f33e-b4df-9f7d7fe87abe’
select * from t_flowstatert where docid=’11e8-ab62-ed18f33e-b4df-9f7d7fe87abe’
弹出新表单连接:
getContextPath()+”/portal/dynaform/document/new.action?_formid=11e8-bd41-118a72d5-82e3-b9c966406ea7&_isJump=1″
//弹出旧表单链接:
url += getContextPath()+”/portal/dynaform/document/view.action?”;
url += “_docid=”+getCurrentDocument().getId()+”&_formid=”+getCurrentDocument().getFormid();
url += “&application=”+getApplication();
树状的部门值:
管理委员会&11ea-7a58-b7c4cc31-a299-d3253b8a252a
=============================================================
创建有流程的表单
var curdoc = getCurrentDocument();
//生成项目任务单
var LXID = getItemValueAsString(“LXID”);
var bdid = curdoc.getId();
var Fd_ProjName = getDocItemValueAsString(LXID,”Fd_ProjName”);
var process = getDocumentProcess();
var formProcess = new Packages.cn.myapps.core.dynaform.form.ejb.FormProcessBean();
var flowid=”11e9-f3cf-60c2ce60-b04c-6f92c4c166e6″;
var form = formProcess.doViewByFormName(“FMPM_DesiTaskCardBySign”,getApplication());
var xmjl = curdoc.getItemValueAsString(“Fd_RWXDR”);
var user = getUserById(xmjl);
var tuser = new Packages.cn.myapps.core.user.action.WebUser(user);
var doc = process.doNew(form,tuser,new Packages.cn.myapps.base.action.ParamsTable());
doc.setFlowid(flowid);
var params =new Packages.cn.myapps.base.action.ParamsTable();
doc.addStringItem(“pid”,LXID);
doc.addStringItem(“Fd_ReQueMan”,xmjl);
doc.addStringItem(“Fd_ProjName”,Fd_ProjName);
doc.addStringItem(“QRDId”,bdid);
params.setParameter(“_flowid”,flowid);
getDocumentProcess().doStartFlowOrUpdate(doc,params,tuser);
==========================================
创建普通表单
var processfunc = getDocumentProcess();
var formProcessfunc = new Packages.cn.myapps.core.dynaform.form.ejb.FormProcessBean();
var arr = splitText(names, “,”);
for (var i=0;i<arr.length;i++){
if(!arr[i].equals(“”)){
var form2 = formProcessfunc.doViewByFormName(“Fm_ScoringEdit”,getApplication());
var doc2 = processfunc.doNew(form2,tuser,new Packages.cn.myapps.base.action.ParamsTable());
doc2.addStringItem(“GLID”,pid);
doc2.addStringItem(“XMID”,xmid);
doc2.addDateItem(“Fd_Stime”,getToday());
doc2.addDateItem(“Fd_PlanEtime”,etime);
doc2.addStringItem(“Fd_FormName”,formnames);
doc2.addStringItem(“Fd_flowNames”,flownames);
doc2.addStringItem(“Fd_Name”,arr[i]);
doc2.setParent(pid);
processfunc.doCreate(doc2);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117761.html