【Hbase】【04】通过rest操作hbase集群

1.官方文档

http://hbase.apache.org/book.html#_rest

2.启动hbase rest

随附的REST服务器可以作为守护程序运行,该守护程序启动嵌入式Jetty servlet容器并将servlet部署到其中。使用以下命令之一在前台或后台启动REST服务器。端口是可选的,默认为8080。

# Foreground 
$ bin/hbase rest start -p <port> 
 
# Background, logging to a file in $HBASE_LOGS_DIR 
$ bin/hbase-daemon.sh start rest -p <port>
要停止REST服务器,如果在前台运行,请使用Ctrl-C;如果在后台运行,请使用以下命令。

$ bin/hbase-daemon.sh stop rest

3.hbase rest支持的接口

以下示例使用占位符服务器http://example.com:8000,并且以下命令都可以使用curl或wget命令运行。您可以通过不为纯文本添加标题或为XML添加标题“ Accept:text / xml”,为JSON添加“ Accept:application / json”或“ Accept:”来请求纯文本(默认),XML或JSON输出。 application / x-protobuf”以用于协议缓冲区。

除非另有说明,使用GET的查询请求,PUT或POST创造或突变的请求,并DELETE删除。

3.1cluster接口

在此群集上运行的HBase版本

/version/cluster

GET

Version of HBase running on this cluster

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/version/cluster"

集群状态

/status/cluster
GET

Cluster status

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/status/cluster"
/

所有非系统表的列表

GET

List of all non-system tables

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/"

3.2Namespace接口

列出所有名称空间

/namespaces

GET

List all namespaces

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/namespaces/"

描述特定的名称空间

/namespaces/namespace
GET

Describe a specific namespace

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/namespaces/special_ns"

创建一个新的名称空间

/namespaces/namespace
POST

Create a new namespace

curl -vi -X POST \
  -H "Accept: text/xml" \
  "example.com:8000/namespaces/special_ns"

列出特定名称空间中的所有表

/namespaces/namespace/tables

GET

List all tables in a specific namespace

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/namespaces/special_ns/tables"

更改现有的名称空间。目前未使用。

/namespaces/namespace
PUT

Alter an existing namespace. Currently not used.

curl -vi -X PUT \
  -H "Accept: text/xml" \
  "http://example.com:8000/namespaces/special_ns

删除名称空间。名称空间必须为空。

/namespaces/namespace
DELETE

Delete a namespace. The namespace must be empty.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  "example.com:8000/namespaces/special_ns"

3.3表接口

描述指定表的架构。

/table/schema

GET

Describe the schema of the specified table.

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/schema"

使用提供的架构片段更新现有表

/table/schema

POST

Update an existing table with the provided schema fragment

curl -vi -X POST \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '&lt;?xml version="1.0" encoding="UTF-8"?>&lt;TableSchema name="users">&lt;ColumnSchema name="cf" KEEP_DELETED_CELLS="true" />&lt;/TableSchema>' \
  "http://example.com:8000/users/schema"

创建一个新表,或替换现有表的架构

/table/schema

PUT

Create a new table, or replace an existing table’s schema

curl -vi -X PUT \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '&lt;?xml version="1.0" encoding="UTF-8"?>&lt;TableSchema name="users">&lt;ColumnSchema name="cf" />&lt;/TableSchema>' \
  "http://example.com:8000/users/schema"

删除表。您必须使用端点,而不仅仅是。/table/schema/table/

/table/schema

DELETE

Delete the table. You must use the /table/schema endpoint, not just /table/.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/schema"

列出表格区域

/table/regions

GET

List the table regions

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/regions

3.4表的get接口

获取单行的所有列。值是Base-64编码的。这要求“ Accept”请求标头的类型可以容纳多个列(例如xml,json或protobuf)。

/table/row

GET

Get all columns of a single row. Values are Base-64 encoded. This requires the "Accept" request header with a type that can hold multiple columns (like xml, json or protobuf).

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/row1"

获取单个列的值。值是Base-64编码的。

/table/row/column:qualifier/timestamp
GET

Get the value of a single column. Values are Base-64 encoded.

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/row1/cf:a/1458586888395"

获取单个列的值。值是Base-64编码的。

/table/row/column:qualifier

GET

Get the value of a single column. Values are Base-64 encoded.

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/row1/cf:a"

curl -vi -X GET \
  -H "Accept: text/xml" \
   "http://example.com:8000/users/row1/cf:a/"

多获取给定单元格的指定数量的版本。值是Base-64编码的。

/table/row/column:qualifier/?v=number_of_versions

GET

Multi-Get a specified number of versions of a given cell. Values are Base-64 encoded.

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/row1/cf:a?v=2"

3.5表的Scan接口

获取扫描仪对象。所有其他扫描操作都需要。将批处理参数调整为扫描应在批处理中返回的行数。请参阅下一个为过滤器添加过滤器的示例。扫描程序端点URL作为Location HTTP响应中的返回。该表中的其他示例假定扫描程序端点为http://example.com:8000/users/scanner/145869072824375522207。

/table/scanner/

PUT

Get a Scanner object. Required by all other Scan operations. Adjust the batch parameter to the number of rows the scan should return in a batch. See the next example for adding filters to your scanner. The scanner endpoint URL is returned as the Location in the HTTP response. The other examples in this table assume that the scanner endpoint is http://example.com:8000/users/scanner/145869072824375522207.

curl -vi -X PUT \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<Scanner batch="1"/>' \
  "http://example.com:8000/users/scanner/"

要为“扫描程序”对象提供过滤器或以其他任何方式配置“扫描程序”,您可以创建一个文本文件并将过滤器添加到该文件。例如,要仅返回键以 u123 </ codeph>开头并且使用批处理大小为100的行,则过滤文件如下所示:

[source,xml] ---- <Scanner batch =“ 100”> {“ type”:“ PrefixFilter”,“ value”:“ u123”} </ filter> </ Scanner> ----

将文件传递给请求的-d参数curl。

/table/scanner/

PUT

To supply filters to the Scanner object or configure the Scanner in any other way, you can create a text file and add your filter to the file. For example, to return only rows for which keys start with <codeph>u123</codeph> and use a batch size of 100, the filter file would look like this:

[source,xml] ---- <Scanner batch="100"> <filter> { "type": "PrefixFilter", "value": "u123" } </filter> </Scanner> ----

Pass the file to the -d argument of the curl request.

curl -vi -X PUT \
  -H "Accept: text/xml" \
  -H "Content-Type:text/xml" \
  -d @filter.txt \
  "http://example.com:8000/users/scanner/"

从扫描仪获取下一批。单元格值是字节编码的。如果扫描仪已耗尽,204则返回HTTP状态。

/table/scanner/scanner-id

GET

Get the next batch from the scanner. Cell values are byte-encoded. If the scanner has been exhausted, HTTP status 204 is returned.

curl -vi -X GET \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/scanner/145869072824375522207"

删除扫描仪并释放其使用的资源。

table/scanner/scanner-id

DELETE

Deletes the scanner and frees the resources it used.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  "http://example.com:8000/users/scanner/145869072824375522207"

3.6表的Put操作接口

在表中写一行。行,列限定符和值都必须使用Base-64编码。要编码字符串,请使用base64命令行实用程序。要解码字符串,请使用base64 -d。有效负载在–data参数中,/users/fakerow 值是一个占位符。通过将多行添加到 元素中来插入它们。您还可以将要插入的数据保存到文件中,然后-d 使用类似的语法将其传递给参数-d @filename.txt。

/table/row_key

PUT

Write a row to a table. The row, column qualifier, and value must each be Base-64 encoded. To encode a string, use the base64 command-line utility. To decode the string, use base64 -d. The payload is in the --data argument, and the /users/fakerow value is a placeholder. Insert multiple rows by adding them to the <CellSet> element. You can also save the data to be inserted to a file and pass it to the -d parameter with syntax like -d @filename.txt.

curl -vi -X PUT \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><CellSet><Row key="cm93NQo="><Cell column="Y2Y6ZQo=">dmFsdWU1Cg==</Cell></Row></CellSet>' \
  "http://example.com:8000/users/fakerow"

curl -vi -X PUT \
  -H "Accept: text/json" \
  -H "Content-Type: text/json" \
  -d '{"Row":[{"key":"cm93NQo=", "Cell": [{"column":"Y2Y6ZQo=", "$":"dmFsdWU1Cg=="}]}]}'' \
  "example.com:8000/users/fakerow"

3.7表的Check-And-Put 接口

有条件放置-更改单元格的当前版本值:将单元格的当前或最新版本值(current-version-value)与进行比较check-value,如果current-version-value== check-value,则将新数据(the new-value)作为当前或最新版本写入单元格中。行,列限定符和值都必须使用Base-64编码。要编码字符串,请使用base64命令行实用程序。要解码字符串,请使用base64 -d。有效负载位于–data或-d参数中,且the check cell name (column family:column name) and value始终位于the new Put cell name (column family:column name) and value同一行键的末尾。您还可以将要插入的数据保存到文件中,然后-d使用类似的语法将其传递给参数-d @filename.txt。

/table/row_key/?check=put

PUT

Conditional Put - Change the current version value of a cell: Compare the current or latest version value (current-version-value) of a cell with the check-value, and if current-version-value == check-value, write new data (the new-value) into the cell as the current or latest version. The row, column qualifier, and value must each be Base-64 encoded. To encode a string, use the base64 command-line utility. To decode the string, use base64 -d. The payload is in the --data or -d argument, with the check cell name (column family:column name) and value always at the end and right after the new Put cell name (column family:column name) and value of the same row key. You can also save the data to be inserted to a file and pass it to the -d parameter with syntax like -d @filename.txt.

curl -vi -X PUT \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><CellSet><Row key="cm93MQ=="><Cell column="Y2ZhOmFsaWFz">T2xkR3V5</Cell><Cell column="Y2ZhOmFsaWFz">TmV3R3V5</Cell></Row></CellSet>' \
  "http://example.com:8000/users/row1/?check=put"

curl -vi -X PUT \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"Row":[{"key":"cm93MQ==","Cell":[{"column":"Y2ZhOmFsaWFz","$":"T2xkR3V5"},{"column":"Y2ZhOmFsaWFz", "$":"TmV3R3V5"}] }]}' \
  "http://example.com:8000/users/row1/?check=put"
详细说明:

在上面的json格式示例中:

{"column":"Y2ZhOmFsaWFz", "$":"TmV3R3V5"}在-d选项末尾the check cell name and check cell value in Base-64分别是:"Y2ZhOmFsaWFz" for "cfa:alias"和"TmV3R3V5" for "NewGuy"

{"column":"Y2ZhOmFsaWFz","$":"T2xkR3V5"}是the new Put cell name and cell value in Base-64分别为:"Y2ZhOmFsaWFz" for "cfa:alias",和"T2xkR3V5" for "OldGuy"

"cm93MQ=="是the Base-64 for "row1"的checkAndPutrow key

"/?check=put"之后"row key" in the request URL,checkAndPut WebHBase操作才能正常运行

的"row key" in the request URL应该是URL编码,例如,"david%20chen"和"row1"是行键的URL编码格式"david chen"和"row1",分别

注意:“ cfa”是列族名称,“ alias”是非Base64编码单元名称的列(限定符)名称。
基本上,xml格式的示例与json格式的示例相同,在此不再详细说明。

3.8表的Check-And-Delete操作接口

有条件地删除行:将任何版本的单元格(any-version-value)的值与进行比较check-value,如果any-version-value== check-value,则删除row_key请求URL内部指定的行。行,列限定符和用于检查有效负载的值必须分别被Base-64编码。要编码字符串,请使用base64命令行实用程序。要解码字符串,请使用base64 -d。有效负载位于–data参数中。您还可以将要检查的数据保存到文件中,然后-d使用语法将其传递给参数-d @filename.txt。

/table/row_key/?check=delete

DELETE

Conditional Deleting a Row: Compare the value of any version of a cell (any-version-value) with the check-value, and if any-version-value == check-value, delete the row specified by the row_key inside the requesting URL.The row, column qualifier, and value for checking in the payload must each be Base-64 encoded. To encode a string, use the base64 command-line utility. To decode the string, use base64 -d. The payload is in the --data argument. You can also save the data to be checked to a file and pass it to the -d parameter with syntax like -d @filename.txt.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><CellSet><Row key="cm93MQ=="><Cell column="Y2ZhOmFsaWFz">TmV3R3V5</Cell></Row></CellSet>' \
  "http://example.com:8000/users/row1/?check=delete"

curl -vi -X DELETE \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"Row":[{"key":"cm93MQ==","Cell":[{"column":"Y2ZhOmFsaWFz","$":"TmV3R3V5"}]}]}' \
  "http://example.com:8000/users/row1/?check=delete"

有条件地删除行的列族:将单元格(any-version-value)的任何版本的值与进行比较check-value,如果any-version-value== check-value,则删除row_key/column_family请求URL内部指定的行的列族。其他所有与中的相同Conditional Deleting a Row。

/table/row_key /column_family /?check=delete

DELETE

Conditional Deleting a Column Family of a Row: Compare the value of any version of a cell (any-version-value) with the check-value, and if any-version-value == check-value, delete the column family of a row specified by the row_key/column_family inside the requesting URL. Anything else is the same as those in Conditional Deleting a Row.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><CellSet><Row key="cm93MQ=="><Cell column="Y2ZhOmFsaWFz">TmV3R3V5</Cell></Row></CellSet>' \
  "http://example.com:8000/users/row1/cfa/?check=delete"

curl -vi -X DELETE \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"Row":[{"key":"cm93MQ==","Cell":[{"column":"Y2ZhOmFsaWFz","$":"TmV3R3V5"}]}]}' \
  "http://example.com:8000/users/row1/cfa/?check=delete"

有条件地删除行列的所有版本:将单元格(any-version-value)的任何版本的值与进行比较check-value,如果any-version-value== check-value,则删除row_key/column:qualifier请求URL内部指定的行的列。将column:qualifier在请求URL是column_family:column_name。其他所有与中的相同Conditional Deleting a Row。

/table/row_key /column:qualifier /?check=delete

DELETE

Conditional Deleting All Versions of a Column of a Row: Compare the value of any version of a cell (any-version-value) with the check-value, and if any-version-value == check-value, delete the column of a row specified by the row_key/column:qualifier inside the requesting URL. The column:qualifier in the requesting URL is the column_family:column_name. Anything else is the same as those in Conditional Deleting a Row.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><CellSet><Row key="cm93MQ=="><Cell column="Y2ZhOmFsaWFz">TmV3R3V5</Cell></Row></CellSet>' \
  "http://example.com:8000/users/row1/cfa:alias/?check=delete"

curl -vi -X DELETE \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"Row":[{"key":"cm93MQ==","Cell":[{"column":"Y2ZhOmFsaWFz","$":"TmV3R3V5"}]}]}' \
  "http://example.com:8000/users/row1/cfa:alias/?check=delete"

有条件地删除行列的单个版本:将单元格(any-version-value)的任何版本的值与进行比较check-value,如果any-version-value== check-value,则删除row_key/column:qualifier/version_id请求URL内部指定的行列的版本。将column:qualifier在请求URL是column_family:column_name。将version_id在请求URL是一个数字,它等于the timestamp of the targeted version + 1。其他所有与中的相同Conditional Deleting a Row。

/table/row_key /column:qualifier /version_id/?check=delete

DELETE

Conditional Deleting a Single Version of a Column of a Row: Compare the value of any version of a cell (any-version-value) with the check-value, and if any-version-value == check-value, delete the version of a column of a row specified by the row_key/column:qualifier/version_id inside the requesting URL. The column:qualifier in the requesting URL is the column_family:column_name. The version_id in the requesting URL is a number, which equals to the timestamp of the targeted version + 1. Anything else is the same as those in Conditional Deleting a Row.

curl -vi -X DELETE \
  -H "Accept: text/xml" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><CellSet><Row key="cm93MQ=="><Cell column="Y2ZhOmFsaWFz">TmV3R3V5</Cell></Row></CellSet>' \
  "http://example.com:8000/users/row1/cfa:alias/1519423552160/?check=delete"

curl -vi -X DELETE \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"Row":[{"key":"cm93MQ==","Cell":[{"column":"Y2ZhOmFsaWFz","$":"TmV3R3V5"}]}]}' \
  "http://example.com:8000/users/row1/cfa:alias/1519423552160/?check=delete"
详细说明:

在上述4个json格式示例中:

{"column":"Y2ZhOmFsaWFz", "$":"TmV3R3V5"}在-d选项末尾the check cell name and check cell value in Base-64分别是:"Y2ZhOmFsaWFz" for "cfa:alias"和"TmV3R3V5" for "NewGuy"

"cm93MQ=="是the Base-64 for "row1"的checkAndDeleterow key

"/?check=delete"在年底the request URL需要checkAndDelete WebHBase操作工作

"version_id"在request URL最后的JSON格式示例的应相当于的值"the timestamp number + 1"

的"row key","column family","cell name" or "column family:column name",和"version_id"在the request URL一个checkAndDelete WebHBase操作应该是URL编码,例如"row1","cfa","cfa:alias"和"1519423552160"在实施例中是URL编码"row key","column family","column family:column name",和"version_id",分别

基本上,这4个xml格式示例与4个对应的json格式示例相同,在此不再详细说明。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值