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

@@ -36,6 +36,7 @@ export interface OutdoorFairListParams {
title?: string;
hostUnit?: string;
fairType?: string;
region?: string;
current?: number;
pageSize?: number;
}
@@ -70,177 +71,54 @@ export interface OutdoorFairCommonResult {
code: number;
msg?: string;
data?: any;
url?: string;
fileName?: string;
newFileName?: string;
originalFilename?: string;
}
// ==================== 静态假数据 ====================
const MOCK_DATA: OutdoorFairItem[] = [
{
id: 1,
title: '2026年石河子市春季户外招聘会',
hostUnit: '第八师石河子市人力资源和社会保障局',
fairType: '综合类',
region: '第八师(石河子市)',
address: '石河子市北三路石河子大学中区图书馆前广场',
boothCount: 80,
holdTime: '2026-03-15 09:00:00',
endTime: '2026-03-15 17:00:00',
applyStartTime: '2026-03-01 00:00:00',
applyEndTime: '2026-03-10 23:59:59',
onlineApply: true,
photoUrl: 'https://picsum.photos/seed/outdoor1/400/300',
createTime: '2026-02-20 10:30:00',
},
{
id: 2,
title: '2026年阿拉尔市高校户外专场招聘会',
hostUnit: '第一师阿拉尔市人力资源和社会保障局',
fairType: '校园招聘',
region: '第一师(阿拉尔市)',
address: '阿拉尔市塔里木大道塔里木大学综合教学楼前广场',
boothCount: 60,
holdTime: '2026-04-20 09:00:00',
endTime: '2026-04-20 16:00:00',
applyStartTime: '2026-04-01 00:00:00',
applyEndTime: '2026-04-15 23:59:59',
onlineApply: true,
photoUrl: 'https://picsum.photos/seed/outdoor2/400/300',
createTime: '2026-03-01 14:00:00',
},
{
id: 3,
title: '2026年图木舒克市制造业户外招聘会',
hostUnit: '第三师图木舒克市人力资源和社会保障局',
fairType: '行业专场',
region: '第三师(图木舒克市)',
address: '图木舒克市迎宾大道市政广场',
boothCount: 120,
holdTime: '2026-05-10 08:30:00',
endTime: '2026-05-10 17:30:00',
applyStartTime: '2026-04-25 00:00:00',
applyEndTime: '2026-05-05 23:59:59',
onlineApply: false,
photoUrl: 'https://picsum.photos/seed/outdoor3/400/300',
createTime: '2026-03-10 09:00:00',
},
{
id: 4,
title: '2026年可克达拉市高新技术户外招聘会',
hostUnit: '第四师可克达拉市人力资源和社会保障局',
fairType: '高新技术专场',
region: '第四师(可克达拉市)',
address: '可克达拉市镇江路市民服务中心广场',
boothCount: 50,
holdTime: '2026-06-18 09:00:00',
endTime: '2026-06-18 16:30:00',
applyStartTime: '2026-06-01 00:00:00',
applyEndTime: '2026-06-12 23:59:59',
onlineApply: true,
photoUrl: 'https://picsum.photos/seed/outdoor4/400/300',
createTime: '2026-03-20 11:00:00',
},
{
id: 5,
title: '2026年双河市农业行业户外招聘会',
hostUnit: '第五师双河市人力资源和社会保障局',
fairType: '行业专场',
region: '第五师(双河市)',
address: '双河市人民路双河市文化广场',
boothCount: 40,
holdTime: '2026-07-08 09:00:00',
endTime: '2026-07-08 17:00:00',
applyStartTime: '2026-06-20 00:00:00',
applyEndTime: '2026-07-03 23:59:59',
onlineApply: false,
photoUrl: 'https://picsum.photos/seed/outdoor5/400/300',
createTime: '2026-04-01 08:30:00',
},
{
id: 6,
title: '2026年五家渠市电子产业户外招聘会',
hostUnit: '第六师五家渠市人力资源和社会保障局',
fairType: '行业专场',
region: '第六师(五家渠市)',
address: '五家渠市长安东街五家渠市人民广场',
boothCount: 70,
holdTime: '2026-08-15 08:30:00',
endTime: '2026-08-15 17:30:00',
applyStartTime: '2026-08-01 00:00:00',
applyEndTime: '2026-08-10 23:59:59',
onlineApply: true,
photoUrl: 'https://picsum.photos/seed/outdoor6/400/300',
createTime: '2026-04-15 10:00:00',
},
{
id: 7,
title: '2026年胡杨河市智能制造户外招聘会',
hostUnit: '第七师胡杨河市人力资源和社会保障局',
fairType: '智能制造专场',
region: '第七师(胡杨河市)',
address: '胡杨河市团结路胡杨河市创业广场',
boothCount: 55,
holdTime: '2026-09-12 09:00:00',
endTime: '2026-09-12 16:00:00',
applyStartTime: '2026-08-25 00:00:00',
applyEndTime: '2026-09-05 23:59:59',
onlineApply: true,
photoUrl: 'https://picsum.photos/seed/outdoor7/400/300',
createTime: '2026-05-01 09:30:00',
},
{
id: 8,
title: '2026年北屯市文旅行业户外招聘会',
hostUnit: '第十师北屯市人力资源和社会保障局',
fairType: '文旅专场',
region: '第十师(北屯市)',
address: '北屯市博望路北屯市文化广场',
boothCount: 35,
holdTime: '2026-10-20 09:00:00',
endTime: '2026-10-20 17:00:00',
applyStartTime: '2026-10-01 00:00:00',
applyEndTime: '2026-10-15 23:59:59',
onlineApply: false,
photoUrl: 'https://picsum.photos/seed/outdoor8/400/300',
createTime: '2026-05-10 16:00:00',
},
];
// 自增 ID
let nextId = MOCK_DATA.length + 1;
// ==================== API 接口(使用假数据) ====================
/** 户外招聘会字典新增表单 */
export interface OutdoorFairDictForm {
dictType: 'outdoor_fair_type' | 'outdoor_fair_region';
dictLabel: string;
}
const CMS_OUTDOOR_FAIR_BASE = '/api/cms/outdoor-fair';
const formatDateTime = (value: any) => {
if (value && typeof value.format === 'function') {
return value.format('YYYY-MM-DD HH:mm:ss');
}
return value;
};
const toApiPayload = (data: OutdoorFairForm) => ({
...data,
holdTime: formatDateTime(data.holdTime),
endTime: formatDateTime(data.endTime),
applyStartTime: formatDateTime(data.applyStartTime),
applyEndTime: formatDateTime(data.applyEndTime),
});
/**
* 获取户外招聘会管理列表
* GET /api/cms/outdoor-fair/list
*/
export async function getOutdoorFairList(params?: OutdoorFairListParams) {
let filtered = [...MOCK_DATA];
return request<OutdoorFairListResult>(`${CMS_OUTDOOR_FAIR_BASE}/list`, {
method: 'GET',
params,
});
}
if (params?.title) {
filtered = filtered.filter((item) => item.title.includes(params.title!));
}
if (params?.hostUnit) {
filtered = filtered.filter((item) => item.hostUnit.includes(params.hostUnit!));
}
if (params?.fairType) {
filtered = filtered.filter((item) => item.fairType.includes(params.fairType!));
}
const total = filtered.length;
const current = params?.current || 1;
const pageSize = params?.pageSize || 10;
const start = (current - 1) * pageSize;
const rows = filtered.slice(start, start + pageSize);
return {
code: 200,
msg: '操作成功',
total,
rows,
};
/**
* 获取户外招聘会详情
* GET /api/cms/outdoor-fair/{id}
*/
export async function getOutdoorFairInfo(id: number) {
return request<OutdoorFairCommonResult>(`${CMS_OUTDOOR_FAIR_BASE}/${id}`, {
method: 'GET',
});
}
/**
@@ -248,13 +126,10 @@ export async function getOutdoorFairList(params?: OutdoorFairListParams) {
* POST /api/cms/outdoor-fair
*/
export async function addOutdoorFair(data: OutdoorFairForm) {
const newItem: OutdoorFairItem = {
...data,
id: nextId++,
createTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
};
MOCK_DATA.unshift(newItem);
return { code: 200, msg: '新增成功', data: newItem };
return request<OutdoorFairCommonResult>(CMS_OUTDOOR_FAIR_BASE, {
method: 'POST',
data: toApiPayload(data),
});
}
/**
@@ -262,16 +137,10 @@ export async function addOutdoorFair(data: OutdoorFairForm) {
* PUT /api/cms/outdoor-fair
*/
export async function updateOutdoorFair(data: OutdoorFairForm) {
const index = MOCK_DATA.findIndex((item) => item.id === data.id);
if (index !== -1) {
MOCK_DATA[index] = {
...MOCK_DATA[index],
...data,
updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
};
return { code: 200, msg: '修改成功', data: MOCK_DATA[index] };
}
return { code: 404, msg: '未找到该记录' };
return request<OutdoorFairCommonResult>(CMS_OUTDOOR_FAIR_BASE, {
method: 'PUT',
data: toApiPayload(data),
});
}
/**
@@ -279,10 +148,31 @@ export async function updateOutdoorFair(data: OutdoorFairForm) {
* DELETE /api/cms/outdoor-fair/{id}
*/
export async function deleteOutdoorFair(id: number) {
const index = MOCK_DATA.findIndex((item) => item.id === id);
if (index !== -1) {
MOCK_DATA.splice(index, 1);
return { code: 200, msg: '删除成功' };
}
return { code: 404, msg: '未找到该记录' };
return request<OutdoorFairCommonResult>(`${CMS_OUTDOOR_FAIR_BASE}/${id}`, {
method: 'DELETE',
});
}
/**
* 新增户外招聘会页面使用的字典项
* POST /api/cms/outdoor-fair/dict-data
*/
export async function addOutdoorFairDictOption(data: OutdoorFairDictForm) {
return request<OutdoorFairCommonResult>(`${CMS_OUTDOOR_FAIR_BASE}/dict-data`, {
method: 'POST',
data,
});
}
/**
* 上传户外招聘会照片
* POST /api/common/upload
*/
export async function uploadOutdoorFairPhoto(file: File) {
const formData = new FormData();
formData.append('file', file);
return request<OutdoorFairCommonResult>('/api/common/upload', {
method: 'POST',
data: formData,
});
}