【TS】iApp基础教程mian.iyu系列-1

IAPP   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2021-6-7

简介:

《裕语言V5》是解释型语言,丰富的类库定置简单快速开发你的应用程序,让开发过程变得娱乐化大众化。《裕语言》是由计算编程工程师 黄裕先生 为主导,宇恒先生、宇辰先生等工程师共同参与完成开发,定制以及实现成型代码功能,其代码简单方便的编写体验是一大亮点。裕语言的开发应用程序语言,全面向公众开放平台,任何有兴趣的人都可以参与开放设计自己的程序。

《裕语言V5》所有的预设代码命名采用 拼音开头字母/ 全拼等。整体符合主流,采用面向对象方式编程,所有代码都由根对象延伸,简入深出的系统性学习。支持导入原生android 所有的SDK;所有代码都编译成 java代码,再编译成dex文件。


下载地址:

42817

学习手册:

66697


【指定系统编译】

[方案一]

// 在裕语言V5中可以指定系统来编译代码

//执行 java 多行代码
java
{
String str = "这是 iApp";
android.util.Log.v("iapp", str);

}

//执行 java 单行代码
java android.util.Log.v("iapp", "这是 iApp");

【wl.tjz 套接字 Socket】用法:// 需要启用线程gj.xc(){// 创建服务端// 输入服务端口,服务端超时限制(指定时间内无新连接则关闭服务器,0为无限制),客户端超时限制(已连接的客户端指定时间内未通信则关闭,0为无限制),是否接收新连接请求s tjz = wl.tjz(6666, 0, 0, true)(so,sr){// so 服务端对象// sr 新连接对象gj.sc(sr.ip() + ":" + sr.dk() + ":" + sr.bjip() + ":" + sr.bjdk())},(sr,te,mg,bs){// sr 连接对象// te 数据类型,0为无数据头字节数组,1为带数据头字符串,2为带数据头文件,3为带数据头字节数组// mg 数据信息,数据类型为1时值为对应的字符串,数据类型为2时值为文件的后缀// bs 数据的字节数组gj.sc(sr + ":" + te + ":" + mg + ":" + bs.length)}// 开始,这里线程会被堵塞tjz.ks()// 下面的代码将在服务端关闭后执行gj.sc("服务端已关闭")}// 需要启用线程gj.xc(){// 创建客户端// 输入服务器IP,服务端口,超时限制(指定时间内未通信则关闭,0为无限制)s tjz = wl.tjz("192.168.1.100", 6666, 0)(so,sr){},(sr,te,mg,bs){// sr 连接对象// te 数据类型,0为无数据头字节数组,1为带数据头字符串,2为带数据头文件,3为带数据头字节数组// mg 数据信息,数据类型为1时值为对应的字符串,数据类型为2时值为文件的后缀// bs 数据的字节数组gj.sc(sr + ":" + te + ":" + mg + ":" + bs.length)}// 开始tjz.ks()}// 更多方法// 重启tjz.cq()// 开始启动或连接tjz.ks()// 连接总数s ljzs = tjz.ljzs()// 获取连接列表s ljlb = tjz.lj()// 获取指定序号的连接s lj = tjz.lj(0)// 连接清空tjz.ljqk()// 获取当前是否已关闭s sfgb = tjz.sfgb()// 关闭释放tjz.gb()// 获取服务器对象s fwd = tjz.fwd()// 获取本机的IPs bjip = tjz.bjip()// 获取本机的端口s bjdk = tjz.bjdk()// 输出数据,返回发送成功数量,如果是服务端则为群发// 可输出多种类型数据,字符串,字节数组,文件等gj.xc(){s sc1 = tjz.sc("nihao")}// 输出数据,需要开线程gj.xc(){// 输入数据类型,输入数据内容s sc2 = tjz.sc(1, "nihao")// 输出文件//s sc2 = tjz.sc(2, "%a.png")}// sr 连接对象的方法// 获取远程连接的IPs ip = sr.ip()// 获取远程连接的端口s dk = sr.dk()// 获取本机的IPs bjip = sr.bjip()// 获取本机的端口s bjdk = sr.bjdk()// 获取当前是否已关闭s sfgb = sr.sfgb()// 重启连接sr.cq()// 关闭释放sr.gb()// 获取连接socket对象s ljdx = sr.ljdx()// 设置自定义数据sr.sj("abcd")// 获取自定义数据s sj1 = sr.sj()// 设置自定义数组数据s sz = { "abcd", "efg" }sr.szsj(sz)// 获取自定义数组数据s sjsz = sr.szsj()// 输出数据,返回发送成功数量,如果是服务端则为群发// 可输出多种类型数据,字符串,字节数组,文件等gj.xc(){s sc1 = sr.sc("nihao")}// 输出数据// 输入数据类型,输入数据内容gj.xc(){s sc2 = sr.sc(1, "nihao")// 输出文件//s sc2 = sr.sc(2, "%a.png")}关于数据头:数据头是为了更佳简便的使用套接字,为固定模式和长度;数据头固定为32位;6位固定标识0-5,1位数据类型6-6,10位数据长度7-16,15位
【wl.sjb 用户数据报协议 UDP】
用法:

// 需要启用线程
gj.xc(){

// 输入本地服务端的端口
s sjb = wl.sjb(6666)(cp,dp,bs,ip,dk){
// cp 数据报协议对象
// dp 接收数据对象
// bs 接收的字节数组
// ip 发送者IP
// dk 发送者端口

gj.sc(cp + ":" + dp + ":" + bs + "+" + bs.length + ":" + ip + ":" + dk)
}

// 开始,这里线程会被堵塞
sjb.ks()

// 下面的代码将在服务端关闭后执行
gj.sc("服务端已关闭")

}

// 需要启用线程
gj.xc(){

// 输入远程连接IP,远程连接的端口,输入本地服务端的端口
s sjb = wl.sjb("192.168.1.101", 6666, 7777)(cp,dp,bs,ip,dk){
// cp 数据报协议对象
// dp 接收数据对象
// bs 接收的字节数组
// ip 发送者IP
// dk 发送者端口

gj.sc(cp + ":" + dp + ":" + bs + "+" + bs.length + ":" + ip + ":" + dk)
}

// 开始,这里线程会被堵塞
sjb.ks()

// 下面的代码将在服务端关闭后执行
gj.sc("服务端已关闭")

}

// 更多方法

// 开始
sjb.ks()

// 关闭
sjb.gb()

// 设置最大接收数据长度,需在开始前调用;默认5KB,值越大越可能丢包发送失败。建议10KB内
sjb.sjcd(1024*5)

// 获取连接对象
s lj = sjb.lj()

// 获取连接的IP
s ip = sjb.ip()

// 获取连接的端口
s dk = sjb.dk()

// 获取本机的IP
s ip = sjb.bjip()

// 获取本机的端口
s dk = sjb.bjdk()

// 获取连接是否已释放
s sfgb = sjb.sfgb()

// 输出数据
gj.xc(){
s sc1 = sjb.sc("nihao")
}

// 输出数据
// 输入发送的IP,发送的端口,发送的数据
gj.xc(){
s sc2 = sjb.sc("192.168.1.102", 7777, "nihao")
}
【wl.web Web服务器】
用法:

// web服务器开启后,可用浏览器进行访问你的站点

//本机访问地址 http://127.0.0.1:8888/iyu-helpV5.0.txt
//局域网访问地址 http://局域网IP:8888/iyu-helpV5.0.txt
//外网访问地址 http://外网IP:8888/iyu-helpV5.0.txt

//局域网IP 可在手机设置里找,一般在wifi设置 或 系统关于、状态等里面。
//外网,需要有外网IP。并且需要端口映射8888端口。

// 需要启用线程
gj.xc{

// 创建web站点
// 输入端口,站点的文件夹路径
s web = wl.web(8888, "%iApp")

// 开始启动web服务器,这里线程会被堵塞
web.ks()

// 下面的代码将在服务器关闭后执行
gj.sc("服务器已关闭")

}

// 使用裕语言V5扩展开发站点
// 例如,做个用户后台。先解析http请求头ct变量,这是字符串类型,你可以先打印数据出来看看字符串格式,再截取需要的
// 可以截取 http请求头 的 post 或 get 数据,这是用户提交的数据。然后使用数据库 sj.sjk 进行保存或 查询,最后输出需要输出的html内容。

gj.xc{

// 创建web站点
// 输入端口,站点的文件夹路径
s web = wl.web(8888, "%iApp")(wb,sk,ct){

//wb 是站点对象,就是s web对象
//sk 选择键的对象,用于数据处理
//ct 用户发送连接的http请求头,需要你自行解析该字符串,还包含get/post等数据
gj.sc("http请求头:" + ct)

// 通过解析http请求头,截取需要的字符串
// 然后用裕语言V5代码处理相关数据
// 然后输出你想要的数据

s html = "这是我需要输出的数据啊"

// 输出
wb.sc(sk, html)

}

// 开始启动web服务器,这里线程会被堵塞
web.ks()

// 下面的代码将在服务器关闭后执行
gj.sc("服务器已关闭")

}

//子方法

// 开始启动web服务器
web.ks()

// 关闭web服务器
web.gb()

//404错误的自定义显示内容
web.cw404("找不到文件")

//500错误的自定义显示内容
web.cw500("文件内部错误")

//默认页面文件名
web.mrym("index.htm")

//访问的文件未添加MIME时,会无法显示,如果给它设置个默认的MIME,就可以显示了
web.mime("text/html;charset=UTF-8")
//web.mime("*/*")

//添加文件的MIME
s b1 = web.mime(".jar", "application/x-zip-compressed")

//输出自定义数据
wb.sc(sk, "需要输出的数据内容")

//输入选择键的对象,返回状态,输出的内容,输出内容类型,自定义输出的http头信息
s headers = { "Server: iAppServer" }
wb.sc(sk, 200, "需要输出的数据内容", "text/html;charset=UTF-8", headers)

说明:
可用于web服务器架设,切换后台时需注意:系统可能的进行内存回收,导致服务器被销毁了。
【zf.zzbds 正则表达式】
用法:

//字符串
s a = "qqqq123456eee"
//正则表达式
s b = "([a-z]+)(\d+)"
//更多参数
s c = 0

// 获取正则表达式对象
s zz = zf.zzbds(a, b, c)

//替换成,将替换全部
s e = zz.thqb("1:$1, 2:$2")

//替换成,只替换第一个
s e2 = zz.thyg("1:$1, 2:$2")

//返回是否匹配成功,需字符串被完全匹配,赋值返回true或 false
s e3 = zz.sfppcg()

//开始匹配 或 匹配下一个,赋值返回true或 false
s e4 = zz.pp()

//给定位置序号进行匹配,赋值返回true或 false
s e5 = zz.pp(1)

//获取匹配组的数量,当前为2组:([a-z]+)、(d+)
s e6 = zz.ppzsl()

//获取第1组匹配到的子字符串在字符串中的开头位置
s e7 = zz.kswz(1)

//获取第1组匹配到的子字符串在字符串中的结尾位置
s e8 = zz.jswz(1)

//获取第1组匹配到的子字符串
s e9 = zz.zf(1)
//获取第2组匹配到的子字符串
s e10 = zz.zf(2)
【xt.gn 设备功能操作】
用法:

s gn = xt.gn()

// 闪光灯 需要权限 android.permission.CAMERA

// 闪光灯开启
gn.sgd()

// 闪光灯停止
gn.sgdtz()

// 振动 需要权限 android.permission.VIBRATE

// 振动 1秒钟
s zd1 = gn.zd(1000)

//静止1秒,振动1秒,静止1秒,振动1秒,静止1秒,振动1秒,静止1秒,.., 并且不重复
//输入振动规则,输入是否重复循环执行
s gz = { 1000, 2000, 3000, 4000 }
s zd2 = gn.zd(gz, false)

//强制停止振动器
gn.zdtz()

// 获取振动状态
s zd3 = gn.zd()

// 录音 需要权限 android.permission.RECORD_AUDIO
s ly1 = gn.ly("%1.amr")

// 录音停止
s ly2 = gn.lytz()

// 录制屏幕
//输入储存录制文件路径,输入视频宽度,输入视频高度,输入视频码率(码率可以设置大些视频会清晰些),输入视频帧率
gn.lpm("%123.mp4", 1280, 720, 1024000, 30)

//开始录制
gn.lpmks()

//停止录制
gn.lpmtz()

//释放资源
gn.lpmsf()

//判断是否正在录制
gn.zzlpm()

//录屏幕回调;注意:需要此代码放入 回调结果 界面事件,否则将无法录制
gn.lpmhd(re, rc, it)

说明:
用于手机屏幕录制。

注意:
录屏幕仅支持系统Android 5.0以及以上才有效果!
Android 5.0以下的系统,无效果!

// 截屏
s jp1 = gn.jp("%123.jpg", 70)

// 调用拍摄相片,拍摄后会调用 界面事件》回调结果 方法第一个参数结果为 63930
// 输入拍摄的相片保存位置
gn.psxp("%1.jpg")

// 相册选择,选择后会调用 界面事件》回调结果 方法第一个参数结果为 63931
// 需要通过 sj.hquri(it) 来获取结果
gn.xcxz()

// 相册选择获取结果
// 输入 界面事件》回调结果 方法的第三个参数
s xcxz1 = sj.hquri(it)

// 视频拍摄,拍摄后会调用 界面事件》回调结果 方法第一个参数结果为 63932
// 需要通过 sj.hquri(it) 来获取结果
gn.spps()

// 相册视频拍摄结果
// 输入 界面事件》回调结果 方法的第三个参数
s xcxz2 = sj.hquri(it)

// 系统截屏,可全系统截屏 需5.0以及以上设备

// 1. 首先需系统截屏初始化,初始化后会异步调用 回调结果 界面事件
gn.xtjpcsh();

//2. 系统截屏回调 返回null 则失败;注意:需要此代码放入 回调结果 界面事件,否则将无法截屏
gn.xtjphd(re, rc, it)

//3. 然后在其他事件里就可以截屏了,你也可以弄个悬浮按钮的事件来执行截屏代码

//开始系统截屏返回 图像对象
s b = gn.xtjp()

//开始系统截屏,输入延迟毫秒(3秒)
s b2 = gn.xtjp(3000)

//开始系统截屏,输入延迟毫秒(3秒),保存图像路径
s b2 = gn.xtjp(3000, "%1.png")

//开始系统截屏,输入延迟毫秒(3秒),保存图像路径,图像的质量(1-100)
s b2 = gn.xtjp(3000, "%1.png", 90)

// 传感器,如果设备不支持该传感器将返回 变量c 为 false
输入传感器类型值,输入传感器延迟类型
s c = gn.cgq(1, 2)(se){
//传感器已更新
// se 参数对象,用于传感器参数的传递

// 获取传感器更新的数值数组,这个数值数组是float[]类型,里面是传感器的实时反馈数据。
s sz = se.values

// 可以根据这数值数组的数据,来进行对应的应用操作等等~ 这里就不演示,这里将数值数组打印出来
xh s a, sz
{
gj.sc("数值:" + a)
}

}, (sr, ag){
//精度变化
// sr 传感器类型对象,注意这是对象。如果要获取对应的 传感器类型值可用 sr.getType()
// ag 新精度值

// 这里根据项目需求来操作
gj.sc("传感器类型值:" + sr.getType())
gj.sc("新精度值:" + ag)
【xt.qxgl 权限管理】
用法:
//判断写入权限是否已授权
s qxgl = xt.qxgl()
s xr = qxgl.qx("android.permission.WRITE_EXTERNAL_STORAGE")
gj.sc("写入权限是否已授权:" + xr)

//注意:请求应用权限。请求后结果将在 界面事件》请求权限结果 且参数变量 rc 固定值赋为 60542

//请求当前应用所需的权限
s qxgl = xt.qxgl()
// 将请求当前应用 AndroidManifest 中已配置的权限
qxgl.sqqx()

// 请求单个权限
s qxgl = xt.qxgl()
// 请求写入权限
qxgl.sqqx("android.permission.WRITE_EXTERNAL_STORAGE")

// 请求多个权限
s qxgl = xt.qxgl()
// 同时请求2个及以上的权限,这里用一个数组
s sz = { "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_PHONE_STATE" }
// 请求写入权限 和 读取电话状态
qxgl.sqqx(sz)

请求权限结果中的例子:
// 该事件的参数介绍 int rc, String[] ps, int[] gr
// int rc 请求代码请求权限时传入的固定代码
// String[] ps 请求的权限列表
// int[] gr 请求的权限列表的状态结果,该数组的长度与请求的权限列表一致
rg rc == 60542
{
rg ps != null
{
s j = ps.length
xh s i=0, ij, i++
{
rg gr[i] == -1
{
gj.sc("请求失败:" + ps[i])
}
}
}
}
【sj.md5 获取MD5吗】
用法:

// 输入 File对象,获取文件的md5
// 获取文件对象
s f1 = wj.wj("%a.txt")
// 根据文件对象获取md5
s b1 = sj.md5(f1)
gj.sc(b1)

// 输入byte[] 获取字节数组的md5
// 获取文件的byte[]字节数组
s f2 = wj.zjsz("%a.txt")
// 根据字节数组来获取md5
s b2 = sj.md5(f2)
gj.sc(b2)

// 输入字符串 获取字节数组的md5
// 根据字节数组来获取md5
s b3 = sj.md5("abcdef")
gj.sc(b3)
【sj.sjk 数据库操作】
用法:
//连接一个私有数据库,如果不存在将自动新建
//输入数据库文件名
s sjk = sj.sjk("iapp.db")

//连接一个公共数据库,如果不存在将自动新建
//输入数据库文件名
s sjk2 = sj.sjk("%iapp.db")

// 获取数据库对象
s sjk3 = sjk.sjk

// 获取数据库是否为新建的
s sjk5 = sjk.xj

// 删除数据库
s sjk6 = sjk.scsjk()

// 释放数据库
s sjk7 = sjk.sfsjk()

// 创建 info 数据表
s table = "_id integer primary key,url text, filename text,status interger"
s sjk8 = sjk.cjsjb("info", table)

// 判断 info 数据表 是否存在
s sjk9 = sjk.czsjb("info")

// 删除 info 数据表
s sjk10 = sjk.scsjb("info")

//在 info 数据表 添加一条数据
// 数据列名
s table = "url,filename,status"
// 对应数据
s data = "'http://abc.com/abc.apk' target='_blank'>http://abc.com/abc.apk', 'abc.apk', 1"
s sjk11 = sjk.cjsj("info", table, data)

//在 info 数据表 更新数据,若不需要设置条件(_id=1)可设为 null 视为适用于执行所以数据
s sjk12 = sjk.gxsj("info", "status=2", "_id=1")

//在 info 数据表 删除数据,若不需要设置条件(_id=1)可设为 null 视为适用于执行所以数据
s sjk13 = sjk.scsj("info", "_id=1")

//在 info 数据表 查询数据
//查询,若不需要设置条件(status=1 order by _id desc LIMIT 0,1)可设为 null 视为适用于执行所以数据
// LIMIT ,
s table = "_id,url,filename,status"
s sqlx = "status=1 order by _id desc LIMIT 0,1"
s sjk15 = sjk.cxsj("info", table, sqlx)

//自定义sql查询
s sqlx = "select _id,url,filename,status from info where status=1 order by _id desc"
s sjk16 = sjk.cxsj(sqlx)

// 循环打印数据
xh sjk15.xyh()
{
// 输出 第一列数据, 第二列数据
gj.sc(":" + sjk15.sj(0)+ ", " + sjk15.sj(1));
}

// 更多操作

//获取光标对象的第一列数据
s sj1 = sjk15.sj(0)

//获取光标对象有多少列
s sj2 = sjk15.cxls()

//获取总共查询到多少行数据
s sj3 = sjk15.cxhs()

//光标对象移到下一行数据
s sj5 = sjk15.xyh()

//光标对象移到上一行数据
s sj6 = sjk15.syh()

//光标对象移到第一行数据
s sj7 = sjk15.dyh()

//光标对象移到最后第一行数据
s sj8 = sjk15.zhyh()

//光标对象移到指定第3条数据
s sj9 = sjk15.zdwz(2)

//获取光标对象当前位置
s sj10 = sjk15.hqwz()

//释放数据查询
s sj11 = sjk15.sf()

//自定义的sql执行,需要对sql语法了解才能灵活运用
s sqlx = "insert into info (url,filename,status) values ('http://abc.com/abc.apk' target='_blank'>http://abc.com/abc.apk', 'abc.apk', 1)"
s sjk17 = sjk.cxsj(sqlx)

注意:
在执行sql语句的时候,需要注意你的字符串的特殊字符的转义。
/ -> //
' -> ''
[ -> /[
] -> /]
% -> /%
& -> /&
_ -> /_
( -> /
【动画操作】用法:// 创建动画对象s dh = gj.dh()// 渐变透明度动画,1 代表不透明,0代表透明;还可以设置0.5等半透明s jbtm = dh.jbtm(1, 0)// 持续时长jbtm.cxsc(2000)// 设置控件执行动画st.tx(zy.i.tx1).dh(jbtm)//创建一个渐变尺寸伸缩动画//0为没有,2.5为原始2.5倍s jbss = dh.jbss(0.5, 2.5, 0.5, 2.5)// 持续时长jbss.cxsc(2000)// 设置控件执行动画st.tx(zy.i.tx1).dh(jbss)位置类型:0 默认1 以对象本身为基准位置类型2 以父控件为基准位置类型//输入X开始尺寸比例,输入X结束尺寸比例,输入Y开始尺寸比例,输入Y结束尺寸比例,输入X位置类型,输入X坐标的开始位置,输入Y位置类型,输入Y坐标的开始位置s jbss2 = dh.jbss(0.5, 2.5, 0.5, 2.5, 1, 0.5, 1, 0.5)// 持续时长jbss2.cxsc(2000)// 设置控件执行动画st.tx(zy.i.tx1).dh(jbss2)//创建一个画面位置移动动画//输入开始X坐标上的移动位置,结束X坐标上的移动位置,开始Y坐标上的移动位置,结束Y坐标上的移动位置s wzyd = dh.wzyd(30, 80, 30, 80)// 持续时长wzyd.cxsc(2000)// 设置控件执行动画st.tx(zy.i.tx1).dh(wzyd)//创建一个画面旋转动画//输入动画开始的旋转角度,输入动画旋转到的角度s xz = dh.xz(0, 180)// 持续时长xz.cxsc(2000)// 设置控件执行动画st.tx(zy.i.tx1).dh(xz)位置类型:0 默认1 以对象本身为基准位置类型2 以父控件为基准位置类型//输入动画开始的旋转角度,输入动画旋转到的角度,输入X位置类型,输入X坐标的开始位置,输入Y位置类型,输入Y坐标的开始位置s xz = dh.xz(0, 180, 1, 0.5, 1, 0.5)// 持续时长xz.cxsc(2000)// 设置控件执行动画st.tx(zy.i.tx1).dh(xz)// 开始使用 动画集合s jh = dh.jh(false)// 渐变透明度动画s jbtm = dh.jbtm(1, 0)// 持续时长jbtm.cxsc(2000)jh.tj(jbtm)//渐变尺寸伸缩动画s jbss = dh.jbss(0.5, 2.5, 0.5, 2.5)// 持续时长jbss.cxsc(2000)jh.tj(jbss)//画面位置移动动画s wzyd = dh.wzyd(30, 80, 30, 80)// 持续时长wzyd.cxsc(2000)jh.tj(wzyd)//画面旋转动画s xz = dh.xz(0, 180)// 持续时长xz.cxsc(2000)jh.tj(xz)// 添加动画集合完毕后执行这个动画集合// 设置控件执行动画st.tx(zy.i.tx1).dh(jh)说明:常用于动画集合执行。提示:动画集合允许被其他动画集合添加成为子动画。提示:动画集合如果设置了动画控制属性,同时也会重置所有子控件的属性。// 开始使用 动画队列执行//旋转动画//输入控件ID或控件对象,输入动画类型,输入旋转角度数组...(可输入N个参数)s sz = { 60, 180 }s xz = dh.dl(zy.i.tx1, "rotation", sz)//s sz2 = { 30, 80, 60, 20, 60 }//dh.dl(zy.i.tx1, "rotationX", sz2)//s sz3 = { 30, 80 }//dh.dl(zy.i.tx1, "rotationY", sz3)// 持续时长xz.cxsc(2000)// 开始xz.ks()//伸缩动画//输入控件ID或控件对象,输入动画类型,输入伸缩尺寸比例数组...(可输入N个参数)s sz4 = { 1.5, 2.5 }s ssdh = dh.dl(zy.i.tx1, "scaleX", sz4)//s sz5 = { 1.5, 2.5, 1.2, 2.6, 1.3 }//dh.dl(zy.i.tx1, "scaleY", sz5)// 持续时长ssdh.cxsc(2000)// 开始ssdh.k
全都不会,看不懂[滑稽]

评论

登录后才可发表内容
  • 主题

    863

  • 帖子

    39585

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.0483s Mem:2090Kb