云之家JS-API文档

特别说明: 桌面端从UserAgent版本0.0.2开始支持部分JS-API接口!所支持的接口为:

1、概述

云之家JS-API能够提供轻应用在云之家中更好的展示和交互,方便轻应用轻松获得云之家的设备能力。

1.1、使用必要条件

轻应用必须应用于云之家APP(注意的是:目前云之家移动端可以使用全部的JS-API接口、桌面端仅有部分接口使用)中,如果脱离了云之家APP,而在其他的浏览器中打开,则不能使用到云之家的JS-API功能。

使用Javascript进行调用!

桌面端从userAgent版本0.0.2开始支持部分JS-API接口,同时支持桌面端的JS-API接口会有(桌面端+)的标识。依然通过qing.js来调用,有些细节不一致的将在下面说明

1.2、JS-API介绍

1.3、JS-API使用步骤

1.3.1、引入JS文件

在需要调用JS接口的页面引入如下JS文件,qingjs.js

引入示例:

1.3.2、调用处理

笔者建议在对云之家JS-API接口进行调用前,先判断当前环境是否支持调用JS-API接口,以便在不同环境中调用时有一些辅助的提示信息。

以“获取当前用户身份信息”的JS-API接口为例,示例代码:

//判断是否运行于云之家App中

function isYzjApp () {

return navigator.userAgent.match(/Qing\/.*;(iPhone|Android).*/)?true:false;

}

/* 判断是否运行于云之家桌面端

* @return {object} cloudhub 返回是否桌面端、当前桌面端userAgent版本及是否支持JS-API

* cloudhub = {isCloudHub: true | false, hasJS-APIt: true | false, version: '0.0.1'}

*/

function getCloudHub () {

var ua = window.navigator.userAgent;

var reg = /cloudhub 10204\/([^;]+)/;

var cloudhub = {

isCloudHub: false,

hasJS-APIt: false,

version: ''

};

var match = reg.exec(ua), version;

if (match) {

version = match[1];

cloudhub.isCloudHub = true,

cloudhub.version = version;

if (version.replace(/\./g, '') > 1) {

cloudhub.hasJS-APIt = true;

}

}

return cloudhub;

}

//获取操作系统平台,

iOS或Android

function getOS () {

return (navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) ? 'iOS' :

navigator.userAgent.match(/Android/i) ? 'Android' : '' );

}

// 是否在手机上

function isMobile () {

var os = getOS();

return os == 'iOS' || os == 'Android';

}

if (!isYzjApp() || !getCloudHub().isCloudHub) {

$body.html("Hello!当前不在云之家App(桌面端)中!开启您的轻应用之旅吧!");

if(!isMobile()) {

$body.html("Hello!当前不在手机端上!开启您的轻应用之旅吧!");

}

} else {

XuntongJSBridge.call('getPersonInfo', {}, function(result) {

if (null != result && undefined != result) {

/* **** 注意 start **** */

/* **** 由于在桌面端,实现JS-API方式不同,这里的回调返回值result是一个string **** */

/* **** 为确保result正常使用,建议在回调中添加如下代码 **** */

if (typeof result == 'string') {

result = JSON.parse(result);

}

/* **** 注意 end **** */

var desc = "返回的数据:

var success = String(result.success);

if (success == "true") {

$body.html(desc + "。

} else if (success == "false") {

$body.html(desc + "。

} else {

$body.html("返回有问题!");

}

} else {

$body.html("返回失败!");

}

});

}

1.3.3、处理回调

当调用云之家JS-API后,当返回为空时,表明处理成功,轻应用可以自行处理后续的工作;当有返回时,轻应用对此返回结果进行处理后再进行后续的开发,返回的格式为:

{

success: true or false 是否成功(string)

error: 错误信息(string)

errorCode: 错误码(int)

data: {

...

}

}

其中的返回说明如下表。

字段名称数据类型说明

successstring接口调用是否成功。返回“true”说明成功;返回“false”说明失败;返回“其他的”说明接口实现有问题。

errorstring接口调用失败的详细信息。

errorCodeint接口调用失败的错误码。

datajson接口调用成功,返回的数据。

特别注意:由于历史实现问题,Android返回的success字段返回类型为boolean,而iOS返回类型为字符串,即Android的success的值为true/false;iOS的success的值为"true"/"false"。为综合这两种情况,可以采取如下代码解决问题:var success = String(result.success);

if (success == "true") {

...

} else if (success == "false") {

...

} else {

alert("接口返回值非法!");

}

** 桌面端调用JS-API可根据返回值的errorCode来判断是否支持该JS-API(仅桌面端可用) ,若 errorCode == 404,表示桌面端不支持该JS-API

2、基础接口

由于目前桌面端JS-API版本的差异,以及仅支持部分接口,所以基础接口在这里的逻辑并没有给出对应方法,如需应用在云之家桌面端展示的,请参照下”调用处理”中相应代码。

2.1、判断当前客户端的身份

识别用户当前所处环境为非手机端还是Android还是iOS。见如下代码:

//获取操作系统平台,iOS或Android

function getOS () {

return (navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) ? 'iOS' :

navigator.userAgent.match(/Android/i) ? 'Android' : '' );

}

当以上方法返回不为Android或iOS时,则说明用户当前所处环境为非手机端。

2.2、判断当前环境是否支持JS-API

(1). 判断思路:判断当前环境是否支持JS-API,该依据是通过云之家轻应用专属的UserAgent值来判断。

云之家App轻应用的UserAgent格式如下:

轻应用框架标示/轻应用框架版本;系统名称 系统版本;手机品牌;手机硬件型号

例如:

iOS:Qing/0.9.0;iPhone OS 9.1;Apple;iPhone7,1 (iPhone7,1表示该机器为iPhone 6 Plus,参考iPhone Models)

Android:Qing/0.9.0;Android4.1.1;Xiaomi;MI 2

总结:

云之家App轻应用的UserAgent是以“/Qing\/.*;(iPhone|Android).*/”该正则表达式来匹配,当匹配到这个时,即云之家的客户端。

特别注意:

开发者不能直接单纯地拿以上的举例去作识别。即不能以如下代码:

navigator.userAgent == "Qing/0.9.0;iPhone OS 9.1;Apple;iPhone7,1 " ||

navigator.userAgent == "Qing/0.9.0;Android4.1.1;Xiaomi;MI 2 "

这样去判断,因为轻应用框架的版本号及其他的项并不是一成不变的!

当轻应用URL必须经过第三方服务进行转换时,第三方服务必须将来自于云之家的UserAgent进行转发,以免轻应用中获取到错误的运行环境,造成轻应用布局或业务不能达到预期的目标。

(2). 可以通过如下代码,进行判断:

// 轻应用是否运行于云之家的框架中而非其他浏览器中

navigator.userAgent.match(/Qing\/.*;(iPhone|Android).*/)?true:false;

当以上代码返回true,即当前环境支持JS-API,也即轻应用运行于云之家的框架中而非其他浏览器中。

3、隐藏或者设置页面标题

XuntongJSBridge.call('hideWebViewTitle');//隐藏页面标题

XuntongJSBridge.call('setWebViewTitle',{'title':'申请加入群聊'});//设置页面标题并显示

参数说明:

参数名称数据类型必选说明

titlestring是需要设置的标题

回调说明:无

4、获取当前用户身份信息(桌面端+)

仅限获取姓名、性别、头像、企业ID和用户ID。更多信息可参考获取云之家app当前用户上下文。

XuntongJSBridge.call('getPersonInfo', {}, function(result){

alert("用户数据:"+JSON.stringify(result));

});

参数说明:无

回调说明:

{

success: true or false 是否成功(string)

error: 错误信息(String)

errorCode: 错误码(int)

data: {

name:用户姓名(string)

photoUrl:用户头像地址(string)

gender:用户性别(int)

eid:云之家账号体系下的工作圈id(string)

openId:云之家账号体系下的用户id(string)

wbuserid:部落账号体系下的用户id(string)

wbnetworkid:部落账号体系下的工作圈id(string)

}

}

data中字段说明:

字段名称数据类型说明

namestring用户姓名。

photoUrlstring用户头像地址。

genderint用户性别,”0”为”男”,”1”为”女”。

eidstring云之家账号体系下的工作圈id。

openIdstring云之家账号体系下的用户id。

wbuseridstring部落账号体系下的用户id。

wbnetworkidstring部落账号体系下的工作圈id。

5、获取用户网络状态

XuntongJSBridge.call('getNetworkType', {}, function(result){

alert("用户网络状态:"+JSON.stringify(result));

});

参数说明:无

回调说明:

{

success: true or false 是否成功(string)

error: 错误信息(String)

errorCode: 错误码(int)

data: {

network_type:网络类型(string)

}

}

data中字段说明:

字段名称数据类型说明

network_typestring网络类型。

6、打开第三方应用

XuntongJSBridge.call('gotoApp', {

"data":'yunzhijia://p?url=https://itunes.apple.com/cn/app/id595672427'

}, function(result) {

alert("结果:"+JSON.stringify(result));

});

参数说明:

参数名称数据类型必选说明

datastring是第三方应用跳转Scheme。

其中url是必须的,表示应用的下载地址。

如果手机未安装应用,则跳转至此地址进行安装;

如果还需其他参数,则使用 & 接到后面;

如果是Android,也可定义为:packageName://className?key=value&key=value;

回调说明:

当调用成功时直接打开了第三方应用。

当调用失败时:

{

success: false

error: 错误信息(String)

errorCode: 错误码(int)

data:

}

7、进入会话

XuntongJSBridge.call('chat', {

'openId':'ge6sjw12sda2scdfefe2'

}, function(result) {

alert("结果:"+JSON.stringify(result));

});

参数说明:

参数名称数据类型必选说明

openIdstring与groupId二选一云之家账号体系下对话人的用户ID。

groupIdstring与openId二选一会话组ID。

回调说明:

{

success: true or false 是否成功(string)

error: 错误信息(String)

errorCode: 错误码(int)

data:

}

8、唤起人员详情页面

这里说的人员详情是指调出云之家APP上面的人员详情页,而不是返回人员详细的内容。

XuntongJSBridge.call('personInfo', {

'openId':'ge6sjw12sda2scdfefe2'

}, function(result) {

alert("结果:"+JSON.stringify(result));

});

参数说明:

参数名称数据类型必选说明

openIdstring是云之家账号体系下的用户ID。

回调说明:

当调用成功时直接调出指定人的个人信息详情页。

当调用失败时:

{

success: false

error: 错误信息(String)

errorCode: 错误码(int)

data:

}

9、转发接口

轻应用转发信息给用户或聊天组(桌面端+)

XuntongJSBridge.call("share", {

"shareType":"4",

"appId":"XXX",

"appName":"XXX",

"lightAppId":"XXX",

"title":"XXX",

"content":"XXX",

"thumbData":"XXX",

"thumbUrl":"xxx",

"webpageUrl":"XXX",

"cellContent":"XXX",

"sharedObject":"XXX",

"callbackUrl":"XXX"

}, function(result) {

alert("结果:"+JSON.stringify(result));

});

参数说明:

参数名称数据类型必选说明

shareTypestring是转发类型,目前仅支持4,表示轻应用转发信息。

appIdstring是轻应用ID或公共号ID,当为轻应用时传轻应用ID;当为公共号时传公共号ID。

appNamestring是轻应用名称或公共号名称,当为轻应用时传轻应用名称;当为公共号时传公共号名称。

themestring否主题(可选),如传入,创建组时以此命名组名称。

lightAppIdstring否轻应用ID(如果需要获取ticket,则必须传入此参数)。

titlestring是新闻标题。

contentstring是新闻内容。

thumbDatastringthumbUrl与thumbData二选一新闻缩略图,使用Base64编码。

thumbUrlstringthumbUrl与thumbData二选一新闻缩略图,完整的图片url。

webpageUrlstring是新闻的url。

cellContentstring是在聊天界面显示的内容。

sharedObjectstring是转发的对象:all(所有),group(组),person(人)。

callbackUrlstring否回调url,可选。

如果不为空,客户端会先调用此url,并且传入以下参数:

groupId或personId、eId、openId、content

(另外如果是一呼百应,需要使用云之家的token和token secret对请求进行签名,

即OAuth)

此url处理完业务后需返回:

{

“data”:“id=3dsfj7322jfnbg20s3d2”,

“error”:null,

“errorCode”:0,

“success”:true

}

取到data中的数据后接到webpageUrl后面。

callbackParamobject({key: value})否*仅桌面端支持*,回调callbackUrl时需要传入的额外参数及参数值

回调说明:

{

success: true or false 是否成功(string)

error: 错误信息(String)

errorCode: 错误码(int)

data:

}

10、切换工作圈

XuntongJSBridge.call("switchCompany", {

"eid":"XXX"

}, function(result) {

alert("结果:"+JSON.stringify(result));

});

参数说明:

参数名称数据类型必选说明

eidstring是云之家工作圈企业号。

回调说明:

{

success: true or false 是否成功(string)

error: 错误信息(String)

errorCode: 错误码(int)

data:

}

11、关闭轻应用界面

调用代码:

XuntongJSBridge.call('closeWebView');

参数说明:无

回调说明:无

12、获取图片

获取图片说的是调起云之家app的”获取图片”页,目前有2种方式:选择图片文件,或直接拍照。

调用代码:

XuntongJSBridge.call('selectPic', {'type':'camera'}, function(result){

alert("结果:"+JSON.stringify(result));

});

参数说明:

参数名称数据类型必选说明

typestring否类型,“camera”代表“相机”,“photo”代表“相册”,不传表示从相机、相册中选择(Qing/0.9.10及以上支持。)

回调说明:

{

success: true or false 是否成功(string)

error: 错误信息(string)

errorCode: 错误码(int)

data: {

fileExt:文件后缀(string)

fileData:文件数据的base64字符串(string)

}

}

data中字段说明:

字段名称数据类型说明

fileExtstring文件后缀。

fileDatastring用户头像地址。

13、扫一扫

XuntongJSBridge.call("scanQRCode", {

"needResult":0

}, function(result) {

});

参数说明:

参数名称数据类型必选说明

needResultint否是否需要处理,默认为0,扫描结果由云之家处理,1则直接返回扫描结果。

回调说明:

{

success: true or false 是否成功(String)

error: 错误信息(String)

errorCode: 错误码(int)

data:{

"qrcode_str":"xxx"

}

}

data字段说明:

字段名称数据类型说明

qrcode_strstring扫码返回的结果,该结果在needResult为1的时候;当needResult为0时,data字段不返回。

14、自定义右上角弹出菜单

XuntongJSBridge.call('createPop',

{

'popTitle':String,

'popTitleCallBackId':String,

'items':[

{'text':String,'callBackId':'String'},

{'text':String,'callBackId':'String'},

...

],

'menuList' : ['forward'(转发),'refresh'(刷新),'share'(分享),'openWithBrowser'(在浏览器中打开)],

'shareData' : {

'isShowExt':'转发时是否显示商务伙伴,true or false,默认为true'

'title' : '分享或者转发的标题',

'url' : '分享的链接,若空则取当前的url',

'description' : '分享或者转发的内容',

'appLogo' : '轻应用Logo,base64数据'

'appName' : '轻应用名称'

}

},

function(result){}

);

参数说明:

参数名称数据类型必选说明

popTitlestring否右上角弹出菜单名称,只支持最多4位中文字符,超出部分会截断显示(不传入popTitle,如果最后传入的有效条 目数大于0,则会默认显示云之家”更多”图标,如果有效条目数为0,则右上角不显示任何内容)

popTitleCallBackIdstring是点击右上角回调ID

itemsarray(object{'text':String,'callBackId':'String'})否自定义菜单条目(text:菜单条目文本、callBackId:回调ID)

menuListarray(string)否系统菜单条目,目前支持share(分享)、refresh(刷新)、openWithBrowser(在浏览器中打开)、forward(转发)

shareDataobject否分享或者转发的内容

注:

1、自定义菜单条目items数量和系统菜单条目menuList数量加起来不超过7条,如超过则优先显示系统菜单条目(比如items数量为5,menuList数量为4,则显示items前3条加menuList里的4条);

2、菜单显示顺序为优先显示自定义菜单条目,然后显示系统菜单条目,系统条目按JS方法传入的menuList顺序来显示;

15、关闭右上角弹出菜单

XuntongJSBridge.call('closePop');

16、云之家定位

XuntongJSBridge.call('getLocation');

回调说明:

{

success: true or false 是否成功(String)

error: 错误信息(String)

errorCode: 错误码(int)

data:{'latitude':22.2748379, //维度

'longitude':133.2324334, //经度

'province':'广东省', //省

'city':'深圳市', //市

'district':'南山区', //区

'name':'金蝶软件园', //名称

'address':'科技南十二道', //地址

'addressdetail':广东省深圳市南山区科技南十二道' //详细地址

}

}

17、云之家选取周边位置

XuntongJSBridge.call('selectLocation', {

'latitude':22.394839,

'longitude':133.374833,

'isLocation':false

}, function(result){

});

参数说明:

参数名称数据类型必选说明

latitudedouble是获取周边位置的中心纬度。

longitudedouble是获取周边位置的中心经度。

isLocationint否是否自动定位然后获取周边。

回调说明:

{

success: true or false 是否成功(String)

error: 错误信息(String)

errorCode: 错误码(int)

data:{'latitude':22.2748379, //维度

'longitude':133.2324334, //经度

'province':'广东省', //省

'city':'深圳市', //市

'district':'南山区', //区

'name':'金蝶软件园', //名称

'address':'科技南十二道', //地址

'addressdetail':广东省深圳市南山区科技南十二道' //详细地址

}

}

18、选择人员

XuntongJSBridge.call('selectPersons',

{'isMulti':false},

function(result){}

);

参数说明:

参数名称数据类型必选说明

isMultiint否是否为多选,默认false。

回调说明:

{

success: true or false 是否成功(String)

error: 错误信息(String)

errorCode: 错误码(int)

data:{persons:[{

name: 用户姓名

avatarUrl:用户图像地址

openId: 用户Id

},...]

}

}

19、查看文件详情

XuntongJSBridge.call('showFile',

{

'fileId':'hde22fdej233',

'fileName':'计划',

'fileExt':'ppt',

'fileTime':'2014-11-28 13:23:54',

'fileSize':35500

},

function(result){}

);

参数说明:

参数名称数据类型必选说明

fileIdstring否文件ID,第三方文件不传。

fileNamestring是文件名称

fileExtstring是文件后缀

fileTimestring是时间

fileSizeint是文件大小,单位:字节

fileDownloadUrlstring否文件下载地址,非云之家的第三方文件传入此参数,可直接下载并打开文件

回调说明:无

20、选择文件

XuntongJSBridge.call('selectFile',

{},

function(result){}

);

参数说明:无

回调说明:

{

success: true or false 是否成功(String)

error: 错误信息(String)

errorCode: 错误码(int)

data:{

files:[{

fileId: 文件Id,String

fileName: 文件名称,String

fileExt: 文件后缀,String

fileTime: 时间,String

fileSize: 文件大小,int,单位:字节

},...]

}

}

21、自定义返回按钮事件

XuntongJSBridge.call('defback',

{},

function () {

alert('点击了返回按钮');

if (history.length <= 1) { //顶级页面,则关闭当前Web

XuntongJSBridge.call('closeWebView');

} else {

history.back();

}

}

);

参数说明:无

回调说明:无

22、获取或者设置粘贴板内容

XuntongJSBridge.call('clipBoard',

{

'type':'getString or setString',

'string':'设置的内容'

},

function(result){}

);

参数说明:

参数名称数据类型必选说明

typestring是getString表示获取粘贴板内容,setString表示设置粘贴板内容

stringstring否getString时传空,setString时传入需要设置的内容

回调说明:

{

success: true or false 是否成功(String)

error: 错误信息(String)

errorCode: 错误码(int)

data:{

'string': '粘贴板内容' //getString才会返回此值

}

}

DEMO页面

更新日志

0.9.0

hideWebViewTitle

setWebViewTitle

gotoApp

getPersonInfo

getNetworkType

share

switchCompany

chat

selectFile

showFile

selectPic

scanQRCode

selectPersons

0.9.4

getPersonInfo(增加返回值companyName)

0.9.5

closeWebView

0.9.6

createPop

closePop

getLocation

selectLocation

0.9.11

defback

0.9.12

clipBoard

全名:

E-Mail:

请输入您的评论:

请在输入框中填入验证码以证明您不是机器人。 P E R KL 请将此区域留空:

php++jsapi,jsapi:云之家js-api文档 - 云之家·开放平台相关推荐

  1. Grunt-jsdoc生成JS API文档

    Grunt-jsdoc生成JS API文档 具体的请看官网 https://github.com/krampstudio/grunt-jsdoc 一:首先确保本机电脑上是否已经安装了nodejs和np ...

  2. JSDoc --JS API文档生成器

    JSDoc 是一个JavaScript的API文档生成器. 他可以让开发者在开发的过程中, 将编写的注释通过JSDoc工具生成一个api文档, 妈妈再也不用担心我不会写接口文档了. 这里是原作者Git ...

  3. 云盒子企业云盘实用案例:深谈文档云管理在制造行业的落地及应用

    一.制造业文档云背景 制造业是国民经济的主体和支柱产业,随着社会信息化的飞速发展,制造企业的信息化建设建设也不断深入.制造企业从设计.研发.采购.生产.销售的整个业务过程中,对产生的各种设计图纸.采购 ...

  4. 如何查看jsplumb.js的API文档(YUIdoc的基本使用)#华为云·寻找黑马程序员#

    [摘要] 介绍前端文档工具YUIdoc 示例代码托管在:http://www.github.com/dashnowords/blogs 一.问题描述 最近向一些同事推荐了网页中实现流程图绘制的工具库j ...

  5. layer.js 弹窗组件API文档

    基础参数 type title content skin area offset icon btn closeBtn shade shadeClose time id shift maxmin fix ...

  6. 项目1:基于Java API文档制作的搜索引擎

    目录 一.搜索引擎相关概念 1.1 认识搜索引擎 1.2 搜索引擎的本质 1.3 搜索的思路 1.3.1  暴力搜索 1.3.2  倒排索引 1.4 项目目标 二.实现思路和前期准备 2.1 项目模块 ...

  7. 宝塔面板+NextCloud文档云 搭建流程

    系统工程 - 建设篇 第一章 宝塔面板+NextCloud文档云 搭建流程 系统工程 - 建设篇 下章内容 前言 实施步骤 前置条件 部署宝塔面板 安装CentOS操作系统 配置CentOS操作系统 ...

  8. Swagger 文档中文版,国产API 文档工具使用教程

    swagger文档.swagger ui 在后端开发中使用非常广泛,接口文档开发和代码生成等功能非常好用. 但swagger是付费的产品,而免费版的swagger 文档需要自己去配置,流程非常复杂,因 ...

  9. 这才是21 世纪的 API 文档该有的样子

    前后端差点打起来 事情是这样的:今天我们公司的后端说他接口写完了,并分享了一个接口文档给我.用的就是 Swagger UI 自动生成的那种接口文档,就像这种: 这种 Swagger 文档我每次看着就头 ...

  10. (转载)中文Appium API 文档

    该文档是Testerhome官方翻译的源地址:https://github.com/appium/appium/tree/master/docs/cn官方网站上的:http://appium.io/s ...

最新文章

  1. React:入门计数器
  2. jsp做看板_如何使用看板做敏捷开发
  3. 122345 java_【每天算法2】:用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。 | 学步园...
  4. python json loads 中文乱码_python实现智能语音天气预报
  5. Go 应用优化“指北”
  6. AT1 one-dimensional objects
  7. Linux启动nacos成功日志_nacos初体验踩坑与填坑篇
  8. railscasts #1 Caching with Instance Variables
  9. ct与x光的哪个辐射大_听说做一次CT所受到的辐射剂量和损害 = 拍400张X光片?
  10. windows自带黑体_win10字体设置黑体|win10系统文字如何设置黑体字体
  11. 半导体器件(一) 学习笔记
  12. 领域驱动模型设计(一)
  13. 操作系统SPF算法Java实现
  14. 傅里叶变换的性质及证明(CTFT)
  15. 用约束规划+概率图模型(信念传播)+神经网络端到端求解组合优化问题
  16. c语言数字和字母运算,计算器中的字母CE、C、MR、MC、MS、M+、M-等等各是什么意思?让我来告诉你吧!...
  17. 计算机桌面图标有阴影,桌面图标有阴影怎么去掉?教你轻松解决
  18. 基于ArcGIS JS API实现的两种距离和面积测量方式
  19. SCOI2014 方伯伯的玉米田 题解
  20. 门店如何利用会员系统软件做精细化运营管理

热门文章

  1. JavaIO操作——字节输出流【OutputStream】
  2. 高级终端termux下载不了Python_最新Termux安装MSF(metasploit)教程
  3. 静默安装weblogic
  4. 2020年最新中科院期刊分区表
  5. 微信小程序图片上传以及剪切(image-cropper的简单使用)
  6. jenkins调用VS201X
  7. word查重_医学论文查重参考文献算不算?
  8. 10款白嫖网站笔记整理
  9. 20道经典Java面试基础题
  10. tcp粘包 java_详说tcp粘包和半包