Commit 168e182b authored by XieZhiXiong's avatar XieZhiXiong

剩余查看、修改评论相关

parent 6b885fc5
......@@ -141,9 +141,9 @@ const EvaluationList = props => {
<img src={item.good ? item.good.pic : ''} />
</div>
<div className="goodInfo-right">
<div className="goodInfo-title">进口头层黄牛皮荔枝纹/红色/XL</div>
<div className="goodInfo-desc">20 平方英尺</div>
<div className="goodInfo-price">¥ 400.00</div>
<div className="goodInfo-title">{item.good.productName}</div>
<div className="goodInfo-desc">X {item.good.purchaseCount || ''}</div>
<div className="goodInfo-price">{`¥ ${item.good.price}`}</div>
</div>
</div>
</Col>
......
/*
* @Author: XieZhiXiong
* @Date: 2020-09-22 20:34:49
* @Date: 2020-10-19 18:08:51
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-22 20:52:53
* @LastEditTime: 2020-10-19 18:09:31
* @Description:
*/
import { ISchema } from '@formily/antd';
......@@ -28,7 +28,7 @@ export const searchSchema: ISchema = {
},
},
},
'[startDate, endDate]': {
'[dealTimeStart, dealTimeEnd]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
......@@ -40,7 +40,7 @@ export const searchSchema: ISchema = {
},
},
},
name: {
memberName: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......
import React from 'react';
import styles from './index.less';
const SupplierEvaluation: React.FC = () => {
return (
<div>123</div>
);
};
export default SupplierEvaluation;
\ No newline at end of file
import React from 'react';
import React, { useState, useEffect } from 'react';
import {
PageHeader,
Descriptions,
......@@ -11,9 +11,13 @@ import { FormOutlined } from '@ant-design/icons';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { history } from 'umi';
import { createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetOrderPurchaseOrderDetailsResponse } from '@/services/OrderApi';
import { normalizeFiledata } from '@/utils';
import AvatarWrap from '@/components/AvatarWrap';
import NiceForm from '@/components/NiceForm';
import { normalizeUnevaluatedList } from '../../utils';
import { evaluateSchema } from './schema';
import { createEffects } from './effects';
import EvaluationList from '../../components/EvaluationList';
......@@ -21,10 +25,93 @@ import styles from './index.less';
const formActions = createFormActions();
interface Unevaluated {
good: {
pic: string,
name: string,
price: string,
desc: string,
};
star: number;
comment: string;
picture: string[];
smile: number;
};
interface OrderInfo extends GetOrderPurchaseOrderDetailsResponse {
unevaluatedList: Unevaluated[];
};
const EvaluateOrder: React.FC = () => {
const { id } = usePageStatus();
const [orderInfo, setOrderInfo] = useState<OrderInfo>(null);
const [infoLoading, setInfoLoading] = useState(false);
const [submitLoading, setSubmitLoading] = useState(false);
const getOrderInfo = () => {
if (!id) {
return;
}
setInfoLoading(true);
PublicApi.getOrderProcurementOrderDetails({
id,
}).then(res => {
if (res.code === 1000) {
const { orderProductRequests } = res.data;
setOrderInfo({
...res.data,
unevaluatedList: normalizeUnevaluatedList(orderProductRequests),
});
}
}).finally(() => {
setInfoLoading(false);
});
};
useEffect(() => {
getOrderInfo();
}, []);
const handleSubmit = values => {
console.log('values', values);
setSubmitLoading(true);
const payload = values.comments.map(item => {
const {
comment,
good,
picture,
star,
} = item;
return {
memberId: orderInfo.supplyMembersId,
roleId: orderInfo.supplyMembersRoleId,
memberName: orderInfo.supplyMembersName || '',
star,
comment,
product: JSON.stringify(good),
remark: orderInfo.orderNo,
productId: good.productId,
orderId: orderInfo.id,
productImgUrl: good.pic,
dealTime: orderInfo.createTime,
dealCount: good.purchaseCount,
price: good.price,
totalPrice: orderInfo.sumPrice,
pics: picture.map(item => item.status === 'done' && item.data).filter(Boolean),
};
});
PublicApi.postMemberCommentConsumerOrderTradeSubmit({
commentSubmitDetailList: payload,
}).then(res => {
if (res.code === 1000) {
setTimeout(() => {
history.goBack();
}, 800);
}
}).finally(() => {
setSubmitLoading(false);
});
};
const beforeUpload = file => {
......@@ -50,62 +137,69 @@ const EvaluateOrder: React.FC = () => {
);
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: '订单号:DPTY12'
}}
/>
}
extra={(
<>
<Button
type="primary"
icon={<FormOutlined />}
onClick={() => formActions.submit()}
>
发布
</Button>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
<Spin spinning={infoLoading}>
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: orderInfo?.orderNo,
}}
/>
}
extra={(
<>
<Button
type="primary"
icon={<FormOutlined />}
disabled={!orderInfo || !orderInfo.id}
loading={submitLoading}
onClick={() => formActions.submit()}
>
发布
</Button>
</>
)}
>
<Descriptions.Item label="采购会员">BPTY12</Descriptions.Item>
<Descriptions.Item label="下单时间" span={2}>2020-08-25 08:49</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<NiceForm
actions={formActions}
expressionScope={{
UploadTip,
beforeUpload,
}}
onSubmit={handleSubmit}
components={{
EvaluationList,
}}
effects={($, actions) => {
createEffects($, actions);
}}
schema={evaluateSchema}
/>
</PageHeaderWrapper>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="供应会员">{orderInfo?.supplyMembersName}</Descriptions.Item>
<Descriptions.Item label="下单时间" span={2}>{orderInfo?.createTime}</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<NiceForm
actions={formActions}
initialValues={{
comments: orderInfo ? orderInfo.unevaluatedList : [],
}}
expressionScope={{
UploadTip,
beforeUpload,
}}
onSubmit={handleSubmit}
components={{
EvaluationList,
}}
effects={($, actions) => {
createEffects($, actions);
}}
schema={evaluateSchema}
/>
</PageHeaderWrapper>
</Spin>
);
};
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-23 17:00:24
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-23 18:06:56
* @LastEditTime: 2020-10-20 17:58:51
* @Description:
*/
import { ISchema } from '@formily/antd';
......@@ -14,14 +14,7 @@ export const evaluateSchema: ISchema = {
comments: {
type: 'array',
'x-component': 'EvaluationList',
default: [
{
name: '杰尼',
age: 24,
small: 1,
star2: 0,
},
],
default: [],
items: {
type: 'object',
properties: {
......@@ -50,30 +43,35 @@ export const evaluateSchema: ISchema = {
'x-component': 'Rating',
'x-component-props': {
allowHalf: false,
},
},
'x-rules': [
{
required: true,
message: '请选择满意程度',
},
],
},
comment: {
type: 'string',
title: '评价',
required: true,
'x-component': 'TextArea',
'x-component-props': {
rows: 4,
},
},
},
picture: {
type: 'string',
title: '图片',
required: true,
'x-component': 'Upload',
'x-component-props': {
listType: 'card',
action: '/api/file/upload/prefix',
action: '/api/file/file/upload/prefix',
data: {
fileType: UPLOAD_TYPE,
prefix: '/test/',
prefix: '/supplierEvaluation/',
},
beforeUpload: '{{beforeUpload}}',
accept: '.png, .jpg, .jpeg',
},
'x-mega-props': {
addonAfter: '{{UploadTip}}',
......
import React, { useState, useRef } from 'react';
import { Card, Badge, Button } from 'antd';
import { Link } from 'umi';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { createFormActions } from '@formily/antd';
import moment from 'moment';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { Link } from 'umi';
import { ORDER_TYPE2 } from '@/constants';
import { PublicApi } from '@/services/api';
import EyePreview from '@/components/EyePreview';
import NiceForm from '@/components/NiceForm';
import StatusTag from '@/components/StatusTag';
......@@ -16,29 +18,6 @@ import styles from './index.less';
const formActions = createFormActions();
const mock = [
{
orderNo: 'DPTY12',
abstract: '进口头层黄牛皮荔枝纹',
member: '广州白马皮具交易有限公司',
created: '2020-09-22 11:16:00',
amount: '¥ 50,000.00',
orderType: '现货采购',
outerStatusName: '已完成',
innerStatusName: '已完成',
},
{
orderNo: 'DPTY13',
abstract: '进口头层黄牛皮荔枝纹',
member: '广州白马皮具交易有限公司',
created: '2020-09-22 11:16:00',
amount: '¥ 50,000.00',
orderType: '现货采购',
outerStatusName: '已完成',
innerStatusName: '已完成',
},
];
const Unevaluated: React.FC = () => {
const ref = useRef<any>({});
......@@ -58,48 +37,46 @@ const Unevaluated: React.FC = () => {
},
{
title: '订单摘要',
dataIndex: 'abstract',
align: 'center',
dataIndex: 'orderThe',
align: 'center',
ellipsis: true,
},
{
title: '采购会员',
dataIndex: 'member',
title: '供应会员',
dataIndex: 'supplyMembersName',
align: 'center',
render: (text, record) => <>{text}</>,
},
{
title: '下单时间',
dataIndex: 'created',
dataIndex: 'createTime',
align: 'center',
render: (text, record) => <>{text}</>,
render: (text, record) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
},
{
title: '订单总额',
dataIndex: 'amount',
dataIndex: 'sumPrice',
align: 'center',
},
{
title: '订单类型',
dataIndex: 'orderType',
align: 'center',
dataIndex: 'type',
align: 'center',
render: text => ORDER_TYPE2[text],
},
{
title: '外部状态',
dataIndex: 'outerStatusName',
dataIndex: 'externalState',
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type="warnning" title="已完成" />
<StatusTag type="success" title="已完成" />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
dataIndex: 'purchaseOrderInteriorState',
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color="#606266" text="已完成" />,
render: (text, record) => <Badge color="#41CC9E" text="已完成" />,
},
{
title: '操作',
......@@ -107,7 +84,7 @@ const Unevaluated: React.FC = () => {
align: 'center',
render: (text, record) => (
<>
<Link to={`/memberCenter/tranactionAbility/supplierEvaluation/unevaluated/evaluate`}>
<Link to={`/memberCenter/tranactionAbility/purchaserEvaluation/unevaluated/evaluate?id=${record.id}`}>
<Button
type="link"
>
......@@ -122,17 +99,20 @@ const Unevaluated: React.FC = () => {
const [columns, setColumns] = useState<any[]>(defaultColumns);
const fetchListData = (params: any) => {
return Promise.resolve({
total: 2,
data: mock,
return new Promise((resolve, reject) => {
PublicApi.getOrderProcurementOrderEvaluatedList(params)
.then(res => {
if (res.code === 1000) {
resolve(res.data);
}
reject();
})
.catch(() => {
reject();
});
});
};
// 初始化高级筛选选项
const fetchSelectOptions = async () => {
return {};
};
return (
<PageHeaderWrapper>
<Card>
......@@ -154,10 +134,6 @@ const Unevaluated: React.FC = () => {
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['innerStatus', 'outerStatus'],
fetchSelectOptions,
);
}}
schema={listSearchSchema}
/>
......
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { UPLOAD_TYPE } from '@/constants';
import {
ORDER_TYPE2_INQUIRY,
ORDER_TYPE2_DEMAND,
ORDER_TYPE2_SPOT,
ORDER_TYPE2_CENTRALIZED,
ORDER_TYPE2_POINTS,
ORDER_TYPE2_CHANNEL_DIRECT,
ORDER_TYPE2_CHANNEL_SPOT,
ORDER_TYPE2_CHANNEL_POINTS,
ORDER_TYPE2,
} from '@/constants';
export const listSearchSchema: ISchema = {
type: 'object',
......@@ -28,15 +38,15 @@ export const listSearchSchema: ISchema = {
columns: 6,
},
properties: {
memberTypeId: {
supplyMembersName: {
type: 'string',
default: undefined,
'x-component-props': {
placeholder: '采购会员',
placeholder: '供应会员',
allowClear: true,
},
},
'[startDate, endDate]': {
'[startCreateTime, endCreateTime]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
......@@ -45,33 +55,48 @@ export const listSearchSchema: ISchema = {
allowClear: true,
},
},
orderType: {
type: {
type: 'string',
default: undefined,
enum: [],
enum: [
{
label: ORDER_TYPE2[ORDER_TYPE2_INQUIRY],
value: ORDER_TYPE2_INQUIRY,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_DEMAND],
value: ORDER_TYPE2_DEMAND,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_SPOT],
value: ORDER_TYPE2_SPOT,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_CENTRALIZED],
value: ORDER_TYPE2_CENTRALIZED,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_POINTS],
value: ORDER_TYPE2_POINTS,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_CHANNEL_DIRECT],
value: ORDER_TYPE2_CHANNEL_DIRECT,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_CHANNEL_SPOT],
value: ORDER_TYPE2_CHANNEL_SPOT,
},
{
label: ORDER_TYPE2[ORDER_TYPE2_CHANNEL_POINTS],
value: ORDER_TYPE2_CHANNEL_POINTS,
},
],
'x-component-props': {
placeholder: '订单类型',
allowClear: true,
},
},
outerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '外部状态(全部)',
allowClear: true,
},
},
innerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '内部状态(全部)',
allowClear: true,
},
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
......
/*
* @Author: XieZhiXiong
* @Date: 2020-10-19 16:02:53
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-20 13:40:11
* @Description:
*/
// 初始化待评价列表
export const normalizeUnevaluatedList = (arr: {[key: string]: any}[]) => {
const ret = [];
if (!Array.isArray(arr)) {
return ret;
}
arr.forEach(item => {
const atom = {
good: {
pic: item.imgUrl || '',
productId: item.productId,
orderId: item.orderId,
productName: item.productName,
category: item.category,
brand: item.brand,
unit: item.unit,
price: item.price,
memberPrice: item.memberPrice,
purchaseCount: item.purchaseCount, // 采购数量
taxInclusive: item.taxInclusive,
money: item.money,
inventory: item.inventory,
productAttributeJson: item.productAttributeJson,
},
star: 0, // 评分星星
comment: '', // 评价
picture: [],
smile: 1, // 笑脸
};
ret.push(atom);
});
return ret;
};
\ No newline at end of file
......@@ -142,7 +142,7 @@ const EvaluationList = props => {
</div>
<div className="goodInfo-right">
<div className="goodInfo-title">{item.good.productName}</div>
<div className="goodInfo-desc">{item.good.purchaseCount || ''}</div>
<div className="goodInfo-desc">X {item.good.purchaseCount || ''}</div>
<div className="goodInfo-price">{`¥ ${item.good.price}`}</div>
</div>
</div>
......
import {
PurchaseOrderOutWorkState,
SaleOrderInsideWorkState,
} from '@/constants';
// 订单外部状态 StatusTag map
export const ORDER_INNER_STATUS_TYPE = {
[PurchaseOrderOutWorkState.FINISH_ORDER]: 'success',
};
// 订单内部状态 Tag badge map
export const ORDER_INNER_STATUS_BADGE_COLOR = {
[SaleOrderInsideWorkState.FILLING_ORDER]: '#00B37A',
};
// 订单内部状态 text
export const ORDER_INNER_STATUS_TXT_FINISHING = {
[SaleOrderInsideWorkState.FILLING_ORDER]: '已完成',
};
\ No newline at end of file
import React from 'react';
import styles from './index.less';
const SupplierEvaluation: React.FC = () => {
return (
<div>123</div>
);
};
export default SupplierEvaluation;
\ No newline at end of file
......@@ -49,6 +49,9 @@ const EvaluateOrder: React.FC = () => {
const [submitLoading, setSubmitLoading] = useState(false);
const getOrderInfo = () => {
if (!id) {
return;
}
setInfoLoading(true);
PublicApi.getOrderPurchaseOrderDetails({
id,
......@@ -71,7 +74,7 @@ const EvaluateOrder: React.FC = () => {
const handleSubmit = values => {
setSubmitLoading(true);
const payload = values.map(item => {
const payload = values.comments.map(item => {
const {
comment,
good,
......@@ -80,14 +83,16 @@ const EvaluateOrder: React.FC = () => {
} = item;
return {
memberId: orderInfo.supplyMembersId,
roleId: '暂无',
memberName: orderInfo.supplyMembersName,
memberId: orderInfo.createMemberId,
roleId: orderInfo.createRoleId,
memberName: orderInfo.createMemberName || '',
star,
comment,
product: JSON.stringify(good),
remark: orderInfo.orderNo,
productId: good.productId,
orderId: orderInfo.id,
productImgUrl: good.pic,
dealTime: orderInfo.createTime,
dealCount: good.purchaseCount,
price: good.price,
......@@ -168,7 +173,7 @@ const EvaluateOrder: React.FC = () => {
padding: '0 32px',
}}
>
<Descriptions.Item label="采购会员">{'暂无'}</Descriptions.Item>
<Descriptions.Item label="采购会员">{orderInfo?.createMemberName}</Descriptions.Item>
<Descriptions.Item label="下单时间" span={2}>{orderInfo?.createTime}</Descriptions.Item>
</Descriptions>
</PageHeader>
......
......@@ -5,14 +5,10 @@ import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { createFormActions } from '@formily/antd';
import moment from 'moment';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ORDER_TYPE2, SaleOrderInsideWorkStateTexts, PayOutWorkStateTexts } from '@/constants';
import {
ORDER_INNER_STATUS_TYPE,
ORDER_INNER_STATUS_BADGE_COLOR,
ORDER_INNER_STATUS_TXT_FINISHING,
} from '../constans';
import { ORDER_TYPE2 } from '@/constants';
import { PublicApi } from '@/services/api';
import EyePreview from '@/components/EyePreview';
import NiceForm from '@/components/NiceForm';
......@@ -55,7 +51,7 @@ const Unevaluated: React.FC = () => {
title: '下单时间',
dataIndex: 'createTime',
align: 'center',
render: (text, record) => <>{text}</>,
render: (text, record) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
},
{
title: '订单总额',
......@@ -72,8 +68,6 @@ const Unevaluated: React.FC = () => {
title: '外部状态',
dataIndex: 'externalState',
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type="success" title="已完成" />
),
......@@ -82,8 +76,6 @@ const Unevaluated: React.FC = () => {
title: '内部状态',
dataIndex: 'purchaseOrderInteriorState',
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color="#41CC9E" text="已完成" />,
},
{
......
......@@ -38,7 +38,7 @@ export const listSearchSchema: ISchema = {
columns: 6,
},
properties: {
supplyMembersName: {
membersName: {
type: 'string',
default: undefined,
'x-component-props': {
......@@ -46,7 +46,7 @@ export const listSearchSchema: ISchema = {
allowClear: true,
},
},
'[startDate, endDate]': {
'[startCreateTime, endCreateTime]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
......@@ -55,7 +55,7 @@ export const listSearchSchema: ISchema = {
allowClear: true,
},
},
orderType: {
type: {
type: 'string',
default: undefined,
enum: [
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-10-19 16:02:53
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-19 17:10:42
* @LastEditTime: 2020-10-20 18:03:34
* @Description:
*/
......@@ -16,8 +16,7 @@ export const normalizeUnevaluatedList = (arr: {[key: string]: any}[]) => {
arr.forEach(item => {
const atom = {
good: {
pic: '',
quantity: item.productAttributeJson || '',
pic: item.imgUrl || '',
productId: item.productId,
orderId: item.orderId,
productName: item.productName,
......
......@@ -427,11 +427,19 @@ export const padRequiredMessage = (originSchema: ISchema) => {
return originSchema
}
export interface FileData {
uid: string;
name: string;
status: 'uploading' | 'done' | 'error' | 'removed';
url: string;
};
// 初始化 Upload 数据
export const normalizeFiledata = url => {
url = url || '';
export function normalizeFiledata<T>(url: T): T
export function normalizeFiledata(url: string): FileData
export function normalizeFiledata(url: any): any {
if (!url) {
return;
return url;
}
const splited = url.split('/');
const fileName = splited && splited.length ? splited[splited.length - 1] : '';
......@@ -445,13 +453,13 @@ export const normalizeFiledata = url => {
};
/**
* 检查是否还有更多
* 检查是否还有更多
* @param {Number} curPage 当前页码
* @param {Number} curSize 当前页数
* @param {Number} dataLen 当前数据长度
* @param {Number} dataTotal 数据总长度
*/
export const checkMore = (curPage, curSize, dataLen, dataTotal) => {
export const checkMore = (curPage: number, curSize: number, dataLen: number, dataTotal: number) => {
let hasMore = true;
if (!dataLen || dataLen + (curPage - 1) * curSize >= +dataTotal) {
......@@ -460,6 +468,22 @@ export const checkMore = (curPage, curSize, dataLen, dataTotal) => {
return hasMore;
};
/**
*
* @param {string} str 需要判断是否是 JSON字符串的 字符串
*/
export const isJSONStr = str => {
if (typeof str === 'string') {
try {
const complete = JSON.parse(str);
return complete;
} catch(e) {
return null;
}
}
return str;
}
export default {
isArray,
isObject,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment