Parcourir la source

✨ feat(job): add contact information and job type to publish job form

- add contact person and phone number fields with validation
- add job type selection dropdown with options: 全职, 兼职, 临时, 实习, 钟点工, 志愿者
- update API request payload to include new fields
- add form validation for contact person, phone, and job type
- set default job type to "兼职"
- fix minor formatting issues in date input styles
yourname il y a 7 mois
Parent
commit
c60cbf704a
1 fichiers modifiés avec 101 ajouts et 3 suppressions
  1. 101 3
      src/client/mobile/components/PublishJobForm.tsx

+ 101 - 3
src/client/mobile/components/PublishJobForm.tsx

@@ -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