提交 57ecd804 作者: 龚洪江

修复:加盟入驻编辑可修改部分字段,实名认证,飞手中心

上级 3018428e
import { InterFunction, InterListFunction } from '~/api/interface'; import { InterFunction, InterItemFunction, InterListFunction } from '~/api/interface';
// 客户列表 // 客户列表
export type listAppUserType = InterListFunction< export type listAppUserType = InterListFunction<
...@@ -189,6 +189,9 @@ export type editUserApplyTagDetails = InterFunction< ...@@ -189,6 +189,9 @@ export type editUserApplyTagDetails = InterFunction<
lon: number; lon: number;
name: string; name: string;
score: number; score: number;
licenseImg: string;
remark: string;
attachmentList?: { userApplyTagId: number; url: string; type: number }[];
} }
>; >;
// 后台-编辑服务商信息 // 后台-编辑服务商信息
...@@ -233,3 +236,16 @@ export type listUserRcdType = InterListFunction< ...@@ -233,3 +236,16 @@ export type listUserRcdType = InterListFunction<
userSex: null; userSex: null;
} }
>; >;
//实名认证列表返回类型
export type listAuthPageType = InterItemFunction<
{ keyword?: string },
{
id: number;
nickName: string;
phoneNum: string;
uid: string;
userName: string;
createTime: string;
}[]
>;
...@@ -10,6 +10,7 @@ import { ...@@ -10,6 +10,7 @@ import {
editUserApplyTag, editUserApplyTag,
editUserApplyTagDetails, editUserApplyTagDetails,
listAppUserType, listAppUserType,
listAuthPageType,
listUserApplyTag, listUserApplyTag,
listUserRcdType, listUserRcdType,
userAccountUpdateType, userAccountUpdateType,
...@@ -55,4 +56,7 @@ export class CustomManageAPI { ...@@ -55,4 +56,7 @@ export class CustomManageAPI {
// 裂变-邀请列表 // 裂变-邀请列表
static listUserRcd: listUserRcdType = (data) => static listUserRcd: listUserRcdType = (data) =>
axios.post('/userapp/user-account/listUserRcd', data); axios.post('/userapp/user-account/listUserRcd', data);
// 客户-实名认证列表
static getListAuth: listAuthPageType = (data) =>
axios.post('/userapp/real-name-auth/listPage', data);
} }
...@@ -110,11 +110,6 @@ $page-background: #f3f6ff; ...@@ -110,11 +110,6 @@ $page-background: #f3f6ff;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.logo-img {
width: 32px;
height: 32px;
border-radius: 4px;
}
.logo-text { .logo-text {
min-width: 100px; min-width: 100px;
...@@ -187,6 +182,7 @@ $page-background: #f3f6ff; ...@@ -187,6 +182,7 @@ $page-background: #f3f6ff;
.ant-layout-header { .ant-layout-header {
padding: 0 10px; padding: 0 10px;
//line-height: normal;
} }
.ant-layout-sider-collapsed { .ant-layout-sider-collapsed {
......
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Header } from 'antd/es/layout/layout'; import { Header } from 'antd/es/layout/layout';
import { DownOutlined, UpOutlined } from '@ant-design/icons'; import { DownOutlined, UpOutlined } from '@ant-design/icons';
import { Button, Dropdown, MenuProps, Modal } from 'antd'; import { Button, Dropdown, Image, MenuProps, Modal } from 'antd';
import Logo from '../../../assets/icon/logo_big.png'; import Logo from '../../../assets/icon/logo_big.png';
import './index.scss'; import './index.scss';
import { REMOVE_MENU, REMOVE_MENU_ID, SET_COLLAPSE } from '~/store/module/menu'; import { REMOVE_MENU, REMOVE_MENU_ID, SET_COLLAPSE } from '~/store/module/menu';
...@@ -60,7 +60,15 @@ export function TitleView() { ...@@ -60,7 +60,15 @@ export function TitleView() {
}} }}
> >
<div className='layout-logo'> <div className='layout-logo'>
<img src={userInfo.companyInfoVO.brandLogo || Logo} className='logo-img' alt='云享飞' /> <div className='logo-img'>
<Image
preview={false}
src={userInfo.companyInfoVO.brandLogo || Logo}
alt='云享飞'
width={32}
height={32}
/>
</div>
<div className='logo-text'>{userInfo.companyInfoVO.brandName || '云享飞管理后台'}</div> <div className='logo-text'>{userInfo.companyInfoVO.brandName || '云享飞管理后台'}</div>
<div onClick={setMenuCollapsed}> <div onClick={setMenuCollapsed}>
<svg <svg
......
...@@ -29,8 +29,6 @@ export const Uploader: React.FC<PropsType> = (props) => { ...@@ -29,8 +29,6 @@ export const Uploader: React.FC<PropsType> = (props) => {
fileSize: 2, fileSize: 2,
fileLength: 1, fileLength: 1,
fileType: ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'], fileType: ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'],
// eslint-disable-next-line @typescript-eslint/no-empty-function
onChange: () => {},
defaultFileList: [], defaultFileList: [],
disabled: false, disabled: false,
}; };
...@@ -56,7 +54,7 @@ export const Uploader: React.FC<PropsType> = (props) => { ...@@ -56,7 +54,7 @@ export const Uploader: React.FC<PropsType> = (props) => {
listType, listType,
fileList, fileList,
beforeUpload: (res) => { beforeUpload: (res) => {
// console.log(fileType, res.type); console.log('文件类型-->', res);
const isType = fileType?.includes(res.type); const isType = fileType?.includes(res.type);
const isSize = res.size / 1024 / 1024 < (fileSize || 2); const isSize = res.size / 1024 / 1024 < (fileSize || 2);
if (!isType) { if (!isType) {
...@@ -79,38 +77,26 @@ export const Uploader: React.FC<PropsType> = (props) => { ...@@ -79,38 +77,26 @@ export const Uploader: React.FC<PropsType> = (props) => {
// 上传到服务器 // 上传到服务器
const formData = new FormData(); const formData = new FormData();
formData.append('uploadFile', res.file); formData.append('uploadFile', res.file);
CommonAPI.uploadOssBP(formData).then( CommonAPI.uploadOssBP(formData).then(({ result }) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment setFileList([
// @ts-ignore ...fileList,
//(val: { result: { filePath: string } }) => { {
({ result }) => { id: new Date().getTime(),
// console.log(result); uid: new Date().getTime(),
setFileList([ name: (res.file as any).name,
...fileList, url: result,
{ },
id: new Date().getTime(), ]);
uid: new Date().getTime(), onChange?.([
// eslint-disable-next-line @typescript-eslint/ban-ts-comment ...fileList,
// @ts-ignore {
name: res.file.name, id: new Date().getTime(),
// url: val.result.filePath, uid: new Date().getTime(),
url: result, name: (res.file as any).name,
}, url: result,
]); },
onChange?.([ ]);
...fileList, });
{
id: new Date().getTime(),
uid: new Date().getTime(),
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
name: res.file.name,
// url: val.result.filePath,
url: result,
},
]);
},
);
} else { } else {
setFileList([...fileList, res.file]); setFileList([...fileList, res.file]);
onChange?.([...fileList, res.file]); onChange?.([...fileList, res.file]);
......
...@@ -131,6 +131,7 @@ function LoginView() { ...@@ -131,6 +131,7 @@ function LoginView() {
{qrCodeUrl ? ( {qrCodeUrl ? (
<Image src={qrCodeUrl} alt='' width={200} height={200} preview={false} /> <Image src={qrCodeUrl} alt='' width={200} height={200} preview={false} />
) : ( ) : (
// 加载二维码
<QRCode value='https://ant.design/' status='loading' /> <QRCode value='https://ant.design/' status='loading' />
)} )}
</div> </div>
......
...@@ -5,9 +5,11 @@ import { ...@@ -5,9 +5,11 @@ import {
listUserApplyTag, listUserApplyTag,
} from '~/api/interface/customManageType'; } from '~/api/interface/customManageType';
import { InterDataType, InterListType, InterReqType } from '~/api/interface'; import { InterDataType, InterListType, InterReqType } from '~/api/interface';
import { Button, Form, Input, message, Modal, Rate, Select } from 'antd'; import { Button, Form, Image, Input, message, Modal, Rate, Select } from 'antd';
import { CustomManageAPI } from '~/api'; import { CustomManageAPI } from '~/api';
import SelectMapModal from '~/components/select-map'; import SelectMapModal from '~/components/select-map';
import { Uploader } from '~/components/uploader';
import { UploadOutlined } from '@ant-design/icons';
// 数据类型 // 数据类型
type DataType = InterDataType<editUserApplyTagDetails>; type DataType = InterDataType<editUserApplyTagDetails>;
...@@ -36,6 +38,10 @@ const AddEditModal: FC<propType> = (props) => { ...@@ -36,6 +38,10 @@ const AddEditModal: FC<propType> = (props) => {
const [cooperationList, setCooperationList] = useState<{ label: string; value: number }[]>([]); const [cooperationList, setCooperationList] = useState<{ label: string; value: number }[]>([]);
// 选择的地址 // 选择的地址
const [address, setAddress] = useState<{ lat: number; lon: number; address: string }>(); const [address, setAddress] = useState<{ lat: number; lon: number; address: string }>();
//附件
const [fileList, setFileList] = useState<
{ id: number; uid: number; url: string; name: string }[]
>([]);
// 关闭弹窗 // 关闭弹窗
const handleCancel = () => { const handleCancel = () => {
form.resetFields(); form.resetFields();
...@@ -51,9 +57,17 @@ const AddEditModal: FC<propType> = (props) => { ...@@ -51,9 +57,17 @@ const AddEditModal: FC<propType> = (props) => {
...res.result, ...res.result,
name: res.result.name || data?.companyName, name: res.result.name || data?.companyName,
address: res.result.address || detail?.address, address: res.result.address || detail?.address,
attachmentList: res.result.attachmentList || undefined,
}); });
setDetail(res.result); setDetail(res.result);
// console.log('获取审批详情 -->', res.result); const fileList =
res.result.attachmentList?.map((v) => ({
id: Math.random(),
uid: Math.random(),
name: v.url.split('/')[v.url.split('/').length - 1],
url: v.url,
})) || [];
setFileList(fileList);
} }
}; };
// 获取加盟列表 // 获取加盟列表
...@@ -64,6 +78,24 @@ const AddEditModal: FC<propType> = (props) => { ...@@ -64,6 +78,24 @@ const AddEditModal: FC<propType> = (props) => {
setCooperationList(list.map((i) => ({ label: i.tagName, value: i.id }))); setCooperationList(list.map((i) => ({ label: i.tagName, value: i.id })));
} }
}; };
//附件上传成功
const attachmentUploadSuccess = (
value: { id: number; uid: number; url: string; name: string }[],
) => {
setFileList(value);
form.setFieldValue(
'attachmentList',
value.map((v) => ({
type: ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.pdf'].includes(
v.url.match(/\.[^.]+$/)?.[0] as any,
)
? 1
: 0,
url: v.url,
})),
);
};
// 确认事件 // 确认事件
const handleOk = () => { const handleOk = () => {
form form
...@@ -157,6 +189,40 @@ const AddEditModal: FC<propType> = (props) => { ...@@ -157,6 +189,40 @@ const AddEditModal: FC<propType> = (props) => {
> >
<Rate allowClear /> <Rate allowClear />
</Form.Item> </Form.Item>
<Form.Item label='营业执照'>
<Image src={detail?.licenseImg} width={50} height={50} />
</Form.Item>
<Form.Item label='附件' name='attachmentList'>
<Uploader
fileUpload
listType='text'
defaultFileList={fileList}
fileLength={10}
fileSize={50}
onChange={attachmentUploadSuccess}
fileType={[
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/msword',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-excel',
'application/pdf',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'image/png',
'image/jpeg',
'image/jpg',
'image/gif',
'image/bmp',
]}
>
<Button type='primary' icon={<UploadOutlined />}>
上传
</Button>
</Uploader>
</Form.Item>
<Form.Item label='备注' name='remark'>
<Input.TextArea placeholder='请输入备注' maxLength={70} showCount rows={4} />
</Form.Item>
</Form> </Form>
</Modal> </Modal>
<SelectMapModal <SelectMapModal
......
import SearchBox, { searchColumns as searchColumnsType } from '~/components/search-box';
import { Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { useEffect, useState } from 'react';
import { CustomManageAPI } from '~/api';
import { InterDataType, InterReqListType, PaginationProps } from '~/api/interface';
import { listAuthPageType } from '~/api/interface/customManageType';
//实名认证列表返回类型
type listAuthType = InterDataType<listAuthPageType>['list'];
//实名认证列表请求类型
type listAuthParametersType = InterReqListType<listAuthPageType>;
const CustomVerification = () => {
const searchColumns: searchColumnsType[] = [
{
name: 'keyword',
label: '用户信息',
type: 'input',
placeholder: '请输入UID,姓名或手机号',
},
];
const tableColumns: ColumnsType<any> = [
{
title: 'UID',
align: 'center',
dataIndex: 'uid',
},
{
title: '昵称',
align: 'center',
dataIndex: 'nickName',
},
{
title: '姓名',
align: 'center',
dataIndex: 'userName',
},
{
title: '手机号',
align: 'center',
dataIndex: 'phoneNum',
},
{
title: '时间',
align: 'center',
dataIndex: 'createTime',
},
{
title: '备注',
align: 'center',
dataIndex: 'remark',
},
{
title: '操作',
align: 'center',
},
];
const [tableData, setTableData] = useState<listAuthType>([]);
const [query, setQuery] = useState<listAuthParametersType>();
const [pagination, setPagination] = useState<PaginationProps & { totalCount: number }>({
pageNo: 1,
pageSize: 10,
totalCount: 0,
});
const getAuthList = (query?: listAuthParametersType) => {
CustomManageAPI.getListAuth({
pageNo: pagination.pageNo,
pageSize: pagination.pageSize,
...query,
}).then(({ result }) => {
pagination.totalCount = result.totalCount;
setPagination(pagination);
setTableData(result.list || []);
});
};
//分页
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
getAuthList(query);
};
//筛选成功
const searchSuccess = (value: listAuthParametersType) => {
pagination.pageNo = 1;
pagination.pageSize = 10;
setQuery(value);
getAuthList(value);
};
useEffect(() => {
getAuthList();
}, []);
return (
<div className='custom-verification'>
<SearchBox search={searchColumns} searchData={searchSuccess} />
<Table
columns={tableColumns}
bordered
dataSource={tableData}
rowKey='id'
pagination={{
total: pagination.totalCount,
pageSize: pagination.pageSize,
current: pagination.pageNo,
showSizeChanger: true,
showQuickJumper: true,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / 共 ${total} 条数据`,
}}
/>
</div>
);
};
export default CustomVerification;
import SearchBox, { searchColumns as searchColumnsType } from '~/components/search-box';
import { Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
const FlyerList = () => {
const searchColumns: searchColumnsType[] = [
{
name: '',
label: '账号',
placeholder: '请输入UID,姓名或手机号',
type: 'input',
},
{
name: '',
label: '执照认证状态',
placeholder: '请选择执照认证状态',
type: 'select',
options: [],
},
{
name: '',
label: '场景培训认证',
placeholder: '请选择场景培训认证状态',
type: 'select',
options: [],
},
];
const tableColumns: ColumnsType<any> = [
{
title: 'UID',
align: 'center',
},
{
title: '姓名',
align: 'center',
},
{
title: '执照认证状态',
align: 'center',
},
{
title: '场景培训认证',
align: 'center',
},
{
title: '手机号',
align: 'center',
},
{
title: '申请认证时间',
align: 'center',
},
{
title: '备注',
align: 'center',
},
{
title: '操作',
align: 'center',
},
];
return (
<div className='flyer-list'>
<SearchBox search={searchColumns} />
<Table bordered columns={tableColumns} />
</div>
);
};
export default FlyerList;
...@@ -202,7 +202,7 @@ const AddEditModal: React.FC<propType> = (props) => { ...@@ -202,7 +202,7 @@ const AddEditModal: React.FC<propType> = (props) => {
wrapperCol={{ span: 20 }} wrapperCol={{ span: 20 }}
> >
<RichText <RichText
value={form.getFieldValue('detailContent')} richTextContent={form.getFieldValue('detailContent')}
onChange={(e) => form.setFieldValue('detailContent', e)} onChange={(e) => form.setFieldValue('detailContent', e)}
height={250} height={250}
/> />
......
...@@ -56,6 +56,8 @@ import LoginView from '~/pages/common/login'; ...@@ -56,6 +56,8 @@ import LoginView from '~/pages/common/login';
import CustomListView from '~/pages/customManage/customList'; import CustomListView from '~/pages/customManage/customList';
import CustomMoneyView from '~/pages/customManage/customMoney'; import CustomMoneyView from '~/pages/customManage/customMoney';
import CustomMoneyDetail from '~/pages/customManage/customMoney/detail'; import CustomMoneyDetail from '~/pages/customManage/customMoney/detail';
const CustomVerificationView = React.lazy(() => import('~/pages/customManage/customVerification'));
//资源管理 //资源管理
import MaterielManageView from '~/pages/resourceManage/materielManage'; import MaterielManageView from '~/pages/resourceManage/materielManage';
import MaterielManageDetail from '~/pages/resourceManage/materielManage/detail'; import MaterielManageDetail from '~/pages/resourceManage/materielManage/detail';
...@@ -106,14 +108,16 @@ const CategoryDetail = React.lazy(() => import('~/pages/categoryManage/category/ ...@@ -106,14 +108,16 @@ const CategoryDetail = React.lazy(() => import('~/pages/categoryManage/category/
// 目录管理 // 目录管理
const DirectoryManage = React.lazy(() => import('~/pages/categoryManage/directoryManage')); const DirectoryManage = React.lazy(() => import('~/pages/categoryManage/directoryManage'));
//飞手培训 //执照培训
const InstitutionsListView = React.lazy( const InstitutionsListView = React.lazy(
() => import('~/pages/pilotTraining/ licensureExamination/institutionsList'), () => import('~/pages/pilotTraining/ licensureExamination/institutionsList'),
); ); //机构列表
//机构上传
const AddInstitutionsView = React.lazy( const AddInstitutionsView = React.lazy(
() => import('~/pages/pilotTraining/ licensureExamination/addOrEditInstitution'), () => import('~/pages/pilotTraining/ licensureExamination/addOrEditInstitution'),
); ); //机构上传
//飞手中心
const FlyerListView = React.lazy(() => import('~/pages/flyerCenter/flyerList'));
// 系统管理 // 系统管理
import AccountManageView from '~/pages/systemManage/accountManage'; import AccountManageView from '~/pages/systemManage/accountManage';
...@@ -128,7 +132,7 @@ const CompanyDetailView = React.lazy( ...@@ -128,7 +132,7 @@ const CompanyDetailView = React.lazy(
); );
import AccountLimit from '~/pages/systemManage/limitManage/roleList'; //账号权限 import AccountLimit from '~/pages/systemManage/limitManage/roleList'; //账号权限
import LimitInfo from '~/pages/systemManage/limitManage/limitInfo'; import LimitInfo from '~/pages/systemManage/limitManage/limitInfo';
import CustomListDetail from '~/pages/customManage/customList/detail'; //权限信息 import CustomListDetail from '~/pages/customManage/customList/detail';
// const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表 // const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
// const IndustryDetailView = React.lazy( // const IndustryDetailView = React.lazy(
...@@ -206,6 +210,16 @@ export const routerList: Array<RouteObjectType> = [ ...@@ -206,6 +210,16 @@ export const routerList: Array<RouteObjectType> = [
}, },
}, },
{ {
path: '/customManage/customVerification',
element: withLoadingComponent(<CustomVerificationView />),
errorElement: <ErrorPage />,
meta: {
id: 230,
title: '实名认证',
icon: <SolutionOutlined />,
},
},
{
path: '/customManage/customList/detail', path: '/customManage/customList/detail',
element: withLoadingComponent(<CustomListDetail />), element: withLoadingComponent(<CustomListDetail />),
errorElement: <ErrorPage />, errorElement: <ErrorPage />,
...@@ -957,6 +971,28 @@ export const routerList: Array<RouteObjectType> = [ ...@@ -957,6 +971,28 @@ export const routerList: Array<RouteObjectType> = [
], ],
}, },
{ {
path: '/flyerCenter',
element: <LayoutView />,
errorElement: <ErrorPage />,
meta: {
id: 1500,
icon: <UserOutlined />,
title: '飞手中心',
},
children: [
{
path: '/flyerCenter/flyerList',
element: withLoadingComponent(<FlyerListView />),
errorElement: <ErrorPage />,
meta: {
id: 1510,
title: '飞手列表',
icon: <UserOutlined />,
},
},
],
},
{
path: '/systemManage', path: '/systemManage',
element: <LayoutView />, element: <LayoutView />,
errorElement: <ErrorPage />, errorElement: <ErrorPage />,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论