EOSmysql环境变量配置配置问题

「区块链开发」手把手教你理清EOS各种开发环境搭建来龙去脉
作者:黎跃春孔壹学院创始人
资料和视频获取,添加莉莉微信(kongyixueyuan)获取
目前来讲,任何学习EOS相关技术的资料都来自https://github.com/EOSIO/eos,可能大家在搭建EOS开发环境的过程中,会很迷茫,网上资料都很乱,自己也理不清头绪,不知如何下手。在这里,春哥将一步步为你揭开层层面纱。
1. 硬件软件环境因为EOS的版本太多,所以你需要先知道如何查看EOS对应版本的相关资料。
打开EOS Github官网https://github.com/EOSIO/eos,如下图所示,点击master,然后点击tag,你将会看到不同的版本及其对应的文档。
我在我电脑安装过各种各样的版本,踩过各种各样的莫名其妙的坑,这篇文章我将以如下配置为大家分享。
1.操作系统
2. 编译设置开发环境
2.1 获取EOS源码及其所有子模块
$ git clone https://github.com/eosio/eos --recursive
如果克隆代码时未带--recursive参数,那么可切换到项目路径下面执行如下命令,更新子模块。
$ git submodule update --init --recursive
2.2 编译源码生成可执行文件
切换到上面的项目根目录下面,执行如下命令。
liyuechun:eos yuechunli$ ./eosio_build.sh darwin full
liyuechun:eos yuechunli$ ls
CMakeLists.txt debian ring.dot
CMakeModules docs ring.png
Docker eos-logo.png s
Doxyfile eos.doxygen.in star.dot
HEADER eosio_build.sh star.png
Jenkinsfile externals testnet-diagrams.sh
LICENSE.txt libraries testnet.md
README.md mesh.dot testnet.templatebuild mesh.png tests
circle.yml plugins tools
contracts programs
liyuechun:eos yuechunli$ ./eosio_build.sh darwin full
Beginning build version: 1.2
2018年 4月12日 星期四 07时44分06秒 UTC
git head id: 96eeff3e90f865ebc72b
Current branch: * master
ARCHITECTURE: Darwin
OS name: Darwin
OS Version: 10.13.3
CPU speed: 250.00Ghz
CPU cores: 4
Physical Memory: 16 Gbytes
Disk space total: 465G
Disk space available: 133G
漫长等待,半小时左右,网络不好的话,40 - 50分钟。
[100%] Linking CXX executable chain_test
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in ___gmpn_divexact_1 from /usr/local/lib/libgmp.a(dive_1.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
[100%] Built target chain_test
_______ _______ _______ _________ _______ ( ____ \( ___ )( ____ \\__ __/( ___ )
| ( \/| ( ) || ( \/ ) ( | ( ) |
| (__ | | | || (_____ | | | | | |
| __) | | | |(_____ ) | | | | | |
| ( | | | | ) | | | | | | |
| (____/\| (___) |/\____) |___) (___| (___) | (_______/(_______)\_______)\_______/(_______)
EOS.IO has been successfully built. 0:11:48
To verify your installation run the following commands:
/usr/local/bin/mongod -f /usr/local/etc/mongod.conf &
cd /Users/liyuechun/eos/ make test
For more information:
EOS.IO website: https://eos.io
EOS.IO Telegram channel @ https://t.me/EOSProject
EOS.IO resources: https://eos.io/resources/
EOS.IO wiki: https://github.com/EOSIO/eos/wiki
EOS附带的可执行程序:
liyuechun:programs yuechunli$ pwd
/Users/liyuechun/Desktop/0402/eos/build/programsliyuechun:programs yuechunli$ lsCMakeFiles cmake_install.cmake keosdCTestTestfile.cmake eosio-abigen nodeosMakefile eosio-applesedemo
cleos eosio-launcherliyuechun:programs yuechunli$
nodeos: 区块链服务器节点生成组建
cleos: 和区块链交互的接口命令
keosd: EOS 钱包
eosio-launcher:节点网络组成和部署的应用
所有这些程序/eos/build/programs都存在于这个文件夹。
2.3 建立区块链节点
切换到目录eos/build/programs/nodeos下面,然后执行如下命令。
./nodeos命令可附带 --data-dir 节点文件夹名字 参数,默认文件夹为nodeos。
liyuechun:nodeos yuechunli$ ./nodeos
如下图所示,执行完./nodeos程序后会抱错,并且有如下两个提示。
generating default genesis file /Users/liyuechun/Library/Application Support/eosio/nodeos/config/genesis.json表示创建了一个nodeos节点文件夹。
No producers configured! Please add producer IDs and private keys to configuration.表示
liyuechun:nodeos yuechunli$ cd /Users/liyuechun/Library/Application\ Support/eosio/liyuechun:eosio yuechunli$ ls
nodeosliyuechun:eosio yuechunli$ cd nodeos/liyuechun:nodeos yuechunli$ ls
config dataliyuechun:nodeos yuechunli$ cd config/liyuechun:config yuechunli$ ls
config.ini genesis.jsonliyuechun:config yuechunli$ cd ..liyuechun:nodeos yuechunli$ ls
config dataliyuechun:nodeos yuechunli$ cd data/liyuechun:data yuechunli$ ls
blocks default.wallet shared_memliyuechun:data yuechunli$
config是区块链配置文件,data是区块链交易数据、钱包数据存储文件。我们需要修改config.ini文件里面的相关配置。
我的文件的内容如下:
# Track only transactions whose scopes involve the listed accounts. Default is to track all transactions. (eosio::account_history_plugin)# filter_on_accounts =# Limits the maximum time (in milliseconds) processing a single get_transactions call. (eosio::account_history_plugin)get-transactions-time-limit = 3# File to read Genesis State from (eosio::chain_plugin)genesis-json = "/Users/liyuechun/Library/Application Support/eosio/nodeos/config/genesis.json"# override the initial timestamp in the Genesis State file (eosio::chain_plugin)# genesis-timestamp =# the location of the block log (absolute path or relative to application data dir) (eosio::chain_plugin)block-log-dir = "blocks"# Pairs of [BLOCK_NUM,BLOCK_ID] that should be enforced as checkpoints. (eosio::chain_plugin)# checkpoint =# Limits the maximum time (in milliseconds) that a reversible block is allowed to run before being considered invalid (eosio::chain_plugin)max-reversible-block-time = -1# Limits the maximum time (in milliseconds) that is allowed a pushed transaction's code to execute before being considered invalid (eosio::chain_plugin)max-pending-transaction-time = -1# Limits the maximum time (in milliseconds) that is allowed a to push deferred transactions at the start of a block (eosio::chain_plugin)max-deferred-transaction-time = 20# Override default WASM runtime (eosio::chain_plugin)# wasm-runtime =# Time to wait, in milliseconds, between creating next faucet created account. (eosio::faucet_testnet_plugin)faucet-create-interval-ms = 1000# Name to use as creator for faucet created accounts. (eosio::faucet_testnet_plugin)faucet-name = faucet# [public key, WIF private key] for signing for faucet creator account (eosio::faucet_testnet_plugin)faucet-private-key = ["EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"]# The local IP and port to listen for incoming http connections. (eosio::http_plugin)http-server-address = 127.0.0.1:8888# Specify the Access-Control-Allow-Origin to be returned on each request. (eosio::http_plugin)# access-control-allow-origin =# Specify the Access-Control-Allow-Headers to be returned on each request. (eosio::http_plugin)# access-control-allow-headers =# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)access-control-allow-credentials = false# The queue size between nodeos and MongoDB plugin thread. (eosio::mongo_db_plugin)mongodb-queue-size = 256# MongoDB URI connection string, see: https://docs.mongodb.com/master/reference/connection-string/. If not specified then plugin is disabled. Default database 'EOS' is used if not specified in URI. (eosio::mongo_db_plugin)# mongodb-uri =# The actual host:port used to listen for incoming p2p connections. (eosio::net_plugin)p2p-listen-endpoint = 0.0.0.0:9876# An externally accessible host:port for identifying this node. Defaults to p2p-listen-endpoint. (eosio::net_plugin)# p2p-server-address =# The public endpoint of a peer node to connect to. Use multiple p2p-peer-address options as needed to compose a network. (eosio::net_plugin)# p2p-peer-address =# The name supplied to identify this node amongst the peers. (eosio::net_plugin)agent-name = "EOS Test Agent"# Can be 'any' or 'producers' or 'specified' or 'none'. If 'specified', peer-key must be specified at least once. If only 'producers', peer-key is not required. 'producers' and 'specified' may be combined. (eosio::net_plugin)allowed-connection = any# Optional public key of peer allowed to connect. May be used multiple times. (eosio::net_plugin)# peer-key =# Tuple of [PublicKey, WIF private key] (may specify multiple times) (eosio::net_plugin)# peer-private-key =# Log level: one of 'all', 'debug', 'info', 'warn', 'error', or 'off' (eosio::net_plugin)log-level-net-plugin = info# Maximum number of clients from which connections are accepted, use 0 for no limit (eosio::net_plugin)max-clients = 25# number of seconds to wait before cleaning up dead connections (eosio::net_plugin)connection-cleanup-period = 30# True to require exact match of peer network version. (eosio::net_plugin)network-version-match = 0# number of blocks to retrieve in a chunk from any individual peer during synchronization (eosio::net_plugin)sync-fetch-span = 100# Enable block production, even if the chain is stale. (eosio::producer_plugin)enable-stale-production = true# Percent of producers (0-100) that must be participating in order to produce blocks (eosio::producer_plugin)required-participation = 33# ID of producer controlled by this node (e.g. may specify multiple times) (eosio::producer_plugin)producer-name = eosio# Tuple of [public key, WIF private key] (may specify multiple times) (eosio::producer_plugin)private-key = ["EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"]# The path of the wallet files (absolute path or relative to application data dir) (eosio::wallet_plugin)wallet-dir = "."# Timeout for unlocked wallet in seconds. Wallets will automatically lock after specified number of seconds of inactivity. Activity is defined as any wallet command e.g. list-wallets. (eosio::wallet_plugin)# unlock-timeout =# eosio key that will be imported automatically when a wallet is created. (eosio::wallet_plugin)# eosio-key =# Plugin(s) to enable, may be specified multiple times# Load the block producer plugin, so you can produce blocksplugin = eosio::producer_plugin# Wallet pluginplugin = eosio::wallet_api_plugin# As well as API and HTTP pluginsplugin = eosio::chain_api_pluginplugin = eosio::http_plugin
你需要做如下设置:
genesis-json = "/Users/liyuechun/Library/Application Support/eosio/nodeos/config/genesis.json"
enable-stale-production = true
producer-name = eosio
plugin = eosio::producer_plugin
plugin = eosio::wallet_api_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
接下来再次启动./nodeos程序,每0.5秒会产生一个区块。
liyuechun:nodeos yuechunli$ ./nodeos
2212313ms thread-0 chain_plugin.cpp:99 plugin_initialize ] initializing chain plugin2212313ms thread-0 wallet_plugin.cpp:41 plugin_initialize ] initializing wallet plugin2212313ms thread-0 http_plugin.cpp:141 plugin_initialize ] host: 127.0.0.1 port: ms thread-0 http_plugin.cpp:144 plugin_initialize ] configured http to listen on 127.0.0.1:ms thread-0 net_plugin.cpp:2628 plugin_initialize ] Initialize net plugin2212313ms thread-0 net_plugin.cpp:2644 plugin_initialize ] Setting net_plugin logging level to info2212313ms thread-0 net_plugin.cpp:2669 plugin_initialize ] host: 0.0.0.0 port: ms thread-0 net_plugin.cpp:2745 plugin_initialize ] my node_id is e50dab215d23ca32cd28c816aams thread-0 main.cpp:90 main ] nodeos version 96eems thread-0 main.cpp:91 main ] eosio root is /Users/liyuechun/Library/Application Support2212329ms thread-0 chain_plugin.cpp:208 plugin_startup ] starting chain in read/write mode2212329ms thread-0 chain_plugin.cpp:213 plugin_startup ] B head block is #0, genesis timestamp is T12:00:00.ms thread-0 producer_plugin.cpp:161 plugin_startup ] producer plugin: plugin_startup() begin2212329ms thread-0 producer_plugin.cpp:166 plugin_startup ] Launching block production for 1 producers.
*******************************
* ------ NEW CHAIN ------ *
* - Welcome to EOSIO! - *
* ----------------------- *
*******************************
Your genesis seems to have an old timestamp
Please consider using the --genesis-timestamp option to give your genesis a recent timestamp2212330ms thread-0 producer_plugin.cpp:176 plugin_startup ] producer plugin: plugin_startup() end2212330ms thread-0 http_plugin.cpp:213 plugin_startup ] start listening for http requests2212330ms thread-0 wallet_api_plugin.cpp:70 plugin_startup ] starting wallet_api_plugin2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/create2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/get_public_keys2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/import_key2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/list_keys2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/list_wallets2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/lock2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/lock_all2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/open2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/set_timeout2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/sign_transaction2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/wallet/unlock2212330ms thread-0 chain_api_plugin.cpp:62 plugin_startup ] starting chain_api_plugin2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/abi_bin_to_json2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/abi_json_to_bin2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_account2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_block2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_code2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_currency_balance2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_currency_stats2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_info2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_required_keys2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/get_table_rows2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/push_block2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/push_transaction2212330ms thread-0 http_plugin.cpp:242 add_handler ] add api url: /v1/chain/push_transactions2212330ms thread-0 net_plugin.cpp:2757 plugin_startup ] starting listener, max clients is 25eosio generated block b8001d13... #1 @ T08:36:52.500 with 0 trxs, lib: 0eosio generated block 96eab818... #2 @ T08:36:53.000 with 0 trxs, lib: 1eosio generated block 635d105b... #3 @ T08:36:53.500 with 0 trxs, lib: 2eosio generated block 29ef0516... #4 @ T08:36:54.000 with 0 trxs, lib: 3eosio generated block 1fc1ac75... #5 @ T08:36:54.500 with 0 trxs, lib: 4eosio generated block 041d331f... #6 @ T08:36:55.000 with 0 trxs, lib: 5eosio generated block ebee3c7d... #7 @ T08:36:55.500 with 0 trxs, lib: 6eosio generated block eecd62a0... #8 @ T08:36:56.000 with 0 trxs, lib: 7eosio generated block c2b27ea5... #9 @ T08:36:56.500 with 0 trxs, lib: 8eosio generated block 6c66dc13... #10 @ T08:36:57.000 with 0 trxs, lib: 9eosio generated block 2534614c... #11 @ T08:36:57.500 with 0 trxs, lib: 10eosio generated block cce2934b... #12 @ T08:36:58.000 with 0 trxs, lib: 11eosio generated block 0165d88b... #13 @ T08:36:58.500 with 0 trxs, lib: 12eosio generated block fa240aa7... #14 @ T08:36:59.000 with 0 trxs, lib: 13eosio generated block ... #15 @ T08:36:59.500 with 0 trxs, lib: 14
2.4查看区块信息重新打开一个终端,切换到如下路径。
liyuechun:cleos yuechunli$ ./cleos -p 8888 get info
{ "server_version": "96ee0325", "head_block_num": 342, "last_irreversible_block_num": 341, "head_block_id": "ca5ec4f237bbe49e8eb3aa36dbe8ececdad5caf01ba", "head_block_time": "T08:39:43", "head_block_producer": "eosio"}
liyuechun:cleos yuechunli$ ./cleos -p 8888 get info
{ "server_version": "96ee0325", "head_block_num": 359, "last_irreversible_block_num": 358, "head_block_id": "b393bcfb0b34f2c0c429", "head_block_time": "T08:39:51", "head_block_producer": "eosio"}
2.5. 视频获取方式
添加莉莉老师微信:【kongyixueyuan】发送关键字“课程”免费获取
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点EOS环境搭建
本篇教程适用于以下系统,但是不论你的电脑是 windows 还是 mac,都强烈建议安装一个虚拟机,在 Ubuntu 上搞,因为 Mac 上有很多坑。安装 Ubuntu 虚拟机有关教程大家可以在网上搜到。oAmazon 2017.09 and higher.oCentos 7.oFedora 25 and higher (Fedora 27 recommended).oMint 18.oUbuntu 16.04 (Ubuntu 16.10 recommended).oMacOS Darwin 10.12 and higher (MacOS 10.13.x recommended).配置要求:o8GB 内存o20GB 硬盘空余空间如果机器内存不够 8G,自动编译脚本会报错。运行 EOS 需要一点 linux 和 github 基础,不过不要嫌麻烦,以后开发 EOS 合约需要大量这方面的知识。推荐你先按步骤搞起来,有不明白的可以参考以下文章。别怕,谁也不是生下来就什么都会的。linux 命令基础: github 基础: 下载 EOS 代码如果你是 Mac,需要先下载 git,可以搜索 “Mac git” 就能找的各种文章教你在 Mac 上安装 git。首先使用 cd命令进入你想安装的文件夹,我一般就是根目录了,执行以下命令下载 EOS 代码:git clone
--recursive注意要加后面这个 --recursive命令,因为 EOS 有几个子模块,这样就能全部下载下来,如果忘了这个命令,使用下面的命令可以补救:git submodule update --init --recursive有了源代码,我们就可以构建我们本地的 EOS 程序了,EOS 官方非常体贴地为我们准备了自动构建的脚本,使用这个脚本可以大大简化,首先我们进入刚刚下载的 eos 目录,并执行构建脚本:cd eos./eosio_build.sh坑1:使用的是虚拟机Ubuntu系统的话,虽然扩展空间很大,但是在运行该命令时会出现 磁盘空间不够20G,可以修改该脚本中的
DISK_MIN=20
限制,另外,最小的内存要大于7G,可以修改./scripts/eosio_build_ubuntu.sh中的
${MEM_MEG}" -lt 7000 限制坑2:在执行过程中可能会遇到MongoDB无法下载的情况,可以自己去,将下载的mongodb-linux-x86_64-3.6.3放入linux的~/opt/下面。然后修改./scripts/eosio_build_ubuntu.sh,如下:
#STATUS=$(curl -LO -w '%{http_code}' --connect-timeout 30 )
#if [ "${STATUS}" -ne 200 ]; then
#printf "\\tUnable to download MongoDB at this time.\\n"
#printf "\\n\\tExiting now.\\n\\n"
#fi根据网速和机器性能的不同,可能要用 30 分钟 - 1 小时的时间,请耐心等待。构建完成后需要对构建的产物进行验证:oLinux 系(Ubuntu等):~/opt/mongodb/bin/mongod -f ~/opt/mongodb/mongod.conf &oMac:/usr/local/bin/mongod -f /usr/local/etc/mongod.conf &然后所有操作系统再执行以下命令:cd buildmake test为了方便开发智能合约,还需要在 build 目录进行 make install:如果已经进入 build 目录请去掉 cd build。cd buildsudo make install建立本地单节点测试网络构建完成后,我们进入 eos/build/programs/nodeos 目录(使用 cd 和 cd .. 命令),运行 nodeos 节点程序:./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin 命令中, -p 参数表示使用了 eosio 账户的权限,这是本地测试系统提供的原始账户。后面的各个 plug in 参数是选择加载的插件。成功后,如果看到类似下面的输出,就是成功建立了一个本地单节点测试网络:1575001ms thread-0
chain_controller.cpp:235
_push_block
] initm #1 @T04:26:15
| 0 trx, 0 pending, exectime_ms=01575001ms thread-0
producer_plugin.cpp:207
block_production_loo ] initm generated block #1 @ T04:26:15 with 0 trxs
0 pending1578001ms thread-0
chain_controller.cpp:235
_push_block
] initc #2 @T04:26:18
| 0 trx, 0 pending, exectime_ms=01578001ms thread-0
producer_plugin.cpp:207
block_production_loo ] initc generated block #2 @ T04:26:18 with 0 trxs
0 pending...eosio generated block 046b9984... #101527 @ T14:24:58.000 with 0 trxseosio generated block 5e527ee2... #101528 @ T14:24:58.500 with 0 trxs...说明本地的单节点已经开始正常出块了。如果你不满足于以上,可以对节点配置进行修改,配置文件位于:oMac OS: ~/Library/Application Support/eosio/nodeos/configoLinux: ~/.local/share/eosio/nodeos/config上述文件夹中默认有 genesis.json配置文件,可以直接修改它,或者在别的文件里再写一个新的配置文件,不过运行 nodeos 时,就要通过 --config-dir 命令指出新配置文件的位置。配置文件夹还默认有一个 config.ini文件。如果没有的话,nodeos 启动时会自动创建一个,但自动创建的 config.ini文件是不让节点出块的,此时你需要使用 Ctrl-C停止 nodeos,并编辑这个文件:
# Load the testnet genesis state, which creates some initial block producers with the default key
genesis-json = /path/to/eos/source/genesis.json
# Enable production on a stale chain, since a single-node test chain is pretty much always stale
enable-stale-production = true
# Enable block production with the testnet producers
producer-name = eosio
# Load the block producer plugin, so you can produce blocks
plugin = eosio::producer_plugin
# Wallet plugin
plugin = eosio::wallet_api_plugin
# As well as API and HTTP plugins
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
# This will be used by the validation step below, to view account history
plugin = eosio::account_history_api_plugin这样配置好后,重新启动 nodeos,就会顺利出块了。nodeos 的运行数据文件夹(log和共享存储等数据)位于以下文件夹:oMac OS: ~/Library/Application Support/eosio/nodeos/dataoLinux: ~/.local/share/eosio/nodeos/data但也可以使用 nodeos 的 --data-dir命令重新指定数据文件夹。
没有更多推荐了,}

我要回帖

更多关于 jdk环境变量配置win10 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信