user-zzy-dev #2

Merged
gary merged 4 commits from user-zzy-dev into dev 2022-07-20 11:47:56 +08:00
12 changed files with 361 additions and 40 deletions
Showing only changes of commit 97f8961e0b - Show all commits

View File

@ -0,0 +1,5 @@
export enum CoinType {
ETH = 'eth',
TRON = 'tron',
}
export default CoinType;

View File

@ -0,0 +1,67 @@
import React, { useState } from 'react';
import { createForm } from '@formily/core';
import { createSchemaField } from '@formily/react';
import Modal, { ModalProps } from '@/components/Modal';
import { message } from 'antd';
import { Form, FormItem, Input, Submit } from '@formily/antd';
import { AddAddress } from '@/services/eth';
import { initWeb3, walletSign } from '../../../../utils/web3';
import { values } from 'lodash';
interface AddAddressModalPropsType extends ModalProps {
onOk: (val: any) => void;
}
const SchemaField = createSchemaField({
components: {
FormItem,
Input,
Submit,
},
});
const form = createForm({});
const AddAddressModal = (onOk, { ...rest }: AddAddressModalPropsType) => {
const handleOk = () => {
const val = form.getState();
console.log('val = ', val);
onOk && onOk(val);
// try {
// await initWeb3();
// const signInfo = await walletSign();
// val.key = signInfo.raw;
// val.sign = signInfo.sign;
// val.coinType = 'eth';
// val.num = parseInt(val.num);
// const params = { ...val };
// await AddAddress(params);
// message.success('操作成功');
// } catch (e) {}
};
return (
<Modal title="添加地址" onOk={handleOk} width={800} {...rest}>
<Form form={form} labelCol={4} wrapperCol={18}>
<SchemaField>
<SchemaField.String
name="alias"
title="备注"
required
x-decorator="FormItem"
x-component="Input"
/>
<SchemaField.Number
name="num"
title="数量"
required
x-decorator="FormItem"
x-component="Input"
/>
</SchemaField>
</Form>
</Modal>
);
};
export default AddAddressModal;

View File

@ -0,0 +1,70 @@
import React, { useState } from 'react';
import { createForm } from '@formily/core';
import { createSchemaField } from '@formily/react';
import { message, Spin } from 'antd';
import DetailPageContainer from '@/components/DetailPageContainer';
import { AddAddress } from '@/services/eth';
import { initWeb3, walletSign } from '../../../../utils/web3';
import { Form, FormItem, Input, FormButtonGroup, Submit } from '@formily/antd';
const SchemaField = createSchemaField({
components: {
FormItem,
Input,
Submit,
},
});
const form = createForm({});
const WorkEdit = () => {
const [loading, setLoading] = useState(false);
const handleSubmit = async (val) => {
setLoading(true);
try {
await initWeb3();
const signInfo = await walletSign();
val.key = signInfo.raw;
val.sign = signInfo.sign;
val.coinType = 'eth';
val.num = parseInt(val.num);
const params = { ...val };
await AddAddress(params);
message.success('操作成功');
setLoading(false);
history.back();
} catch (e) {
setLoading(false);
}
};
return (
<DetailPageContainer>
<Spin spinning={loading}>
<Form form={form} labelCol={4} wrapperCol={18} onAutoSubmit={handleSubmit}>
<SchemaField>
<SchemaField.String
name="alias"
title="备注"
required
x-decorator="FormItem"
x-component="Input"
/>
<SchemaField.Number
name="num"
title="数量"
required
x-decorator="FormItem"
x-component="Input"
/>
</SchemaField>
<FormButtonGroup.FormItem>
<Submit block size="large">
</Submit>
</FormButtonGroup.FormItem>
</Form>
</Spin>
</DetailPageContainer>
);
};
export default WorkEdit;

View File

@ -0,0 +1,76 @@
import React, { useRef, useState } from 'react';
import Table, { ProColumns, ActionType } from '@/components/Table';
import { history } from 'umi';
import RoutePath from '@/routes/routePath';
import { queryAddressList } from '@/services/eth';
import { fetchTableData } from '@/utils/table';
import CoinType from '@/constants/enum/coinType';
// import WorkSelectModal from '@/widget/Work/WorkSelectModal';
// import AddAddressModal from '../Edit/AddAddressModal';
const AddressList = () => {
// const [isModalVisible, setIsModalVisible] = useState(false);
const tableRef = useRef<ActionType>();
const columns: ProColumns<any>[] = [
{
title: '备注',
dataIndex: 'remarks',
width: '20%',
// hideInSearch: true,
},
{
title: '地址',
dataIndex: 'address',
hideInSearch: true,
ellipsis: true,
},
// {
// title: '余额',
// dataIndex: 'series',
// hideInSearch: true,
// },
{
title: 'key',
dataIndex: 'key',
hideInSearch: true,
},
];
return (
<div>
<Table
columns={columns}
// indexColumn
rowKey="id"
actionRef={tableRef}
toolBarActions={[
{
type: 'add',
onConfirm: () => {
history.push(RoutePath.ETH_ADDRESS.EDIT);
// setIsModalVisible(true);
},
},
]}
request={async (params) => {
params.coinType = CoinType.ETH;
return fetchTableData(queryAddressList, params);
}}
/>
{/* <WorkSelectModal
visible={isModalVisible}
value={[]}
onOk={function (val: any): void {
setIsModalVisible(false);
}}
/> */}
{/* <AddAddressModal
visible={isModalVisible}
onOk={function (val: any): void {
setIsModalVisible(false);
}}
/> */}
</div>
);
};
export default AddressList;

View File

@ -0,0 +1,81 @@
import React, { useRef } from 'react';
import Table, { ProColumns, ActionType } from '@/components/Table';
import { queryRecordList } from '@/services/eth';
import { fetchTableData } from '@/utils/table';
import CoinType from '@/constants/enum/coinType';
import { web3 } from '@/utils/web3';
const AddressList = () => {
const tableRef = useRef<ActionType>();
const columns: ProColumns<any>[] = [
{
title: '交易哈希',
dataIndex: 'txHash',
// width: '20%',
// hideInSearch: true,
},
{
title: '金额',
dataIndex: 'amount',
// hideInSearch: true,
// ellipsis: true,
},
{
title: '位数',
dataIndex: 'decimals',
// hideInSearch: true,
// ellipsis: true,
},
{
title: '区块',
dataIndex: 'blockNumber',
// hideInSearch: true,
},
{
title: '发送地址',
dataIndex: 'from',
// hideInSearch: true,
// ellipsis: true,
},
{
title: '接受地址',
dataIndex: 'to',
// hideInSearch: true,
},
];
return (
<div>
<Table
columns={columns}
// indexColumn
rowKey="id"
actionRef={tableRef}
// toolBarActions={[
// {
// type: 'add',
// onConfirm: () => {
// history.push(RoutePath.ETH_ADDRESS.EDIT);
// setIsModalVisible(true);
// },
// },
// ]}
request={async (params) => {
params.coinType = CoinType.ETH;
const res = await fetchTableData(queryRecordList, params);
for (const key in res.data) {
if (Object.prototype.hasOwnProperty.call(res.data, key)) {
const element = res.data[key];
element.amount = web3.utils
.toBN(element.amount)
.div(web3.utils.toBN(Math.pow(10, Number(element.decimals))))
.toNumber();
}
}
return res;
}}
/>
</div>
);
};
export default AddressList;

View File

@ -16,7 +16,7 @@ const Login: React.FC = () => {
await initWeb3();
const signInfo = await walletSign();
const res: any = await login({ data: signInfo.raw, sign: signInfo.sign });
localStorage.setItem(CACHE_TOKEN, res.token);
localStorage.setItem(CACHE_TOKEN, res);
// const res: any = await login({ ...values });
// localStorage.setItem(CACHE_TOKEN, res.token);
/** 此方法会跳转到 redirect 参数所在的位置 */
@ -25,7 +25,6 @@ const Login: React.FC = () => {
const { redirect } = query as { redirect: string };
history.push(redirect || '/');
};
return (
<div className={styles.container}>
<div className={styles.content}>

View File

@ -7,6 +7,7 @@ import RoutePath from '@/routes/routePath';
import { queryWorkList, deleteWork } from '@/services/work';
import { fetchTableData } from '@/utils/table';
import TimeText from '@/components/Typography/TimeText';
import WorkSelectModal from '@/widget/Work/WorkSelectModal';
const WorkList = () => {
const tableRef = useRef<ActionType>();
@ -74,6 +75,7 @@ const WorkList = () => {
},
];
return (
<div>
<Table
columns={columns}
// indexColumn
@ -91,6 +93,10 @@ const WorkList = () => {
return fetchTableData(queryWorkList, params);
}}
/>
<WorkSelectModal value={[1, 2, 3]} onOk={function (val: any): void {
throw new Error('Function not implemented.');
} } />
</div>
);
};

View File

@ -16,39 +16,33 @@ export default [
routes: [
{
path: RoutePath.ETH,
redirect: RoutePath.ADDRESS.LIST,
redirect: RoutePath.ETH_ADDRESS.LIST,
hideInMenu: true,
},
{
name: 'ETH地址管理',
path: RoutePath.ADDRESS.LIST,
component: './Work/List',
path: RoutePath.ETH_ADDRESS.LIST,
component: './Eth/Address/List',
},
{
name: 'ETH地址详情',
path: RoutePath.ADDRESS.EDIT,
path: RoutePath.ETH_ADDRESS.EDIT,
hideInMenu: true,
component: './Work/Edit',
component: './Eth/Address/Edit',
},
{
name: 'ETH充值记录',
path: RoutePath.RECORD.LIST,
component: './Work/List',
},
{
name: 'ETH充值详情',
path: RoutePath.RECORD.EDIT,
hideInMenu: true,
component: './Work/Edit',
path: RoutePath.ETH_RECORD.LIST,
component: './Eth/Record/List',
},
{
name: 'ETH币种管理',
path: RoutePath.CURRENCY.LIST,
path: RoutePath.ETH_CURRENCY.LIST,
component: './Work/List',
},
{
name: 'ETH币种详情',
path: RoutePath.CURRENCY.EDIT,
path: RoutePath.ETH_CURRENCY.EDIT,
hideInMenu: true,
component: './Work/Edit',
},
@ -79,7 +73,7 @@ export default [
},
{
path: '/',
redirect: RoutePath.WORK.LIST,
redirect: RoutePath.ETH_ADDRESS.LIST,
},
{

View File

@ -3,15 +3,14 @@ const ETH = '/eth';
const RoutePath = {
LOGIN: '/login',
ETH: ETH,
ADDRESS: {
ETH_ADDRESS: {
LIST: `${ETH}/address`,
EDIT: `${ETH}/address/edit`,
},
RECORD: {
ETH_RECORD: {
LIST: `${ETH}/record`,
EDIT: `${ETH}/record/edit`,
},
CURRENCY: {
ETH_CURRENCY: {
LIST: `${ETH}/currency`,
EDIT: `${ETH}/currency/edit`,
},

25
src/services/eth.ts Normal file
View File

@ -0,0 +1,25 @@
import request from '@/utils/request';
export const queryAddressList = (data) => {
return request.request({
url: '/admin/api/v1/address/get',
method: 'post',
data,
});
};
export const AddAddress = (data) => {
return request.request({
url: '/admin/api/v1/address/mask',
method: 'post',
data,
});
};
export const queryRecordList = (data) => {
return request.request({
url: '/admin/api/v1/records/get',
method: 'post',
data,
});
};

View File

@ -9,8 +9,7 @@ export const fetchTableData = async (
delete params.current;
delete params.pageSize;
const res = (await fetch(params)) || {};
const data = res.data;
const data = res;
data?.forEach((n: any) => {
for (const key in formatObj) {
n[key] = n[formatObj[key]];