基于银龄岗(Job)实体,创建符合水墨风格的移动端岗位发布功能,实现企业用户发布招聘岗位的完整流程。
银龄岗(Job)实体核心字段:
title: 岗位名称 (必填, 最长100字符)salary: 薪资范围 (必填, 最长50字符)educationRequired: 学历要求 (必填, 最长50字符)experienceRequired: 工作年限要求 (必填, 最长50字符)workTime: 工作时间 (必填, 最长100字符)workLocation: 工作地点 (必填, 最长200字符)description: 岗位介绍 (必填, 长文本)details: 岗位详情 (必填, 长文本)publishTime: 发布时间 (日期时间)endTime: 岗位结束时间 (日期时间)companyId: 企业ID (外键关联)// 路径: src/client/mobile/components/PublishJobForm.tsx
interface PublishJobFormProps {
onSuccess?: () => void;
onCancel?: () => void;
}
// 表单数据结构
interface JobFormData {
companyId: number;
title: string;
salary: string;
educationRequired: string;
experienceRequired: string;
workTime: string;
workLocation: string;
description: string;
details: string;
publishTime: string;
endTime: string;
}
// 路径: src/client/mobile/pages/PublishPage.tsx
// 重构现有页面,集成银龄岗发布功能
var(--ink-light) (#f5f3f0)var(--text-primary) (#2f1f0f)var(--ink-medium) (#d4c4a8)var(--ink-dark) (#8b7355)var(--accent-blue) (#4a6b7c)font-serif text-2xl font-bold tracking-widefont-sans text-base font-mediumfont-sans text-basefont-sans text-smp-4space-y-448pxrounded-xl岗位名称
薪资范围
学历要求
工作年限
工作时间
工作地点
发布日期
截止日期
岗位介绍
岗位详情
const validationRules = {
companyId: { required: true, message: "请选择企业" },
title: { required: true, maxLength: 100, message: "岗位名称不能为空且不超过100字符" },
salary: { required: true, maxLength: 50, message: "薪资范围不能为空且不超过50字符" },
educationRequired: { required: true, message: "请选择学历要求" },
experienceRequired: { required: true, message: "请选择工作年限要求" },
workTime: { required: true, maxLength: 100, message: "工作时间不能为空且不超过100字符" },
workLocation: { required: true, maxLength: 200, message: "工作地点不能为空且不超过200字符" },
description: { required: true, minLength: 10, message: "岗位介绍不能为空且不少于10字符" },
details: { required: true, minLength: 20, message: "岗位详情不能为空且不少于20字符" },
endTime: { required: true, validator: (value, form) => value > form.publishTime }
};
POST /api/v1/silver-jobs/jobs// 组件状态
const [formData, setFormData] = useState<JobFormData>(initialData);
const [loading, setLoading] = useState(false);
const [errors, setErrors] = useState<Record<string, string>>({});
const [companies, setCompanies] = useState<Company[]>([]);
GET /api/v1/silver-jobs/companies
参数: { userId: currentUser.id }
POST /api/v1/silver-jobs/jobs
请求体: CreateJobDto
/* 小屏手机 */
@media (max-width: 375px) {
.form-container { padding: 12px; }
.input-field { font-size: 16px; }
}
/* 标准手机 */
@media (min-width: 375px) {
.form-container { padding: 16px; }
}
/* 大屏手机 */
@media (min-width: 414px) {
.form-container { padding: 20px; }
}
aria-labelaria-live="polite"aria-required="true"var(--accent-red)message.success({
content: '岗位发布成功!',
duration: 3,
style: { color: 'var(--accent-green)' }
});