checkstyle

<!DOCTYPE module PUBLIC
        "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
        "https://checkstyle.org/dtds/configuration_1_3.dtd">

<module name="Checker">
    <!--规则 源文件编码格式(包括注释)必须是UTF-8,ASCII水平空格字符(0x20,即空格)是唯一允许出现的空白字符,制表符不能用于缩进-->
    <property name="charset" value="UTF-8"/>
    <property name="fileExtensions" value="java"/>

    <!--使用CHECKSTYLE:OFF and CHECKSTYLE:ON 注释内容关闭或开启某个检查-->
    <module name="SuppressWithPlainTextCommentFilter">
        <property name="offCommentFormat" value="CHECKSTYLE\:OFF\:\s*(\w+)"/>
        <property name="onCommentFormat" value="CHECKSTYLE\:ON\:\s*(\w+)"/>
        <property name="checkFormat" value="$1"/>
    </module>

    <!--规则 避免文件过长,不超过2000行(非空非注释行)-->
    <module name="FileLength">
        <property name="max" value="2000"/>
    </module>

    <!--规则 使用空格进行缩进,每次缩进4个空格,不允许用tab-->
    <module name="FileTabCharacter"/>

    <!--规则 版权检查-->
    <module name="RegexpSingleline">
        <property name="format"
                  value="^ \* Copyright \(c\) ** Technologies Co., Ltd. [\d]{4}(\-[\d]{4})\. All rights reserved\.$"/>
        <property name="minimum" value="1"/>
        <property name="maximum" value="1"/>
        <property name="message" value="规则:*版权缺失或者格式不正确"/>
        <property name="severity" value="error"/>
    </module>

    <!--    <module name="RegexpSingleline">-->
    <!--        <property name="format" value="^\s\*\s@since\s\d{4}-\d{2}-\d{2}$"/>-->
    <!--        <property name="minimum" value="1"/>-->
    <!--        <property name="maximum" value="1"/>-->
    <!--        <property name="severity" value="error"/>-->
    <!--        <property name="message" value="顶层public类javadoc缺少@since或格式不正确(示例:@since 2019-01-01)"/>-->
    <!--    </module>-->

    <!--建议 含有集合意义的属性、名称尽量包含复数形式-->
    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="Set(&lt;\w+&gt;)?\s.*(?&lt;!Set|SET|s|S)\s="/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="Set(&lt;\w+&gt;)?\s\w+(?&lt;!Set|SET|s|S);$"/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="List(&lt;\w+&gt;)?\s.*(?&lt;!List|LIST|s|S)\s="/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="List(&lt;\w+&gt;)?\s\w+(?&lt;!List|LIST|s|S);$"/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="Map(&lt;.+&gt;)?\s.*(?&lt;!Map|MAP|s|S)\s="/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="Map(&lt;.+&gt;)?\s\w+(?&lt;!Map|MAP|s|S);$"/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="\[\]\s.*(?&lt;!Array|ARRAY|s|S)\s="/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="\[\]\s\w+(?&lt;!Array|ARRAY|s|S);$"/>
        <property name="message" value="建议:含有集合意义的属性、名称尽量包含复数形式"/>
    </module>

    <!--建议 避免使用否定的布尔变量名或方法名-->
    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="(boolean|Boolean)\s(\bisNot?|\bmIsNot?)[A-Z](a-zA-Z0-9=;,\s)*"/>
        <property name="message" value="建议:避免使用否定的布尔变量名或方法名"/>
    </module>
    
    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="(boolean|Boolean)\s[^ile][^sSq][^u]?[^l]?[^s]?"/>
        <property name="message" value="建议:避免使用否定的布尔变量名或方法名"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format"
                  value="(boolean|Boolean)\s((m[^I])|(mI[^s])|(s[^I])|(sI[^s])|[^msiI]|([iI][^sS]))(?![a-zA-Z0-9=;,\s]*\()"/>
        <property name="message" value="建议:布尔变量名或方法以is开头(Android允许mIs开头)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="(boolean|Boolean)\s(((is)[^A-Z0-9])|(IS[^A-Z_0-9]+))"/>
        <property name="message" value="建议:布尔变量名is后面字符必须是大写字母或数字"/>
    </module>

    <!--规则 注释符与注释内容之间要有1空格,右置注释符与前面代码至少1空格-->
    <module name="RegexpSingleline">
        <property name="format" value="[^:]//[^\s]"/>
        <property name="message" value="规则:请添加空格(单行注释符与注释内容之间以空格分割)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="case [\s\S]+[:]//"/>
        <property name="message" value="规则:请添加空格(单行注释符与注释内容之间以空格分割)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="(\*)+[\u4E00-\u9FA5A-Za-z0-9_]"/>
        <property name="message" value="规则:请添加空格(单行注释符与注释内容之间以空格分割)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="[\u4E00-\u9FA5A-Za-z0-9_]((\*)+)/"/>
        <property name="message" value="规则:请添加空格(单行注释符与注释内容之间以空格分割)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value=".*;//"/>
        <property name="message" value="请添加空格(分号和单行注释符之间以空格分割)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="^\s*//[^\u4e00-\u9fa5]*(\s*;|\{|\})$"/>
        <property name="message" value="不用的代码直接删除,不要注释掉"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="\s+(Byte|Short|Integer|Long|Float|Double|Character|Boolean)\s+"/>
        <property name="message" value="请使用基本类型"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="(LOG|LOGGER|log|logger)\.(fatal|error|warn|info|debug).+[\u4e00-\u9fa5]+"/>
        <property name="message" value="禁止用中文打印日志"/>
    </module>
    
    <module name="RegexpSingleline">
        <property name="format" value="^\s*return null;\s*$"/>
        <property name="message" value="建议:不要直接返回null,集合使用Collections.enpty*,其他类型使用Optional代替"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="\s+$"/>
        <property name="message" value="行末或空行不能有空格,请去除多余空格"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="[A-Za-z0-9=+-;:\?\*]\s{2,}[\u4e00-\u9fa5A-Za-z0-9=+-:\?]"/>
        <property name="message" value="禁止插入空格水平对齐(包括多余括号)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format"
                  value="((&lt;|&gt;|&gt;=|&lt;=|==|!=)\s*(Double\.NaN|Float\.NaN))|((Double\.NaN|Float\.NaN)\s*(&lt;|&gt;|&gt;=|&lt;=|==|!=))"/>
        <property name="message" value="禁止尝试与NaN进行比较,相等操作使用Double或Float的isNaN方法"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="^.*for\s+[(](float|double).*$"/>
        <property name="message" value="不能使用浮点数做循环变量"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="long\s*\w+\s*=\s*\d+\s*;"/>
        <property name="message" value="数字字面量以大写字母(long类型变量请显示填写L,或改为int类型)"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="\([a-zA-Z\s,&lt;&gt;\\.]+\.{3}[a-zA-Z\s,&lt;&gt;\\.]*\)"/>
        <property name="message" value="谨慎使用可变数量参数的方法"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="\.ordinal\(\)"/>
        <property name="message" value="避免枚举常量序号的产生依赖于ordinal()方法"/>
    </module>

    <module name="RegexpSingleline">
        <property name="severity" value="warning"/>
        <property name="format" value="native [a-z].*;$"/>
        <property name="message" value="谨慎使用本地方法"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="\w{65,}"/>
        <property name="message" value="名字长度不能超过64个字符"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="\s[a-zA-Z](\s|;)"/>
        <property name="message" value="名字长度至少2个字符(循环变量、异常变量e当做误报忽略)"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format" value="catch\s+[(][^)]*[)]\s+[{]\s+[}]"/>
        <property name="message" value="不要通过一个空的catch块忽略异常"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format"
                  value="(LOG|LOGGER|log|logger)\.(fatal|error|warn|info|debug)\((([^&quot;].+)|&quot;.+&quot;[^,])\s*(.*)\+"/>
        <property name="message" value="日志应分等级,对info及以下,使用条件形式或者使用占位等的方式"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format"
                  value="/[*]+\s+(private|public|protected|static)+[^(]*[(]+[^)]*[)]+\s+[{]+[^\*/]*[\*/]+"/>
        <property name="message" value="不用的代码直接删除,不要注释掉"/>
    </module>

    <module name="RegexpMultiline">
        <property name="severity" value="warning"/>
        <property name="format" value="(null == )|(null != )|([A-Z_]+ (&lt;|&gt;|&gt;=|&lt;=|==|!=)+)"/>
        <property name="message" value="表达式的比较,应当遵循左侧的倾向于变化,右侧的倾向于不变的原则"/>
    </module>

    <module name="RegexpMultiline">
        <property name="severity" value="warning"/>
        <property name="format" value="(\{\s*[\r\n]\s*[\r\n]\s*[\r\n])|(\s*[\r\n]\s*[\r\n]\s*[\r\n]\s*\})"/>
        <property name="message" value="大括号内部首尾,不需要空行"/>
    </module>

    <module name="RegexpMultiline">
        <property name="severity" value="warning"/>
        <property name="format" value="(^\s*[\r\n]){2,}"/>
        <property name="message" value="减少不必要的空行,保持代码紧凑(最多一个空行)"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format"
                  value="Ltd. ([0-9]{4}).*[\r\n](.*[\r\n])+.*@since\s+\1"/>
        <property name="minimum" value="1"/>
        <property name="maximum" value="1"/>
        <property name="message" value="请检查版权申明中真实年份与@since中是否一致"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format" value="\*/[\r\n]{3,}(public|private|protected)\s+(class|interface|enum)\s"/>
        <property name="message" value="顶层类(接口或枚举)首行不应有空行"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format" value="\*/[\r\n]{3,}(class|interface|enum)\s"/>
        <property name="message" value="顶层类(接口或枚举)首行不应有空行"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format" value="\{\s*[\r\n]\s*[\r\n]\s*[\r\n]"/>
        <property name="message" value="多余空行"/>
    </module>

    <module name="RegexpMultiline">
        <property name="format" value="\s*[\r\n]\s*[\r\n]\s*[\r\n]\s*\}"/>
        <property name="message" value="多余空行"/>
    </module>

    <module name="TreeWalker">
        <module name="JavadocType">
            <property name="authorFormat" value="\S"/>
            <property name="versionFormat" value="\S"/>
        </module>

        <module name="JavadocMethod">
            <property name="scope" value="protected"/>
            <property name="allowMissingParamTags" value="false"/>
            <property name="allowMissingThrowsTags" value="false"/>
            <property name="allowMissingReturnTag" value="false"/>
            <property name="allowMissingPropertyJavadoc" value="true"/>
            <property name="logLoadErrors" value="true"/>
            <property name="suppressLoadErrors" value="true"/>
        </module>

        <module name="JavadocVariable">
            <property name="scope" value="public"/>
        </module>

        <module name="JavadocStyle">
            <property name="checkFirstSentence" value="false"/>
            <property name="checkEmptyJavadoc" value="true"/>
            <property name="checkHtml" value="false"/>
        </module>

        <module name="WriteTag">
            <property name="tag" value="@since"/>
            <property name="tagFormat" value="^\d{4}-\d{2}-\d{2}$"/>
            <property name="tagSeverity" value="ignore"/>
        </module>

        <module name="LineLength">
            <property name="ignorePattern" value="^ *\* *[^ ]+$"/>
            <property name="max" value="120"/>
        </module>

        <!--检查内部类,最多60行-->
        <module name="AnonInnerLength">
            <property name="max" value="60"/>
        </module>

        <!--检查java方法,最大50行-->
        <module name="MethodLength">
            <property name="countEmpty" value="false"/>
            <property name="max" value="50"/>
        </module>

        <!--参数个数,最大5-->
        <module name="ParameterNumber">
            <property name="max" value="5"/>
        </module>

        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <module name="MultipleVariableDeclarations"/>
        <module name="GenericWhitespace"/>
        <module name="WhitespaceAround">
            <property name="tokens" value="COLON,NOT_EQUAL,QUESTION,DIV,DIV_ASSIGN,BXOR,BXOR_ASSIGN"/>
        </module>

        <!--检查是否存在TODO(待处理)-->
        <module name="TodoComment">
            <property name="format" value="(TODO)|(FIXME)"/>
        </module>

        <!--修饰符顺序检查-->
        <!--正确顺序public,protected,private,abstract,static,final,transient,volatile,synchronized,native,strictfp-->
        <module name="ModifierOrder"/>
        <!--空快检查,不允许有空快,如{}-->
        <module name="EmptyBlock"/>
        <!--左大括号放在一行结构的右边-->
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="RightCurly">
            <property name="option" value="alone"/>
            <property name="tokens" value=""/>
        </module>

        <module name="RegexpSinglelineJava">
            <property name="format" value="printStackTrace"/>
            <property name="message" value="不允许打印堆栈信息"/>
            <property name="ignoreComments" value="true"/>
        </module>

        <module name="RegexpSinglelineJava">
            <property name="format" value="System.out.print.*"/>
            <property name="message" value="不允许使用控制台输出"/>
            <property name="ignoreComments" value="true"/>
        </module>

        <!--检查魔鬼数字-->
        <module name="MagicNumber">
            <property name="ignoreNumbers" value="0,1"/>
            <property name="ignoreHashCodeMethod" value="true"/>
        </module>

        <module name="IllegalThrows">
            <property name="illegalClassNames" value="java.lang.Error,java.lang.RuntimeException"/>
        </module>

        <module name="DeclarationOrder"/>
        <module name="UnnecessaryParentheses"/>
        <module name="StringLiteralEquality"/>
        <module name="VisibilityModifier">
            <property name="packageAllowed" value="true"/>
            <property name="protectedAllowed" value="true"/>
        </module>

        <module name="HideUtilityClassConstructor"/>
        <module name="CyclomaticComplexity">
            <property name="max" value="10"/>
        </module>
        <module name="ThrowsCount">
            <property name="max" value="5"/>
        </module>
        <module name="InterfaceIsType"/>
        <module name="UpperEll"/>

        <module name="Indentation"/>
        <module name="UncommentedMain">
            <property name="excludedClasses" value="\.[a-zA-Z]*Main$"/>
        </module>

        <module name="Regexp">
            <property name="illegalPattern" value="true"/>
            <property name="message" value="请添加功能描述"/>
        </module>

        <module name="Regexp">
            <property name="illegalPattern" value="true"/>
            <property name="message" value="请添加详细功能描述"/>
        </module>

        <module name="AvoidStarImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>
        <module name="ImportOrder">
            <property name="groups" value="android,androidx,ccy,com.ccy,com,*,net,org,javacard,/^java\./,javax"/>
            <property name="ordered" value="true"/>
            <property name="separated" value="true"/>
            <property name="option" value="top"/>
            <property name="useContainerOrderingForStatic" value="true"/>
            <property name="sortStaticImportsAlphabetically" value="true"/>
        </module>

        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
            <property name="severity" value="warning"/>
        </module>

        <module name="ConstantName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)|(^log$)|(^logger$)"/>
        </module>

        <module name="LocalFinalVariableName">
            <property name="format" value="(^[a-z]([a-z0-9]+[A-Z]?)*$)"/>
        </module>

        <module name="LocalVariableName">
            <property name="format" value="(^m[a-zA-Z0-9]+$)|(^s[a-zA-Z0-9]+$)|(^[a-ln-rt-z]([a-z0-9]+[A-Z]?)*$)"/>
        </module>

        <module name="MemberName">
            <property name="format" value="(^m[a-zA-Z0-9]+$)|(^s[a-zA-Z0-9]+$)|(^[a-ln-rt-z]([a-z0-9]+[A-Z]?)*$)"/>
        </module>

        <module name="MethodName">
            <property name="format" value="^[a-z]([a-z0-9]+[A-Z]?)*$"/>
        </module>

        <module name="PackageName">
            <property name="format" value="^com.ccy(\.[a-z][a-z0-9]*)*$"/>
        </module>

        <module name="ParameterName">
            <property name="format" value="(^[a-z]([a-z0-9]+[A-Z]?)*$)"/>
        </module>

        <module name="StaticVariableName">
            <property name="format" value="(^[a-lt-z]([a-z0-9]+[A-Z]?)*$)|(^s[a-zA-Z0-9]+$)|(^m[a-zA-Z0-9]+$)"/>
        </module>

        <module name="TypeName">
            <property name="format" value="^[A-Z]([a-z0-9]+[A-Z]?)*$"/>
        </module>

        <module name="AtclauseOrder"/>
        <module name="ArrayTypeStyle"/>
        <module name="VariableDeclarationUsageDistance">
            <property name="allowedDistance" value="3"/>
        </module>

        <module name="AnnotationLocation">
            <property name="allowSamelineMultipleAnnotations" value="false"/>
            <property name="allowSamelineSingleParameterlessAnnotation" value="false"/>
            <property name="allowSamelineParameterizedAnnotation" value="false"/>
        </module>

        <module name="FallThrough">
            <property name="checkLastCaseGroup" value="false"/>
            <property name="reliefPattern" value="^.*[fallthra|falls|fall]?\s+through.*$"/>
        </module>

        <module name="MissingSwitchDefault"/>
        <module name="DefaultComesLast"/>
        <module name="EmptyStatement"/>
        <module name="AvoidNestedBlooks">
            <property name="allowInSwitchCase" value="true"/>
        </module>

        <module name="NestedTryDepth">
            <property name="max" value="2"/>
        </module>

        <module name="NestedIfDepth">
            <property name="max" value="2"/>
        </module>

        <module name="NestedForDepth">
            <property name="max" value="2"/>
        </module>

        <module name="ParameterAssignment"/>

        <module name="HiddenField">
            <property name="ignoreConstructorParameter" value="true"/>
            <property name="ignoreSetter" value="true"/>
            <property name="ignoreAlstractMethod" value="true"/>
            <property name="setterCanReturnItsClass" value="true"/>
        </module>

        <module name="EqualHashcode"/>
        <module name="RedundantModifier"/>
        <module name="MissingOverride"/>

        <module name="IllegalCatch">
            <property name="illegalClassName"
                      value="java.lang.Exception,java.lang.Throwable,java.lang.RuntimeException,java.lang.NullPointerException"/>
        </module>

        <module name="RegexpSinglelineJava">
            <property name="format" value="\.yield\(\)"/>
            <property name="message" value="禁止使用yield方法"/>
        </module>

        <module name="RegexpSinglelineJava">
            <property name="format" value="\.wait\("/>
            <property name="message" value="禁止使用wait方法"/>
        </module>

        <module name="RegexpSinglelineJava">
            <property name="format" value="\.setPriority\("/>
            <property name="message" value="禁止使用setPriority方法"/>
        </module>

        <module name="RegexpSinglelineJava">
            <property name="format" value="\.notify\(\)"/>
            <property name="message" value="禁止使用notify方法"/>
        </module>


        <module name="RegexpSinglelineJava">
            <property name="format" value="\.notifyAll\(\)"/>
            <property name="message" value="禁止使用notifyAll方法"/>
        </module>

        <module name="BooleanExpressionComplexity">
            <property name="max" value="3"/>
        </module>

        <module name="SuppressWarnings">
            <property name="^unused$|^deprecation$|^static-access$|^serial$"/>
        </module>

        <module name="OverloadMethodsDeclarationOrder"/>

        <module name="InnerAssignment"/>
        <module name="NoFinalizer"/>
        <module name="ModifiedControclLariable"/>

        <module name="SingleSpaceSeparator">
            <property name="validateComments" value="true"/>
        </module>

        <module name="MultipleStringLiterals">
            <property name="allowedDuplicates" value="2"/>
            <property name="ignoreStringRegexp" value=""/>
        </module>

        <module name="EqualsVoidNull"/>
        <module name="CommentsIndentation"/>
        <module name="AbbreviationAdWordInName">
            <property name="allowedAbbreviationLength" value="0"/>
        </module>
    </module>
</module>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值