import {
|
createHealthPopularization,
|
getHealthPopularizationDetail,
|
updateHealthPopularization,
|
uploadHealthPopularizationImage,
|
} from './service';
|
import BraftEditorCom from '@/components/BraftEditor';
|
import { PlusOutlined } from '@ant-design/icons';
|
import { history, useAccess } from '@umijs/max';
|
import { Button, Form, Image, Input, InputNumber, Switch, Upload, message } from 'antd';
|
import React, { useEffect, useMemo, useState } from 'react';
|
import './style.less';
|
|
const HealthPopularizationManagePage: React.FC = () => {
|
const access = useAccess();
|
const [form] = Form.useForm();
|
const [loading, setLoading] = useState(false);
|
const [submitting, setSubmitting] = useState(false);
|
const [uploadingCover, setUploadingCover] = useState(false);
|
const [coverImg, setCoverImg] = useState('');
|
const pathname = history.location.pathname;
|
const isCreate = pathname.endsWith('/create');
|
const listPagePath = '/live/promotion/health-popularization';
|
const recordId = useMemo(() => {
|
if (isCreate) {
|
return '';
|
}
|
const segments = pathname.split('/');
|
return segments[segments.length - 2] || '';
|
}, [isCreate, pathname]);
|
const canAccess = isCreate ? access['live:health-popularization:add'] : access['live:health-popularization:edit'];
|
|
useEffect(() => {
|
if (!canAccess) {
|
history.replace('/Welcome');
|
return;
|
}
|
const bootstrap = async () => {
|
setLoading(true);
|
try {
|
if (isCreate) {
|
setCoverImg('');
|
form.setFieldsValue({
|
title: '',
|
content: '',
|
sort: 0,
|
status: true,
|
isHomeRecommend: true,
|
});
|
return;
|
}
|
const res = await getHealthPopularizationDetail(recordId);
|
const detail = res.data;
|
setCoverImg(detail.coverImg || '');
|
form.setFieldsValue({
|
title: detail.title,
|
coverImg: detail.coverImg,
|
content: detail.content || '',
|
sort: detail.sort ?? 0,
|
status: detail.status === 1,
|
isHomeRecommend: detail.isHomeRecommend === 1,
|
});
|
} finally {
|
setLoading(false);
|
}
|
};
|
bootstrap();
|
}, [canAccess, form, isCreate, recordId]);
|
|
const handleSubmit = async () => {
|
const values = await form.validateFields();
|
const payload = {
|
title: values.title?.trim(),
|
coverImg,
|
contentType: 1,
|
content: values.content,
|
sort: values.sort,
|
status: values.status ? 1 : 0,
|
isHomeRecommend: values.isHomeRecommend ? 1 : 0,
|
};
|
setSubmitting(true);
|
try {
|
if (isCreate) {
|
await createHealthPopularization(payload);
|
message.success('新增成功');
|
} else {
|
await updateHealthPopularization(recordId, payload);
|
message.success('保存成功');
|
}
|
history.replace(`${listPagePath}?refresh=${Date.now()}`);
|
} finally {
|
setSubmitting(false);
|
}
|
};
|
|
return (
|
<div className="health-popularization-page">
|
<div className="health-popularization-page__panel">
|
<div className="health-popularization-page__title">{isCreate ? '添加健康知识' : '编辑健康知识'}</div>
|
<Form form={form} layout="vertical" className="health-popularization-edit-form">
|
<div className="health-popularization-edit-form__section-title">信息</div>
|
<div className="health-popularization-edit-form__grid">
|
<Form.Item label="标题" name="title" rules={[{ required: true, message: '请输入标题' }]}>
|
<Input placeholder="请输入" maxLength={128} disabled={loading} />
|
</Form.Item>
|
<Form.Item label="视频封面图" className="health-popularization-edit-form__upload" required>
|
<Form.Item name="coverImg" rules={[{ required: true, message: '请上传视频封面图' }]} hidden>
|
<Input />
|
</Form.Item>
|
<Upload
|
accept="image/*"
|
showUploadList={false}
|
customRequest={async (options) => {
|
setUploadingCover(true);
|
try {
|
const res = await uploadHealthPopularizationImage(options.file as File);
|
const url = res.data?.url;
|
if (!url) {
|
throw new Error('upload failed');
|
}
|
setCoverImg(url);
|
form.setFieldsValue({ coverImg: url });
|
options.onSuccess?.(res);
|
} catch (error) {
|
message.error('封面图上传失败');
|
options.onError?.(error as Error);
|
} finally {
|
setUploadingCover(false);
|
}
|
}}
|
>
|
<div className="health-popularization-edit-form__cover-box">
|
{coverImg ? (
|
<Image src={coverImg} width={96} height={96} preview={false} />
|
) : uploadingCover ? (
|
'上传中...'
|
) : (
|
<PlusOutlined />
|
)}
|
</div>
|
</Upload>
|
</Form.Item>
|
<div className="health-popularization-edit-form__switch-group">
|
<div className="health-popularization-edit-form__switch-item">
|
<span className="health-popularization-edit-form__switch-label">是否启用</span>
|
<Form.Item name="status" valuePropName="checked" rules={[{ required: true, message: '请选择是否启用' }]}>
|
<Switch />
|
</Form.Item>
|
</div>
|
<div className="health-popularization-edit-form__switch-item">
|
<span className="health-popularization-edit-form__switch-label">首页推荐</span>
|
<Form.Item
|
name="isHomeRecommend"
|
valuePropName="checked"
|
rules={[{ required: true, message: '请选择是否首页推荐' }]}
|
>
|
<Switch />
|
</Form.Item>
|
</div>
|
</div>
|
<Form.Item label="排序" name="sort" rules={[{ required: true, message: '请输入排序' }]}>
|
<InputNumber min={0} precision={0} placeholder="请输入" style={{ width: '100%' }} disabled={loading} />
|
</Form.Item>
|
<Form.Item
|
label="内容详情"
|
name="content"
|
className="health-popularization-edit-form__editor-item"
|
rules={[{ required: true, message: '请输入科普内容' }]}
|
>
|
<div className="health-popularization-edit-form__editor">
|
<BraftEditorCom
|
data={form.getFieldValue('content') || ''}
|
resultCallback={(html: string) => form.setFieldsValue({ content: html })}
|
/>
|
</div>
|
</Form.Item>
|
</div>
|
<div className="health-popularization-edit-form__footer">
|
<Button onClick={() => history.push(listPagePath)}>取消</Button>
|
<Button type="primary" loading={submitting} onClick={handleSubmit}>
|
保存
|
</Button>
|
</div>
|
</Form>
|
</div>
|
</div>
|
);
|
};
|
|
export default HealthPopularizationManagePage;
|