流行趋势
parent
8426090206
commit
3b8eefa933
@ -0,0 +1,210 @@
|
|||||||
|
import React, { useRef, useState } from 'react';
|
||||||
|
import { DrawerForm, ProFormInstance, ProFormText, ProFormUploadButton, ProFormRadio, ProFormTextArea } from '@ant-design/pro-components';
|
||||||
|
import { message } from 'antd';
|
||||||
|
import Upload, { RcFile } from 'antd/es/upload';
|
||||||
|
|
||||||
|
export type FormValueType = {
|
||||||
|
target?: string;
|
||||||
|
template?: string;
|
||||||
|
type?: string;
|
||||||
|
time?: string;
|
||||||
|
frequency?: string;
|
||||||
|
} & Partial<API.PbcFashionTrend_>;
|
||||||
|
|
||||||
|
export type UpdateFormProps = {
|
||||||
|
onCancel: (flag?: boolean, formVals?: FormValueType) => void;
|
||||||
|
onSubmit: (values: FormValueType) => Promise<void>;
|
||||||
|
updateModalVisible: boolean;
|
||||||
|
values: Partial<API.PbcFashionTrend_>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
|
||||||
|
const formRef = useRef<ProFormInstance>();
|
||||||
|
const [pbcType, setPbcType] = useState<number>(props.values.pbcType || 1)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DrawerForm
|
||||||
|
width={640}
|
||||||
|
title={props.values.pbcId ? '编辑流行趋势' : '新增流行趋势'}
|
||||||
|
open={props.updateModalVisible}
|
||||||
|
formRef={formRef}
|
||||||
|
onFinish={async (value: any) => {
|
||||||
|
let pbcPicAddress = ""
|
||||||
|
if (value.pbcType === 1 && value.pbcImage.length > 0) {
|
||||||
|
pbcPicAddress = value.pbcImage.map((e: any) => {
|
||||||
|
return e.url || e.response.data;
|
||||||
|
}).join(',');
|
||||||
|
} else if (value.pbcType === 2 && value.pbcVideo.length > 0) {
|
||||||
|
pbcPicAddress = value.pbcVideo[0].url || value.pbcVideo[0].response.data;
|
||||||
|
}
|
||||||
|
return props.onSubmit({ ...value, pbcPicAddress, pbcId: props.values.pbcId })
|
||||||
|
}}
|
||||||
|
drawerProps={{
|
||||||
|
destroyOnClose: true,
|
||||||
|
}}
|
||||||
|
initialValues={{
|
||||||
|
pbcTitle: props.values.pbcTitle,
|
||||||
|
pbcType: props.values.pbcType || 1,
|
||||||
|
pbcImage: props.values.pbcType === 1 && props.values.pbcPicAddress ? props.values.pbcPicAddress.split(',').map((e, index) => {
|
||||||
|
return {
|
||||||
|
uid: '-' + index,
|
||||||
|
name: e.substring(e.lastIndexOf('/') + 1),
|
||||||
|
status: 'done',
|
||||||
|
url: e,
|
||||||
|
}
|
||||||
|
}) : [],
|
||||||
|
pbcVideo: props.values.pbcType === 2 && props.values.pbcPicAddress ? [{
|
||||||
|
uid: '-1',
|
||||||
|
name: props.values.pbcPicAddress.substring(props.values.pbcPicAddress.lastIndexOf('/') + 1),
|
||||||
|
status: 'done',
|
||||||
|
url: props.values.pbcPicAddress,
|
||||||
|
}] : [],
|
||||||
|
pbcContent: props.values.pbcContent
|
||||||
|
}}
|
||||||
|
onOpenChange={(visible) => {
|
||||||
|
formRef.current?.resetFields();
|
||||||
|
if (!visible) {
|
||||||
|
props.onCancel();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ProFormText
|
||||||
|
placeholder={'请输入标题'}
|
||||||
|
label="标题"
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '标题为必填项',
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
width="md"
|
||||||
|
name="pbcTitle"
|
||||||
|
/>
|
||||||
|
<ProFormRadio.Group
|
||||||
|
name="pbcType"
|
||||||
|
label="类型"
|
||||||
|
options={[
|
||||||
|
{
|
||||||
|
label: '图片',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '视频',
|
||||||
|
value: 2,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请选择类型',
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
fieldProps={{
|
||||||
|
onChange: (e) => {
|
||||||
|
setPbcType(e.target.value)
|
||||||
|
formRef.current?.setFieldValue('pbcImage', []);
|
||||||
|
formRef.current?.setFieldValue('pbcVideo', []);
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{pbcType === 1 ? <ProFormUploadButton
|
||||||
|
label="上传图片"
|
||||||
|
name="pbcImage"
|
||||||
|
max={9}
|
||||||
|
fieldProps={{
|
||||||
|
name: 'file',
|
||||||
|
accept: 'image/*',
|
||||||
|
multiple: true,
|
||||||
|
headers: {
|
||||||
|
authorization: localStorage.getItem('token') ?? '',
|
||||||
|
},
|
||||||
|
onChange: (info: any) => {
|
||||||
|
switch (info.file.status) {
|
||||||
|
case 'done':
|
||||||
|
if (info.file.response.retcode === 0) {
|
||||||
|
message.error(info.file.response.retmsg);
|
||||||
|
formRef.current?.setFieldValue('pbcContent', [])
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
action: process.env.BASE_URL + '/oss/imgUpload',
|
||||||
|
beforeUpload(file: RcFile) {
|
||||||
|
const isLt10M = file.size / 1024 / 1024 < 10;
|
||||||
|
if (!isLt10M) {
|
||||||
|
message.error('图片大小不能超过10MB!');
|
||||||
|
}
|
||||||
|
return isLt10M || Upload.LIST_IGNORE;
|
||||||
|
},
|
||||||
|
onPreview: async (file) => {
|
||||||
|
if (file.uid.includes('-')) {
|
||||||
|
window.open(file.url);
|
||||||
|
}
|
||||||
|
if (file.response && file.response.retcode) {
|
||||||
|
window.open(file.response.data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
listType: 'picture-card',
|
||||||
|
}}
|
||||||
|
rules={[
|
||||||
|
{ required: true, message: '请上传图片' },
|
||||||
|
]}
|
||||||
|
/> :
|
||||||
|
<ProFormUploadButton
|
||||||
|
label="上传视频"
|
||||||
|
name="pbcVideo"
|
||||||
|
max={1}
|
||||||
|
fieldProps={{
|
||||||
|
name: 'file',
|
||||||
|
accept: 'video/mp4',
|
||||||
|
multiple: true,
|
||||||
|
headers: {
|
||||||
|
authorization: localStorage.getItem('token') ?? '',
|
||||||
|
},
|
||||||
|
onChange: (info: any) => {
|
||||||
|
switch (info.file.status) {
|
||||||
|
case 'done':
|
||||||
|
if (info.file.response.retcode === 0) {
|
||||||
|
message.error(info.file.response.retmsg);
|
||||||
|
formRef.current?.setFieldValue('pbcVideo', [])
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
action: process.env.BASE_URL + '/oss/imgUpload',
|
||||||
|
beforeUpload(file: RcFile) {
|
||||||
|
const isLt30M = file.size / 1024 / 1024 < 30;
|
||||||
|
if (!isLt30M) {
|
||||||
|
message.error('视频大小不能超过30MB!');
|
||||||
|
}
|
||||||
|
return isLt30M || Upload.LIST_IGNORE;
|
||||||
|
},
|
||||||
|
onPreview: async (file) => {
|
||||||
|
if (file.uid === '-1') {
|
||||||
|
window.open(file.url);
|
||||||
|
}
|
||||||
|
if (file.response && file.response.retcode) {
|
||||||
|
window.open(file.response.data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
listType: 'picture-card',
|
||||||
|
}}
|
||||||
|
rules={[
|
||||||
|
{ required: true, message: '请上传视频' },
|
||||||
|
]}
|
||||||
|
/>}
|
||||||
|
<ProFormTextArea placeholder={'请输入简介'} name="pbcContent" label="简介" rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请输入简介',
|
||||||
|
}
|
||||||
|
]} />
|
||||||
|
</DrawerForm>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default UpdateForm;
|
||||||
@ -0,0 +1,226 @@
|
|||||||
|
import { PlusOutlined } from '@ant-design/icons';
|
||||||
|
import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components';
|
||||||
|
import { PageContainer } from '@ant-design/pro-layout';
|
||||||
|
import { Button, message, Popconfirm, Switch } from 'antd';
|
||||||
|
import React, { useRef, useState } from 'react';
|
||||||
|
import { Access, useAccess } from 'umi';
|
||||||
|
import { getFashionTrendPageUsingPost, removeFashionTrendUsingGet, addOrUpdateFashionTrendUsingPost, changeFashionTrendStateUsingGet } from '@/services/pop-b2b2c/pbcFashionTrendController';
|
||||||
|
import UpdateForm from './components/UpdateForm';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询表格
|
||||||
|
* @param param0
|
||||||
|
*/
|
||||||
|
const fetchData = async (params: API.PbcFashionTrend_) => {
|
||||||
|
const msg = await getFashionTrendPageUsingPost(params);
|
||||||
|
return {
|
||||||
|
data: msg.data?.records || [],
|
||||||
|
total: msg.data?.total,
|
||||||
|
success: msg.retcode,
|
||||||
|
} as any;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleUpdateState = async (id: number, state: number) => {
|
||||||
|
const hide = message.loading('正在保存');
|
||||||
|
if (!id) return false;
|
||||||
|
try {
|
||||||
|
const msg = await changeFashionTrendStateUsingGet({ pbcId: id, pbcState: state });
|
||||||
|
hide();
|
||||||
|
if (msg.retcode) {
|
||||||
|
message.success(!id ? '新增成功!' : '保存成功!');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
message.error(msg.retmsg);
|
||||||
|
return false;
|
||||||
|
} catch (error) {
|
||||||
|
hide();
|
||||||
|
message.error(!id ? '新增失败,请重试!' : '保存失败,请重试!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除节点
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const handleRemove = async (fields: API.PbcFashionTrend_) => {
|
||||||
|
const hide = message.loading('正在删除');
|
||||||
|
if (!fields.pbcId) return false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const msg = await removeFashionTrendUsingGet({ pbcId: fields.pbcId });
|
||||||
|
hide();
|
||||||
|
if (msg.retcode) {
|
||||||
|
message.success('删除成功,即将刷新');
|
||||||
|
} else {
|
||||||
|
message.error(msg.retmsg ?? '删除失败,请重试');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
hide();
|
||||||
|
message.error('删除失败,请重试');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const TableList: React.FC<any> = () => {
|
||||||
|
const access: any = useAccess();
|
||||||
|
const actionRef = useRef<ActionType>();
|
||||||
|
const [updateModalVisible, handleUpdateModalVisible] = useState<boolean>(false);
|
||||||
|
const [stepFormValues, setStepFormValues] = useState<API.PbcFashionTrend_>({});
|
||||||
|
|
||||||
|
const handleAdd = async (fields: API.PbcFashionTrend_) => {
|
||||||
|
const hide = message.loading('正在提交');
|
||||||
|
try {
|
||||||
|
const msg = await addOrUpdateFashionTrendUsingPost(fields);
|
||||||
|
hide();
|
||||||
|
if (msg.retcode) {
|
||||||
|
message.success(!fields.pbcId ? '添加成功' : '更新成功');
|
||||||
|
handleUpdateModalVisible(false);
|
||||||
|
actionRef.current?.reload();
|
||||||
|
} else {
|
||||||
|
message.error(msg.retmsg ?? '操作失败,请重试');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
hide();
|
||||||
|
message.error('操作失败,请重试');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns: ProColumns<API.PbcFashionTrend_>[] = [
|
||||||
|
{
|
||||||
|
title: '标题',
|
||||||
|
dataIndex: 'pbcTitle',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '类型',
|
||||||
|
dataIndex: 'pbcType',
|
||||||
|
valueEnum: {
|
||||||
|
1: '图片',
|
||||||
|
2: '视频',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
dataIndex: 'pbcCreateAt',
|
||||||
|
valueType: 'date',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
valueType: 'option',
|
||||||
|
width: 180,
|
||||||
|
render: (text, record) => (
|
||||||
|
<span>
|
||||||
|
<Access key="switch" accessible={access.fashionTrendUpdateState}>
|
||||||
|
<Switch
|
||||||
|
checked={record.pbcState === 1}
|
||||||
|
onChange={async (value) => {
|
||||||
|
const success = await handleUpdateState(record.pbcId || 0, value ? 1 : 2);
|
||||||
|
if (success) {
|
||||||
|
if (actionRef.current) {
|
||||||
|
actionRef.current.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Access>
|
||||||
|
<Access key="config" accessible={access.fashionTrendSave}>
|
||||||
|
<Button
|
||||||
|
size="small"
|
||||||
|
type="link"
|
||||||
|
onClick={() => {
|
||||||
|
handleUpdateModalVisible(true);
|
||||||
|
setStepFormValues(record);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</Button>
|
||||||
|
</Access>
|
||||||
|
<Access key="remove" accessible={access.fashionTrendRemove}>
|
||||||
|
<Popconfirm
|
||||||
|
title={`确定需要删除该流行趋势?`}
|
||||||
|
onConfirm={async () => {
|
||||||
|
const success = await handleRemove(record);
|
||||||
|
if (success) actionRef.current?.reload();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Button size="small" type="link" danger>
|
||||||
|
删除
|
||||||
|
</Button>
|
||||||
|
</Popconfirm>
|
||||||
|
</Access>
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<PageContainer
|
||||||
|
header={{
|
||||||
|
title: '',
|
||||||
|
breadcrumb: {},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ProTable<API.PbcFashionTrend_>
|
||||||
|
columns={columns}
|
||||||
|
actionRef={actionRef}
|
||||||
|
request={fetchData}
|
||||||
|
rowKey="pbcId"
|
||||||
|
size="small"
|
||||||
|
bordered
|
||||||
|
search={{
|
||||||
|
labelWidth: 'auto',
|
||||||
|
span: 6,
|
||||||
|
optionRender: ({ searchText }, { form }) => {
|
||||||
|
return [
|
||||||
|
<Button
|
||||||
|
key="button"
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
form?.submit();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{searchText}
|
||||||
|
</Button>,
|
||||||
|
<Access key="primary" accessible={access.fashionTrendSave}>
|
||||||
|
<Button
|
||||||
|
icon={<PlusOutlined />}
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
handleUpdateModalVisible(true);
|
||||||
|
setStepFormValues({
|
||||||
|
pbcId: undefined,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
新增
|
||||||
|
</Button>
|
||||||
|
</Access>,
|
||||||
|
];
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
}}
|
||||||
|
scroll={{
|
||||||
|
y: 'calc(100vh - 320px)',
|
||||||
|
}}
|
||||||
|
dateFormatter="string"
|
||||||
|
options={false}
|
||||||
|
toolBarRender={() => []}
|
||||||
|
/>
|
||||||
|
<UpdateForm
|
||||||
|
onSubmit={handleAdd}
|
||||||
|
onCancel={() => {
|
||||||
|
handleUpdateModalVisible(false);
|
||||||
|
setStepFormValues({});
|
||||||
|
}}
|
||||||
|
updateModalVisible={updateModalVisible}
|
||||||
|
values={stepFormValues}
|
||||||
|
/>
|
||||||
|
</PageContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TableList;
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
// @ts-ignore
|
||||||
|
/* eslint-disable */
|
||||||
|
import request from '@/utils/request';
|
||||||
|
|
||||||
|
/** 申请采购员,或者申请失败后编辑会重新审核,或者申请成功后编辑采购员资料 POST /b2b2c/pbcPurchaseAgentInfo/addOrUpdatePurchaseAgentInfo */
|
||||||
|
export async function addOrUpdatePurchaseAgentInfoUsingPost(
|
||||||
|
body: API.PbcPurchaseAgentInfo_,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.AjaxResultString_>(
|
||||||
|
'/b2b2c/pbcPurchaseAgentInfo/addOrUpdatePurchaseAgentInfo',
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: body,
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 后台获取申请采购员分页 分页 POST /b2b2c/pbcPurchaseAgentInfo/admin/getPurchaseAgentPage */
|
||||||
|
export async function getPurchaseAgentPageForAdminUsingPost(
|
||||||
|
body: API.PbcPurchaseAgentInfo_,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.AjaxResultIPagePbcPurchaseAgentInfo_>(
|
||||||
|
'/b2b2c/pbcPurchaseAgentInfo/admin/getPurchaseAgentPage',
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: body,
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 后台同意或者拒绝采购员申请 GET /b2b2c/pbcPurchaseAgentInfo/admin/judgePurchaseAgent */
|
||||||
|
export async function judgePurchaseAgentForAdminUsingGet(
|
||||||
|
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
||||||
|
params: API.judgePurchaseAgentForAdminUsingGETParams,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.AjaxResultString_>('/b2b2c/pbcPurchaseAgentInfo/admin/judgePurchaseAgent', {
|
||||||
|
method: 'GET',
|
||||||
|
params: {
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 后台根据id获取采购员申请详情 后台 GET /b2b2c/pbcPurchaseAgentInfo/admin/purchaseAgentDetail */
|
||||||
|
export async function purchaseAgentDetailForAdminUsingGet(
|
||||||
|
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
||||||
|
params: API.purchaseAgentDetailForAdminUsingGETParams,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.AjaxResultPbcPurchaseAgentInfo_>(
|
||||||
|
'/b2b2c/pbcPurchaseAgentInfo/admin/purchaseAgentDetail',
|
||||||
|
{
|
||||||
|
method: 'GET',
|
||||||
|
params: {
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 买家获取申请采购员分页 分页 POST /b2b2c/pbcPurchaseAgentInfo/front/getPurchaseAgentPage */
|
||||||
|
export async function getPurchaseAgentPageUsingPost(
|
||||||
|
body: API.PbcPurchaseAgentInfo_,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.AjaxResultIPagePbcPurchaseAgentInfo_>(
|
||||||
|
'/b2b2c/pbcPurchaseAgentInfo/front/getPurchaseAgentPage',
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: body,
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 前端获取采购员申请详情 后台 GET /b2b2c/pbcPurchaseAgentInfo/purchaseAgentDetail */
|
||||||
|
export async function purchaseAgentDetailUsingGet(options?: { [key: string]: any }) {
|
||||||
|
return request<API.AjaxResultPbcPurchaseAgentInfo_>(
|
||||||
|
'/b2b2c/pbcPurchaseAgentInfo/purchaseAgentDetail',
|
||||||
|
{
|
||||||
|
method: 'GET',
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue