Compare commits

..

2 Commits

Author SHA1 Message Date
befc27adae feat: show outdoor fair content in cms and portal
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled
2026-07-23 10:21:59 +08:00
bef39f6894 fix: constrain images in news detail modal 2026-07-23 10:06:22 +08:00
6 changed files with 92 additions and 40 deletions

View File

@@ -247,6 +247,12 @@ const PortalJobFairDetailPage: React.FC = () => {
<Title level={4}></Title> <Title level={4}></Title>
<Paragraph>{detail.jobFairIntroduction || '暂未提供招聘会简介。'}</Paragraph> <Paragraph>{detail.jobFairIntroduction || '暂未提供招聘会简介。'}</Paragraph>
</section> </section>
{channel === 'outdoor' && (
<section className="job-fair-detail-introduction">
<Title level={4}></Title>
<Paragraph>{detail.jobFairProcess || '暂未提供招聘会整体流程。'}</Paragraph>
</section>
)}
</Card> </Card>
) : ( ) : (
!loading && ( !loading && (

View File

@@ -157,6 +157,12 @@ const FairInfoTab: React.FC<Props> = ({ fairInfo, onFairUpdate }) => {
'--' '--'
)} )}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="招聘会简介" span={3}>
<div style={{ whiteSpace: 'pre-wrap' }}>{fairInfo.fairIntroduction || '--'}</div>
</Descriptions.Item>
<Descriptions.Item label="招聘会整体流程" span={3}>
<div style={{ whiteSpace: 'pre-wrap' }}>{fairInfo.fairProcess || '--'}</div>
</Descriptions.Item>
</Descriptions> </Descriptions>
</Card> </Card>

View File

@@ -6,6 +6,7 @@ import {
ProFormSwitch, ProFormSwitch,
ProFormSelect, ProFormSelect,
ProFormText, ProFormText,
ProFormTextArea,
} from '@ant-design/pro-components'; } from '@ant-design/pro-components';
import { Button, Divider, Form, Image, Input, message, Modal, Space, Upload } from 'antd'; import { Button, Divider, Form, Image, Input, message, Modal, Space, Upload } from 'antd';
import { PlusOutlined, UploadOutlined } from '@ant-design/icons'; import { PlusOutlined, UploadOutlined } from '@ant-design/icons';
@@ -297,6 +298,18 @@ const EditModal: React.FC<EditModalProps> = ({
colProps={{ md: 24 }} colProps={{ md: 24 }}
initialValue={false} initialValue={false}
/> />
<ProFormTextArea
name="fairIntroduction"
label="招聘会简介"
placeholder="请输入招聘会简介"
fieldProps={{ maxLength: 5000, showCount: true, autoSize: { minRows: 4, maxRows: 8 } }}
/>
<ProFormTextArea
name="fairProcess"
label="招聘会整体流程"
placeholder="请输入招聘会整体流程"
fieldProps={{ maxLength: 5000, showCount: true, autoSize: { minRows: 4, maxRows: 8 } }}
/>
<ProForm.Item label="招聘会照片" required> <ProForm.Item label="招聘会照片" required>
<Space direction="vertical" size={12}> <Space direction="vertical" size={12}>
<Upload <Upload

View File

@@ -1,9 +1,20 @@
import React from 'react'; import React from 'react';
import { Descriptions, Modal, Tag, Typography } from 'antd'; import { Descriptions, Modal, Tag, Typography } from 'antd';
import { createStyles } from 'antd-style';
import DictTag from '@/components/DictTag'; import DictTag from '@/components/DictTag';
import type { DictValueEnumObj } from '@/components/DictTag'; import type { DictValueEnumObj } from '@/components/DictTag';
import { normalizeNewsContent } from '@/utils/newsImageUrl'; import { normalizeNewsContent } from '@/utils/newsImageUrl';
const useStyles = createStyles(() => ({
content: {
'& img': {
display: 'block',
maxWidth: '100%',
height: 'auto',
},
},
}));
interface DetailModalProps { interface DetailModalProps {
open: boolean; open: boolean;
data?: API.NewsInfo.NewsInfoItem; data?: API.NewsInfo.NewsInfoItem;
@@ -11,7 +22,10 @@ interface DetailModalProps {
onCancel: () => void; onCancel: () => void;
} }
const DetailModal: React.FC<DetailModalProps> = ({ open, data, moduleEnum, onCancel }) => ( const DetailModal: React.FC<DetailModalProps> = ({ open, data, moduleEnum, onCancel }) => {
const { styles } = useStyles();
return (
<Modal <Modal
title="新闻资讯详情" title="新闻资讯详情"
open={open} open={open}
@@ -37,7 +51,7 @@ const DetailModal: React.FC<DetailModalProps> = ({ open, data, moduleEnum, onCan
<Descriptions.Item label="正文" span={2}> <Descriptions.Item label="正文" span={2}>
{data?.content ? ( {data?.content ? (
<Typography <Typography
className="news-detail-content" className={`${styles.content} news-detail-content`}
dangerouslySetInnerHTML={{ __html: normalizeNewsContent(data.content) }} dangerouslySetInnerHTML={{ __html: normalizeNewsContent(data.content) }}
/> />
) : ( ) : (
@@ -50,5 +64,6 @@ const DetailModal: React.FC<DetailModalProps> = ({ open, data, moduleEnum, onCan
</Descriptions> </Descriptions>
</Modal> </Modal>
); );
};
export default DetailModal; export default DetailModal;

View File

@@ -15,6 +15,7 @@ export interface PortalJobFairItem {
jobFairHostUnit?: string; jobFairHostUnit?: string;
jobFairOrganizeUnit?: string; jobFairOrganizeUnit?: string;
jobFairIntroduction?: string; jobFairIntroduction?: string;
jobFairProcess?: string;
jobFairPhone?: string; jobFairPhone?: string;
jobFairImage?: string; jobFairImage?: string;
enterpriseNum?: string; enterpriseNum?: string;
@@ -71,6 +72,8 @@ interface PortalOutdoorFairDetailData extends Partial<PortalJobFairItem> {
holdTime?: string; holdTime?: string;
endTime?: string; endTime?: string;
photoUrl?: string; photoUrl?: string;
fairIntroduction?: string;
fairProcess?: string;
} }
interface PortalOutdoorFairDetailResult { interface PortalOutdoorFairDetailResult {
@@ -197,7 +200,8 @@ export async function getPortalJobFairDetail(channel: JobFairChannel, jobFairId:
jobFairEndTime: fair.jobFairEndTime || fair.endTime, jobFairEndTime: fair.jobFairEndTime || fair.endTime,
jobFairHostUnit: fair.jobFairHostUnit || fair.hostUnit, jobFairHostUnit: fair.jobFairHostUnit || fair.hostUnit,
jobFairOrganizeUnit: fair.jobFairOrganizeUnit, jobFairOrganizeUnit: fair.jobFairOrganizeUnit,
jobFairIntroduction: fair.jobFairIntroduction, jobFairIntroduction: fair.jobFairIntroduction || fair.fairIntroduction,
jobFairProcess: fair.jobFairProcess || fair.fairProcess,
jobFairPhone: fair.jobFairPhone, jobFairPhone: fair.jobFairPhone,
jobFairImage: fair.jobFairImage || fair.photoUrl, jobFairImage: fair.jobFairImage || fair.photoUrl,
boothNum: boothNum:

View File

@@ -33,6 +33,10 @@ export interface OutdoorFairItem {
onlineApply: boolean; onlineApply: boolean;
/** 招聘会照片 */ /** 招聘会照片 */
photoUrl: string; photoUrl: string;
/** 招聘会简介 */
fairIntroduction?: string;
/** 招聘会整体流程 */
fairProcess?: string;
/** 当前企业ID */ /** 当前企业ID */
companyId?: number; companyId?: number;
/** 当前企业名称 */ /** 当前企业名称 */
@@ -88,6 +92,10 @@ export interface OutdoorFairForm {
applyEndTime: string; applyEndTime: string;
onlineApply: boolean; onlineApply: boolean;
photoUrl: string; photoUrl: string;
/** 招聘会简介 */
fairIntroduction?: string;
/** 招聘会整体流程 */
fairProcess?: string;
/** 更换场地时确认清空旧展位图与预定,并按新模板重建 */ /** 更换场地时确认清空旧展位图与预定,并按新模板重建 */
resetBoothMap?: boolean; resetBoothMap?: boolean;
} }