Industrial-image-management.../src/views/hr/salary/insurance/personal-info/index.vue

351 lines
10 KiB
Vue
Raw Normal View History

2025-07-30 09:13:52 +08:00
<template>
<GiPageLayout>
<div class="personal-info-container">
<!-- 页面标题 -->
<div class="page-header">
<h2 class="page-title">个人信息</h2>
<a-button type="primary" @click="handleEdit">
<template #icon><icon-edit /></template>
编辑信息
</a-button>
</div>
<!-- 个人信息展示 -->
<a-card class="info-card" :bordered="false">
<div class="info-sections">
<!-- 基本信息 -->
<div class="info-section">
<h3 class="section-title">基本信息</h3>
<div class="info-grid">
<div class="info-item">
<span class="info-label">姓名</span>
<span class="info-value">{{ personalInfo.name }}</span>
</div>
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">{{ personalInfo.gender }}</span>
</div>
<div class="info-item">
<span class="info-label">出生日期</span>
<span class="info-value">{{ personalInfo.birthDate }}</span>
</div>
<div class="info-item">
<span class="info-label">身份证号</span>
<span class="info-value">{{ personalInfo.idCard }}</span>
</div>
<div class="info-item">
<span class="info-label">婚姻状况</span>
<span class="info-value">{{ personalInfo.maritalStatus }}</span>
</div>
<div class="info-item">
<span class="info-label">民族</span>
<span class="info-value">{{ personalInfo.nationality }}</span>
</div>
</div>
</div>
<!-- 联系信息 -->
<div class="info-section">
<h3 class="section-title">联系信息</h3>
<div class="info-grid">
<div class="info-item">
<span class="info-label">手机号码</span>
<span class="info-value">{{ personalInfo.phone }}</span>
</div>
<div class="info-item">
<span class="info-label">邮箱地址</span>
<span class="info-value">{{ personalInfo.email }}</span>
</div>
<div class="info-item">
<span class="info-label">现住址</span>
<span class="info-value">{{ personalInfo.address }}</span>
</div>
<div class="info-item">
<span class="info-label">紧急联系人</span>
<span class="info-value">{{ personalInfo.emergencyContact }}</span>
</div>
<div class="info-item">
<span class="info-label">紧急联系电话</span>
<span class="info-value">{{ personalInfo.emergencyPhone }}</span>
</div>
</div>
</div>
<!-- 工作信息 -->
<div class="info-section">
<h3 class="section-title">工作信息</h3>
<div class="info-grid">
<div class="info-item">
<span class="info-label">员工编号</span>
<span class="info-value">{{ personalInfo.employeeId }}</span>
</div>
<div class="info-item">
<span class="info-label">部门</span>
<span class="info-value">{{ personalInfo.department }}</span>
</div>
<div class="info-item">
<span class="info-label">职位</span>
<span class="info-value">{{ personalInfo.position }}</span>
</div>
<div class="info-item">
<span class="info-label">入职日期</span>
<span class="info-value">{{ personalInfo.joinDate }}</span>
</div>
<div class="info-item">
<span class="info-label">工作年限</span>
<span class="info-value">{{ personalInfo.workYears }}</span>
</div>
<div class="info-item">
<span class="info-label">直属上级</span>
<span class="info-value">{{ personalInfo.supervisor }}</span>
</div>
</div>
</div>
</div>
</a-card>
<!-- 编辑信息弹窗 -->
<a-modal
v-model:visible="editModalVisible"
title="编辑个人信息"
width="800px"
@ok="handleSave"
@cancel="handleCancel"
>
<a-form :model="editForm" layout="vertical">
<div class="form-sections">
<!-- 基本信息 -->
<div class="form-section">
<h4 class="form-section-title">基本信息</h4>
<a-row :gutter="20">
<a-col :span="12">
<a-form-item label="姓名">
<a-input v-model="editForm.name" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="性别">
<a-select v-model="editForm.gender">
<a-option value="男"></a-option>
<a-option value="女"></a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="20">
<a-col :span="12">
<a-form-item label="出生日期">
<a-date-picker v-model="editForm.birthDate" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="婚姻状况">
<a-select v-model="editForm.maritalStatus">
<a-option value="未婚">未婚</a-option>
<a-option value="已婚">已婚</a-option>
<a-option value="离异">离异</a-option>
<a-option value="丧偶">丧偶</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
</div>
<!-- 联系信息 -->
<div class="form-section">
<h4 class="form-section-title">联系信息</h4>
<a-row :gutter="20">
<a-col :span="12">
<a-form-item label="手机号码">
<a-input v-model="editForm.phone" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="邮箱地址">
<a-input v-model="editForm.email" />
</a-form-item>
</a-col>
</a-row>
<a-form-item label="现住址">
<a-input v-model="editForm.address" />
</a-form-item>
<a-row :gutter="20">
<a-col :span="12">
<a-form-item label="紧急联系人">
<a-input v-model="editForm.emergencyContact" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="紧急联系电话">
<a-input v-model="editForm.emergencyPhone" />
</a-form-item>
</a-col>
</a-row>
</div>
</div>
</a-form>
</a-modal>
</div>
</GiPageLayout>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { Message } from '@arco-design/web-vue'
import { IconEdit } from '@arco-design/web-vue/es/icon'
// 个人信息数据
const personalInfo = reactive({
name: '张三',
gender: '男',
birthDate: '1990-05-15',
idCard: '11010219900515****',
maritalStatus: '已婚',
nationality: '汉族',
phone: '138****8888',
email: 'zhangsan@example.com',
address: '北京市朝阳区XX街道XX号',
emergencyContact: '李四',
emergencyPhone: '139****9999',
employeeId: 'EMP001',
department: '技术部',
position: '高级工程师',
joinDate: '2020-03-01',
workYears: '3年8个月',
supervisor: '王五'
})
// 编辑表单数据
const editForm = reactive({
name: '',
gender: '',
birthDate: '',
maritalStatus: '',
phone: '',
email: '',
address: '',
emergencyContact: '',
emergencyPhone: ''
})
// 编辑弹窗状态
const editModalVisible = ref(false)
// 编辑信息
const handleEdit = () => {
// 复制当前信息到编辑表单
Object.assign(editForm, {
name: personalInfo.name,
gender: personalInfo.gender,
birthDate: personalInfo.birthDate,
maritalStatus: personalInfo.maritalStatus,
phone: personalInfo.phone,
email: personalInfo.email,
address: personalInfo.address,
emergencyContact: personalInfo.emergencyContact,
emergencyPhone: personalInfo.emergencyPhone
})
editModalVisible.value = true
}
// 保存信息
const handleSave = () => {
// 更新个人信息
Object.assign(personalInfo, editForm)
editModalVisible.value = false
Message.success('个人信息更新成功')
}
// 取消编辑
const handleCancel = () => {
editModalVisible.value = false
}
</script>
<style scoped>
.personal-info-container {
padding: 20px;
}
.page-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.page-title {
font-size: 24px;
font-weight: 600;
color: #1d2129;
margin: 0;
}
.info-card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.info-sections {
padding: 20px;
}
.info-section {
margin-bottom: 30px;
}
.info-section:last-child {
margin-bottom: 0;
}
.section-title {
font-size: 18px;
font-weight: 600;
color: #1d2129;
margin-bottom: 20px;
padding-bottom: 8px;
border-bottom: 2px solid #e5e6eb;
}
.info-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 16px;
}
.info-item {
display: flex;
align-items: center;
}
.info-label {
font-weight: 600;
width: 120px;
flex-shrink: 0;
color: #1d2129;
}
.info-value {
color: #4e5969;
word-break: break-word;
}
.form-sections {
max-height: 60vh;
overflow-y: auto;
}
.form-section {
margin-bottom: 24px;
}
.form-section-title {
font-size: 16px;
font-weight: 600;
color: #1d2129;
margin-bottom: 16px;
padding-bottom: 8px;
border-bottom: 1px solid #e5e6eb;
}
</style>