aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 31960|回复: 16

HTMLayout - CSSS!脚本入门

  [复制链接]

43

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2012-6-7 00:39:47 | 显示全部楼层 |阅读模式
一、概 述


CSSS! 是在标准CSS语法基础上扩展的一种简单脚本语言,以实现一些简单的交互行为。
CSSS! 基于标准CSS语法,通常是以一个属性名称(该名称以惊叹号结束)标明触发的事件,以逗号分隔语句(可不是一般编程语言中使用的分号哦),而以分号结束语句块(不是大括号哦),这些非常规的规则为是了遵守CSS语法规范。

二、入 门



让我们看看下面这段 CSSS! 脚本:
.item {
      hover-on! :
            ele = $1( input.url ) ,
            ele:empty == true ?
                  (self.value = "empty") #
                  (self.value = "filled"),
            ele:hover = true,
            self::width = ele.box-content-width(),
            self.$(.icon) -> @(ele) ele::background-color = rgb(255,0,0)
      ;
}
它的格式看起来就像是个扩展的 CSS 属性一样.

一些要注意的地方:
·  CSSS! 语句使用逗号","作为语句结束符.
·  CSSS! 中的字符串只能双引号标识, 不能使用单引号("string").
·   CSSS! 中使用关键字 self 表示当前对象.

三、触发事件(Active CSS attributes)


在前面的示例中,hover-on! 是我们的脚本要处理的事件标识.
当具有 .item 类的元素被鼠标悬停时, 会触发此事件并执行里面的代码.
下面是完整的事件支持列表:

hover-on!:  
鼠标悬停在节点上触发,类似aardio中的  wbLayout.onMouseEnter 事件

hover-off!:  
鼠标离开节点时触发,类似aardio中的   wbLayout. onMouseLeave 事件

active-on!:
鼠标按下时触发,类似aardio中的   wbLayout.onMouseDown 事件

active-off!:
鼠标抬起时触发, 类似aardio中的 wbLayout.onMouseUp 事件

focus-on!:
获得输入焦点时触发,

focus-off!:     
  失去输入焦点时触发,

key-on!:
key-off!:
键盘的按键按下/抬起时触发,通过 key-code() 函数获取按键信息.
key-code() 获得的按键信息可能是一个用单引号包含的有效字符('a', '4', '$')或是下列预定义值之一:
'RETURN', 'LEFT', 'RIGHT', 'UP', 'DOWN', 'PRIOR', 'NEXT', 'TAB', 'HOME', 'END', 'DELETE', 'INSERT', 'BACK'

click!:
double-click!:
鼠标单击,或双击时触发,必须绑定了所有允许接收单击,或双击事件的behavior,储如 button , hyperlink 等等。其他节点一般不会触发这两个事件(这些节点也可通过在CSS中指定 behavior:clickable; 启用该事件)

animation-start!:
animation-step!:
animation-end!:
动画控制事件animation-start! 在调用了元素的 element.start-animation() 方法后触发.animation-step! 事件处理的最后必须返回一个整数(下次执行的间隔毫秒数). 例如: return 500;

timer!:
定时触发器,配合 start-timer(ms) 和 stop-timer() 函数使用.start-timer(ms) 中的参数单位为毫秒.

size-changed!:
元素大小发生改变时触发

value-changed!:
input 类控件的值发生变时时触发

assigned!:
this event is fired when the element gets this style.
In other word when value of the
assigned! attribute changes.

这个属性很有意思,就是在你在CSS给assigned!:这个属性赋值时触发,
换句话说,其实就是你写在这后面的脚本作为CSS属性被应用到节点时触发,而不是等待用户的什么交互。这个事件的作用类似于在behavior 里的 onAttach:

onAttach =
function( ltEle ){
   
return true
}

我们下面看一个简单的aardio范例
假设有一个节点内容是这样:
  1. <label for="id">
复制代码
那么我们可能如下编写CSS,下面的CSS选择器 [for] 匹配所有指定了for属性的节点,在CSS选择器中,中括号指定HTML属性
  1.    [for] {
  2.      hover-on!  : $1(#< self.for >):hover = true;
  3.      hover-off! : $1(#< self.for >):hover = false;
  4.      active-on! : $1(#< self.for >):focus = true;
  5.      cursor:pointer;
  6.    }
  7.    input:hover {
  8.      outline: 4px glow blue 1px;
  9.    }
复制代码
鼠标悬停或离开节点导致节点for属性绑定的节点同步改变 :hover状态,而点击lable节点,
for属性绑定的节点将获得输入焦点,下面我们看一下aardio实现的完整范例:
import win.ui;
/*DSG{{*/
var winform = ..win.form( bottom=399;parent=...;text="aardio Form";right=599 )
winform.add(  )
/*}}*/

import web.layout;
wbLayout = web.layout(winform)

wbLayout.html =
/**
<input type="text" />

<input type="text" id="myText" value="" />
<label for="myText" >鼠标放到这里,并点击这里</lable>
**/



wbLayout.css =
/**
[for]
   {
     hover-on!: $1(#< self.for >):hover = true;
     hover-off!: $1(#< self.for >):hover = false;
     active-on!: $1(#< self.for >):focus = true ;
     cursor:pointer;
   }
   input:hover {
     outline: 4px glow blue 1px;
   }  
**/


winform.show()
win.loopMessage();

参考以下文档整理:
http://www.terrainformatica.com/htmlayout/csss!.whtm
http://bbs.aardio.com/doc/htmlayout/HTMLLayoutDocMx3.htm
http://www.terrainformatica.com/htmlayout/csss!-dom-object.whtm



评分

参与人数 1 +100 +100 收起 理由
wznjsy + 100 + 100 要学好htmlayout,这个帖子必须要看。

查看全部评分

43

主题

628

回帖

3765

积分

版主

积分
3765
 楼主| 发表于 2012-6-7 01:03:30 | 显示全部楼层
CSSS! 嵌入标准CSS并遵守CSS语法规则,受限于CSS语法,脚本并不使用分号分隔语句,
也不会使用大括号表示语句块,而是使用逗号分隔语句,使用分号结束语法块。

一、标志识
标志符可以使用英文字母, '-',  '_' 或者 '$'符号,在这些后面可以附加数字,
注意CSS允许横线作为标志符的一部分,这与其他编程语言不同,如果你需要用横线表示操作符,例如负号,那么清添加空格以区别。

二、 关键字
CSSS! 支持下面的关键字
  1. true   false   null   self
复制代码
true表示逻辑真,false表示逻辑否,null表示空值,

而self表示自身,这里的self可不是aardio中表示当前名字空间的self对象,
实际上他更象aardio中表示自身的this或者owner对象。在CSSS!脚本中,
self指当前触发事件的节点(类似javascript中的this对象)

三、 操作符
  1. <     >     <=    ==    !=    >=    &&    ||+     -     *     /     %     ^     |     &
复制代码
HTMLayout以后版本计划增加的操作符
  1. ~=    ~/    ~%    %~    /~
复制代码

四、三元操作符

这个语法的作用类似条件判断语句,
也有点象aardio中的三元操作符(区别是在CSSS!中使用#号,而不是类似 aardio或C++中的冒号,当然原因也很简单,冒号被CSS语法占用了)
  1. self:value > 12 ?( self:current = true, self.scroll-to-view());
复制代码
上面这句代码是指,如果当前节点的值大于12,那么选中当前节点( 改变current状态),并且滚动到视图范围。

五、 类据类型

CSSS! 变量用到的类型如下



null - 空值;
boolean 逻辑值,两个可选值 true 或 false;
integer - 32位整数值;
float - 64bit浮点值(实际上这里指的是aardio或C++中的double类型);
string - UNICODE字符串;
object - DOM节点对象(引用);
object-set - DOM节点对象的集合,函数 $() 返回这样的类型.
function-reference - CSSS!中定义的函数


六、 字面值


支持整数,浮点小数,文本, 长度单位,以及正则表达式等字面量 :
  1. 整数格式 -> [0-9]+ | '0x' [0-9A-Fa-f]+ | ''' character ''' | key-code-literal
  2. 浮点数格式 -> [0-9]+ '.' [0-9]+浮点数格式 -> [0-9]+ '.' 'e'|'E' '+'|'-' [0-9]+
  3. 文本字面量 -> '"' [.]* '"'
  4. 正则字面量 -> '/' <single line regular expression> ['/ig'] ';'
  5. 长度字面量 -> <integer-literal> | <float-literal> immediately                   followed by one of:                   'pt' | 'px' | 'pc' | '%' | 'em' | 'ex' | 'in' | 'cm' | 'mm'
复制代码
数值支持0x前缀表示的十六进制数值,也可以在数值前使用正负号。
而文本需要放在双引号中。正则字面量则与javascrip;类似,至于长度大小等可以使用px(像素) pt(点)等单位,与CSS相同。

七、键盘代码字面量

键盘代码放在单引号中,可以是单个英文字母,也可以是下面的值
  1. 'RETURN' | 'LEFT' | 'RIGHT' | 'UP' | 'DOWN' | 'PRIOR' | 'NEXT' | 'TAB' | 'HOME' | 'END' | 'DELETE' | 'INSERT' | 'BACK'
复制代码
如果按下组合键,例如 Ctrl+X \则在键名前加上 '^'.
字面量使用示范:
  1. 34 - 表示普通整数   
  2. 0xAFED1234 - 表示十六进制整数         
  3. 1.52 - 表示浮点数         
  4. 1.e2 - 表示浮点数         
  5. 1.e-2 - 浮点数"Hello world!" - 字符串         
  6. 12pt - 表示12象素.         
  7. 'A' - 表示A的键盘代码,实际是一个数值
复制代码
使用键盘代码的示例:
  1. key-on!:  key-code() == '^A'? ... # // Ctrl+A 组合键  
  2. key-code() == '^NEXT'? ... ; // Ctrl+PgDown 组合键
复制代码

八、 注释语法

注释语句被忽略不会被编译,类似aardio的注释语法有两种格式:

单行注释以斜杠开头:
  1. '//' <text-no-crlf> end-of-line
复制代码
多行注释语法也类似aardio:
  1. '/*' <text> '*/'
复制代码

九、  语句

CSSS! 脚本使用逗号 ','分隔语句,
语句块以分号 ';'.结束 ,下面是支持的语法规则:

9.1)、  赋值语句:
  1. <左值> '=' <表达式>.
复制代码
9.2) 、  变量声明:
  1. <变量名> <b>'='</b> <表达式>
复制代码
9.3) 、  语句块
语句块是一系列使用逗号分隔的语句,语法规则如下:
  1. '('  <expression> [, <expression>]*  ')'
复制代码

9.4)
条件语句

语法规则:
  1. <logical-expresion> '?' <when-true-expression> [ '#'  <when-false-expression> ]
复制代码
CSSS! 的条件判断语句格式很简单,
类似 Javascript或aardio中 的 三元操作符 …  ?  …  :   …  组合,区别是用#号代替了冒号:

  1. 判断条件 ? (条件为真时的操作)
复制代码
或者:

  1. 判断条件 ? (条件为真时的操作)   
复制代码

9.5)
、  循环
不支持循环,但是函数可以支持尾递归调用.

9.6) 、  Return语句
return 语句用在函数中返回一个值:
  1. return <expression-or-value-to-return>
复制代码

9.7)
、  For each, 枚举语句

语法规则如下:
  1. <object-set> '->'  <reference-to-function-with-single-parameter>
复制代码
枚举通常被用于处理元素集合,格式如下:

      集合 -> @(参数名) 操作语句
      
      aardio中类似的遍历集合的代码如下:
      for
局部变量名 in 集合{ }

.
范例:
  1.   input.number {
  2.        value-changed! :
  3.          total = 0,
  4.          $(input.number) -> @(el) total = total + el:value,
  5.          $1(td#total):value = total;
  6.      }
复制代码
上面代码的解释: 设页面上有一个HTML节点 <input class="number"> 在他的值发生改变量触发下面的操作:



定义一个变量 total 并且初始化他的值为 0,
定义一个函数 @(el) total = total + el:value,
枚举所有匹配CSS选择器 input.number 的节点,并执行->操作符后面指定的函数,
将total 的值赋于第一个匹配CSS选择器 td#total.的节点


十、访问DOM节点的属性、状态值、CSS样式

10.1)、   可以使用成员操作符圆点访问节点的属性:
例如对于当前节点: <input type="text"> 有下面的脚本代码:
  1. t = self.type
复制代码
将会获取节点的type属性并赋值给变量 t.  

10.2)、   节点的状态使用冒号作为成员操作符:
支持的CSS状态储如:  :hover, :active, :link,  :checked, :current, etc.

CSSS! 中有如下状态可在执行时使用:
状态
说明
ele:value
元素DOM节点对象的值( 注意在CSSS!中 value 是作为一个状态值来访问,不是属性值,是以不能写为 ele.value, 而应当改用冒号写为 ele:value ), 对于输入框这个值为输入的文本. 其他元素为内部的文本.
ele:index
元素在子元素的序号. 取值从 1 开始到 self.parent().children()
ele:hover
ele:active
ele:empty
ele:readonly
ele:disabled
ele:focusable
部分CSSS!中常用的布尔型状态. (true/false)

更多节点状态属性请参考官方文档:http://www.terrainformatica.com/htmlayout/csss!-dom-object.whtm


10.3)、   CSS 属性使用两个冒号'::' 作为成员操作符:

下面是一个范例,在定时器中逐渐的将对象改变为透明状态。
  1. self::opacity = self::opacity + 0.1 #
  2. return cancel;
复制代码

十一、Self对象

在脚本事件中表示当前节点
.
十二、Cancel

这个关键字是专用于return语句,以终止事件继续传递r.

十三、函数

CSSS! 支持匿名函数定义

13.1 定义函数

对于一般的函数, 定义的格式如下:
  1. foo = @( a, b ) c = a + b, return c
复制代码
类似于aardio中类似的定义函数的代码如下:
  1. foo = function( a, b ) {
  2.     c = a + b; return c;
  3. } <font color="rgb(0,0,0)"><font>
  4. </font></font>
复制代码
13.2 调用函数

调用函数比较简单,下面的脚本调用函数foo(),传入参数1,2,并将返回值赋值给变量bar:
  1. bar = foo(1,2)
复制代码

43

主题

628

回帖

3765

积分

版主

积分
3765
 楼主| 发表于 2012-6-7 01:17:00 | 显示全部楼层
一、CSS选择器函数

在 CSSS! 中获取元素有如下几个函数可用:
CSSS!函数
函数说明
$1(.item)
获取匹配 ".item" 的第一个元素
类似aardio中的wbLayout.queryEle()函数(唯一的区别是在aardio中需要将CSS选择器参数放在引号中 - 即使用字符串包含CSS选择器)
$(.item)
获取所有匹配 ".item" 的元素.
类似aardio中的wbLayout.queryEles()函数(在aardio中需要将CSS选择器参数放在引号中 - 即使用字符串包含CSS选择器)

$(.item) 返回的集合可以象单个元素一样直接使用,例如:
$(.item).属性 = 值,

返回值也可以用于枚举, 例如:
$(.item)->ele(ele) ele.属性 = 值;
ele.$1(.item)
获取ele子元素中匹配".item"的第一个元素
ele.$(.item)
获取ele子元素中匹配".item"的所有元素
类似aardio中的ele.queryElements()函数
ele.$1p(.item)
获取父元素中匹配".item"的最近的一个元素.
类似aardio中的ele.queryParent()函数
ele.$p(.item)
获取父元素中所有匹配".item"的元素.
ele.parent()
获取父元素
ele.next()
获取同级的下一个元素
ele.previous()
获取同级的上一个元素
ele.child(3)
ele.children()
获取第3个子元素. 参数范围 1 … ele.children().
可以通过 ele.children() 获取子元素的数目.

CSS选择器参数中可以使用变量(包含在尖括号中), 示例:
  1. ncol = 2, $( table td:nth-child(< ncol >)).some-attr = "hi!";
复制代码
上面的CSSS!脚本对所有符合CSS选择器 table td:nth-child(2) 规则的节点改变属性  some-attr  的值为  "hi!"

二、其他全局函数

  • int(val)- 转换一个值为整数r;
  • float(val)- 转换一个值为浮点数,类似aardio中的tonumber;
  • length(val) - 转换一个值为长度值(包含单位);
  • min(val1, val2 ... valN)- 返回最小数;
  • max(val1, val2 ... valN)-返回最大数;
  • limit(val, minval, maxval) - 返回一个值是并限定允许的最小或最大值

三、String 字符串对象的一些成员函数

  • string.length - 取字符串长度
  • string.toUpper() -  将字符串转为大写;
  • string.toLower() -  将字符串转为小写
  • string.slicestr(start[, length = -1]) -  截取字符串,参数一指定开始位置,参数二指定长度,如果小于零,则截取到尾部。

四、HTML节点对象提供的一些内置函数

ele.children() - 返回子节点数目
ele.child(n:integer) - 返回指定子节点,参数为索引
ele.next() -返回下一个兄弟节点
ele.previous() -返回上一个兄北节点
ele.parent() - 返回父节点
ele.text-width("string") - 计算当前节点在当前样式下显示指定文本所需的像素宽度.
ele.min-intrinsic-width(), ele.max-intrinsic-width() - 节点最小,最大内容宽度
ele.min-intrinsic-height(), ele.max-intrinsic-height() - 节点最小,最大内容高度
ele.system-scrollbar-width(),ele.system-scrollbar-height() - 系统设定的滚动条宽度,高度
ele.system-border-width() - 系统设定的边框宽度
ele.system-small-icon-width(),ele.system-small-icon-height() - 系统设定的小图标宽度,高度
ele.foreground-image-width(),ele.foreground-image-height() - 当前节点的前景图片高度,高度
ele.background-image-width(),ele.background-image-height() - 当前节点的背景图片高度,宽度

ele.box-type-what()
返回节点位置大小等相关参数,

其中type必须被替换为以下名字之一:
margin - margin box (节点包含外边距空间)
border - border box(节点包含边框空间);
padding - padding box (节点包含内边距空间);
content - content box (节点内容空间).
inner - inner box(节点内部空间);
what part of the name is one of:

what必须被替换为以下名字之一:
left - 左边距;
right - 右边距;
top - 顶边距
bottom - 底边距;
width - 宽度;
height - 高度;

例如 self.box-border-width() 返回包含节点包含边宽的宽度。

ele.x-parent() 获取相对父节点的x坐标;
ele.x-root() 获取相对HTML根节点的x坐标
ele.x-view() 获取相对当前窗口的x坐标
ele.x-screen() 获取相对屏幕的x坐标

ele.y-parent() 获取相对父节点的y坐标;
ele.y-root() 获取相对HTML根节点的y坐标
ele.y-view() 获取相对当前窗口的y坐标
ele.y-screen() 获取相对屏幕的y坐标

ele.scroll-to-view()
滚动节点到当前视图

ele.start-animation(duration)
开始执行动画,该函数触发 animation-start! animation-step! animation-end!等事件, 
duration 参数指定动画持续时间, 例如: self.start-animation(0.4s) 启动动画 - 持续时间为400ms(毫秒)

ele.stop-animation()
停止执行动画。最好不要同时启动多个动画效果,停止当前动画再启动效的动画。

ele.start-timer(period:integer)
启动定时器,参数指定时间间隔,以毫秒为单位,该函数触发  timer! 事件,在该事件中调用return cancel取消定时器,
也可以调用  stop-timer() 函数取消定时器。

ele.stop-timer()
取消定时器

注意CSSS!脚本中使用横线作为标志符的一部分是合法的,
这在其他编程语言,以及aardio里是行不通的. 请注意区分!

43

主题

628

回帖

3765

积分

版主

积分
3765
 楼主| 发表于 2012-6-7 01:39:52 | 显示全部楼层
import win.ui;
/*DSG{{*/
var winform = ..win.form( bottom=399;parent=...;right=599;text="aardio Form" )
winform.add(  )
/*}}*/

import web.layout; //首先导入HTMLayout支持库
var wbLayout = web.layout(winform); //创建HTMLayout窗体

wbLayout.html =
/*********
<html>
<head>
  <style>

  //下面的选择符表示拥有 autofocus属性的节点,并且状态为可以获取焦点(focusable)
  [autofocus]:focusable {
    assigned!: self:focus = true; //assigned!事件表示加载脚本即时执行
  }
  </style>  
<head>
<body>
  在页面加载以后,第二个文本框自动得到焦点:<br/>
  <input type="text" value="测试文本框" /><br/>
  <input type="text" value="看我自动得到焦点了" autofocus />
</body>
</html>
*********/



winform.show()
win.loopMessage();

            

43

主题

628

回帖

3765

积分

版主

积分
3765
 楼主| 发表于 2012-6-7 01:44:55 | 显示全部楼层
注意下面仅仅用到了CSS扩展功能,并没有直接使用CSSS!脚本

import
win.ui;
/*DSG{{*/
var winform = ..win.form( bottom=399;parent=...;right=599;text="aardio Form" )
winform.add(  )
/*}}*/

import web.layout;
var wbLayout = web.layout(winform);

wbLayout.html =
/*********
<html>
<head>
  <style>
    div.slave { visibility:collapse; } //指定了slave类的节点默认折叠
   
    //注意下面的加号,这是一个关系选择符,表示加号前面的节点后面的第一个节点
    widget.master:checked + div.slave { visibility:visible; }
  </style>  
<head>
<body>

  <widget type="checkbox" .master>请点选这里:</widget>
  <div .slave>
    <li>item #1</li>
    <li>item #2</li>
    <li>item #3</li>
  </div>
  
  <widget type="checkbox" .master>请点选这里试试:</widget>
  <div .slave>
    <li>item #1</li>
    <li>item #2</li>
    <li>item #3</li>
  </div>
</body>
</html>
*********/



winform.show()
win.loopMessage();

            

43

主题

628

回帖

3765

积分

版主

积分
3765
 楼主| 发表于 2012-6-7 01:51:21 | 显示全部楼层
import win.ui;
/*DSG{{*/
var winform = ..win.form( bottom=399;parent=...;right=599;text="aardio Form" )
winform.add(  )
/*}}*/

import web.layout;
var wbLayout = web.layout(winform);

wbLayout.html =
/*********
<html>
  <head>
    <style>
      p#test {
        border:1px solid black; //定义边框
        width: 30%; //定义宽度
        hover-on!: self.start-timer(400); //鼠标悬停时,开始定时器,间隔400毫秒
        hover-off!: self.stop-timer(),
                    $1(popup#for-test):popup = false ; //注意冒号作为成员操作符时改变节点的状态
                    
                //注意下面用到了条件语句,问号前面是条件
        timer!: self:hover ? self.show-popup($1(popup#for-test),3,9), /*参数表示在右下角弹出提示 */
                return cancel;//阻止事件继续传递
      }
      
      popup#for-test  {
        margin-top:10px; /*指定顶边距 */
      }
   
    </style>
  </head>
<body>
  自定义提示
  <p #test>请将鼠标放在这里</p>
  
  <popup #for-test>
    哈哈,你成功了
  </popup>

</body>
</html>

*********/


winform.show()
win.loopMessage();

更多范例, 请大家查看"aardio范例 -> HTMLayout -> HTMLayout范例预览工具 -> CSSS!脚本 "

            

5

主题

58

回帖

753

积分

荣誉会员

积分
753
发表于 2012-6-7 21:50:26 | 显示全部楼层
辛苦了~~~谢谢

2

主题

13

回帖

134

积分

一级会员

积分
134
发表于 2012-6-15 16:05:33 | 显示全部楼层
辛苦了!!!

48

主题

542

回帖

3328

积分

五级会员

积分
3328
发表于 2012-6-22 00:05:06 | 显示全部楼层
辛苦了,多谢

16

主题

41

回帖

527

积分

培训班

积分
527
发表于 2012-11-3 11:26:37 | 显示全部楼层
回帖留名!Mark一下,这贴对CSS!的说明很透彻!

0

主题

5

回帖

125

积分

一级会员

积分
125
发表于 2012-11-6 00:31:21 | 显示全部楼层
学习CSS

0

主题

12

回帖

166

积分

一级会员

积分
166
发表于 2013-1-6 09:31:02 | 显示全部楼层
学习CSS

9

主题

193

回帖

1297

积分

四级会员

积分
1297
发表于 2013-5-22 22:39:28 | 显示全部楼层
谢谢精彩教程,默默用心付出

0

主题

2

回帖

16

积分

新手入门

积分
16
发表于 2014-6-5 17:10:46 | 显示全部楼层
标记一下,怕忘记了

0

主题

10

回帖

56

积分

一级会员

积分
56
发表于 2015-2-9 11:40:37 | 显示全部楼层
非常棒!

4

主题

22

回帖

203

积分

二级会员

积分
203
QQ
发表于 2015-4-19 20:28:16 | 显示全部楼层
好帖子,收藏

0

主题

9

回帖

60

积分

一级会员

积分
60
发表于 2016-9-2 15:39:24 | 显示全部楼层
学习了,收藏
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2023-3-28 13:46 , Processed in 0.066313 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表