ダップクラウドファンディングプロジェクト(6)

このセクションでは、主にコスト要求の実装プロセスを実装します。

1.creatorFundingTab:フォームを作成し、リクエストを開始して、すべてのリクエストを表示します(すべてのリクエストを取得し、フォームを作成して表示します)

2.supportFundingTab:creatorFundingtabでフォームを再利用し、アプリケーションを承認します

3.CreatorFundingTab:支出アクションを実行します

1.アプリケーション

1.通話中の送信者を指定します

2. 2ページ目はクリック機能(コードの再利用)をサポートしています

3.作成コストリクエストフォームを設定します

支出フォームを作成する

render(){
        let {creatorFundingDetails,selectedFundingDetail,requestDesc,requestAddress,requestBalance}=this.state
        return(
            <div>
            <CardList details={this.state.creatorFundingDetails}
            onCardClick={this.onCardClick}
            />
            <CreateFundingForm/>
                {
                    <div>
                        <h3>发起付款请求</h3>
                        <Segment>
                            <h4>当前项目:{selectedFundingDetail.projectName}, 地址: {selectedFundingDetail.fundingAddress}</h4>
                            <Form onSubmit={this.handleCreateRequest}>
                                <Form.Input type='text' name='requestDesc' required value={requestDesc}
                                            label='请求描述' placeholder='请求描述' onChange={this.handleChange}/>

                                <Form.Input type='text' name='requestBalance' required value={requestBalance}
                                            label='付款金额' labelPosition='left' placeholder='付款金额'
                                            onChange={this.handleChange}>
                                    <Label basic>¥</Label>
                                    <input/>
                                </Form.Input>

                                <Form.Input type='text' name='requestAddress' required value={requestAddress}
                                            label='商家收款地址' labelPosition='left' placeholder='商家地址'
                                            onChange={this.handleChange}>
                                    <Label basic><span role='img' aria-label='location'>?</span></Label>
                                    <input/>
                                </Form.Input>

                                <Form.Button primary content='开始请求'/>
                            </Form>
                        </Segment>
                    </div>
                }

            </div>
        )
    }

2つの方法

 //表单数据变化时触发
    handleChange =(e,{name,value}) =>this.setState({[name]:value})
    handleCreateRequest =()=>{
        let {creatorFundingDetails,selectedFundingDetail,requestDesc,requestAddress,requestBalance}=this.state
        console.log(requestDesc,requestBalance,requestAddress)
    }

CreatorFundingTabページを変更し、currentFundingDetail、requestDesc、requestBalance、requestAddress状態変数を追加します。

state ={
        creatorFundingDetails :[],
        selectedFundingDetail:'',
        requestDesc:'',//purpose,项目方花费目的
        requestBalance:'',//cost,花费金额
        requestAddress:'',//seller,卖家地址

    }

支出要求ロジックを作成する

作成リクエスト機能を実現するためにinteraction.jsでメソッドを定義してから、メソッドをエクスポートします。

// 创建花费请求
const createRequest = (fundingAddress, purpose, cost, seller) => {
    return new Promise(async (resolve, reject) => {
        try { // 调用创建方法
            let accounts = await web3.eth.getAccounts();
            let fundingInstance = newFundingInstance();
            fundingInstance.options.address = fundingAddress;
            // function createRequest(string _purpose, uint256 _cost, address _seller) onlyManager public {
            let result = await fundingInstance.methods.createRequest(purpose, cost, seller).send({
                from: accounts[0],
            })
            resolve(result);
        } catch (e) {
            reject(e);
        }
    })
}

このメソッドをCreatorFundingTabファイルにインポートしてから、handleCreateメソッドで上記のメソッドを呼び出します。

支出要求の表示ページを作成する

commonsディレクトリに新しいRequestTableファイルを作成します。このファイルは、要求アプリケーションレコードを表示するためのテーブルを定義します。

import React from 'react'
import { Icon, Label, Menu, Table } from 'semantic-ui-react'

const RequestTable = () => (
    <Table celled>
        <Table.Header>
            <Table.Row>
                <Table.HeaderCell>花费描述</Table.HeaderCell>
                <Table.HeaderCell>花费金额</Table.HeaderCell>
                <Table.HeaderCell>商家地址</Table.HeaderCell>
                <Table.HeaderCell>当前赞成人数</Table.HeaderCell>
                <Table.HeaderCell>当前状态</Table.HeaderCell>
                <Table.HeaderCell>操作</Table.HeaderCell>
            </Table.Row>
        </Table.Header>

        <Table.Body>
            <Table.Row>
                <Table.Cell>
                    <Label ribbon>First</Label>
                </Table.Cell>
                <Table.Cell>Cell</Table.Cell>
                <Table.Cell>Cell</Table.Cell>
                <Table.Cell>Cell</Table.Cell>
                <Table.Cell>Cell</Table.Cell>
                <Table.Cell>Cell</Table.Cell>
            </Table.Row>
        </Table.Body>
    </Table>
)
export default RequestTable

CreatorFundingTabファイルにテーブルを導入します

支出要求の印刷に戻る

Interaction.jsファイルでメソッドを定義して、契約の支出要求レコードを取得し、メソッドをエクスポートします。

const showRequests = (fundingAddress) => {
    return new Promise(async (resolve, reject) => {
        try {
            let accounts=await web3.eth.getAccounts();
            // 获取Funding合约实例
            let fundingContract = newFundingInstance()
            fundingContract.options.address = fundingAddress
            // 调用合约方法获取请求总数
            let requestCount = await fundingContract.methods.getRequestCount().call({
                from:accounts[0],
            });
            // 定义一个数组,保存所有请求申请
            let requestDetails = []
            //遍历请求数量,依次获取每一个请求的详情,添加到数组中,最后使用promise返回
            for (let i = 0; i < requestCount; i++) {
                // 调用合约方法,根据索引查询请求申请
                let requestDetail = await fundingContract.methods.getRequestByIndex(i).call({
                    from:accounts[0],
                })
                // 把结果添加到数组中
                requestDetails.push(requestDetail)
            }
            resolve(requestDetails)
        } catch (e) {
            reject(e)
        }
    })
}

ボタンを作成し、onclick時にgetアクションをトリガーして、コンソールに出力します



{
                    <Button onClick={this.handleShowRequests}>申请详情</Button>
                    //<RequestTable/>
                }

このメソッドをCreatorFundingTabにインポートし、状態変数リクエストを定義して、すべてのリクエストを記録します。

onRequestDetailClickメソッドを定義します。このメソッドは、showRequestsメソッドを呼び出して、指定された契約の要求アプリケーションを取得し、それを状態変数に設定します。

状態変数をRequestTableに渡します。

RequestTableでリクエストを取得してから、リクエストをトラバースし、各リクエストを取得します。リクエストはデータの行に対応します。

データの行を生成して返すRowInfoメソッドを定義します

結果は次のことを示しています。

4.インターフェースに参加しているので、コスト申請の詳細も確認できます。

[上記のコードをコピー]

5.承認機能ボタンをrequestTableに追加します

承認機能を実装する-承認リクエストをトリガーするボタンを追加する

承認関数の記述:

1.契約住所を指定します 

2.選択要求のインデックスを指定します

コントロールボタンの表示:
pageKey = 2は支払いを示します3は承認を示します

コスト機能の実装-コストアクションをトリガーするボタンを追加

 

おすすめ

転載: blog.csdn.net/qq_38798147/article/details/109287695