富文本用内建函数.html,字符串内建函数

这些内建函数作用于表达式左侧的字符串值。

如果左侧值是数字或日期/时间/日期-时间或布尔类型(从 2.3.20 版本开始),

根据当前的number-, date/time/date-time- 和 boolean-format设置,

那么它会自动被转成字符串值(当使用${...}

插入这些值时,应用的都是一样的格式程序)。

boolean

字符串转为布尔值。字符串必须是

true 或 false

(大小写敏感!),或者必须是由 boolean_format

设置的特定格式。

如果字符串不是适当的格式,那么当访问该内建函数时,

就会发成错误终止模板处理。

cap_first

字符串中的首单词的首字母大写。

关于"单词"的准确意义,可以参考 word_list 内建函数。

例如:

${" green mouse"?cap_first}

${"GreEN mouse"?cap_first}

${"- green mouse"?cap_first}

将会输出:

Green mouse

GreEN mouse

- green mouse

In the case of "- green mouse", the first

word is the -.

capitalize

字符串中所有单词的首字母大写。

关于"单词"的准确意义,可以参考 word_list 内建函数。例如:

${" green mouse"?capitalize}

${"GreEN mouse"?capitalize}

将会输出:

Green Mouse

Green Mouse

chop_linebreak

在末尾没有 换行符 的字符串,

那么可以换行,否则不改变字符串。

contains

Note:

这个内建函数从 FreeMarker 2.3.1 版本开始可用。

在2.3版本中是没有的。

如果函数中的参数指定的子串出现在源字符串中,

那么返回true。比如:

It contains "ice"#if>

将会输出

It contains "ice"

date, time, datetime

字符串转换成日期值,时间或日期-时间值。需要一个由 date_format,

time_format 和

datetime_format 设置指定的格式。

如果字符串不是适当的格式,那么当访问该内建函数时,

就会发生错误中止模板的处理。

也可以指定明确的格式,比如

?datetime.format 或

?datetime["format"]

(由于历史原因,也可以是

?datetime("format")),

它们与 ?date 和 ?time是相同的。

对于格式化值的语法和意义,可以参考 date_format,

time_format 和

datetime_format 设置 的可能的值。 比如:

避免误解,左侧值无需是字符串文本。比如,当从XML结点

(此处的所有值都是未被解析的字符串)读取数据,那么就需要这样来做

order.confirmDate?date.xs,将字符串转化成真实的日期。

当然,格式也可以是一个变量,比如:

"..."?datetime[myFormat]。

ends_with

返回是否这个字符串以参数中指定的子串结尾。

比如 "ahead"?ends_with("head") 返回布尔值

true。"head"?ends_with("head")

也返回 true。

ensure_ends_with

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用

如果字符串没有以第一个参数指定的子串结尾,

那么就会将它加到字符串后面,否则返回原字符串。比如,

"foo"?ensure_ends_with("/") 和

"foo/"?ensure_ends_with("/") 返回

"foo/"。

ensure_starts_with

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用

如果字符串没有以第一个参数指定的子串开头,

那么就会将它加到字符串开头,否则返回原字符串。比如,

"foo"?ensure_starts_with("/") 和

"/foo"?ensure_starts_with("/") 返回

"/foo"。

如果指定两个参数,那么第一个参数就被解释成Java正则表达式,

如果它不匹配字符串的开头,那么第二个参数指定的字符串就会添加到字符串开头。

比如 someURL?ensure_starts_with("[a-zA-Z]+://", "http://")

就会检查如果字符串是否以 "[a-zA-Z]+://" 开头

(请注意,不需要 ^),如果不是的话,就添加

"http://"。

该方法也接受第三个标志位参数。因为调用两个参数暗指

"r"(也就是正则表达式模式),那么就需要第三个参数了。

值得注意的一点是当不需要第一参数被解释成正则表达式,而只是普通文本,

但是又想让比较是大小写敏感的,那么此时就需要使用 "i"

作为第三个参数。

groups

这个函数只作用于内建函数 matches

的结果。请参考 这里...。

html

字符串按照HTML标记输出。也就是说,下面字符串将会被替代:

< 替换为

<

> 替换为

>

& 替换为

&

" 替换为

"

如果程序员设置了FreeMarker(将 incompatible_improvements

设置为 2.3.20 或更高;更多内容请参考 这里),那么

' 被替换为

'。

请注意,如果想安全地插入一个属性,

必须在HTML模板中使用引号标记(是

",而不是 ')为属性值加引号:

请注意,在HTML页面中,通常想对所有插值使用这个内建函数。

所以可以使用 escape

指令 来节约很多输入,减少偶然错误的机会。

index_of

返回第一次字符串中出现子串时的索引位置。

例如 "abcabc"?index_of("bc") 将会返回1

(不要忘了第一个字符的索引是0)。而且,你可以指定开始搜索的索引位置:

"abcabc"?index_of("bc", 2) 将会返回4。

这对第二个参数的数值没有限制:如果它是负数,那就和是0是相同效果了,

如果它比字符串的长度还大,那么就和它是字符串长度那个数值是一个效果。

小数会被切成整数。

如果第一个参数作为子串没有在该字符串中出现时

(如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1。

j_string

根据Java语言字符串转义规则来转义字符串,

所以它很安全的将值插入到字符串类型中。要注意它

不会 在被插入的值的两侧添加引号;

你需要在字符串值 内部 来使用。

所有 UCS 编码下指向0x20的字符会被转义。

当它们在Java语言中(比如\n,\t等)

没有专门的转义序列时,将会被用UNICODE进行转义替换

(\uXXXX)。

例如:

String BEAN_NAME = "${beanName?j_string}";

将会输出:

String BEAN_NAME = "The \"foo\" bean.";

js_string

根据JavaScript语言字符串转义规则来转义字符串,

所以它很安全的将值插入到字符串类型中。要注意,

它不会在被插入的值两侧添加引号;

你需要在字符串值 内部 来使用。

引号(")和单引号(')要被转义。

从 FreeMarker 2.3.1 开始,也要将 >

转义为 \>(为了避免 )。

所有在 UCS

编码下指向0x20的字符将会被转义。

当它们在JavaScript中没有专用的转义序列时

(比如 \n,\t 等),

它们会被UNICODE字符代替(\uXXXX)。

例如:

alert("Welcome ${user?js_string}!");

将会输出:

alert("Welcome Big Joe\'s \"right hand\"!");

json_string

根据JSON语言的字符串规则来转义字符串,

所以在字符串中插入值是安全的。

要注意它 不会 在被插入的值两侧添加引号;

你需要在字符串值 内部 来使用。

这不会转义 ' 字符,因为JSON字符串必须使用

" 来括起来。它会在 <

之后直接出现的 /(斜杠)字符转义为 \/,

来避免 等。

它也会在 ]] 之后转义 >

字符为 \u003E,来避免退出XML的 CDATA 段。

所有在 UCS 编码下指向0x20的字符会被转义。

当在JSON中没有专用的转义序列时

(比如 \n,\t 等),

它们会被UNICODE字符代替(\uXXXX)。

keep_after

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用。

移除字符串中的一部分内容,该部分是给定子串第一次出现之前的部分。

比如:

${"abcdefgh"?keep_after("de")}

将会输出

fgh

如果参数字符串没有找到,它会返回空串。如果参数是长度为0的字符串,

它会返回源字符串,不会改变。

该方法接受可选的 标志位参数,作为它的第二个参数:

${"foo : bar"?keep_after(r"\s*:\s*", "r")}

将会输出

bar

keep_after_last

Note:

该内建函数从 FreeMarker 2.3.22 版本开始可用。

和 keep_after 相同,

但是它会保留参数最后一次出现后的部分,而不是第一次。比如:

${"foo.bar.txt"?keep_after_last(".")}

将会输出

txt

若使用 keep_after 则会得到

bar.txt。

keep_before

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用。

移除字符串的一部分,该部分是从给定子串开始的部分。

比如:

${"abcdef"?keep_before("de")}

将会输出

abc

如果参数字符串没有找到,它会返回源字符串,不会改变。

如果参数是长度为0的字符串,它会返回空串。

该方法接受可选的 标志位参数,作为它的第二个参数:

${"foo : bar"?keep_before(r"\s*:\s*", "r")}

将会输出

foo

keep_before_last

Note:

该内建函数从 FreeMarker 2.3.22 版本开始可用。

和 keep_before 相同,

但是保留参数最后一次出现之前的部分,而不是第一次出现之前。比如:

${"foo.bar.txt"?keep_after_last(".")}

将会输出

foo.bar

若使用 keep_before 则会得到

foo。

last_index_of

返回最后一次(最右边)字符串中出现子串时的索引位置。

它返回子串第一个(最左边)字符所在位置的索引。例如:

"abcabc"?last_index_of("ab"):将会返回3。

而且可以指定开始搜索的索引。例如,

"abcabc"?last_index_of("ab", 2),将会返回0。

要注意第二个参数暗示了子串开始的最大索引。对第二个参数的数值没有限制:

如果它是负数,那么效果和是零的一样,如果它比字符串的长度还大,

那么就和它是字符串长度那个数值是一个效果。小数会被切成整数。

如果第一个参数作为子串没有在该字符串中出现时

(如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1。

left_pad

Note:

该内建函数从 FreeMarker 2.3.1 版本开始可用。

如果它仅仅用1个参数,那么它将在字符串的开始插入空白,

直到整个串的长度达到参数指定的值。

如果字符串的长度达到指定数值或者比指定的长度还长,

那么就什么都不做了。比如这样:

[${""?left_pad(5)}]

[${"a"?left_pad(5)}]

[${"ab"?left_pad(5)}]

[${"abc"?left_pad(5)}]

[${"abcd"?left_pad(5)}]

[${"abcde"?left_pad(5)}]

[${"abcdef"?left_pad(5)}]

[${"abcdefg"?left_pad(5)}]

[${"abcdefgh"?left_pad(5)}]

将会输出:

[ ]

[ a]

[ ab]

[ abc]

[ abcd]

[abcde]

[abcdef]

[abcdefg]

[abcdefgh]

如果使用了两个参数,那么第一个参数表示的含义和你使用一个参数时的相同,

第二个参数指定用什么东西来代替空白字符。比如:

[${""?left_pad(5, "-")}]

[${"a"?left_pad(5, "-")}]

[${"ab"?left_pad(5, "-")}]

[${"abc"?left_pad(5, "-")}]

[${"abcd"?left_pad(5, "-")}]

[${"abcde"?left_pad(5, "-")}]

将会输出:

[-----]

[----a]

[---ab]

[--abc]

[-abcd]

[abcde]

第二个参数也可以是个长度比1大的字符串。

那么这个字符串会周期性的插入,比如:

[${""?left_pad(8, ".oO")}]

[${"a"?left_pad(8, ".oO")}]

[${"ab"?left_pad(8, ".oO")}]

[${"abc"?left_pad(8, ".oO")}]

[${"abcd"?left_pad(8, ".oO")}]

将会输出:

[.oO.oO.o]

[.oO.oO.a]

[.oO.oOab]

[.oO.oabc]

[.oO.abcd]

第二个参数必须是个字符串值,而且至少有一个字符。

length

字符串中字符的数量。

lower_case

字符串的小写形式。比如

"GrEeN MoUsE"?lower_case

将会是 "green mouse"。

matches

这是一个"超级用户"函数。如果不懂 正则表达式,就忽略它吧。

该内建函数决定了字符串是否精确匹配模式。而且,它会返回匹配子串的列表。

返回值是多类型值:

布尔值:如果字符串整体匹配了模式,就是 true,

否则就是 false。比如:"fooo"?matches('fo*')

就是 true,但是 "fooo bar"?matches('fo*') 是

false。

序列:字符串匹配的子串的列表。很有可能是长度为0的序列。

比如:

Matches.Does not match.#if>

Matches.Does not match.#if>

Matching sub-strings:

- ${m}

#list>

将会输出:

Matches.

Does not match.

Matching sub-strings:

- foo

- fyo

如果正则表达式包含分组(圆括号),那么可以使用

groups 内建函数来访问它们:

First name: ${res?groups[1]}

Second name: ${res?groups[2]}

#if>

- "${m}" is "${m?groups[1]}" per "${m?groups[2]}"

#list>

将会输出:

First name: John

Second name: Doe

- "aa/rx;" is "a" per "a/rx"

- " ab/r;" is " " per "ab/r"

请注意,上面的 groups

对子串匹配和整个字符串匹配的结果都起作用。

matches 接受可选的第二参数,

标志位。请注意,

它不支持标志 f,也会忽略

r 标志。

number

字符串转化为数字格式。这个数字必须是

"计算机语言" 格式。也就是说,

它必须是本地化独立的形式,小数的分隔符就是一个点,没有分组。

该内建函数识别FreeMarker模板语言使用的数字格式。此外,

它也识别科学记数法(比如 "1.23E6","1.5e-8")

从 FreeMarker 2.3.21 版本开始,它也识别所有XML Schema数字格式,比如

NaN,INF,-INF,

还有Java本地格式Infinity 和 -Infinity。

如果字符串不是适当的格式,当尝试访问该内建函数时就会发生错误,

并中止模板执行。

实际上,字符串是由当前

arithmetic_engine 的 toNumber

方法解析的,这是可以配置的设置项。不过该方法应该和上面描述的行为相似。

replace

在源字符串中,用另外一个字符串来替换原字符串中出现它的部分。

它不处理词的边界。比如:

${"this is a car acarus"?replace("car", "bulldozer")}

将会输出:

this is a bulldozer abulldozerus

替换是从左向右执行的。这就意味着:

${"aaaaa"?replace("aaa", "X")}

将会输出:

Xaa

如果第一个参数是空字符串,那么所有的空字符串将会被替换,

比如 "foo"?replace("","|"),就会得到

"|f|o|o|"。

replace 接受可选的 标志位参数,作为它的第三参数。

right_pad

Note:

该内建函数从 FreeMarker 2.3.1 版本开始可用。

在2.3版本中是没有的。

它和 left_pad 相同,

但是它从末尾开始插入字符而不是从开头。

比如:

[${""?right_pad(5)}]

[${"a"?right_pad(5)}]

[${"ab"?right_pad(5)}]

[${"abc"?right_pad(5)}]

[${"abcd"?right_pad(5)}]

[${"abcde"?right_pad(5)}]

[${"abcdef"?right_pad(5)}]

[${"abcdefg"?right_pad(5)}]

[${"abcdefgh"?right_pad(5)}]

[${""?right_pad(8, ".oO")}]

[${"a"?right_pad(8, ".oO")}]

[${"ab"?right_pad(8, ".oO")}]

[${"abc"?right_pad(8, ".oO")}]

[${"abcd"?right_pad(8, ".oO")}]

将会输出:

[ ]

[a ]

[ab ]

[abc ]

[abcd ]

[abcde]

[abcdef]

[abcdefg]

[abcdefgh]

[.oO.oO.o]

[aoO.oO.o]

[abO.oO.o]

[abc.oO.o]

[abcdoO.o]

remove_beginning

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用。

从字符串的开头移除参数中的子串,如果它不以参数中的子串开头,

那么就或者返回原字符串。比如:

${"abcdef"?remove_beginning("abc")}

${"foobar"?remove_beginning("abc")}

将会输出:

def

foobar

remove_ending

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用。

从字符串的结尾移除参数中的子串,如果它不以参数中的子串结尾,

那么就或者返回原字符串。比如:

${"abcdef"?remove_ending("def")}

${"foobar"?remove_ending("def")}

将会输出:

abc

foobar

rtf

字符串作为富文本(RTF 文本),也就是说,下列字符串:

\ 替换为

\\

{ 替换为

\{

} 替换为

\}

split

它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。

比如:

- ${x}

#list>

将会输出:

- some

- test

- text

请注意,假设所有的分隔符都在新项之前出现

(除了使用 "r" 标志 - 后面详细介绍)

因此:

- "${x}"

#list>

将会输出:

- "some"

- ""

- "test"

- "text"

- ""

split 接受可选的 标志位参数,

作为它的第二个参数。由于历史使用 r

(正则表达式)标志的差错;它会从结果列表中移除空元素,

所以在最后示例中使用 ?split(",", "r"),

"" 会从输出中消失。

Note:

要检查一个字符串是否以...结尾或者要附加它,

使用 ensure_ends_with 内建函数。

starts_with

如果字符串以指定的子字符串开头,那么返回true。

比如 "redirect"?starts_with("red") 返回布尔值

true,而且 "red"?starts_with("red")

也返回 true。

Note:

要检查一个字符串是否以...开头或者要在前面附加它,

使用 ensure_starts_with 内建函数。

string (当被用作是字符串值时)

什么也不做,仅仅返回和其内容一致的字符串。例外的是,

如果值是一个多类型的值(比如同时有字符串和序列两种),

那么结果就只是一个简单的字符串,而不是多类型的值。

这可以被用来防止人为多输入。

substring (已废弃)

Note:

从 FreeMarker 2.3.21 版本开始,该内建函数被废弃,由 字符串切分 替代,比如

str[from..

str[from..],

str[from..*maxLength]。

如果处理XML那么有一点警示:因为分割表达式作用于序列和字符串,

而且XML结点通常既是序列又是字符串,那么相等的表达式是

someXmlNode?string[from..

exp?string[from..],

因为没有 ?string 它会分割结点序列而不是结点的字符串值。

概要:

exp?substring(from,

toExclusive),也可以使用

exp?substring(from)

调用。

字符串的子串

from 是第一个字符的索引。

它必须是数字,最小是0并且小于或等于

toExclusive,

否则就会发生错误并且中止模板处理。

toExclusive

是子串最后一个字符之后的字符位置索引,换句话说,它比最后一个字符的索引大1。

它必须是一个数字,最小是0并且小于或等于字符串的长度,

否则就会发生错误并且中止模板处理。如果

toExclusive 被忽略了,

那么默认就是字符串的长度。如果参数是数字但不是整数,

那么只有数字中的整数部分会被使用。

例如:

- ${'abc'?substring(0)}

- ${'abc'?substring(1)}

- ${'abc'?substring(2)}

- ${'abc'?substring(3)}

- ${'abc'?substring(0, 0)}

- ${'abc'?substring(0, 1)}

- ${'abc'?substring(0, 2)}

- ${'abc'?substring(0, 3)}

- ${'abc'?substring(0, 1)}

- ${'abc'?substring(1, 2)}

- ${'abc'?substring(2, 3)}

将会输出:

- abc

- bc

- c

-

-

- a

- ab

- abc

- a

- b

- c

trim

去掉字符串首尾的空格。例如:

(${" green mouse "?trim})

将会输出:

(green mouse)

uncap_first

和 cap_first 相反。

字符串中所有单词的首字母小写。

upper_case

字符串的大写形式。比如

"GrEeN MoUsE" 将会是 "GREEN

MOUSE".

url

Note:

该内建函数从 FreeMarker 2.3.1 版本开始可用。

在2.3版本中是没有的。

在URL之后的字符串进行转义。这意味着,

所有非US-ASCII的字符和保留的URL字符将会被

%XX 形式转义。例如:

${x?url}

将会输出(假设用来转义的字符集是US-ASCII兼容的字符集):

a%2Fb%20c

请注意,它会转义 所有 保留的URL字符

(/, =,

&,等...),

所以编码可以被用来对查询参数的值进行,比如:

Click here...

Note:

上面的没有HTML编码(?html)是需要的,

因为URL转义所有保留的HTML编码。但是要小心:通常引用的属性值,

用普通引号(")包括,而不是单引号

('),因为单引号是不被URL转义的。

为了进行URL转义,必须要选择 字符集,它被用来计算被转义的部分

(%XX)。

如果你是HTML页面设计者,而且你不懂这个,不要担心:

程序员应该配置 FreeMarker,则它默认使用恰当的字符集

(程序员应该多看看下面的内容...)。

如果你是一个比较热衷于技术的人,那么你也许想知道被

url_escaping_charset 设置的指定字符集,

它可以在模板的执行时间设置(或者,更好的是,由程序员之前设置好)。例如:

This will use the charset specified by the programmers

before the template execution has started.

-->

foo

bar

此外,你可以明确地指定一个为单独URL转义的字符集,作为内建函数的参数:

foo

如果内建函数 url 没有参数,

那么它会使用由 url_escaping_charset 设置的字符集。

这个设置应该被软件设置,包括 FreeMarker(比如Web应用框架),

因为它默认不会被设置(null)。

如果它没有被设置,那么 FreeMarker 退回使用 output_encoding

的设置,这个也会被默认设置,所以它也是又软件设置的。

如果 output_encoding 也没有被设置,

那么没有参数的内建函数 url 将不会被执行,

而且它会引起运行时错误。当然,有参数的 url 函数将会执行。

用 setting

指令在模板中设置 url_escaping_charset 是可能的。

至少在真实的MVC应用中,这是一个不好的实践行为。output_encoding

不能由 setting 指令来设置,所以它应该是软件的工作。

你可以阅读 这里... 来获取更多信息。

url_path

Note:

该内建函数从 FreeMarker 2.3.21 版本开始可用。

它和 url 内建函数 相同,只是它不转义斜杠

(/)字符。这就是意味着用来转义使用了斜杠(不是反斜杠!)的路径

(比如操作系统或一些内容仓库的路径),转义之后它们可以插入到URL中。

需要该转义的常用原因是文件夹名称或文件名称可能含有非US-ASCII字母

("国家" 标准符号)。

Note:

和 the

url 内建函数 相似,希望的URL转义字符

(或者后退,输出编码)必须要在 FreeMarker的配置设置项中设置,

否则内建函数就会报错。或者可以指定字符集,比如

somePath?url_path('utf-8')。

word_list

包含字符串中所有单词的序列,顺序为出现在字符串中的顺序。

单词是不间断的字符序列,包含了任意字符,但是没有 空白。例如:

[${word}]#list>

将会输出:

[a][bcd,][.][1-2-3]

xhtml

字符串作为XHTML格式文本,下面这些:

< 替换为

<

> 替换为

>

& 替换为

&

" 替换为

"

' 替换为

'

该内建函数和 xml 内建函数的唯一不同是

xhtml内建函数转义 '

为 ',而不是 ',

因为一些老版本的浏览器不能正确解释 '。

xml

字符串作为XML格式文本,下面这些:

< 替换为

<

> 替换为

>

& 替换为

&

" 替换为

"

' 替换为

'

通用标志

很多字符串内建函数接受可选的字符串参数,

它们被称为"标志"。在这个字符串中,每个字母影响内建函数一个特定方面的行为。

比如,字母 i 说明内建函数不应该区别相同字母的小写和大写变化。

标志字符串中的字母顺序是不重要的。

下面是字母(标志)的完整列表:

i:大小写敏感:

不区别相同字母的小写和大写变化。

f:只是第一个。也就是说,

替换/查找/等...,只是第一个出现的地方。

m:正则表达式的多行模式。在多行正则表达式

^ 和 $ 仅仅匹配之后或之前,

各自匹配行终止符或字符串结尾。默认情况下,这些表达式仅仅匹配完整字符串的开头和结尾。

请注意,^ 和 $ 不匹配换行符字符本身。

s:开启正则表达式的dot-all模式

(和Perl的单行模式相同)。在dot-all模式下,表达式

. 匹配任意字符串,包含行终止符。

默认情况下,该表达式不匹配行终止符。

c: 允许正则表达式中的空白和注释。

例如:

${s?replace('ba', 'XY')}

i: ${s?replace('ba', 'XY', 'i')}

if: ${s?replace('ba', 'XY', 'if')}

r: ${s?replace('ba*', 'XY', 'r')}

ri: ${s?replace('ba*', 'XY', 'ri')}

rif: ${s?replace('ba*', 'XY', 'rif')}

将会输出:

foo bAr XYar

i: foo XYr XYar

if: foo XYr baar

r: foo XYAr XYr

ri: foo XYr XYr

rif: foo XYr baar

下表是支持使用这些通用标志的内建函数:

内建函数

i (忽略大小写)

r (正则表达式)

m (多行模式)

s (dot-all模式)

c (空白和注释)

f (仅第一个)

replace

仅 r

仅 r

仅 r

split

仅 r

仅 r

仅 r

matches

忽略

keep_after

忽略

keep_after_last

忽略

keep_before

忽略

keep_before_last

忽略

ensure_starts_with

忽略

忽略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值