数据看板模块初步完成
This commit is contained in:
parent
53ca93a288
commit
43c2cdb98b
|
|
@ -0,0 +1,61 @@
|
|||
import React, { useRef, useState } from 'react';
|
||||
import Table, { ProColumns, ActionType } from '@/components/Table';
|
||||
import { fetchTableData } from '@/utils/table';
|
||||
const ActiveAnalysis: React.FC = () => {
|
||||
const tableRef = useRef<ActionType>();
|
||||
const [visible, setVisible] = useState(false);
|
||||
|
||||
const columns: ProColumns<any>[] = [
|
||||
{
|
||||
title: '日期',
|
||||
dataIndex: 'time',
|
||||
width: '10%',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '活跃用户数',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '活跃老玩家数量',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'MAU',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'WAU',
|
||||
dataIndex: 'arpu',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'DAU',
|
||||
dataIndex: 'arppu',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
actionRef={tableRef}
|
||||
// request={async (params) => {
|
||||
// // return fetchTableData(, params);
|
||||
// }}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ActiveAnalysis;
|
||||
|
|
@ -0,0 +1,174 @@
|
|||
import React, { useRef, useState } from 'react';
|
||||
import Table, { ProColumns, ActionType } from '@/components/Table';
|
||||
import { getCoreData } from '@/services/DataBorad';
|
||||
import { RedoOutlined } from '@ant-design/icons';
|
||||
import moment from 'moment';
|
||||
import { Card, Col, Row, DatePicker, Button } from 'antd';
|
||||
// import TimeText from '@/components/Typography/TimeText';
|
||||
const CoreData: React.FC = () => {
|
||||
const tableRef = useRef<ActionType>();
|
||||
const [startTimeValue, setStartTimeValue] = useState(Number);
|
||||
const [endTimeValue, setEndTimeValue] = useState(Number);
|
||||
const getTimedata = (data: any) => {
|
||||
setStartTimeValue(moment(data[0]).valueOf());
|
||||
setEndTimeValue(moment(data[1]).valueOf());
|
||||
console.log(startTimeValue, endTimeValue);
|
||||
};
|
||||
const carddata = {
|
||||
name: 1,
|
||||
time: 2,
|
||||
user_num: 2,
|
||||
};
|
||||
const [date, setDate] = useState(carddata);
|
||||
|
||||
const columns: ProColumns<any>[] = [
|
||||
{
|
||||
title: '日期',
|
||||
dataIndex: 'time',
|
||||
width: '10%',
|
||||
renderFormItem: (item, { type, defaultRender, ...rest }, form) => {
|
||||
return (
|
||||
<DatePicker.RangePicker
|
||||
style={{ width: '300px' }}
|
||||
defaultValue={[moment(), moment()]}
|
||||
format={'YYYY-MM-DD'}
|
||||
onChange={getTimedata}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '活跃用户数',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '新用户数量',
|
||||
dataIndex: 'new_user',
|
||||
width: 150,
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '当日充值总额',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '付费用户数',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '付费率',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'ARPU',
|
||||
dataIndex: 'arpu',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'ARPPU',
|
||||
dataIndex: 'arppu',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Row gutter={24} style={{ marginBottom: 10 }}>
|
||||
<Col span={6}>
|
||||
<Card style={{ height: '140px' }}>
|
||||
<div>
|
||||
<p>
|
||||
今日活跃用户数
|
||||
<Button
|
||||
type="link"
|
||||
icon={
|
||||
<RedoOutlined
|
||||
onClick={async () => {
|
||||
const res = await getCoreData({});
|
||||
setDate(res.data);
|
||||
}}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</p>
|
||||
<p>{date.user_num}人</p>
|
||||
</div>
|
||||
</Card>
|
||||
</Col>
|
||||
<Col span={6}>
|
||||
<Card style={{ height: '140px' }}>
|
||||
<div>
|
||||
<p>
|
||||
今日新用户数
|
||||
<Button
|
||||
type="link"
|
||||
icon={
|
||||
<RedoOutlined
|
||||
onClick={async () => {
|
||||
const res = await getCoreData({});
|
||||
setDate(res.data);
|
||||
}}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</p>
|
||||
<p>{date.user_num}人</p>
|
||||
</div>
|
||||
</Card>
|
||||
</Col>
|
||||
<Col span={6}>
|
||||
<Card style={{ height: '140px' }}>
|
||||
<div>
|
||||
<p>
|
||||
本月充值总额
|
||||
<Button
|
||||
type="link"
|
||||
icon={
|
||||
<RedoOutlined
|
||||
onClick={async () => {
|
||||
const res = await getCoreData({});
|
||||
setDate(res.data);
|
||||
}}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</p>
|
||||
<p>{date.name}万元</p>
|
||||
</div>
|
||||
</Card>
|
||||
</Col>
|
||||
<Col span={6}>
|
||||
<Card style={{ height: '140px' }}>
|
||||
<div>
|
||||
<p>充值总额</p>
|
||||
<p>{date.user_num}万元</p>
|
||||
</div>
|
||||
</Card>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
actionRef={tableRef}
|
||||
request={async (params) => {
|
||||
params.start_time = startTimeValue;
|
||||
params.end_time = endTimeValue;
|
||||
return getCoreData(params);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default CoreData;
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
import React, { useRef, useState } from 'react';
|
||||
import Table, { ProColumns, ActionType } from '@/components/Table';
|
||||
import { getCoreData } from '@/services/DataBorad';
|
||||
const Address: React.FC = () => {
|
||||
const tableRef = useRef<ActionType>();
|
||||
const [visible, setVisible] = useState(false);
|
||||
|
||||
const columns: ProColumns<any>[] = [
|
||||
{
|
||||
title: '日期',
|
||||
dataIndex: 'time',
|
||||
width: '10%',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '活跃用户数',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '新用户数量',
|
||||
dataIndex: 'new_user',
|
||||
width: 150,
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '当日充值总额',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '付费用户数',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: '付费率',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'ARPU',
|
||||
dataIndex: 'arpu',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'ARPPU',
|
||||
dataIndex: 'arppu',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
actionRef={tableRef}
|
||||
search={false}
|
||||
request={async (params) => {
|
||||
return getCoreData(params);
|
||||
}}
|
||||
/>
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
actionRef={tableRef}
|
||||
search={false}
|
||||
toolBarActions={[
|
||||
{
|
||||
type: 'add',
|
||||
onConfirm: () => {
|
||||
setVisible(true);
|
||||
},
|
||||
},
|
||||
]}
|
||||
request={async (params) => {
|
||||
return getCoreData(params);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Address;
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
import React, { useRef } from 'react';
|
||||
import Modal, { ModalProps } from '@/components/Modal';
|
||||
import { fetchTableData } from '@/utils/table';
|
||||
import { getchannelRetentionData } from '@/services/DataBorad';
|
||||
import Table, { ProColumns, ActionType } from '@/components/Table';
|
||||
import TimeText from '@/components/Typography/TimeText';
|
||||
|
||||
interface TableModalPropsType extends ModalProps {
|
||||
modalData: any;
|
||||
onCancel: () => void;
|
||||
}
|
||||
const TableModal = ({ onCancel, modalData, ...rest }: TableModalPropsType) => {
|
||||
const tableRef = useRef<ActionType>();
|
||||
const columns: ProColumns<any>[] = [
|
||||
{
|
||||
title: '时间',
|
||||
dataIndex: 'time',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
render: (_, row) => [<TimeText value={row} format={'YYYY-MM-DD'} />],
|
||||
},
|
||||
{
|
||||
title: '渠道类型',
|
||||
dataIndex: 'login_user',
|
||||
hideInSearch: true,
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: '当日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第一日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第二日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第四日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第五日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第六日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第七日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
];
|
||||
|
||||
const handleCancel = () => {
|
||||
onCancel();
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal title="渠道活跃分析" onCancel={handleCancel} width={800} {...rest}>
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
search={false}
|
||||
actionRef={tableRef}
|
||||
request={async (params) => {
|
||||
params.time = modalData;
|
||||
return fetchTableData(getchannelRetentionData, params);
|
||||
}}
|
||||
/>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default TableModal;
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
import React, { useRef, useState } from 'react';
|
||||
import Table, { ProColumns, ActionType } from '@/components/Table';
|
||||
import { DatePicker } from 'antd';
|
||||
import moment from 'moment';
|
||||
import { fetchTableData } from '@/utils/table';
|
||||
import { getRetentionData } from '@/services/DataBorad';
|
||||
import TableModal from '@/pages/DataBoard/RetentionAnalysis/List/components/TableModal';
|
||||
|
||||
const RetentionAnalysis = () => {
|
||||
const [startTimeValue, setStartTimeValue] = useState(Number);
|
||||
const [endTimeValue, setEndTimeValue] = useState(Number);
|
||||
|
||||
const [visible, setVisible] = useState(false);
|
||||
const [requestData, setRequestData] = useState({});
|
||||
const getTimedata = (data) => {
|
||||
setStartTimeValue(moment(data[0]).valueOf());
|
||||
setEndTimeValue(moment(data[1]).valueOf());
|
||||
console.log(startTimeValue, endTimeValue);
|
||||
};
|
||||
const sendData = (row: any) => {
|
||||
setVisible(true);
|
||||
setRequestData(row.time);
|
||||
};
|
||||
|
||||
const tableRef = useRef<ActionType>();
|
||||
const columns: ProColumns<any>[] = [
|
||||
{
|
||||
title: '时间',
|
||||
dataIndex: 'time',
|
||||
width: '20%',
|
||||
renderFormItem: (item, { type, defaultRender, ...rest }, form) => {
|
||||
return (
|
||||
<DatePicker.RangePicker
|
||||
style={{ width: '200px' }}
|
||||
defaultValue={[moment(), moment()]}
|
||||
format={'YYYY-MM-DD'}
|
||||
onChange={getTimedata}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '登录用户数',
|
||||
dataIndex: 'login_user',
|
||||
hideInSearch: true,
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: '当日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第一日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第二日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第四日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第五日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第六日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '第七日',
|
||||
dataIndex: 'key',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
valueType: 'option',
|
||||
width: 150,
|
||||
render: (_, row) => [
|
||||
<button
|
||||
key="edit"
|
||||
onClick={() => {
|
||||
sendData(row);
|
||||
}}
|
||||
>
|
||||
查看
|
||||
</button>,
|
||||
],
|
||||
},
|
||||
];
|
||||
return (
|
||||
<div>
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
actionRef={tableRef}
|
||||
request={async (params) => {
|
||||
params.start_time = startTimeValue;
|
||||
params.end_time = endTimeValue;
|
||||
return fetchTableData(getRetentionData, params);
|
||||
}}
|
||||
/>
|
||||
<TableModal
|
||||
visible={visible}
|
||||
modalData={requestData}
|
||||
onCancel={function () {
|
||||
setVisible(false);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default RetentionAnalysis;
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
import React, { useRef } from 'react';
|
||||
import { createForm } from '@formily/core';
|
||||
import { createSchemaField } from '@formily/react';
|
||||
import Modal, { ModalProps } from '@/components/Modal';
|
||||
// import { fetchTableData } from '@/utils/table';
|
||||
import { Form, FormItem, Input, NumberPicker } from '@formily/antd';
|
||||
|
||||
interface AddNftContractModalPropsType extends ModalProps {
|
||||
onOk: (val: any) => void;
|
||||
onCancel: () => void;
|
||||
}
|
||||
|
||||
const SchemaField = createSchemaField({
|
||||
components: {
|
||||
FormItem,
|
||||
Input,
|
||||
NumberPicker,
|
||||
},
|
||||
});
|
||||
|
||||
const form = createForm({});
|
||||
|
||||
const AddNftContractModal = ({ onOk, onCancel, ...rest }: AddNftContractModalPropsType) => {
|
||||
const handleOk = () => {
|
||||
const formState = form.getFormState();
|
||||
onOk(formState.values);
|
||||
};
|
||||
const handleCancel = () => {
|
||||
onCancel();
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal title="添加地址" onOk={handleOk} onCancel={handleCancel} width={800} {...rest}>
|
||||
<Form form={form} labelCol={4} wrapperCol={18}>
|
||||
<SchemaField>
|
||||
<SchemaField.String
|
||||
name="nft_name"
|
||||
title="名称"
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="Input"
|
||||
/>
|
||||
<SchemaField.Number
|
||||
name="address"
|
||||
title=""
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="NumberPicker"
|
||||
/>
|
||||
<SchemaField.String
|
||||
name="contract"
|
||||
title="量"
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="NumberPicker"
|
||||
/>
|
||||
</SchemaField>
|
||||
</Form>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default AddNftContractModal;
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
import React, { useRef } from 'react';
|
||||
import { createForm } from '@formily/core';
|
||||
import { createSchemaField } from '@formily/react';
|
||||
import Modal, { ModalProps } from '@/components/Modal';
|
||||
// import { fetchTableData } from '@/utils/table';
|
||||
import { Form, FormItem, Input, NumberPicker } from '@formily/antd';
|
||||
|
||||
interface AddNftModalPropsType extends ModalProps {
|
||||
onOk: (val: any) => void;
|
||||
onCancel: () => void;
|
||||
}
|
||||
|
||||
const SchemaField = createSchemaField({
|
||||
components: {
|
||||
FormItem,
|
||||
Input,
|
||||
NumberPicker,
|
||||
},
|
||||
});
|
||||
|
||||
const form = createForm({});
|
||||
|
||||
const AddNftModal = ({ onOk, onCancel, ...rest }: AddNftModalPropsType) => {
|
||||
const handleOk = () => {
|
||||
const formState = form.getFormState();
|
||||
onOk(formState.values);
|
||||
};
|
||||
const handleCancel = () => {
|
||||
onCancel();
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal title="添加地址" onOk={handleOk} onCancel={handleCancel} width={800} {...rest}>
|
||||
<Form form={form} labelCol={4} wrapperCol={18}>
|
||||
<SchemaField>
|
||||
<SchemaField.String
|
||||
name="nft_name"
|
||||
title="名称"
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="Input"
|
||||
/>
|
||||
<SchemaField.Number
|
||||
name="contract"
|
||||
title="合约"
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="NumberPicker"
|
||||
/>
|
||||
<SchemaField.Number
|
||||
name="description"
|
||||
title="描述"
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="NumberPicker"
|
||||
/>
|
||||
<SchemaField.Number
|
||||
name="img"
|
||||
title="图片"
|
||||
required
|
||||
x-decorator="FormItem"
|
||||
x-component="NumberPicker"
|
||||
/>
|
||||
</SchemaField>
|
||||
</Form>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default AddNftModal;
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
import React, { useRef, useState } from 'react';
|
||||
import Table, { ProColumns, ActionType } from '@/components/Table';
|
||||
import { message } from 'antd';
|
||||
// import { fetchTableData } from '@/utils/table';
|
||||
import AddNftModal from '@/pages/Nft/NftContractManage/List/components/addNftModel';
|
||||
import AddNftContractModal from '@/pages/Nft/NftContractManage/List/components/addNftContract';
|
||||
|
||||
const Address: React.FC = () => {
|
||||
const tableRef = useRef<ActionType>();
|
||||
const [NftModal, setNftModal] = useState(false);
|
||||
const [, setVisible] = useState(false);
|
||||
|
||||
const columns: ProColumns<any>[] = [
|
||||
{
|
||||
title: '合约名称',
|
||||
dataIndex: 'time',
|
||||
width: '10%',
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
title: '合约地址',
|
||||
dataIndex: 'address',
|
||||
hideInSearch: true,
|
||||
width: '20%',
|
||||
},
|
||||
{
|
||||
title: 'NFT数量',
|
||||
dataIndex: 'nft_num',
|
||||
width: 150,
|
||||
hideInSearch: true,
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Table
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
actionRef={tableRef}
|
||||
toolBarActions={[
|
||||
{
|
||||
type: 'add',
|
||||
text: '添加NFT',
|
||||
onConfirm: () => {
|
||||
setVisible(true);
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'add',
|
||||
text: '新建NFT合约',
|
||||
onConfirm: () => {
|
||||
setVisible(true);
|
||||
},
|
||||
},
|
||||
]}
|
||||
// request={async (params) => {
|
||||
// // return fetchTableData(, params);
|
||||
// }}
|
||||
/>
|
||||
<AddNftModal
|
||||
visible={NftModal}
|
||||
onCancel={function () {
|
||||
setVisible(false);
|
||||
}}
|
||||
onOk={async function (val: any): Promise<void> {
|
||||
try {
|
||||
const params = { ...val };
|
||||
// await creatNftAddress(params);
|
||||
message.success('添加成功');
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
message.success('发生错误');
|
||||
setVisible(false);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<AddNftContractModal
|
||||
visible={NftModal}
|
||||
onCancel={function () {
|
||||
setVisible(false);
|
||||
}}
|
||||
onOk={async function (val: any): Promise<void> {
|
||||
try {
|
||||
const params = { ...val };
|
||||
// await creatNftAddress(params);
|
||||
message.success('添加成功');
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
message.success('发生错误');
|
||||
setVisible(false);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Address;
|
||||
|
|
@ -33,6 +33,37 @@ export default [
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: '数据看板',
|
||||
path: RoutePath.DATABOARD,
|
||||
routes: [
|
||||
{
|
||||
path: RoutePath.DATABOARD,
|
||||
redirect: RoutePath.COREDATA.LIST,
|
||||
hideInMenu: true,
|
||||
},
|
||||
{
|
||||
name: '核心看板',
|
||||
path: RoutePath.COREDATA.LIST,
|
||||
component: './DataBoard/CoreData/List',
|
||||
},
|
||||
{
|
||||
name: '活跃分析',
|
||||
path: RoutePath.ACTIVEANALYSIS.LIST,
|
||||
component: './DataBoard/ActiveAnalysis/List',
|
||||
},
|
||||
{
|
||||
name: '留存分析',
|
||||
path: RoutePath.RETENTIONANALYSIS.LIST,
|
||||
component: './DataBoard/RetentionAnalysis/List',
|
||||
},
|
||||
{
|
||||
name: '用户充值分析',
|
||||
path: RoutePath.RECHARGEANALYSIS.LIST,
|
||||
component: './DataBoard/RechargeAnalysis/List',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: '/',
|
||||
redirect: RoutePath.WORK.LIST,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,21 @@
|
|||
const SETTING = '/setting';
|
||||
const DATABOARD = '/databoard';
|
||||
const RoutePath = {
|
||||
LOGIN: '/login',
|
||||
SETTING: SETTING,
|
||||
DATABOARD: DATABOARD,
|
||||
COREDATA: {
|
||||
LIST: '${DATABOARD}/coredata',
|
||||
},
|
||||
ACTIVEANALYSIS: {
|
||||
LIST: '${DATABOARD}/activeanalysis',
|
||||
},
|
||||
RETENTIONANALYSIS: {
|
||||
LIST: '${DATABOARD}/retentionanalysis',
|
||||
},
|
||||
RECHARGEANALYSIS: {
|
||||
LIST: '${DATABOARD}/rechargeanalysis',
|
||||
},
|
||||
WORK: {
|
||||
LIST: `${SETTING}/work`,
|
||||
EDIT: `${SETTING}/work/edit`,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
import request from '@/utils/request';
|
||||
|
||||
export const getCoreData = (data) => {
|
||||
return request.request({
|
||||
url: '/tgb/api/v1/data/get',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
};
|
||||
// 活跃分析
|
||||
export const getRetentionData = (data) => {
|
||||
return request.request({
|
||||
url: '/tgb/api/v1/data/get',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
};
|
||||
// 渠道活跃分析
|
||||
export const getchannelRetentionData = (data) => {
|
||||
return request.request({
|
||||
url: '/tgb/api/v1/data/get',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
};
|
||||
Loading…
Reference in New Issue