流行趋势

dev-v2
Joe 8 months ago
parent 8426090206
commit 3b8eefa933

@ -266,6 +266,13 @@ export default [
access: 'operateInstructionQuery',
component: './OperatingInstructions',
},
{
name: '流行趋势',
path: '/fashion-trend',
icon: 'message',
access: 'fashionTrendQuery',
component: './FashionTrend',
},
{
name: '广告设置',
path: '/ad',

@ -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;

@ -2,41 +2,41 @@
/* eslint-disable */
import request from '@/utils/request';
/** error GET /error */
export async function errorUsingGet(options?: { [key: string]: any }) {
return request<Record<string, any>>('/error', {
/** errorHtml GET /error */
export async function errorHtmlUsingGet(options?: { [key: string]: any }) {
return request<API.ModelAndView>('/error', {
method: 'GET',
...(options || {}),
});
}
/** error PUT /error */
export async function errorUsingPut(options?: { [key: string]: any }) {
return request<Record<string, any>>('/error', {
/** errorHtml PUT /error */
export async function errorHtmlUsingPut(options?: { [key: string]: any }) {
return request<API.ModelAndView>('/error', {
method: 'PUT',
...(options || {}),
});
}
/** error POST /error */
export async function errorUsingPost(options?: { [key: string]: any }) {
return request<Record<string, any>>('/error', {
/** errorHtml POST /error */
export async function errorHtmlUsingPost(options?: { [key: string]: any }) {
return request<API.ModelAndView>('/error', {
method: 'POST',
...(options || {}),
});
}
/** error DELETE /error */
export async function errorUsingDelete(options?: { [key: string]: any }) {
return request<Record<string, any>>('/error', {
/** errorHtml DELETE /error */
export async function errorHtmlUsingDelete(options?: { [key: string]: any }) {
return request<API.ModelAndView>('/error', {
method: 'DELETE',
...(options || {}),
});
}
/** error PATCH /error */
export async function errorUsingPatch(options?: { [key: string]: any }) {
return request<Record<string, any>>('/error', {
/** errorHtml PATCH /error */
export async function errorHtmlUsingPatch(options?: { [key: string]: any }) {
return request<API.ModelAndView>('/error', {
method: 'PATCH',
...(options || {}),
});

@ -27,6 +27,7 @@ import * as pbcProductLabelConfigController from './pbcProductLabelConfigControl
import * as pbcProductLabelConfigTypeController from './pbcProductLabelConfigTypeController';
import * as pbcProductLabelHotController from './pbcProductLabelHotController';
import * as pbcProductShopCartController from './pbcProductShopCartController';
import * as pbcPurchaseAgentInfoController from './pbcPurchaseAgentInfoController';
import * as pbcQrController from './pbcQrController';
import * as pbcRecommendBusinessController from './pbcRecommendBusinessController';
import * as pbcRequirementController from './pbcRequirementController';
@ -65,6 +66,7 @@ export default {
pbcProductLabelConfigTypeController,
pbcProductLabelHotController,
pbcProductShopCartController,
pbcPurchaseAgentInfoController,
pbcRecommendBusinessController,
pbcRequirementController,
pbcRequirementReplyController,

@ -91,7 +91,7 @@ export async function getFashionTrendPageUsingPost(
);
}
/** h后台根据id删除单个趋势详情 GET /b2b2c/pbcFashionTrend/removeFashionTrend */
/** 后台根据id删除单个趋势详情 GET /b2b2c/pbcFashionTrend/removeFashionTrend */
export async function removeFashionTrendUsingGet(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.removeFashionTrendUsingGETParams,

@ -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 || {}),
},
);
}

@ -147,6 +147,12 @@ declare namespace API {
retmsg?: string;
};
type AjaxResultIPagePbcPurchaseAgentInfo_ = {
data?: IPagePbcPurchaseAgentInfo_;
retcode?: number;
retmsg?: string;
};
type AjaxResultIPagePbcRequirement_ = {
data?: IPagePbcRequirement_;
retcode?: number;
@ -489,6 +495,12 @@ declare namespace API {
retmsg?: string;
};
type AjaxResultPbcPurchaseAgentInfo_ = {
data?: PbcPurchaseAgentInfo_;
retcode?: number;
retmsg?: string;
};
type AjaxResultPbcRequirement_ = {
data?: PbcRequirement_;
retcode?: number;
@ -1075,6 +1087,14 @@ declare namespace API {
total?: number;
};
type IPagePbcPurchaseAgentInfo_ = {
current?: number;
pages?: number;
records?: PbcPurchaseAgentInfo_[];
size?: number;
total?: number;
};
type IPagePbcRequirement_ = {
current?: number;
pages?: number;
@ -1165,6 +1185,13 @@ declare namespace API {
type JSONObject = true;
type judgePurchaseAgentForAdminUsingGETParams = {
/** pbcId */
pbcId: number;
/** pbcReviewStatus */
pbcReviewStatus: number;
};
type labelDetailForAdminUsingGETParams = {
/** pbcId */
pbcId: number;
@ -2154,6 +2181,8 @@ declare namespace API {
pbcScanCnt?: number;
/** 状态,0是删除1是正常2是作废 */
pbcState?: number;
/** 缩略图 */
pbcThumbNail?: string;
/** 标题 */
pbcTitle?: string;
/** 类型1是图片2是视频 */
@ -3032,6 +3061,45 @@ declare namespace API {
productCommonDataList?: PbcProductCommonData[];
};
type PbcPurchaseAgentInfo_ = {
/** 创建时间 */
pbcCreateAt?: string;
/** 创建人 */
pbcCreateBy?: number;
/** 创建人 */
pbcCreateByUserName?: string;
/** 主键 */
pbcId?: number;
/** 年龄 */
pbcPurchaseAgentAge?: number;
/** 擅长面料用途 */
pbcPurchaseAgentFabricUse?: string;
/** 头像 */
pbcPurchaseAgentImage?: string;
/** 联系电话 */
pbcPurchaseAgentMobile?: string;
/** 采购员姓名 */
pbcPurchaseAgentName?: string;
/** 常驻区域 */
pbcPurchaseAgentResidentArea?: string;
/** 从业年数 */
pbcPurchaseAgentWorkingAge?: number;
/** 审核状态0是待审核1是审核通过2是审核被拒绝 */
pbcReviewStatus?: number;
/** 状态,0是删除1是正常2是作废 */
pbcState?: number;
/** 更新时间 */
pbcUpdateAt?: string;
/** 更新人 */
pbcUpdateBy?: number;
/** 更新人 */
pbcUpdateByUserName?: string;
/** 申请人的userId不需要传 */
pbcUserId?: number;
/** 手机验证码 */
pbcValidCode?: string;
};
type PbcRecommendBusiness_ = {
pbcBusiness?: PbcBusiness;
/** 商户id */
@ -3064,8 +3132,14 @@ declare namespace API {
type PbcRequirement_ = {
/** 当前页 */
current?: number;
/** 是否是指定小哥0不是1是 */
isPrivate?: number;
/** 条数 */
pageSize?: number;
/** 接纳的留言的id */
pbcAdoptionRequirementReplyId?: number;
/** 接纳的用户id */
pbcAdoptionUserId?: number;
/** 审核状态0表示审核中1表示审核通过2表示审核未通过 */
pbcApprovalStatus?: number;
/** 需求预算,可以填入文字描述 */
@ -3084,6 +3158,10 @@ declare namespace API {
pbcId?: number;
/** 需求图片 */
pbcImages?: string;
/** 采纳的采购员id,如果采纳的留言是采购员的话 */
pbcPurchaseAgentId?: number;
/** 当类型是指定小哥时,必传 */
pbcPurchaseAgentInfoList?: PbcPurchaseAgentInfo_[];
/** 状态,0是删除1是正常2是作废 */
pbcState?: number;
/** 需求标题 */
@ -3099,6 +3177,7 @@ declare namespace API {
publishEndTime?: string;
/** 后端使用,创建开始时间 */
publishStartTime?: string;
/** 不用传,返回的时候这个参数存放留言信息 */
replyList?: PbcRequirementReply_[];
};
@ -3957,6 +4036,11 @@ declare namespace API {
productId: number;
};
type purchaseAgentDetailForAdminUsingGETParams = {
/** pbcId */
pbcId: number;
};
type queryAuthorityUsingPOSTParams = {
/** roleId */
roleId: number;

Loading…
Cancel
Save