|
|
@@ -58,6 +58,9 @@ interface FormDataState {
|
|
|
publishTime: string;
|
|
|
endTime: string;
|
|
|
status: number;
|
|
|
+ contactPerson: string;
|
|
|
+ contactPhone: string;
|
|
|
+ jobType: string;
|
|
|
}
|
|
|
|
|
|
export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCancel }) => {
|
|
|
@@ -82,10 +85,14 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
|
|
|
publishTime: new Date().toISOString(),
|
|
|
endTime: dayjs().add(30, 'day').toISOString(),
|
|
|
status: 1,
|
|
|
+ contactPerson: '',
|
|
|
+ contactPhone: '',
|
|
|
+ jobType: '兼职',
|
|
|
});
|
|
|
|
|
|
const educationOptions = ['不限', '初中', '高中', '大专', '本科', '硕士', '博士'];
|
|
|
const experienceOptions = ['不限', '1年以下', '1-3年', '3-5年', '5-10年', '10年以上'];
|
|
|
+ const jobTypeOptions = ['全职', '兼职', '临时', '实习', '钟点工', '志愿者'];
|
|
|
|
|
|
// 获取认证企业列表
|
|
|
const fetchCertifiedCompanies = useCallback(async (keyword?: string) => {
|
|
|
@@ -199,12 +206,35 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ if (!formData.contactPerson.trim()) {
|
|
|
+ message.error('请输入联系人姓名');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!formData.contactPhone.trim()) {
|
|
|
+ message.error('请输入联系电话');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!formData.jobType.trim()) {
|
|
|
+ message.error('请选择岗位类型');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
setLoading(true);
|
|
|
|
|
|
try {
|
|
|
const response = await jobClient.$post({
|
|
|
json: {
|
|
|
- ...formData,
|
|
|
+ title: formData.title,
|
|
|
+ description: formData.description,
|
|
|
+ details: formData.details,
|
|
|
+ location: formData.workLocation,
|
|
|
+ salaryRange: formData.salary,
|
|
|
+ workHours: formData.workTime,
|
|
|
+ contactPerson: formData.contactPerson,
|
|
|
+ contactPhone: formData.contactPhone,
|
|
|
+ jobType: formData.jobType,
|
|
|
companyId: Number(formData.companyId),
|
|
|
publishTime: dayjs(formData.publishTime).toISOString(),
|
|
|
endTime: dayjs(formData.endTime).toISOString(),
|
|
|
@@ -229,6 +259,9 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
|
|
|
publishTime: new Date().toISOString(),
|
|
|
endTime: dayjs().add(30, 'day').toISOString(),
|
|
|
status: 1,
|
|
|
+ contactPerson: '',
|
|
|
+ contactPhone: '',
|
|
|
+ jobType: '兼职',
|
|
|
});
|
|
|
} else {
|
|
|
const errorData = await response.json() as { message?: string; code?: number };
|
|
|
@@ -439,6 +472,71 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
+ {/* 岗位类型 */}
|
|
|
+ <div>
|
|
|
+ <label className={`block mb-2 ${FONT_STYLES.caption} font-medium`} style={{ color: INK_COLORS.text.primary }}>
|
|
|
+ 岗位类型 *
|
|
|
+ </label>
|
|
|
+ <select
|
|
|
+ value={formData.jobType}
|
|
|
+ onChange={(e) => handleChange('jobType', e.target.value)}
|
|
|
+ className={`w-full px-4 py-3 rounded-xl border transition-all duration-300 ${FONT_STYLES.body}`}
|
|
|
+ style={{
|
|
|
+ backgroundColor: 'rgba(255,255,255,0.7)',
|
|
|
+ borderColor: INK_COLORS.ink.medium,
|
|
|
+ color: INK_COLORS.text.primary
|
|
|
+ }}
|
|
|
+ required
|
|
|
+ >
|
|
|
+ {jobTypeOptions.map(option => (
|
|
|
+ <option key={option} value={option}>{option}</option>
|
|
|
+ ))}
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 联系人信息 */}
|
|
|
+ <div className="grid grid-cols-2 gap-4">
|
|
|
+ <div>
|
|
|
+ <label className={`block mb-2 ${FONT_STYLES.caption} font-medium`} style={{ color: INK_COLORS.text.primary }}>
|
|
|
+ 联系人 *
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ value={formData.contactPerson}
|
|
|
+ onChange={(e) => handleChange('contactPerson', e.target.value)}
|
|
|
+ placeholder="请输入联系人姓名"
|
|
|
+ maxLength={50}
|
|
|
+ className={`w-full px-4 py-3 rounded-xl border transition-all duration-300 ${FONT_STYLES.body}`}
|
|
|
+ style={{
|
|
|
+ backgroundColor: 'rgba(255,255,255,0.7)',
|
|
|
+ borderColor: INK_COLORS.ink.medium,
|
|
|
+ color: INK_COLORS.text.primary
|
|
|
+ }}
|
|
|
+ required
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div>
|
|
|
+ <label className={`block mb-2 ${FONT_STYLES.caption} font-medium`} style={{ color: INK_COLORS.text.primary }}>
|
|
|
+ 联系电话 *
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="tel"
|
|
|
+ value={formData.contactPhone}
|
|
|
+ onChange={(e) => handleChange('contactPhone', e.target.value)}
|
|
|
+ placeholder="请输入联系电话"
|
|
|
+ maxLength={20}
|
|
|
+ className={`w-full px-4 py-3 rounded-xl border transition-all duration-300 ${FONT_STYLES.body}`}
|
|
|
+ style={{
|
|
|
+ backgroundColor: 'rgba(255,255,255,0.7)',
|
|
|
+ borderColor: INK_COLORS.ink.medium,
|
|
|
+ color: INK_COLORS.text.primary
|
|
|
+ }}
|
|
|
+ required
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
{/* 日期选择 */}
|
|
|
<div className="grid grid-cols-2 gap-4">
|
|
|
<div>
|
|
|
@@ -452,7 +550,7 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
|
|
|
value={dayjs(formData.publishTime).format('YYYY-MM-DD')}
|
|
|
onChange={(e) => handleChange('publishTime', e.target.value)}
|
|
|
className={`w-full pl-10 pr-4 py-3 rounded-xl border transition-all duration-300 ${FONT_STYLES.body}`}
|
|
|
- style={{
|
|
|
+ style={{
|
|
|
backgroundColor: 'rgba(255,255,255,0.7)',
|
|
|
borderColor: INK_COLORS.ink.medium,
|
|
|
color: INK_COLORS.text.primary
|
|
|
@@ -472,7 +570,7 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
|
|
|
onChange={(e) => handleChange('endTime', e.target.value)}
|
|
|
min={dayjs(formData.publishTime).format('YYYY-MM-DD')}
|
|
|
className={`w-full px-4 py-3 rounded-xl border transition-all duration-300 ${FONT_STYLES.body}`}
|
|
|
- style={{
|
|
|
+ style={{
|
|
|
backgroundColor: 'rgba(255,255,255,0.7)',
|
|
|
borderColor: INK_COLORS.ink.medium,
|
|
|
color: INK_COLORS.text.primary
|