爱招飞帮助手册 爱招飞帮助手册
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
  • Smart帮助主页
  • 学习手册

  • 开发手册

    • 通讯协议

    • 交互输出

      • 打印

        • 报表设计
        • Flying网络打印
          • 1. 说明
          • 2. 设计明细
            • 2.1. Main窗体
            • 2.2. Form1窗体
          • 3. 程序设计
            • 3.1. 程序初始设置
            • 3.2. 事件设置
          • 4. 运行结果
      • 条码

      • 图表

      • 窗体

      • 手写板

    • 媒体存取

    • 人工智慧

    • 实例运用

目录

Flying网络打印

# Smart之Flying网络打印

# 1. 说明

  范例采用HTTP与MQTT通讯协议,连接打印服务器进行打印操作。需配合爱招飞旗下的Flying(飞印,局域网数据报表打印工具)使用。

  程序中包含了TARS的连接。需访问数据库。范例在demo数据库中新建一张表名为Basic_Unit,其表结构如下图所示,可通过下面的脚本新建该表并向其中插入数据。在demo 数据库中提供了相关表。

--创建表Basic_Unit
CREATE TABLE [dbo].[Basic_Unit](
	[FInterID] [int] NOT NULL,
	[FUnitCode] [nvarchar](50) NULL,
	[FUnitName] [nvarchar](100) NULL,
	[FCoefficient] [decimal](18, 10) NULL,
	[FNote] [varchar](255) NULL,
 CONSTRAINT [PK_Basic_MeasureUnit] PRIMARY KEY CLUSTERED 
(
	[FInterID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--插入示例数据
INSERT INTO [dbo].[Basic_Unit]
           ([FInterID],[FUnitCode],[FUnitName],[FCoefficient],[FNote])
     VALUES(2,'M','米',1,NULL)
INSERT INTO [dbo].[Basic_Unit]
           ([FInterID],[FUnitCode],[FUnitName],[FCoefficient],[FNote])
     VALUES(3,'KG','千克',1,NULL)
INSERT INTO [dbo].[Basic_Unit]
           ([FInterID],[FUnitCode],[FUnitName],[FCoefficient],[FNote])
     VALUES(4,'G','克',0.001,NULL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

  通过Smart智慧控制平台菜单[工具]->[数据库设置],设置好要连接的TARS中间件之数据库,在使用过程中须保证TARS处于运行状态并开放服务,TARS帐套配置请参阅TARS使用手册。

  通过本范例学习,可以掌握HTTP、MQTT的基本通讯原理,并通过该协议进行打印操作的功能。

# 2. 设计明细

  开启Smart智慧控制平台,分别加入下插图之控件。或者通过点击菜单栏[文件]-[打开项目]选择范例项目文件来打开该范例。

# 2.1. Main窗体

Flying网络打印UI布局

  1:TImage组件,控件名称为Image1。

  2:TLabel组件,控件名称为Label9。

  3:TImage组件,控件名称为Image2。

  4:TRFDataSet组件,控件名称为RFDataSet1。

  5:TFlying组件,控件名称为Flying1。

  6:TLabel组件,控件名称为Label2。

  7:TLabel组件,控件名称为Label1。

  8:TEdit组件,控件名称为edtIPAddress。

  9:TEdit组件,控件名称为edtPort。

  10:TComboBox组件,控件名称为ComboBoxPrintType。

  11:TLabel组件,控件名称为Label7。

  12:TLabel组件,控件名称为Label3。

  13:TLabel组件,控件名称为Label10。

  14:TLabel组件,控件名称为Label6。

  15:TLabel组件,控件名称为Label8。

  16:TLabel组件,控件名称为Label4。

  17:TLabel组件,控件名称为Label5。

  18:TImage组件,控件名称为ImageSearch。

  19:TComboBox组件,控件名称为ComboBoxPrinter。

  20:TComboBox组件,控件名称为ComboBoxType。

  21:TEdit组件,控件名称为edtPrintNum。

  22:TSwitchButton组件,控件名称为SwitchButton1。

  23:TTimer组件,控件名称为Timer1。

  • Main窗体属性设置

    • BorderStyle:设置边界样式=bsDialog。
    • Caption:设置窗体显示的标题=Flying网络打印。
    • ClientHeight:设置客户区窗体的高度=480。
    • ClientWidth:设置窗体客户区的宽度=720。
  • ①Image1属性设置

    • Align:设置控件对齐方式=alClient。
    • Stretch:设置图片拉伸适应于控件。
    • Picture:设置图片。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ②Label9属性设置

    • Caption:设置显示的标签字体=Flying网络打印。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • ③Image2属性

    • Align:设置控件对齐方式=alClient。
    • Stretch:设置图片拉伸适应于控件。
    • Picture:设置图片。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ⑤Flying1属性设置

    • HTTPOptions:HTTP模式下的相关设置
      • Host:HTTP模式下打印服务器的地址。
      • Port:HTTP模式下打印服务器的端口号。
    • MQTTOptions:MQTT模式下的相关设置。
      • BrokerHost:MQTT服务端的地址。
      • BrokerPort:MQTT服务端的端口号。
      • PrintPwd:MQTT打印的订阅验证码。
      • PrintTopic:MQTT打印的订阅主题。
    • PrintOptions:打印相关的设置项。
      • PrintCopies:打印的份数。
      • PrintType:设置打印类型=HTTP。
      • ReportName:设置打印报表的模板名称。
      • Preview:设置打印预览=True。
    • WebSocketOptions:WebSocket 模式的相关设置
      • Host:WebSocket 模式下打印服务器的地址。
      • Port:WebSocket 模式下打印服务器的端口号。
      • URL:设定 WebSocket 服务的监听地址。
  • ⑥Label2属性设置

    • Caption:设置显示的标签字体=服务器地址。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • ⑦Label1属性设置

    • Caption:设置显示的标签字体=连接选项。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • ⑧edtIPAddress属性设置

    • Name:控件名称=edtIPAddress。
    • Text:设置文本框中的内容,此处填写地址,例如=192.168.0.109。
    • Font:设置字体,点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • ⑨edtPort属性设置

    • Name:控件名称=edtPort。
    • NumbersOnly:设置是否只允许输入数字=True。
    • Text:设置编辑的文本,此处为端口号。如8801。
    • Font:设置字体,点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • ⑩ComboBoxPrintType属性设置

    • Name:设置控件名称=ComboBoxPrintType。
    • Text:设置显示的文本,如HTTP。
    • Items:设置选项。双击该属性或者点击属性右侧的[...]打开编辑器。
    • ItemIndex:设置默认选择的选项=0。
    • Font:设置字体,点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (11)Label7属性设置

    • Caption:设置显示的标签字体=打印选项。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (12)Label3属性设置

    • Caption:设置显示的标签字体=端口号。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (13)Label10属性设置

    • Caption:设置显示的标签字体=连接类型。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (14)Label6属性设置

    • Caption:设置显示的标签字体=打印机。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (15)Label8属性设置

    • Caption:设置显示的标签字体=文件类型。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (16)Label4属性设置

    • Caption:设置显示的标签字体=打印份数。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (17)Label5属性设置

    • Caption:设置显示的标签字体=启用预览。
    • Font:设置标签字体。点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (18)ImageSearch属性设置

    • Height:设置控件高度=31。
    • Width:设置控件宽度=31。
    • Stretch:设置图片拉伸=True。
    • Picture:设置图片。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • (19)ComboBoxPrinter属性设置

    • Name:设置控件名称=ComboBoxPrinter。
    • ItemIndex:设置默认选择的选项=0。
    • Font:设置字体,点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (20)ComboBoxType属性设置

    • Name:设置控件名称=ComboBoxType。
    • Text:设置显示的文本,例如pdf。
    • ItemIndex:设置默认选择的选项=0。
    • Items:设置选项,双击该属性或者点击属性右侧[...]来打开编辑器。
    • Font:设置字体,点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (21)edtPrintNum属性设置

    • Name:控件名称=edtPrintNum。
    • NumbersOnly:设置是否只允许输入数字=True。
    • Text:设置显示的文本,此处设置为打印的份数1。
    • Font:设置字体,点击该属性右侧[...]按钮或者双击该属性打开字体设置界面,设置内容如下。
  • (22)SwitchButton1属性设置

    • Height:设置控件高度=38。
    • Width:设置控件宽度=40。
    • Stretch:设置图像拉伸=True。
    • SwitchOff:显示关闭状态时的图像,双击该属性或者点击右侧[...]打开图像编辑器。点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
    • SwitchOn:显示关闭状态时的图像,双击该属性或者点击右侧[...]打开图像编辑器。点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。

# 2.2. Form1窗体

  ①:TChrome组件,控件名称为Chrome1。

  • Form1窗体属性设置

    • BorderStyle:设置边框类型为bsDialog。
    • Caption:设置窗体标题字幕=预览。
    • FormStyle:设置窗体风格=fsStayOnTop。
  • ①Chrome1属性设置

    • Align:设置控件对齐方式=alClient。

# 3. 程序设计

# 3.1. 程序初始设置

  在程序启动时,为Flying控件提供初始值。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  FThis.Flying1.HTTPOptions.Host := FThis.edtIPAddress.Text;
  FThis.Flying1.HTTPOptions.Port := StrToInt(FThis.edtPort.Text);
  FThis.Flying1.WebSocketOptions.Host := FThis.edtIPAddress.Text;
  FThis.Flying1.WebSocketOptions.Port := StrToInt(FThis.edtPort.Text);
  FThis.Flying1.MQTTOptions.BrokerHost := FThis.edtIPAddress.Text;
  FThis.Flying1.PrintOptions.PrintCopies := StrToInt(FThis.edtPrinTNum.Text);
  FThis.Flying1.PrintOptions.Preview := FThis.SwitchButton1.IsChecked;
  FThis.RFDataSet1.Connection := dm.DBConnection;
  //导出文件类型选择
  case FThis.ComboBoxType.ItemIndex of
    1: FThis.Flying1.PrintOptions.ExportFileType := csv;
    2: FThis.Flying1.PrintOptions.ExportFileType := html;
    3: FThis.Flying1.PrintOptions.ExportFileType := jpg;
    4: FThis.Flying1.PrintOptions.ExportFileType := rtf;
    5: FThis.Flying1.PrintOptions.ExportFileType := txt;
    6: FThis.Flying1.PrintOptions.ExportFileType := xls;
  else
    FThis.Flying1.PrintOptions.ExportFileType := pdf;
  end;
  //连接类型选择
  case FThis.ComboBoxPrintType.ItemIndex of
    1: 
    begin
      FThis.Flying1.PrintOptions.PrintType := MQTT;
      FThis.Flying1.MQTTOptions.Enabled := True;
      FThis.Flying1.WebSocketOptions.Enabled := False;
    end;
    2:
    begin
      FThis.Flying1.PrintOptions.PrintType := WebSocket;
      FThis.Flying1.MQTTOptions.Enabled := False;
      FThis.Flying1.WebSocketOptions.Enabled := True;    
    end;
  else
    FThis.Flying1.PrintOptions.PrintType := HTTP;
      FThis.Flying1.MQTTOptions.Enabled := False;
      FThis.Flying1.WebSocketOptions.Enabled := False;  
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

# 3.2. 事件设置

  • (18)ImageSearch-OnClick事件

  点击搜索按钮,执行获取打印机列表的子程序。

procedure TMyHandler.ImageSearchClick;
//搜索打印机
begin
  FThis.Flying1.GetPrinterList;
end;
1
2
3
4
5
  • ⑧edtIPAddress-OnChange事件

  当IP地址的编辑框内容发生变化时,将取值传递给Flying1。

procedure TMyHandler.edtIPAddressChange;
//修改打印服务器地址
begin
  FThis.Flying1.HTTPOptions.Host := FThis.edtIPAddress.Text;
  FThis.Flying1.MQTTOptions.BrokerHost := FThis.edtIPAddress.Text;
  FThis.Flying1.WebSocketOptions.Host := FThis.edtIPAddress.Text;
end;
1
2
3
4
5
6
7
  • ⑨edtPort-OnChange事件

  当端口的编辑框内容发生变化时,将取值传递给Flying1。

procedure TMyHandler.edtPortChange;
//修改端口号
begin
  FThis.Flying1.HTTPOptions.Port := StrToInt(FThis.edtPort.Text);
  FThis.Flying1.WebSocketOptions.Port := StrToInt(FThis.edtPort.Text);
  FThis.Flying1.MQTTOptions.BrokerPort := StrToInt(FThis.edtPort.Text);
end;
1
2
3
4
5
6
7
  • (21)edtPrintNum-OnChange事件

  当修改打印份数时,将取值传递给Flying1。

procedure TMyHandler.edtPrintNumChange;
//修改打印份数
begin
  FThis.Flying1.PrintOptions.PrintCopies := StrToInt(FThis.edtPrinTNum.Text);
end;
1
2
3
4
5
  • (20)ComboBoxType-OnChange事件

  修改文件输出的类型,将取值传递给Flying1。

procedure TMyHandler.ComboBoxTypeChange;
//修改文件输出类型
begin
  case FThis.ComboBoxType.ItemIndex of
    1: FThis.Flying1.PrintOptions.ExportFileType := csv;
    2: FThis.Flying1.PrintOptions.ExportFileType := html;
    3: FThis.Flying1.PrintOptions.ExportFileType := jpg;
    5: FThis.Flying1.PrintOptions.ExportFileType := rtf;
    6: FThis.Flying1.PrintOptions.ExportFileType := txt;
    7: FThis.Flying1.PrintOptions.ExportFileType := xls;
  else
    FThis.Flying1.PrintOptions.ExportFileType := pdf;
  end;   
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • ⑩ComboBoxPrintType-OnChange事件

  修改连接类型,将获取到的数值传递给Flying1。

procedure TMyHandler.ComboBoxPrintTypeChange;
  //连接类型选择
begin
  case FThis.ComboBoxPrintType.ItemIndex of
    1:
    begin    
      FThis.Flying1.PrintOptions.PrintType := MQTT;
      FThis.edtPort.Text := IntToStr(FThis.Flying1.MQTTOptions.BrokerPort);
      FThis.Label3.Caption := FThis.siLang1.GetTextW('MQTT');
      FThis.Flying1.MQTTOptions.Enabled := True;
      FThis.Flying1.WebSocketOptions.Enabled := False;
    end;
    2:
    begin
      FThis.Flying1.PrintOptions.PrintType := WebSocket;
      FThis.edtPort.Text := IntToStr(FThis.Flying1.WebSocketOptions.Port);
      FThis.Label3.Caption := FThis.siLang1.GetTextW('port');
      FThis.Flying1.MQTTOptions.Enabled := False;
      FThis.Flying1.WebSocketOptions.Enabled := True;
    end;
  else
    begin
      FThis.Flying1.PrintOptions.PrintType := HTTP;
      FThis.edtPort.Text := IntToStr(FThis.Flying1.HTTPOptions.Port);
      FThis.Label3.Caption := FThis.siLang1.GetTextW('port');
      FThis.Flying1.MQTTOptions.Enabled := False;
      FThis.Flying1.WebSocketOptions.Enabled := False;
    end;
    end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  • ③Image2-OnClick事件

  点击打印机图标,将数据传递给打印机进行打印操作。如果启用了打印预览则显示打印预览界面。MQTT打印由于不能及时获取URL,故需要通过延时定时器来获取。

procedure TMyHandler.Image2Click;
//点击以进行打印操作
var
  v:string;
  vStream:TStream;
  F: TBaseForm;
Begin
  if demo then exit;
  if FThis.ComboBoxPrinter.Items.Text = '' Then exit;
  FThis.Flying1.PrintOptions.PrinterName := FThis.ComboBoxPrinter.Items.Strings[FThis.ComboBoxPrinter.ItemIndex];
  FThis.RFDataSet1.SQL.Text := 'SELECT * FROM Basic_Unit';
  FThis.RFDataSet1.Open;
  FThis.Flying1.PrintOptions.Data.Clear;
  FThis.Flying1.AddPrintData(FThis.RFDataSet1,'A');
  FThis.Flying1.ReportPrint;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • ⑤Flying1-OnReceivedPrinter事件

  当Flying返回打印机列表时,将打印机列表显示在下拉列表中。

procedure TMyHandler.Flying1ReceivedPrinter;
//获取打印机列表
begin
  FThis.ComboBoxPrinter.Items.CommaText := APrinterList;
  if FThis.ComboBoxPrinter.Items.Count <> 0  Then
  FThis.ComboBoxPrinter.ItemIndex := 0;
  FThis.ComboBoxPrinter.DroppedDown := True;
end;
1
2
3
4
5
6
7
8
  • ⑤Flying1-OnReceivedExport事件

  当 Flying 返回输出的打印格式时,返回URL并显示。

procedure TMyHandler.Flying1ReceivedExport;
//输出
var
  F: TBaseForm;
begin
  if FThis.SwitchButton1.IsChecked then
  begin
    F := paxfunc.OpenForm('Form1');
    F.TagObject := FThis;
    TChrome(F.FindComponent('Chrome1')).Active := True;
    TChrome(F.FindComponent('Chrome1')).Uri := AUrl;
  end; 
end;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 4. 运行结果

  通过工具栏保存,将程序保存为 sdb 项目文件。

  使用鼠标点击工具栏运行(Run),测试运行结果。

  在本机运行Flying以及本范例,输入服务器地址,端口号,选择连接类型,然后点击搜索图标,在打印机栏位显示当前可用的打印机,选择完成后修改文件类型以及打印份数,可根据需要选择是否开启与预览。然后点击打印按钮即可。

报表设计
二维码生成与扫描

← 报表设计 二维码生成与扫描→

Copyright © 2021-2025 爱招飞IsoFace | ALL Rights Reserved
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式