导航:首页 > 编程语言 > nodejs如何注释

nodejs如何注释

发布时间:2023-03-29 02:36:29

『壹』 一个后端人员学前端技术的日记(一)开发环境

网上了解了好一阵,好家伙,前端技术完全自成体系,跟后端一样复杂了,什么路由,什么MVC,什么编译打包,什么依赖下载,各种后端用词在前端也都适用了,哎,太难了。

一、学习渠扒岁道

1. 中文官网: https://cn.vuejs.org/

开发工具使用火狐,因为谷歌用不了扩展,当然你可能会有办法的。

用火狐浏览器打开: https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/

2. 官方文档 : https://v3.cn.vuejs.org/guide/introction.html


二、环境安装

首先要注意芹基的是,涉及使用cmd命令行执行的,如npm命令等,最好用管理员权限打开cmd,否则说不准后面会出现莫名其妙的错误。

1. 安装nodejs,这个是可以运行js代码的服务端环境,方便本地运行或热部署,这个nodejs包含了npm组件(依赖包管理工具,支持下载、运行、编译、打包等等)

下载地址: https://nodejs.org/zh-cn/

我本地安装的版本是 node-v10.16.3-win-x64,一般安装在 D:Program Files。


2. 安装cnpm组件,为了下载安装包和依赖包更快一点,最好用先安装国内镜像支持,这个组件包含了包含npm大部分功能。


3. 安装Vue/CLI组件,你可以直接使用npm安装,或者安装Vue的CLI,就是脚手架工具,里面包含了Vue本身,建议直接安装这个,省的麻烦。

官网建议Vue3的使用Vue CLI v4.5+,如果版本有问题或升级版本,可以直接去这里删除,全局的库目录在 D:Program Files ode-v10.16.3-win-x64 ode_moles。

4. 创建项目。先命令行转到你要放置项目的目录,执行以下命令。

然后窗口会让你选择是Vue2版本还是Vue3版本的,它还包含默认安装(babel, eslint),我当然选择最新的Vue3安装。

windows下安装注意别用powershell或者git-bash,直接用cmd命令行就好。

结尾出现以下提示,说明你安装成功了。

知识记录1:如果你出现以下问题:

原因是:执行npm命令时没有管理员权限, 用管理员权限打开cmd, 然后再执行npm相关命令即可。

知识记录2:如果你有Vue2,想升级Vue3的最新版本,可操作如下:

5. 额外介绍下,你不一定使用vue脚手架创建vue项目,你还可以使用vite组件创建项目。

官网: https://github.com/vitejs/vite

注意:vite当前只支持vue3.x

名词注释:

脚手架:就是标准的、常见的一种春首睁项目目录安排规范。

babel: js的编译器,用了它你就可以像后端开发语言一样对源码进行编译打包了。

eslint:一种js的代码检测工具。

『贰』 怎么在阿里云服务器里使用nodejs环境

首次登录云服务器,要先进行用户设置。

用户设置

首先用passwd命令修改超级管理员root密码

1

$ passwd

根据提示连续输入两次密码,很简单吧。

接着,要新建一个普通的管理账号并设置密码,用于日常的系统管理。

1
2

$ useradd user1
$ passwd user1

将用户添加进管理组,以便于统一管理管理员的权限。

1

$ usermod -a -G wheel user1

设置新用户的sudo权限。

1

$ visudo

执行visudo命令实际上编辑的是/etc/sudoers文件。 找到 root ALL=(ALL:ALL) ALL 这行,并下面添加一行

1

user1 ALL=(ALL:ALL) ALL保存退出,以后就可用用sudo命令执行管理操作了。

修改主机名

每台服务器都有自己的名字,一般web服务器会用网站的域名来做主机名。 [用户名@主机名 ~]$

1
2

$ hostname "www.chufa.la"
$ vi /etc/sysconfig/networkHOSTNAME=www.chufa.la

保存,并退出编辑,下次等登誉搏入服务器就能看到修改的主机名字了。

SSH配置

将ssh的端口22改掉,另外,禁止root通过ssh登录服务器,并允许新建的普通管理员登录。

1

$ vi /etc/ssh/sshd_config

找到 # Port 22 ,去掉#并将22修改为1025到65536 之间的没被用到的端口号。 找到下面一行庆族祥,并去掉注释符。

1

# PermitRootLogin yes在配置文件里添加

1

AllowUsers user1

保存后,退出文件编辑。 重启sshd

1

$ service sshd restart

下次登录,就要用新设定的端口号登录了。

1

$ ssh user1@ip -p port

挂载数据盘

为数据盘建立交换分区和普通分区,并挂载到系统。 首先查看查看数据盘

1

$ fdisk -l

确认数据盘为 /dev/xvdb 接着,对数据盘进行分区操作,

1

$ fdisk -S 56 /dev/xvdb

输入m可以查看帮助。 这里直接键入n新建第一个扩展分区,接着输入p建立立基本分区,输入要建立的分区号1,起始簇保持默认,结束簇的位置输入 +2G (一般扩展分区的大小为内存的两倍)。 然后,重复上面的步骤,将剩下的分为数据盘,注意第二个分区的分区号为2。

格式化分区

1
2

$ mkswap /dev/xvdb1
$ mkfs.ext4 /dev/xvdb2

启用swap分区

1

$ swapon /dev/xvdb1

将数据盘的第二个分区,挂载到新建的 /data 目录。

1

$ mkdir /data

修改fstab文件,保证重启系统后自动挂载。

1

$ vi /etc/fstab

添加

1
2

/dev/xvdb1 swap swap defaults 0 0
/dev/xvdb2 /data ext4 defaults 0 0

保存文件,并退出编辑,下次启动系统就能自动挂载数据盘了。

执行挂载命令,可以立即看到挂载的硬盘。

1

$ mount -a

软件安装 Nginx Mongo Node

我习惯于多个node进程共享80端口,用nginx反向代理到不同的node服务上去。 安装nginx。 新建yum仓库配置文件。

1

$ vi /etc/yum.repos.d/nginx.repo

内容如下穗野:

1
2
3
4
5

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1保存文件,并退出编辑。

执行.

1

$ yum install nginx安装mongodb

1

$ vi /etc/yum.repos.d/mongodb.repo

文件内容

1
2
3
4
5

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1保存文件,并退出编辑。

执行

1

$ yum install mongodb-org

安装Node和NPM

1

$ sudo yum install nodejs npm

至此,服务器环境就搭建好了。

『叁』 nodejs request中options选项中的form和body分别表示什么含义

POST请求

varrequest=require('request');
varurl="请求url";
varrequestData="需要传输的数据";
request({
url:url,
method:"POST",
json:true,
headers:{
"content-type":"application/json",
},
body:JSON.stringify(requestData)
},function(error,response,body){
if(!error&&response.statusCode==200){
console.log(body)//请求成功的处理逻辑
}
});

POST form格式上传数据

request.post(
{url:'',
form:{key:'value'}
},
function(error,response,body){
if(!error&&response.statusCode==200){
console.log(body)//请求成功的处理逻辑
}
})

『肆』 web解题用nodejs写的登录站点

答:您好,要写一个登录站点,使用Node.js编写,最少游昌裤200字最多500字,并且要回答完整,不要出现重复,回答您的问题。

首先,您需要安装Node.js,安装完成后,您可以使用Node.js开发登录站点。其次,您需要编写登录站点的前端代码,包括HTML、CSS和JavaScript,以及一些框架,如jQuery等,来实现登录站点的神简功能。最后,您需要编写后端代码,使用Node.js来实现登录站点的功能,包括处理用户输入的数据,连接数据库,以及实现其他功能。

此外,您还需要注意,登录站点的代码应该尽可能的简洁,不要出现重复的代码,并且应该尽可能的注释,以便以后的维护和修改。

总之迅坦,编写一个登录站点,使用Node.js编写,最少200字最多500字,并且要回答完整,不要出现重复,回答您的问题,需要您安装Node.js,编写前端代码,编写后端代码,以及注意代码的简洁性和注释。

『伍』 nodejs 承载 多少 websocket

首先是协议的升级,这个比较简单,就简述一下:当在客户端执行new
Websocket("ws://XXX.com/")的时候,客户端就会发起请求报文进行握手申请,报文中有个很重要的key就是Sec-
WebSocket-Key,服务端获取到key,然后将这个key与字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11
相连,对新的字符串通过sha1安全散列算法计算出结果后,再进行base64编码,并且将结果放在请求头的"Sec-WebSocket-
Accept"中返回即可完成握手。具体请看代码:
server.on('upgrade', function (req, socket, upgradeHead) {
var key = req.headers['sec-websocket-key'];
key = crypto.createHash("sha1").update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64");
var headers = [
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
'Sec-WebSocket-Accept: ' + key
];
socket.setNoDelay(true);
socket.write(headers.join("\r\n") + "\r\n\r\n", 'ascii');
var ws = new WebSocket(socket);
webSocketCollector.push(ws);
callback(ws);
});

upgrade事件其实是http这个模块的封装,再往底层就是net模块的实现,其实都差不多,如果直接用net模块来实现的话,就是监听net.createServer返回的server对象的data事件,接收到的第一份数据就是客户端发来的升级请求报文。

上面那段代码就完成了websocket的握手,然后就可以开始数据传输了。

看数据传输之前,先看看websocket数据帧的定义(因为觉得深入浅出nodejs里的帧定义图最容易理解,所以就贴这张了):

上面的图中,每一列就是一个字节,一个字节总共是8位,每一位就是一个二进制数,不同位的值会对应不同的意义。

fin:指示这个是消息的最后片段。第一个片段可能也是最后的片段。如果为1即为最后片段,(其实这个位的用途我个人有点疑惑,按照书上以及网上查的资
料,当数据被分片的时候,不同片应该都会有fin位,会根据fin为是不是0来判断是否为最后一帧,但是实际实现中却发现,当数据比较大需要分片时,服务
端收到的数据就只有第一帧是有fin位为1,其他帧则整个帧都是数据段,也就是说,感觉这个fin位似乎用不上,至少我自己写的demo中是通过数据长度
来判断是否到了最后一帧,完全没用到这个fin位是否为1来判断)

rsv1、rsv2、rsv3:各占一个位,用于扩展协商,基本上不怎么需要理,一般都是0

opcode:占四个位,可以表示0~15的十进制,0表示为附加数据帧,1表示为文本数据帧,2表示二进制数据帧,8表示发送一个连接关闭的数据帧,9
表示ping,10表示pong,ping和pong都是用于心跳检测,当一端发送ping时,另一端必须响应pong表示自己仍处于响应状态。

masked:占一个位,表示是否进行掩码处理,客户端发送给服务端时为1,服务端发送给客户端时为0

payload
length:占7位,或者7+16位、或者7+64位。如果第二个字节的后面七个位的十进制值小于或等于125,则直接用这七个位表示数据长度;如果该
值为126,说明
125<数据长度<65535(16个位能描述的最大值,也就是16个1的时候),就用第三个字节及第四个字节即16个位来表示;如果该值为
127,则说明数据长度已经大于65535,16个位也已经不足以描述数据长度了,就用第三到第十个字节这八个字节来描述数据长度。

masking key:当masked为1的时候才存在,用于对我们需要的数据进行解密。

payload data:我们需要的数据,如果masked为1,该数据会被加密,要通过masking key进行异或运算解密才能获取到真实数据。

帧定义解释完了,就可以根据数据来进行解析了,当有data过来的时候,先获取需要的数据信息,下面这段代码将获取到数据在data里的位置,以及数据长度,masking key以及opcode:
WebSocket.prototype.handleDataStat = function (data) {
if (!this.stat) {
var dataIndex = 2; //数据索引,因为第一个字节和第二个字节肯定不为数据,所以初始值为2
var secondByte = data[1]; //代表masked位和可能是payloadLength位的第二个字节
var hasMask = secondByte >= 128; //如果大于或等于128,说明masked位为1
secondByte -= hasMask ? 128 : 0; //如果有掩码,需要将掩码那一位去掉
var dataLength, maskedData;
//如果为126,则后面16位长的数据为数据长度,如果为127,则后面64位长的数据为数据长度
if (secondByte == 126) {
dataIndex += 2;
dataLength = data.readUInt16BE(2);
} else if (secondByte == 127) {
dataIndex += 8;
dataLength = data.readUInt32BE(2) + data.readUInt32BE(6);
} else {
dataLength = secondByte;
}
//如果有掩码,则获取32位的二进制masking key,同时更新index
if (hasMask) {
maskedData = data.slice(dataIndex, dataIndex + 4);
dataIndex += 4;
}
//数据量最大为10kb
if (dataLength > 10240) {
this.send("Warning : data limit 10kb");
} else {
//计算到此处时,dataIndex为数据位的起始位置,dataLength为数据长度,maskedData为二进制的解密数据
this.stat = {
index: dataIndex,
totalLength: dataLength,
length: dataLength,
maskedData: maskedData,
opcode: parseInt(data[0].toString(16).split("")[1] , 16) //获取第一个字节的opcode位
};
}
} else {
this.stat.index = 0;
}
};

代码中均有注释,理解起来应该不难,直接看下一步,获取到数据信息后,就要对数据进行实际解析了:

经过上面handleDataStat方法的处理,stat中已经有了data的相关数据,先判断opcode,如果为9说明是客户端发起的
ping心跳检测,直接返回pong响应,如果为10则为服务端发起的心跳检测。如果有masking
key,则遍历数据段,对每个字节都与masking
key的字节进行异或运算(网上看到一个说法很形象:就是轮流发生X关系),^符号就是进行异或运算啦。如果没有masking
key则直接通过slice方法把数据截取下来。

获取到数据后,放进datas里保存,因为有可能数据被分片了,所以再将stat里的长度减去当前数据长度,只有当stat里的长度为0的时候,
说明当前帧为最后一帧,然后通过Buffer.concat将所有数据合并,此时再判断一下opcode,如果opcode为8,则说明客户端发起了一个
关闭请求,而我们获取到的数据则是关闭原因。如果不为8,则这数据就是我们需要的数据。然后再将stat重置为null,datas数组置空即可。至此,
我们的数据解析就完成了。
WebSocket.prototype.dataHandle = function (data) {
this.handleDataStat(data);
var stat;
if (!(stat = this.stat)) return;
//如果opcode为9,则发送pong响应,如果opcode为10则置pingtimes为0
if (stat.opcode === 9 || stat.opcode === 10) {
(stat.opcode === 9) ? (this.sendPong()) : (this.pingTimes = 0);
this.reset();
return;
}
var result;
if (stat.maskedData) {
result = new Buffer(data.length-stat.index);
for (var i = stat.index, j = 0; i < data.length; i++, j++) {
//对每个字节进行异或运算,masked是4个字节,所以%4,借此循环
result[j] = data[i] ^ stat.maskedData[j % 4];
}
} else {
result = data.slice(stat.index, data.length);
}
this.datas.push(result);
stat.length -= (data.length - stat.index);
//当长度为0,说明当前帧为最后帧
if (stat.length == 0) {
var buf = Buffer.concat(this.datas, stat.totalLength);
if (stat.opcode == 8) {
this.close(buf.toString());
} else {
this.emit("message", buf.toString());
}
this.reset();
}
};

完成了客户端发来的数据解析,还需要一个服务端发数据至客户端的方法,也就是按照上面所说的帧定义来组装数据并且发送出去。下面的代码中基本上每一行都有注释,应该还是比较容易理解的。
//数据发送
WebSocket.prototype.send = function (message) {
if(this.state !== "OPEN") return;
message = String(message);
var length = Buffer.byteLength(message);
// 数据的起始位置,如果数据长度16位也无法描述,则用64位,即8字节,如果16位能描述则用2字节,否则用第二个字节描述
var index = 2 + (length > 65535 ? 8 : (length > 125 ? 2 : 0));
// 定义buffer,长度为描述字节长度 + message长度
var buffer = new Buffer(index + length);
// 第一个字节,fin位为1,opcode为1
buffer[0] = 129;
// 因为是由服务端发至客户端,所以无需masked掩码
if (length > 65535) {
buffer[1] = 127;
// 长度超过65535的则由8个字节表示,因为4个字节能表达的长度为4294967295,已经完全够用,因此直接将前面4个字节置0
buffer.writeUInt32BE(0, 2);
buffer.writeUInt32BE(length, 6);
} else if (length > 125) {
buffer[1] = 126;
// 长度超过125的话就由2个字节表示
buffer.writeUInt16BE(length, 2);
} else {
buffer[1] = length;
}
// 写入正文
buffer.write(message, index);
this.socket.write(buffer);
};

最后还要实现一个功能,就是心跳检测:防止服务端长时间不与客户端交互而导致客户端关闭连接,所以每隔十秒都会发送一次ping进行心跳检测
//每隔10秒进行一次心跳检测,若连续发出三次心跳却没收到响应则关闭socket
WebSocket.prototype.checkHeartBeat = function () {
var that = this;
setTimeout(function () {
if (that.state !== "OPEN") return;
if (that.pingTimes >= 3) {
that.close("time out");
return;
}
//记录心跳次数
that.pingTimes++;
that.sendPing();
that.checkHeartBeat();
}, 10000);
};
WebSocket.prototype.sendPing = function () {
this.socket.write(new Buffer(['0x89', '0x0']))
};
WebSocket.prototype.sendPong = function () {
this.socket.write(new Buffer(['0x8A', '0x0']))
};

至此,整个websocket的实现就完成了,此demo只是大概实现了一下websocket而已,在安全之类方面肯定还是有很多问题,若是真正生产环境中还是用socket.io这类成熟的插件比较好。不过这还是很值得一学的。

『陆』 如何解析nodejs中send方法发送的数据

参考如下实例代码:self.sendAliMessage=function(req,res){varparam={'Action':'SingleSendSms','SignName':'xxxx',//短信签名名称'TemplateCode':'SMS_1635xxxx','RecNum':'13564096???',//手机号'ParamString':JSON.stringify({"code":"9527"}),//验证码模板里的变量'Version':'2016-09-27','Format':'JSON','AccessKeyId':ali_access_key_id,'SignatureMethod':'HMAC-SHA1','SignatureVersion':'1.0','SignatureNonce':randomstr(9),//随机数'Timestamp':newDate().toISOString(),};param.Signature=sign.signForAliMessage(param,ali_access_key_secret);varapi_url='/';request.post({url:api_url,headers:{'Content-Type':'application/x-www-form-urlencoded'},form:param},function(err,response,data){varresultdata=JSON.parse(data);if(!err&&data.Model){result=res.returnData(200);}else{result=res.returnData(113);}res.send(result);});}/*签名方法*/sign.signForAliMessage=function(src_sign,access_key_secret){varparam,qstring=[];varoa=Object.keys(src_sign).sort(),on={};for(vari=0;i

『柒』 如何使用Node.js处理前端代码文件的编码问题

使用 NodeJS 编写前端工具时,操作得最多的是文本文件,因此也就涉及到了文件编码的处理问题。我们常用的文本编码有 UTF8 和 GBK 两种,并且 UTF8 文件还可能带有 BOM。在读取不同编码的文本文件时,需要将文件内容转换为 JS 使用的 UTF8 编码字符串后才能正常处理。

1、BOM 的移除
BOM 用于标记一个文本文件使用 Unicode 编码,其本身是一个 Unicode 字符("uFEFF"),位于文本文件头部。在不同的 Unicode 编码下,BOM 字符对应的二进制字节如下:

3、单字节编码
有时候,我们无法预知需要读取的文件采用哪种编码,因此也就无法指定正确的编码。比如我们要处理的某些 CSS 文件中,有的用 GBK 编码,有的用 UTF8 编码。虽然可以一定程度可以根据文件的字节内容猜测出文本编码,但这里要介绍的是有些局限,但是要简单得多的一种技术。

首先我们知道,如果一个文本文件只包含英文字符,比如 Hello World,那无论用 GBK 编码或是 UTF8 编码读取这个文件都是没问题的。这是因为在这些编码下,ASCII0~128 范围内字符都使用相同的单字节编码。

反过来讲,即使一个文本文件中有中文等字符,如果我们需要处理的字符仅在 ASCII0~128 范围内,比如除了注释和字符串以外的JS代码,我们就可以统一使用单字节编码来读取文件,不用关心文件的实际编码是 GBK 还是 UTF8。

『捌』 nodejs 给appium日志添加注释

说实话,我觉得你这种需求的正确实现方法应该是直接改一下appium的代码,在需要的地方插入自己的注释就行,和直接操作字符串相比这样更灵活。appium的源码就在安装目录的node_molesappium下,根据日志的关键字搜索一下,定位到需要的位置即可,例如这一段:

=============Set Port============

[Appium] Appium REST http interface listener started on127.0.0.1:4723

根据“ Appium REST http interface listener started on ”为关键字搜一下,可以定位到如下位置

下面的就不用说了吧,这么做的好处是可以按需添加注释,顺便还可以了解一下appium的代码结构,缺点可能就是appium如果升级,会把改的注释盖掉,改完注意备份就好

『玖』 nodejs-koa2(mvc模式)前后端分离 前端设计

前后端分离,前端nodejs运行环境,使用koa2集成负责资源分配与用户交互,实现token验证用户身份,路由控制。等!

自行 网络 解决;

"program": "${workspaceFolder}app.js"

此处就是是将app.js作为启动文件。${workspaceFolder}代表根目录,vsc启动时会在根目录下找到并加载app.js文件。

参数介绍: name 项目名称、 version 版本号、 description 项目描述、 main 项目启动文件、 scripts 启动快捷设置, author 作者, dependencies 第3方中间件名称及版本。

最重要的
dependencies ”这里添加一些要用到的包,以上是这次要用到的所有的包,版本自己更改。
scripts ”这里是一些nodejs的便捷命令,上线的时候会用到,直接在终端中,package.json同级目录 ,执行‘npm start’ 即 可启动app.js。
别的没啥太大作用瞎写即可。

启动相关配置,封装到config/init.js中,启动文件直接引用即可

3-6-1、init.js项目核心。

异常友好处理方法封装

路由配置

视图渲染

核心集成

3-6-2、config.js项目参数配置。为什么不用json文件 因为json不能加注释

3-6-3、token.js项目token相关方法封装。

执行后项目结构会增加两个文件

新增

src/hello.js。

views/index.html

浏览器访问: http://127.0.0.1:3000/koa/login

输入值获取token

获取的token如图:

先不用带token进行访问: http://127.0.0.1:3000/koa/ hello/jiaobaba,被token拦截,返回401

带上token访问: http://127.0.0.1:3000/koa/ hello/jiaobaba

测试页面渲染,及跳转html页面,直接访问 http://127.0.0.1:3000/koa /views

结束!!!!!!

需要源码联系我

『拾』 nodejs+express+ejs生成项目

一、说一下
首先保证node环境已经安装完毕,npm能正常使用,安装可自行网络,比较简单,在此不做赘述。
node是否安装成功

express是否安装成功

二、直接开码

安装

注释:

express:安装express框架
express-generator:安装express生成器,可快速生成一个应用的骨架
裂李-g:全局安答洞装

注释:
-e:简写,全称为 --view=ejs ,安装ejs模板引擎
myapp:项目名称,自定义即可
生成如下目录结构

注释:
bin:存放启动脚本文件
bin/www:启动脚本文件,可修改端口号,等功能。
public:存放肆举迟图片,css,js等静态文件
routes:存放路由模块文件
views:存放视图文件,使用的ejs模板引擎
app.js:入口文件,重要的配置文件
package.json:工程信息和安装依赖文件
跟着提示执行下列语句

注释:
cd myapp:进入myapp文件夹,文件名需修改成自己的项目文件名
npm install:安装所有依赖模块,常用的非指定性npm安装命令
npm start:运行项目

(bin/www)

阅读全文

与nodejs如何注释相关的资料

热点内容
为什么淘宝app是黑色的 浏览:17
如何在cad中把图形输出为pdf文件 浏览:535
文件夹横签 浏览:988
extjs5mvc 浏览:614
win7如何安装数据库 浏览:647
informix数据库倒数卸数 浏览:983
华硕p7h55mplus升级 浏览:240
servlet调用jsp 浏览:481
文件的命名原则有哪些 浏览:352
苹果的文件管理是哪个 浏览:387
智能黑板如何给pdf文件做批注 浏览:788
哈弗智联app如何绑定二手车 浏览:728
cad文件不多可是异常增大 浏览:872
苹果手机怎样将音频文件导入剪映 浏览:432
2016秋季飞歌导航升级 浏览:151
电脑字符串怎么编程 浏览:381
暴风不能在线观看视频文件 浏览:267
三国卡可以升级吗 浏览:939
如何筛选出相同数据 浏览:311
vbox文件找不到 浏览:49

友情链接