基于hyperleger fabric区块链的校园化妆品生意业务平台搭建
源码资料等获取方式在文章末尾
一、大数据与区块链办理方案概述
选题背景:
目前不少同学在校园里举行二手生意业务没有一个大众承认的平台,很多都是私下生意业务,但会存在很多虚伪生意业务,甚至出现诈骗事件,没有一个让校园同学承认放心的二手化妆品生意业务平台,基于这个生意业务题目,我们将校园二手化妆品生意业务与区块链技能结合来处理生意业务存在的题目,给校园内学生提供提供一个安全、公开、方便、美观的生意业务平台,让学生在校园生意业务的放心,买得放心,用的安心。不但可以生意业务平台的资产也可以添加我的售卖,自己成为卖家。
采用区块链技能架构的长处:
区块链采用了分布式核算和存储,不存在中央化的硬件或管理机构,因此使得恣意节点的权利和任务都是均等的。区块链的系统的一个开放性质的,除了生意业务各方的私有信息被加密外,区块链的数据对所有人公开的。在区块链中,任何人为的干预都是不起作用的,将对“人”的信托改成了对机器的信托。使得整个系统中的所有节点能够在去信托的情况自由安全的交换数据。在区块链中一旦信息颠末验证并添加至区块就会永久的存储起来无法举行修改。
区块链作为当下被推崇的一门技能重要长处为分布式记账、全流程记录、不可篡改性和加密技能。在区块链中都必须遵循同一记账生意业务规则,基于密码的算法同时每笔生意业务需要网络内其他用户的批准,核心分布式去中央化。区块链不可篡改和加密安全性采取了单向哈希算法,时间的不可逆性导致任何试图入侵篡改区块链内数据信息的举动都很容易被追溯,提高了对应的安全性。
二、应用场景需求分析
应用场景分析:
基于目前不少同学在校园里举行二手生意业务没有一个大众承认的平台,很多都是私下生意业务,但会存在很多虚伪生意业务,甚至出现相关二手化妆品生意业务诈骗事件,目前没有一个让校园同学承认放心的二手化妆品生意业务平台,基于这个生意业务题目,我们将校园二手化妆品生意业务与区块链技能结合来处理生意业务存在的题目,给校园内学生提供提供一个安全、公开、方便、美观的生意业务平台,让学生在校园生意业务的放心,买得放心,用的安心。不但可以生意业务平台的资产也可以添加我的售卖,自己成为卖家。
需求分析:
在校园内搭建一个基于Fabirc区块链的化妆品二手生意业务平台,学生以学院为单元(=>Org=>peer节点)加盟该平台;学生使用客户端连接本组织的peer节点参与生意业务。可以售卖化妆品、也可以购买化妆品;阅读过管理员平台公告后进入登录页面,学生通过学号认证后通过登录,学生在个人中央可以检察所有可生意业务的化妆品也可以检察自己的生意业务情况是否已经完成,也可以注册平台个人账号举行商品批评和交流检察个人信息,不但可以生意业务平台的资产也可以添加我的售卖,自己成为卖家;用户可以根据自己的需求选择差别的化妆品类型比如口红、香水、面部护理等。检察化妆品详情,收藏化妆品、参加购物车完成资产生意业务,退出的时间直接注销用户扫除个人登陆记录保护用户隐私。如许校园内学生生意业务大大提高了安全性和大众的承认,满足了很多学生的生意业务需求。
用户需求分析和用户组织结构设计:
三、平台功能设计及功能结构设计图
四、数据存储结构设计与链码开发
1、数据存储结构
生意业务资产以资产键值对(Key-Value)的方式存储:
- Key:id
- value {
- brand: '化妆品品牌名称',
- type: '化妆品类型',
- price: '$化妆品价格',
- owner: '拥有者',
- describe:'化妆品介绍',
- },
复制代码
2、链码开发与实现
启动startFabric.sh javascript脚本启动网络并摆设链码:
打开终端,进入到fabcar:
- cd /home/bsxy/github.com/hyperledger/fabric-samples/fabcar
复制代码 然后启动脚本:
- ./startFabric.sh javascript
复制代码
通过调用startFabric.sh脚本,我们就很方便的把区块链网络启动成功了。
对于我们的开发Fabric应用程序 ,我们需要按照下面操纵来举行启动:
新建终端输入:
- cd /home/bsxy/github.com/hyperledger/fabric-samples/fabcar
- /javascript
复制代码 然后我们需要在这个文件路径下安装一个art-template依赖包:
(如果这里安装art-template依赖包还是不行的话,试一下npm install)
然后我们再新建一个终端进入同一个目录:
- cd /home/bsxy/github.com/hyperledger/fabric-samples/fabcar
- /javascript
复制代码 该目录包含使用Node.js对应的Fabric SDK 开发的示例程序:
当我们创建网络的时间,一个管理员用户( admin)被证书授权服务器(CA)创建成了 注册员 。我们第一步要使用 enroll.js 程序为 admin 生成私钥、公钥和 x.509 证书。这个程序使用一个 证书签名请求 (CSR)——现在当地生成公钥和私钥,然后把公钥发送到 CA ,CA 会发布会一个让应用程序使用的证书。这三个证书会保存在钱包中,以便于我们以管理员的身份使用 CA 。
我们登记一个 admin 用户:
这个下令将 CA 管理员的证书保存在 wallet 目录。 您可以在 wallet/admin.id 文件中找到管理员的证书和私钥。
注册和登记应用程序用户:
更新账本:
然后我们就可以启动我们的应用程序l了:
然后我们可以对链上的资产举行增删改查:
我们简朴修改链上资产数据:
把资产编号MAKEUP1的迪奥香水代价把809修改为999
在终端利用query脚本查询一下链资产数据信息:
这里我们也是成功修改链上资产数据。
下面给各人详细先容一下系统功能:
功能一:调用智能合约初始化自界说链码:
- peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"initLedger","Args":[]}'
复制代码 功能二:通过调用智能合约初始化查询特定键值的资产:
- peer chaincode query -C mychannel -n fabmakeup -c '{"function":"queryMakeup","Args":["MAKEUP1"]}'
复制代码
功能三:通过调用智能合约初始化查询特定键值范围的资产:
- peer chaincode query -C mychannel -n fabmakeup -c '{"function":"queryMakeupsByRange","Args":["MAKEUP3",""]}'
复制代码
功能四:通过调用智能合约新增资产:
- peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"createMakeup","Args":["MAKEUP14","迪奥","香水","450","Lala","美白保湿"]}'
复制代码
功能五:通过调用智能合约修改资产属性:
- peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"updateMakeup","Args":["MAKEUP1","迪奥","香水","$820","gala","女士香水 魅惑清新淡香氛50ml 清新甜韵"]}'
复制代码
功能六:通过调用智能合约删除指定资产:
- peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"deleteMakeup","Args":["MAKEUP14"]}
复制代码
功能七:通过调用智能合约实现资产生意业务:
- peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"changeMakeupOwner","Args":["MAKEUP3","Lisksk"]}'
复制代码
功能八:调用链码实现更新资产信息 :
- peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"updateMakeup","Args":["MAKEUP1","迪奥","香水","$820","gala","女士香水 魅惑清新淡香氛50ml 清新甜韵"]}'
复制代码
功能九:判断资产是否存在:
- peer chaincode query -C mychannel -n fabmakeup -c '{"function":"makeupExists","Args":["MAKEUP1"]}'
复制代码
四、应用程序前端开发
在站长素材-分享综合设计素材的平台 (chinaz.com)找到项目符合的前端网页模板,然后修改数据和更改网页部分样式,末了通过前后端链接实现资产生意业务。客户端的重要作用是与Fabric区块链交互,实现对区块链的操纵。区块链操纵分为管理类和链码类的两种,管理类操纵包罗启停节点和配置网络等;链码类操纵重要是链码的生命周期管理,如安装、实例化以及调用链码。最常用的客户端是下令行客户端(CLI),此外是使用Fabric SDK开发的应用客户端。
开发者创建客户端应用和智能合约( chaincode ), Chaincode 被摆设到区块链网络的 Peer 节点上面。通过 chaincode 来操纵账本,当你调用一个生意业务 transaction 时,你实际上是在调用 Chaincode 中的一个函数方法,它实现业务逻辑,并对账本举行 get , put , delete 操纵。客户端应用提供用户交互界面,并提交生意业务到区块链网络上。
前端页面以用户体验效果为主,主页化妆品里面有化妆品分类、热销保举、扣头保举、化妆品详情、化妆品资讯,也可以进入我的个人主页检察个人订单和生意业务情况等。尽大概满足用户生意业务各方面需求,一些扣头和热销保举也方便用户做出生意业务决策。用户挑好自己符合喜欢的就可以放进购物车举行资产生意业务。每个化妆品分类页面又有各种差别的产品热销和扣头供用户挑选,
源主页面及其文件:
修改源码和美满后的主页面和文件:
使用pycharm对前端网页模板源码举行修改:
通过元素对应的源码举行更改删除或添加相关标签,美满页面布局和团体效果。
页面一:主页面及其商品分类和商品保举:
化妆品分类有:健康护理、皮肤护理、口红、面部护理、香水、天然护理。
对应路由: /index
页面二
显示化妆品所有资产信息
对应路由:
- else if(url_path == '/list'){
- query().then(async function(contract){
- const result = await contract.evaluateTransaction('queryAllMakeups');
- const result_json = JSON.parse(result);
- //response.end('Transaction has been evaluated, result is: ' + result.toString());
- const view = path.resolve(__dirname, 'views', 'list.html');
- list1 = template(view, {
- data:result_json
- });
- response.end(list1);
- });
复制代码
通过else if语句,用于查抄url_path是否即是’/list’。如果是,它会调用query()函数,并使用返回的contract对象来评估事务’queryAllMakeups’。然后,将结果解析为JSON,并存储在result_json变量中。
接下来,代码使用path.resolve()方法将view变量设置为’list.html’文件的路径。然后,调用template()函数,将view路径和result_json数据作为参数通报进去。返回的HTML模板存储在list1变量中。
末了,代码使用response.end()方法将list1 HTML模板作为相应发送给客户端。

页面三:举行化妆品资产生意业务

对应路由:

对应路由:
- else if(request.url == '/modify'){
- let formData = '';
- //接收post参数
- request.on('data',function(param){
- formData += param;
- });
- //post参数接收完毕
- request.on('end',function(){
- console.log(formData);
- const params = new URLSearchParams(formData);
- query().then(async function(contract){
- await contract.submitTransaction('updateMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
- //301代表重定向
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
- });
- else if(url_path == '/modify'){
- query().then(async function(contract){
- const result = await contract.evaluateTransaction('queryMakeup',params.get('id'));
- const result_json = JSON.parse(result);
复制代码 当收到 /modify 的 POST 请求时,服务器会监听请求的数据流,将数据拼接到 formData 变量中。
当数据流竣事(request.on(‘end’, …)),将 formData 解析为 URLSearchParams 对象,此中包含 POST 请求中提交的参数。使用 query() 函数返回的智能合约对象,调用 submitTransaction 方法实行更新操纵,通报 POST 请求中的参数。实行更新操纵后,通过相应头设置重定向到 /list,并竣事相应。
当收到 /modify 的 GET 请求时,使用 query() 函数返回的智能合约对象,调用 evaluateTransaction 方法实行查询操纵,通报大概的参数(这里大概应该是请求中的参数,如 params.get(‘id’))。
查询结果以字符串情势返回,通过 JSON.parse 解析为 JSON 对象,存储在 result_json 中。
在表明的位置,可以添加逻辑来处理查询结果,例如将其用于渲染修改页面。

页面四:添加生意业务化妆品资产
用户可以看到自己售卖化妆品的生意业务订单,也可以继承添加自己售卖的化妆品资产,在平台举行生意业务。



对应路由:
- if(request.method == 'POST'){
- if(request.url == '/add'){
- let formData = '';
- //接收post参数
- request.on('data',function(param){
- formData += param;
- });
- //post参数接收完毕
- request.on('end',function(){
- console.log(formData);
- const params = new URLSearchParams(formData);
- query().then(async function(contract){
- await contract.submitTransaction('createMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
- //301代表重定向
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
- });
复制代码 HTTP 方法查抄:首先,代码查抄请求的 HTTP 方法是否为 POST。
路径查抄:接着,代码查抄请求的路径是否为 ‘/add’。
数据接收:如果满足上述两个条件,代码开始监听请求的数据流 (request.on(‘data’, …)),将数据拼接到 formData 变量中。
数据解析:当数据流竣事 (request.on(‘end’, …)),将 formData 解析为 URLSearchParams 对象,此中包含 POST 请求中提交的参数。
智能合约操纵:使用 query() 函数返回的智能合约对象,调用 submitTransaction 方法实行创建操纵,通报 POST 请求中的参数。
重定向:实行创建操纵后,通过相应头设置重定向到 ‘/list’。
竣事相应:末了,竣事相应。
页面五:删除生意业务化妆品资产(选择所需要删除的化妆品资产)
对应路由:
- else if(url_path == '/remove'){
- query().then(async function(contract){
- await contract.submitTransaction('deleteMakeup',params.get('id'));
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
复制代码 路径查抄:首先,代码查抄请求的路径是否为 ‘/remove’。
智能合约操纵:如果请求路径为 ‘/remove’,则调用 query() 函数,该函数返回智能合约对象。然后,使用合约对象的 submitTransaction 方法实行 ‘deleteMakeup’ 操纵,通报参数 params.get(‘id’),即从请求中获取的特定 ID。
重定向:在删除操纵实行成功后,通过相应头设置重定向到 ‘/list’。
竣事相应:末了,竣事相应。
这段代码的作用是处理 ‘/remove’ 路径下的请求,调用智能合约的 deleteMakeup 方法来删除特定 ID 对应的记录,然后重定向到 ‘/list’。
六、应用程序服务端开发(注:对于分工内容,需详细形貌设计思绪和实现细节,非分工内容,只需截图)
1、路由一
Get:通过params参数获取,
- query().then(async function(contract){
- await contract.submitTransaction('createMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
- //301代表重定向
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
复制代码 首先,通过调用 query() 函数获取智能合约对象。然后,使用合约对象的 submitTransaction 方法实行 ‘createMakeup’ 操纵,通报了一系列参数,包罗 params.get(‘id’)、params.get(‘brand’)、params.get(‘type’)、params.get(‘price’)、params.get(‘owner’)、和 params.get(‘describe’)。
在智能合约事务实行成功后,通过相应头设置重定向到 ‘/list’。response.writeHead(301,{ Location: ‘/list’ }); 体现使用 301 状态码举行重定向,此中 301 体现永久性移动。末了,竣事相应。
总体来说,这段代码的作用是在智能合约上调用 createMakeup 方法来创建一个新的化妆品条目,然后重定向到 ‘/list’。
Post:
- if(request.method == 'POST'){
- if(request.url == '/add'){
- let formData = '';
- //接收post参数
- request.on('data',function(param){
- formData += param;
- });
- //post参数接收完毕
- request.on('end',function(){
- console.log(formData);
- const params = new URLSearchParams(formData);
复制代码 首先,代码查抄HTTP请求的方法是否为POST。这是通过 if(request.method == ‘POST’) 条件语句实现的。接着,代码查抄请求的URL是否为’/add’,通过 if(request.url == ‘/add’) 条件语句。如果方法和URL查抄都通过,代码创建一个空字符串 formData 用于存储接收到的POST参数。然后,通过监听 ‘data’ 事件,每当有新的数据块到达时,将其附加到 formData。
当所有POST参数都接收完毕时,通过监听 ‘end’ 事件,实行回调函数。在这个回调函数中,输出接收到的所有POST参数 console.log(formData) 并将其解析为 URLSearchParams 对象,存储在 params 变量中。
总体来说,这段代码用于在接收到POST请求时,查抄URL是否为’/add’,然后将POST参数收集到 formData 变量中,并通过 URLSearchParams 将其解析为键值对。
2、路由二
- Get:
- else if(url_path == '/modify'){
- query().then(async function(contract){
- const result = await contract.evaluateTransaction('queryMakeup',params.get('id'));
- const result_json = JSON.parse(result);
复制代码 首先,代码查抄URL路径是否为’/modify’。这是通过 else if(url_path == ‘/modify’) 条件语句实现的。
调用query函数:如果URL路径查抄通过,代码调用一个 query 函数。这个函数返回一个 Promise,大概是一个异步函数,因为在 query().then(async function(contract){}) 中使用了 async 关键字。
调用智能合约方法:在 then 的回调中,使用 contract 对象(大概是从 query 函数返回的)调用了 evaluateTransaction 方法。这看起来像是与某个智能合约的交互,此中使用了 ‘queryMakeup’ 作为生意业务名称,还通报了参数 params.get(‘id’)。
解析结果:接着,使用 JSON.parse(result) 将智能合约的返回结果(result)解析为 JSON 对象,存储在 result_json 变量中。
Post:
- let formData = '';
- //接收post参数
- request.on('data',function(param){
- formData += param;
- });
- //post参数接收完毕
- request.on('end',function(){
- console.log(formData);
- const params = new URLSearchParams(formData);
- query().then(async function(contract){
- await contract.submitTransaction('updateMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
- //301代表重定向
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
- });
复制代码 当服务器收到POST请求时,通过 request.on(‘data’, function(param){…}) 监听数据传输事件,并将数据逐块拼接到 formData 变量中。当数据传输完毕时,通过 request.on(‘end’, function(){…}) 触发回调函数,这里实行数据处理的逻辑。
日志输出:console.log(formData) 打印接收到的数据,大概用于调试目标。
使用 URLSearchParams 对象解析 formData,将其转换为包含所有参数的键值对。这些参数大概是通过POST请求发送的表单数据。使用 query 函数获取智能合约对象,然后调用 submitTransaction 方法,将从表单中获取的参数通报给 ‘updateMakeup’ 生意业务。这个过程大概会将新的化妆品信息提交到区块链或智能合约中。通过 response.writeHead(301, { Location: ‘/list’ }) 设置HTTP相应头,将浏览器重定向到’/list’页面。末了,通过 response.end() 竣事相应。
总体来说,这段代码的作用是处理POST请求,将接收到的表单数据通报给智能合约的 ‘updateMakeup’ 生意业务,并在处理完成后将浏览器重定向到’/list’页面。
Get:
- else if(url_path == '/remove'){
- query().then(async function(contract){
- await contract.submitTransaction('deleteMakeup',params.get('id'));
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
复制代码
Post:
- let formData = '';
- //接收post参数
- request.on('data',function(param){
- formData += param;
- });
- //post参数接收完毕
- request.on('end',function(){
- console.log(formData);
- const params = new URLSearchParams(formData);
- query().then(async function(contract){
- await contract.submitTransaction('updateMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
- //301代表重定向
- response.writeHead(301,{
- Location: '/list'
- });
- response.end();
- });
- });
复制代码 解析一下:
let formData = ‘’;:声明一个空字符串 formData 用于存储接收到的POST参数。
request.on(‘data’, function(param){…}):通过 request 对象监听 ‘data’ 事件,当有数据传输时,将数据累加到 formData 中。这是一个逐块接收POST数据的过程。
request.on(‘end’, function(){…}):监听 ‘end’ 事件,当数据传输完成时触发。在这个事件中,举行参数的处理和后续操纵。
console.log(formData);:打印接收到的formData,大概用于调试和查抄接收到的数据。
const params = new URLSearchParams(formData);:使用 URLSearchParams 对象解析 formData,将其转换为包含所有参数的键值对。这是将POST请求中的数据解析成易于处理的情势。
query().then(async function(contract){…}):调用 query 函数,该函数返回一个Promise。一旦Promise办理,实行一个包含智能合约操纵的异步函数。
await contract.submitTransaction(‘updateMakeup’, params.get(‘id’), params.get(‘brand’), params.get(‘type’), params.get(‘price’), params.get(‘owner’),params.get(‘describe’));:调用智能合约的 submitTransaction 方法,将从表单中获取的参数通报给 ‘updateMakeup’ 生意业务。这个过程大概会将新的化妆品信息提交到区块链或智能合约中。
response.writeHead(301, { Location: ‘/list’ });:设置HTTP相应头,将浏览器重定向到’/list’页面。HTTP状态码301体现永久性重定向。
response.end();:竣事HTTP相应。
这段代码的目标是处理接收到的POST请求,解析表单数据,调用智能合约提交生意业务,然后通过HTTP状态码301将浏览器重定向到’/list’页面。
七、应用程序扩展
八、应用程序团体展示
仔细看平台公告后然后进入用户认证:
管理员账号、密码:admin admin
普通用户账户、密码:user1 user123456
进入认证成功后登录主页:
通过商品分类选择自己想要的产品:
也可以注册和登录自己的私家账户:
选择符合的化妆品参加购物车举行生意业务:
也可以检察我的订单和所有可生意业务的化妆品资产:
关于化妆品品牌排行榜:
检察相关资讯:
也可以在批评区举行交流检察化妆品评价:
有题目和疑问可以向平台举行反馈:
应用平台流程图:
源码资料等获取方式
各位有爱好的小同伴 可以扫码要项目开发文档、完整项目源码和其它相关资料。
各位有爱好的小同伴 可以扫码要项目开发文档、完整项目源码和其它相关资料。
各位有爱好的小同伴 可以扫码要项目开发文档、完整项目源码和其它相关资料。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |