</head> | </head> | ||||
<body> | <body> | ||||
<div id="root"></div> | <div id="root"></div> | ||||
<script src="/umi.053d2904.js"></script> | |||||
<script src="/umi.c3114048.js"></script> | |||||
</body> | </body> | ||||
</html> | </html> |
import { HomeOutlined, LogoutOutlined, FileTextOutlined } from '@ant-design/icons'; | import { HomeOutlined, LogoutOutlined, FileTextOutlined } from '@ant-design/icons'; | ||||
import { baseUrl } from './constants/index' | import { baseUrl } from './constants/index' | ||||
import routes from '../config/routes' | import routes from '../config/routes' | ||||
import { history, useModel } from '@umijs/max'; | |||||
import { history, useModel, Link } from '@umijs/max'; | |||||
import { filterRoutesByAccess, findAccessIndex } from './utils/RouteHelper' | import { filterRoutesByAccess, findAccessIndex } from './utils/RouteHelper' | ||||
import LoginIndex from '@/components/Login/Index/index' | import LoginIndex from '@/components/Login/Index/index' | ||||
headerTitleRender: (logo, title, props) => { | headerTitleRender: (logo, title, props) => { | ||||
return ( | return ( | ||||
<> | <> | ||||
<a href="/talent/home"> | |||||
<Flex align='center' > | |||||
{logo} | |||||
<div style={{ margin: '0 40px 0 8px', fontSize: 18, color: '#000000' }}>菊城人才网</div> | |||||
</Flex> | |||||
</a> | |||||
<div style={{cursor: 'pointer'}} onClick={() => { | |||||
localStorage.setItem('role', 'common') | |||||
history.replace('/talent/home'); | |||||
window.location.reload() | |||||
} | |||||
}> | |||||
<Flex align='center' > | |||||
{logo} | |||||
<div style={{ margin: '0 40px 0 8px', fontSize: 18, color: '#000000' }}>菊城人才网</div> | |||||
</Flex> | |||||
</div> | |||||
</> | </> | ||||
); | ); | ||||
}, | }, | ||||
}, | }, | ||||
menuDataRender: () => { | menuDataRender: () => { | ||||
if (localStorage.getItem('path') == '/talent/search/job' || | if (localStorage.getItem('path') == '/talent/search/job' || | ||||
localStorage.getItem('path') == '/talent/search/company' || | |||||
localStorage.getItem('path') == '/talent/search/company' || | |||||
localStorage.getItem('path') == '/talent/home' || | localStorage.getItem('path') == '/talent/home' || | ||||
localStorage.getItem('path') == '/talent/fair' || | localStorage.getItem('path') == '/talent/fair' || | ||||
localStorage.getItem('path') == '/talent/information' || | localStorage.getItem('path') == '/talent/information' || |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | ||||
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | ||||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | |||||
import { ConfigProvider, Button, Popconfirm, Card, Space, Row, Avatar,Flex, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | |||||
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | ||||
import { useModel, connect, history, Link } from 'umi'; | import { useModel, connect, history, Link } from 'umi'; | ||||
import { Imageprefix } from '@/constants/index' | import { Imageprefix } from '@/constants/index' | ||||
}} | }} | ||||
> | > | ||||
<div style={{ minHeight: '800px' }}> | <div style={{ minHeight: '800px' }}> | ||||
<ProList | |||||
actionRef={actionRef} | |||||
headerTitle={type} | |||||
rowKey="id" | |||||
dataSource={list} | |||||
<Row gutter={[20, 20]}> | |||||
{ | |||||
list.length > 0 && list.map((item: any, index: number) => ( | |||||
<> | |||||
<Col span={24}> | |||||
<Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> | |||||
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}> | |||||
<Space size={10} align='start'> | |||||
<Flex justify='center' align='center' style={{ width: 88 }}> | |||||
<Space direction='vertical' align='center'> | |||||
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} /> | |||||
<Tag color='#19be6e'> {item.salary_range_txt}</Tag> | |||||
</Space> | |||||
</Flex> | |||||
<Space direction='vertical' > | |||||
<Space align='center'> | |||||
<div style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div> | |||||
showActions="hover" | |||||
metas={{ | |||||
title: { | |||||
render: (text, row) => ( | |||||
<> | |||||
<Link to={{ pathname: `/talent/resume/detail?id=${row.customer_id}` }} style={{ color: '#000000', fontSize: 16, fontWeight: 'bold' }}> | |||||
{row.seekername} | |||||
</Link> | |||||
</> | |||||
) | |||||
}, | |||||
avatar: { | |||||
render: (text, row) => ( | |||||
<Avatar size={48} src={row.photo ? `${Imageprefix}${row.photo}` : '/images/onlylogo.jpg'} /> | |||||
) | |||||
}, | |||||
subTitle: { | |||||
render: (text, row) => { | |||||
return ( | |||||
<Space size={0}> | |||||
{ | |||||
row.age && <><Tag color="#cccccc">{row.age}岁</Tag></> | |||||
} | |||||
{ | |||||
row.gender && row.gender == '男' && <><Tag color="blue">{row.gender}</Tag></> | |||||
} | |||||
{ | |||||
row.gender && row.gender == '女' && <><Tag color="pink">{row.gender}</Tag></> | |||||
} | |||||
{ | |||||
row.education_txt && row.education_txt != 0 && <><Tag color="#19be6e">{row.education_txt}</Tag></> | |||||
} | |||||
{ | |||||
row.work_experience_txt && row.work_experience_txt != 0 && <> <Tag color="#5BD8A6">工作经验:{row.work_experience_txt}年</Tag></> | |||||
} | |||||
{ | |||||
item.age && <><Tag >{item.age}岁</Tag></> | |||||
} | |||||
{ | |||||
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></> | |||||
} | |||||
{ | |||||
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></> | |||||
} | |||||
</Space> | |||||
<Space> | |||||
<div> | |||||
{ | |||||
item.education_txt && item.education_txt != 0 && <>{item.education_txt}</> | |||||
} | |||||
</div> | |||||
<div> | |||||
{ | |||||
item.work_experience && item.work_experience != 0 && <> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</> | |||||
} | |||||
</div> | |||||
</Space> | |||||
<Descriptions size='small' style={{ width: '100%' }}> | |||||
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{ | |||||
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</> | |||||
}</Descriptions.Item> | |||||
<Descriptions.Item label="个人简介" span={24}>{ | |||||
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{ | |||||
__html: item?.introduction | |||||
}} ></div></> | |||||
: <><div style={{ lineHeight: 1.5 }} >无</div></> | |||||
}</Descriptions.Item> | |||||
</Space> | |||||
); | |||||
}, | |||||
}, | |||||
description: { | |||||
dataIndex: 'introduction' | |||||
}, | |||||
// actions: { | |||||
// render: () => [<StarOutlined />] | |||||
// }, | |||||
}} | |||||
/> | |||||
</div> | |||||
</Descriptions> | |||||
</Space> | |||||
</Space> | |||||
{/* <ProTable | |||||
headerTitle="推荐简历" | |||||
actionRef={actionRef} | |||||
dataSource={list} | |||||
rowKey="id" | |||||
loading={false} | |||||
search={false} | |||||
columns={[ | |||||
{ | |||||
title: '求职者', | |||||
dataIndex: 'content' | |||||
}, | |||||
{ | |||||
title: '放入时间', | |||||
dataIndex: 'content' | |||||
}, | |||||
{ | |||||
title: '操作', | |||||
valueType: 'option', | |||||
render: (text, record, _, action) => [ | |||||
<Popconfirm | |||||
title="是否删除" | |||||
onConfirm={(e) => { | |||||
// PostJobapplicantDelintro({ id: record.id }).then(res => { | |||||
// message.success('删除成功') | |||||
// actionRef.current.reload(); | |||||
// }) | |||||
}} | |||||
okText="删除" | |||||
cancelText="取消" | |||||
> | |||||
<a | |||||
key="delete" | |||||
> | |||||
恢复 | |||||
</a> | |||||
</Popconfirm> | |||||
</Space> | |||||
</Link > | |||||
], | |||||
}, | |||||
]} | |||||
/> */} | |||||
</Col > | |||||
</> | |||||
)) | |||||
} | |||||
</Row > | |||||
</div> | |||||
</ConfigProvider > | </ConfigProvider > | ||||
</> | </> |
setTotal(res.data.total) | setTotal(res.data.total) | ||||
}) | }) | ||||
} | } | ||||
headerTitle="已查看简历" | |||||
headerTitle="已获取联系方式" | |||||
/> | /> | ||||
</ConfigProvider > | </ConfigProvider > | ||||
</> | </> |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | ||||
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | ||||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | |||||
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | |||||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Col, Row, Flex, Descriptions, Pagination, Divider } from 'antd'; | |||||
import { SearchOutlined, LikeOutlined, EnvironmentOutlined, FieldTimeOutlined } from '@ant-design/icons'; | |||||
import { useModel, connect, history, Link } from 'umi'; | import { useModel, connect, history, Link } from 'umi'; | ||||
import { Imageprefix } from '@/constants/index' | import { Imageprefix } from '@/constants/index' | ||||
import { GetCompanyRecommentResume } from '@/services/apis/company'; | import { GetCompanyRecommentResume } from '@/services/apis/company'; | ||||
import EmptyResult from '@/components/Common/EmptyResult' | |||||
const HomePage: React.FC = () => { | const HomePage: React.FC = () => { | ||||
const [pageSize, setPageSize] = useState<number>(10) | const [pageSize, setPageSize] = useState<number>(10) | ||||
const [total, setTotal] = useState<number>(0) | const [total, setTotal] = useState<number>(0) | ||||
useEffect(() => { | |||||
GetCompanyRecommentResume({ page: 1, pagesize: 10, sortby: 'desc' }).then(res => { | |||||
setList(res.data.list) | |||||
setTotal(res.data.total) | |||||
}) | |||||
}, []); | |||||
return ( | return ( | ||||
<> | <> | ||||
<ConfigProvider | <ConfigProvider | ||||
}} | }} | ||||
> | > | ||||
<div style={{ minHeight: '800px' }}> | |||||
<ProList | |||||
actionRef={actionRef} | |||||
headerTitle="推荐简历" | |||||
rowKey="id" | |||||
dataSource={list} | |||||
request={async (params = {} as Record<string, any>) => | |||||
GetCompanyRecommentResume({ | |||||
page: page, | |||||
pagesize: pageSize, | |||||
sort: 'id', | |||||
sortby: 'desc', | |||||
}).then((res: any) => { | |||||
<Row gutter={[20, 20]}> | |||||
{ | |||||
list.length > 0 && list.map((item: any, index: number) => ( | |||||
<> | |||||
<Col span={24}> | |||||
<Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> | |||||
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}> | |||||
<Space size={10} align='start'> | |||||
<Flex justify='center' align='center' style={{ width: 88 }}> | |||||
<Space direction='vertical' align='center'> | |||||
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} /> | |||||
<Tag color='#19be6e'> {item.salary_range_txt}</Tag> | |||||
</Space> | |||||
</Flex> | |||||
<Space direction='vertical' > | |||||
<Space align='center'> | |||||
<div style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div> | |||||
{ | |||||
item.age && <><Tag >{item.age}岁</Tag></> | |||||
} | |||||
{ | |||||
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></> | |||||
} | |||||
{ | |||||
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></> | |||||
} | |||||
</Space> | |||||
<Space> | |||||
<div> | |||||
{ | |||||
item.education_text && item.education_text != 0 && <>{item.education_text}</> | |||||
} | |||||
</div> | |||||
{ | |||||
item.work_experience && item.work_experience != 0 ? <><div> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</div></> : '' | |||||
} | |||||
</Space> | |||||
<Descriptions size='small' style={{ width: '100%' }}> | |||||
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{ | |||||
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</> | |||||
}</Descriptions.Item> | |||||
<Descriptions.Item label="个人简介" span={24}>{ | |||||
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{ | |||||
__html: item?.introduction | |||||
}} ></div></> | |||||
: <><div style={{ lineHeight: 1.5 }} >无</div></> | |||||
}</Descriptions.Item> | |||||
</Descriptions> | |||||
</Space> | |||||
</Space> | |||||
</Space> | |||||
</Link > | |||||
</Col > | |||||
</> | |||||
)) | |||||
} | |||||
</Row > | |||||
{ | |||||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的简历" /> | |||||
} | |||||
<Flex justify='center' align='center' style={{ margin: '40px 0' }}> | |||||
<Pagination | |||||
hideOnSinglePage | |||||
total={total} | |||||
showTotal={(total) => `总共${total}条`} | |||||
current={page} | |||||
pageSize={pageSize} | |||||
pageSizeOptions={['12', '24', '36']} | |||||
onChange={(page, pageSize) => { | |||||
setPage(page) | |||||
setPageSize(pageSize) | |||||
GetCompanyRecommentResume({ page: page, pagesize: pageSize, sortby: 'desc' }).then(res => { | |||||
setList(res.data.list) | setList(res.data.list) | ||||
setTotal(res.data.total) | setTotal(res.data.total) | ||||
}) | }) | ||||
} | |||||
pagination={{ | |||||
current: page, | |||||
pageSize: pageSize, | |||||
total: total, | |||||
hideOnSinglePage: true, | |||||
align: 'center', | |||||
onChange(page, pageSize) { | |||||
setPage(page) | |||||
setPageSize(pageSize) | |||||
}, | |||||
onShowSizeChange(current, size) { | |||||
setPage(current) | |||||
setPageSize(size) | |||||
} | |||||
}} | |||||
showActions="hover" | |||||
metas={{ | |||||
title: { | |||||
render: (text, row) => ( | |||||
<> | |||||
<Link to={{ pathname: `/talent/resume/detail?id=${row.customer_id}` }} style={{ color: '#000000', fontSize: 16, fontWeight: 'bold' }}> | |||||
{row.seekername} | |||||
</Link> | |||||
</> | |||||
) | |||||
}, | |||||
avatar: { | |||||
render: (text, row) => ( | |||||
<Avatar size={48} src={row.photo ? `${Imageprefix}${row.photo}` : '/images/onlylogo.jpg'} /> | |||||
) | |||||
}, | |||||
subTitle: { | |||||
render: (text, row) => { | |||||
return ( | |||||
<Space size={0}> | |||||
<Tag color="#5BD8A6">{row.age}岁</Tag> | |||||
<Tag color="blue">{row.gender}</Tag> | |||||
<Tag color="#5BD8A6">{row.education_text}</Tag> | |||||
<Tag color="#5BD8A6">工作经验:{row.work_experience}年</Tag> | |||||
</Space> | |||||
); | |||||
}, | |||||
}, | |||||
description: { | |||||
dataIndex: 'introduction' | |||||
}, | |||||
// actions: { | |||||
// render: () => [<StarOutlined />] | |||||
// }, | |||||
}} | }} | ||||
/> | /> | ||||
</div> | |||||
{/* <ProTable | |||||
headerTitle="推荐简历" | |||||
actionRef={actionRef} | |||||
dataSource={list} | |||||
rowKey="id" | |||||
loading={false} | |||||
search={false} | |||||
columns={[ | |||||
{ | |||||
title: '求职者', | |||||
dataIndex: 'content' | |||||
}, | |||||
{ | |||||
title: '放入时间', | |||||
dataIndex: 'content' | |||||
}, | |||||
{ | |||||
title: '操作', | |||||
valueType: 'option', | |||||
render: (text, record, _, action) => [ | |||||
<Popconfirm | |||||
title="是否删除" | |||||
onConfirm={(e) => { | |||||
// PostJobapplicantDelintro({ id: record.id }).then(res => { | |||||
// message.success('删除成功') | |||||
// actionRef.current.reload(); | |||||
// }) | |||||
}} | |||||
okText="删除" | |||||
cancelText="取消" | |||||
> | |||||
<a | |||||
key="delete" | |||||
> | |||||
恢复 | |||||
</a> | |||||
</Popconfirm> | |||||
], | |||||
}, | |||||
]} | |||||
/> */} | |||||
</Flex> | |||||
</ConfigProvider > | </ConfigProvider > | ||||
</> | </> |
setTotal(res.data.total) | setTotal(res.data.total) | ||||
}) | }) | ||||
} | } | ||||
headerTitle="待看简历" | |||||
headerTitle="回收站" | |||||
/> | /> | ||||
</ConfigProvider > | </ConfigProvider > | ||||
</> | </> |
setTotal(res.data.total) | setTotal(res.data.total) | ||||
}) | }) | ||||
} | } | ||||
headerTitle="待看简历" | |||||
headerTitle="人才库" | |||||
/> | /> | ||||
</ConfigProvider > | </ConfigProvider > | ||||
</> | </> |
cardActionProps: 'actions', | cardActionProps: 'actions', | ||||
render: (text, row) => [<> | render: (text, row) => [<> | ||||
<div style={{ width: '100%', display: 'flex', justifyContent: 'space-around' }}> | <div style={{ width: '100%', display: 'flex', justifyContent: 'space-around' }}> | ||||
<Button size='small' onClick={async () => { | |||||
<Button onClick={async () => { | |||||
setDetail(row) | setDetail(row) | ||||
setOpenPreview(true); | setOpenPreview(true); | ||||
}}>编辑</Button>, | }}>编辑</Button>, | ||||
<Button size='small' onClick={() => { | |||||
<Button onClick={() => { | |||||
Modal.confirm({ | Modal.confirm({ | ||||
title: '删除部门', | title: '删除部门', | ||||
content: '确定删除部门吗?', | content: '确定删除部门吗?', |
title={<Link to={{ pathname: `/talent/company/detail?id=${localStorage.getItem('companyid')}` }} target="_blank" style={{ color: '#000000', fontSize: 16, marginRight: 10 }}> | title={<Link to={{ pathname: `/talent/company/detail?id=${localStorage.getItem('companyid')}` }} target="_blank" style={{ color: '#000000', fontSize: 16, marginRight: 10 }}> | ||||
{detail.full_name} | {detail.full_name} | ||||
</Link>} | </Link>} | ||||
extra={<Link to={{ pathname: `/manage/company/info` }} style={{ color: '#19be6e', fontSize: 14, marginRight: 10 }}> | |||||
编辑资料 | |||||
extra={<Link to={{ pathname: `/manage/company/info` }} style={{ color: '#19be6e', fontSize: 14, marginRight: 10 }}> | |||||
<Button >编辑资料</Button> | |||||
</Link>} | </Link>} | ||||
style={{ boxShadow: '0 8px 20px #f0f0f0' }}> | style={{ boxShadow: '0 8px 20px #f0f0f0' }}> | ||||
<Space direction='vertical' style={{ borderRadius: 10, width: '100%' }}> | <Space direction='vertical' style={{ borderRadius: 10, width: '100%' }}> |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { Link } from '@umijs/max'; | import { Link } from '@umijs/max'; | ||||
import { HomeOutlined, FormOutlined, CameraOutlined } from '@ant-design/icons' | import { HomeOutlined, FormOutlined, CameraOutlined } from '@ant-design/icons' | ||||
import { Space, Tabs, Button, Avatar, Row, Col, Image, Flex, Card, Descriptions, Modal } from 'antd'; | |||||
import { Space, Tabs, Button, Avatar, Row, Col, Image, Flex, Card, Descriptions, Modal, ConfigProvider } from 'antd'; | |||||
import { Imageprefix } from '@/constants/index' | import { Imageprefix } from '@/constants/index' | ||||
return ( | return ( | ||||
<> | <> | ||||
<Space direction='vertical' size={30} style={{minHeight: '800px'}}> | |||||
{/* 头部 */} | |||||
<Space direction='vertical' size={20} style={{ width: '100%', backgroundColor: '#fff', borderRadius: 8, padding: 20 }}> | |||||
<Space> | |||||
<Flex justify="center" align='flex-end' onClick={() => { setOpenPhotoPreview(true) }}> | |||||
<Avatar size={88} src={Imageprefix + detail.photo} shape='square' /><CameraOutlined /> | |||||
</Flex> | |||||
<Flex justify="center" align="center"> | |||||
<Flex justify="center" align='center' onClick={() => { setOpenPreview(true) }}> | |||||
<h1>{detail.full_name}</h1><FormOutlined /> | |||||
<ConfigProvider | |||||
theme={{ | |||||
token: { | |||||
colorPrimary: '#19be6e', | |||||
}, | |||||
components: { | |||||
Button: { | |||||
colorText: '#19be6e' | |||||
}, | |||||
} | |||||
}} | |||||
> | |||||
<Space direction='vertical' size={30} style={{ minHeight: '800px' }}> | |||||
{/* 头部 */} | |||||
<Space direction='vertical' size={20} style={{ width: '100%', backgroundColor: '#fff', borderRadius: 8, padding: 20 }}> | |||||
<Space> | |||||
<Flex justify="center" align='flex-end' onClick={() => { setOpenPhotoPreview(true) }}> | |||||
<Avatar size={88} src={Imageprefix + detail.photo} shape='square' /><CameraOutlined style={{ color: '#19be6e', fontSize: 20 }} /> | |||||
</Flex> | </Flex> | ||||
</Flex> | |||||
<Flex justify="center" align="center"> | |||||
<Flex justify="center" align='center' onClick={() => { setOpenPreview(true) }}> | |||||
<h1>{detail.full_name}</h1><FormOutlined style={{ color: '#19be6e', fontSize: 20 }} /> | |||||
</Flex> | |||||
</Flex> | |||||
</Space> | |||||
<Descriptions style={{ width: '100%' }}> | |||||
<Descriptions.Item label="社会统一信用代码">{detail.registration_number}</Descriptions.Item> | |||||
<Descriptions.Item label="注册时间">{detail.establishment_date}</Descriptions.Item> | |||||
<Descriptions.Item label="手机号">{detail.mobile}</Descriptions.Item> | |||||
<Descriptions.Item label="联系固话">{detail.phone}</Descriptions.Item> | |||||
<Descriptions.Item label="联系人">{detail.contact}</Descriptions.Item> | |||||
<Descriptions.Item label="地址">{detail.address}</Descriptions.Item> | |||||
<Descriptions.Item label="企业官网">{detail.website}</Descriptions.Item> | |||||
<Descriptions.Item label="所属行业">{detail.industry_text}{detail.industry2_text}</Descriptions.Item> | |||||
<Descriptions.Item label="企业性质">{detail.nature_text}</Descriptions.Item> | |||||
<Descriptions.Item label="企业规模">{detail.scale_text}</Descriptions.Item> | |||||
<Descriptions.Item label="企业介绍"> | |||||
<div dangerouslySetInnerHTML={{ | |||||
__html: detail?.introduction | |||||
}} ></div> | |||||
</Descriptions.Item> | |||||
</Descriptions> | |||||
</Space> | </Space> | ||||
<Descriptions style={{ width: '100%' }}> | |||||
<Descriptions.Item label="社会统一信用代码">{detail.registration_number}</Descriptions.Item> | |||||
<Descriptions.Item label="注册时间">{detail.establishment_date}</Descriptions.Item> | |||||
<Descriptions.Item label="手机号">{detail.mobile}</Descriptions.Item> | |||||
<Descriptions.Item label="联系固话">{detail.phone}</Descriptions.Item> | |||||
<Descriptions.Item label="联系人">{detail.contact}</Descriptions.Item> | |||||
<Descriptions.Item label="地址">{detail.address}</Descriptions.Item> | |||||
<Descriptions.Item label="企业官网">{detail.website}</Descriptions.Item> | |||||
<Descriptions.Item label="所属行业">{detail.industry_text}{detail.industry2_text}</Descriptions.Item> | |||||
<Descriptions.Item label="企业性质">{detail.nature_text}</Descriptions.Item> | |||||
<Descriptions.Item label="企业规模">{detail.scale_text}</Descriptions.Item> | |||||
<Descriptions.Item label="企业介绍"> | |||||
<div dangerouslySetInnerHTML={{ | |||||
__html: detail?.introduction | |||||
}} ></div> | |||||
</Descriptions.Item> | |||||
</Descriptions> | |||||
<Row gutter={[16, 16]}> | |||||
<Col span={12}> | |||||
<Card title="企业Logo" extra={<Button onClick={() => { setOpenPhotoPreview(true) }}>编辑</Button>}> | |||||
<Image src={Imageprefix + detail.photo} width={200} height={200} /> | |||||
</Card> | |||||
</Col> | |||||
<Col span={12}> | |||||
<Card title="营业执照" extra={<Button onClick={() => { setOpenLicensePreview(true) }}>编辑</Button>}> | |||||
<Image src={Imageprefix + detail.license_path} width={200} height={200} /> | |||||
</Card> | |||||
</Col> | |||||
</Row> | |||||
</Space> | </Space> | ||||
<Row gutter={[16, 16]}> | |||||
<Col span={12}> | |||||
<Card title="企业Logo" extra={<Button type='text' onClick={() => { setOpenPhotoPreview(true) }}>编辑</Button>}> | |||||
<Image src={Imageprefix + detail.photo} width={200} height={200} /> | |||||
</Card> | |||||
</Col> | |||||
<Col span={12}> | |||||
<Card title="营业执照" extra={<Button type='text' onClick={() => { setOpenLicensePreview(true) }}>编辑</Button>}> | |||||
<Image src={Imageprefix + detail.license_path} width={200} height={200} /> | |||||
</Card> | |||||
</Col> | |||||
</Row> | |||||
</Space> | |||||
<Modal | |||||
open={openPreview} | |||||
title='编辑企业信息' | |||||
centered | |||||
maskClosable={false} | |||||
footer={null} | |||||
destroyOnClose | |||||
width={1000} | |||||
onCancel={() => { | |||||
setOpenPreview(false) | |||||
}} | |||||
> | |||||
<ManageCompanyInfoBasic detail={detail} closeModel={closeModel}></ManageCompanyInfoBasic> | |||||
</Modal> | |||||
{/* 企业Logo */} | |||||
<Modal | |||||
open={openPhotoPreview} | |||||
title='上传企业Logo' | |||||
centered | |||||
maskClosable={false} | |||||
footer={null} | |||||
destroyOnClose | |||||
width={1000} | |||||
onCancel={() => { | |||||
setOpenPhotoPreview(false) | |||||
}} | |||||
> | |||||
<ManageCompanyInfoPhoto detail={detail} closeModel={closePhotoModel}></ManageCompanyInfoPhoto> | |||||
</Modal> | |||||
{/* 企业营业执照 */} | |||||
<Modal | |||||
open={openLicensePreview} | |||||
title='上传营业执照' | |||||
centered | |||||
maskClosable={false} | |||||
footer={null} | |||||
destroyOnClose | |||||
width={1000} | |||||
onCancel={() => { | |||||
setOpenLicensePreview(false) | |||||
}} | |||||
> | |||||
<ManageCompanyInfoLicense detail={detail} closeModel={closeLicenseModel}></ManageCompanyInfoLicense> | |||||
</Modal> | |||||
<Modal | |||||
open={openPreview} | |||||
title='编辑企业信息' | |||||
centered | |||||
maskClosable={false} | |||||
footer={null} | |||||
destroyOnClose | |||||
width={1000} | |||||
onCancel={() => { | |||||
setOpenPreview(false) | |||||
}} | |||||
> | |||||
<ManageCompanyInfoBasic detail={detail} closeModel={closeModel}></ManageCompanyInfoBasic> | |||||
</Modal> | |||||
{/* 企业Logo */} | |||||
<Modal | |||||
open={openPhotoPreview} | |||||
title='上传企业Logo' | |||||
centered | |||||
maskClosable={false} | |||||
footer={null} | |||||
destroyOnClose | |||||
width={1000} | |||||
onCancel={() => { | |||||
setOpenPhotoPreview(false) | |||||
}} | |||||
> | |||||
<ManageCompanyInfoPhoto detail={detail} closeModel={closePhotoModel}></ManageCompanyInfoPhoto> | |||||
</Modal> | |||||
{/* 企业营业执照 */} | |||||
<Modal | |||||
open={openLicensePreview} | |||||
title='上传营业执照' | |||||
centered | |||||
maskClosable={false} | |||||
footer={null} | |||||
destroyOnClose | |||||
width={1000} | |||||
onCancel={() => { | |||||
setOpenLicensePreview(false) | |||||
}} | |||||
> | |||||
<ManageCompanyInfoLicense detail={detail} closeModel={closeLicenseModel}></ManageCompanyInfoLicense> | |||||
</Modal> | |||||
</ConfigProvider> | |||||
</> | </> | ||||
); | ); | ||||
}; | }; |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | ||||
import { ProList, PageContainer } from '@ant-design/pro-components'; | import { ProList, PageContainer } from '@ant-design/pro-components'; | ||||
import { HomeOutlined, FormOutlined, FireOutlined } from '@ant-design/icons' | |||||
import { Space, Tabs, Button, Descriptions, Row, Col, Tag, Flex, Card, Pagination, Modal, ConfigProvider } from 'antd'; | |||||
import { HomeOutlined, SearchOutlined, FireOutlined } from '@ant-design/icons' | |||||
import { Space, Tabs, Button, Descriptions, Row, Col, Tag, Flex, Card, Input, Modal, ConfigProvider } from 'antd'; | |||||
import { Link } from '@umijs/max'; | import { Link } from '@umijs/max'; | ||||
import { Imageprefix } from '@/constants/index' | import { Imageprefix } from '@/constants/index' | ||||
const ManegeJobseekerHome: React.FC = () => { | const ManegeJobseekerHome: React.FC = () => { | ||||
const actionRef = useRef<ActionType>(); | const actionRef = useRef<ActionType>(); | ||||
const [statuslist, setStatuslist] = useState<object[]>([{ name: '发布中', id: '1' }, { name: '未发布', id: '2' }, { name: '已暂停', id: '3' }, { name: '已锁定', id: '4' }, { name: '回收站', id: '5' }, { name: '已过期', id: '6' }]) | |||||
const [activeKey, setActiveKey] = useState<string>('1') | |||||
const [statuslist, setStatuslist] = useState<object[]>([{ name: '全部', id: '0' }, { name: '发布中', id: '1' }, { name: '未发布', id: '2' }, { name: '已暂停', id: '3' }, { name: '已锁定', id: '4' }, { name: '回收站', id: '5' }, { name: '已过期', id: '6' }]) | |||||
const [activeKey, setActiveKey] = useState<string>('0') | |||||
const [list, setList] = useState<object[]>([]) | const [list, setList] = useState<object[]>([]) | ||||
const [total, setTotal] = useState<number>(0) | const [total, setTotal] = useState<number>(0) | ||||
const [page, setPage] = useState<number>(1) | const [page, setPage] = useState<number>(1) | ||||
const [pageSize, setPageSize] = useState<number>(12) | const [pageSize, setPageSize] = useState<number>(12) | ||||
const [openPreview, setOpenPreview] = useState(false); | const [openPreview, setOpenPreview] = useState(false); | ||||
const [detail, setDetail] = useState<any>({}); | const [detail, setDetail] = useState<any>({}); | ||||
const [keywordName, setKeywordName] = useState<string>(''); | |||||
const closeModel = (value: boolean) => { | const closeModel = (value: boolean) => { | ||||
pagesize: pageSize, | pagesize: pageSize, | ||||
sort: 'id', | sort: 'id', | ||||
sortby: 'desc', | sortby: 'desc', | ||||
status: Number(activeKey) | |||||
status: Number(activeKey), | |||||
keyword: keywordName | |||||
}).then((res: any) => { | }).then((res: any) => { | ||||
setList(res.data.list) | setList(res.data.list) | ||||
setTotal(res.data.total) | setTotal(res.data.total) | ||||
cardActionProps: 'actions', | cardActionProps: 'actions', | ||||
render: (text, row) => [<> | render: (text, row) => [<> | ||||
<div style={{ width: '100%', display: 'flex', justifyContent: 'space-around' }}> | <div style={{ width: '100%', display: 'flex', justifyContent: 'space-around' }}> | ||||
<Button size='small' disabled={row.status == 4 || row.status == 5} onClick={async () => { | |||||
<Button type='primary' disabled={row.status == 4 || row.status == 5} onClick={async () => { | |||||
let res = await GetCompanyJobInfo({ id: row.id }) | let res = await GetCompanyJobInfo({ id: row.id }) | ||||
setDetail(res) | setDetail(res) | ||||
setOpenPreview(true); | setOpenPreview(true); | ||||
}}>编辑</Button> | }}>编辑</Button> | ||||
<Button size='small' disabled={row.status == 3 || row.status == 4 || row.status == 5 || row.status == 6} onClick={() => { | |||||
<Button color="cyan" variant="solid" disabled={row.status == 3 || row.status == 4 || row.status == 5 || row.status == 6} onClick={() => { | |||||
Modal.confirm({ | Modal.confirm({ | ||||
title: '暂停招聘', | title: '暂停招聘', | ||||
content: '确定暂停招聘吗?', | content: '确定暂停招聘吗?', | ||||
centered: true | centered: true | ||||
}); | }); | ||||
}}>暂停招聘</Button> | }}>暂停招聘</Button> | ||||
<Button size='small' disabled={row.status === 1 || row.status == 4 || row.status == 5} onClick={() => { | |||||
<Button color="cyan" variant="solid" disabled={row.status === 1 || row.status == 4 || row.status == 5} onClick={() => { | |||||
Modal.confirm({ | Modal.confirm({ | ||||
title: '重新发布', | title: '重新发布', | ||||
content: '确定重新发布吗?', | content: '确定重新发布吗?', | ||||
centered: true | centered: true | ||||
}); | }); | ||||
}} >重新发布</Button> | }} >重新发布</Button> | ||||
<Button size='small' disabled={row.status === 5 || row.status == 4} onClick={() => { | |||||
<Button disabled={row.status === 5 || row.status == 4} onClick={() => { | |||||
Modal.confirm({ | Modal.confirm({ | ||||
title: '放入回收站', | title: '放入回收站', | ||||
content: '确定放入回收站吗?', | content: '确定放入回收站吗?', | ||||
centered: true | centered: true | ||||
}); | }); | ||||
}} >放入回收站</Button> | }} >放入回收站</Button> | ||||
<Button size='small' disabled={row.status === 1 || row.status === 3 || row.status === 2 || row.status == 4 || row.status == 6} onClick={() => { | |||||
<Button disabled={row.status === 1 || row.status === 3 || row.status === 2 || row.status == 4 || row.status == 6} onClick={() => { | |||||
Modal.confirm({ | Modal.confirm({ | ||||
title: '移出回收站', | title: '移出回收站', | ||||
content: '确定移出回收站吗?', | content: '确定移出回收站吗?', | ||||
centered: true | centered: true | ||||
}); | }); | ||||
}} >移出回收站</Button> | }} >移出回收站</Button> | ||||
<Button size='small' disabled={row.status == 4 || row.status == 5} onClick={() => { | |||||
<Button danger disabled={row.status == 4 || row.status == 5} onClick={() => { | |||||
Modal.confirm({ | Modal.confirm({ | ||||
title: '删除职位', | title: '删除职位', | ||||
content: '确定删除职位吗?', | content: '确定删除职位吗?', | ||||
onOk() { | onOk() { | ||||
PostCompanyJobDel({ id: row.id }).then(res => { | PostCompanyJobDel({ id: row.id }).then(res => { | ||||
actionRef.current?.reload() | actionRef.current?.reload() | ||||
}) | }) | ||||
}, | }, | ||||
onCancel() { | onCancel() { | ||||
> | > | ||||
<Flex justify='flex-end' align='center'> | <Flex justify='flex-end' align='center'> | ||||
<Button size='large' type='primary' onClick={() => { | |||||
setOpenPreview(true) | |||||
}}>发布一个职位</Button> | |||||
<Space> | |||||
<Space.Compact > | |||||
<Input | |||||
size='large' | |||||
prefix={<SearchOutlined style={{ color: '#19be6e' }} />} | |||||
placeholder="请输入关键词" | |||||
allowClear | |||||
value={keywordName} | |||||
onChange={(e) => { | |||||
setKeywordName(e.target.value) | |||||
}} | |||||
/> | |||||
<Button size='large' type='primary' style={{ width: 100 }} onClick={() => {actionRef.current?.reload() }}>搜索</Button> | |||||
</Space.Compact> | |||||
<Button size='large' type='primary' onClick={() => { | |||||
setOpenPreview(true) | |||||
}}>发布一个职位</Button> | |||||
</Space> | |||||
</Flex> | </Flex> | ||||
<Space direction='vertical' size={30}> | <Space direction='vertical' size={30}> | ||||
<Row gutter={[20, 20]}> | <Row gutter={[20, 20]}> | ||||
</Space> | </Space> | ||||
<Modal | <Modal | ||||
open={openPreview} | open={openPreview} | ||||
title='编辑简历信息' | |||||
title='职位信息' | |||||
centered | centered | ||||
maskClosable={false} | maskClosable={false} | ||||
footer={null} | footer={null} |
sortby: 'desc', | sortby: 'desc', | ||||
type: 1001028 | type: 1001028 | ||||
}).then(res => { | }).then(res => { | ||||
setList(res.data.seekers) | |||||
setList(res.data.seekers ? res.data.seekers : []) | |||||
getTotal(res.data.total) | getTotal(res.data.total) | ||||
}) | }) | ||||
sort: 'updated_at', | sort: 'updated_at', | ||||
sortby: 'desc' | sortby: 'desc' | ||||
}) | }) | ||||
setList(res.data.seekers) | |||||
setList(res.data.seekers ? res.data.seekers : []) | |||||
getTotal(res.data.total) | getTotal(res.data.total) | ||||
} | } | ||||
} | } |