truffle宠物店开发教程jwenlee

默认的Truffle目录结构包含以下内容:

contract/:包含我们智能合约的Solidity源文件。这里有一个名为Migrations.sol的重要合约,我们稍后会谈到。migrations/:Truffle使用迁移系统来处理智能合约部署。迁移是一种额外的特殊智能合约,用于跟踪更改。test/:包含我们智能合约的JavaScript和Solidity测试truffle-config.js:配置文件

宠物店TruffleBox里面有额外的文件和文件夹,但我们暂时不用担心这些。

我们将通过编写充当后端逻辑和存储的智能合约来启动我们的dapp。

在contracts/目录中创建一个名为Adoption.sol的新文件。

将以下内容添加到文件中:

pragmasolidity^0.5.0;contractAdoption{}注意事项:

所需的最低版本的Solidity在合同顶部注明:pragmasolidity^0.5.0;。pragma命令表示“只有编译器关心的附加信息”,而插入符号(^)表示“指示的版本或更高版本”。与JavaScript或PHP一样,语句以分号结尾。

Solidity是一种静态类型语言,这意味着必须定义字符串、整数和数组等数据类型。Solidity有一种独特的类型,称为地址。地址是以太坊地址,存储为20字节值。以太坊区块链上的每个账户和智能合约都有一个地址,并且可以向该地址发送和接收以太币。

在下一行添加以下变量contractAdoption{.

address[16]publicadopters;注意事项:

我们定义了一个变量:采用者。这是一组以太坊地址。数组包含一种类型,并且可以具有固定或可变长度。在这种情况下,类型是地址,长度是16。

您还会注意到采用者是公开的。公共变量具有自动getter方法,但在数组的情况下,键是必需的,并且只会返回一个值。稍后,我们将编写一个函数来返回整个数组以在我们的UI中使用。

让我们允许用户提出采用请求。

//Adoptingapetfunctionadopt(uintpetId)publicreturns(uint){require(petId>=0&&petId<=15);adopters[petId]=msg.sender;returnpetId;}注意事项:

在Solidity中,必须指定函数参数和输出的类型。在这种情况下,我们将接收一个petId(整数)并返回一个整数。

我们正在检查以确保petId在我们的采用者数组的范围内。Solidity中的数组从0开始索引,因此ID值需要在0到15之间。我们使用require()语句来确保ID在范围内。

如果ID在范围内,然后我们将调用的地址添加到我们的采用者数组中。调用此函数的人或智能合约的地址由msg.sender表示。

最后,我们返回作为确认提供的petId。

如上所述,数组getter仅从给定键返回单个值。我们的UI需要更新所有宠物的收养状态,但是进行16次API调用并不理想。所以我们的下一步是编写一个函数来返回整个数组。

在我们上面添加的adopt()函数之后,将以下getAdopters()函数添加到智能合约中:

//RetrievingtheadoptersfunctiongetAdopters()publicviewreturns(address[16]memory){returnadopters;}注意事项:

现在我们已经编写了智能合约,接下来的步骤是编译和迁移它。

Solidity是一种编译语言,这意味着我们需要将Solidity编译为字节码,以供以太坊虚拟机(EVM)执行。将其视为将我们人类可读的Solidity转换为EVM可以理解的东西。

在终端中,确保您位于包含dapp的目录的根目录中,然后键入:

trufflecompile

Youshouldseeoutputsimilartothefollowing:

Compilingyourcontracts...===========================>Compiling./contracts/Adoption.sol>Compiling./contracts/Migrations.sol>Artifactswrittento/Users/cruzmolina/Code/truffle-projects/metacoin/build/contracts>Compiledsuccessfullyusing:-solc:0.5.0+commit.1d4f565a.Emscripten.clangMigration现在我们已经成功编译了我们的合约,是时候将它们迁移到区块链了!

您会在migrations/目录中看到一个JavaScript文件:1_initial_migration.js。这处理部署Migrations.sol合约以观察后续智能合约迁移,并确保我们将来不会重复迁移未更改的合约。

现在我们准备创建自己的迁移脚本。

在migrations/目录中创建一个名为2_deploy_contracts.js的新文件。

将以下内容添加到2_deploy_contracts.js文件中:

varAdoption=artifacts.require("Adoption");module.exports=function(deployer){deployer.deploy(Adoption);};在我们将合约迁移到区块链之前,我们需要运行一个区块链。在本教程中,我们将使用Ganache,这是一个用于以太坊开发的个人区块链,您可以使用它来部署合约、开发应用程序和运行测试。如果您还没有,请下载Ganache并双击图标以启动应用程序。这将生成一个在7545端口本地运行的区块链。

在Ganache中,请注意区块链的状态已更改。区块链现在显示当前块,以前为0,现在为4。此外,虽然第一个帐户最初有100个以太币,但由于迁移的交易成本,现在它更低了。稍后我们将更多地讨论交易成本。

Truffle在智能合约测试方面非常灵活,因为测试可以用JavaScript或Solidity编写。在本教程中,我们将使用Chai和Mocha库在Javascript中编写测试。在test/目录中创建一个名为testAdoption.test.js的新文件。将以下内容添加到testAdoption.test.js文件中:

constAdoption=artifacts.require("Adoption");contract("Adoption",(accounts)=>{letadoption;letexpectedAdopter;before(async()=>{adoption=awaitAdoption.deployed();});describe("adoptingapetandretrievingaccountaddresses",async()=>{before("adoptapetusingaccounts[0]",async()=>{awaitadoption.adopt(8,{from:accounts[0]});expectedAdopter=accounts[0];});});});我们通过导入来启动合约:

*Adoption:我们想要测试的智能合约。我们通过使用artifacts.require导入我们的Adoption合约来开始我们的测试。注意:编写此测试时,我们的回调函数采用参数帐户。这为我们提供了使用此测试时网络上可用的帐户。

然后,我们利用before为以下内容提供初始设置:

*领养id为8的宠物并将其分配给网络上测试帐户中的第一个帐户。

*该函数稍后用于检查petId:8是否被accounts[0]采用。

###测试采用功能

要测试采用函数,请记住,成功后它会返回给定的采用者。我们可以确保返回基于给定petID的采用者,并与采用函数中的预期采用者进行比较。

describe("adoptingapetandretrievingaccountaddresses",async()=>{before("adoptapetusingaccounts[0]",async()=>{awaitadoption.adopt(8,{from:accounts[0]});expectedAdopter=accounts[0];});it("canfetchtheaddressofanownerbypetid",async()=>{constadopter=awaitadoption.adopters(8);assert.equal(adopter,expectedAdopter,"Theowneroftheadoptedpetshouldbethefirstaccount.");});});注意事项:

我们调用智能合约方法采用者,看看哪个地址采用了petID为8的宠物。Truffle为用户导入Chai,因此我们可以使用断言函数。我们将实际值、预期值和失败消息(如果测试未通过,则会打印到控制台)传递给assert.equal()。###测试所有宠物主人的检索

由于数组只能在给定单个键的情况下返回单个值,因此我们为整个数组创建自己的getter。

在testAdoption.test.js中之前添加的函数下面添加这个函数。

it("canfetchthecollectionofallpetowners'addresses",async()=>{constadopters=awaitadoption.getAdopters();assert.equal(adopters[8],expectedAdopter,"Theowneroftheadoptedpetshouldbeinthecollection.");});由于采用者是一个数组,并且我们从第一次采用测试中知道我们采用了petId为8的宠物,因此我们将合约的地址与我们期望找到的地址进行比较。

truffletestIfallthetestspass,you'llseeconsoleoutputsimilartothis:Usingnetwork'development'.Compilingyourcontracts...===========================>Compiling./test/TestAdoption.sol>Artifactswrittento/var/folders/z3/v0sd04ys11q2sh8tq38mz30c0000gn/T/test-11934-19747-g49sra.0ncrr>Compiledsuccessfullyusing:-solc:0.5.0+commit.1d4f565a.Emscripten.clangTestAdoptiontestUserCanAdoptPet(91ms)testGetAdopterAddressByPetId(70ms)testGetAdopterAddressByPetIdInArray(89ms)3passing(670ms)创建用户界面以与智能合约交互现在我们已经创建了智能合约,将其部署到我们的本地测试区块链并确认我们可以通过控制台与之交互,是时候创建一个UI,以便Pete可以为他的宠物店使用一些东西!

宠物店TruffleBox中包含应用程序前端的代码。该代码存在于src/目录中。

前端不使用构建系统(webpack、grunt等)以尽可能容易上手。应用程序的结构已经存在;我们将填写以太坊独有的功能。这样,您可以将这些知识应用到您自己的前端开发中。

在文本编辑器中打开/src/js/app.js。

检查文件。请注意,有一个全局App对象来管理我们的应用程序,在init()中加载宠物数据,然后调用函数initWeb3()。web3JavaScript库与以太坊区块链交互。它可以检索用户帐户、发送交易、与智能合约交互等等。

从initWeb3中删除多行注释并将其替换为以下内容:

首先,我们检查我们是否使用现代dapp浏览器或更新版本的MetaMask,其中将以太坊提供程序注入到窗口对象中。如果是这样,我们使用它来创建我们的web3对象,但我们还需要使用ethereum.enable()显式请求访问帐户。

如果以太坊对象不存在,我们然后检查注入的web3实例。如果存在,则表明我们使用的是较旧的dapp浏览器(如Mist或较旧版本的MetaMask)。如果是这样,我们获取它的提供者并使用它来创建我们的web3对象。

如果不存在注入的web3实例,我们将基于本地提供者创建web3对象。(此回退适用于开发环境,但不安全且不适合生产环境。)

现在我们可以通过web3与以太坊进行交互,我们需要实例化我们的智能合约,以便web3知道在哪里可以找到它以及它是如何工作的。Truffle有一个名为@truffle/contract的库来帮助解决这个问题。它使有关合约的信息与迁移保持同步,因此您无需手动更改合约的部署地址。

仍然在/src/js/app.js中,从initContract中删除多行注释并将其替换为以下内容:

$.getJSON('Adoption.json',function(data){//Getthenecessarycontractartifactfileandinstantiateitwith@truffle/contractvarAdoptionArtifact=data;App.contracts.Adoption=TruffleContract(AdoptionArtifact);//SettheproviderforourcontractApp.contracts.Adoption.setProvider(App.web3Provider);//UseourcontracttoretrieveandmarktheadoptedpetsreturnApp.markAdopted();});注意事项:

我们首先为我们的智能合约检索工件文件。工件是关于我们合约的信息,例如其部署地址和应用程序二进制接口(ABI)。ABI是一个JavaScript对象,定义了如何与合约交互,包括其变量、函数及其参数。

一旦我们的回调中有工件,我们将它们传递给TruffleContract()。这会创建一个我们可以与之交互的合约实例。

实例化合约后,我们使用之前在设置web3时存储的App.web3Provider值设置其web3提供程序。

然后我们调用应用程序的markAdopted()函数,以防之前访问时已经收养了任何宠物。我们将其封装在一个单独的函数中,因为我们需要在任何时候对智能合约的数据进行更改时更新UI。

仍然在/src/js/app.js中,从markAdopted中删除多行注释并将其替换为以下内容:

varadoptionInstance;App.contracts.Adoption.deployed().then(function(instance){adoptionInstance=instance;returnadoptionInstance.getAdopters.call();}).then(function(adopters){for(i=0;i

我们访问部署的Adoption合约,然后在该实例上调用getAdopters()。

使用call()允许我们从区块链读取数据而无需发送完整的交易,这意味着我们不必花费任何以太币。

在调用getAdopters()之后,我们遍历所有这些,检查是否为每只宠物存储了一个地址。由于数组包含地址类型,以太坊用16个空地址初始化数组。这就是我们检查空地址字符串而不是null或其他虚假值的原因。

一旦找到对应地址的petId,我们禁用它的adopt按钮并将按钮文本更改为“Success”,以便用户得到一些反馈。

任何错误都会记录到控制台。

仍然在/src/js/app.js中,从handleAdopt中删除多行注释并将其替换为以下内容:

varadoptionInstance;web3.eth.getAccounts(function(error,accounts){if(error){console.log(error);}varaccount=accounts[0];App.contracts.Adoption.deployed().then(function(instance){adoptionInstance=instance;//ExecuteadoptasatransactionbysendingaccountreturnadoptionInstance.adopt(petId,{from:account});}).then(function(result){returnApp.markAdopted();}).catch(function(err){console.log(err.message);});});注意事项:

我们使用web3来获取用户的帐户。在错误检查后的回调中,我们然后选择第一个帐户。

发送交易的结果就是交易对象。如果没有错误,我们继续调用我们的markAdopted()函数以将UI与我们新存储的数据同步。

我们现在可以启动本地Web服务器并使用dapp。我们正在使用lite-server库来提供我们的静态文件。这与宠物店TruffleBox一起提供,但让我们来看看它是如何工作的。

在文本编辑器(在项目的根目录中)打开bs-config.json并检查内容:

{"server":{"baseDir":["./src","./build/contracts"]}}这告诉lite-server哪些文件要包含在我们的基本目录中。我们为我们的网站文件添加./src目录,为合约工件添加./build/contracts目录。

我们还在项目根目录的package.json文件中的脚本对象中添加了一个dev命令。scripts对象允许我们将控制台命令别名为单个npm命令。在这种情况下,我们只执行一个命令,但可能有更复杂的配置。这是您的外观:

"scripts":{"dev":"lite-server","test":"echo\"Error:notestspecified\"&&exit1"},当我们从控制台执行npmrundev时,这告诉npm运行我们的lite-server本地安装。

THE END
1.宠物行业智能宠物医院管理系统方案.doc宠物行业智能宠物医院管理系统方案TOC\o"1-2"\h\u13005第1章引言 3302561.1背景与意义 3193761.2系统目标 4272361.3系统功能概述 430240第2章宠物医院业务流程分析 528342.1业务流程概述 553022.2各业务环节需求分析 529582.3现有业务流程存在的问题 525645第3章系统架构设计 6311163.1系统总体架构 660543.1.1基础设施层 ...https://www.renrendoc.com/paper/358268595.html
2.收银系统教程,教你如何使用小程序收银系统收银系统教程,教你如何使用小程序收银系统客立满网易号 北京 3 打开网易新闻 体验效果更佳蔡正元很幽默引经据典,帮赖清德找到了祖宗,真的很强很厉害! 台海风云 1009跟贴 打开APP 湖北一女子,嫁到了上海 盈天爱搞笑 394跟贴 打开APP 36岁女人跟男闺蜜旅游潇洒了七天,回家后老公怒怼,还能过吗? 六哥情感 453...https://m.163.com/v/video/VLF9TQDTN.html
3.宠物店管理系统20231220184553.docx宠物店管理系统.docx,1 绪论 1.1 研究目的及意义 现在已经进入了信息系统发达的科技时代,通过网络我们可以更加方便与快捷的去计算和记忆平时我们手工繁琐操作都无法准确计算的数据及信息。随着人们饲养的宠物越来越多,很多商家抓住了商机越来越多的宠物店和宠物商场成立。https://m.book118.com/html/2023/1220/6204104112010023.shtm
4.商城小程序教程/订单管理/订单列表用户若已付款未发货可申请取消,需要管理员审核 ,审核通过金额原路返回 3.待收货订单:用户在小程序段可点击收货,若用户长时间没有收货,系统会根据商城管理-商城设置中的自动收货时间自动收货,收货之后,若该订单没有超过系统规定的售后时间(商城管理-商城设置中的售后时间),用户也可以申请退货,订单进入售后订单处理; ...http://www.futou.shop/a/gongnenjiaocheng/dingdanguanli/dingdanliebiao/index.html
5.91手机助手ForiPhone(苹果)详细使用教程.docx文档介绍:91手机助手ForiPhone详细使用教程91手机助手(iPhone版)是由网龙公司开发的一款PC端使用的iPhone手机第三方管理工具,以其美观的界面,方便的操作为一直以来iPhone手机没有方便的配套PC端使用工具提供了一套完美的解决方案,给您带来全新的操作体验。91手机助手ForiPhone点击下载一、91手机助手ForiPhone版简介91手机...https://m.taodocs.com/p-261125835.html
6.服务预约设置教程(通用版)一、教程介绍 登录门店系统后台之后,首先我们需要的是把服务预约进行配置,才能让会员进行预约。大部分门店员工上班时间是有早晚班,因此这一个板块讲到基础的服务预约设置整个流程。 该版本适用于有固定早晚班门店,例如:美容美发、宠物店、汽车美容、按摩足疗、美甲美睫等。 http://m.yun918.com/nd.jsp?id=1460
7.oh6数据合成教程车友交流提问23 款威朗车机怎么连接安卓手机啊,看视频教程用数据线连接,但是我的车机怎么没有百度那个什么啊 威朗...安装程序时要选择以管理员身份运行,尽管我登录的是系统管理员账户应该无差异,但最好这样做下;在导入...在新消费遇冷,大众消费欲望低迷的情况下,各种宠物店(宠物洗护服务)、宠物医院、宠物周边(自动饮水机,...https://www.dongchedi.com/tag/ugc/14648522
8.DjangoXadmin使用手册(文字目录高清)(官方教程)基于Java+Vue微信小程序的宠物店管理系统的设计与实现 论文.docx 上传者:qq_28582649时间:2024-10-26 深入Python中文教程pdf最新版本 《深入Python》 中文教程 pdf,英文名子叫:Dive Into Python。全面介绍Python语言。大致内容包括:安装Python、Python数据类型、对象和面向对象、异常和文件处理、正则表达式、单元测试、HT...https://www.iteye.com/resource/ysyangsha214-10051459
9.抖音可以直播卖和田玉吗?怎么在抖音上直播卖玉?分享教程!无论是不是的珠宝店,如何提高客流量是商家致力于解决的问题。基于抖音拥有庞大的用户基数,日活跃用户高达6亿,为珠宝饰品行业供给了庞大的客户数量 抖音对珠宝玉石管理的相当严,直播这类产品都需要提前获取直播权限,不然添加不了珠宝玉石类产品,还会被提醒,甚至违规。 https://hetian.11467.com/info/14457452.htm
1.SSM基于ssm宠物店管理6pd88带论文文档1万字以上,文末可获取本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。 系统程序文件列表 系统内容:用户,商品类别,商品信息,宠物档案,服务类型,宠物服务,服务预约,预约订单,流浪猫犬,申请收养 开题报告内容 一、课题名称 基于SSM框架的宠物店管理系统设计与实现 ...https://blog.csdn.net/CK3030/article/details/143455727
2.门店管理系统【库存管理】功能说明及操作教程 一、功能介绍 进销存管理是指对企业管理过程中采购(进)—>入库(存)—>销售(销)的动态管理过程,门店系统的进销存系统为门店提供采购、库存管理能力,解决商家线上线下全渠道库存售卖联动诉求,帮助商家精细化管理产品库存,提升货品管理效率、降低成本。https://m.yw-jz.com/h-nd-1316.html
3.门店系统进销存功能介绍及使用教程线下服务门店:随着新零售时代的发展,越来越多的服务型门店已经不满足于仅提供服务,开始围绕主营服务和用户定位开启多元化业务,深挖单客价值,比如美业门店卖美妆、护肤品、周边衣饰等,健身工作室、宠物店、汽车服务、口腔诊所等等都会搭售一些相关的实物产品,这是现在的趋势,所以线下服务门店也需要进销存来进行库存管理。https://www.guandayun.com/h-nd-1337.html
4.宠物店模拟器基础教程:详细教程+下载方法游戏简评宠物店模拟器这款游戏主要就是让我们来模拟经营一家宠物店,通过平时的采购,满足宠物需求,还要根据客户需求,来经营商店,最终目标就是实现宠物以及客户之间进行最好双向选择,幸福生活。 游戏简评 作为一款经营模拟类的游戏,宠物店模拟器主打的就是经营宠物店,通过出售合适的物品,来妥善照顾宠物的需求。 https://3g.ali213.net/gl/html/1374611.html
5.Open+CASCADE中文教程后端C++物流管理系统的设计与实现 开题报告 2024-10-23 14:56:19 积分:1 基于Java的宠物店管理系统 开题报告 2024-10-23 14:14:36 积分:1 实现最简 vue3 模型,用于深入学习 vue3 2024-10-23 12:37:12 积分:1 朋友圈转发截图生成装逼工具源码 2024-10-23 12:29:46 积分:1 2024最新版本安卓免...https://www.coder100.com/index/index/content/id/2782266
6.胁在宠物店买了一条哈士奇名叫当当,胁将狗遗弃,狗咬伤了正在...题库创建教程 创建题库 登录 创建自己的小题库 搜索 【单选题】小静在 宠物店买了一条哈士奇名叫当当,小静将狗遗弃,狗咬伤了正在跳广场舞的张奶奶...《民法典》第一千二百四十九条的规定:“遗弃、逃逸的动物在遗弃、逃逸期间造成他人损害的,由动物原饲养人或者管理人承担侵权责任。”A项错误,当当是小狗,不...https://www.shuashuati.com/ti/6ad539fbfcfb4fe28c0fdcc018ef10caa2.html
7.纳客会员收银安卓版下载纳客会员收银最新版下载v8.1.126该页面下载内容是安卓资源不适用于IOS系统软件介绍 猜你喜欢 本类排行 纳客会员收银app专为广大商铺门店所打造的掌上收银管理平台,该软件由湖北纳新网络科技有限公司所打造,整体界面清爽舒适,内置功能齐全操作简单易上手,并且还为广大商家们提供了非常多的营销小技巧,最大化增加门店收益,以及内置专业线上客服,服务周...http://m.ishaohuang.com/soft/152082.html
8.小微服务机器人平台体验小微服务机器人平台免费体验这里通过一个小相册来实现这个demo 查看教程:https://www.qcloud.com/doc/product/448/6404 下载源码...微搭低代码小程序模板体验 ] 看了一下,觉得宠物店这个不错,贴近生活,我们选择试用7天 [在这里插入图片...及时观察微信小程序数据和日常维护微信小程序制作完成上线后,企业可以隔天去微信小程序管理后台查看相关...https://cloud.tencent.com/developer/information/%E5%B0%8F%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%B9%B3%E5%8F%B0%E4%BD%93%E9%AA%8C
9.鸽子的养殖方法教程农技学堂3、饲养管理 在饲料方面,主要以稻谷、绿豆、玉蜀等种子为食,此外还必须吃一定分量的矿物质饲料,如黄泥、蚝壳粉、木炭灰等,如果当地有宠物店到店里应该能买到饲料,没有的话也可以自己配置。另外,每星期给它提供2-3次蔬菜,每次在中午提供,为了帮助消化,最好平时也喂点“保健砂”,也就是鸽土。 https://m.cnhnb.com/xt/article-62664.html
10.PHP网站源码下载APP小程序源码之家论坛正版源码坑位教程新版pbootcms网站模板宠物店宠物培训机构网站源码 宠物饲养育种机构类2024-11-03 【坑位】随心项目管理系统2024-11-03 【坑位】精美企业公司官网小程序+插件2024-11-03 亲 亲测坑位 新 海量更新 限 不限下载 售 完美售后 网站源码通常分很多种,有动态的,有静态的,也有动静结合的,静态的网站源码可以直接打开使用...https://www.esmo.cn/page/12
11.柯基幼犬饲养注意那些事项好酷屋教程网小编为您收集和整理了柯基幼犬饲养注意那些事项的相关教程:1、饲养管理柯基在幼犬期的时候,牙齿是比较脆弱的。因此我们在幼犬期的时候饲喂时,要注意用水将狗粮泡软在进行饲喂。对于一些有条件的养殖户可以使用羊奶进行浸泡,这样可以提高狗粮的营养价值。然后我们要注意喂 ...https://www.haoku5.com/shenghuo/643a9b5d16a889345d0add12.html
12.自制比熊狗粮的做法宠物店京韵国际名犬中心大家好,今天小编关注到一个比较有意思的话题,就是关于如何自制宠物狗粮的问题,于是小编就整理了4个相关介绍如何自制宠物狗粮的解答,让我们一起看看吧。 自制比熊狗粮的做法 自制粮不分犬种的,成分基本上大同小异。 最经济比例是肉:蔬菜:谷物=4:3:3 肉类千万不要选择猪肉,一般来说普遍选择鸡胸肉和牛肉,一般以鸡...https://www.jydogs.com/post/315830.html
13.软件架构设计师教程第二版电子书我们看一个具备好的架构设计的系统代码时,基本看到的都是设计模式,宠物店(pet store)就是这样的例子。或者可以这样说,一个好的架构设计基本是由简单明了的多个设计模式完成的。 3. 最灵活的拓展性:架构设计要具备灵活性 拓展性,这样,用户可以在你的架构上进行二次开发或更加具体的开发。 https://blog.51cto.com/u_16213629/11992550
14.黑月光舞蹈教程完整版最新章节黑月光舞蹈教程完整版聿见系统:现在你要回去重新攻略他,改走女主路线。云棠:!翻车是不可能翻车的,只要她洗白的够快,男主黑化的速度就追不上她!世界一:《每晚穿进暴君梦里》...完结文:《宠物店小老板》《快穿之我是大boss》《佛系快穿》《带着淘宝快穿》《我哥是大佬[快穿]》喜欢的朋友戳专栏收藏一下呗,谢谢。立意:温暖,治愈。https://www.630book.cc/kan/8623831.html
15.开元旗牌app下载开元旗牌app下载最新版大全2024-11-01 0:37「风调雨顺」开元旗牌app下载-官方网站/网站网页登陆入口/APP下载v9.38.19支持:64/128bit系统类型:开元旗牌app下载_安卓/IOS开元旗牌app下载最新V34.85.8全站下载V2.1.9(安全平台)官网入口是一款宠物店使用的管理办公软件,这款软件是千万宠物店老板地最...http://share.ecaf.cn/Oam/detail/qNdBgT.html