1 Star 0 Fork 130

孔露霞 / distributeddatamgr_pasteboard

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

剪贴板服务

简介

剪贴板服务作为杂散子系统的功能组件,提供管理系统剪贴板的能力,为系统复制、粘贴功能提供支持。系统剪切板支持包文本、超本文、URIs等内容操作。

图 1 子系统架构图

剪贴板服务,提供支撑应用开发者方便、高效的使用剪贴板相关业务的功能。其主要组件包括剪贴板管理客户端和剪贴板服务。剪贴板管理客户端负责剪贴板接口管理,提供剪贴板北向JS API给应用;在应用框架侧创建剪贴板数据、请求剪贴板SA执行剪贴板的新建、删除、查询、转换文本、配置等。剪贴板服务负责剪贴板事件管理,管理剪贴板SA的生命周期(启动、销毁、多用户等);执行应用请求,通知剪贴板数据管理,并将结果返回给剪贴板管理客户端。

目录

/foundation/distributeddatamgr/pasteboard
├── etc                      # 组件包含的进程的配置文件
├── figures                  # 构架图
├── framework                # innerKit接口
├── interfaces               # 组件对外提供的接口代码
│   └── kits                 # 对应用提供的接口
├── profile                  # 组件包含的系统服务的配置文件
├── services                 # 剪贴板服务实现
│    └── core                # 核心代码实现
│    └── test                # native测试代码
│    └── zidl                # 跨进程通信代码实现
├── utils                    # 测试或服务使用mock的数据
└──README_zh.md              # 使用说明

说明

接口说明

表 1 PasteBoard开放的主要方法

接口名

描述

createData(mimeType: string, value: ValueType): PasteData;

用MIME类型和值创建一个PasteData 对象

createRecord(mimeType: string, value: ValueType): PasteDataRecord;

用MIME类型和值创建一个PasteDataRecord对象

createHtmlData(htmlText: string): PasteData;

为HTML类型的数据创建一个MIMETYPE_TEXT_HTML类型的PasteData 对象

createWantData(want: Want): PasteData;

为want类型的数据创建一个MIMETYPE_TEXT_WANT类型的PasteData对象

createPlainTextData(text: string): PasteData;

为纯文本类型的数据创建一个MIMETYPE_TEXT_PLAIN类型的PasteData 对象

createUriData(uri: string): PasteData;

为URI类型的数据创建一个MIMETYPE_TEXT_URI类型的PasteData 对象

createHtmlTextRecord(htmlText: string): PasteDataRecord;

为超文本类型的数据创建一个RecordMIMETYPE_TEXT_HTML类型的PasteDataRecord对象

createWantRecord(want: Want): PasteDataRecord;

为want类型的数据创建一个MIMETYPE_TEXT_WANT类型的PasteDataRecord对象

createPlainTextRecord(text: string): PasteDataRecord;

为纯文本类型的数据创建一个MIMETYPE_TEXT_PLAIN类型的PasteDataRecord对象

createUriRecord(uri: string): PasteDataRecord;

为URI类型的数据创建一个MIMETYPE_TEXT_URI类型的PasteDataRecord对象

getSystemPasteboard(): SystemPasteboard;

获取系统剪贴板

表 2 SystemPasteboard开放的主要方法

接口名

描述

clearData(callback: AsyncCallback<void>): void;

清除剪贴板

clearData(): Promise<void>;

清除剪贴板

getData(callback: AsyncCallback<PasteData>): void;

从系统剪贴板获取pastedata对象

getData(): Promise<PasteData>;

从系统剪贴板获取pastedata对象

hasData(callback: AsyncCallback<boolean>): void;

判断系统剪贴板中的内容

hasData(): Promise<boolean>;

判断系统剪贴板中的内容

setData(data: PasteData, callback: AsyncCallback<void>): void;

向系统剪贴板写入PasteData

setData(data: PasteData): Promise<void>;

向系统剪贴板写入PasteData

on(type:'update', callback: () => void): void;

打开粘贴板内容更改时调用的回调

off(type: 'update', callback?: () => void): void;

关闭粘贴板内容更改时调用的回调

clear(callback: AsyncCallback<void>): void;

清除剪贴板

clear(): Promise<void>;

清除剪贴板

getPasteData(callback: AsyncCallback<PasteData>): void;

获取系统剪贴板数据对象

getPasteData():Promise<PasteData>;

获取系统剪贴板数据对象

hasPasteData(callback: AsyncCallback<boolean>:void;

检查粘贴板中是否有内容

hasPasteData(): Promise<boolean>;

检查粘贴板中是否有内容

setPasteData(data: PasteData, callback: AsyncCallback<void>:void;

将 PasteData 写入粘贴板

setPasteData(data: PasteData): Promise<void>;

将 PasteData 写入粘贴板

表 3 PasteData开放的主要方法

接口名

描述

addRecord(mimeType: string, value: ValueType): void;

将mimeType和对应值添加到 PasteData 对象中

getRecord(index: number): PasteDataRecord;

使用PasteData对象中的次序获取PasteDataRecord记录

hasType(mimeType: string): boolean;

判断DataProperty中是否有指定MIME类型的值

removeRecord(index: number): void;

基于PasteData中值的次序删除一条记录

replaceRecord(index: number, record: PasteDataRecord): void;

用PasteDataRecord记录替换PasteData中指定次序的记录

addHtmlRecord(htmlText: string): void;

将 HTML 文本记录添加到 PasteData 对象,并将 MIME 类型更新为 DataProperty 中的 PasteData#MIMETYPE_TEXT_HTML。

addWantRecord(want: Want): void;

将want记录添加到 PasteData 对象,并将 MIME 类型更新为 DataProperty 中的 PasteData#MIMETYPE_TEXT_WANT

addRecord(record: PasteDataRecord): void;

将 PasteRecord 添加到粘贴数据对象并更新数据属性中的 MIME 类型

addTextRecord(text: string): void;

将纯文本记录添加到 PasteData 对象,并将 MIME 类型更新为 DataProperty 中的 PasteData#MIMETYPE_TEXT_PLAIN

addUriRecord(uri: string): void;

将 URI 记录添加到 PasteData 对象,并将 MIME 类型更新为 DataProperty 中的 PasteData#MIMETYPE_TEXT_URI

getMimeTypes(): Array<string>;

粘贴板上所有内容的 MIME 类型

getPrimaryHtml(): string;

PasteData 对象中主要记录的 HTML 文本

getPrimaryWant(): Want;

PasteData 对象中的主记录的want

getPrimaryMimeType(): string;

PasteData 对象中主记录的 MIME 类型。

getPrimaryUri(): string;

PasteData 对象中主记录的 URI

getPrimaryPixelMap(): image.PixelMap;

PasteData 对象中主记录的 PixelMap。

getProperty(): PasteDataProperty;

获取剪贴板数据对象的属性

setProperty(property: PasteDataProperty): void;

设置属性描述对象,当前仅支持设置shareOption属性。

getRecordAt(index: number): PasteDataRecord;

基于指定索引的记录

getRecordCount(): number;

PasteData 对象中的记录数

hasMimeType(mimeType: string): boolean;

检查 DataProperty 中是否存在指定的 MIME 类型的数据

removeRecordAt(index: number): boolean;

根据指定索引删除记录

replaceRecordAt(index: number, record: PasteDataRecord): boolean;

用新记录替换指定记录

表 4 PasteDataRecord开放的主要方法

接口名

描述

convertToTextV9(callback: AsyncCallback<string>): void;

将 PasteData中的数据 转换为文本格式

convertToTextV9(): Promise<string>;

将 PasteData中的数据 转换为文本格式

convertToText(callback: AsyncCallback<string>): void;

将 PasteData 转换为文本内容的内容

convertToText(): Promise<void>;

将 PasteData 转换为文本内容的内容

表 5 PasteDataProperty参数说明

名称

类型

说明

additions{[key:string]}

object

附加属性数据键值对

mimeTypes

Array

PasteData 中所有记录的非重复 MIME 类型

tag

string

PasteData 对象的用户定义标签

timestamp

number

时间戳,指示何时将数据写入系统粘贴板。

localOnly

boolean

检查 PasteData 是否设置为仅用于本地访问。

shareOption

[ShareOption](https://gitee.com/openharmony/docs/blob/a4ead7d2fe7ac381133ba47c70c9df8cdfa95325/zh-cn/application-dev/reference/apis/js-apis-pasteboard.md#shareoption9)

指示剪贴板数据可以粘贴到的范围 。

表 6 pasteboard主要属性说明

名称

类型

说明

MAX_RECORD_NUM

number

单个PasteData中所能包含的Record的数量上限。

MIMETYPE_TEXT_HTML

string

HTML text文本的MIME类型定义。

MIMETYPE_TEXT_WANT

string

Want的MIME类型定义。

MIMETYPE_TEXT_PLAIN

string

Plain text文本的MIME类型定义。

MIMETYPE_TEXT_URI

string

URI文本的MIME类型定义。

MIMETYPE_PIXELMAP

string

PixelMap的MIME类型定义 。

ValueType

string | image.PixelMap | Want | ArrayBuffer

value值的类型定义。

表 7 PasteDataRecord主要属性说明

名称

类型

说明

htmlText

string

HTML文本内容。

want

[Want](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-application-Want.md)

Want文本内容。

mimeType

string

数据类型。

plainText

string

文本内容。

uri

string

URI内容。

pixelMap

[image.PixelMap](https://gitee.com/openharmony/docs/blob/a4ead7d2fe7ac381133ba47c70c9df8cdfa95325/zh-cn/application-dev/reference/apis/js-apis-image.md#pixelmap7)

PixelMap内容。

表 8 ShareOption枚举类型说明

名称

说明

InApp

InApp表示仅允许同应用内粘贴。

LocalDevice

LocalDevice表示仅允许在此设备中粘贴。

使用说明

剪贴板模块使用示例:

// 导入模块
import pasteboard from '@ohos.pasteboard'

//文本拷贝
console.log('Get SystemPasteboard')
var systemPasteboard = pasteboard.getSystemPasteboard()
systemPasteboard.clear()
        
var textData = 'Hello World!'
console.log('createPlainTextData = ' + textData)
var pasteData = pasteboard.createPlainTextData(textData)
        
console.log('Writes PasteData to the pasteboard')
systemPasteboard.setPasteData(pasteData)
        
console.log('Checks there is content in the pasteboard')
assert.equal(systemPasteboard.hasPasteData(), true)
        
console.log('Checks the number of records')
pasteData = systemPasteboard.getPasteData()
assert.equal(pasteData.getRecordCount(), 1)
        
console.log('Checks the pasteboard content')
assert.equal(pasteData.getPrimaryText(), textData)
        
console.log('Checks there is a MIMETYPE_TEXT_PLAIN MIME type of data')
assert.equal(pasteData.hasMimeType(MIMETYPE_TEXT_PLAIN), true)
assert.equal(pasteData.getPrimaryMimeType(), MIMETYPE_TEXT_PLAIN)

//剪贴板变化监听
console.log('Off the content changes')
var systemPasteboard = pasteboard.getSystemPasteboard()
systemPasteboard.off(contentChanges)
systemPasteboard.clear()
        
var textData = 'Hello World!'
console.log('createUriData = ' + textData)
var pasteData = pasteboard.createUriData(textData)
        
console.log('Writes PasteData to the pasteboard')
systemPasteboard.setPasteData(pasteData)
        
console.log('Checks there is content in the pasteboard')
assert.equal(systemPasteboard.hasPasteData(), true)
        
console.log('Checks the number of records')
pasteData = systemPasteboard.getPasteData()
assert.equal(pasteData.getRecordCount(), 1)
        
console.log('On the content changes')
systemPasteboard.on(contentChanges)
        
console.log('Removes the Record')
assert.equal(pasteData.removeRecordAt(0), true)
        
console.log('Writes PasteData to the pasteboard')
systemPasteboard.setPasteData(pasteData)
        
console.log('Checks the number of records')
pasteData = systemPasteboard.getPasteData()
assert.equal(pasteData.getRecordCount(), 0)
        
console.log('Checks there is  no content in the pasteboard')
assert.equal(systemPasteboard.hasPasteData(), false)
        
var textDataNew = 'Hello World!-New'
console.log('createUriData = ' + textDataNew)
var pasteData = pasteboard.createUriData(textDataNew)
        
console.log('Writes PasteData to the pasteboard')
systemPasteboard.setPasteData(pasteData)
        
console.log('Checks there is content in the pasteboard')
assert.equal(systemPasteboard.hasPasteData(), true)
        
console.log('Checks the number of records')
pasteData = systemPasteboard.getPasteData()
assert.equal(pasteData.getRecordCount(), 1)
        
console.log('Checks the pasteboard content')
assert.equal(pasteData.getRecordAt(0).plainText, textDataNew)

//构建一个自定义类型的剪贴板内容对象
var dataXml = new ArrayBuffer(256);
var pasteData = pasteboard.createData('app/xml', dataXml);

//创建一条自定义数据内容条目
var dataXml = new ArrayBuffer(256);
var pasteDataRecord = pasteboard.createRecord('app/xml', dataXml);

//将一个PasteData中的内容强制转换为文本内容,使用callback异步回调
var record = pasteboard.createUriRecord("dataability:///com.example.myapplication1/user.txt");
record.convertToTextV9((err, data) => {    
    if (err) {        
        console.error('Failed to convert to text. Cause: ' + JSON.stringify(err));        
        return;   
      }
    console.info('Succeeded in converting to text. Data: ' + JSON.stringify(data));
});

//将一个PasteData中的内容强制转换为文本内容,使用Promise异步回调
var record = pasteboard.createUriRecord("dataability:///com.example.myapplication1/user.txt");
record.convertToTextV9().then((data) => {
    console.info('Succeeded in converting to text. Data: ' + JSON.stringify(data));
}).catch((err) => {
    console.error('Failed to convert to text. Cause: ' + JSON.stringify(err));
});

//向当前剪贴板内容中添加一条自定义数据内容条目
var pasteData = pasteboard.createUriData("dataability:///com.example.myapplication1/user.txt");
var dataXml = new ArrayBuffer(256);
pasteData.addRecord('app/xml', dataXml);

//获取剪贴板内容中指定下标的条目
var pasteData = pasteboard.createPlainTextData("hello");
var record = pasteData.getRecord(0);

//检查剪贴板内容中是否有指定的MIME数据类型
var pasteData = pasteboard.createPlainTextData("hello");
var hasType = pasteData.hasType(pasteboard.MIMETYPE_TEXT_PLAIN);

//移除剪贴板内容中指定下标的条目
var pasteData = pasteboard.createPlainTextData("hello");
pasteData.removeRecord(0);

//替换剪贴板内容中指定下标的条目
var pasteData = pasteboard.createPlainTextData("hello");
var record = pasteboard.createUriRecord("dataability:///com.example.myapplication1/user.txt");
pasteData.replaceRecord(0, record);

//清空系统剪贴板内容,使用callback异步回调
systemPasteboard.clearData((err, data) => { 
    if (err) {        
        console.error('Failed to clear the pasteboard. Cause: ' + JSON.stringify(err));
        return;    
    }
    console.info('Succeeded in clearing the pasteboard.');
});

//清空系统剪贴板内容,使用Promise异步回调
systemPasteboard.clearData().then((data) => { 
    console.info('Succeeded in clearing the pasteboard.');
}).catch((err) => {    
    console.error('Failed to clear the pasteboard. Cause: ' + JSON.stringify(err));
});

//读取系统剪贴板内容,使用callback异步回调
var systemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.getData((err, pasteData) => {  
    if (err) {
        console.error('Failed to get PasteData. Cause: ' + err.message);
        return;
    }
    var text = pasteData.getPrimaryText();
});

//读取系统剪贴板内容,使用Promise异步回调
var systemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.getData().then((pasteData) => { 
    var text = pasteData.getPrimaryText();
}).catch((err) => {
    console.error('Failed to get PasteData. Cause: ' + err.message);
})

//判断系统剪贴板中是否有内容,使用callback异步回调
systemPasteboard.hasData((err, data) => {
    if (err) {
        console.error('Failed to check the PasteData. Cause: ' + JSON.stringify(err));
        return;
    }
    console.info('Succeeded in checking the PasteData. Data: ' + JSON.stringify(data));
});

//判断系统剪贴板中是否有内容,使用Promise异步回调
systemPasteboard.hasData().then((data) => { 
    console.info('Succeeded in checking the PasteData. Data: ' + JSON.stringify(data));
}).catch((err) => {
    console.error('Failed to check the PasteData. Cause: ' + JSON.stringify(err));
});

//将数据写入系统剪贴板,使用callback异步回调
var pasteData = pasteboard.createPlainTextData("content");
var systemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.setData(pasteData, (err, data) => { 
    if (err) {
        console.error('Failed to set PasteData. Cause: ' + err.message);
        return;
    }
    console.info('Succeeded in setting PasteData.');
});

//将数据写入系统剪贴板,使用Promise异步回调
var pasteData = pasteboard.createPlainTextData("content");
var systemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.setData(pasteData).then((data) => {
    console.info('Succeeded in setting PasteData.');
}).catch((err) => {
    console.error('Failed to set PasteData. Cause: ' + err.message);
});

相关仓

分布式数据管理子系统

distributeddatamgr_pasteboard

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS

简介

Pasteboard System Ability | 剪贴板服务 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/kong-luxia1212/distributeddatamgr_pasteboard.git
git@gitee.com:kong-luxia1212/distributeddatamgr_pasteboard.git
kong-luxia1212
distributeddatamgr_pasteboard
distributeddatamgr_pasteboard
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891