AnyPlugin

基于 AnyPlugin 实现对任意内容的 HTML 展示

为了基于 AnyPlugin 实现对任意内容的 HTML 展示,我们需要以下几个步骤

  1. 创建一个新的 .cc/.cpp/.cxx 文件(在你想要的位置);
  2. 定义 AnyPlugin 的派生类;
  3. 在派生类中实现两个 AnyPlugin 中的纯虚函数;
  4. 注册插件;
  5. 重新编译项目;
  6. 修改 json 文件;
  7. 运行项目,即可在浏览器中看到我们展示的内容。
  8. 进阶:以表格的形式展示 json 文件。

1. 创建一个新的 .cc/.cpp/.cxx 文件

在我们想的一个位置,新建一个 .cc/.cpp/.cxx 文件,用于编写我们的 HTML 展示插件。

在这个示例中,我们新建一个 HtmlShowExample.cc 文件。

加载我们会用到的头文件 #include "topling/side_plugin_factory.h"

2. 定义 AnyPlugin 的派生类

AnyPlugin 是一个纯抽象类,其中包括 Update 和 ToSring 两个函数需要派生类实现。

首先我们定义一个 AnyPlugin 的派生类 HtmlShowExample,并且实现其的两个纯虚函数如下:

1
2
3
4
5
6
7
8
9
10
#include "topling/side_plugin_factory.h"

namespace rocksdb {
class HtmlShowExample : public AnyPlugin {
public:
void Update(const json&, const SidePluginRepo&) {}
std::string ToString(const json& dump_options, const SidePluginRepo&) const {}
};

} // namespace rocksdb

注意

  • 在我们实现 HTML 展示时,不会用到 Update 函数,但是依然需要将其定义出,且为空。
  • 在 ToString 函数中,我们仅需要传入其第一个参数 dump_options,但我们可以不对这个参数做任何操作。

3. 在派生类中实现两个 AnyPlugin 中的纯虚函数

Update 函数在此处不会用到,定义为空,我们不再理会,下面说 ToString 函数。

ToString 函数的返回值是 std::string 类型,其返回的 string 字符串,会被无差别地打印在浏览器中。

我们修改上面的 ToString 函数如下:

1
2
3
std::string ToString(const json& dump_options, const SidePluginRepo&) const {
return "This is an example of HTML show.";
}

这样,我们就实现了一个简单的 HTML 展示插件。

4. 注册插件

HtmlShowExample.cc 文件的末尾,topling 的 namespace 内,输入下面的代码:

1
2
ROCKSDB_REG_DEFAULT_CONS(HtmlShowExample, AnyPlugin);
ROCKSDB_REG_AnyPluginManip("HtmlShowExample");
  • ROCKSDB_REG_DEFAULT_CONS(param1, param2, param3): 此宏适用于没有用到 (const json&, const SidePluginRepo&) 构造参数的派生类。
    • param1: 即将在 json 中写入的插件注册名字,string 类型,需要加双引号。
    • param2: 即将在 json 中写入的插件注册类名。
    • param3: 填入父类,这里是 AnyPlugin。
    • 注:如果 param1param2 的值是相同的,则可以省略 param1,如上代码所示。
  • ROCKSDB_REG_AnyPluginManip(param1): 用于注册派生于 AnyPlugin 类的插件。
    • 参数为即将在 json 中写入的插件注册名字,即与 ROCKSDB_REG_DEFAULT_CONSparam1 相同。

5. 重新编译项目

首先,我们需要把我们自定义的 HtmlShowExample.cc 添加到编译文件中,可能是 CmakeLists.txt,可能是 Makefile,也可能是一个编译脚本,这取决于你的项目的编译方法。然后,重新编译项目。

6. 修改 json 文件

找到我们的 [[Home]],添加字段

1
2
3
"AnyPlugin": {
"html-show-example": "HtmlShowExample"
},
  • AnyPlugin: 我们插件继承的抽象类名。
    • html-show-example: 我们插件对象的变量名。
    • HtmlShowExample: 在 json 中写入的插件注册名字,与上述 ROCKSDB_REG_DEFAULT_CONSparam1 相同。

7. 运行项目

运行编译后的项目,在浏览器中输入

192.168.31.2:8088/AnyPlugin/html-show-example

即可看到浏览器打印出了我们代码中 ToString 函数返回的值 “This is an example of HTML show.”。

  • 192.168.31.2:8088: 我们数据库的地址与监听端口,监听端口号在 json 配置文件的 http 字段中的 listening_ports 字段中设定。
  • AnyPlugin: 我们使用的抽象类。
  • html-show-example: 我们插件对象的变量名。

8. 进阶:以表格的形式展示 json 文件

直接展示 string 文件的可读性是很差的,我们可以把需要展示的配置项,存到一个 json 对象中,并通过 JsonToString 函数,将 json 对象中的内容,以表格的形式打印到浏览器中。

修改我们之前的 ToString 函数代码,其他部分保持不变。

1
2
3
4
5
6
std::string ToString(const json& dump_options, const SidePluginRepo&) const {
json js;
js["key1"] = "This is an example of HTML show 1.";
js["key2"] = 2;
return JsonToString(js, dump_options);
}

运行编译后的项目,在浏览器中输入

192.168.31.2:8088/AnyPlugin/html-show-example?html=1

  • html=1:url 参数,表示将展示内容以表格的形式打印。

关于更多 url 参数信息、HTML 展示信息,查看文档 [[WebView]]。

现在,我们可以在浏览器中看到,我们以表格形式输出的内容了。