| @@ -8,6 +8,6 @@ | |||
| </head> | |||
| <body> | |||
| <div id="root"></div> | |||
| <script src="/umi.9a7953c1.js"></script> | |||
| <script src="/umi.9db507e4.js"></script> | |||
| </body> | |||
| </html> | |||
| @@ -1 +0,0 @@ | |||
| "use strict";(self.webpackChunk=self.webpackChunk||[]).push([[787],{45073:function(O,_,e){var s=e(75891),o=e(21532),a=e(32983),r=e(85893),d=function(i){var m=i.description;return(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(o.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,r.jsx)(a.Z,{description:m})})})};_.Z=(0,s.connect)(function(l){var i=l.dictModel;return{dictModel:i}})(d)},17983:function(O,_,e){e.r(_);var s=e(5574),o=e.n(s),a=e(67294),r=e(21532),d=e(42075),l=e(25593),i=e(96074),m=e(83622),M=e(68872),E=e(17788),C=e(75891),g=e(86492),h=e.n(g),D=e(33011),B=e(96990),x=e(45073),t=e(85893),A=function(){var R=(0,C.useSearchParams)(),y=o()(R,1),T=y[0],j=(0,a.useState)(null),f=o()(j,2),n=f[0],I=f[1],L=(0,a.useState)(!1),v=o()(L,2),p=v[0],P=v[1];return(0,a.useEffect)(function(){(0,D.fc)({keyword:T.get("keyword")}).then(function(c){I(c.data.recruitments&&c.data.recruitments.length>0&&c.data.recruitments[0])})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(r.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:[n&&(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(d.Z,{direction:"vertical",size:20,style:{width:"100%",minHeight:"800px",backgroundColor:"#ffffff",padding:20,borderRadius:8},children:[(0,t.jsx)(l.Z.Title,{level:3,style:{textAlign:"center"},children:n.title}),(0,t.jsxs)("div",{style:{textAlign:"center",color:"gray"},children:[" \u5F00\u653E\u65F6\u95F4\uFF1A ",n.open_date]}),(0,t.jsx)(i.Z,{}),(0,t.jsx)("div",{dangerouslySetInnerHTML:{__html:h().decode(n.content)}}),n&&n.companys&&n.companys.length>0&&(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(l.Z.Title,{level:2,style:{textAlign:"center"},children:"\u53C2\u4E0E\u4F01\u4E1A"})}),n&&n.companys&&n.companys.length>0&&n.companys.map(function(c,u){return(0,t.jsx)(t.Fragment,{})}),(0,t.jsx)(m.ZP,{type:"primary",onClick:function(){localStorage.getItem("role")&&localStorage.getItem("role")=="personal"&&M.ZP.warning("\u60A8\u5F53\u524D\u72B6\u6001\u4E0D\u662F\u4F01\u4E1A\uFF0C\u65E0\u6CD5\u70B9\u51FB"),localStorage.getItem("token")?E.Z.confirm({title:"\u53C2\u52A0\u62DB\u8058\u4F1A",content:"\u662F\u5426\u8981\u53C2\u52A0\u6B64\u62DB\u8058\u4F1A",onOk:function(){(0,D.Bt)({recruitment_id:n.id,company_id:Number(localStorage.getItem("companyid")),status:1}).then(function(W){M.ZP.success("\u53C2\u52A0\u62DB\u8058\u4F1A\u6210\u529F,\u5F85\u5BA1\u6838\u7ED3\u679C")})},onCancel:function(){console.log("Cancel")},okText:"\u53C2\u52A0",cancelText:"\u53D6\u6D88",centered:!0}):E.Z.confirm({title:"\u8BF7\u5148\u767B\u5F55",content:"\u60A8\u8FD8\u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55",onOk:function(){P(!0)},onCancel:function(){console.log("Cancel")},okText:"\u767B\u5F55",cancelText:"\u53D6\u6D88",centered:!0})},children:"\u4F01\u4E1A\u53C2\u52A0\u6B64\u62DB\u8058\u4F1A\uFF0C\u70B9\u51FB\u6B64\u6309\u94AE"})]})}),!n&&(0,t.jsx)(x.Z,{description:"\u6682\u65E0\u6570\u636E"}),(0,t.jsx)(E.Z,{open:p,centered:!0,footer:null,onCancel:function(){return P(!1)},destroyOnClose:!0,maskClosable:!1,style:{minWidth:540},children:(0,t.jsx)(B.Z,{loginChangeStatus:function(u){console.log(u),P(u)}})})]})})};_.default=A},33011:function(O,_,e){e.d(_,{fc:function(){return r},Bt:function(){return l}});var s=e(75334),o=e(55375),a={RecruitmentList:o.xw+"/recruitment/list",RecruitmentBookcompany:o.xw+"/recruitmentBook/company",RecruitmentBookAdd:o.xw+"/recruitmentbook/add"},r=(0,s.y)(a.RecruitmentList),d=(0,s.y)(a.RecruitmentBookcompany),l=(0,s.L)(a.RecruitmentBookAdd)}}]); | |||
| @@ -42,7 +42,7 @@ const HomeFamous: React.FC = () => { | |||
| }} | |||
| > | |||
| <Space direction='vertical' size={10} style={{ width: '100%' }}> | |||
| <Space direction='vertical' size={20} style={{ width: '100%' }}> | |||
| {/* <Flex justify='center' align='center'> | |||
| <Typography.Title level={2}>知名企业</Typography.Title> | |||
| </Flex> */} | |||
| @@ -1,7 +1,7 @@ | |||
| import { useState, useEffect, useRef } from 'react'; | |||
| import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
| import { ConfigProvider, Button, Flex, Input, Space, Image, Tooltip, Row, Col, Pagination, Tag, Card, Affix, Typography, Descriptions } from 'antd'; | |||
| import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | |||
| import { SearchOutlined, LikeOutlined, FieldTimeOutlined, EnvironmentOutlined } from '@ant-design/icons'; | |||
| import { useModel, connect, history, Link } from 'umi'; | |||
| import { Imageprefix } from '@/constants'; | |||
| @@ -48,25 +48,49 @@ const HomePage: React.FC = () => { | |||
| list.length > 0 && list.map((item: any, index: number) => ( | |||
| <> | |||
| <Col span={8}> | |||
| <Link to={{ pathname: `/talent/fair/detail?keyword=${item.title}` }} target="_blank" style={{ width: '100%' }}> | |||
| <Space direction='vertical' size={10} align='center' style={{ width: '100%', background: '#ffffff', borderRadius: 8 }}> | |||
| <Image src={item.photo ? `${Imageprefix}${item.photo}` : '/images/bg.jpg'} preview={false} width={'100%'} height={'210px'} style={{ borderRadius: '8px 8px 0 0' }}></Image> | |||
| <Affix style={{ position: 'absolute', top: 10, right: 0 }}> | |||
| <Tag color="#19be6e">{item.open_date}</Tag> | |||
| </Affix> | |||
| <Typography.Title level={5} style={{ width: '100%', padding: '0 10px' }} | |||
| <Link to={{ pathname: `/talent/fair/detail?id=${item.id}` }} target="_blank"> | |||
| <Flex vertical align='center' justify='center' style={{ background: '#fff', borderRadius: '4px' }}> | |||
| <div style={{ | |||
| width: '100%', | |||
| position: 'relative', | |||
| paddingTop: '56.25%', /* 16:9 的比例 */ | |||
| overflow: 'hidden' | |||
| }}> | |||
| <img src={item.photo ? `${Imageprefix}${item.photo}` : '/images/logo.jpg'} style={{ | |||
| position: 'absolute', | |||
| top: 0, | |||
| left: 0, | |||
| width: '100%', | |||
| height: '100%', | |||
| borderRadius: '8px 8px 0 0' | |||
| }} /> | |||
| </div> | |||
| <Typography.Paragraph | |||
| ellipsis={{ rows: 2 }} | |||
| style={{ fontSize: 16, fontWeight: 'bold', padding: '0 16px', marginTop: 8, minHeight: 50, width: '100%' }} | |||
| > | |||
| {item.title} | |||
| </Typography.Title> | |||
| <Descriptions style={{ width: '100%', padding: '0 10px', marginBottom: 20 }}> | |||
| <Descriptions.Item span={24} label="招聘会开放时间"> | |||
| <Tag>{item.open_date}</Tag> | |||
| </Descriptions.Item> | |||
| <Descriptions.Item span={24} label="审核结果"> | |||
| <Tag>{item.status_text}</Tag> | |||
| </Descriptions.Item> | |||
| </Descriptions> | |||
| </Space> | |||
| </Typography.Paragraph> | |||
| <Typography.Paragraph | |||
| ellipsis={{ rows: 1 }} | |||
| style={{ fontSize: 12, color: 'gray', padding: '0 16px', whiteSpace: 'nowrap', width: '100%' }} | |||
| > | |||
| <FieldTimeOutlined /> {item.open_date} {item.close_date ? <>至{item.close_date}</> : ''} | |||
| </Typography.Paragraph> | |||
| <Typography.Paragraph | |||
| ellipsis={{ rows: 1 }} | |||
| style={{ fontSize: 12, color: 'gray', padding: '0 16px', whiteSpace: 'nowrap', width: '100%' }} | |||
| > | |||
| <EnvironmentOutlined /> {item.address} | |||
| </Typography.Paragraph> | |||
| <Typography.Paragraph | |||
| ellipsis={{ rows: 1 }} | |||
| style={{ fontSize: 12, color: 'gray', padding: '0 16px', whiteSpace: 'nowrap', width: '100%' }} | |||
| > | |||
| 审核结果: <Tag style={{ fontSize: 12 }}>{item.status_text}</Tag> | |||
| </Typography.Paragraph> | |||
| </Flex > | |||
| </Link> | |||
| </Col > | |||
| </> | |||
| @@ -1,11 +1,11 @@ | |||
| import { useState, useEffect, useRef } from 'react'; | |||
| import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
| import { ConfigProvider, Button, Flex, Input, Space, Image, Row, Col, Modal, Tag, Card, Avatar, Typography, Anchor, List, Result, Divider, Statistic, message } from 'antd'; | |||
| import { PhoneOutlined, MailOutlined, EnvironmentOutlined, ArrowRightOutlined, FireOutlined, StarOutlined, PayCircleOutlined } from '@ant-design/icons'; | |||
| import { ConfigProvider, Button, Flex, Input, Space, Image, Row, Col, Modal, Tag, Card, Avatar, Typography, Tabs, Result, Divider, Statistic, message } from 'antd'; | |||
| import { PhoneOutlined, MailOutlined, EnvironmentOutlined, FieldTimeOutlined, FireOutlined, StarOutlined, PayCircleOutlined } from '@ant-design/icons'; | |||
| import { useSearchParams, connect, history, Link } from 'umi'; | |||
| import he from 'he'; | |||
| import { GetRecruitmentList, PostRecruitmentBookAdd } from '@/services/apis/fair'; | |||
| import { GetRecruitmentDetail, PostRecruitmentBookAdd } from '@/services/apis/fair'; | |||
| import LoginIndex from '@/components/Login/Index/index' | |||
| import EmptyResult from '@/components/Common/EmptyResult'; | |||
| @@ -19,8 +19,8 @@ const HomePage: React.FC = () => { | |||
| useEffect(() => { | |||
| GetRecruitmentList({ keyword: searchParams.get('keyword') }).then(res => { | |||
| setDetail(res.data.recruitments && res.data.recruitments.length > 0 && res.data.recruitments[0]) | |||
| GetRecruitmentDetail({ id: searchParams.get('id') }).then(res => { | |||
| setDetail(res.data) | |||
| }) | |||
| }, []); | |||
| @@ -42,67 +42,134 @@ const HomePage: React.FC = () => { | |||
| { | |||
| detail && <> | |||
| <Space direction='vertical' size={20} style={{ width: '100%', minHeight: '800px', backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
| <Typography.Title level={3} style={{ textAlign: 'center' }}>{detail.title}</Typography.Title> | |||
| <div style={{ textAlign: 'center', color: 'gray' }}> 开放时间: {detail.open_date}</div> | |||
| <Divider /> | |||
| <div dangerouslySetInnerHTML={{ __html: he.decode(detail.content) }} /> | |||
| { | |||
| detail && detail.companys && detail.companys.length > 0 && <> | |||
| <Typography.Title level={2} style={{ textAlign: 'center' }}>参与企业</Typography.Title> | |||
| </> | |||
| } | |||
| { | |||
| detail && detail.companys && detail.companys.length > 0 && detail.companys.map((item, index) => (<> | |||
| </>)) | |||
| } | |||
| <Button type='primary' onClick={() => { | |||
| if (localStorage.getItem('role') && localStorage.getItem('role') == 'personal') { | |||
| message.warning('您当前状态不是企业,无法点击') | |||
| } | |||
| if (!localStorage.getItem('token')) { | |||
| Modal.confirm({ | |||
| title: '请先登录', | |||
| content: '您还未登录,请先登录', | |||
| onOk() { | |||
| setOpenPreview(true) | |||
| }, | |||
| onCancel() { | |||
| console.log('Cancel'); | |||
| }, | |||
| okText: '登录', | |||
| cancelText: '取消', | |||
| centered: true | |||
| }); | |||
| } else { | |||
| Modal.confirm({ | |||
| title: '参加招聘会', | |||
| content: '是否要参加此招聘会', | |||
| onOk() { | |||
| PostRecruitmentBookAdd({ | |||
| recruitment_id: detail.id, | |||
| company_id: Number(localStorage.getItem('companyid')), | |||
| status: 1 | |||
| }).then(res => { | |||
| message.success('参加招聘会成功,待审核结果') | |||
| }) | |||
| }, | |||
| onCancel() { | |||
| console.log('Cancel'); | |||
| }, | |||
| okText: '参加', | |||
| cancelText: '取消', | |||
| centered: true | |||
| }); | |||
| } | |||
| }}>企业参加此招聘会,点击此按钮</Button> | |||
| <Space direction='vertical' size={20} style={{ width: '100%', minHeight: '1000px', padding: 20, borderRadius: 8 }}> | |||
| <Flex justify='space-between' align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
| <Space size={20} direction='vertical'> | |||
| <div style={{ fontSize: '24px' }}>{detail.title}</div> | |||
| <div><Tag color='#19be6e'>进行中</Tag> <FieldTimeOutlined /> {detail.open_date} {detail.close_date ? <>至{detail.close_date}</> : ''}</div> | |||
| <div><EnvironmentOutlined /> {detail.address}</div> | |||
| </Space> | |||
| <Space size={10} direction='vertical'> | |||
| <Button type='primary' onClick={() => { | |||
| if (localStorage.getItem('role') && localStorage.getItem('role') == 'personal') { | |||
| message.warning('您当前状态不是企业,无法点击') | |||
| } | |||
| if (!localStorage.getItem('token')) { | |||
| Modal.confirm({ | |||
| title: '请先登录', | |||
| content: '您还未登录,请先登录', | |||
| onOk() { | |||
| setOpenPreview(true) | |||
| }, | |||
| onCancel() { | |||
| console.log('Cancel'); | |||
| }, | |||
| okText: '登录', | |||
| cancelText: '取消', | |||
| centered: true | |||
| }); | |||
| } else { | |||
| Modal.confirm({ | |||
| title: '参加招聘会', | |||
| content: '是否要参加此招聘会', | |||
| onOk() { | |||
| PostRecruitmentBookAdd({ | |||
| recruitment_id: detail.id, | |||
| company_id: Number(localStorage.getItem('companyid')), | |||
| status: 1 | |||
| }).then(res => { | |||
| message.success('参加招聘会成功,待审核结果') | |||
| }) | |||
| }, | |||
| onCancel() { | |||
| console.log('Cancel'); | |||
| }, | |||
| okText: '参加', | |||
| cancelText: '取消', | |||
| centered: true | |||
| }); | |||
| } | |||
| }}>企业报名参会,点击此处</Button> | |||
| </Space> | |||
| </Flex> | |||
| <div style={{ borderRadius: 8, minHeight: '500px' }}> | |||
| <Tabs items={[ | |||
| { | |||
| label: '招聘会介绍', | |||
| key: '1', | |||
| children: <> | |||
| <div style={{ borderRadius: 8, backgroundColor: '#ffffff', padding: 20, minHeight: '500px' }}> | |||
| <div dangerouslySetInnerHTML={{ __html: he.decode(detail.content) }} /> | |||
| </div> | |||
| </>, | |||
| }, | |||
| { | |||
| label: '参与企业', | |||
| key: '2', | |||
| children: <> | |||
| <Row gutter={[16, 16]}> | |||
| { | |||
| detail && detail.companys && detail.companys.length > 0 && detail.companys.map((item, index) => (<> | |||
| <Col span={8}> | |||
| { | |||
| item.company_name && (<> | |||
| <Space size={0} direction='vertical' style={{ width: '100%', padding: 20, borderRadius: 8, backgroundColor: '#ffffff' }}> | |||
| <Space size={10} direction='vertical'> | |||
| <div style={{ fontSize: '24px', fontWeight: 'bold' }}> | |||
| {item.company_name} | |||
| </div> | |||
| </Space> | |||
| <Divider></Divider> | |||
| <Space size={10} direction='vertical' style={{ width: '100%', minHeight: 126 }}> | |||
| { | |||
| item.jobs && item.jobs.length > 0 && item.jobs.map((childItem, childIndex) => (<> | |||
| <Link to={{ pathname: `/talent/job/detail/?id=${childItem.id}` }} target="_blank" style={{ color: '#000000' }}> | |||
| <Flex justify='space-between' align='center'> | |||
| <div>{childItem.job_name}</div> | |||
| <Button size='small'>投递该职位</Button> | |||
| </Flex> | |||
| </Link> | |||
| </>)) | |||
| } | |||
| </Space> | |||
| <Tag>共{item.jobs && item.jobs.length ? item.jobs.length : 0}个职位</Tag> | |||
| </Space> | |||
| </>) | |||
| } | |||
| </Col> | |||
| </>)) | |||
| } | |||
| </Row> | |||
| </>, | |||
| }, | |||
| { | |||
| label: '参会指南', | |||
| key: '3', | |||
| children: <> | |||
| <div style={{ borderRadius: 8, backgroundColor: '#ffffff', padding: 20, minHeight: '500px' }}> | |||
| 暂无参会指南 | |||
| </div> | |||
| </>, | |||
| }, | |||
| ]}> | |||
| </Tabs> | |||
| </div> | |||
| </Space> | |||
| </> | |||
| } | |||
| { | |||
| !detail && <EmptyResult description={'暂无数据'}></EmptyResult> | |||
| !detail && <EmptyResult description={'暂无数据'}></EmptyResult> | |||
| } | |||
| {/* 登录 */} | |||
| <Modal | |||
| @@ -117,7 +184,7 @@ const HomePage: React.FC = () => { | |||
| <LoginIndex loginChangeStatus={(isLogin: boolean) => { | |||
| console.log(isLogin) | |||
| setOpenPreview(isLogin) | |||
| }}></LoginIndex> | |||
| }} type='company'></LoginIndex> | |||
| </Modal> | |||
| </ConfigProvider > | |||
| </> | |||
| @@ -3,7 +3,7 @@ import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
| import { ConfigProvider, Button, Flex, Input, Space, Image, Tooltip, Row, Col, Pagination, Tag, Card, Affix, Typography, Anchor } from 'antd'; | |||
| import { SearchOutlined, LikeOutlined, EnvironmentOutlined, FieldTimeOutlined } from '@ant-design/icons'; | |||
| import { useModel, connect, history, Link } from 'umi'; | |||
| import { Imageprefix } from '@/constants'; | |||
| import { GetRecruitmentList } from '@/services/apis/fair'; | |||
| @@ -41,7 +41,7 @@ const HomePage: React.FC = () => { | |||
| > | |||
| <PageContainer | |||
| header={{ title: '', }} | |||
| style={{ minHeight: 800 }} | |||
| style={{ minHeight: 1000 }} | |||
| > | |||
| <Flex justify='center' align='center' style={{ marginBottom: '40px' }}> | |||
| <Input | |||
| @@ -65,7 +65,7 @@ const HomePage: React.FC = () => { | |||
| list.length > 0 && list.map((item: any, index: number) => ( | |||
| <> | |||
| <Col span={6}> | |||
| <Link to={{ pathname: `/talent/fair/detail?keyword=${item.title}` }} target="_blank"> | |||
| <Link to={{ pathname: `/talent/fair/detail?id=${item.id}` }} target="_blank"> | |||
| <Flex vertical align='center' justify='center' style={{ background: '#fff', borderRadius: '4px' }}> | |||
| <div style={{ | |||
| width: '100%', | |||
| @@ -87,18 +87,19 @@ const HomePage: React.FC = () => { | |||
| style={{ fontSize: 16, fontWeight: 'bold', padding: '0 16px', marginTop: 8, minHeight: 50, width: '100%' }} | |||
| > | |||
| {item.title} | |||
| </Typography.Paragraph> | |||
| <Space size={4} style={{ | |||
| padding: '0 16px', marginBottom: 16, width: '100%', color: 'gray' | |||
| }}> | |||
| <Typography.Paragraph | |||
| ellipsis={{ rows: 1 }} | |||
| style={{ fontSize: 12, color: 'gray', padding: '0 16px', whiteSpace: 'nowrap', width: '100%' }} | |||
| > | |||
| <FieldTimeOutlined /> {item.open_date} {item.close_date ? <>至{item.close_date}</> : ''} | |||
| </Space> | |||
| <Space size={4} style={{ | |||
| padding: '0 16px', marginBottom: 16, width: '100%', color: 'gray' | |||
| }}> | |||
| </Typography.Paragraph> | |||
| <Typography.Paragraph | |||
| ellipsis={{ rows: 1 }} | |||
| style={{ fontSize: 12, color: 'gray', padding: '0 16px', whiteSpace: 'nowrap', width: '100%' }} | |||
| > | |||
| <EnvironmentOutlined /> {item.address} | |||
| </Space> | |||
| </Typography.Paragraph> | |||
| </Flex > | |||
| </Link> | |||
| @@ -70,7 +70,8 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => { | |||
| }, | |||
| Segmented: { | |||
| trackBg: '#f0f0f0', | |||
| itemSelectedColor: '#19be6e' | |||
| itemSelectedColor: '#19be6e', | |||
| trackPadding: -16 | |||
| } | |||
| } | |||
| }} | |||
| @@ -191,7 +192,7 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => { | |||
| header={{ title: '', }} | |||
| style={{ paddingTop: 0 }} | |||
| > | |||
| <Space direction='vertical' size={30} style={{ minHeight: 800 }}> | |||
| <Space direction='vertical' size={0} style={{ minHeight: 800 }}> | |||
| <Flex justify='center' align='center' id='fomaus' style={{ width: '100%' }}> | |||
| <HomeFamous></HomeFamous> | |||
| </Flex> | |||
| @@ -4,4 +4,6 @@ import {FairUrl} from '../url/fair'; | |||
| export const GetRecruitmentList = GetModel(FairUrl.RecruitmentList); | |||
| export const GetRecruitmentBookcompany = GetModel(FairUrl.RecruitmentBookcompany); | |||
| export const PostRecruitmentBookAdd = PostModel(FairUrl.RecruitmentBookAdd); | |||
| export const GetRecruitmentDetail = GetModel(FairUrl.RecruitmentDetail); | |||
| @@ -195,6 +195,6 @@ declare namespace Url { | |||
| RecruitmentList?: string; | |||
| RecruitmentBookcompany?: string; | |||
| RecruitmentBookAdd?: string; | |||
| RecruitmentDetail?: string; | |||
| } | |||
| } | |||
| @@ -1,9 +1,10 @@ | |||
| import { web } from '@/constants/index'; | |||
| export const FairUrl: Url.Fair = { | |||
| export const FairUrl: Url.Fair = { | |||
| RecruitmentList: web + '/recruitment/list', | |||
| RecruitmentBookcompany: web + '/recruitmentBook/company', | |||
| RecruitmentBookAdd: web + '/recruitmentbook/add', | |||
| RecruitmentDetail: web + '/recruitment/detail' | |||
| } | |||