Refactor outdoor fair management:

- Remove .DS_Store file.
- Update .gitignore to include .DS_Store.
- Modify proxy configuration to use environment variable for backend URL.
- Correct component paths in routes.
- Implement outdoor fair detail fetching with improved API call.
- Enhance EditModal for outdoor fair with dynamic dictionary options.
- Add functionality to upload outdoor fair photos.
- Update service layer to handle outdoor fair dictionary options.
This commit is contained in:
2026-06-25 11:30:40 +08:00
parent 5ecce431db
commit 93f39886d9
9 changed files with 555 additions and 245 deletions

View File

@@ -1,4 +1,4 @@
import React, { useRef, useState } from 'react';
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { useAccess, history } from '@umijs/max';
import { Button, message, Modal } from 'antd';
import { ActionType, PageContainer, ProColumns, ProTable } from '@ant-design/pro-components';
@@ -8,19 +8,57 @@ import {
addOutdoorFair,
updateOutdoorFair,
deleteOutdoorFair,
addOutdoorFairDictOption,
} from '@/services/jobportal/outdoorFair';
import type {
OutdoorFairItem,
OutdoorFairListParams,
OutdoorFairForm,
OutdoorFairDictForm,
} from '@/services/jobportal/outdoorFair';
import { getDictSelectOption, getDictValueEnum } from '@/services/system/dict';
import EditModal from './components/EditModal';
const OUTDOOR_FAIR_TYPE_DICT = 'outdoor_fair_type';
const OUTDOOR_FAIR_REGION_DICT = 'outdoor_fair_region';
const OutdoorFairList: React.FC = () => {
const access = useAccess();
const actionRef = useRef<ActionType>();
const [modalVisible, setModalVisible] = useState(false);
const [currentRow, setCurrentRow] = useState<OutdoorFairItem>();
const [fairTypeValueEnum, setFairTypeValueEnum] = useState<Record<string, any>>({});
const [fairTypeOptions, setFairTypeOptions] = useState<any[]>([]);
const [regionValueEnum, setRegionValueEnum] = useState<Record<string, any>>({});
const [regionOptions, setRegionOptions] = useState<any[]>([]);
const refreshDictOptions = useCallback(async () => {
const [typeValueEnum, typeOptions, regionEnum, regionSelectOptions] = await Promise.all([
getDictValueEnum(OUTDOOR_FAIR_TYPE_DICT),
getDictSelectOption(OUTDOOR_FAIR_TYPE_DICT),
getDictValueEnum(OUTDOOR_FAIR_REGION_DICT),
getDictSelectOption(OUTDOOR_FAIR_REGION_DICT),
]);
setFairTypeValueEnum(typeValueEnum);
setFairTypeOptions(typeOptions);
setRegionValueEnum(regionEnum);
setRegionOptions(regionSelectOptions);
}, []);
useEffect(() => {
refreshDictOptions();
}, [refreshDictOptions]);
const handleCreateDictOption = async (values: OutdoorFairDictForm) => {
const res = await addOutdoorFairDictOption(values);
if (res.code === 200) {
await refreshDictOptions();
message.success('字典项新增成功');
return true;
}
message.error(res.msg || '字典项新增失败');
return false;
};
const handleDelete = async (id: number) => {
Modal.confirm({
@@ -53,13 +91,15 @@ const OutdoorFairList: React.FC = () => {
title: '招聘会类型',
dataIndex: 'fairType',
ellipsis: true,
hideInSearch: true,
valueType: 'select',
valueEnum: fairTypeValueEnum,
},
{
title: '举办区域',
dataIndex: 'region',
ellipsis: true,
hideInSearch: true,
valueType: 'select',
valueEnum: regionValueEnum,
},
{
title: '举办地址',
@@ -175,6 +215,7 @@ const OutdoorFairList: React.FC = () => {
title: params.title,
hostUnit: params.hostUnit,
fairType: params.fairType,
region: params.region,
} as OutdoorFairListParams);
return { data: res.rows, total: res.total, success: true };
}}
@@ -196,14 +237,15 @@ const OutdoorFairList: React.FC = () => {
<EditModal
open={modalVisible}
values={currentRow}
fairTypeOptions={fairTypeOptions}
regionOptions={regionOptions}
onCreateDictOption={handleCreateDictOption}
onCancel={() => {
setModalVisible(false);
setCurrentRow(undefined);
}}
onSubmit={async (values: OutdoorFairForm) => {
const res = values.id
? await updateOutdoorFair(values)
: await addOutdoorFair(values);
const res = values.id ? await updateOutdoorFair(values) : await addOutdoorFair(values);
if (res.code === 200) {
message.success(values.id ? '修改成功' : '新增成功');
setModalVisible(false);