dubbo参数自动获取

pull/19/head
暮光:城中城 6 years ago
parent 1f4008667c
commit 7f78d77235

@ -72,6 +72,10 @@ http://127.0.0.1:8082/zyplayer-doc-manage/static/manage/home.html
4. 支持文档查找、文档编辑、在线调试接口 4. 支持文档查找、文档编辑、在线调试接口
5. 自动获取参数列表需要指定的类存在,所以请在 pom.xml -> dependencies 最后加上服务所在的包后端才能通过Class.forName("xx");来找到参数列表,减少录入成本
6. 数组或List参数调试参数录入格式例[1,2] 后端通过JSON工具转成指定类型有不支持的类型时欢迎反馈
##### 四、zyplayer-doc-manage ##### 四、zyplayer-doc-manage
1. 整合了上面两个功能到此项目,较少熟悉成本,`git clone`下来即可运行 1. 整合了上面两个功能到此项目,较少熟悉成本,`git clone`下来即可运行

@ -3,6 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="开发者列表暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>数据库文档</title> <title>数据库文档</title>
<link rel="shortcut icon" href="webjars/doc-db/img/api.ico"/> <link rel="shortcut icon" href="webjars/doc-db/img/api.ico"/>
<link rel="stylesheet" href="webjars/zui/css/zui.min.css" /> <link rel="stylesheet" href="webjars/zui/css/zui.min.css" />

@ -8,6 +8,8 @@ var pageConfig = {
var tableRelationCharts; var tableRelationCharts;
$(document).ready(function(){ $(document).ready(function(){
// 无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢
console.log("%c项目信息\n开发者列表暮光城中城\n项目地址https://gitee.com/zyplayer/zyplayer-doc","color:red");
$('select.chosen-select').chosen({ $('select.chosen-select').chosen({
no_results_text: '没有找到', // 当检索时没有找到匹配项时显示的提示文本 no_results_text: '没有找到', // 当检索时没有找到匹配项时显示的提示文本
disable_search_threshold: 0, // 10 个以下的选择项则不显示检索框 disable_search_threshold: 0, // 10 个以下的选择项则不显示检索框

@ -128,6 +128,8 @@
<artifactId>spring-context-support</artifactId> <artifactId>spring-context-support</artifactId>
<version>1.0.2</version> <version>1.0.2</version>
</dependency> </dependency>
<!-- 业务包 -->
</dependencies> </dependencies>
<licenses> <licenses>

@ -26,8 +26,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.*; import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -84,11 +88,48 @@ public class DubboController {
dubboNodeInfo.setIp(param.getIp()); dubboNodeInfo.setIp(param.getIp());
dubboNodeInfo.setPort(param.getPort()); dubboNodeInfo.setPort(param.getPort());
dubboNodeInfo.setInterfaceX(param.getService()); dubboNodeInfo.setInterfaceX(param.getService());
String[] paramTypes = Optional.ofNullable(param.getParamTypes()).orElse(new String[]{}); String paramTypeStr = Optional.ofNullable(param.getParamTypes()).orElse("");
Object[] params = Optional.ofNullable(param.getParams()).orElse(new Object[]{}); String paramsStr = Optional.ofNullable(param.getParams()).orElse("");
List<String> typeList = JSON.parseArray(paramTypeStr, String.class);
List<String> paramList = JSON.parseArray(paramsStr, String.class);
List<String> queryTypeList = new LinkedList<>();
List<Object> queryParamList = new LinkedList<>();
for (int i = 0; i < paramList.size(); i++) {
String typeStr = typeList.get(i);
String paramStr = paramList.get(i);
try {
if (typeStr.endsWith("[]")) {
String type = typeStr.substring(0, typeStr.length() - 2);
Class<?> aClass = Class.forName(type);
List<?> objects = JSON.parseArray(paramStr, aClass);
queryTypeList.add(typeStr);
queryParamList.add(objects);
} else if (typeStr.matches("java\\.util\\.List<.+>")) {
Pattern pattern = Pattern.compile("java\\.util\\.List<(.+)>");
Matcher matcher = pattern.matcher(typeStr);
if (matcher.find()) {
String group = matcher.group(1);
Class<?> aClass = Class.forName(group);
List<?> objects = JSON.parseArray(paramStr, aClass);
queryParamList.add(objects);
queryTypeList.add("java.util.List");
}
} else {
Class<?> aClass = Class.forName(typeStr);
Object object = JSON.parseObject(paramStr, aClass);
queryParamList.add(object);
queryTypeList.add(typeStr);
}
} catch (Exception e) {
// 未找到对应类型,请手动引入项目包
logger.error("未找到对应类型,请手动引入项目包:{}", typeStr);
queryParamList.add(paramStr);
queryTypeList.add(typeStr);
}
}
GenericService bean = ReferenceConfigHolder.getBean(dubboNodeInfo); GenericService bean = ReferenceConfigHolder.getBean(dubboNodeInfo);
try { try {
Object result = bean.$invoke(param.getMethod(), paramTypes, params); Object result = bean.$invoke(param.getMethod(), queryTypeList.toArray(new String[]{}), queryParamList.toArray());
return DocResponseJson.ok(result); return DocResponseJson.ok(result);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -120,6 +161,57 @@ public class DubboController {
return DocResponseJson.ok(dubboInfoVo); return DocResponseJson.ok(dubboInfoVo);
} }
/**
*
*
* @author
* @since 2019210
**/
@PostMapping(value = "/findDocInfo")
public DocResponseJson findDocInfo(DubboRequestParam param) {
List<DubboDocInfo.DubboDocParam> paramList = new LinkedList<>();
try {
Class clazz = Class.forName(param.getService());
Method[] methods = clazz.getMethods();
for (Method method : methods) {
String methodName = method.getName();
if (methodName.equals(param.getMethod())) {
Type[] parameterTypes = method.getGenericParameterTypes();
for (Type clas : parameterTypes) {
DubboDocInfo.DubboDocParam docParam = new DubboDocInfo.DubboDocParam();
docParam.setParamType(clas.getTypeName());
paramList.add(docParam);
}
}
}
} catch (ClassNotFoundException e) {
return DocResponseJson.warn("未找到指定类,请引入相关包,类名:" + param.getService());
}
if (paramList.isEmpty()) {
return DocResponseJson.ok();
}
Map<String, DubboDocInfo> docInfoMap = new HashMap<>();
String dubboServiceDoc = mgDubboStorageService.get(StorageKeys.DUBBO_SERVICE_DOC);
if (StringUtils.isNotBlank(dubboServiceDoc)) {
List<DubboDocInfo> docInfoList = JSON.parseArray(dubboServiceDoc, DubboDocInfo.class);
docInfoMap = docInfoList.stream().collect(Collectors.toMap(DubboDocInfo::getFunction, val -> val));
}
String function = param.getService() + "." + param.getMethod();
DubboDocInfo dubboDocInfo = docInfoMap.get(function);
if (dubboDocInfo == null) {
dubboDocInfo = new DubboDocInfo();
dubboDocInfo.setParams(paramList);
dubboDocInfo.setFunction(function);
dubboDocInfo.setVersion(1);
dubboDocInfo.setService(param.getService());
dubboDocInfo.setMethod(param.getMethod());
docInfoMap.put(function, dubboDocInfo);
List<DubboDocInfo> docInfoList = new ArrayList<>(docInfoMap.values());
mgDubboStorageService.put(StorageKeys.DUBBO_SERVICE_DOC, JSON.toJSONString(docInfoList));
}
return DocResponseJson.ok(dubboDocInfo);
}
/** /**
* *
* *

@ -11,14 +11,14 @@ public class DubboRequestParam {
private String method; private String method;
private String ip; private String ip;
private Integer port; private Integer port;
private String[] paramTypes; private String paramTypes;
private Object[] params; private String params;
public String[] getParamTypes() { public String getParamTypes() {
return paramTypes; return paramTypes;
} }
public void setParamTypes(String[] paramTypes) { public void setParamTypes(String paramTypes) {
this.paramTypes = paramTypes; this.paramTypes = paramTypes;
} }
@ -54,11 +54,11 @@ public class DubboRequestParam {
this.port = port; this.port = port;
} }
public Object[] getParams() { public String getParams() {
return params; return params;
} }
public void setParams(Object[] params) { public void setParams(String params) {
this.params = params; this.params = params;
} }
} }

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢--> <!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" /> <meta name="author" content="开发者列表:暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>dubbo文档管理系统</title> <title>dubbo文档管理系统</title>
<link rel="shortcut icon" href="webjars/doc-dubbo/img/dubbo.ico"/> <link rel="shortcut icon" href="webjars/doc-dubbo/img/dubbo.ico"/>
<link rel="stylesheet" href="webjars/doc-dubbo/css/element-ui.css"> <link rel="stylesheet" href="webjars/doc-dubbo/css/element-ui.css">
@ -51,7 +51,7 @@
<pre>{{dubboInfo.docInfo.explain}}<el-button @click.prevent="dubboInfoExplainShow = false;" style="float: right;">编辑</el-button></pre> <pre>{{dubboInfo.docInfo.explain}}<el-button @click.prevent="dubboInfoExplainShow = false;" style="float: right;">编辑</el-button></pre>
</div> </div>
<div v-else> <div v-else>
<el-input type="textarea" :rows="4" placeholder="请输入说明内容" v-model="docInfoExplainInput"></el-input> <el-input type="textarea" :rows="4" placeholder="维护人员、使用说明、便于搜索的信息" v-model="docInfoExplainInput"></el-input>
<el-button @click.prevent="dubboInfoExplainShow = true;" style="float: right;margin: 5px;">取消</el-button> <el-button @click.prevent="dubboInfoExplainShow = true;" style="float: right;margin: 5px;">取消</el-button>
<el-button type="primary" @click.prevent="saveDocInfoExplain" style="float: right;margin: 5px;">保存</el-button> <el-button type="primary" @click.prevent="saveDocInfoExplain" style="float: right;margin: 5px;">保存</el-button>
</div> </div>
@ -64,13 +64,13 @@
</el-table> </el-table>
</el-form-item> </el-form-item>
<el-form-item label="参数:"> <el-form-item label="参数:">
<div slot="label"> <!--<div slot="label">-->
<el-tooltip placement="top"> <!--<el-tooltip placement="top">-->
<div slot="content">1. 顺序必须和参数的顺序一致<br/>2. 参数名意义不大,可不填<br/>3. 类型必填,可手动输入,必须是全类名</div> <!--<div slot="content">1. 顺序必须和参数的顺序一致<br/>2. 参数名意义不大,可不填</div>-->
<i class="el-icon-info" style="color: #aaa;"></i> <!--<i class="el-icon-info" style="color: #aaa;"></i>-->
</el-tooltip> <!--</el-tooltip>-->
参数: <!--参数:-->
</div> <!--</div>-->
<el-table :data="docParamList" border style="width: 100%; margin-bottom: 5px;"> <el-table :data="docParamList" border style="width: 100%; margin-bottom: 5px;">
<el-table-column label="顺序" width="100"> <el-table-column label="顺序" width="100">
<template slot-scope="scope">{{scope.$index + 1}}</template> <template slot-scope="scope">{{scope.$index + 1}}</template>
@ -81,11 +81,12 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="类型" width="300"> <el-table-column label="类型" width="300">
<template slot-scope="scope"> <template slot-scope="scope">{{scope.row.paramType}}</template>
<el-select v-model="scope.row.paramType" filterable allow-create clearable placeholder="请选择" style="width: 100%;"> <!--<template slot-scope="scope">-->
<el-option v-for="item in paramTypeOptions" :key="item.value" :label="item.value" :value="item.value"></el-option> <!--<el-select v-model="scope.row.paramType" filterable allow-create clearable placeholder="请选择" style="width: 100%;">-->
</el-select> <!--<el-option v-for="item in paramTypeOptions" :key="item.value" :label="item.value" :value="item.value"></el-option>-->
</template> <!--</el-select>-->
<!--</template>-->
</el-table-column> </el-table-column>
<el-table-column label="说明"> <el-table-column label="说明">
<template slot-scope="scope"> <template slot-scope="scope">
@ -94,14 +95,14 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-button @click.prevent="saveDocInfoParam" type="primary" style="float: right;margin: 5px;">保存</el-button> <el-button @click.prevent="saveDocInfoParam" type="primary" style="float: right;margin: 5px;">保存</el-button>
<el-button @click.prevent="addDocParam" style="float: right;margin: 5px;">添加</el-button> <!--<el-button @click.prevent="addDocParam" style="float: right;margin: 5px;">添加</el-button>-->
</el-form-item> </el-form-item>
<el-form-item label="结果:"> <el-form-item label="结果:">
<div v-if="dubboInfoResultShow"> <div v-if="dubboInfoResultShow">
<pre>{{dubboInfo.docInfo.result}}<el-button @click.prevent="dubboInfoResultShow = false;" style="float: right;">编辑</el-button></pre> <pre>{{dubboInfo.docInfo.result}}<el-button @click.prevent="dubboInfoResultShow = false;" style="float: right;">编辑</el-button></pre>
</div> </div>
<div v-else> <div v-else>
<el-input type="textarea" :rows="4" placeholder="请输入说明内容" v-model="docInfoResultInput"></el-input> <el-input type="textarea" :rows="4" placeholder="结果集说明等" v-model="docInfoResultInput"></el-input>
<el-button @click.prevent="dubboInfoResultShow = true;" style="float: right;margin: 5px;">取消</el-button> <el-button @click.prevent="dubboInfoResultShow = true;" style="float: right;margin: 5px;">取消</el-button>
<el-button type="primary" @click.prevent="saveDocInfoResult" style="float: right;margin: 5px;">保存</el-button> <el-button type="primary" @click.prevent="saveDocInfoResult" style="float: right;margin: 5px;">保存</el-button>
</div> </div>
@ -128,7 +129,7 @@
<el-table-column label="参数名" width="200"> <el-table-column label="参数名" width="200">
<template slot-scope="scope">{{scope.row.paramName}}</template> <template slot-scope="scope">{{scope.row.paramName}}</template>
</el-table-column> </el-table-column>
<el-table-column label="类型" width="200"> <el-table-column label="类型" width="300">
<template slot-scope="scope">{{scope.row.paramType}}</template> <template slot-scope="scope">{{scope.row.paramType}}</template>
</el-table-column> </el-table-column>
<el-table-column label="参数值" width="300"> <el-table-column label="参数值" width="300">
@ -221,6 +222,8 @@
}, },
mounted: function () { mounted: function () {
// 无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢
console.log("%c项目信息\n开发者列表暮光城中城\n项目地址https://gitee.com/zyplayer/zyplayer-doc","color:red");
this.doGetServiceList(); this.doGetServiceList();
}, },
methods: { methods: {
@ -233,10 +236,31 @@
handleNodeClick(data) { handleNodeClick(data) {
if (data.children == null) { if (data.children == null) {
var path = data.interface; var path = data.interface;
var docInfo = app.dubboDocMap[path];
if (!!docInfo) {
this.createDocInfo(path, data.method);
} else {
var service = path.substring(0, path.lastIndexOf("."));
var method = path.substring(path.lastIndexOf(".") + 1, path.length);
var param = {service: service, method: method};
ajaxTemp("zyplayer-doc-dubbo/doc-dubbo/findDocInfo", "post", "json", param, function (json) {
if (validateResult(json)) {
if (!!json.data) {
app.dubboDocMap[json.data.function] = json.data;
}
app.createDocInfo(path, method);
}
});
}
//console.log(app.dubboInfo);
}
},
createDocInfo(path, method) {
var docInfo = app.dubboDocMap[path];
var dubboInfo = app.treePathDataMap.get(path); var dubboInfo = app.treePathDataMap.get(path);
dubboInfo.method = data.method; dubboInfo.method = method;
dubboInfo.function = path; dubboInfo.function = path;
dubboInfo.docInfo = app.dubboDocMap[path] || {}; dubboInfo.docInfo = docInfo || {};
// 清空再赋值才会重新渲染 // 清空再赋值才会重新渲染
app.dubboInfo = {}; app.dubboInfo = {};
app.dubboInfo = dubboInfo; app.dubboInfo = dubboInfo;
@ -257,8 +281,6 @@
if (app.requestHostOptions.length > 0) { if (app.requestHostOptions.length > 0) {
app.requestHostValue = app.requestHostOptions[0].value; app.requestHostValue = app.requestHostOptions[0].value;
} }
//console.log(app.dubboInfo);
}
}, },
reloadService(){ reloadService(){
ajaxTemp("zyplayer-doc-dubbo/doc-dubbo/reloadService", "post", "json", {}, function (json) { ajaxTemp("zyplayer-doc-dubbo/doc-dubbo/reloadService", "post", "json", {}, function (json) {
@ -327,6 +349,7 @@
app.dubboInfoResultShow = true; app.dubboInfoResultShow = true;
app.docParamList = json.data.params || []; app.docParamList = json.data.params || [];
app.createDocParamRequestList(); app.createDocParamRequestList();
Toast.success("保存成功!");
} }
}); });
}, },
@ -368,8 +391,8 @@
method: method, method: method,
ip: ip, ip: ip,
port: port, port: port,
paramTypes: paramTypes, paramTypes: JSON.stringify(paramTypes),
params: params, params: JSON.stringify(params),
}; };
app.requestResult = ""; app.requestResult = "";
app.onlineDebugLoading = true; app.onlineDebugLoading = true;

@ -104,7 +104,7 @@ DROP TABLE IF EXISTS `zyplayer_storage`;
CREATE TABLE `zyplayer_storage` ( CREATE TABLE `zyplayer_storage` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID',
`doc_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数名字', `doc_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数名字',
`doc_value` varchar(2048) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数值', `doc_value` mediumtext COMMENT '参数值',
`creation_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', `creation_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,

@ -3,6 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="开发者列表暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>文档管理系统</title> <title>文档管理系统</title>
<link rel="shortcut icon" href="../lib/mg/img/api.ico"/> <link rel="shortcut icon" href="../lib/mg/img/api.ico"/>
<link rel="stylesheet" href="../lib/zui/css/zui.min.css" /> <link rel="stylesheet" href="../lib/zui/css/zui.min.css" />
@ -83,6 +85,8 @@
* 网页加载完毕后的处理 * 网页加载完毕后的处理
*/ */
$(document).ready(function(){ $(document).ready(function(){
// 无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢
console.log("%c项目信息\n开发者列表暮光城中城\n项目地址https://gitee.com/zyplayer/zyplayer-doc","color:red");
// 定义配置的标签页 // 定义配置的标签页
var tabsArr = [ var tabsArr = [
{id: 'about', url: './about.html', type: 'iframe', icon: 'icon-info-sign', forbidClose: false}, {id: 'about', url: './about.html', type: 'iframe', icon: 'icon-info-sign', forbidClose: false},

@ -3,6 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="开发者列表暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>接口文档管理系统</title> <title>接口文档管理系统</title>
<link rel="shortcut icon" href="webjars/mg-ui/img/api.ico"/> <link rel="shortcut icon" href="webjars/mg-ui/img/api.ico"/>
<link rel="stylesheet" href="webjars/zui/css/zui.min.css" /> <link rel="stylesheet" href="webjars/zui/css/zui.min.css" />

@ -3,6 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="开发者列表暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>接口文档管理系统</title> <title>接口文档管理系统</title>
<link rel="shortcut icon" href="webjars/open-doc/img/api.ico"/> <link rel="shortcut icon" href="webjars/open-doc/img/api.ico"/>
<link rel="stylesheet" href="webjars/zui/css/zui.min.css" /> <link rel="stylesheet" href="webjars/zui/css/zui.min.css" />

@ -44,6 +44,8 @@ var rightContentTabs;
* 网页加载完毕后的处理 * 网页加载完毕后的处理
*/ */
$(document).ready(function(){ $(document).ready(function(){
// 无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢
console.log("%c项目信息\n开发者列表暮光城中城\n项目地址https://gitee.com/zyplayer/zyplayer-doc","color:red");
globalLoadingMessager = new $.zui.Messager({type: 'primary', close: false, time: 0}).show(); globalLoadingMessager = new $.zui.Messager({type: 'primary', close: false, time: 0}).show();
showGlobalLoadingMessage('检查服务中,请稍候...', true); showGlobalLoadingMessage('检查服务中,请稍候...', true);
ajaxTemp("swagger-mg-ui/storage/checkConfig", "post", "json", { ajaxTemp("swagger-mg-ui/storage/checkConfig", "post", "json", {

@ -44,6 +44,8 @@ var rightContentTabs;
* 网页加载完毕后的处理 * 网页加载完毕后的处理
*/ */
$(document).ready(function(){ $(document).ready(function(){
// 无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢
console.log("%c项目信息\n开发者列表暮光城中城\n项目地址https://gitee.com/zyplayer/zyplayer-doc","color:red");
globalLoadingMessager = new $.zui.Messager({type: 'primary', close: false, time: 0}).show(); globalLoadingMessager = new $.zui.Messager({type: 'primary', close: false, time: 0}).show();
showGlobalLoadingMessage('检查服务中,请稍候...', true); showGlobalLoadingMessage('检查服务中,请稍候...', true);
// open-doc请求地址不同 // open-doc请求地址不同

Loading…
Cancel
Save