BI报表工具FineReport的使用2【帆软聚合报表设计,最常用功能】

本文详细介绍了如何使用FineReport设计决策报表,包括数据集参数、动态列、下拉框参数联动、SQL语句实现条件查询、动态表、动态条件、决策报表控件、报表函数、日期控件校验、超级链接、下拉复选框参数联动、动态显示参数控件等功能的实现,以及常见问题的解决方法,旨在帮助用户更好地理解和运用FineReport进行多维度数据分析。

文章目录

前言:

最近一直在做FineReport决策报表的工作,
目标是实现决策报表,并添加报表的互动功能
实现多功能多维度决策报表的查询
做完了发篇随手
本文介绍的是常用的一些功能和可能会遇到的一些坑,希望对大家有所帮助
在这里插入图片描述

参数应用

1 数据集参数

1.1 功能简介

定义数据集时,通过在 SQL 语句中添加 ${控件名}格式的内容,即可定义数据集参数,定义完成后,使用方法和模板参数一致。如下图所示,下拉框选择「华东」,点击查询,只查询出报表中华东地区的销售信息。
在这里插入图片描述

1.2 定义数据集参数

通过 的 格 式 定 义 参 数 , 其 中 变 量 p a r a 为 控 件 名 参 数 , 若 字 段 值 为 字 符 串 可 加 上 引 号 使 用 , 如 ′ { } 的格式定义参数,其中变量para为控件名参数,若字段值为字符串可加上引号使用,如 ' para使{para}’
注:定义了数据集参数,即从数据库中查询取数时,会根据参数值来查询对应的数据,也就是说在数据准备时就完成了数据过滤。
新建数据集 ds1,数据库查询对话框中写入 SQL 查询语句 SELECT * FROM 销量 WHERE 地区=’${area}’,相当于在数据库查询语句中定义一个数据集参数area。点击右下角「刷新」按钮,下方数据集参数管理面板会显示已经新建好的数据集参数area,设置它的默认值为华东。点击「确定」,即同时完成了数据准备和定义数据集参数的工作。如下图所示:
在这里插入图片描述

1.3 表格样式设计

1)如下图所示设置表格样式,其中给表格选择预定义样式 Head类型的样式,标题字体自动居中。
2)数据集中的字段可以拖入到对应单元格中,可以添加预定义样式默认的天蓝色内外框。如图1所示。
3)可以选中一列单元格,右边属性面板选择「单元格元素>基本」。数据设置下拉框选择汇总>求和。如图2所示
在这里插入图片描述
图1
在这里插入图片描述
图2

1.4 参数添加控件

1)点击参数面板的「编辑」按钮,进入参数面板设置界面。如下图所示:
在这里插入图片描述

2)右上角控件设置面板会显示没有添加控件的参数,可以通过拖动的方式将需要的控件拖入参数面板还可以点击 「area 」或者点击「全部添加」,将参数的默认控件添加到参数面板。如下图所示
在这里插入图片描述

3)点击自定义控件的「编辑」按钮,选择下拉框控件类型,让用户通过下拉框选择参数值
在这里插入图片描述

4)要想报表预览时点击「下拉框」可以出现参数值的选项,则需要设置下拉框的数据字典为销量表下的地区字段。数据字典的类型设置为数据库表,数据库为 FRDemo ,选择数据库表为销量,列名实际值和显示值都为地区。如下图所示:
在这里插入图片描述

5)点击「标签控件」,将控件值命名为地区:。如下图所示:
在这里插入图片描述

2 条件属性实现动态列

2.1 功能简介

动态列是指将列名作为参数,查询控件中键入列名点击查询后,报表中才显示该列,如下图所示:
在这里插入图片描述

2.2 准备数据

新建普通报表,创建数据查询 ds1,SQL 语句为:SELECT * FROM 销量 where 产品=‘牛奶’
在这里插入图片描述

2.3 设计表格

设计报表表格,将对应字段拖到单元格中,如下图所示:
在这里插入图片描述

2.4 添加控件

1)参数面板添加一个标签控件,一个下拉复选框控件,一个查询控件。如下图所示:
• 标签控件的控件值为字符串类型:列名:
• 下拉复选框控件的控件名称为:列名
在这里插入图片描述

2)下拉复选框的数据字典设置如下图所示:
在这里插入图片描述

2.5 添加条件属性

在表格中选中 A1 至 E1 单元格,添加列宽条件属性,设置当前值不包含于列名参数时,列宽为 0,如下图所示:
在这里插入图片描述

3 SQL语句实现下拉框参数联动

3.1 功能简介

当模板中有多个参数下拉框时,后面参数下拉框的选项需根据前面参数的值而改变。如下图中,省份选项需跟随地区所选值而相应变动,城市选项需跟随地区、省份所选值相应变动。
在这里插入图片描述

3.2 准备数据

新建普通报表,新建数据集 ds1 ,SQL 语句为:SELECT * FROM 订单 where 货主地区=’ a r e a ′ a n d 货 主 省 份 = ′ {area}' and 货主省份=' areaand={province}’ and 货主城市=’${city}’,如下图所示:
在这里插入图片描述

3.3 设计表格

设计表格格式,将对应字段拖入到对应单元格中,如下图所示:
在这里插入图片描述

3.4 添加参数控件

编辑参数面板,点击右侧「组件设置」上方的全部添加,生成参数控件,分别点击area、province、city参数框,选择下拉框控件,如下图所示:在这里插入图片描述

3.5 添加参数框选项数据集
3.5.1 地区选项

新建数据集地区选项,SQL 语句为:select distinct 货主地区 from 订单,由于地区是第一个参数,可以任意选择,因此不需要联动过滤,此处使用 distinct 关键字是为了去重,如下图所示:
在这里插入图片描述

3.5.2 省份选项

新建数据集省份选项,SQL 语句为:SELECT distinct 货主省份 FROM 订单 where 货主地区=’${area}’,因为省份需要根据地区值的不同显示相应的省份,所以需要设置地区过滤参数,如下图所示:
在这里插入图片描述

3.5.3 城市选项

新建数据集城市选项,SQL 语句为:SELECT distinct 货主城市 FROM 订单 where 货主地区=’ a r e a ′ a n d 货 主 省 份 = ′ {area}' and 货主省份=' areaand={province}’,因为城市需要根据地区值、省份值的不同显示相应的城市,所以需要设置地区、省份过滤参数。如下图所示:
在这里插入图片描述

3.6 设置参数控件的数据字典

1)选中地区下拉框控件,控件名称为area,设置数据字典为数据查询,选择对应的数据集地区选项,实际值和显示值相同为货主地区,如下图所示:
在这里插入图片描述

2)选中省份下拉框控件,控件名称为 province ,设置数据字典为数据查询,选择对应的数据集省份选项,实际值和显示值相同为货主省份,如下图所示:
在这里插入图片描述

3)选中城市下拉框控件,控件名称为 city,设置数据字典为数据查询,选择对应的数据集城市选项,实际值和显示值相同为货主城市,如下图所示:
在这里插入图片描述

动态表

1 动态数据表

1.1 功能简介

参数查询数据库任一表,报表中对数据库中的选择任意一个表名进行查询,能够查出该表对应的内容
在这里插入图片描述

1.2 数据准备

在 FineReport 设计器中,点击「文件>新建普通报表」,新建模板数据集 ds1 , SQL 语句为select * from t a b l e 。 如 下 图 所 示 : 注 : 表 名 不 属 于 字 符 串 类 型 , 所 以 在 这 里 的 控 件 参 数 不 能 以 ’ {table}。如下图所示: 注:表名不属于字符串类型,所以在这里的控件参数不能以’ table{table}’方式添加
在这里插入图片描述

1.3 模板设计

1)鼠标右键点击 A1 单元格,选择「单元格元素>插入公式」,公式为:TABLEDATAFIELDS(“ds1”)。如下图所示:
在这里插入图片描述

2)鼠标右键点击 A2 单元格,选择「单元格元素>插入公式」,公式为:ds1.select(A1) 。如下图所示:
在这里插入图片描述

3)选中 A1 单元格,在右侧属性面板「单元格属性>扩展>扩展方向」中选择「横向」,选中 A2 单元格,在右侧属性面板「单元格属性>扩展>扩展方向」中选择「纵向」。下图为 A1 单元格的设置步骤,其中 A2 单元格设置步骤与 A1 单元格相同。如下图所示:
在这里插入图片描述

1.4 参数面板

1)在参数面板中添加参数「table」,如下图所示:
在这里插入图片描述

2)控件选择「下拉框控件」,设置控件值为「sale」。数据字典的类型设置选择为「公式」,实际值的公式为:TABLES(“FRDemo”)。如下图所示:
在这里插入图片描述

2 动态条件

1.1 功能简介

动态条件用于对表中的数据进行过滤时,并且查询条件是不确定时使用。例如:有时想用 A 列进行过滤,有时想用 B 列进行过滤。
在定义数据集时,将条件定义为两个参数,一个是数据表字段名,一个是字段值。
在这里插入图片描述

1.2 数据准备

将数据集 ds1 修改为:SELECT * FROM 销量 where 1=1 ${if(len(name)==0||len(value)==0,"",“and “+name+”=’”+value+"’")} ,如下图所示:
在这里插入图片描述

注:1=1 表示默认查询出全部信息。
${if(len(name)==0||len(value)==0,"",“and “+name+”=’”+value+"’")} 表示定义两个参数 name和 value,分别表示字段名和值。
当参数框里都有值时,拼接上 and条件,即and name=‘value’;当参数框里没有值时,拼接上空字符串。
注:字段名框中输入的内容必须为数据表的字段名,否则报错!且两个框中都输入内容才可进行条件查询,否则查询全部信息。

决策报表设计

1 决策报表控件实现点击查询按钮后才能查询

1.1 功能简介

但有时候希望能做成和普通报表的参数面板一样,设置一个查询按钮,点击后查询按钮后才触发查询动作,如下图所示
在这里插入图片描述

1.2 报表设计

1)新建决策报表,body 组件采用绝对布局,如下图分别将标签控件、下拉复选框控件、按钮控件、报表块拖入设计主体中,调整好大小和布局。
在这里插入图片描述

2)选中下拉复选框控件,设置控件名称为a,定义好数据字典。
在这里插入图片描述

自定义数据字典如下图所示:
在这里插入图片描述

3)选中下拉复选框控件,添加一个编辑后事件,JS 代码如下:
return false;
在这里插入图片描述

4)选中按钮控件,重命名为查询,并给控件添加一个点击事件,JS 代码如下:
var a=_g().getWidgetByName(‘a’).getValue();
this.options.form.getWidgetByName(“report0”).gotoPage(1,"{a:’"+a+"’}",true);
在这里插入图片描述

5)报表块的 A1 单元格添加公式split($a,’,’)。
在这里插入图片描述

报表函数

1 函数作用(可实现默认值功能)

有时用户希望能直接在数据集中取出满足条件的行列数据,不必再将数据集字段拖拽到单元格后添加过滤条件取数,此时可以使用 value 函数。

1.1 value函数

有时用户希望能直接在数据集中取出满足条件的行列数据,不必再将数据集字段拖拽到单元格后添加过滤条件取数,此时可以使用 value 函数。
例如:
value(“ds1”,3,2) 取 ds1 数据集中第 3 列第 2 行的数据。
在这里插入图片描述

value(“ds1”,3) 将返回数据表中的第三列数据
注:由于返回的是数组,因此设置扩展属性为从上向下扩展。
在这里插入图片描述
value(“ds1”,3,4,“America”)返回数据表中第三列元素,且该列元素对应的第四列元素的值是 America 的所有数据
注:由于返回的是数组,因此设置扩展属性为从上向下扩展。
在这里插入图片描述

1.2 SQL函数
1.2.1 语法

数据集函数 能够从数据集中直接进行条件取数,但是有的时候用户希望某个单元格能够直接获取到数据库中的某个值,而不是先要定义一个数据集后,再去取数据。

语法SQL(connectionName,sql,columnIndex,rowIndex)返回的数据是从 connectionName 数据库中获取的 SQL 语句的表中的第 columnIndex 列第 rowIndex 行所对应的元素。
参数1connectionName数据连接名字,字符串形式,需要用引号如"FRDemo";
参数2sqlSQL 语句或者数据库存储过程,字符串形式,传参数、条件等可以在此拼接实现;
参数3columnIndex列序号,整型;
参数4rowIndex行序号,整型。
1.2.2 样例

数据库A第1列的第1行数据
sql(“数据集名称”,“select id,station_name from dim_station “,1,1)
如果sql中需要添加动态参数参数的添加方式如下
sql(“数据集名称”,“select id,name from table_a where line_id=’”+$线路+”’”,1,1)

JS实现日期控件校验

1.1 功能简介

参数查询时,可以对控件值做一些简单校验,如不能为空,当需要一些复杂校验时,设计器自带的校验规则就无法满足了。例如有两个参数:开始日期和结束日期,校验规则为:
1)开始日期与结束日期不能为空,结束日期必须在开始日期之后
2)结束日期必须在开始日期后的某个时间段内,否则给出提示
效果如下图所示:
在这里插入图片描述

1.2准备模板

将日期控件拖入参数模块中,并拖入查询控件。设置控件名
订购开始日期控件的控件名starttime
订购结束日期控件名endtime
在这里插入图片描述

1.3 添加事件

点击「查询按钮」,为其添加一个「点击」事件,如下图所示:
在这里插入图片描述

JavaScript 代码如下:
注:虽然参数控件中也可以设置校验,但是参数控件要点击控件后才能进行校验,因此参数界面的不能为空以及比较校验需要在查询按钮中设置。
var start = this.options.form.getWidgetByName(“starttime”).getValue();
var end = this.options.form.getWidgetByName(“endtime”).getValue();
if( start == “” || startnull){ //判断开始日期是否为空
alert(“错误,开始时间不能为空”); //开始日期参数为空时提示
return false;
};
if(end == “” || end
null){ //判断结束日期是否为空
alert(“错误,结束时间不能为空”); //结束日期参数为空时提示
return false;
};
if( start > end){ //判断开始日期是否大于结束日期
alert(“错误,开始时间不能大于结束时间”); //开始日期大于结束日期时提示
return false;
}
var startdate = new Date(start); //将开始日期转化为Date型
var enddate = new Date(end); //将结束日期转化成Date型
var subdate = (enddate-startdate)/ (1000 *60 *60 *24); //将两个日期相减得出的毫秒数转化为天数
if(subdate>15){ //判断结束日期是否超过开始日期后15天
alert(“错误,结束日期必须在开始日期15天之内”); //结束日期超过开始日期后的十五天时提示
return false;
}

超级链接-网络报表

1.1 功能简介

点击超级链接可以钻取到本工程下的其他报表,效果如下图所示:
在这里插入图片描述

1.2准备模板

示例将新建两张报表:「订单总览表」和「订单明细表」,点击「订单总览表」的订单ID可以链接到「订单明细表」,显示该订单ID的明细信息。

1.2.1 新建订单明细表

1)新建数据集 ds1 ,SQL 查询语句为:SELECT * FROM 订单明细 WHERE 订单ID=’${订单号}’
注:SQL 语句中有个参数「订单号」,这个会在超链传参时用到,实现点哪个订单ID就显示哪个订单ID对应的明细信息。
2)设计订单明细表的表格,将数据集中的字段拖到对应单元格中,如下图所示:
在这里插入图片描述

3)将报表保存到:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\HyplinkReport\路径下。
1.2.2 新建订单总览表
1)新建数据集 ds1 ,SQL 查询语句为:SELECT * FROM 订单
2)设计订单总览表的表格,将数据集中的字段拖到对应单元格中,如下图所示:
在这里插入图片描述

• C2 单元格需要将「单元格属性>样式>文本>格式」改为日期型「yyyy-MM-dd」。
• D2 单元格需要将「单元格属性>样式>文本>格式」改为数字「#0.00」。

1.3 添加超级链接

• 选中订单ID所在的 A2 单元格,右侧属性面板点击超级链接,新增一个网络报表类型的超级链接,具体配置如下:
• 网络报表:点击选择按钮,去订单明细表的目录下,把订单明细表的路径加进来。
• 链接打开于:这里选择对话框,点击超链后,订单明细表会以对话框形式打开。
• 新增一个参数订单号,其值为公式=$ , 参 数 名 要 跟 订 单 明 细 表 里 面 的 参 数 一 致 , ,参数名要跟订单明细表里面的参数一致, $ 表示参数的值就是当前单元格,这样点哪个订单ID就把这个 ID 传给订单明细表。

SQL语句实现下拉复选框参数联动

1.1 功能描述

前面章节介绍了 SQL 语句实现下拉框参数联动,当参数控件为下拉复选框时,如何实现同样的联动效果呢?如下图所示,省份选项会跟随地区所选值而相应变动,城市选项会跟随地区、省份所选值相应变动。
在这里插入图片描述

1.2 准备数据

新建普通报表,新建数据集 ds1 ,SQL 语句为:SELECT * FROM 订单 where 货主地区 in (’ a r e a ′ ) a n d 货 主 省 份 i n ( ′ {area}') and 货主省份 in (' area)andin({province}’) and 货主城市 in (’${city}’),由于参数控件为复选框,因此数据集中参数需用in语句,如下图所示:在这里插入图片描述

1.3 设计表格

设计表格样式,将对应的字段拖入到对应单元格中,如下图所示:
在这里插入图片描述

1.4 添加参数控件

编辑参数面板,点击右侧控件设置上方的全部添加,生成参数控件,分别点击 area、province、city 参数框,选择下拉复选框控件,如下图所示:
在这里插入图片描述

1.5 添加参数框选项数据集
1.5.1 地区选项

新建数据集地区选项,SQL 语句为:select distinct 货主地区 from 订单,因为地区是第一个参数,可以任意选择,所以不需要联动过滤,此处distinct 关键字是为了去重,如下图所示:
在这里插入图片描述

1.5.2 省份选项

新建数据集省份选项,SQL 语句为:SELECT distinct 货主省份 FROM 订单 where 货主地区 in (’${area}’),因为省份需要根据地区值的不同显示相应的省份,所以需要设置area作为过滤参数,如下图所示:
在这里插入图片描述

1.5.3 城市选项

新建数据集城市选项,SQL 语句为:SELECT distinct 货主城市 FROM 订单 where 货主地区 in (’ a r e a ′ ) a n d 货 主 省 份 i n ( ′ {area}') and 货主省份 in (' area)andin({province}’),因为城市需要根据地区值、省份值的不同显示相应的城市,所以需要设置 area、province 作为过滤参数,如下图所示:
在这里插入图片描述

1.6 设置参数控件的数据字典

1)选中地区下拉复选框控件,控件名称为 area,设置数据字典为数据查询,数据集为地区选项,实际值和显示值都为货主地区,设置返回值类型为字符串,分隔符为’,’(即输入法为英文半角状态时的单引号,中间加一个逗号,此处分隔符的设置是为了将所选的多个参数值分隔开,例:当地区选择 华北、华中 时,返回值为 华北’,'华中 )
注:地区、省份控件的控件名必须跟省份、城市数据集中的参数名保持一致才可以联动。
在这里插入图片描述

2)选中省份下拉复选框控件,控件名称为 province ,设置数据字典为数据查询,数据集为省份选项,实际值和显示值都为货主省份,设置返回值类型为字符串,分隔符为’,’(即输入法为英文半角状态时的单引号,中间加一个逗号,此处分隔符的设置是为了将所选的多个参数值分隔开,例:当地区选择 华北、华中 时,返回值为 华北’,'华中 )。
在这里插入图片描述

3)选中城市下拉复选框控件,控件名称为 city ,设置数据字典为数据查询,数据集为城市选项,实际值和显示值都为货主城市,设置返回值类型为字符串,分隔符为’,’(即输入法为英文半角状态时的单引号,中间加一个逗号,此处分隔符的设置是为了将所选的多个参数值分隔开,例:当地区选择 华北、华中 时,返回值为 华北’,'华中 )
在这里插入图片描述

动态显示参数控件

1.1 功能简介

由于业务的需要,很多情况下需要当满足某个条件时,某些查询条件才显示出来,如下图所示:
在这里插入图片描述

1.2 模板准备

1)在 FineReport 设计器中点击「文件>新建普通报表」,新建模板数据集 ds1,SQL 语句为:
SELECT * FROM 订单 where 1=1 ${if(type==“日报”," and date(订购日期)=’"+ date +"’",
if(type==“月报”," and strftime(’%m’,订单.订购日期)=’"+ month+"’"+" and strftime(’%Y’,订单.
订购日期)=’"+ year+"’"," and strftime(’%Y’,订单.订购日期)=’"+ year+"’"))}
2)表格设计如下图所示:
在这里插入图片描述

1.3 添加控件

进入参数面板,添加一个标签控件、三个下拉框控件、一个日期控件、一个查询控件,如下图所示:
在这里插入图片描述

1.4 控件设置
1.4.1 标签控件设置

选中「标签控件」,控件值为「报表类型:」,如下图所示:
在这里插入图片描述

1.4.2 下拉框控件设置

1)从左到右选中第一个下拉框控件,控件名称为「type」,数据字典类型设置为「自定义」,实际值和显示值相同,分别为日报,月报,年报。如下图所示:
在这里插入图片描述

2)从左到右选中第二个下拉框控件,控件名称为「year」,不勾选「可见」按钮,数据字典类型设置为「自定义」,实际值和显示值相同,分别为2010、2011。如下图所示:
在这里插入图片描述

3)从左到右选中第三个下拉框控件,控件名称为「month」,不勾选「可见」按钮,数据字典类型设置为「公式」,实际值用公式表示为:[“01”,“02”,“03”,“04”,“05”,“06”]。如下图所示:
在这里插入图片描述

1.4.3 日期控件设置

选中日期控件,控件名称为「date」,不勾选「可见」按钮,控件值为「2010/01/03」,如下图所示:
在这里插入图片描述

1.5 添加编辑后事件

选中控件名称为 type 的下拉框控件,为其添加编辑后事件。如下图所示:
在这里插入图片描述

JavaScript 代码如下所示:
var form = this.options.form;
var p2Widget = form.getWidgetByName(“date”);//在此可修改成要控制的控件名
var p3Widget = form.getWidgetByName(“year”);
var p4Widget = form.getWidgetByName(“month”);
var value = this.getValue(); //获取当前参数即type参数的值
//判断当前控件的值,根据判断结果显示或隐藏其他控件
if (value == “日报”) {
p2Widget.setVisible(true);
p3Widget.setVisible(false);
p4Widget.setVisible(false);
} else if (value == “月报”) {
p2Widget.setVisible(false);
p3Widget.setVisible(true);
p4Widget.setVisible(true);
} else if(value == “年报”){
p2Widget.setVisible(false);
p3Widget.setVisible(true);
p4Widget.setVisible(false);
}else {
p2Widget.setVisible(false);
p3Widget.setVisible(false);
p4Widget.setVisible(false);
}
注:此段代码判断 type 参数的值,若是日报,则只显示 date 控件,若是月报,则显示 year 和 month 控件,若是年报,则只显示 year 控件。

报表设计器内存修改

1.1 问题描述

用户工程没有部署到容器中,若遇到以下问题:
• 本地预览报错内存溢出 Java heap space 。
• gc overhead 。
• 想扩大帆软内存或修改本地设计器内存。
• 设计器用久了响应速度很慢,很卡。
可参考本文方法解决。
注:若工程部署在 Tomcat 容器中,若遇到以上问题,请参见:Tomcat修改内存

1.2 修改内存
1.2.1 Windows 系统

1)找到 FineReport 安装目录%FR_HOME%\bin\designer.vmoptions文件,如下图所示:
在这里插入图片描述

2)右键用记事本或者 sublime 文本工具打开,修改 Xmx 值。如下图所示:在这里插入图片描述

3)重启设计器。

1.3 效果查看

登录:http://localhost:8075/webroot/decision
管理员登录数据决策系统,选择「管理系统>智能运维>内存管理」,可以看到实时内存情况,如下图所示:

在这里插入图片描述

有收获?希望烙铁们来个三连击,让更多的同学看到这篇文章

1、烙铁们,关注我看完保证有所收获,不信你打我。

2、点个赞呗,可以让更多的人看到这篇文章,后续还会有很哇塞的产出。

本文章仅供学习及个人复习使用,如需转载请标明转载出处,如有错漏欢迎指出
务必注明来源(注明: 来源:csdn , 作者:-马什么梅-)
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马什么梅一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值