From 04e52a5681e848168e385b5fc9e1cadea4800745 Mon Sep 17 00:00:00 2001 From: bin <719488417@qq.com> Date: Thu, 6 Nov 2025 17:26:57 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=E6=96=B0=E5=A2=9E=E7=AE=80=E5=8E=86?= =?UTF-8?q?=E5=BA=93=E5=88=97=E8=A1=A8=E9=A1=B5,=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E5=BE=85=E5=81=9A,=20style=20:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8B=9B=E8=81=98=E6=95=B0=E6=8D=AE=E9=87=87=E9=9B=86=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E4=B8=8B=E7=9A=84=E4=B8=89=E4=B8=AA=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JobMonitor/edit.tsx | 2 +- .../JobMonitor/index.tsx | 14 +- .../MetricAdmin/edit.tsx | 16 +- .../MetricAdmin/index.tsx | 43 ++-- .../SourceManager/edit.tsx | 16 +- .../SourceManager/index.tsx | 42 ++-- src/pages/ResumeLibrary/ResumeList/detail.tsx | 12 + src/pages/ResumeLibrary/ResumeList/index.tsx | 229 ++++++++++++++++++ src/services/resumeLibrary/resumeList.ts | 14 ++ src/types/resumeLibrary/resumeList.d.ts | 52 ++++ 10 files changed, 375 insertions(+), 65 deletions(-) create mode 100644 src/pages/ResumeLibrary/ResumeList/detail.tsx create mode 100644 src/pages/ResumeLibrary/ResumeList/index.tsx create mode 100644 src/services/resumeLibrary/resumeList.ts create mode 100644 src/types/resumeLibrary/resumeList.d.ts diff --git a/src/pages/RecruitmentDataCollection/JobMonitor/edit.tsx b/src/pages/RecruitmentDataCollection/JobMonitor/edit.tsx index a12a026..a817abf 100644 --- a/src/pages/RecruitmentDataCollection/JobMonitor/edit.tsx +++ b/src/pages/RecruitmentDataCollection/JobMonitor/edit.tsx @@ -57,7 +57,7 @@ const StorageEdit: React.FC = (props) => { column={2} dataSource={props.values || {}} > - + {/* */} diff --git a/src/pages/RecruitmentDataCollection/JobMonitor/index.tsx b/src/pages/RecruitmentDataCollection/JobMonitor/index.tsx index 54c612b..5f50bd0 100644 --- a/src/pages/RecruitmentDataCollection/JobMonitor/index.tsx +++ b/src/pages/RecruitmentDataCollection/JobMonitor/index.tsx @@ -60,13 +60,13 @@ function StorageDetectionList() { }; const columns: ProColumns[] = [ - { - title: '监测ID', - dataIndex: 'detectionId', - valueType: 'text', - align: 'center', - hideInSearch: true, - }, + // { + // title: '监测ID', + // dataIndex: 'detectionId', + // valueType: 'text', + // align: 'center', + // hideInSearch: true, + // }, { title: '采集入库日期', dataIndex: 'storageDate', diff --git a/src/pages/RecruitmentDataCollection/MetricAdmin/edit.tsx b/src/pages/RecruitmentDataCollection/MetricAdmin/edit.tsx index bf70fe6..0881246 100644 --- a/src/pages/RecruitmentDataCollection/MetricAdmin/edit.tsx +++ b/src/pages/RecruitmentDataCollection/MetricAdmin/edit.tsx @@ -8,6 +8,7 @@ import { } from '@ant-design/pro-components'; import { Form } from 'antd'; import React, { useEffect } from 'react'; +import DictTag from '@/components/DictTag'; export type JobIndexFormProps = { onCancel: (flag?: boolean, formVals?: unknown) => void; @@ -15,11 +16,12 @@ export type JobIndexFormProps = { open: boolean; values?: Partial; mode?: 'view' | 'edit' | 'create'; + isActiveEnum: any; }; const JobIndexEdit: React.FC = (props) => { const [form] = Form.useForm(); - const { mode = props.values ? 'edit' : 'create' } = props; + const { mode = props.values ? 'edit' : 'create', isActiveEnum } = props; useEffect(() => { if (props.open) { @@ -53,16 +55,13 @@ const JobIndexEdit: React.FC = (props) => { submitter={false} > column={2} dataSource={props.values || {}}> - + {/* */} } /> @@ -95,10 +94,7 @@ const JobIndexEdit: React.FC = (props) => { width="md" name="isActive" label="是否启用" - valueEnum={{ - '0': '启用', - '2': '未启用', - }} + valueEnum={isActiveEnum} placeholder="请选择状态" rules={[{ required: true, message: '请选择是否启用!' }]} /> diff --git a/src/pages/RecruitmentDataCollection/MetricAdmin/index.tsx b/src/pages/RecruitmentDataCollection/MetricAdmin/index.tsx index 84a5954..da38636 100644 --- a/src/pages/RecruitmentDataCollection/MetricAdmin/index.tsx +++ b/src/pages/RecruitmentDataCollection/MetricAdmin/index.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useRef, useState } from 'react'; +import React, { Fragment, useRef, useState, useEffect } from 'react'; import { useAccess } from '@umijs/max'; import { getJobIndexList, @@ -10,6 +10,8 @@ import { import { Button, FormInstance, message, Modal } from 'antd'; import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components'; import { DeleteOutlined, FormOutlined, PlusOutlined, EyeOutlined } from '@ant-design/icons'; +import { getDictValueEnum } from '@/services/system/dict'; +import DictTag from '@/components/DictTag'; import EditJobIndexRow from './edit'; function JobIndexList() { @@ -22,8 +24,14 @@ function JobIndexList() { const [modalVisible, setModalVisible] = useState(false); const [mode, setMode] = useState<'view' | 'edit' | 'create'>('create'); const [loading, setLoading] = useState(false); + const [isActiveEnum, setIsActiveEnum] = useState([]); + + useEffect(() => { + getDictValueEnum('enable_status', true).then((data) => { + setIsActiveEnum(data); + }); + }, []); - // 删除处理 const handleRemoveOne = async (indexId: any) => { const hide = message.loading('正在删除'); if (!indexId) return true; @@ -82,13 +90,13 @@ function JobIndexList() { }; const columns: ProColumns[] = [ - { - title: '指标ID', - dataIndex: 'indexId', - valueType: 'text', - align: 'center', - hideInSearch: true, - }, + // { + // title: '指标ID', + // dataIndex: 'indexId', + // valueType: 'text', + // align: 'center', + // hideInSearch: true, + // }, { title: '指标名称', dataIndex: 'indexName', @@ -106,17 +114,13 @@ function JobIndexList() { dataIndex: 'isActive', valueType: 'select', align: 'center', - valueEnum: { - '0': { text: '启用' }, - '2': { text: '未启用' }, - }, + valueEnum: isActiveEnum, fieldProps: { - options: [ - { label: '启用', value: '0' }, - { label: '未启用', value: '2' }, - ], - defaultValue: '0', allowClear: false, + defaultValue: '1', + }, + render: (_, record) => { + return ; }, }, { @@ -200,7 +204,7 @@ function JobIndexList() { ) => { const queryParams = { ...params, - isActive: params.isActive || '0', //默认查询启用 + isActive: params.isActive || '1', //默认查询启用 }; const res = await getJobIndexList({ ...queryParams } as API.JobIndex.ListParams); return { @@ -228,6 +232,7 @@ function JobIndexList() { { try { let resData; diff --git a/src/pages/RecruitmentDataCollection/SourceManager/edit.tsx b/src/pages/RecruitmentDataCollection/SourceManager/edit.tsx index 4928c5e..b70c3ef 100644 --- a/src/pages/RecruitmentDataCollection/SourceManager/edit.tsx +++ b/src/pages/RecruitmentDataCollection/SourceManager/edit.tsx @@ -7,6 +7,7 @@ import { } from '@ant-design/pro-components'; import { Form } from 'antd'; import React, { useEffect } from 'react'; +import DictTag from '@/components/DictTag'; export type WebsiteFormProps = { onCancel: (flag?: boolean, formVals?: unknown) => void; @@ -14,11 +15,12 @@ export type WebsiteFormProps = { open: boolean; values?: Partial; mode?: 'view' | 'edit' | 'create'; + isActiveEnum: any; }; const WebsiteEdit: React.FC = (props) => { const [form] = Form.useForm(); - const { mode = props.values ? 'edit' : 'create' } = props; + const { mode = props.values ? 'edit' : 'create', isActiveEnum } = props; useEffect(() => { if (props.open) { @@ -52,17 +54,14 @@ const WebsiteEdit: React.FC = (props) => { submitter={false} > column={2} dataSource={props.values || {}}> - + {/* */} } /> @@ -114,10 +113,7 @@ const WebsiteEdit: React.FC = (props) => { width="md" name="isActive" label="是否启用" - valueEnum={{ - '0': '启用', - '2': '未启用', - }} + valueEnum={isActiveEnum} placeholder="请选择状态" rules={[{ required: true, message: '请选择是否启用!' }]} /> diff --git a/src/pages/RecruitmentDataCollection/SourceManager/index.tsx b/src/pages/RecruitmentDataCollection/SourceManager/index.tsx index 881ad58..b6f595d 100644 --- a/src/pages/RecruitmentDataCollection/SourceManager/index.tsx +++ b/src/pages/RecruitmentDataCollection/SourceManager/index.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useRef, useState } from 'react'; +import React, { Fragment, useRef, useState, useEffect } from 'react'; import { useAccess } from '@umijs/max'; import { getWebsiteList, @@ -7,8 +7,10 @@ import { updateWebsite, deleteWebsite, } from '@/services/recruitmentDataCollection/sourceManager'; +import { getDictValueEnum } from '@/services/system/dict'; import { Button, FormInstance, message, Modal } from 'antd'; import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components'; +import DictTag from '@/components/DictTag'; import { DeleteOutlined, FormOutlined, PlusOutlined, EyeOutlined } from '@ant-design/icons'; import EditWebsiteRow from './edit'; @@ -22,8 +24,14 @@ function WebsiteList() { const [modalVisible, setModalVisible] = useState(false); const [mode, setMode] = useState<'view' | 'edit' | 'create'>('create'); const [loading, setLoading] = useState(false); + const [isActiveEnum, setIsActiveEnum] = useState([]); + + useEffect(() => { + getDictValueEnum('enable_status', true).then((data) => { + setIsActiveEnum(data); + }); + }, []); - // 删除处理 const handleRemoveOne = async (websiteId: any) => { const hide = message.loading('正在删除'); if (!websiteId) return true; @@ -82,13 +90,13 @@ function WebsiteList() { }; const columns: ProColumns[] = [ - { - title: '网站ID', - dataIndex: 'websiteId', - valueType: 'text', - align: 'center', - hideInSearch: true, - }, + // { + // title: '网站ID', + // dataIndex: 'websiteId', + // valueType: 'text', + // align: 'center', + // hideInSearch: true, + // }, { title: '网站名称', dataIndex: 'websiteName', @@ -112,16 +120,13 @@ function WebsiteList() { dataIndex: 'isActive', valueType: 'select', align: 'center', - valueEnum: { - '0': { text: '启用' }, - '2': { text: '未启用' }, - }, + valueEnum: isActiveEnum, fieldProps: { - options: [ - { label: '启用', value: '0' }, - { label: '未启用', value: '2' }, - ], allowClear: false, + defaultValue: '1', + }, + render: (_, record) => { + return ; }, }, { @@ -205,7 +210,7 @@ function WebsiteList() { ) => { const queryParams = { ...params, - isActive: params.isActive || '0', //默认查询启用 + isActive: params.isActive || '1', //默认查询启用 }; const res = await getWebsiteList({ ...queryParams } as API.Website.ListParams); return { @@ -233,6 +238,7 @@ function WebsiteList() { { try { let resData; diff --git a/src/pages/ResumeLibrary/ResumeList/detail.tsx b/src/pages/ResumeLibrary/ResumeList/detail.tsx new file mode 100644 index 0000000..da31fc2 --- /dev/null +++ b/src/pages/ResumeLibrary/ResumeList/detail.tsx @@ -0,0 +1,12 @@ +import React, { useEffect, useState } from 'react'; +export type ResumeDetailProps = { + onCancel: (flag?: boolean, formVals?: unknown) => void; + open: boolean; + values?: any; +}; + +const ResumeDetail: React.FC = (props) => { + return
; +}; + +export default ResumeDetail; diff --git a/src/pages/ResumeLibrary/ResumeList/index.tsx b/src/pages/ResumeLibrary/ResumeList/index.tsx new file mode 100644 index 0000000..440e1ec --- /dev/null +++ b/src/pages/ResumeLibrary/ResumeList/index.tsx @@ -0,0 +1,229 @@ +import React, { Fragment, useRef, useState, useEffect } from 'react'; +import { useAccess } from '@umijs/max'; +import { getResumeList, getResumeDetail } from '@/services/resumeLibrary/resumeList'; +import { Button, FormInstance, message } from 'antd'; +import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components'; +import { EyeOutlined } from '@ant-design/icons'; +import { getDictValueEnum } from '@/services/system/dict'; +import DictTag from '@/components/DictTag'; +import ResumeDetail from './detail'; + +function ResumeList() { + const access = useAccess(); + + const formTableRef = useRef(); + const actionRef = useRef(); + + const [currentRow, setCurrentRow] = useState(); + const [modalVisible, setModalVisible] = useState(false); + const [loading, setLoading] = useState(false); + + // 字典枚举值 + const [sexEnum, setSexEnum] = useState([]); + const [educationEnum, setEducationEnum] = useState([]); + const [politicalEnum, setPoliticalEnum] = useState([]); + const [statusEnum, setStatusEnum] = useState([]); + const [areaEnum, setAreaEnum] = useState([]); + + // 获取字典数据 + useEffect(() => { + getDictValueEnum('sys_user_sex', true).then((data) => { + setSexEnum(data); + }); + getDictValueEnum('education', true, true).then((data) => { + setEducationEnum(data); + }); + getDictValueEnum('political_affiliation', true, true).then((data) => { + setPoliticalEnum(data); + }); + getDictValueEnum('enable_status', true).then((data) => { + setStatusEnum(data); + }); + getDictValueEnum('area', true, true).then((data) => { + setAreaEnum(data); + }); + }, []); + + // 查看详情 + const handleViewDetail = async (userId: any) => { + setLoading(true); + try { + const res = await getResumeDetail(userId); + if (res.code === 200) { + setCurrentRow(res.data); + setModalVisible(true); + } else { + message.error(res.msg); + } + } catch (error) { + message.error('获取详情失败'); + } finally { + setLoading(false); + } + }; + + const columns: ProColumns[] = [ + // { + // title: '用户ID', + // dataIndex: 'userId', + // valueType: 'text', + // align: 'center', + // hideInSearch: true, + // }, + { + title: '姓名', + dataIndex: 'name', + valueType: 'text', + align: 'center', + }, + { + title: '手机号', + dataIndex: 'phone', + valueType: 'text', + align: 'center', + }, + { + title: '性别', + dataIndex: 'sex', + valueType: 'select', + align: 'center', + valueEnum: sexEnum, + render: (_, record) => { + return ; + }, + }, + { + title: '年龄', + dataIndex: 'age', + valueType: 'digit', + align: 'center', + hideInSearch: true, + }, + { + title: '出生日期', + dataIndex: 'birthDate', + valueType: 'date', + align: 'center', + hideInSearch: true, + }, + { + title: '学历', + dataIndex: 'education', + valueType: 'select', + align: 'center', + valueEnum: educationEnum, + render: (_, record) => { + return ; + }, + }, + { + title: '政治面貌', + dataIndex: 'politicalAffiliation', + valueType: 'select', + align: 'center', + valueEnum: politicalEnum, + render: (_, record) => { + return ; + }, + }, + { + title: '期望薪资', + align: 'center', + hideInSearch: true, + render: (_, record) => ( + + {record.salaryMin} - {record.salaryMax} + + ), + }, + { + title: '地区', + dataIndex: 'area', + valueType: 'select', + align: 'center', + valueEnum: areaEnum, + render: (_, record) => { + return ; + }, + }, + { + title: '状态', + dataIndex: 'status', + valueType: 'select', + align: 'center', + valueEnum: statusEnum, + render: (_, record) => { + return ; + }, + }, + { + title: '最后登录', + dataIndex: 'loginDate', + valueType: 'dateTime', + align: 'center', + hideInSearch: true, + }, + { + title: '操作', + hideInSearch: true, + align: 'center', + dataIndex: 'userId', + width: 120, + render: (userId, record) => ( +
+ +
+ ), + }, + ]; + + return ( + +
+ + actionRef={actionRef} + formRef={formTableRef} + rowKey="userId" + key="resumeIndex" + columns={columns} + search={{ + labelWidth: 120, + }} + request={async ( + params: API.AppUser.ListParams & { + pageSize?: number; + current?: number; + }, + ) => { + const res = await getResumeList({ ...params } as API.AppUser.ListParams); + return { + data: res.rows, + total: res.total, + success: true, + }; + }} + /> +
+ { + setModalVisible(false); + setCurrentRow(undefined); + }} + /> +
+ ); +} + +export default ResumeList; diff --git a/src/services/resumeLibrary/resumeList.ts b/src/services/resumeLibrary/resumeList.ts new file mode 100644 index 0000000..a82a9f4 --- /dev/null +++ b/src/services/resumeLibrary/resumeList.ts @@ -0,0 +1,14 @@ +import { request } from '@umijs/max'; + +export async function getResumeList(params?: API.AppUser.ListParams) { + return request(`/api/cms/appUser/getResumeList`, { + method: 'GET', + params: params, + }); +} + +export async function getResumeDetail(userId: string) { + return request(`/api/cms/appUser/getResumeDetail/${userId}`, { + method: 'GET', + }); +} diff --git a/src/types/resumeLibrary/resumeList.d.ts b/src/types/resumeLibrary/resumeList.d.ts new file mode 100644 index 0000000..5689540 --- /dev/null +++ b/src/types/resumeLibrary/resumeList.d.ts @@ -0,0 +1,52 @@ +declare namespace API.AppUser { + export interface ResumeItem { + userId?: string; + name?: string; + phone?: string; + sex?: string; + age?: string; + birthDate?: string; + education?: string; + politicalAffiliation?: string; + salaryMin?: string; + salaryMax?: string; + avatar?: string; + area?: string; + status?: string; + loginDate?: string; + loginIp?: string; + } + + export interface ListParams { + age?: string; + area?: string; + avatar?: string; + birthDate?: string; + education?: string; + loginDate?: string; + loginIp?: string; + name?: string; + phone?: string; + politicalAffiliation?: string; + salaryMax?: string; + salaryMin?: string; + sex?: string; + status?: string; + userId?: string; + pageSize?: number; + current?: number; + } + + export interface ResumePageResult { + code: number; + msg: string; + total: number; + rows: Array; + } + + export interface ResumeDetailResult { + code: number; + msg: string; + data: ResumeItem; + } +}