Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台

$
0
0

第一节 简介

欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售商品,买家可以自由地购物:

ethereum dapp 以太坊DApp开发

  1. 去中心化: 和淘宝或eBay不同,我们把所有的商业逻辑和核心数据都放在以太坊区块链上,这使 得它成为一个完全去中心化的应用。和淘宝这样中心化的电商平台相比,一个去中心化的P2P电商应用显然有其独特的价值——至少你不用担心被平台封账户了。

  2. IPFS: 在以太坊上存储用于商品展示的图片和描述超文本十分昂贵,由于以太坊虚拟机的限制, 有时甚至是不可行的。为了解决这个问题,我们将会把商品图片和商品描述信息存储在同样去中心化的星际文件系统IPFS)中,而仅仅在链上保存这些数据的ID

  3. 商品拍卖: 对于卖家而言,拍卖显然是一种非常好的提升商品利润空间的销售手段。因此我们在课程项目中将实现去中心化环境下的维科瑞(Vickery)拍卖 —— 这非常类似于eBay的自动竞价系统,而不是简单地对商品进行固定标价。

  4. 资金托管: 中心化的平台有一个优点在于它天然提供了买卖双方之间的信任中介。在去中心化的环境中,我们将使用一个多方托管合约来应对买卖双方可能的风险,托管合约采用投票机制来决定买家货款的最终流向。

  5. 链下数据存储: 不要被去中心化限制我们的思维,传统的技术依然有其强大之处。我们将使用MongoDB在链下做一个同步的数据备份,以便实现单纯用区块链很难实现的功能:灵活的商品查询。

课程地址:http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6

第二节 去中心化,why?

在开始构建我们的应用之前,非常值得花一分钟时间,来理解为什么要在像以太坊这样的去中心化平台上搭建在线卖场。

eBay淘宝这样的C2C电商平台已经获得了巨大成功,因为它使得买卖双方都相当便利:

ebay-taobao 淘宝c2c电商平台

在互联网成为主流之前,人们只能在小范围内、或者在邻里之间买卖商品。当越来越多的人使用互联网, 出现了像eBay这样的平台,无论来自世界的任何一个地方,你都可以在网上买卖商品。无论是商家还 是消费者,这样的平台都有其价值。

尽管eBay这样的平台方便了大家,也改善了贸易和经济,但它也存在一些缺点:

  1. 被平台束缚。参与的商家受制于拥有平台的企业。在任何时候,平台拥有者可以自行决定在是否对某个商家进行封号处理,而如果商家严重依赖于平台,那么账号被封就是一个巨大的打击。

  2. 商家费用高。商家上架商品要交费,售出商品也要交佣金。收费本身并没有错,毕竟eBay这样的平台提供了服务。但是,上架费有时太高了,这导致商家最后盈利很少,或是将成本转嫁到消费者身上。

  3. 数据失控。商家或消费者都无法拥有本应属于自己的数据。评论、购买历史等等所有数据都为平台拥有者所有。比如,如果一个商家想要换一个提供商,或者想要导出商品评论或是其他数据都非常不容易,甚至不可能。

以太坊上构建的去中心化电商平台就解决了这些问题:商家的账户不会被封;数据也是公开的,所以很容易导出数据;相对于中心化的平台,交易佣金也会低得多。

第三节 初步的功能特性

现在你应该已经理解了为什么要构建去中心化的电商应用,也了解了我们要构建的应用是什么,现在让我们来大致看一下,在这个项目中将要实现的主要功能特性:

ebay user case

  1. 商品上架:应用应该支持卖家上架商品进行销售。我们将实现让任何人自由上架商品的功能。

  2. 商品浏览与搜索:应用应该支持买家方便地浏览商品列表。我们会实现浏览商品的功能,以及基于商品类别、拍卖时间等条件进行查询的功能。

  3. 商品拍卖:跟eBay一样,我们会实现维科瑞拍卖方式的商品竞价销售。由于以太坊上的一切交易都是公开的,因此我们的实现将会与中心化环境下有所不同。

  4. 资金托管:一旦出价结束,商品拍卖有了赢家以后,我们会创建由胜出的买方、卖方和任意第三方参与的托管合约,由托管合约来管理交易资金。

  5. 托管资金保护:为了保护托管资金,我们将采用多重签名(2/3)来实现防欺诈保护,即三个参与者有两个同意时,才会将托管资金释放给卖方,或是将托管资金返还给买方。

为了便于查询,我们会将商品数据同时存在链上和链下(数据库);同时,为了避免图片等数据占用昂贵的链上存储,我们将把图片和商品描述信息上传到同样去中心化IPFS网络。

课程地址:http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6

第四节 基础知识要求

为了顺利地完成本课程的学习,你应该对以下语言/技术有一些了解:

  1. Solidity/Truffle:课程将会深入使用solidity来编写合约。如果你还没有学过,建议你先学习一下以太坊开发DApp入门教程,这样至少写过一两个简单的合约。同时,对truffle开发框架的基本了解也会十分有助于完成本课程。

solidity truffle

  1. HTML/CSS/JavaScript:相比入门课程,本课程将会有更多的HTML和CSS代码。你应该对使用HTML/CSS构建前端有基本的了解。同时,我们将会进一步使用JavaScript。它会在服务端将数据保存到数据库,查询数据库并将结果返回给前端。web3.js用于前端与区块链的交互。为了适用各种背景的学习者,我们已经保持JavaScript代码尽可能地简单。

html css js web3.js

  1. Database:我们会用MongoDB在链下保存产品信息。无须特别了解MongoDB,但是基本的数据库知识有助于你顺利完成本课程的。

mongodb

第五节 系统架构

在开始着手具体的实现之前,先来看一下在本课程我们将要构建的去中心化电商DApp架构

ebay dapp architecture

  1. Web前端:web前端使用HTML/CSS/JavaScript开发,其中大量使用了web3js来访问区块链。用户将会通过这个前端应用来访问以太坊IPFSNodeJS服务器。

  2. 以太坊区块链:这是去中心化应用的核心,所有的代码(电商合约资金托管合约)和交易都存储在链上,这包括所有的商品信息、买家的出价信息、商品竞价结果、资金流向投票结果等。

  3. MongoDB:尽管核心数据存储在区块链上,但是为了方便买家对商品的检索和查询,例如只显示某一类的商品,或者显示即将过期的商品等等,我们会用MongoDB数据库来同步地存储和检索商品信息。

  4. NodeJS服务器:这是后端服务器,我们会利用它给前端提供REST风格的API来查询商品, 同时,也利用它来响应对前端静态页面的请求。

  5. IPFS: 当卖家上架一个商品时,前端会商品图片文件和介绍文本上传到IPFS,并将所上传文件的哈希值存到链上。

第六节 理解架构的作用

为了帮助理解上一节谈到的那些组件的作用,让我们来看看一下卖家上架一个商品的流程:

ebay list item

  • (1)前端使用一个HTML表单来采集用户输入的商品细节,例如起拍价、商品图片、描述信息等。

  • (2)(3) 前端将商品图片和介绍文本上传到IPFS,并返回所上传内容对应的链接(哈希)。

  • (4)(5) 然后,web前端会调用电商合约将商品信息IPFS链接存储到链上。当合约成功地将商品存入区块链后,就会触发一个事件,该事件中包含了商品所有的信息。

  • (6)(7)(8) NodeJS服务器监听区块链事件,当事件被电商合约触发时,服务器读取事件内容并将商品信息插入到MongoDB数据库中。

当开始具体实现商品上架这一特性时,我们将重温这一流程。

第七节 敏捷开发

我们将采用敏捷开发的思想来实现去中心化电商DApp

scrum way

我们将全部的产品特性分别列入8个迭代周期,通过每一次的冲刺sprint),我们都将得到一个可以发布的版本:

前两个冲刺主要集中在使用soliditytruffle框架实现电商合约方面,这包括合约的设计、开发 、编译、部署与测试

  • sprint-1:实现电商合约的商品上架和展示方法。

  • sprint-2:实现电商合约的商品竞价和出价揭示方法。 在电商合约基本实现之后,接下来的三个冲刺主要集中在前端用户界面的构建方面,这包括使用web3 与合约的交互,以及通过ipfs的开发接口上传图片等数据交互,当然,还有必不可少的DOM操作:

  • sprint-3:为买家提供商品浏览界面。

  • sprint-4:为卖家提供商品上架操作界面。

  • sprint-5:为买家提供商品详情界面、竞价表单以及出价揭示表单。在接下来的两个冲刺里,我们将首先实现资金托管合约,用来管理竞价结束后胜出买家的资金;然后实现相应的用户操作界面。

  • sprint-6:实现资金托管合约。

  • sprint-7:基于资金托管合约,为参与托管各方提供操作界面。最后,为了便于商品的查询检索,我们将使用MongoDB来实现商品数据的链下存储。

  • sprint-8:实现链下数据的同步与数据查询。

课程地址:http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6


[问答] Cocos、Egret、Laya ,微信小程序游戏开发用哪一个引擎好呢?

$
0
0

Cocos、Egret、Laya ,微信小程序游戏开发用哪一个引擎好呢?

请不要再发薅羊毛帖子

mongoose schema ref

$
0
0

mongoose schema ref ref :“user” 后面必须是 数据库表名么

前端页面缓存js文件的问题,appendChild的时候很慢 求解

$
0
0

前端把vue.js echart.js缓存到了 localStorage 里, 刷新页面的时候取localStorage里的,然后把这两个js内容 appendChild到body后面 代码如下: var time1 = Date.now(); var script = document.createElement(“script”); script.type = “text/javascript”; script.innerHTML = text; //这个text内容比较大 document.body.appendChild(script); var time2 = Date.now(); console.log(‘append 完成’, time2 - time1);

time2 - time1 时间比较长 大概700ms,

请大神指点

node 使用request-promise模块生成的乱码问题

$
0
0

如标题所示:使用request-promise模块post提交数据时,在数据库(gb2312)查看时,发现是乱码,怎么解决?

注意: 我问的问题是,post提交数据时,数据在数据库是以乱码形式存储的,而不是get到数据产生的乱码,这个问题虽然也有,但我用iconv-lite模块已经解决。

英语专业女生,做了两年外贸,想换行做互联网,求推荐合适的岗位

[长沙]懒猫旅行招高级前端工程师

$
0
0

薪资可谈。公司B轮,准备冲刺创业板。有免费中餐和午餐,每年国外旅游、免费年检。长沙房价低,租房更是低。团队气氛好,平均年龄25,发展空间大。求各路大神的简历~ 技术栈目前是react全家桶以及rn和node,想玩后台、APP、web随你选。当然,如果你觉得自己在其他的方向上很牛逼,也可以在团队内安利。 微信图片_20180330171055.jpg拉钩地址: https://www.lagou.com/jobs/4340894.html?source=pl&i=pl-1智联地址: http://jobs.zhaopin.com/635996420250049.htm?ssidkey=y&ss=201&ff=03&sg=7d575a6488ac42dca077403919333fa0&so=8&uid=204920585前程无忧: https://jobs.51job.com/changsha-ylq/93292063.html?s=01&t=0


[上海五角场] 聪明派招聘 Node.js工程师 + 小程序工程师 + CocosCreator工程师 + 实习生

$
0
0

聪明派是一家致力于培养4-12岁中国学生语数英学科素养、学习兴趣、学习能力和学习习惯的在线教育初创公司。聪明派研发团队以儿童认知发展里程碑和中国义务教育教学标准为基础,设计标准化的课程内容、游戏化的互动形式、个性化的测评反馈和社群化的家长服务,强化学生对语数英学科知识的掌握和应用,促进学生与学习相关的认知能力的发展,激发学生的学习内驱力,帮助学生为幼升小以及小学阶段的学业做好准备,让家长更省心、更放心。团队核心成员毕业于哈佛大学、哥伦比亚大学、复旦大学等知名学府,在北美和中国互联网巨头以及大型教育机构拥有多年互联网产品设计与运营以及教育产品研发的经验。公司已完成天使轮融资。

简历请发 hiring@congmingpai.onaliyun.com简历投递 https://www.wjx.top/jq/21987077.aspx

高级后端开发工程师 (Node.js)

职位职责:

  1. 负责设计和架构关键业务相关的多种微服务
  2. 使用Node.js进行REST/GraphQL API的研发
  3. 对接第三方SDK/API,如支付/广告
  4. 和前端及App工程师技术合作

任职要求:

  1. 3年以上后端开发经验,1年以上Node.js经验。
  2. 精通JavaScript和Node.js基本设计模式,ES6及标准库
  3. 熟悉Egg.js/Koa.js/Express.js等后端框架中的一种
  4. 熟练使用MySQL,并有数据库设计、优化经验
  5. 熟练使用Git和Github
  6. 具备较好的沟通、理解、表达、逻辑能力、学习能力和执行力

具备以下条件优先:

  1. 熟悉Typescript/Flow
  2. 了解Redis,MongoDB等NoSQL数据库
  3. 英语阅读/沟通能力优秀
  4. 贡献过开源项目
  5. 有前端/移动端开发经验和能力

前端开发工程师

职位职责:

  1. 负责公司网站,活动页面(H5)及微信小程序的开发
  2. 负责搭建前端基础设施,如持续集成、可复用组件库
  3. 和运营团队密切合作,完成运营任务

任职要求:

  1. 2年以上前端开发经验
  2. 精通JavaScript(ES6),CSS3,HTML5等前端基础技术
  3. 熟悉React.js/Angular.js/Ember.js等现代前端框架
  4. 熟练使用Git和Github
  5. 具备较好的沟通、理解、表达、逻辑能力、学习能力和执行力

具备以下条件优先:

  1. 有过构建前端基础设施的经验
  2. 有前端项目性能及兼容性优化的经验
  3. 熟悉Typescript/Flow
  4. 英语阅读/沟通能力优秀
  5. 贡献过开源项目
  6. 有后端/移动端开发经验和能力

Cocos2d-x / Cocos Creator 开发工程师

职位职责:

  1. 使用Cocos2d-x / Cocos Creator进行互动型教育App的开发
  2. 和PM,美术/设计及后端工程师合作完成任务

任职要求:

  1. 2年以上Cocos2d开发经验
  2. 精通Cocos2d / Cocos Creator接口
  3. 熟悉JavaScript
  4. 熟悉App开发及上线流程
  5. 熟练使用Git和Github
  6. 具备较好的沟通、理解、表达、逻辑能力、学习能力和执行力

具备以下条件优先:

  1. 有iOS或Android的开发经验
  2. 熟悉Typescript/Flow
  3. 英语阅读/沟通能力优秀
  4. 贡献过开源项目
  5. 有前端/后端开发经验和能力

前端开发实习生

职位职责:

  1. 参与开发微信小程序,H5活动页面和公司网站
  2. 参与搭建前端基础设施,可复用组件库
  3. 和运营团队合作完成运营任务

任职要求:

  1. 计算机或相关专业本科或研究生在校
  2. 熟悉JavaScript(ES6),CSS3,HTML5等前端基础技术
  3. 具备较好的沟通、理解、表达、逻辑能力、学习能力和执行力

具备以下条件优先:

  1. 熟悉React.js/Angular.js/Vue.js等现代前端框架
  2. 熟练使用Git和Github
  3. 贡献过开源项目
  4. 有后端/移动端开发能力

后端开发实习生 (Node.js)

职位职责:

  1. 参与设计和架构关键业务相关的多种微服务
  2. 使用Node.js进行REST/GraphQL API的研发
  3. 和前端及App工程师技术合作

任职要求:

  1. 计算机或相关专业本科或研究生在校
  2. 熟悉JavaScript和Node.js基本设计模式,ES6及标准库
  3. 具备MySQL等关系数据库使用和设计知识
  4. 具备较好的沟通、理解、表达、逻辑能力、学习能力和执行力

具备以下条件优先:

  1. 熟悉Koa.js/Express.js等后端框架中的一种
  2. 熟练使用Git和Github
  3. 贡献过开源项目
  4. 有前端/移动端开发能力

前来社区求助,mongoDB 有自动根据数据库字段生成文档的工具吗?Node.js 模块也行。

高并发情况下,缓存失效,怎么让多个请求只有一个请求去取数据,其他请求阻塞?

$
0
0

在高并发情况下,多个相同的请求同时从缓存中取数据,缓存没命中,然后都穿透缓存去查询数据库,这样请求都打到数据库上了,对数据库造成了压力,还会造成频繁的缓存更新。

我的想法是设置一个锁,只有一个请求拿到锁,然后去取数据,从数据库查询到数据后,写入缓存,然后其他请求从缓存中取数据,关键是怎么让其他请求阻塞,想到redis的订阅-发布,但是没有具体的思路,怎么实现?请各位大神解惑。。。。。。

90%面试都不会问的题,因为...

找人共同开发一个自由职业者平台

$
0
0

技术栈:React + Typescript 需要实现的东西: 一个发布和管理自由职业者信息的平台 后端接口使用GraphQL,已经全部都完成了,现在就差前端这块的代码。 有想接私活的朋友可以加我微信 18626877338 ,报酬啥的都好说。

请问path to favicon.ico is required是什么错呢

$
0
0

毕设要做一个个人微博,我在网上找了一个想做参考,但是把所有模块补全后出了这么一个错,刚入门Node,网上也搜不到,请指教 出错位置:F2(JS`EG9~KG04Y)EUP@7GP.png报错:“C:\Program Files\JetBrains\WebStorm 2017.3.5\bin\runnerw.exe” “C:\Program Files\nodejs\node.exe” D:\blog\microblog\app.js D:\blog\microblog\node_modules\serve-favicon\index.js:55 throw new TypeError(‘path to favicon.ico is required’) ^

TypeError: path to favicon.ico is required at favicon (D:\blog\microblog\node_modules\serve-favicon\index.js:55:11) at Object.<anonymous> (D:\blog\microblog\app.js:23:9) at Module._compile (module.js:643:30) at Object.Module._extensions…js (module.js:654:10) at Module.load (module.js:556:32) at tryModuleLoad (module.js:499:12) at Function.Module._load (module.js:491:3) at Function.Module.runMain (module.js:684:10) at startup (bootstrap_node.js:187:16) at bootstrap_node.js:608:3

Process finished with exit code 1

阿里云服务器、1年99元、3年279元,要买的上车了!活动时间有限!抓紧时间!


博客用的社区的编辑器,光标老是错位

$
0
0

Animation.gif效果如上面这个gif图,不知道怎么回事,望高手帮忙

阿里云服务器3年只要279,快上车

在TS中Sequelize的Model和Instance应该怎么声明?

$
0
0
// model/user.ts
import {Application} from "egg";

export default (app: Application) => {
    const {STRING} = app.Sequelize
    const user = app.model.define('user', {
        account: STRING(50),
        password: STRING(50),
        userName: {
            type: STRING,
            field: 'user_name',
        },
        displayPhoto: {
            type: STRING,
            field: 'display_photo'
        },
        accessToken: {
            type: STRING,
            field: 'access_token',
        }
    })
    user.associate = function () {
        const {User, Auth, Role, UserRole} = app.model
        User.hasMany(Auth)
        User.belongsToMany(Role, {through: {model: UserRole}})
    }
    return user
}
//index.d.ts
declare interface UserModel extends BaseModel {
    account: string,
    password: string,
    userName: string,
    displayName: string,
    accessToken: string
}
declare module 'egg' {
    interface Application {
        Sequelize: SequelizeStatic
        model: Sequelize & Context["model"]
    }

    interface Context {
        model: {
            Menu: Model<MenuModel, any>
            Role: Model<RoleModel, any>
            RoleMenu: Model<RoleMenuModel, any>
            User: Model<UserModel, any>
            Auth: Model<AuthModel, any>
            UserRole: Model<UserRoleModel, any>
        }
    }
}

这样写大部分功能都是能通的,但我现在希望调用实例的get({plain:true})的方法,webstorm就会报错 QQ图片20180331133559.png

//实现这样一个service方法
async getMenuTree(){
	const all_menu=await model.Menu.findAll()
	all_menu.forEach(item=>{
		item.get({plain:true})    //报错
		//发现调用model.Menu.create() model.Menu.update()得到的数据都不能调用.get()方法。		
	})	
}

上面的item和model.Menu.create()返回的类型应该是Instance吧,如何让findAll,create等返回Instance?对泛型数据云里雾里的

JavaScript版 数据结构与算法

$
0
0

立项之初

使用 JavaScript 来做数据结构与算法, 是为了把数据结构和算法理解的更加清楚, 更是为了让 JavaScript 为更多人所知!

传送门 url https://github.com/MasterShu/JavaScript-algorithm

已完成

  • 插入排序
  • 归并排序
  • 选择排序
  • 快速排序
  • 三路快排
  • 二叉堆结构
  • 二叉堆排序

持续集成中…

// TODO

angular5 跨域访问不携带cookie

$
0
0

最近做一个项目 采用的是angular5框架,后端走cookie session 认证机制,登陆接口服务端有set-cookie 但是发起请求时没有cookie,这个问题怎么解决啊,查了一些资料是可能是跨域引起的问题,尝试解决也没解决,有什么方法么?

Viewing all 14821 articles
Browse latest View live