后台管理页面开发

master
jiangxucong 1 day ago
parent db02bd7d5d
commit 142e047979

@ -0,0 +1,524 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA',
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
body {
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
min-height: 1024px;
}
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
.scroll-container {
overflow: hidden;
white-space: nowrap;
}
.scroll-content {
display: inline-block;
animation: scroll 15s linear infinite;
}
@keyframes scroll {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
}
</style>
</head>
<body class="bg-secondary flex flex-col min-h-screen">
<!-- 顶部导航栏 -->
<header class="bg-primary text-white shadow-md">
<div class="container mx-auto px-6 py-3 flex items-center justify-between">
<!-- Logo -->
<div class="flex items-center">
<span class="font-['Pacifico'] text-xl mr-10">人力</span>
<!-- 导航菜单 -->
<nav class="hidden md:flex space-x-6 text-sm">
<a href="#" class="hover:text-gray-200 transition">多维统计</a>
<a href="#" class="hover:text-gray-200 transition">人员管理</a>
<a href="#" class="hover:text-gray-200 transition">组织管理</a>
<a href="#" class="hover:text-gray-200 transition">考勤管理</a>
<a href="#" class="hover:text-gray-200 transition">绩效管理</a>
<a href="#" class="hover:text-gray-200 transition">薪酬管理</a>
<a href="#" class="hover:text-gray-200 transition">知识库</a>
<a href="#" class="hover:text-gray-200 transition">后台管理</a>
</nav>
</div>
<!-- 右侧功能区 -->
<div class="flex items-center space-x-4">
<!-- 搜索框 -->
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..." class="bg-white text-gray-800 rounded-button pl-8 pr-4 py-1 text-sm w-48 focus:outline-none focus:ring-2 focus:ring-blue-300">
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-500 text-sm fa-icon w-4 h-4"></i>
</div>
<!-- AI助手 -->
<button class="bg-blue-400 hover:bg-blue-500 text-white rounded-button px-3 py-1 text-sm flex items-center whitespace-nowrap">
<i class="fas fa-robot mr-1 fa-icon w-4 h-4"></i>
AI助手
</button>
<!-- 用户头像 -->
<div class="relative">
<img src="https://mastergo.com/ai/api/search-image?query=professional+asian+business+man+portrait+with+white+background&width=40&height=40&orientation=portrait&flag=c3384d61361d70a4af4b1ace2fce914a"
alt="用户头像"
class="w-8 h-8 rounded-full object-cover cursor-pointer">
</div>
</div>
</div>
</header>
<!-- 公告栏 -->
<div class="bg-yellow-50 text-yellow-800 py-2 px-6 text-sm">
<div class="container mx-auto flex items-center">
<i class="fas fa-bullhorn mr-2 text-yellow-600 fa-icon w-4 h-4"></i>
<div class="scroll-container w-full">
<div class="scroll-content">
<span class="mr-8">系统将于今晚 23:00 至次日 02:00 进行维护升级</span>
<span class="mr-8">2023年度员工满意度调查问卷已发布请及时填写</span>
<span class="mr-8">关于2024年春节放假安排的通知已发布</span>
<span class="mr-8">新员工入职培训将于下周一上午9:00在3楼会议室举行</span>
</div>
</div>
</div>
</div>
<!-- 主体内容 -->
<main class="flex-grow container mx-auto px-6 py-6">
<div class="flex flex-col md:flex-row gap-6">
<!-- 左侧组织架构树 -->
<div class="w-full md:w-1/5 bg-white rounded-md shadow p-4">
<h2 class="text-lg font-semibold mb-4 text-gray-800">组织架构</h2>
<div class="space-y-2">
<div class="flex items-center justify-between cursor-pointer hover:bg-gray-50 p-2 rounded">
<div class="flex items-center">
<i class="fas fa-building mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>集团公司</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
<div class="ml-6 space-y-2">
<div class="flex items-center justify-between cursor-pointer hover:bg-gray-50 p-2 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>技术中心</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
<div class="ml-6 space-y-2">
<div class="flex items-center cursor-pointer hover:bg-gray-50 p-2 rounded">
<i class="fas fa-users mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>前端开发部</span>
</div>
<div class="flex items-center cursor-pointer hover:bg-gray-50 p-2 rounded">
<i class="fas fa-users mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>后端开发部</span>
</div>
<div class="flex items-center cursor-pointer hover:bg-gray-50 p-2 rounded">
<i class="fas fa-users mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>测试部</span>
</div>
</div>
<div class="flex items-center justify-between cursor-pointer hover:bg-gray-50 p-2 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>产品中心</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
</div>
<div class="flex items-center justify-between cursor-pointer hover:bg-gray-50 p-2 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>市场部</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
<div class="flex items-center justify-between cursor-pointer hover:bg-gray-50 p-2 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>人力资源部</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
<div class="flex items-center justify-between cursor-pointer hover:bg-gray-50 p-2 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 fa-icon w-4 h-4"></i>
<span>财务部</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
</div>
</div>
<!-- 右侧审批详情 -->
<div class="w-full md:w-4/5 space-y-6">
<!-- 基本信息卡片 -->
<div class="bg-white rounded-md shadow p-6">
<div class="flex justify-between items-start mb-6">
<h2 class="text-xl font-semibold text-gray-800">入职审批详情</h2>
<div class="flex space-x-3">
<button class="bg-primary hover:bg-blue-700 text-white rounded-button px-4 py-1 text-sm flex items-center whitespace-nowrap">
<i class="fas fa-check mr-1 fa-icon w-4 h-4"></i>
通过
</button>
<button class="bg-red-500 hover:bg-red-600 text-white rounded-button px-4 py-1 text-sm flex items-center whitespace-nowrap">
<i class="fas fa-times mr-1 fa-icon w-4 h-4"></i>
拒绝
</button>
<button class="border border-gray-300 hover:bg-gray-50 text-gray-700 rounded-button px-4 py-1 text-sm flex items-center whitespace-nowrap">
<i class="fas fa-print mr-1 fa-icon w-4 h-4"></i>
打印
</button>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
<!-- 申请人照片 -->
<div class="col-span-1">
<div class="border border-gray-200 rounded-md p-2">
<img src="https://mastergo.com/ai/api/search-image?query=professional+asian+woman+portrait+with+white+background&width=300&height=400&orientation=portrait&flag=e2879a3072d5b6c4e667ed194ee97198"
alt="申请人照片"
class="w-full h-auto rounded-md">
<p class="text-center text-sm text-gray-600 mt-2">申请人照片</p>
</div>
</div>
<!-- 身份证照片 -->
<div class="col-span-1">
<div class="border border-gray-200 rounded-md p-2">
<img src="https://mastergo.com/ai/api/search-image?query=chinese+id+card+front+and+back+on+white+background&width=300&height=200&orientation=landscape&flag=814a4ec5adb146a60ec2bd2cfc924f4f"
alt="身份证照片"
class="w-full h-auto rounded-md">
<p class="text-center text-sm text-gray-600 mt-2">身份证正反面</p>
</div>
</div>
<!-- 基本信息 -->
<div class="col-span-1">
<div class="space-y-3">
<div class="flex justify-between">
<span class="text-gray-600">申请人姓名:</span>
<span class="font-medium">林晓梅</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">性别:</span>
<span class="font-medium"></span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">年龄:</span>
<span class="font-medium">28</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">联系电话:</span>
<span class="font-medium">138****5678</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">申请部门:</span>
<span class="font-medium">产品中心 - 用户体验部</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">职位:</span>
<span class="font-medium">高级产品经理</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">入职日期:</span>
<span class="font-medium">2023-11-15</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">薪资待遇:</span>
<span class="font-medium">¥18,000/月</span>
</div>
<div class="flex justify-between">
<span class="text-gray-600">审批状态:</span>
<span class="font-medium text-primary">审批中</span>
</div>
</div>
</div>
</div>
<!-- 教育和工作经历 -->
<div class="mb-6">
<h3 class="text-lg font-medium text-gray-800 mb-3">教育背景</h3>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between mb-2">
<span class="font-medium">2014.09 - 2018.06</span>
<span class="font-medium">北京大学</span>
<span>信息管理与信息系统</span>
<span>本科</span>
</div>
<div class="flex justify-between">
<span class="font-medium">2018.09 - 2021.06</span>
<span class="font-medium">清华大学</span>
<span>工商管理</span>
<span>硕士</span>
</div>
</div>
</div>
<div>
<h3 class="text-lg font-medium text-gray-800 mb-3">工作经历</h3>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between mb-2">
<span class="font-medium">2021.07 - 2023.04</span>
<span class="font-medium">字节跳动</span>
<span>产品经理</span>
</div>
<div class="flex justify-between">
<span class="font-medium">2023.05 - 2023.10</span>
<span class="font-medium">腾讯科技</span>
<span>高级产品经理</span>
</div>
</div>
</div>
</div>
<!-- 审批流程 -->
<div class="bg-white rounded-md shadow p-6">
<h2 class="text-xl font-semibold text-gray-800 mb-6">审批流程</h2>
<div class="relative">
<!-- 时间轴 -->
<div class="absolute left-4 h-full w-0.5 bg-gray-200 top-0"></div>
<!-- 流程步骤 -->
<div class="space-y-8">
<!-- 步骤1 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-primary flex items-center justify-center text-white">
<i class="fas fa-check fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">提交申请</h3>
<span class="text-sm text-gray-500">2023-10-20 09:30</span>
</div>
<p class="text-gray-600 text-sm">申请人林晓梅提交了入职申请</p>
</div>
</div>
<!-- 步骤2 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-primary flex items-center justify-center text-white">
<i class="fas fa-check fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">部门初审</h3>
<span class="text-sm text-gray-500">2023-10-21 14:15</span>
</div>
<p class="text-gray-600 text-sm">部门经理张伟审核通过</p>
<div class="mt-2 text-sm bg-blue-50 text-blue-700 p-2 rounded">
<p>意见:候选人专业背景和工作经验符合岗位要求,建议录用</p>
</div>
</div>
</div>
<!-- 步骤3 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-primary flex items-center justify-center text-white">
<i class="fas fa-check fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">部门复审</h3>
<span class="text-sm text-gray-500">2023-10-23 10:45</span>
</div>
<p class="text-gray-600 text-sm">产品总监李强审核通过</p>
<div class="mt-2 text-sm bg-blue-50 text-blue-700 p-2 rounded">
<p>意见:面试表现优秀,专业能力突出,同意录用</p>
</div>
</div>
</div>
<!-- 步骤4 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-primary flex items-center justify-center text-white">
<i class="fas fa-check fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">HR审核</h3>
<span class="text-sm text-gray-500">2023-10-25 16:20</span>
</div>
<p class="text-gray-600 text-sm">HRBP王芳审核通过</p>
<div class="mt-2 text-sm bg-blue-50 text-blue-700 p-2 rounded">
<p>意见:背景调查无异常,薪资符合公司标准,同意录用</p>
</div>
</div>
</div>
<!-- 步骤5 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-yellow-400 flex items-center justify-center text-white">
<i class="fas fa-spinner fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">总经理审批</h3>
<span class="text-sm text-gray-500">待审批</span>
</div>
<p class="text-gray-600 text-sm">等待总经理赵明审批</p>
</div>
</div>
<!-- 步骤6 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center text-white">
<i class="fas fa-ellipsis-h fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4 opacity-70">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">入职生效</h3>
<span class="text-sm text-gray-500">待处理</span>
</div>
<p class="text-gray-600 text-sm">审批通过后自动生效</p>
</div>
</div>
<!-- 步骤7 -->
<div class="relative pl-12">
<div class="absolute left-0 w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center text-white">
<i class="fas fa-ellipsis-h fa-icon w-4 h-4"></i>
</div>
<div class="bg-gray-50 rounded-md p-4 opacity-70">
<div class="flex justify-between items-center mb-2">
<h3 class="font-medium">审批完结</h3>
<span class="text-sm text-gray-500">待处理</span>
</div>
<p class="text-gray-600 text-sm">流程自动归档</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="bg-gray-800 text-white py-8">
<div class="container mx-auto px-6">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div>
<h3 class="text-lg font-medium mb-4">关于我们</h3>
<ul class="space-y-2 text-sm text-gray-300">
<li><a href="#" class="hover:text-white transition">公司简介</a></li>
<li><a href="#" class="hover:text-white transition">发展历程</a></li>
<li><a href="#" class="hover:text-white transition">企业文化</a></li>
<li><a href="#" class="hover:text-white transition">荣誉资质</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-medium mb-4">产品服务</h3>
<ul class="space-y-2 text-sm text-gray-300">
<li><a href="#" class="hover:text-white transition">人力资源系统</a></li>
<li><a href="#" class="hover:text-white transition">考勤管理系统</a></li>
<li><a href="#" class="hover:text-white transition">绩效管理系统</a></li>
<li><a href="#" class="hover:text-white transition">薪酬管理系统</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-medium mb-4">帮助中心</h3>
<ul class="space-y-2 text-sm text-gray-300">
<li><a href="#" class="hover:text-white transition">使用文档</a></li>
<li><a href="#" class="hover:text-white transition">常见问题</a></li>
<li><a href="#" class="hover:text-white transition">视频教程</a></li>
<li><a href="#" class="hover:text-white transition">在线客服</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-sm text-gray-300">
<li class="flex items-start">
<i class="fas fa-map-marker-alt mr-2 mt-1 fa-icon w-4 h-4"></i>
<span>北京市海淀区中关村软件园12号楼</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt mr-2 fa-icon w-4 h-4"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope mr-2 fa-icon w-4 h-4"></i>
<span>hr@company.com</span>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-sm text-gray-400 flex flex-col md:flex-row justify-between items-center">
<div class="mb-4 md:mb-0">
<span>© 2023 人力资源管理系统 版权所有</span>
<span class="mx-2">|</span>
<a href="#" class="hover:text-white transition">隐私政策</a>
<span class="mx-2">|</span>
<a href="#" class="hover:text-white transition">服务条款</a>
</div>
<div class="flex space-x-4">
<a href="#" class="hover:text-white transition">
<i class="fab fa-weixin fa-icon w-5 h-5"></i>
</a>
<a href="#" class="hover:text-white transition">
<i class="fab fa-weibo fa-icon w-5 h-5"></i>
</a>
<a href="#" class="hover:text-white transition">
<i class="fab fa-linkedin-in fa-icon w-5 h-5"></i>
</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,216 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力系统 - 人员入职登记</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA'
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
.font-logo {
font-family: "Pacifico", serif;
}
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
.required:after {
content: "*";
color: #FF4D4F;
margin-left: 4px;
}
</style>
</head>
<body class="bg-white text-gray-800 font-sans">
<!-- 顶部导航栏 -->
<nav class="fixed top-0 left-0 w-full bg-primary text-white h-[60px] flex items-center justify-between px-4 z-50">
<div class="font-logo text-xl">人力</div>
<div class="flex items-center space-x-4">
<div class="flex items-center bg-primary-light px-3 py-1 rounded-button">
<i class="fas fa-robot fa-icon w-4 h-4 mr-1"></i>
<span class="text-sm">AI助手</span>
</div>
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center overflow-hidden">
<i class="fas fa-user fa-icon text-primary w-4 h-4"></i>
</div>
</div>
</nav>
<!-- 主要内容区 -->
<main class="pt-[80px] pb-[100px] px-4 max-w-[960px] mx-auto">
<h1 class="text-2xl font-bold mb-8 text-center">人员入职登记</h1>
<div class="bg-white rounded-lg shadow-md p-6 mb-8">
<!-- 刷脸组件 -->
<div class="flex flex-col items-center mb-8">
<div
class="w-[120px] h-[120px] rounded-full border-2 border-dashed border-gray-300 flex items-center justify-center mb-4">
<i class="fas fa-camera fa-icon text-gray-400 text-3xl"></i>
</div>
<button class="bg-primary text-white px-4 py-2 rounded-button text-sm">
点击刷脸认证
</button>
</div>
<!-- 表单区域 -->
<form class="space-y-6">
<!-- 入职部门 -->
<div>
<label class="block text-sm font-medium mb-1">入职部门</label>
<div class="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-button text-gray-700">技术研发部
</div>
</div>
<!-- 岗位 -->
<div>
<label class="block text-sm font-medium mb-1">岗位</label>
<div class="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-button text-gray-700">前端开发工程师
</div>
</div>
<!-- 入职时间 -->
<div>
<label class="block text-sm font-medium mb-1">入职时间</label>
<div class="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-button text-gray-700">
2025-07-02</div>
</div>
<!-- 姓名 -->
<div>
<label class="block text-sm font-medium mb-1 required">姓名</label>
<input type="text"
class="w-full px-3 py-2 border border-gray-300 rounded-button focus:ring-primary focus:border-primary"
placeholder="请输入真实姓名">
</div>
<!-- 年龄 -->
<div>
<label class="block text-sm font-medium mb-1 required">年龄</label>
<input type="number"
class="w-full px-3 py-2 border border-gray-300 rounded-button focus:ring-primary focus:border-primary"
placeholder="请输入年龄">
</div>
<!-- 手机号 -->
<div>
<label class="block text-sm font-medium mb-1 required">手机号</label>
<input type="tel"
class="w-full px-3 py-2 border border-gray-300 rounded-button focus:ring-primary focus:border-primary"
placeholder="请输入手机号码">
</div>
<!-- 身份证正反面 -->
<div>
<label class="block text-sm font-medium mb-1 required">身份证正反面</label>
<div class="grid grid-cols-2 gap-4">
<div
class="border-2 border-dashed border-gray-300 rounded-button p-4 flex flex-col items-center">
<i class="fas fa-id-card fa-icon text-gray-400 text-2xl mb-2"></i>
<span class="text-xs text-gray-500 mb-2">身份证正面</span>
<button type="button" class="bg-secondary text-gray-700 px-3 py-1 rounded-button text-xs">
上传照片
</button>
</div>
<div
class="border-2 border-dashed border-gray-300 rounded-button p-4 flex flex-col items-center">
<i class="fas fa-id-card fa-icon text-gray-400 text-2xl mb-2"></i>
<span class="text-xs text-gray-500 mb-2">身份证反面</span>
<button type="button" class="bg-secondary text-gray-700 px-3 py-1 rounded-button text-xs">
上传照片
</button>
</div>
</div>
</div>
<!-- 身份证号 -->
<div>
<label class="block text-sm font-medium mb-1 required">身份证号</label>
<input type="text"
class="w-full px-3 py-2 border border-gray-300 rounded-button focus:ring-primary focus:border-primary"
placeholder="请输入身份证号码">
</div>
<!-- 备注 -->
<div>
<label class="block text-sm font-medium mb-1">备注</label>
<textarea
class="w-full px-3 py-2 border border-gray-300 rounded-button focus:ring-primary focus:border-primary"
rows="3" placeholder="可填写特殊情况说明"></textarea>
</div>
<!-- 提交按钮 -->
<div class="pt-4">
<button type="submit"
class="w-full bg-primary text-white py-3 rounded-button font-medium hover:bg-primary-dark transition">
提交入职申请
</button>
</div>
</form>
</div>
</main>
<!-- 底部通栏 -->
<footer class="fixed bottom-0 left-0 w-full bg-secondary py-4 text-gray-600 text-xs">
<div class="container mx-auto px-4">
<div class="grid grid-cols-4 gap-4 mb-4">
<div>
<h3 class="font-medium mb-2">关于我们</h3>
<ul class="space-y-1">
<li><a href="#" class="hover:text-primary">公司简介</a></li>
<li><a href="#" class="hover:text-primary">发展历程</a></li>
<li><a href="#" class="hover:text-primary">企业文化</a></li>
</ul>
</div>
<div>
<h3 class="font-medium mb-2">服务支持</h3>
<ul class="space-y-1">
<li><a href="#" class="hover:text-primary">帮助中心</a></li>
<li><a href="#" class="hover:text-primary">常见问题</a></li>
<li><a href="#" class="hover:text-primary">在线客服</a></li>
</ul>
</div>
<div>
<h3 class="font-medium mb-2">法律声明</h3>
<ul class="space-y-1">
<li><a href="#" class="hover:text-primary">隐私政策</a></li>
<li><a href="#" class="hover:text-primary">用户协议</a></li>
<li><a href="#" class="hover:text-primary">知识产权</a></li>
</ul>
</div>
<div>
<h3 class="font-medium mb-2">联系我们</h3>
<ul class="space-y-1">
<li><a href="#" class="hover:text-primary">联系方式</a></li>
<li><a href="#" class="hover:text-primary">加入我们</a></li>
<li><a href="#" class="hover:text-primary">反馈建议</a></li>
</ul>
</div>
</div>
<div class="text-center pt-2 border-t border-gray-200">
<p>© 2023 人力系统 版权所有</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,532 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA'
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
.tree-item {
padding: 8px 12px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
}
.tree-item:hover {
background-color: #F5F6FA;
}
.tree-item.active {
background-color: #2D5CF6;
color: white;
}
.card {
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
padding: 16px;
margin-bottom: 16px;
}
.form-input {
border: 1px solid #E5E7EB;
border-radius: 4px;
padding: 8px 12px;
width: 100%;
}
.form-input:focus {
outline: none;
border-color: #2D5CF6;
}
.search-input {
background-color: rgba(255, 255, 255, 0.2);
border: none;
border-radius: 4px;
padding: 8px 12px 8px 36px;
color: white;
width: 200px;
}
.search-input::placeholder {
color: rgba(255, 255, 255, 0.7);
}
.search-input:focus {
outline: none;
background-color: rgba(255, 255, 255, 0.3);
}
.user-avatar {
width: 32px;
height: 32px;
border-radius: 9999px;
background-color: white;
display: flex;
justify-content: center;
align-items: center;
color: #2D5CF6;
font-weight: bold;
}
.ai-assistant {
position: relative;
padding: 8px 16px;
border-radius: 4px;
background: linear-gradient(90deg, #2D5CF6, #5C7CFA);
color: white;
font-size: 14px;
display: flex;
align-items: center;
}
.ai-assistant::after {
content: '';
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
border-radius: 6px;
background: linear-gradient(90deg, #2D5CF6, #5C7CFA);
z-index: -1;
opacity: 0.6;
filter: blur(4px);
}
.nav-link {
position: relative;
padding: 0 12px;
height: 100%;
display: flex;
align-items: center;
}
.nav-link::after {
content: '';
position: absolute;
bottom: 0;
left: 12px;
right: 12px;
height: 3px;
background-color: white;
transform: scaleX(0);
transition: transform 0.2s;
}
.nav-link:hover::after {
transform: scaleX(1);
}
.marquee {
white-space: nowrap;
animation: marquee 20s linear infinite;
}
@keyframes marquee {
0% {
transform: translateX(100%);
}
100% {
transform: translateX(-100%);
}
}
</style>
</head>
<body class="min-h-[1024px] flex flex-col bg-[#F5F6FA]">
<!-- 顶部导航栏 -->
<header class="w-full bg-primary text-white h-[60px] flex items-center fixed z-50">
<div class="container mx-auto px-4 flex items-center justify-between">
<div class="flex items-center">
<div class="font-['Pacifico'] text-2xl mr-8">人力</div>
<nav class="flex h-full">
<a href="#" class="nav-link">多维统计</a>
<a href="#" class="nav-link">人员管理</a>
<a href="#" class="nav-link">组织管理</a>
<a href="#" class="nav-link">考勤管理</a>
<a href="#" class="nav-link">绩效管理</a>
<a href="#" class="nav-link">薪酬管理</a>
<a href="#" class="nav-link">知识库</a>
<a href="#" class="nav-link">后台管理</a>
</nav>
</div>
<div class="flex items-center space-x-4">
<div class="relative">
<i
class="fas fa-search absolute left-3 top-1/2 transform -translate-y-1/2 text-white opacity-70"></i>
<input type="text" class="search-input" placeholder="搜索...">
</div>
<div class="user-avatar"></div>
<button class="ai-assistant">
<i class="fas fa-robot mr-2"></i>
AI助手
</button>
</div>
</div>
</header>
<!-- 主要内容区 -->
<main class="flex-1 pt-[60px] pb-[120px]">
<div class="container mx-auto px-4 flex mt-8">
<!-- 左侧组织架构树 -->
<div class="w-[20%] bg-white rounded-md shadow-sm mr-4 p-4">
<div class="font-medium mb-4">组织架构</div>
<div class="space-y-1">
<div class="tree-item active">集团总部</div>
<div class="tree-item">人力资源部</div>
<div class="tree-item">财务部</div>
<div class="tree-item">技术研发中心</div>
<div class="tree-item">产品设计部</div>
<div class="tree-item">市场营销部</div>
<div class="tree-item">客户服务部</div>
<div class="tree-item">行政后勤部</div>
</div>
</div>
<!-- 右侧入职计划设置 -->
<div class="w-[80%]">
<div class="bg-white rounded-md shadow-sm p-6 mb-6">
<h1 class="text-2xl font-bold mb-6">入职计划设置</h1>
<!-- 公告栏 -->
<!-- <div class="bg-yellow-50 border border-yellow-200 rounded-md p-3 mb-6 overflow-hidden">
<div class="flex items-center">
<i class="fas fa-bullhorn text-yellow-500 mr-2"></i>
<div class="marquee text-sm text-yellow-800">
重要通知2023年第三季度招聘计划已启动各部门请于8月15日前提交用人需求 | 人力资源部将于8月20日组织专场招聘会 | 新员工入职培训计划已更新,请各部门负责人查阅
</div>
</div>
</div> -->
<!-- 入职部门信息 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-building mr-2 text-primary"></i>
入职部门信息
</h2>
<div class="grid grid-cols-3 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">部门名称</label>
<div class="bg-gray-100 p-2 rounded">人力资源部</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">部门负责人</label>
<div class="bg-gray-100 p-2 rounded">张明远</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">当前在岗人数</label>
<div class="bg-gray-100 p-2 rounded">24/30</div>
</div>
</div>
</div>
<!-- 计划时段设置 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="far fa-calendar-alt mr-2 text-primary"></i>
计划时段设置
</h2>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">计划开始日期</label>
<div class="flex items-center">
<input type="date" class="form-input mr-2" value="2023-09-01">
<i class="fas fa-calendar text-gray-400"></i>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">计划结束日期</label>
<div class="flex items-center">
<input type="date" class="form-input mr-2" value="2023-09-30">
<i class="fas fa-calendar text-gray-400"></i>
</div>
</div>
</div>
</div>
<!-- 可入职岗位设置 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-briefcase mr-2 text-primary"></i>
可入职岗位设置
</h2>
<div class="space-y-4">
<div class="flex items-center">
<input type="checkbox" id="job1" class="rounded text-primary focus:ring-primary mr-2"
checked>
<label for="job1" class="text-sm">人力资源专员 (3人)</label>
</div>
<div class="flex items-center">
<input type="checkbox" id="job2" class="rounded text-primary focus:ring-primary mr-2"
checked>
<label for="job2" class="text-sm">薪酬福利专员 (2人)</label>
</div>
<div class="flex items-center">
<input type="checkbox" id="job3" class="rounded text-primary focus:ring-primary mr-2">
<label for="job3" class="text-sm">培训发展专员 (1人)</label>
</div>
<div class="flex items-center">
<input type="checkbox" id="job4" class="rounded text-primary focus:ring-primary mr-2">
<label for="job4" class="text-sm">招聘专员 (2人)</label>
</div>
<button class="mt-2 text-primary text-sm flex items-center">
<i class="fas fa-plus-circle mr-1"></i>
添加其他岗位
</button>
</div>
</div>
<!-- 计划入职人数 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-users mr-2 text-primary"></i>
计划入职人数
</h2>
<div class="grid grid-cols-3 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">计划总人数</label>
<input type="number" class="form-input" value="5">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">已确认人数</label>
<input type="number" class="form-input" value="2" disabled>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">剩余名额</label>
<input type="number" class="form-input" value="3" disabled>
</div>
</div>
</div>
<!-- 人员要求 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-user-tie mr-2 text-primary"></i>
人员要求
</h2>
<div class="space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">年龄段</label>
<div class="flex space-x-4">
<div class="flex items-center">
<input type="radio" id="age1" name="age" class="text-primary focus:ring-primary"
checked>
<label for="age1" class="ml-2 text-sm">22-30岁</label>
</div>
<div class="flex items-center">
<input type="radio" id="age2" name="age"
class="text-primary focus:ring-primary">
<label for="age2" class="ml-2 text-sm">30-35岁</label>
</div>
<div class="flex items-center">
<input type="radio" id="age3" name="age"
class="text-primary focus:ring-primary">
<label for="age3" class="ml-2 text-sm">不限</label>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">性别</label>
<div class="flex space-x-4">
<div class="flex items-center">
<input type="radio" id="gender1" name="gender"
class="text-primary focus:ring-primary">
<label for="gender1" class="ml-2 text-sm"></label>
</div>
<div class="flex items-center">
<input type="radio" id="gender2" name="gender"
class="text-primary focus:ring-primary">
<label for="gender2" class="ml-2 text-sm"></label>
</div>
<div class="flex items-center">
<input type="radio" id="gender3" name="gender"
class="text-primary focus:ring-primary" checked>
<label for="gender3" class="ml-2 text-sm">不限</label>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">学历要求</label>
<select class="form-input">
<option>本科及以上</option>
<option>硕士及以上</option>
<option>大专及以上</option>
<option>不限</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">工作年限</label>
<select class="form-input">
<option>1-3年</option>
<option>3-5年</option>
<option>5年以上</option>
<option>不限</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">其他要求</label>
<textarea class="form-input" rows="3" placeholder="请输入其他特殊要求..."></textarea>
</div>
</div>
</div>
<!-- 黑名单设置 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-ban mr-2 text-primary"></i>
黑名单设置
</h2>
<div class="space-y-4">
<div class="flex items-center justify-between">
<div class="flex items-center">
<img src="https://randomuser.me/api/portraits/women/43.jpg"
class="w-8 h-8 rounded-full mr-2">
<div>
<div class="text-sm font-medium">林晓梅</div>
<div class="text-xs text-gray-500">身份证: 310***19880512****</div>
</div>
</div>
<button class="text-red-500 text-sm flex items-center">
<i class="fas fa-times mr-1"></i>
移除
</button>
</div>
<div class="flex items-center justify-between">
<div class="flex items-center">
<img src="https://randomuser.me/api/portraits/men/32.jpg"
class="w-8 h-8 rounded-full mr-2">
<div>
<div class="text-sm font-medium">王建国</div>
<div class="text-xs text-gray-500">身份证: 420***19900215****</div>
</div>
</div>
<button class="text-red-500 text-sm flex items-center">
<i class="fas fa-times mr-1"></i>
移除
</button>
</div>
<button class="mt-2 text-primary text-sm flex items-center">
<i class="fas fa-plus-circle mr-1"></i>
添加黑名单人员
</button>
</div>
</div>
<!-- 白名单设置 -->
<div class="card">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-check-circle mr-2 text-primary"></i>
白名单设置
</h2>
<div class="space-y-4">
<div class="flex items-center justify-between">
<div class="flex items-center">
<img src="https://randomuser.me/api/portraits/women/65.jpg"
class="w-8 h-8 rounded-full mr-2">
<div>
<div class="text-sm font-medium">陈思思</div>
<div class="text-xs text-gray-500">推荐人: 张明远</div>
</div>
</div>
<button class="text-red-500 text-sm flex items-center">
<i class="fas fa-times mr-1"></i>
移除
</button>
</div>
<button class="mt-2 text-primary text-sm flex items-center">
<i class="fas fa-plus-circle mr-1"></i>
添加白名单人员
</button>
</div>
</div>
<!-- 操作按钮 -->
<div class="flex justify-end space-x-4 mt-6">
<button
class="px-6 py-2 border border-gray-300 rounded-button bg-white text-gray-700 hover:bg-gray-50">
取消
</button>
<button class="px-6 py-2 rounded-button bg-primary text-white hover:bg-blue-700">
保存设置
</button>
</div>
</div>
</div>
</div>
</main>
<!-- 底部通栏 -->
<footer class="w-full bg-gray-800 text-white py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-4 gap-8">
<div>
<h3 class="text-sm font-semibold mb-4">关于我们</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li><a href="#" class="hover:text-white">公司简介</a></li>
<li><a href="#" class="hover:text-white">发展历程</a></li>
<li><a href="#" class="hover:text-white">企业文化</a></li>
<li><a href="#" class="hover:text-white">联系我们</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-semibold mb-4">产品服务</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li><a href="#" class="hover:text-white">人力资源系统</a></li>
<li><a href="#" class="hover:text-white">薪酬管理系统</a></li>
<li><a href="#" class="hover:text-white">绩效考核系统</a></li>
<li><a href="#" class="hover:text-white">培训发展平台</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-semibold mb-4">帮助中心</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li><a href="#" class="hover:text-white">使用文档</a></li>
<li><a href="#" class="hover:text-white">常见问题</a></li>
<li><a href="#" class="hover:text-white">视频教程</a></li>
<li><a href="#" class="hover:text-white">在线客服</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-semibold mb-4">联系我们</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-center"><i class="fas fa-map-marker-alt mr-2"></i> 北京市海淀区中关村南大街5号</li>
<li class="flex items-center"><i class="fas fa-phone-alt mr-2"></i> 400-888-8888</li>
<li class="flex items-center"><i class="fas fa-envelope mr-2"></i> hr@company.com</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-xs text-gray-400 flex justify-between">
<div>© 2023 人力资源管理系统 版权所有</div>
<div class="flex space-x-4">
<a href="#" class="hover:text-white">隐私政策</a>
<a href="#" class="hover:text-white">服务条款</a>
<a href="#" class="hover:text-white">法律声明</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,440 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA'
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<script>document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.setTimeBtn').forEach(btn=> {
btn.addEventListener('click', function() {
const timeSettings=this.closest('.course-item').querySelector('.time-settings');
timeSettings.classList.toggle('hidden');
});
});
});
</script>
<style>
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
}
.tree-item {
transition: all 0.2s ease;
}
.tree-item:hover {
background-color: rgba(45, 92, 246, 0.1);
}
.course-item {
transition: all 0.2s ease;
}
.course-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body class="min-h-[1024px] flex flex-col bg-[#F5F6FA]">
<!-- 顶部导航栏 -->
<header class="w-full h-[60px] bg-primary text-white shadow-md">
<div class="w-[1200px] h-full mx-auto flex items-center justify-between">
<!-- Logo -->
<div class="flex items-center">
<h1 class="text-2xl font-['Pacifico']">人力</h1>
</div>
<!-- 导航菜单 -->
<nav class="flex-1 mx-8">
<ul class="flex space-x-6 text-sm">
<li class="hover:underline cursor-pointer">多维统计</li>
<li class="hover:underline cursor-pointer">人员管理</li>
<li class="hover:underline cursor-pointer">组织管理</li>
<li class="hover:underline cursor-pointer">考勤管理</li>
<li class="hover:underline cursor-pointer">绩效管理</li>
<li class="hover:underline cursor-pointer">薪酬管理</li>
<li class="hover:underline cursor-pointer">知识库</li>
<li class="hover:underline cursor-pointer">后台管理</li>
</ul>
</nav>
<!-- 右侧功能区 -->
<div class="flex items-center space-x-4">
<!-- 搜索框 -->
<div class="relative">
<input type="text" placeholder="搜索..."
class="h-8 pl-8 pr-3 text-sm rounded-button text-gray-700 focus:outline-none">
<i
class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-500 fa-icon w-4 h-4"></i>
</div>
<!-- 用户头像 -->
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center cursor-pointer">
<i class="fas fa-user text-primary fa-icon w-4 h-4"></i>
</div>
<!-- AI助手 -->
<button
class="h-8 px-3 bg-white text-primary rounded-button flex items-center space-x-1 hover:bg-opacity-90">
<i class="fas fa-robot fa-icon w-4 h-4"></i>
<span class="text-sm whitespace-nowrap">AI助手</span>
</button>
</div>
</div>
</header>
<!-- 主要内容区域 -->
<main class="flex-1 w-[1200px] mx-auto my-6 flex">
<!-- 左侧组织架构树 -->
<aside class="w-1/5 mr-6 bg-white rounded-md shadow p-4">
<h2 class="text-lg font-semibold mb-4 text-gray-700">组织架构</h2>
<div class="space-y-1">
<!-- 一级部门 -->
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chevron-down fa-icon w-3 h-3 mr-1 text-gray-500"></i>
<span class="text-sm">集团总部</span>
</div>
<!-- 二级部门 -->
<div class="ml-4 mt-1 space-y-1">
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chevron-down fa-icon w-3 h-3 mr-1 text-gray-500"></i>
<span class="text-sm">人力资源部</span>
</div>
<!-- 三级部门 -->
<div class="ml-4 mt-1 space-y-1">
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<span class="text-sm">招聘组</span>
</div>
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<span class="text-sm">培训组</span>
</div>
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<span class="text-sm">薪酬组</span>
</div>
</div>
</div>
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chevron-right fa-icon w-3 h-3 mr-1 text-gray-500"></i>
<span class="text-sm">财务部</span>
</div>
</div>
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chevron-right fa-icon w-3 h-3 mr-1 text-gray-500"></i>
<span class="text-sm">市场部</span>
</div>
</div>
</div>
</div>
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chevron-right fa-icon w-3 h-3 mr-1 text-gray-500"></i>
<span class="text-sm">华东分公司</span>
</div>
</div>
<div class="tree-item pl-2 py-1 rounded cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chevron-right fa-icon w-3 h-3 mr-1 text-gray-500"></i>
<span class="text-sm">华南分公司</span>
</div>
</div>
</div>
</aside>
<!-- 右侧培训管理页面 -->
<section class="w-4/5 bg-white rounded-md shadow p-6">
<!-- 页面标题和操作按钮 -->
<div class="flex justify-between items-center mb-6">
<h2 class="text-xl font-semibold text-gray-800">培训管理</h2>
<button class="bg-primary text-white px-4 py-2 rounded-button hover:bg-opacity-90 whitespace-nowrap">
<i class="fas fa-plus fa-icon w-4 h-4 mr-1"></i>
新建培训
</button>
</div>
<!-- 培训基本信息 -->
<div class="mb-6">
<h3 class="text-lg font-medium mb-4 text-gray-700">基本信息</h3>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">培训名称</label>
<input type="text"
class="w-full h-10 px-3 border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">培训封面</label>
<div class="flex items-center">
<div
class="w-16 h-16 bg-gray-100 rounded-md flex items-center justify-center cursor-pointer">
<i class="fas fa-image fa-icon w-6 h-6 text-gray-400"></i>
</div>
<span class="ml-2 text-sm text-gray-500">点击上传封面</span>
</div>
</div>
</div>
<div class="mt-4">
<label class="block text-sm font-medium text-gray-700 mb-1">主题设计</label>
<div class="h-32 border border-gray-300 rounded-md p-2 bg-gray-50">
<p class="text-sm text-gray-500">在此输入培训主题和描述...</p>
</div>
</div>
</div>
<!-- 培训详情 -->
<div class="mb-6">
<h3 class="text-lg font-medium mb-4 text-gray-700">培训详情</h3>
<div class="grid grid-cols-2 gap-4">
<div class="flex space-x-4">
<div class="flex-1">
<label class="block text-sm font-medium text-gray-700 mb-1">开始时间</label>
<div class="flex items-center h-10 px-3 border border-gray-300 rounded-md">
<input type="date" class="flex-1 focus:outline-none">
<i class="fas fa-calendar-alt fa-icon w-4 h-4 text-gray-500 ml-2"></i>
</div>
</div>
<div class="flex-1">
<label class="block text-sm font-medium text-gray-700 mb-1">结束时间</label>
<div class="flex items-center h-10 px-3 border border-gray-300 rounded-md">
<input type="date" class="flex-1 focus:outline-none">
<i class="fas fa-calendar-alt fa-icon w-4 h-4 text-gray-500 ml-2"></i>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">培训费用(元)</label>
<input type="number"
class="w-full h-10 px-3 border border-gray-300 rounded-md focus:outline-none">
</div>
</div>
</div>
<!-- 课程管理 -->
<div class="mb-6">
<h3 class="text-lg font-medium mb-4 text-gray-700">课程管理</h3>
<div class="grid grid-cols-2 gap-4">
<!-- 可选课程 -->
<div>
<div class="flex justify-between items-center mb-2">
<h4 class="text-sm font-medium text-gray-700">可选课程</h4>
<div class="relative w-32">
<input type="text" placeholder="搜索课程"
class="w-full h-8 pl-8 pr-2 text-sm border border-gray-300 rounded-button focus:outline-none">
<i
class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-500 fa-icon w-4 h-4"></i>
</div>
</div>
<div class="h-64 overflow-y-auto border border-gray-300 rounded-md p-2 space-y-2">
<!-- 课程项 -->
<div class="course-item p-2 bg-gray-50 rounded-md cursor-pointer">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">高效沟通技巧</p>
<p class="text-xs text-gray-500">讲师: 张明远</p>
</div>
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">2小时</span>
</div>
</div>
<div class="course-item p-2 bg-gray-50 rounded-md cursor-pointer">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">团队协作与领导力</p>
<p class="text-xs text-gray-500">讲师: 李思雨</p>
</div>
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">3小时</span>
</div>
</div>
<div class="course-item p-2 bg-gray-50 rounded-md cursor-pointer">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">项目管理实战</p>
<p class="text-xs text-gray-500">讲师: 王建国</p>
</div>
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">4小时</span>
</div>
</div>
<div class="course-item p-2 bg-gray-50 rounded-md cursor-pointer">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">Excel高级应用</p>
<p class="text-xs text-gray-500">讲师: 陈晓芳</p>
</div>
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">2.5小时</span>
</div>
</div>
<div class="course-item p-2 bg-gray-50 rounded-md cursor-pointer">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">商务礼仪与职业形象</p>
<p class="text-xs text-gray-500">讲师: 赵雅芝</p>
</div>
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">2小时</span>
</div>
</div>
</div>
</div>
<!-- 已选课程 -->
<div>
<h4 class="text-sm font-medium text-gray-700 mb-2">已选课程</h4>
<div class="h-64 overflow-y-auto border border-gray-300 rounded-md p-2 space-y-2">
<div class="course-item p-2 bg-primary bg-opacity-5 rounded-md">
<div class="space-y-2">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">高效沟通技巧</p>
<p class="text-xs text-gray-500">讲师: 张明远</p>
</div>
<div class="flex space-x-1">
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">2小时</span>
<button
class="text-primary text-xs hover:underline setTimeBtn">设置时间</button>
<i class="fas fa-times fa-icon w-4 h-4 text-red-500 cursor-pointer"></i>
</div>
</div>
<div class="time-settings hidden bg-gray-50 p-2 rounded-md space-y-2">
<div class="flex items-center space-x-2">
<span class="text-xs text-gray-600">上课时间:</span>
<input type="date"
class="flex-1 text-xs p-1 border border-gray-300 rounded-button focus:outline-none focus:border-primary">
<input type="time"
class="w-24 text-xs p-1 border border-gray-300 rounded-button focus:outline-none focus:border-primary">
</div>
<div class="flex justify-end">
<button
class="text-xs px-2 py-1 bg-primary text-white rounded-button hover:bg-opacity-90 whitespace-nowrap">确认</button>
</div>
</div>
</div>
</div>
<div class="course-item p-2 bg-primary bg-opacity-5 rounded-md">
<div class="space-y-2">
<div class="flex justify-between items-center">
<div>
<p class="text-sm font-medium">团队协作与领导力</p>
<p class="text-xs text-gray-500">讲师: 李思雨</p>
</div>
<div class="flex space-x-1">
<span
class="text-xs px-2 py-1 bg-primary bg-opacity-10 text-primary rounded-full">3小时</span>
<button
class="text-primary text-xs hover:underline setTimeBtn">设置时间</button>
<i class="fas fa-times fa-icon w-4 h-4 text-red-500 cursor-pointer"></i>
</div>
</div>
<div class="time-settings hidden bg-gray-50 p-2 rounded-md space-y-2">
<div class="flex items-center space-x-2">
<span class="text-xs text-gray-600">上课时间:</span>
<input type="date"
class="flex-1 text-xs p-1 border border-gray-300 rounded-button focus:outline-none focus:border-primary">
<input type="time"
class="w-24 text-xs p-1 border border-gray-300 rounded-button focus:outline-none focus:border-primary">
</div>
<div class="flex justify-end">
<button
class="text-xs px-2 py-1 bg-primary text-white rounded-button hover:bg-opacity-90 whitespace-nowrap">确认</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mt-6 flex justify-end space-x-3">
<button
class="px-4 py-2 border border-gray-300 rounded-button hover:bg-gray-50 whitespace-nowrap">取消</button>
<button
class="px-4 py-2 bg-primary text-white rounded-button hover:bg-opacity-90 whitespace-nowrap">保存</button>
</div>
</section>
</main>
<!-- 页脚 -->
<footer class="w-full h-[200px] bg-gray-800 text-white">
<div class="w-[1200px] h-full mx-auto py-8">
<div class="grid grid-cols-4 gap-8">
<div>
<h3 class="text-sm font-medium mb-3">关于我们</h3>
<ul class="space-y-2 text-xs text-gray-400">
<li class="cursor-pointer hover:text-white">公司简介</li>
<li class="cursor-pointer hover:text-white">发展历程</li>
<li class="cursor-pointer hover:text-white">企业文化</li>
<li class="cursor-pointer hover:text-white">加入我们</li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-3">帮助中心</h3>
<ul class="space-y-2 text-xs text-gray-400">
<li class="cursor-pointer hover:text-white">使用指南</li>
<li class="cursor-pointer hover:text-white">常见问题</li>
<li class="cursor-pointer hover:text-white">视频教程</li>
<li class="cursor-pointer hover:text-white">API文档</li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-3">联系方式</h3>
<ul class="space-y-2 text-xs text-gray-400">
<li class="cursor-pointer hover:text-white">客服电话: 400-123-4567</li>
<li class="cursor-pointer hover:text-white">邮箱: support@hrsystem.com</li>
<li class="cursor-pointer hover:text-white">地址: 北京市海淀区科技园路88号</li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-3">友情链接</h3>
<ul class="space-y-2 text-xs text-gray-400">
<li class="cursor-pointer hover:text-white">人力资源协会</li>
<li class="cursor-pointer hover:text-white">人才招聘网</li>
<li class="cursor-pointer hover:text-white">职业培训平台</li>
</ul>
</div>
</div>
<div class="mt-8 pt-4 border-t border-gray-700 text-center text-xs text-gray-400">
<p>© 2023 人力资源管理系统 版权所有 | 京ICP备12345678号</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,440 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统 - 培训计划</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA'
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
body {
min-height: 1024px;
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
}
.nav-item:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.course-row:hover {
background-color: #f8f9fa;
}
i {
display: flex;
justify-content: center;
align-items: center;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
}
</style>
</head>
<body class="bg-gray-50">
<!-- 顶部导航栏 -->
<header class="bg-primary text-white sticky top-0 z-50">
<div class="container mx-auto px-6 h-16 flex items-center justify-between">
<!-- Logo -->
<div class="flex items-center">
<h1 class="font-['Pacifico'] text-xl mr-10">人力</h1>
<!-- 导航菜单 -->
<nav class="hidden md:flex space-x-1">
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">多维统计</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">人员管理</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">组织管理</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">考勤管理</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">绩效管理</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">薪酬管理</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">知识库</a>
<a href="#" class="nav-item px-4 py-2 text-sm rounded-button whitespace-nowrap">后台管理</a>
</nav>
</div>
<!-- 右侧功能区 -->
<div class="flex items-center space-x-4">
<!-- 搜索框 -->
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..." class="pl-10 pr-4 py-2 text-sm rounded-button w-48 focus:outline-none">
<i class="fas fa-search absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
</div>
<!-- AI助手 -->
<button class="flex items-center space-x-1 bg-white text-primary px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-robot w-4 h-4"></i>
<span>AI 助手</span>
</button>
<!-- 用户头像 -->
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center cursor-pointer">
<i class="fas fa-user text-primary"></i>
</div>
</div>
</div>
</header>
<!-- 主要内容区 -->
<main class="container mx-auto px-6 py-8 flex">
<!-- 左侧组织架构树 -->
<aside class="w-1/5 pr-6">
<div class="bg-white rounded-md shadow-sm p-4 h-full">
<h2 class="text-lg font-semibold mb-4 flex items-center">
<i class="fas fa-sitemap mr-2 w-5 h-5"></i>
<span>组织架构</span>
</h2>
<div class="space-y-2">
<div class="flex items-center cursor-pointer">
<i class="fas fa-chevron-right mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">集团总部</span>
</div>
<div class="pl-4">
<div class="flex items-center cursor-pointer">
<i class="fas fa-chevron-right mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">人力资源部</span>
</div>
<div class="pl-4">
<div class="flex items-center py-1">
<i class="fas fa-user mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">招聘组</span>
</div>
<div class="flex items-center py-1">
<i class="fas fa-user mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">培训组</span>
</div>
<div class="flex items-center py-1">
<i class="fas fa-user mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">薪酬组</span>
</div>
</div>
<div class="flex items-center cursor-pointer">
<i class="fas fa-chevron-right mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">财务部</span>
</div>
<div class="flex items-center cursor-pointer">
<i class="fas fa-chevron-right mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">技术部</span>
</div>
</div>
<div class="flex items-center cursor-pointer">
<i class="fas fa-chevron-right mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">华东分公司</span>
</div>
<div class="flex items-center cursor-pointer">
<i class="fas fa-chevron-right mr-2 w-3 h-3 text-gray-500"></i>
<span class="text-sm">华南分公司</span>
</div>
</div>
</div>
</aside>
<!-- 右侧培训计划详情 -->
<div class="w-4/5">
<!-- 培训基本信息 -->
<div class="bg-white rounded-md shadow-sm p-6 mb-6">
<div class="flex justify-between items-start mb-4">
<div>
<h2 class="text-2xl font-bold mb-2">2023年第三季度新员工培训计划</h2>
<div class="flex items-center text-sm text-gray-500 space-x-4">
<span><i class="fas fa-calendar-alt mr-1 w-4 h-4"></i> 2023-07-01 至 2023-09-30</span>
<span><i class="fas fa-users mr-1 w-4 h-4"></i> 参与人数: 86人</span>
<span><i class="fas fa-user-tie mr-1 w-4 h-4"></i> 负责人: 张明远</span>
</div>
</div>
<div class="flex space-x-2">
<button class="bg-primary text-white px-4 py-2 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-edit mr-1 w-4 h-4"></i> 编辑
</button>
<button class="bg-secondary text-gray-700 px-4 py-2 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-share-alt mr-1 w-4 h-4"></i> 分享
</button>
</div>
</div>
<div class="grid grid-cols-3 gap-4 mt-4">
<div class="border border-gray-200 rounded-md p-4">
<div class="text-gray-500 text-sm mb-1">培训状态</div>
<div class="font-medium">进行中</div>
</div>
<div class="border border-gray-200 rounded-md p-4">
<div class="text-gray-500 text-sm mb-1">已完成课程</div>
<div class="font-medium">12/24</div>
</div>
<div class="border border-gray-200 rounded-md p-4">
<div class="text-gray-500 text-sm mb-1">平均参与率</div>
<div class="font-medium">87.5%</div>
</div>
</div>
<div class="mt-4">
<h3 class="text-lg font-semibold mb-2">培训描述</h3>
<p class="text-gray-700 text-sm leading-relaxed">
本培训计划针对2023年第三季度新入职员工设计包含公司文化、产品知识、业务流程等全方位培训内容。
通过系统化的培训帮助新员工快速融入团队,掌握工作所需的基本技能和知识,提升工作效率和团队协作能力。
</p>
</div>
</div>
<!-- 课程计划列表 -->
<div class="bg-white rounded-md shadow-sm p-6">
<div class="flex justify-between items-center mb-6">
<h2 class="text-xl font-bold">课程计划</h2>
<div class="flex space-x-2">
<button class="border border-gray-300 px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-filter mr-1 w-4 h-4"></i> 筛选
</button>
<button class="border border-gray-300 px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-download mr-1 w-4 h-4"></i> 导出
</button>
<button class="bg-primary text-white px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-plus mr-1 w-4 h-4"></i> 添加课程
</button>
</div>
</div>
<!-- 课程表格 -->
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">课程名称</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">讲师</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">课程时间</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">课程类型</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">课程入口</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">课程地址</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">操作</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr class="course-row">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">公司文化与价值观</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">李华</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-07-03 09:00-12:00</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-full text-xs">现场</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<a href="#" class="text-primary hover:underline">进入课程</a>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">总部大楼3层培训室A</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit w-4 h-4"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt w-4 h-4"></i>
</button>
</td>
</tr>
<tr class="course-row">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">产品知识入门</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">王伟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-07-05 14:00-17:00</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs">在线</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<a href="#" class="text-primary hover:underline">进入课程</a>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">https://meeting.zoom.us/123456</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit w-4 h-4"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt w-4 h-4"></i>
</button>
</td>
</tr>
<tr class="course-row">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">业务流程概述</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">张丽</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-07-07 09:00-12:00</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-full text-xs">现场</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<a href="#" class="text-primary hover:underline">进入课程</a>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">总部大楼3层培训室B</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit w-4 h-4"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt w-4 h-4"></i>
</button>
</td>
</tr>
<tr class="course-row">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">团队协作与沟通</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">陈明</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-07-10 14:00-17:00</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs">在线</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<a href="#" class="text-primary hover:underline">进入课程</a>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">https://meeting.zoom.us/789012</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit w-4 h-4"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt w-4 h-4"></i>
</button>
</td>
</tr>
<tr class="course-row">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">办公软件高级应用</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">刘芳</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-07-12 09:00-12:00</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-full text-xs">现场</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<a href="#" class="text-primary hover:underline">进入课程</a>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">总部大楼3层培训室A</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit w-4 h-4"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt w-4 h-4"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="flex items-center justify-between mt-6">
<div class="text-sm text-gray-500">
显示 1 至 5 项,共 24 项
</div>
<div class="flex space-x-1">
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm disabled:opacity-50" disabled>
<i class="fas fa-chevron-left w-4 h-4"></i>
</button>
<button class="px-3 py-1 bg-primary text-white rounded-button text-sm">1</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm">2</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm">3</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm">...</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm">5</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm">
<i class="fas fa-chevron-right w-4 h-4"></i>
</button>
</div>
</div>
</div>
</div>
</main>
<!-- 底部页脚 -->
<footer class="bg-gray-800 text-white py-8 mt-12">
<div class="container mx-auto px-6">
<div class="grid grid-cols-4 gap-8">
<div>
<h3 class="text-lg font-semibold mb-4">关于我们</h3>
<ul class="space-y-2 text-sm">
<li><a href="#" class="hover:text-gray-300">公司简介</a></li>
<li><a href="#" class="hover:text-gray-300">发展历程</a></li>
<li><a href="#" class="hover:text-gray-300">企业文化</a></li>
<li><a href="#" class="hover:text-gray-300">管理团队</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-4">产品服务</h3>
<ul class="space-y-2 text-sm">
<li><a href="#" class="hover:text-gray-300">人力资源系统</a></li>
<li><a href="#" class="hover:text-gray-300">薪酬管理系统</a></li>
<li><a href="#" class="hover:text-gray-300">绩效管理系统</a></li>
<li><a href="#" class="hover:text-gray-300">培训管理系统</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-4">帮助中心</h3>
<ul class="space-y-2 text-sm">
<li><a href="#" class="hover:text-gray-300">常见问题</a></li>
<li><a href="#" class="hover:text-gray-300">使用指南</a></li>
<li><a href="#" class="hover:text-gray-300">视频教程</a></li>
<li><a href="#" class="hover:text-gray-300">API文档</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-4">联系我们</h3>
<ul class="space-y-2 text-sm">
<li class="flex items-center">
<i class="fas fa-map-marker-alt mr-2 w-4 h-4"></i>
<span>北京市海淀区中关村南大街5号</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt mr-2 w-4 h-4"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope mr-2 w-4 h-4"></i>
<span>contact@hrsystem.com</span>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-8 flex justify-between items-center">
<div class="text-sm">
© 2023 人力资源管理系统 版权所有
</div>
<div class="flex space-x-4">
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center">
<i class="fab fa-weixin w-4 h-4"></i>
</a>
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center">
<i class="fab fa-weibo w-4 h-4"></i>
</a>
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center">
<i class="fab fa-linkedin-in w-4 h-4"></i>
</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,358 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力管理系统</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA',
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
.font-logo {
font-family: "Pacifico", serif;
}
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
}
.scroll-container {
overflow: hidden;
white-space: nowrap;
}
.scroll-content {
display: inline-block;
animation: scroll 20s linear infinite;
}
@keyframes scroll {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
.tree-node {
transition: all 0.3s ease;
}
.tree-node:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body class="min-h-[1024px] flex flex-col bg-secondary">
<!-- 顶部导航栏 -->
<header class="w-full h-[60px] bg-primary text-white sticky top-0 z-50 shadow-md">
<div class="container mx-auto h-full px-4 flex items-center justify-between">
<!-- Logo -->
<div class="flex items-center">
<span class="font-logo text-2xl mr-8">人力</span>
</div>
<!-- 主导航 -->
<nav class="flex-1 flex justify-center">
<ul class="flex space-x-6 text-sm">
<li class="hover:text-secondary cursor-pointer">多维统计</li>
<li class="hover:text-secondary cursor-pointer">人员管理</li>
<li class="hover:text-secondary cursor-pointer">组织管理</li>
<li class="hover:text-secondary cursor-pointer">考勤管理</li>
<li class="hover:text-secondary cursor-pointer">绩效管理</li>
<li class="hover:text-secondary cursor-pointer">薪酬管理</li>
<li class="hover:text-secondary cursor-pointer">知识库</li>
<li class="hover:text-secondary cursor-pointer">后台管理</li>
</ul>
</nav>
<!-- 右侧功能区 -->
<div class="flex items-center space-x-4">
<!-- 搜索框 -->
<div class="relative">
<input type="text" placeholder="搜索..." class="bg-white/20 text-white placeholder-white/70 rounded-button pl-8 pr-4 py-1 text-sm w-40 focus:outline-none focus:ring-1 focus:ring-white">
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-white/70 text-sm"></i>
</div>
<!-- AI助手 -->
<button class="bg-white/10 hover:bg-white/20 rounded-button px-3 py-1 text-sm flex items-center space-x-1">
<i class="fas fa-robot text-sm"></i>
<span>AI助手</span>
</button>
<!-- 用户头像 -->
<div class="w-8 h-8 rounded-full bg-white/20 flex items-center justify-center cursor-pointer">
<i class="fas fa-user text-sm"></i>
</div>
</div>
</div>
</header>
<!-- 主体内容 -->
<main class="flex-1 container mx-auto px-4 py-6 flex">
<!-- 左侧组织架构树 -->
<aside class="w-1/5 pr-4">
<div class="bg-white rounded-md shadow-sm p-4 h-full">
<h3 class="text-sm font-medium mb-4 text-gray-700">组织架构</h3>
<div class="space-y-2">
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-building mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">集团公司</span>
</div>
</div>
<div class="pl-4">
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">华东事业部</span>
</div>
</div>
<div class="pl-4">
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">上海分公司</span>
</div>
</div>
<div class="pl-4">
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-users mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">研发中心</span>
</div>
</div>
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-users mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">市场部</span>
</div>
</div>
</div>
</div>
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">杭州分公司</span>
</div>
</div>
</div>
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">华南事业部</span>
</div>
</div>
<div class="tree-node cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-500 text-sm"></i>
<span class="text-sm">华北事业部</span>
</div>
</div>
</div>
</div>
</aside>
<!-- 右侧内容区 -->
<section class="w-4/5">
<!-- 筛选区 -->
<div class="bg-white rounded-md shadow-sm p-4 mb-4">
<div class="flex items-center justify-between">
<h3 class="text-sm font-medium text-gray-700">汇报关系</h3>
<div class="flex items-center space-x-4">
<div class="flex items-center">
<span class="text-sm text-gray-500 mr-2">年份:</span>
<div class="relative">
<button class="bg-secondary hover:bg-gray-100 rounded-button px-3 py-1 text-sm flex items-center space-x-1">
<span>2023</span>
<i class="fas fa-chevron-down text-xs"></i>
</button>
</div>
</div>
<button class="bg-primary hover:bg-blue-600 text-white rounded-button px-3 py-1 text-sm flex items-center space-x-1">
<i class="fas fa-filter text-xs"></i>
<span>筛选</span>
</button>
</div>
</div>
</div>
<!-- 汇报关系树 -->
<div class="bg-white rounded-md shadow-sm p-6">
<div class="flex justify-center">
<div class="relative">
<!-- 第一层 -->
<div class="flex justify-center mb-8">
<div class="tree-node p-4 rounded-md shadow-sm border border-gray-100 w-48 text-center">
<div class="w-12 h-12 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary"></i>
</div>
<h4 class="text-sm font-medium">张明远</h4>
<p class="text-xs text-gray-500">CEO</p>
<p class="text-xs text-gray-500">集团公司</p>
</div>
</div>
<!-- 第二层 -->
<div class="flex justify-center space-x-16 mb-8">
<div class="relative">
<div class="absolute top-0 left-1/2 h-8 w-px bg-gray-300 transform -translate-x-1/2"></div>
<div class="tree-node p-4 rounded-md shadow-sm border border-gray-100 w-48 text-center">
<div class="w-10 h-10 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary text-sm"></i>
</div>
<h4 class="text-sm font-medium">李华</h4>
<p class="text-xs text-gray-500">副总裁</p>
<p class="text-xs text-gray-500">华东事业部</p>
</div>
</div>
<div class="relative">
<div class="absolute top-0 left-1/2 h-8 w-px bg-gray-300 transform -translate-x-1/2"></div>
<div class="tree-node p-4 rounded-md shadow-sm border border-gray-100 w-48 text-center">
<div class="w-10 h-10 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary text-sm"></i>
</div>
<h4 class="text-sm font-medium">王伟</h4>
<p class="text-xs text-gray-500">副总裁</p>
<p class="text-xs text-gray-500">华南事业部</p>
</div>
</div>
</div>
<!-- 第三层 -->
<div class="flex justify-center space-x-32 mb-8">
<div class="relative">
<div class="absolute top-0 left-1/2 h-8 w-px bg-gray-300 transform -translate-x-1/2"></div>
<div class="tree-node p-4 rounded-md shadow-sm border border-gray-100 w-48 text-center">
<div class="w-8 h-8 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary text-xs"></i>
</div>
<h4 class="text-sm font-medium">陈思</h4>
<p class="text-xs text-gray-500">总监</p>
<p class="text-xs text-gray-500">上海分公司</p>
</div>
</div>
<div class="relative">
<div class="absolute top-0 left-1/2 h-8 w-px bg-gray-300 transform -translate-x-1/2"></div>
<div class="tree-node p-4 rounded-md shadow-sm border border-gray-100 w-48 text-center">
<div class="w-8 h-8 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary text-xs"></i>
</div>
<h4 class="text-sm font-medium">赵阳</h4>
<p class="text-xs text-gray-500">总监</p>
<p class="text-xs text-gray-500">杭州分公司</p>
</div>
</div>
</div>
<!-- 第四层 -->
<div class="flex justify-center space-x-64">
<div class="relative">
<div class="absolute top-0 left-1/2 h-8 w-px bg-gray-300 transform -translate-x-1/2"></div>
<div class="tree-node p-3 rounded-md shadow-sm border border-gray-100 w-40 text-center">
<div class="w-8 h-8 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary text-xs"></i>
</div>
<h4 class="text-xs font-medium">周婷</h4>
<p class="text-xs text-gray-500">经理</p>
<p class="text-xs text-gray-500">研发中心</p>
</div>
</div>
<div class="relative">
<div class="absolute top-0 left-1/2 h-8 w-px bg-gray-300 transform -translate-x-1/2"></div>
<div class="tree-node p-3 rounded-md shadow-sm border border-gray-100 w-40 text-center">
<div class="w-8 h-8 rounded-full bg-primary/10 mx-auto mb-2 flex items-center justify-center">
<i class="fas fa-user text-primary text-xs"></i>
</div>
<h4 class="text-xs font-medium">吴昊</h4>
<p class="text-xs text-gray-500">经理</p>
<p class="text-xs text-gray-500">市场部</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</main>
<!-- 底部通栏 -->
<footer class="w-full bg-gray-800 text-white py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-4 gap-8">
<div>
<h4 class="text-sm font-medium mb-4">关于我们</h4>
<ul class="space-y-2 text-xs text-gray-300">
<li><a href="#" class="hover:text-white">公司简介</a></li>
<li><a href="#" class="hover:text-white">发展历程</a></li>
<li><a href="#" class="hover:text-white">企业文化</a></li>
<li><a href="#" class="hover:text-white">荣誉资质</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-medium mb-4">产品服务</h4>
<ul class="space-y-2 text-xs text-gray-300">
<li><a href="#" class="hover:text-white">人力资源系统</a></li>
<li><a href="#" class="hover:text-white">薪酬管理系统</a></li>
<li><a href="#" class="hover:text-white">绩效管理系统</a></li>
<li><a href="#" class="hover:text-white">培训发展平台</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-medium mb-4">帮助中心</h4>
<ul class="space-y-2 text-xs text-gray-300">
<li><a href="#" class="hover:text-white">使用指南</a></li>
<li><a href="#" class="hover:text-white">常见问题</a></li>
<li><a href="#" class="hover:text-white">API文档</a></li>
<li><a href="#" class="hover:text-white">联系我们</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-medium mb-4">联系我们</h4>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-center"><i class="fas fa-phone-alt mr-2 text-xs"></i> 400-888-8888</li>
<li class="flex items-center"><i class="fas fa-envelope mr-2 text-xs"></i> service@hrsystem.com</li>
<li class="flex items-center"><i class="fas fa-map-marker-alt mr-2 text-xs"></i> 上海市浦东新区张江高科技园区</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 flex justify-between items-center">
<p class="text-xs text-gray-400">© 2023 人力管理系统 版权所有</p>
<div class="flex space-x-4">
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-weixin"></i></a>
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-weibo"></i></a>
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-linkedin"></i></a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,563 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.5.0/echarts.min.js"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA',
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
.marquee {
animation: marquee 20s linear infinite;
}
@keyframes marquee {
0% {
transform: translateX(100%);
}
100% {
transform: translateX(-100%);
}
}
.chart-container {
width: 100%;
height: 300px;
}
.org-tree {
height: calc(100vh - 156px);
overflow-y: auto;
}
.performance-dashboard {
height: calc(100vh - 156px);
overflow-y: auto;
}
.table-container {
max-height: 400px;
overflow-y: auto;
}
.table-header {
position: sticky;
top: 0;
background-color: white;
z-index: 10;
}
.user-avatar {
width: 32px;
height: 32px;
background-image: url('https://mastergo.com/ai/api/search-image?query=professional20business20person20portrait20with20neutral20background20high20quality20realistic20detailed20face20corporate20style20suit20and20tie20sharp20focus20on20eyes20and20facial20features20studio20lighting20isolated20on20light20gray20background&width=64&height=64&orientation=squarish&flag=689e31f860f98150523d3e36c0018c44');
background-size: cover;
background-position: center;
}
.ai-assistant {
position: relative;
}
.ai-assistant::after {
content: '';
position: absolute;
top: -2px;
right: -2px;
width: 8px;
height: 8px;
background-color: #00FF9D;
border-radius: 9999px;
animation: pulse 1.5s infinite;
}
@keyframes pulse {
0% {
transform: scale(0.95);
opacity: 1;
}
50% {
transform: scale(1.2);
opacity: 0.7;
}
100% {
transform: scale(0.95);
opacity: 1;
}
}
</style>
</head>
<body class="bg-secondary min-h-screen flex flex-col">
<!-- 顶部导航 -->
<header class="w-full">
<nav class="bg-primary text-white h-15 flex items-center px-6">
<div class="flex items-center space-x-8 w-full">
<div class="font-['Pacifico'] text-xl">人力</div>
<div class="flex space-x-6 text-sm flex-1">
<a href="#" class="hover:opacity-80">多维统计</a>
<a href="#" class="hover:opacity-80">人员管理</a>
<a href="#" class="hover:opacity-80">组织管理</a>
<a href="#" class="hover:opacity-80">考勤管理</a>
<a href="#" class="hover:opacity-80">绩效管理</a>
<a href="#" class="hover:opacity-80">薪酬管理</a>
<a href="#" class="hover:opacity-80">知识库</a>
<a href="#" class="hover:opacity-80">后台管理</a>
</div>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..."
class="bg-white bg-opacity-20 text-white placeholder-white text-sm px-4 py-1 !rounded-button w-40 focus:outline-none">
<i
class="fas fa-search absolute right-3 top-1/2 transform -translate-y-1/2 text-white text-sm"></i>
</div>
<div class="user-avatar !rounded-button cursor-pointer"></div>
<button
class="ai-assistant bg-white text-primary text-sm px-3 py-1 !rounded-button flex items-center space-x-1">
<i class="fas fa-robot text-xs"></i>
<span>AI 助手</span>
</button>
</div>
</div>
</nav>
<div class="bg-yellow-50 text-yellow-800 text-xs h-9 px-6 flex items-center">
<span class="font-medium mr-2">公告:</span>
<div class="overflow-hidden whitespace-nowrap">
<div class="marquee inline-block">
年度绩效考核即将开始,请各部门负责人及时提交考核计划 | 2023年第三季度优秀员工评选结果已公布 | 公司新福利政策:增加年度体检项目 | 人力资源系统将于本周六凌晨2:00-4:00进行维护升级
</div>
</div>
</div>
</header>
<!-- 主内容区 -->
<main class="flex-1 flex max-w-7xl mx-auto w-full px-6 py-4">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-4">
<div class="bg-white rounded-lg shadow-sm p-4 org-tree">
<h3 class="text-sm font-medium mb-3">组织架构</h3>
<div class="space-y-1">
<div class="text-sm font-medium py-1 px-2 bg-primary bg-opacity-10 text-primary rounded">公司总部</div>
<div class="pl-4">
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">总裁办公室</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">人力资源中心</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">财务中心</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">技术研发中心</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">市场营销中心</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">产品运营中心</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">客户服务中心</div>
</div>
<div class="text-sm font-medium py-1 px-2 bg-primary bg-opacity-10 text-primary rounded">华东分公司</div>
<div class="pl-4">
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">上海办事处</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">杭州办事处</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">南京办事处</div>
</div>
<div class="text-sm font-medium py-1 px-2 bg-primary bg-opacity-10 text-primary rounded">华南分公司</div>
<div class="pl-4">
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">广州办事处</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">深圳办事处</div>
</div>
<div class="text-sm font-medium py-1 px-2 bg-primary bg-opacity-10 text-primary rounded">华北分公司</div>
<div class="pl-4">
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">北京办事处</div>
<div class="text-sm py-1 px-2 hover:bg-secondary rounded cursor-pointer">天津办事处</div>
</div>
</div>
</div>
</div>
<!-- 右侧绩效仪表盘 -->
<div class="w-4/5 pl-4">
<div class="bg-white rounded-lg shadow-sm p-4 performance-dashboard">
<div class="flex justify-between items-center mb-4">
<h2 class="text-lg font-medium">绩效仪表盘</h2>
<div class="flex items-center space-x-2">
<span class="text-sm">绩效计划:</span>
<div class="relative">
<button class="bg-secondary text-sm px-3 py-1 !rounded-button flex items-center space-x-1">
<span>2023年Q3季度考核</span>
<i class="fas fa-chevron-down text-xs"></i>
</button>
</div>
</div>
</div>
<!-- 图表区域 -->
<div class="grid grid-cols-2 gap-4 mb-6">
<div class="bg-white rounded-lg shadow-sm p-4">
<h3 class="text-sm font-medium mb-2">绩效评分分布</h3>
<div class="chart-container" id="scoreDistributionChart"></div>
</div>
<div class="bg-white rounded-lg shadow-sm p-4">
<h3 class="text-sm font-medium mb-2">部门绩效平均分</h3>
<div class="flex justify-end mb-2">
<div class="relative">
<button
class="bg-secondary text-sm px-3 py-1 !rounded-button flex items-center space-x-1">
<span>一级部门</span>
<i class="fas fa-chevron-down text-xs"></i>
</button>
</div>
</div>
<div class="chart-container" id="departmentScoreChart"></div>
</div>
</div>
<!-- 人员绩效明细表 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h3 class="text-sm font-medium mb-3">人员绩效明细</h3>
<div class="table-container">
<table class="w-full text-sm">
<thead class="table-header">
<tr class="border-b">
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>姓名</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>部门</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>总分</span>
<i class="fas fa-sort-down ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>代码行数</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>文档字数</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>项目金额数</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>出勤时长</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
<th class="text-left py-2 px-3 cursor-pointer hover:bg-secondary">
<div class="flex items-center">
<span>价值观</span>
<i class="fas fa-sort ml-1 text-xs opacity-50"></i>
</div>
</th>
</tr>
</thead>
<tbody>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">张明远</td>
<td class="py-2 px-3">技术研发中心</td>
<td class="py-2 px-3 font-medium text-primary">96.5</td>
<td class="py-2 px-3">12500</td>
<td class="py-2 px-3">8500</td>
<td class="py-2 px-3">¥1,250,000</td>
<td class="py-2 px-3">186</td>
<td class="py-2 px-3">48.0</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">李思颖</td>
<td class="py-2 px-3">市场营销中心</td>
<td class="py-2 px-3 font-medium text-primary">95.0</td>
<td class="py-2 px-3">11800</td>
<td class="py-2 px-3">9200</td>
<td class="py-2 px-3">¥1,100,000</td>
<td class="py-2 px-3">182</td>
<td class="py-2 px-3">47.0</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">王浩然</td>
<td class="py-2 px-3">产品运营中心</td>
<td class="py-2 px-3 font-medium text-primary">93.5</td>
<td class="py-2 px-3">11000</td>
<td class="py-2 px-3">7800</td>
<td class="py-2 px-3">¥980,000</td>
<td class="py-2 px-3">180</td>
<td class="py-2 px-3">47.0</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">陈雨桐</td>
<td class="py-2 px-3">人力资源中心</td>
<td class="py-2 px-3 font-medium text-primary">92.0</td>
<td class="py-2 px-3">10500</td>
<td class="py-2 px-3">9500</td>
<td class="py-2 px-3">¥920,000</td>
<td class="py-2 px-3">178</td>
<td class="py-2 px-3">46.5</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">刘子轩</td>
<td class="py-2 px-3">技术研发中心</td>
<td class="py-2 px-3 font-medium text-primary">91.5</td>
<td class="py-2 px-3">9800</td>
<td class="py-2 px-3">7200</td>
<td class="py-2 px-3">¥890,000</td>
<td class="py-2 px-3">175</td>
<td class="py-2 px-3">46.0</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">赵欣然</td>
<td class="py-2 px-3">客户服务中心</td>
<td class="py-2 px-3 font-medium text-primary">90.0</td>
<td class="py-2 px-3">9200</td>
<td class="py-2 px-3">8500</td>
<td class="py-2 px-3">¥850,000</td>
<td class="py-2 px-3">172</td>
<td class="py-2 px-3">45.5</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">孙伟杰</td>
<td class="py-2 px-3">财务中心</td>
<td class="py-2 px-3 font-medium text-primary">89.5</td>
<td class="py-2 px-3">8900</td>
<td class="py-2 px-3">6800</td>
<td class="py-2 px-3">¥820,000</td>
<td class="py-2 px-3">170</td>
<td class="py-2 px-3">45.0</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">周晓彤</td>
<td class="py-2 px-3">市场营销中心</td>
<td class="py-2 px-3 font-medium text-primary">88.0</td>
<td class="py-2 px-3">8500</td>
<td class="py-2 px-3">7900</td>
<td class="py-2 px-3">¥780,000</td>
<td class="py-2 px-3">168</td>
<td class="py-2 px-3">44.5</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">吴宇航</td>
<td class="py-2 px-3">技术研发中心</td>
<td class="py-2 px-3 font-medium text-primary">87.5</td>
<td class="py-2 px-3">8200</td>
<td class="py-2 px-3">6500</td>
<td class="py-2 px-3">¥750,000</td>
<td class="py-2 px-3">165</td>
<td class="py-2 px-3">44.0</td>
</tr>
<tr class="border-b hover:bg-secondary">
<td class="py-2 px-3">郑雅文</td>
<td class="py-2 px-3">产品运营中心</td>
<td class="py-2 px-3 font-medium text-primary">86.0</td>
<td class="py-2 px-3">8000</td>
<td class="py-2 px-3">7800</td>
<td class="py-2 px-3">¥720,000</td>
<td class="py-2 px-3">162</td>
<td class="py-2 px-3">43.5</td>
</tr>
</tbody>
</table>
</div>
<div class="flex justify-between items-center mt-3 text-sm">
<div>显示 1 到 10 条,共 128 条记录</div>
<div class="flex space-x-2">
<button class="bg-secondary px-3 py-1 !rounded-button">上一页</button>
<button class="bg-primary text-white px-3 py-1 !rounded-button">1</button>
<button class="bg-secondary px-3 py-1 !rounded-button">2</button>
<button class="bg-secondary px-3 py-1 !rounded-button">3</button>
<span class="px-2 py-1">...</span>
<button class="bg-secondary px-3 py-1 !rounded-button">13</button>
<button class="bg-secondary px-3 py-1 !rounded-button">下一页</button>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="bg-gray-800 text-gray-300 text-xs py-6 px-6">
<div class="max-w-7xl mx-auto">
<div class="grid grid-cols-4 gap-8">
<div>
<h4 class="text-sm font-medium text-white mb-3">关于我们</h4>
<ul class="space-y-2">
<li><a href="#" class="hover:text-white">公司简介</a></li>
<li><a href="#" class="hover:text-white">发展历程</a></li>
<li><a href="#" class="hover:text-white">企业文化</a></li>
<li><a href="#" class="hover:text-white">管理团队</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-medium text-white mb-3">产品服务</h4>
<ul class="space-y-2">
<li><a href="#" class="hover:text-white">人力资源系统</a></li>
<li><a href="#" class="hover:text-white">薪酬管理系统</a></li>
<li><a href="#" class="hover:text-white">绩效管理系统</a></li>
<li><a href="#" class="hover:text-white">培训发展平台</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-medium text-white mb-3">帮助中心</h4>
<ul class="space-y-2">
<li><a href="#" class="hover:text-white">常见问题</a></li>
<li><a href="#" class="hover:text-white">使用指南</a></li>
<li><a href="#" class="hover:text-white">视频教程</a></li>
<li><a href="#" class="hover:text-white">在线客服</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-medium text-white mb-3">联系我们</h4>
<ul class="space-y-2">
<li><i class="fas fa-map-marker-alt mr-2"></i> 北京市海淀区中关村南大街5号</li>
<li><i class="fas fa-phone-alt mr-2"></i> 400-888-8888</li>
<li><i class="fas fa-envelope mr-2"></i> hr@company.com</li>
<li class="flex space-x-3 mt-3">
<a href="#" class="hover:text-white"><i class="fab fa-weixin"></i></a>
<a href="#" class="hover:text-white"><i class="fab fa-weibo"></i></a>
<a href="#" class="hover:text-white"><i class="fab fa-linkedin-in"></i></a>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-6 pt-6 flex justify-between">
<div>© 2023 人力资源管理系统 版权所有</div>
<div class="flex space-x-4">
<a href="#" class="hover:text-white">隐私政策</a>
<a href="#" class="hover:text-white">服务条款</a>
<a href="#" class="hover:text-white">法律声明</a>
</div>
</div>
</div>
</footer>
<script>
// 绩效评分分布饼图
const scoreDistributionChart = echarts.init(document.getElementById('scoreDistributionChart'));
const scoreDistributionOption = {
animation: false,
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
right: 10,
top: 'center',
data: ['0-60分', '60-80分', '80-100分']
},
series: [
{
name: '绩效评分分布',
type: 'pie',
radius: ['50%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '14',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 12, name: '0-60分', itemStyle: { color: '#FF6B6B' } },
{ value: 45, name: '60-80分', itemStyle: { color: '#4ECDC4' } },
{ value: 71, name: '80-100分', itemStyle: { color: '#45B7D1' } }
]
}
]
};
scoreDistributionChart.setOption(scoreDistributionOption);
// 部门绩效平均分柱状图
const departmentScoreChart = echarts.init(document.getElementById('departmentScoreChart'));
const departmentScoreOption = {
animation: false,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01]
},
yAxis: {
type: 'category',
data: ['技术研发', '市场营销', '产品运营', '人力资源', '财务中心', '客户服务']
},
series: [
{
name: '平均分',
type: 'bar',
data: [89.5, 87.2, 85.8, 84.3, 83.7, 82.1],
itemStyle: {
color: function (params) {
const colorList = ['#45B7D1', '#4ECDC4', '#A5DEE4', '#7AC5CD', '#66C6C4', '#45B7D1'];
return colorList[params.dataIndex];
},
borderRadius: [4, 4, 0, 0]
}
}
]
};
departmentScoreChart.setOption(departmentScoreOption);
// 窗口大小变化时重新调整图表大小
window.addEventListener('resize', function () {
scoreDistributionChart.resize();
departmentScoreChart.resize();
});
</script>
</body>
</html>

@ -265,7 +265,7 @@
</main>
<!-- 页脚 -->
<footer class="w-full bg-gray-800 text-white py-6">
<!-- <footer class="w-full bg-gray-800 text-white py-6">
<div class="max-w-7xl mx-auto px-4">
<div class="grid grid-cols-4 gap-8">
<div>
@ -313,6 +313,6 @@
<p>© 2025 人力资源管理系统 版权所有 | 京ICP备12345678号-1 | 京公网安备11010802023456号</p>
</div>
</div>
</footer>
</footer> -->
</body>
</html>

@ -0,0 +1,527 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.5.0/echarts.min.js"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA'
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
.marquee {
animation: marquee 20s linear infinite;
}
@keyframes marquee {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
.card-hover:hover {
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
transform: translateY(-2px);
}
.table-row-hover:hover {
background-color: #F5F6FA;
}
.button-click:active {
transform: scale(0.98);
}
.icon-container {
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body class="min-h-[1024px] bg-secondary font-sans">
<!-- 顶部导航栏 -->
<header class="w-full bg-primary text-white shadow-md">
<div class="container mx-auto px-6 py-3 flex items-center justify-between">
<!-- Logo -->
<div class="flex items-center">
<span class="font-['Pacifico'] text-xl mr-10">人力</span>
<!-- 导航菜单 -->
<nav class="hidden md:flex space-x-6">
<a href="#" class="text-sm hover:text-gray-200 transition">多维统计</a>
<a href="#" class="text-sm hover:text-gray-200 transition">人员管理</a>
<a href="#" class="text-sm hover:text-gray-200 transition">组织管理</a>
<a href="#" class="text-sm hover:text-gray-200 transition">考勤管理</a>
<a href="#" class="text-sm hover:text-gray-200 transition">绩效管理</a>
<a href="#" class="text-sm hover:text-gray-200 transition">薪酬管理</a>
<a href="#" class="text-sm hover:text-gray-200 transition">知识库</a>
<a href="#" class="text-sm hover:text-gray-200 transition">后台管理</a>
</nav>
</div>
<!-- 右侧功能区 -->
<div class="flex items-center space-x-4">
<!-- 搜索框 -->
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..." class="bg-white text-gray-800 rounded-button pl-8 pr-4 py-1 text-sm w-48 focus:outline-none focus:ring-2 focus:ring-primary">
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-500 text-sm"></i>
</div>
<!-- 用户头像 -->
<div class="relative">
<img src="https://mastergo.com/ai/api/search-image?query=professional20business20person20avatar20with20blue20background20modern20flat20design20simple20and20clean20style20high20quality20detailed20facial20features20corporate20identity20isolated20on20solid20color20background&width=40&height=40&orientation=squarish&flag=9860deef32d4e3ff72a4534d7698d477"
alt="用户头像"
class="w-8 h-8 rounded-full object-cover cursor-pointer">
</div>
<!-- AI助手 -->
<button class="bg-white text-primary rounded-button px-3 py-1 text-sm flex items-center whitespace-nowrap button-click">
<i class="fas fa-robot mr-1 text-sm"></i>
AI助手
</button>
<!-- 移动端菜单按钮 -->
<button class="md:hidden">
<i class="fas fa-bars text-xl"></i>
</button>
</div>
</div>
</header>
<!-- 公告栏 -->
<div class="bg-white shadow-sm">
<div class="container mx-auto px-6 py-2 overflow-hidden">
<div class="flex items-center">
<span class="bg-red-500 text-white text-xs px-2 py-1 rounded mr-3">公告</span>
<div class="whitespace-nowrap marquee">
<span class="text-sm text-gray-700">系统将于2023年12月25日00:00至06:00进行升级维护期间系统将无法访问请提前做好工作安排。</span>
</div>
</div>
</div>
</div>
<!-- 主要内容区 -->
<main class="container mx-auto px-6 py-8">
<!-- 查询条件 -->
<div class="bg-white rounded-lg shadow p-6 mb-6">
<div class="flex flex-wrap items-end -mx-2">
<div class="w-full md:w-1/4 px-2 mb-4 md:mb-0">
<label class="block text-sm font-medium text-gray-700 mb-1">员工 ID</label>
<input type="text" class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="请输入员工ID">
</div>
<div class="w-full md:w-1/4 px-2 mb-4 md:mb-0">
<label class="block text-sm font-medium text-gray-700 mb-1">员工姓名</label>
<input type="text" class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="请输入员工姓名">
</div>
<div class="w-full md:w-1/4 px-2 mb-4 md:mb-0">
<label class="block text-sm font-medium text-gray-700 mb-1">日期范围</label>
<div class="relative">
<input type="text" class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="选择日期范围">
<i class="fas fa-calendar-alt absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 text-sm"></i>
</div>
</div>
<div class="w-full md:w-1/4 px-2">
<button class="w-full bg-primary text-white rounded-button px-4 py-2 text-sm hover:bg-blue-600 transition button-click whitespace-nowrap">
<i class="fas fa-search mr-1"></i> 查询
</button>
</div>
</div>
</div>
<!-- 第一行卡片组 -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
<!-- 员工基本信息卡片 -->
<div class="bg-white rounded-lg shadow p-6 card-hover transition">
<div class="flex items-center mb-4">
<img src="https://mastergo.com/ai/api/search-image?query=professional20asian20business20woman20portrait20with20white20background20modern20office20attire20high20quality20detailed20facial20features20corporate20identity20isolated20on20solid20color20background&width=80&height=80&orientation=squarish&flag=be98d141ba2245f194713abc5bba69dc"
alt="员工头像"
class="w-16 h-16 rounded-full object-cover mr-4">
<div>
<h3 class="text-lg font-semibold text-gray-800">张雨晴</h3>
<p class="text-sm text-gray-600">ID: E10086</p>
</div>
</div>
<div class="space-y-2">
<div class="flex">
<span class="text-sm text-gray-600 w-20">部门:</span>
<span class="text-sm text-gray-800">产品研发中心</span>
</div>
<div class="flex">
<span class="text-sm text-gray-600 w-20">岗位:</span>
<span class="text-sm text-gray-800">高级产品经理</span>
</div>
<div class="flex">
<span class="text-sm text-gray-600 w-20">职级:</span>
<span class="text-sm text-gray-800">P7</span>
</div>
<div class="flex">
<span class="text-sm text-gray-600 w-20">入职日期:</span>
<span class="text-sm text-gray-800">2019-05-15</span>
</div>
</div>
</div>
<!-- 考勤状态卡片 -->
<div class="bg-white rounded-lg shadow p-6 card-hover transition">
<h3 class="text-lg font-semibold text-gray-800 mb-4">今日考勤状态</h3>
<div class="flex items-center mb-3">
<div class="w-3 h-3 rounded-full bg-green-500 mr-2"></div>
<span class="text-sm font-medium text-gray-800">正常出勤</span>
</div>
<div class="space-y-2 text-sm text-gray-700">
<p>上班打卡: 08:58 (准时)</p>
<p>下班打卡: 18:32 (准时)</p>
<p>工作时长: 9小时34分钟</p>
<p>本月累计出勤: 18天</p>
</div>
</div>
<!-- 操作按钮卡片 -->
<div class="bg-white rounded-lg shadow p-6 card-hover transition">
<h3 class="text-lg font-semibold text-gray-800 mb-4">快捷操作</h3>
<div class="grid grid-cols-2 gap-3">
<button class="bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-sync-alt mr-1"></i> 重新同步
</button>
<button class="bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-exclamation-triangle mr-1"></i> 异常提报
</button>
<button class="bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-edit mr-1"></i> 修改记录
</button>
<button class="bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-file-export mr-1"></i> 导出数据
</button>
<button class="bg-primary text-white rounded-button px-3 py-2 text-sm hover:bg-blue-600 transition button-click whitespace-nowrap col-span-2">
<i class="fas fa-chart-line mr-1"></i> 查看考勤分析
</button>
</div>
</div>
</div>
<!-- 考勤数据表格 -->
<div class="bg-white rounded-lg shadow overflow-hidden mb-6">
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">日期</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">考勤地点</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">考勤状态</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">上班时间</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">下班时间</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">工作时长</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">操作</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr class="table-row-hover">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">2023-11-01</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">总部大楼-3F</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">正常</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">08:56</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">18:30</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">9小时34分钟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">
<button class="text-primary hover:text-blue-600">详情</button>
</td>
</tr>
<tr class="table-row-hover">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">2023-10-31</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">总部大楼-3F</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">正常</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">09:02</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">18:45</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">9小时43分钟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">
<button class="text-primary hover:text-blue-600">详情</button>
</td>
</tr>
<tr class="table-row-hover">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">2023-10-30</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">远程办公</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-yellow-100 text-yellow-800">远程</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">09:15</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">18:50</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">9小时35分钟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">
<button class="text-primary hover:text-blue-600">详情</button>
</td>
</tr>
<tr class="table-row-hover">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">2023-10-27</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">总部大楼-3F</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">迟到</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">09:35</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">18:20</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">8小时45分钟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">
<button class="text-primary hover:text-blue-600">详情</button>
</td>
</tr>
<tr class="table-row-hover">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">2023-10-26</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">总部大楼-3F</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">正常</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">08:50</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">18:10</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">9小时20分钟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-800">
<button class="text-primary hover:text-blue-600">详情</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bg-gray-50 px-6 py-3 flex items-center justify-between border-t border-gray-200">
<div class="flex-1 flex justify-between sm:hidden">
<button class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
上一页
</button>
<button class="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
下一页
</button>
</div>
<div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
<div>
<p class="text-sm text-gray-700">
显示 <span class="font-medium">1</span><span class="font-medium">5</span> 条,共 <span class="font-medium">32</span> 条记录
</p>
</div>
<div>
<nav class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
<button class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
<span class="sr-only">上一页</span>
<i class="fas fa-chevron-left"></i>
</button>
<button aria-current="page" class="z-10 bg-primary border-primary text-white relative inline-flex items-center px-4 py-2 border text-sm font-medium">
1
</button>
<button class="bg-white border-gray-300 text-gray-500 hover:bg-gray-50 relative inline-flex items-center px-4 py-2 border text-sm font-medium">
2
</button>
<button class="bg-white border-gray-300 text-gray-500 hover:bg-gray-50 relative inline-flex items-center px-4 py-2 border text-sm font-medium">
3
</button>
<button class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
<span class="sr-only">下一页</span>
<i class="fas fa-chevron-right"></i>
</button>
</nav>
</div>
</div>
</div>
</div>
<!-- 第二行卡片组 -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
<!-- 排班数据卡片 -->
<div class="bg-white rounded-lg shadow p-6 card-hover transition">
<h3 class="text-lg font-semibold text-gray-800 mb-4">当前排班</h3>
<div class="space-y-3">
<div class="flex justify-between">
<span class="text-sm text-gray-600">排班名称:</span>
<span class="text-sm text-gray-800 font-medium">标准工作日</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">上班时间:</span>
<span class="text-sm text-gray-800 font-medium">09:00</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">下班时间:</span>
<span class="text-sm text-gray-800 font-medium">18:00</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">午休时间:</span>
<span class="text-sm text-gray-800 font-medium">12:00-13:30</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">适用日期:</span>
<span class="text-sm text-gray-800 font-medium">周一至周五</span>
</div>
<div class="pt-3 mt-3 border-t border-gray-200">
<button class="w-full bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-calendar-alt mr-1"></i> 查看排班历史
</button>
</div>
</div>
</div>
<!-- 考勤明细卡片 -->
<div class="bg-white rounded-lg shadow p-6 card-hover transition">
<h3 class="text-lg font-semibold text-gray-800 mb-4">本月考勤统计</h3>
<div class="space-y-3">
<div class="flex justify-between">
<span class="text-sm text-gray-600">应出勤天数:</span>
<span class="text-sm text-gray-800 font-medium">22天</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">实际出勤天数:</span>
<span class="text-sm text-gray-800 font-medium">18天</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">迟到次数:</span>
<span class="text-sm text-gray-800 font-medium">1次</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">早退次数:</span>
<span class="text-sm text-gray-800 font-medium">0次</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">缺卡次数:</span>
<span class="text-sm text-gray-800 font-medium">0次</span>
</div>
<div class="pt-3 mt-3 border-t border-gray-200">
<button class="w-full bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-chart-pie mr-1"></i> 查看详细统计
</button>
</div>
</div>
</div>
<!-- 同步信息卡片 -->
<div class="bg-white rounded-lg shadow p-6 card-hover transition">
<h3 class="text-lg font-semibold text-gray-800 mb-4">数据同步信息</h3>
<div class="space-y-3">
<div class="flex justify-between">
<span class="text-sm text-gray-600">最后同步时间:</span>
<span class="text-sm text-gray-800 font-medium">2023-11-01 23:45:12</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">同步状态:</span>
<span class="text-sm text-green-600 font-medium">成功</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">最后计算时间:</span>
<span class="text-sm text-gray-800 font-medium">2023-11-02 00:15:30</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-gray-600">计算状态:</span>
<span class="text-sm text-green-600 font-medium">成功</span>
</div>
<div class="pt-3 mt-3 border-t border-gray-200">
<div class="flex space-x-3">
<button class="flex-1 bg-secondary text-gray-800 rounded-button px-3 py-2 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-sync-alt mr-1"></i> 立即同步
</button>
<button class="flex-1 bg-primary text-white rounded-button px-3 py-2 text-sm hover:bg-blue-600 transition button-click whitespace-nowrap">
<i class="fas fa-calculator mr-1"></i> 重新计算
</button>
</div>
</div>
</div>
</div>
</div>
<!-- 考勤分析图表 -->
<div class="bg-white rounded-lg shadow p-6 mb-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-lg font-semibold text-gray-800">月度考勤分析</h3>
<div class="flex space-x-2">
<button class="bg-secondary text-gray-800 rounded-button px-3 py-1 text-sm hover:bg-gray-200 transition button-click whitespace-nowrap">
<i class="fas fa-calendar-alt mr-1"></i> 选择月份
</button>
<button class="bg-primary text-white rounded-button px-3 py-1 text-sm hover:bg-blue-600 transition button-click whitespace-nowrap">
<i class="fas fa-download mr-1"></i> 导出图表
</button>
</div>
</div>
<div class="h-80" id="attendanceChart"></div>
</div>
</main>
<!-- 页脚 -->
<footer class="w-full bg-gray-800 text-white py-8">
<div class="container mx-auto px-6">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div>
<h3 class="font-['Pacifico'] text-xl mb-4">人力</h3>
<p class="text-sm text-gray-400 mb-4">专业的人力资源管理解决方案提供商</p>
<div class="flex space-x-4">
<a href="#" class="text-gray-400 hover:text-white transition">
<i class="fab fa-weixin"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white transition">
<i class="fab fa-weibo"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white transition">
<i class="fab fa-linkedin"></i>
</a>
</div>
</div>
<div>
<h4 class="text-sm font-semibold mb-4">产品</h4>
<ul class="space-y-2">
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">人力资源管理系统</a></li>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">考勤管理系统</a></li>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">绩效管理系统</a></li>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">薪酬管理系统</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-semibold mb-4">解决方案</h4>
<ul class="space-y-2">
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">制造业解决方案</a></li>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">零售业解决方案</a></li>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">互联网行业解决方案</a></li>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">教育行业解决方案</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-semibold mb-4">联系我们</h4>
<ul class="space-y-2">
<li class="flex items-center text-sm text-gray-400">
<i class="fas fa-map-marker-alt mr-2"></i> 北京市海淀区中关村软件园
</li>
<li class="flex items-center text-sm text-gray-400">
<i class="fas fa-phone-alt mr-2"></i> 400-888-8888
</li>
<li class="flex items-center text-sm text-gray-400">
<i class="fas fa-envelope mr-2"></i> contact@hrsystem.com
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 flex flex-col md:flex-row justify-between items-center">
<p class="text-xs text-gray-500 mb-4 md:mb-0">© 2023 人力资源管理系统. 保留所有权利.</p>
<div class="flex space-x-6">
<a href="#" class="text-xs text-gray-500 hover:text-white transition">隐私政策</a>
<a href="#" class="text-xs text-gray-500 hover:text-white transition">服务条款</a>
<a href="#" class="text-xs text-gray-500 hover:text-white transition">法律声明</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,751 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统 - 人员详情</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.5.0/echarts.min.js"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2D5CF6',
secondary: '#F5F6FA',
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
<style>
body {
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
}
.logo {
font-family: 'Pacifico', serif;
}
.scroll-container {
overflow: hidden;
}
.scroll-content {
display: inline-block;
white-space: nowrap;
animation: scroll 20s linear infinite;
}
@keyframes scroll {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
.avatar {
width: 80px;
height: 80px;
border-radius: 9999px;
object-fit: cover;
}
.salary-chart {
width: 100%;
height: 300px;
}
.hover-effect:hover {
background-color: #F5F6FA;
transition: background-color 0.3s ease;
}
.search-input {
width: 200px;
transition: width 0.3s ease;
}
.search-input:focus {
width: 250px;
}
.nav-item {
position: relative;
}
.nav-item::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 2px;
background-color: white;
transition: all 0.3s ease;
transform: translateX(-50%);
}
.nav-item:hover::after {
width: 100%;
}
i {
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body class="min-h-[1024px] flex flex-col bg-gray-50">
<!-- 顶部导航栏 -->
<header class="bg-primary text-white sticky top-0 z-50 shadow-md">
<div class="container mx-auto px-4">
<div class="flex items-center justify-between h-16">
<!-- Logo -->
<div class="flex items-center">
<span class="logo text-xl font-bold">人力</span>
</div>
<!-- 主导航 -->
<nav class="hidden md:flex items-center space-x-6 text-sm">
<a href="#" class="nav-item">多维统计</a>
<a href="#" class="nav-item">人员管理</a>
<a href="#" class="nav-item">组织管理</a>
<a href="#" class="nav-item">考勤管理</a>
<a href="#" class="nav-item">绩效管理</a>
<a href="#" class="nav-item">薪酬管理</a>
<a href="#" class="nav-item">知识库</a>
<a href="#" class="nav-item">后台管理</a>
</nav>
<!-- 右侧功能区 -->
<div class="flex items-center space-x-4">
<!-- 搜索框 -->
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..."
class="search-input bg-primary-light text-white placeholder-white text-sm px-4 py-2 rounded-button border border-white/20 focus:outline-none focus:border-white/50">
<i
class="fas fa-search absolute right-3 top-1/2 transform -translate-y-1/2 text-white text-sm"></i>
</div>
<!-- AI助手 -->
<button
class="flex items-center space-x-1 bg-white/10 hover:bg-white/20 px-3 py-1 rounded-button text-sm transition-colors duration-200">
<i class="fas fa-robot text-white text-sm"></i>
<span>AI助手</span>
</button>
<!-- 用户头像 -->
<div class="relative">
<img src="https://mastergo.com/ai/api/search-image?query=professional20business20person20avatar20with20blue20background20modern20style20high20quality20detailed20face20suitable20for20corporate20profile20picture&width=32&height=32&orientation=squarish&flag=9f5df518eb860f9e9f398c83389a3114"
alt="用户头像" class="w-8 h-8 rounded-full object-cover cursor-pointer">
</div>
</div>
</div>
</div>
</header>
<!-- 公告栏 -->
<div class="bg-secondary py-2 px-4">
<div class="container mx-auto">
<div class="scroll-container">
<div class="scroll-content text-sm text-gray-600">
<span class="font-semibold mr-4">公告:</span>
<span class="mr-8">2023年度绩效考核将于12月1日正式启动</span>
<span class="mr-8">公司年度旅游计划已发布,请各部门负责人查看邮件</span>
<span class="mr-8">新员工入职培训将于下周一上午9点在3楼会议室举行</span>
<span class="mr-8">薪酬系统升级维护将于本周六凌晨2点至4点进行</span>
</div>
</div>
</div>
</div>
<!-- 主要内容区 -->
<main class="flex-grow container mx-auto px-4 py-8">
<!-- 个人信息卡片 -->
<div class="bg-white rounded-xl shadow-md p-6 mb-6">
<div class="flex items-start">
<!-- 头像 -->
<img src="https://mastergo.com/ai/api/search-image?query=professional20asian20business20woman20portrait20with20blue20background20modern20office20style20high20quality20detailed20face20suitable20for20employee20profile20picture&width=80&height=80&orientation=squarish&flag=9f99ced8fd9576fe3f6eb62e456fcf9f"
alt="员工头像" class="avatar mr-6">
<!-- 基本信息 -->
<div class="flex-grow">
<div class="flex items-center justify-between mb-2">
<h1 class="text-2xl font-bold text-gray-800">林雅婷</h1>
<span class="text-sm text-gray-500">员工ID: HR20230085</span>
</div>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-sm">
<div>
<p class="text-gray-500">年龄</p>
<p class="font-medium">28岁</p>
</div>
<div>
<p class="text-gray-500">性别</p>
<p class="font-medium"></p>
</div>
<div>
<p class="text-gray-500">部门</p>
<p class="font-medium">市场部</p>
</div>
<div>
<p class="text-gray-500">岗位</p>
<p class="font-medium">市场策划主管</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-gray-100">
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-sm">
<div>
<p class="text-gray-500">入职日期</p>
<p class="font-medium">2020-05-15</p>
</div>
<div>
<p class="text-gray-500">工龄</p>
<p class="font-medium">3年6个月</p>
</div>
<div>
<p class="text-gray-500">职级</p>
<p class="font-medium">P2-3</p>
</div>
<div>
<p class="text-gray-500">直属上级</p>
<p class="font-medium">张伟 (市场部经理)</p>
</div>
</div>
</div>
</div>
<!-- 操作按钮 -->
<div class="flex flex-col space-y-2 ml-4">
<button
class="flex items-center justify-center whitespace-nowrap bg-primary hover:bg-primary-dark text-white px-4 py-2 rounded-button text-sm">
<i class="fas fa-edit mr-2 text-sm"></i>
编辑信息
</button>
<button
class="flex items-center justify-center whitespace-nowrap bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 px-4 py-2 rounded-button text-sm">
<i class="fas fa-file-export mr-2 text-sm"></i>
导出资料
</button>
<button
class="flex items-center justify-center whitespace-nowrap bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 px-4 py-2 rounded-button text-sm">
<i class="fas fa-print mr-2 text-sm"></i>
打印档案
</button>
</div>
</div>
</div>
<!-- 薪资概览 -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
<!-- 税前工资 -->
<div class="bg-white rounded-xl shadow-md p-6">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-gray-700">税前工资</h2>
<span class="text-xs bg-green-100 text-green-800 px-2 py-1 rounded-full">+5% 上月</span>
</div>
<div class="flex items-end">
<span class="text-3xl font-bold text-primary">¥18,500</span>
<span class="text-sm text-gray-500 ml-2 mb-1">/月</span>
</div>
<div class="mt-4 text-sm text-gray-500">
<p>年度累计: ¥203,500</p>
<p>上月工资: ¥17,600</p>
</div>
</div>
<!-- 税后工资 -->
<div class="bg-white rounded-xl shadow-md p-6">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-gray-700">税后工资</h2>
<span class="text-xs bg-green-100 text-green-800 px-2 py-1 rounded-full">+4.8% 上月</span>
</div>
<div class="flex items-end">
<span class="text-3xl font-bold text-primary">¥15,320</span>
<span class="text-sm text-gray-500 ml-2 mb-1">/月</span>
</div>
<div class="mt-4 text-sm text-gray-500">
<p>年度累计: ¥168,520</p>
<p>上月工资: ¥14,620</p>
</div>
</div>
<!-- 薪资构成 -->
<div class="bg-white rounded-xl shadow-md p-6">
<h2 class="text-lg font-semibold text-gray-700 mb-4">薪资构成</h2>
<div class="space-y-3">
<div>
<div class="flex justify-between text-sm mb-1">
<span class="text-gray-600">基本工资</span>
<span class="font-medium">¥10,000</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-blue-500 h-2 rounded-full" style="width: 54%"></div>
</div>
</div>
<div>
<div class="flex justify-between text-sm mb-1">
<span class="text-gray-600">绩效工资</span>
<span class="font-medium">¥5,500</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-green-500 h-2 rounded-full" style="width: 30%"></div>
</div>
</div>
<div>
<div class="flex justify-between text-sm mb-1">
<span class="text-gray-600">各类补贴</span>
<span class="font-medium">¥3,000</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-yellow-500 h-2 rounded-full" style="width: 16%"></div>
</div>
</div>
</div>
</div>
</div>
<!-- 工资明细表 -->
<div class="bg-white rounded-xl shadow-md overflow-hidden mb-6">
<div class="px-6 py-4 border-b border-gray-100">
<h2 class="text-lg font-semibold text-gray-700">2023年10月工资明细</h2>
</div>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
项目</th>
<th scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
标准</th>
<th scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
应发</th>
<th scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
扣减</th>
<th scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
实发</th>
<th scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
备注</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">基本工资</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥10,000</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥10,000</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥10,000</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">绩效工资</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥6,000</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥5,500</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥500</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥5,500</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">KPI未达标</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">岗位津贴</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥1,200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥1,200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥1,200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">主管级津贴</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">餐补</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥600</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥600</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥600</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">22个工作日</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">交通补贴</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥800</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥800</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥800</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">通讯补贴</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥300</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥300</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥300</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">加班费</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥1,100</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥1,100</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">国庆加班3天</td>
</tr>
<tr class="bg-gray-50 hover:bg-gray-100">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">小计</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥19,500</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥500</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">¥19,000</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">养老保险</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">8%</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥800</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">-¥800</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">个人缴纳</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">医疗保险</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2%</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">-¥200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">个人缴纳</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">失业保险</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">0.5%</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥50</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">-¥50</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">个人缴纳</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">住房公积金</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">12%</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥1,200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">-¥1,200</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">个人缴纳</td>
</tr>
<tr class="hover-effect">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">个人所得税</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥1,430</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">-¥1,430</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">累计预扣法</td>
</tr>
<tr class="bg-gray-50 hover:bg-gray-100">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">合计扣减</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">¥3,680</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">-¥3,680</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">-</td>
</tr>
<tr class="bg-primary-light hover:bg-primary-lighter">
<td class="px-6 py-4 whitespace-nowrap text-sm font-bold text-white">实发工资</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-bold text-white">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-bold text-white">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-bold text-white">-</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-bold text-white">¥15,320</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-bold text-white">-</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 考勤记录 -->
<div class="bg-white rounded-xl shadow-md overflow-hidden mb-6">
<div class="px-6 py-4 border-b border-gray-100">
<div class="flex justify-between items-center">
<h2 class="text-lg font-semibold text-gray-700">2023年10月考勤记录</h2>
<div class="flex space-x-2">
<button
class="whitespace-nowrap bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 px-3 py-1 rounded-button text-sm">月度</button>
<button
class="whitespace-nowrap bg-primary text-white px-3 py-1 rounded-button text-sm">年度</button>
</div>
</div>
</div>
<div class="px-6 py-4">
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-center">
<div class="bg-green-50 p-4 rounded-lg">
<p class="text-sm text-gray-500">应出勤天数</p>
<p class="text-2xl font-bold text-green-600">22</p>
</div>
<div class="bg-blue-50 p-4 rounded-lg">
<p class="text-sm text-gray-500">实际出勤</p>
<p class="text-2xl font-bold text-blue-600">21</p>
</div>
<div class="bg-yellow-50 p-4 rounded-lg">
<p class="text-sm text-gray-500">迟到/早退</p>
<p class="text-2xl font-bold text-yellow-600">1</p>
</div>
<div class="bg-red-50 p-4 rounded-lg">
<p class="text-sm text-gray-500">缺勤</p>
<p class="text-2xl font-bold text-red-600">0.5</p>
</div>
</div>
<div class="mt-6">
<div class="flex flex-wrap gap-2">
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-01
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-02
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-03
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800">10-04
迟到</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-05
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-06
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-07
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-08
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-09
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-10
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-11
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-12
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-13
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-14
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-15
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-16
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-17
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-18
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-19
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-20
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-red-100 text-red-800">10-21
缺勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-22
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-23
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-24
出勤</span>
<span
class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">10-25
出 ```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人力资源管理系统</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-50">
<!-- 导航栏 -->
<nav class="bg-[#2D5CF6] fixed w-full top-0 z-50">
<div class="max-w-7xl mx-auto px-4">
<div class="flex justify-between h-16 items-center">
<div class="flex items-center">
<div class="text-white text-xl font-bold">人力</div>
<div class="hidden md:flex space-x-8 ml-10">
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">多维统计</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">人员管理</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">组织管理</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">考勤管理</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">绩效管理</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">薪酬管理</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">知识库</a>
<a href="#"
class="text-white text-sm hover:bg-blue-600 px-3 py-2 rounded-md">后台管理</a>
</div>
</div>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..."
class="bg-blue-600 text-white placeholder-blue-200 rounded-md py-1 px-3 text-sm focus:outline-none focus:ring-2 focus:ring-white">
</div>
<button class="bg-blue-600 p-2 rounded-full">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor"
viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round"
stroke-width="2"
d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" />
</svg>
</button>
<img class="h-8 w-8 rounded-full" src="https://via.placeholder.com/32"
alt="用户头像">
</div>
</div>
</div>
</nav>
<!-- 主要内容区 -->
<main class="max-w-7xl mx-auto px-4 mt-20">
<!-- 个人信息卡片 -->
<div class="bg-white rounded-lg shadow-lg p-6 mb-6">
<div class="flex items-start">
<img class="h-20 w-20 rounded-full" src="https://via.placeholder.com/80"
alt="员工头像">
<div class="ml-6">
<h2 class="text-xl font-bold">张三</h2>
<div class="mt-2 grid grid-cols-2 gap-4 text-sm text-gray-600">
<div>年龄28岁</div>
<div>部门:技术部</div>
<div>工号10086</div>
<div>岗位:高级工程师</div>
</div>
</div>
</div>
</div>
<!-- 薪资概览卡片 -->
<div class="bg-white rounded-lg shadow-lg p-6 mb-6">
<div class="grid grid-cols-2 gap-6">
<div>
<div class="text-gray-500 text-sm">税前工资</div>
<div class="text-2xl font-bold text-[#2D5CF6]">¥25,000</div>
</div>
<div>
<div class="text-gray-500 text-sm">税后工资</div>
<div class="text-2xl font-bold text-[#2D5CF6]">¥20,000</div>
</div>
</div>
</div>
<!-- 工资明细表 -->
<div class="bg-white rounded-lg shadow-lg p-6">
<h3 class="text-lg font-medium mb-4">工资明细</h3>
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
项目</th>
<th
class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">
金额</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 text-sm text-gray-900">基本工资</td>
<td class="px-6 py-4 text-sm text-gray-900 text-right">¥15,000</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 text-sm text-gray-900">绩效工资</td>
<td class="px-6 py-4 text-sm text-gray-900 text-right">¥5,000</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 text-sm text-gray-900">岗位津贴</td>
<td class="px-6 py-4 text-sm text-gray-900 text-right">¥2,000</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 text-sm text-gray-900">餐补</td>
<td class="px-6 py-4 text-sm text-gray-900 text-right">¥1,000</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 text-sm text-gray-900">加班费</td>
<td class="px-6 py-4 text-sm text-gray-900 text-right">¥2,000</td>
</tr>
</tbody>
</table>
</div>
</main>
<!-- 页脚 -->
<footer class="bg-gray-800 text-gray-400 mt-12">
<div class="max-w-7xl mx-auto px-4 py-12">
<div class="grid grid-cols-4 gap-8">
<div>
<h3 class="text-white text-sm font-bold mb-4">关于我们</h3>
<ul class="space-y-2 text-xs">
<li><a href="#" class="hover:text-white">公司简介</a></li>
<li><a href="#" class="hover:text-white">企业文化</a></li>
<li><a href="#" class="hover:text-white">发展历程</a></li>
</ul>
</div>
<div>
<h3 class="text-white text-sm font-bold mb-4">帮助中心</h3>
<ul class="space-y-2 text-xs">
<li><a href="#" class="hover:text-white">使用指南</a></li>
<li><a href="#" class="hover:text-white">常见问题</a></li>
<li><a href="#" class="hover:text-white">联系我们</a></li>
</ul>
</div>
<div>
<h3 class="text-white text-sm font-bold mb-4">友情链接</h3>
<ul class="space-y-2 text-xs">
<li><a href="#" class="hover:text-white">人力资源部</a></li>
<li><a href="#" class="hover:text-white">培训中心</a></li>
<li><a href="#" class="hover:text-white">招聘平台</a></li>
</ul>
</div>
<div>
<h3 class="text-white text-sm font-bold mb-4">联系方式</h3>
<ul class="space-y-2 text-xs">
<li>电话400-123-4567</li>
<li>邮箱hr@company.com</li>
<li>地址:北京市朝阳区科技园</li>
</ul>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-700 text-xs text-center">
<p>© 2024 人力资源管理系统 版权所有</p>
</div>
</div>
</footer>
</body>
</html>

@ -1,14 +1,423 @@
import React, {Fragment, PureComponent} from 'react';
import React, { PureComponent } from 'react';
import {
Card,
Button,
Select,
Space,
Pagination,
Modal,
message
} from 'antd';
import { history } from 'umi';
import {
UserAddOutlined,
EditOutlined,
DeleteOutlined,
PlusOutlined
} from '@ant-design/icons';
import styles from './ConfigManage.less';
import StandardTable from '@/components/StandardTable';
import ConfigManageAdd from './form/ConfigManageAdd';
import ConfigManageRenderSimpleForm from "./form/ConfigManageRenderSimpleForm" //表单
const { Option } = Select;
class ConfigManage extends PureComponent {
constructor(props) {
super(props);
this.state = {
searchForm: {},
addModalVisible: false, // 新增弹窗显示状态
addLoading: false, // 新增loading状态
tableData: [
{
key: '1',
id: 1,
configName: '系统名称',
configCode: 'system.name',
configValue: '人力资源管理系统',
updateBy: '张明远',
updateTime: '2023-12-01 14:30:25'
},
{
key: '2',
id: 2,
configName: '登录超时时间',
configCode: 'session.timeout',
configValue: '30分钟',
updateBy: '李思雨',
updateTime: '2023-11-28 09:15:10'
},
{
key: '3',
id: 3,
configName: '默认每页条数',
configCode: 'page.size',
configValue: '20',
updateBy: '王建国',
updateTime: '2023-11-25 16:45:33'
},
{
key: '4',
id: 4,
configName: '系统Logo URL',
configCode: 'system.logo.url',
configValue: '/assets/images/logo.png',
updateBy: '赵晓雯',
updateTime: '2023-11-20 11:20:15'
},
{
key: '5',
id: 5,
configName: '数据备份路径',
configCode: 'backup.data.path',
configValue: '/data/backup/hrms',
updateBy: '陈宇航',
updateTime: '2023-11-15 13:10:45'
},
{
key: '6',
id: 6,
configName: '邮件服务器地址',
configCode: 'mail.server.host',
configValue: 'smtp.company.com',
updateBy: '林志强',
updateTime: '2023-11-10 10:05:20'
},
{
key: '7',
id: 7,
configName: '系统维护时间',
configCode: 'maintenance.schedule',
configValue: '每周日 02:00-04:00',
updateBy: '吴晓峰',
updateTime: '2023-11-05 15:30:18'
},
],
pagination: {
current: 1,
pageSize: 10,
total: 7,
},
selectedRecord: null, // 选中的记录,用于编辑
};
// 默认列配置
this.defaultColumns = [
{
title: '配置名称',
dataIndex: 'configName',
key: 'configName',
width: 200,
align: 'left',
ellipsis: true,
},
{
title: '配置编码',
dataIndex: 'configCode',
key: 'configCode',
width: 180,
align: 'left',
ellipsis: true,
render: (text) => (
<code style={{
backgroundColor: '#f0f0f0',
padding: '2px 6px',
borderRadius: '4px',
fontSize: '12px',
color: '#d4380d'
}}>
{text}
</code>
),
},
{
title: '配置值',
dataIndex: 'configValue',
key: 'configValue',
width: 250,
align: 'left',
ellipsis: true,
},
{
title: '修改人',
dataIndex: 'updateBy',
key: 'updateBy',
width: 120,
align: 'center',
},
{
title: '修改时间',
dataIndex: 'updateTime',
key: 'updateTime',
width: 180,
align: 'center',
},
{
title: '操作',
key: 'action',
width: 200,
align: 'center',
render: (_, record) => (
<Space size="small">
<Button
type="link"
size="small"
icon={<EditOutlined />}
onClick={() => this.handleEdit(record)}
>
{/* 编辑 */}
</Button>
<Button
type="link"
size="small"
danger
icon={<DeleteOutlined />}
onClick={() => this.handleDelete(record)}
>
{/* 删除 */}
</Button>
</Space>
),
},
];
}
// 获取处理后的树形数据
// 搜索处理
handleSearch = (values) => {
console.log('搜索参数:', values);
this.setState({ searchForm: values });
};
// 重置搜索
handleReset = () => {
this.formRef?.resetFields();
this.setState({ searchForm: {} });
};
renderSimpleForm() {
const { prooperlog = {} } = this.props;
const { params = {} } = prooperlog;
const parentMethods = {
handleSearch: this.handleSearch,
handleFormReset: this.handleFormReset,
toggleForm: this.toggleForm,
submitButtons: styles.submitButtons,
params
};
return (
<ConfigManageRenderSimpleForm {...parentMethods} />
);
}
renderAdvancedForm() {
const { prooperlog: { params } } = this.props;
const parentMethods = {
handleSearch: this.handleSearch,
handleFormReset: this.handleFormReset,
toggleForm: this.toggleForm,
params
};
return (
<ConfigManageRenderSimpleForm {...parentMethods} />
);
}
renderForm() {
const { expandForm } = this.state;
return expandForm ? this.renderAdvancedForm() : this.renderSimpleForm();
}
// 分页处理
onPaginationChange = (page, pageSize) => {
this.setState({
pagination: {
...this.state.pagination,
current: page,
pageSize,
}
});
};
// 显示新增弹窗
showAddModal = () => {
this.setState({ addModalVisible: true });
};
// 关闭新增/编辑弹窗
hideAddModal = () => {
this.setState({
addModalVisible: false,
selectedRecord: null // 清空选中记录
});
};
// 新增成功回调
handleAddSuccess = (values) => {
console.log('新增配置项成功:', values);
// 这里可以刷新列表数据
// 模拟添加到表格数据中
const newConfig = {
key: String(Date.now()),
id: this.state.tableData.length + 1,
configName: values.configName,
configCode: values.configCode,
configValue: values.configValue,
updateBy: '当前用户', // 实际项目中从用户信息中获取
updateTime: new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
}).replace(/\//g, '-')
};
this.setState({
tableData: [...this.state.tableData, newConfig],
pagination: {
...this.state.pagination,
total: this.state.pagination.total + 1
}
});
};
// 处理姓名点击事件
handleNameClick = (record) => {
console.log('查看员工绩效详情:', record);
// 可以跳转到绩效详情页面或显示详情模态框
Modal.info({
title: `${record.name} - 绩效详情`,
width: 600,
content: (
<div style={{ marginTop: 16 }}>
<p><strong>员工姓名</strong>{record.name}</p>
<p><strong>性别</strong>{record.gender}</p>
<p><strong>年龄</strong>{record.age}</p>
<p><strong>部门</strong>{record.department}</p>
<p><strong>职位</strong>{record.position}</p>
<p><strong>绩效总分</strong><span style={{
fontWeight: 'bold',
color: record.totalScore >= 90 ? '#52c41a' :
record.totalScore >= 80 ? '#1890ff' :
record.totalScore >= 70 ? '#faad14' : '#ff4d4f'
}}>{record.totalScore}</span></p>
<p><strong>绩效状态</strong>{record.performanceStatus}</p>
</div>
),
okText: '确定'
});
};
// 处理编辑
handleEdit = (record) => {
console.log('编辑配置项:', record);
this.setState({
selectedRecord: record,
addModalVisible: true
});
};
// 处理删除
handleDelete = (record) => {
Modal.confirm({
title: '删除确认',
content: `确定要删除配置项 "${record.configName}" 吗?`,
okText: '确定',
cancelText: '取消',
onOk: () => {
// 实际项目中这里应该调用删除接口
console.log('删除配置项:', record.id);
const newData = this.state.tableData.filter(item => item.id !== record.id);
this.setState({
tableData: newData,
pagination: {
...this.state.pagination,
total: newData.length
}
});
message.success('删除成功');
}
});
};
render() {
const { tableData, pagination, addModalVisible, addLoading } = this.state;
return (
<>
<iframe title="配置管理" className={styles.frameContent} src="/配置管理.html"/>
</>
)
<div className={styles.staffInfoContainer}>
{/* 主体内容 */}
<div className={styles.mainContent}>
<Card className={styles.contentCard}>
{/* 筛选条件 */}
<Card className={styles.searchCard}>
{this.renderForm()}
</Card>
{/* 操作按钮和统计 */}
<div className={styles.actionBar}>
<div className={styles.totalInfo}>
{/* 共 {pagination.total} 条记录 */}
</div>
<Space size="middle">
<Button
type="primary"
icon={<PlusOutlined />}
size="middle"
className={styles.addButton}
onClick={this.showAddModal}
>
新增
</Button>
</Space>
</div>
{/* 数据表格 */}
<Card className={styles.tableCard}>
<StandardTable
columns={this.defaultColumns}
dataSource={tableData}
pagination={false}
size="small"
selectedRows={[]}
/>
{/* 分页 */}
<div className={styles.paginationWrapper}>
<Pagination
current={pagination.current}
total={pagination.total}
pageSize={pagination.pageSize}
showSizeChanger
showQuickJumper
showTotal={(total, range) =>
`显示 ${range[0]}${range[1]} 条,共 ${total} 条记录`
}
onChange={this.onPaginationChange}
onShowSizeChange={this.onPaginationChange}
/>
</div>
</Card>
</Card>
</div>
{/* 新增/编辑配置弹窗 */}
<ConfigManageAdd
visible={addModalVisible}
loading={addLoading}
editData={this.state.selectedRecord}
onCancel={this.hideAddModal}
onSuccess={this.handleAddSuccess}
/>
</div>
);
}
}
export default ConfigManage
export default ConfigManage;

@ -1,10 +1,431 @@
@import '~@/utils/utils.less';
.frameContent {
width: 100%;
.staffInfoContainer {
min-height: 100vh;
height: 100vh;
border: none;
display: block;
margin: 0;
padding: 0;
// background-color: #f5f6fa;
.announcementBar {
background: #e6f7ff;
border: 1px solid #91d5ff;
margin-bottom: 16px;
border-radius: 6px;
overflow: hidden;
.announcement {
display: flex;
align-items: center;
.announcementLabel {
background-color: #fef3c7;
color: #92400e;
border-radius: 4px;
padding: 4px 8px;
font-size: 12px;
font-weight: 500;
margin-right: 12px;
white-space: nowrap;
display: flex;
align-items: center;
.anticon {
margin-right: 4px;
}
}
.scrollContainer {
flex: 1;
overflow: hidden;
white-space: nowrap;
}
.scrollContent {
display: inline-block;
animation: scroll 30s linear infinite;
color: #666;
font-size: 14px;
}
}
}
.mainContent {
// padding: 12px;
.contentCard {
.ant-card-head {
.ant-card-head-title {
font-size: 18px;
font-weight: 600;
color: #333;
}
}
}
.searchCard {
margin-bottom: 16px;
border-radius: 8px;
border: 1px solid #e8e8e8;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
.ant-card-body {
padding: 16px;
}
/* 搜索表单容器样式 */
.searchFormContainer {
.searchForm {
.ant-form-item {
margin-bottom: 16px;
.ant-form-item-label {
font-weight: 500;
color: #333;
label {
color: #333 !important;
font-size: 14px;
}
}
.ant-input,
.ant-select-selector,
.ant-picker {
border-radius: 6px;
border: 1px solid #d9d9d9;
transition: all 0.3s ease;
&:hover {
border-color: #4c7bff;
}
&:focus,
&.ant-select-focused .ant-select-selector,
&.ant-picker-focused {
border-color: #2d5cf6;
box-shadow: 0 0 0 2px rgba(45, 92, 246, 0.2);
}
}
.ant-select-selection-placeholder,
.ant-input::placeholder,
.ant-picker-input input::placeholder {
color: #bfbfbf;
}
}
}
}
/* 搜索按钮样式 */
.searchButton {
background: linear-gradient(135deg, #2d5cf6 0%, #4c7bff 100%);
border: none;
border-radius: 6px;
color: white;
font-weight: 500;
font-size: 14px;
box-shadow: 0 2px 8px rgba(45, 92, 246, 0.3);
transition: all 0.3s ease;
height: 32px;
padding: 0 16px;
&:hover,
&:focus {
background: linear-gradient(135deg, #4c7bff 0%, #6b8fff 100%);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(45, 92, 246, 0.4);
color: white;
}
&:active {
transform: translateY(0);
}
}
/* 重置按钮样式 */
.resetButton {
background: #fff;
border: 1px solid #d9d9d9;
color: #666;
border-radius: 6px;
font-weight: 500;
font-size: 14px;
transition: all 0.3s ease;
height: 32px;
padding: 0 16px;
&:hover,
&:focus {
border-color: #4c7bff;
color: #2d5cf6;
}
.anticon {
color: #ff7875;
}
}
/* 展开按钮样式 */
.expandButton {
color: #2d5cf6;
font-size: 14px;
padding: 0 8px;
height: 32px;
&:hover,
&:focus {
color: #4c7bff;
}
}
}
.actionBar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
.totalInfo {
color: #666;
font-size: 14px;
font-weight: 500;
}
.exportButton {
background: linear-gradient(135deg, #52c41a 0%, #73d13d 100%);
border: none;
color: white;
border-radius: 8px;
font-weight: 500;
font-size: 14px;
box-shadow: 0 4px 12px rgba(82, 196, 26, 0.3);
transition: all 0.3s ease;
// margin-top: -8px;
height: 35px;
padding: 0 16px;
&:hover,
&:focus {
background: linear-gradient(135deg, #73d13d 0%, #95de64 100%);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(82, 196, 26, 0.4);
color: white;
}
&:active {
transform: translateY(0);
}
.anticon {
color: white;
}
}
.addButton {
// background: linear-gradient(135deg, #fa8c16 0%, #ffa940 100%);
// border: none;
// border-radius: 8px;
// font-weight: 600;
// font-size: 14px;
// box-shadow: 0 4px 12px rgba(250, 140, 22, 0.3);
// transition: all 0.3s ease;
// // margin-top: -8px;
// height: 35px;
// padding: 0 16px;
// &:hover,
// &:focus {
// background: linear-gradient(135deg, #ffa940 0%, #ffc069 100%);
// transform: translateY(-2px);
// box-shadow: 0 6px 20px rgba(250, 140, 22, 0.4);
// }
// &:active {
// transform: translateY(0);
// }
}
}
.tableCard {
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
padding-bottom: 10px;
.ant-table-wrapper {
max-height: 600px;
overflow-y: auto;
/* 自定义滚动条样式 */
&::-webkit-scrollbar {
width: 8px;
}
&::-webkit-scrollbar-track {
background: #f5f5f5;
border-radius: 4px;
}
&::-webkit-scrollbar-thumb {
background: #d9d9d9;
border-radius: 4px;
&:hover {
background: #bfbfbf;
}
}
.ant-table-thead>tr>th {
background-color: #fafafa;
font-weight: 600;
color: #333;
border-bottom: 1px solid #e8e8e8;
position: sticky;
top: 0;
z-index: 1;
}
.ant-table-tbody>tr {
&:hover>td {
background-color: #f5f5f5 !important;
}
>td {
border-bottom: 1px solid #f0f0f0;
}
}
}
.paginationWrapper {
margin-top: 20px;
text-align: right;
.ant-pagination {
.ant-pagination-total-text {
color: #666;
}
.ant-pagination-item {
border-radius: 4px;
&.ant-pagination-item-active {
background-color: #2d5cf6;
border-color: #2d5cf6;
}
}
.ant-pagination-prev,
.ant-pagination-next {
border-radius: 4px;
}
}
}
}
}
}
.mainContent {
// padding: 12px;
.contentCard {
border: none !important;
.ant-card-head {
.ant-card-head-title {
font-size: 18px;
font-weight: 600;
color: #333;
}
}
}
.actionBar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
.totalInfo {
color: #666;
font-size: 14px;
}
}
:global {
.ant-card-body {
padding: 12px 24px 0px 24px;
}
}
}
@keyframes scroll {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
// 响应式设计
@media (max-width: 1200px) {
.staffInfoContainer {
.mainContent {
.searchCard {
.ant-row {
.ant-col {
margin-bottom: 16px;
}
}
}
}
}
}
// 自定义主题色
.ant-btn-primary {
background-color: #2d5cf6;
border-color: #2d5cf6;
&:hover,
&:focus {
background-color: #4c7bff;
border-color: #4c7bff;
}
}
.ant-tree .ant-tree-node-selected {
background-color: #e6f7ff !important;
}
.ant-select-focused .ant-select-selector,
.ant-input-affix-wrapper-focused,
.ant-input:focus,
.ant-input-focused {
border-color: #2d5cf6 !important;
box-shadow: 0 0 0 2px rgba(45, 92, 246, 0.2) !important;
}
// 标签样式优化
.ant-tag {
border-radius: 4px;
font-size: 12px;
}
// 按钮组间距调整
.ant-space-item {
.ant-btn+.ant-btn {
margin-left: 8px;
}
}
// 表格链接按钮样式
.ant-btn-link {
padding: 0 4px;
font-size: 12px;
}

@ -0,0 +1,156 @@
import React, { PureComponent } from 'react';
import {
Modal,
Form,
Input,
Row,
Col,
message
} from 'antd';
import {
SettingOutlined,
CodeOutlined
} from '@ant-design/icons';
const { TextArea } = Input;
class ConfigManageAdd extends PureComponent {
constructor(props) {
super(props);
this.formRef = React.createRef();
}
// 组件更新时设置编辑数据
componentDidUpdate(prevProps) {
if (this.props.visible && !prevProps.visible && this.props.editData) {
// 编辑模式,设置表单数据
this.formRef.current?.setFieldsValue({
configName: this.props.editData.configName,
configCode: this.props.editData.configCode,
configValue: this.props.editData.configValue,
});
}
}
// 提交表单
handleSubmit = (values) => {
const { editData } = this.props;
const action = editData ? '编辑' : '新增';
console.log(`${action}配置项:`, values);
// 这里可以调用API接口保存数据
// 模拟保存成功
message.success(`${action}配置项成功!`);
// 重置表单
this.formRef.current?.resetFields();
// 调用父组件的回调函数
if (this.props.onSuccess) {
this.props.onSuccess(values);
}
// 关闭弹窗
this.handleCancel();
};
// 取消操作
handleCancel = () => {
// 重置表单
this.formRef.current?.resetFields();
// 调用父组件的关闭回调
if (this.props.onCancel) {
this.props.onCancel();
}
};
render() {
const { visible, loading = false, editData } = this.props;
const isEdit = !!editData;
return (
<Modal
title={isEdit ? "编辑配置项" : "新增配置项"}
open={visible}
onOk={() => this.formRef.current?.submit()}
onCancel={this.handleCancel}
width={600}
confirmLoading={loading}
destroyOnClose={true}
maskClosable={false}
okText="保存"
cancelText="取消"
>
<Form
ref={this.formRef}
layout="vertical"
onFinish={this.handleSubmit}
>
<Row gutter={16}>
<Col span={24}>
<Form.Item
name="configName"
label="配置名称"
rules={[
{ required: true, message: '请输入配置名称' },
{ min: 2, max: 50, message: '配置名称长度为2-50个字符' }
]}
>
<Input
placeholder="请输入配置名称,如:系统名称"
prefix={<SettingOutlined />}
/>
</Form.Item>
</Col>
</Row>
<Row gutter={16}>
<Col span={24}>
<Form.Item
name="configCode"
label="配置Code"
rules={[
{ required: true, message: '请输入配置Code' },
{
pattern: /^[a-zA-Z][a-zA-Z0-9._-]*$/,
message: '配置Code必须以字母开头只能包含字母、数字、点、下划线和连字符'
},
{ min: 2, max: 100, message: '配置Code长度为2-100个字符' }
]}
>
<Input
placeholder="请输入配置Codesystem.name"
prefix={<CodeOutlined />}
/>
</Form.Item>
</Col>
</Row>
<Row gutter={16}>
<Col span={24}>
<Form.Item
name="configValue"
label="配置值"
rules={[
{ required: true, message: '请输入配置值' },
{ max: 500, message: '配置值不能超过500个字符' }
]}
>
<TextArea
placeholder="请输入配置值"
autoSize={{ minRows: 3, maxRows: 6 }}
showCount
maxLength={500}
/>
</Form.Item>
</Col>
</Row>
</Form>
</Modal>
);
}
}
export default ConfigManageAdd;

@ -0,0 +1,90 @@
import React from 'react';
import { Button, Col, Form, Input, Row, Space } from 'antd';
import { ClearOutlined, SearchOutlined, SettingOutlined, CodeOutlined } from '@ant-design/icons';
import styles from "../ConfigManage.less";
const ConfigManageRenderSimpleForm = (props) => {
const [form] = Form.useForm();
const { submitButtons, handleSearch, handleFormReset, params } = props;
React.useEffect(() => {
form.setFieldsValue({
configName: params?.configName,
configCode: params?.configCode,
});
}, [params]);
const onFinish = values => {
const searchParams = {
...values,
};
handleSearch && handleSearch(searchParams);
};
const myhandleFormReset = () => {
form.resetFields();
handleFormReset && handleFormReset();
};
return (
<div className={styles.searchFormContainer}>
<Form
form={form}
onFinish={onFinish}
layout="vertical"
className={styles.searchForm}
>
<Row gutter={16}>
<Col span={6}>
<Form.Item
name="configName"
label="配置项名称"
>
<Input
placeholder="请输入配置项名称"
allowClear
prefix={<SettingOutlined />}
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="configCode"
label="配置项Code"
>
<Input
placeholder="请输入配置项Code"
allowClear
prefix={<CodeOutlined />}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label=" " colon={false}>
<Space size="middle">
<Button
type="primary"
htmlType="submit"
icon={<SearchOutlined />}
className={styles.searchButton}
>
查询
</Button>
<Button
onClick={myhandleFormReset}
icon={<ClearOutlined />}
className={styles.resetButton}
>
重置
</Button>
</Space>
</Form.Item>
</Col>
</Row>
</Form>
</div>
);
};
export default ConfigManageRenderSimpleForm;

@ -1,14 +1,770 @@
import React, {Fragment, PureComponent} from 'react';
/**
* 数据字典管理页面
* 功能管理系统中的元数据域和属性配置
* 包含元数据域树形结构属性列表新增属性等功能
*/
import React, { PureComponent } from 'react';
import {
Card,
Tree,
Button,
Select,
Space,
Row,
Col,
Pagination,
Modal,
message,
Input
} from 'antd';
import { history } from 'umi';
import {
ExpandOutlined,
UserOutlined,
TeamOutlined,
ApartmentOutlined,
SyncOutlined,
SettingOutlined,
UserAddOutlined,
EditOutlined,
DeleteOutlined,
SearchOutlined,
FolderOutlined,
FileTextOutlined,
IdcardOutlined,
PhoneOutlined,
MailOutlined,
CalendarOutlined,
HomeOutlined,
PlusOutlined,
DownloadOutlined
} from '@ant-design/icons';
import styles from './DataDict.less';
import StandardTable from '@/components/StandardTable';
import DataDictAdd from './form/DataDictAdd';
const { Option } = Select;
/**
* 数据字典管理组件
* 左侧显示元数据域树形结构右侧显示选中域的属性列表
*/
class DataDict extends PureComponent {
constructor(props) {
super(props);
this.state = {
searchForm: {},
selectedKeys: ['admin_position'],
expandedKeys: ['basic_info', 'admin_position'],
searchValue: '', // 搜索关键词
filteredTreeData: [], // 过滤后的树数据
addModalVisible: false, // 新增弹窗显示状态
addLoading: false, // 新增loading状态
organizationData: [
{
title: '基础信息',
key: 'basic_info',
children: [
{ title: '员工编号', key: 'employee_id', isLeaf: true },
{ title: '姓名', key: 'name', isLeaf: true },
{ title: '性别', key: 'gender', isLeaf: true },
{ title: '出生日期', key: 'birth_date', isLeaf: true }
],
},
{
title: '技术职务',
key: 'tech_position',
children: [
{ title: '技术等级', key: 'tech_level', isLeaf: true },
{ title: '专业技能', key: 'tech_skills', isLeaf: true },
{ title: '认证资格', key: 'certifications', isLeaf: true }
],
},
{
title: '行政职务',
key: 'admin_position',
children: [
{ title: '行政级别', key: 'admin_level', isLeaf: true },
{ title: '级别待遇', key: 'level_benefit', isLeaf: true },
{ title: '任职时间', key: 'appointment_date', isLeaf: true },
{ title: '所属部门', key: 'department', isLeaf: true },
{ title: '职务名称', key: 'job_title', isLeaf: true },
{ title: '是否领导职务', key: 'is_leader', isLeaf: true }
],
},
{
title: '联系方式',
key: 'contact_info',
children: [
{ title: '手机号码', key: 'mobile', isLeaf: true },
{ title: '办公电话', key: 'office_phone', isLeaf: true },
{ title: '邮箱地址', key: 'email', isLeaf: true },
{ title: '通讯地址', key: 'address', isLeaf: true }
],
},
{
title: '其他信息',
key: 'other_info',
children: [
{ title: '入职时间', key: 'hire_date', isLeaf: true },
{ title: '工作状态', key: 'work_status', isLeaf: true },
{ title: '合同类型', key: 'contract_type', isLeaf: true },
{ title: '备注信息', key: 'remarks', isLeaf: true }
],
},
],
tableData: [
{
key: '1',
id: 1,
fieldName: 'admin_level',
displayName: '行政级别',
dataType: '列表',
required: true,
defaultValue: '-'
},
{
key: '2',
id: 2,
fieldName: 'level_benefit',
displayName: '级别待遇',
dataType: '列表',
required: true,
defaultValue: '-'
},
{
key: '3',
id: 3,
fieldName: 'appointment_date',
displayName: '任职时间',
dataType: '日期',
required: true,
defaultValue: '系统当前日期'
},
{
key: '4',
id: 4,
fieldName: 'department',
displayName: '所属部门',
dataType: '列表',
required: true,
defaultValue: '-'
},
{
key: '5',
id: 5,
fieldName: 'job_title',
displayName: '职务名称',
dataType: '文本',
required: true,
defaultValue: '-'
},
{
key: '6',
id: 6,
fieldName: 'is_leader',
displayName: '是否领导职务',
dataType: '布尔',
required: false,
defaultValue: '否'
},
],
pagination: {
current: 1,
pageSize: 10,
total: 6,
},
selectedRecord: null, // 选中的记录,用于编辑
};
// 默认列配置 - 数据字典属性管理
this.defaultColumns = [
{
title: '属性名称',
dataIndex: 'fieldName',
key: 'fieldName',
width: 150,
align: 'left',
render: (text) => (
<code style={{
backgroundColor: '#f0f0f0',
padding: '2px 6px',
borderRadius: '4px',
fontSize: '12px',
color: '#d4380d'
}}>
{text}
</code>
),
},
{
title: '显示名称',
dataIndex: 'displayName',
key: 'displayName',
width: 120,
align: 'left',
},
{
title: '数据类型',
dataIndex: 'dataType',
key: 'dataType',
width: 100,
align: 'center',
render: (type) => {
const typeConfig = {
'文本': { color: '#722ed1', bgColor: '#f9f0ff', borderColor: '#d3adf7' },
'列表': { color: '#1890ff', bgColor: '#e6f7ff', borderColor: '#91d5ff' },
'日期': { color: '#722ed1', bgColor: '#f9f0ff', borderColor: '#d3adf7' },
'布尔': { color: '#eb2f96', bgColor: '#fff0f6', borderColor: '#ffadd2' },
'数字': { color: '#52c41a', bgColor: '#f6ffed', borderColor: '#b7eb8f' }
};
const config = typeConfig[type] || typeConfig['文本'];
return (
<span style={{
color: config.color,
backgroundColor: config.bgColor,
border: `1px solid ${config.borderColor}`,
borderRadius: '12px',
padding: '2px 8px',
fontSize: '12px',
fontWeight: '500'
}}>
{type}
</span>
);
}
},
{
title: '是否必填',
dataIndex: 'required',
key: 'required',
width: 90,
align: 'center',
render: (required) => (
<span style={{
color: required ? '#52c41a' : '#666',
backgroundColor: required ? '#f6ffed' : '#f5f5f5',
border: `1px solid ${required ? '#b7eb8f' : '#d9d9d9'}`,
borderRadius: '12px',
padding: '2px 8px',
fontSize: '12px',
fontWeight: '500'
}}>
{required ? '是' : '否'}
</span>
)
},
{
title: '默认值',
dataIndex: 'defaultValue',
key: 'defaultValue',
width: 120,
align: 'left',
render: (value) => value || '-'
},
{
title: '操作',
key: 'action',
width: 120,
align: 'center',
render: (_, record) => (
<Space size="small">
<Button
type="link"
size="small"
icon={<EditOutlined />}
onClick={() => this.handleEdit(record)}
>
{/* 编辑 */}
</Button>
<Button
type="link"
size="small"
danger
icon={<DeleteOutlined />}
onClick={() => this.handleDelete(record)}
>
{/* 删除 */}
</Button>
</Space>
),
},
];
}
// 获取处理后的树形数据
getTreeData = () => {
const { organizationData, filteredTreeData, searchValue } = this.state;
// 如果有搜索条件,使用过滤后的数据,否则使用原始数据
const dataSource = searchValue ? filteredTreeData : organizationData;
const processNode = (node) => ({
key: node.key,
title: (
<span className={styles['tree-node-title']}>
{this.getNodeIcon(node.title)}
<span className={styles['node-title']}>{node.title}</span>
{node.isLeaf ? null : <span className={styles['node-count']}>({node.children ? node.children.length : 0})</span>}
</span>
),
children: node.children ? node.children.map(processNode) : undefined
});
return dataSource.map(processNode);
};
// 获取节点图标
getNodeIcon = (title) => {
// 主分类图标 - 使用文件夹风格
if (title.includes('基础信息')) return <FolderOutlined style={{ color: '#52c41a', fontSize: '16px' }} />;
if (title.includes('技术职务')) return <FolderOutlined style={{ color: '#fa8c16', fontSize: '16px' }} />;
if (title.includes('行政职务')) return <FolderOutlined style={{ color: '#eb2f96', fontSize: '16px' }} />;
if (title.includes('联系方式')) return <FolderOutlined style={{ color: '#722ed1', fontSize: '16px' }} />;
if (title.includes('其他信息')) return <FolderOutlined style={{ color: '#13c2c2', fontSize: '16px' }} />;
// 基础信息属性图标
if (title.includes('员工编号') || title.includes('编号')) return <IdcardOutlined style={{ color: '#1890ff', fontSize: '14px' }} />;
if (title.includes('姓名') || title.includes('名称')) return <UserOutlined style={{ color: '#52c41a', fontSize: '14px' }} />;
if (title.includes('性别')) return <TeamOutlined style={{ color: '#fa8c16', fontSize: '14px' }} />;
if (title.includes('出生')) return <CalendarOutlined style={{ color: '#eb2f96', fontSize: '14px' }} />;
// 职务相关图标
if (title.includes('等级') || title.includes('级别')) return <SettingOutlined style={{ color: '#722ed1', fontSize: '14px' }} />;
if (title.includes('技术') && (title.includes('职务') || title.includes('等级'))) return <SettingOutlined style={{ color: '#fa8c16', fontSize: '14px' }} />;
if (title.includes('行政') || title.includes('管理') || title.includes('领导')) return <ApartmentOutlined style={{ color: '#eb2f96', fontSize: '14px' }} />;
if (title.includes('部门')) return <TeamOutlined style={{ color: '#13c2c2', fontSize: '14px' }} />;
if (title.includes('职务') || title.includes('职位')) return <UserOutlined style={{ color: '#1890ff', fontSize: '14px' }} />;
// 时间相关图标
if (title.includes('时间') || title.includes('日期')) return <CalendarOutlined style={{ color: '#722ed1', fontSize: '14px' }} />;
if (title.includes('委任') || title.includes('任职')) return <CalendarOutlined style={{ color: '#fa8c16', fontSize: '14px' }} />;
// 联系方式图标
if (title.includes('电话') || title.includes('手机')) return <PhoneOutlined style={{ color: '#1890ff', fontSize: '14px' }} />;
if (title.includes('邮箱') || title.includes('邮件')) return <MailOutlined style={{ color: '#52c41a', fontSize: '14px' }} />;
if (title.includes('地址') || title.includes('住址')) return <HomeOutlined style={{ color: '#fa8c16', fontSize: '14px' }} />;
// 其他信息图标
if (title.includes('状态') || title.includes('类型')) return <FileTextOutlined style={{ color: '#13c2c2', fontSize: '14px' }} />;
if (title.includes('备注') || title.includes('说明')) return <FileTextOutlined style={{ color: '#999', fontSize: '14px' }} />;
if (title.includes('津贴') || title.includes('待遇')) return <SettingOutlined style={{ color: '#eb2f96', fontSize: '14px' }} />;
// 默认图标
return <FileTextOutlined style={{ color: '#666', fontSize: '14px' }} />;
};
// 搜索处理
handleSearch = (values) => {
console.log('搜索参数:', values);
this.setState({ searchForm: values });
};
// 重置搜索
handleReset = () => {
this.formRef?.resetFields();
this.setState({ searchForm: {} });
};
// 树节点选择
onTreeSelect = (selectedKeys, info) => {
console.log('选中节点:', selectedKeys, info);
this.setState({ selectedKeys });
};
// 树节点展开
onTreeExpand = (expandedKeys) => {
this.setState({ expandedKeys });
};
// 刷新树数据
handleTreeRefresh = () => {
// console.log('刷新组织架构');
// 这里可以添加刷新树数据的逻辑
};
// 展开/收缩所有节点
handleTreeToggle = () => {
const { expandedKeys, organizationData } = this.state;
if (expandedKeys.length > 0) {
// 收缩所有节点
this.setState({ expandedKeys: [] });
} else {
// 展开所有节点
const getAllKeys = (nodes) => {
let keys = [];
nodes.forEach(node => {
keys.push(node.key);
if (node.children) {
keys = keys.concat(getAllKeys(node.children));
}
});
return keys;
};
this.setState({ expandedKeys: getAllKeys(organizationData) });
}
};
// 搜索树节点
onTreeSearch = (value) => {
const { organizationData } = this.state;
this.setState({ searchValue: value });
if (!value) {
// 搜索为空时,显示所有数据并恢复默认展开状态
this.setState({
filteredTreeData: [],
expandedKeys: ['basic_info', 'admin_position']
});
return;
}
// 过滤树数据
const filterTree = (data) => {
return data.map(item => {
const match = item.title.toLowerCase().includes(value.toLowerCase());
let children = [];
if (item.children) {
children = filterTree(item.children).filter(child => child);
}
if (match || children.length > 0) {
return {
...item,
children: children.length > 0 ? children : undefined
};
}
return null;
}).filter(item => item);
};
const filtered = filterTree(organizationData);
// 搜索时自动展开所有匹配的节点
const getAllKeys = (data) => {
let keys = [];
data.forEach(item => {
keys.push(item.key);
if (item.children) {
keys = keys.concat(getAllKeys(item.children));
}
});
return keys;
};
this.setState({
filteredTreeData: filtered,
expandedKeys: getAllKeys(filtered)
});
};
renderForm() {
// 数据字典页面暂不需要搜索表单
return null;
}
// 分页处理
onPaginationChange = (page, pageSize) => {
this.setState({
pagination: {
...this.state.pagination,
current: page,
pageSize,
}
});
};
// 显示新增弹窗
showAddModal = () => {
this.setState({ addModalVisible: true });
};
// 关闭新增/编辑弹窗
hideAddModal = () => {
this.setState({
addModalVisible: false,
selectedRecord: null // 清空选中记录
});
};
// 新增成功回调
handleAddSuccess = (values) => {
console.log('新增成功:', values);
// 这里可以刷新列表数据
// 模拟添加到表格数据中
const newStaff = {
key: String(Date.now()),
id: this.state.tableData.length + 1,
name: values.name,
phone: values.age, // 年龄
idCard: values.department, // 部门
department: values.position, // 岗位
position: values.workType, // 工作性质
status: values.phone, // 电话
entryDate: new Date().toISOString().split('T')[0]
};
this.setState({
tableData: [...this.state.tableData, newStaff],
pagination: {
...this.state.pagination,
total: this.state.pagination.total + 1
}
});
};
// 处理姓名点击事件
handleNameClick = (record) => {
console.log('查看员工绩效详情:', record);
// 可以跳转到绩效详情页面或显示详情模态框
Modal.info({
title: `${record.name} - 绩效详情`,
width: 600,
content: (
<div style={{ marginTop: 16 }}>
<p><strong>员工姓名</strong>{record.name}</p>
<p><strong>性别</strong>{record.gender}</p>
<p><strong>年龄</strong>{record.age}</p>
<p><strong>部门</strong>{record.department}</p>
<p><strong>职位</strong>{record.position}</p>
<p><strong>绩效总分</strong><span style={{
fontWeight: 'bold',
color: record.totalScore >= 90 ? '#52c41a' :
record.totalScore >= 80 ? '#1890ff' :
record.totalScore >= 70 ? '#faad14' : '#ff4d4f'
}}>{record.totalScore}</span></p>
<p><strong>绩效状态</strong>{record.performanceStatus}</p>
</div>
),
okText: '确定'
});
};
// 处理编辑
handleEdit = (record) => {
console.log('编辑员工绩效:', record);
this.setState({
selectedRecord: record,
showPerformanceAdd: true
});
};
// 处理删除
handleDelete = (record) => {
Modal.confirm({
title: '删除确认',
content: `确定要删除员工 "${record.name}" 的绩效记录吗?`,
okText: '确定',
cancelText: '取消',
onOk: () => {
// 实际项目中这里应该调用删除接口
console.log('删除绩效记录:', record.id);
const newData = this.state.tableData.filter(item => item.id !== record.id);
this.setState({
tableData: newData,
pagination: {
...this.state.pagination,
total: newData.length
}
});
message.success('删除成功');
}
});
};
// 新增元数据域
handleAddMetadataDomain = () => {
console.log('新增元数据域');
// 这里可以打开新增元数据域的弹窗
message.info('新增元数据域功能开发中...');
};
// 导出配置
handleExportConfig = () => {
console.log('导出配置');
// 这里可以调用导出配置的接口
message.info('导出配置功能开发中...');
};
render() {
const { tableData, pagination, expandedKeys, addModalVisible, addLoading } = this.state;
return (
<>
<iframe title="数据字典" className={styles.frameContent} src="/数据字典.html"/>
</>
)
<div className={styles.dataDictContainer}>
{/* 页面标题区域 */}
<div style={{
display: 'flex',
justifyContent: 'flex-end',
alignItems: 'center',
// marginBottom: '24px',
padding: '12px 24px',
// borderBottom: '1px solid #f0f0f0'
}}>
<Space size="middle">
<Button
type="primary"
icon={<PlusOutlined />}
onClick={this.handleAddMetadataDomain}
style={{
backgroundColor: '#2D5CF6',
borderColor: '#2D5CF6',
borderRadius: '4px'
}}
>
新增元数据域
</Button>
<Button
icon={<DownloadOutlined />}
onClick={this.handleExportConfig}
style={{
borderColor: '#d9d9d9',
borderRadius: '4px'
}}
>
导出配置
</Button>
</Space>
</div>
{/* 主体内容 */}
<div className={styles.mainContent}>
<Card className={styles.contentCard}>
<Row gutter={24}>
{/* 左侧元数据域树 */}
<Col span={5}>
<Card
title={
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<ApartmentOutlined style={{ marginRight: 8, color: '#1890ff' }} />
<span>元数据域</span>
</div>
<Space>
<Button
type="text"
icon={<SyncOutlined />}
size="small"
style={{ color: '#1890ff' }}
onClick={this.handleTreeRefresh}
title="刷新"
/>
<Button
type="text"
icon={<ExpandOutlined />}
size="small"
style={{ color: '#1890ff' }}
onClick={this.handleTreeToggle}
title={expandedKeys.length > 0 ? "收缩全部" : "展开全部"}
/>
</Space>
</div>
}
className={styles.treeCard}
>
{/* 搜索框 */}
<div className={styles['tree-search']}>
<Input
placeholder="搜索元数据域..."
prefix={<SearchOutlined />}
value={this.state.searchValue}
onChange={(e) => this.onTreeSearch(e.target.value)}
allowClear
size="middle"
/>
</div>
<div className={styles.treeContainer}>
{this.state.searchValue && this.getTreeData().length === 0 ? (
<div style={{
textAlign: 'center',
padding: '40px 20px',
color: '#999',
fontSize: '14px'
}}>
<SearchOutlined style={{ fontSize: '24px', marginBottom: '8px', display: 'block' }} />
未找到匹配的元数据域
<div style={{ fontSize: '12px', marginTop: '4px' }}>
尝试使用其他关键词搜索
</div>
</div>
) : (
<Tree
showIcon
expandedKeys={expandedKeys}
onSelect={this.onTreeSelect}
onExpand={this.onTreeExpand}
treeData={this.getTreeData()}
className={styles.orgTree}
/>
)}
</div>
</Card>
</Col>
{/* 右侧属性信息区 */}
<Col span={19}>
{/* 属性表格 */}
<Card
className={styles.tableCard}
title={
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<span>行政职务 - 属性配置</span>
<Button
type="primary"
size="middle"
icon={<PlusOutlined />}
onClick={this.showAddModal}
>
新增属性
</Button>
</div>
}
>
<StandardTable
columns={this.defaultColumns}
dataSource={tableData}
pagination={false}
// scroll={{ x: 1000,y: 600 }}
size="small"
selectedRows={[]}
/>
{/* 分页 */}
<div className={styles.paginationWrapper}>
<Pagination
current={pagination.current}
total={pagination.total}
pageSize={pagination.pageSize}
showSizeChanger
showQuickJumper
showTotal={(total, range) =>
`显示 ${range[0]}${range[1]} 条,共 ${total} 条记录`
}
onChange={this.onPaginationChange}
onShowSizeChange={this.onPaginationChange}
/>
</div>
</Card>
</Col>
</Row>
</Card>
</div>
{/* 新增/编辑绩效弹窗 */}
<DataDictAdd
visible={addModalVisible}
loading={addLoading}
editData={this.state.selectedRecord}
onCancel={this.hideAddModal}
onSuccess={this.handleAddSuccess}
/>
</div>
);
}
}
export default DataDict
export default DataDict;

@ -1,10 +1,618 @@
@import '~@/utils/utils.less';
.frameContent {
width: 100%;
.dataDictContainer,
.staffInfoContainer {
min-height: 100vh;
height: 100vh;
border: none;
display: block;
margin: 0;
padding: 0;
// background-color: #f5f6fa;
.announcementBar {
background: #e6f7ff;
border: 1px solid #91d5ff;
margin-bottom: 16px;
border-radius: 6px;
overflow: hidden;
.announcement {
display: flex;
align-items: center;
.announcementLabel {
background-color: #fef3c7;
color: #92400e;
border-radius: 4px;
padding: 4px 8px;
font-size: 12px;
font-weight: 500;
margin-right: 12px;
white-space: nowrap;
display: flex;
align-items: center;
.anticon {
margin-right: 4px;
}
}
.scrollContainer {
flex: 1;
overflow: hidden;
white-space: nowrap;
}
.scrollContent {
display: inline-block;
animation: scroll 30s linear infinite;
color: #666;
font-size: 14px;
}
}
}
.mainContent {
// padding: 12px;
.contentCard {
.ant-card-head {
.ant-card-head-title {
font-size: 18px;
font-weight: 600;
color: #333;
}
}
}
.treeCard {
height: 600px;
border: 1px solid #e8e8e8;
border-radius: 8px;
/* 搜索框样式 */
.tree-search {
margin-bottom: 16px;
.ant-input-affix-wrapper {
border-radius: 8px;
border: 1px solid #d9d9d9;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.02);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
&:hover {
border-color: #40a9ff;
box-shadow: 0 2px 8px rgba(24, 144, 255, 0.1);
}
&:focus-within {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.ant-input {
border: none;
box-shadow: none;
font-size: 13px;
&::placeholder {
color: #bfbfbf;
font-style: italic;
}
}
.ant-input-prefix {
color: #bfbfbf;
margin-right: 8px;
}
}
}
.treeHeader {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 14px;
font-weight: 500;
}
.treeContainer {
height: 480px; /* 减少高度为搜索框留空间 */
overflow-y: auto;
/* 自定义滚动条样式 */
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: #d9d9d9;
border-radius: 3px;
&:hover {
background: #bfbfbf;
}
}
.orgTree {
.ant-tree-treenode {
padding: 2px 0;
.ant-tree-node-content-wrapper {
border-radius: 6px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
padding: 6px 10px;
margin: 1px 0;
&:hover {
background: linear-gradient(135deg, #f0f9ff 0%, #e6f7ff 100%);
transform: translateX(3px);
box-shadow: 0 2px 8px rgba(24, 144, 255, 0.15);
}
&.ant-tree-node-selected {
background: linear-gradient(135deg, #e6f7ff 0%, #bae7ff 100%) !important;
box-shadow: 0 3px 12px rgba(24, 144, 255, 0.25);
border-left: 3px solid #1890ff;
}
}
.ant-tree-iconEle {
margin-right: 10px;
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
}
.ant-tree-title {
font-size: 14px;
font-weight: 500;
}
/* 展开/收起图标样式 */
.ant-tree-switcher {
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
.ant-tree-switcher-icon {
color: #8c8c8c;
font-size: 12px;
transition: all 0.3s ease;
&:hover {
color: #1890ff;
}
}
}
}
}
}
}
/* Tree节点标题样式 */
.tree-node-title {
display: flex;
align-items: center;
width: 100%;
transition: all 0.3s ease;
.anticon {
font-size: 16px;
margin-right: 8px;
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 6px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: rgba(24, 144, 255, 0.06);
&:hover {
background: rgba(24, 144, 255, 0.12);
transform: scale(1.08);
box-shadow: 0 2px 8px rgba(24, 144, 255, 0.15);
}
}
.node-title {
flex: 1;
font-size: 14px;
color: #333;
font-weight: 500;
transition: color 0.3s ease;
}
.node-count {
color: #999;
font-size: 11px;
margin-left: auto;
background: #f5f5f5;
padding: 2px 8px;
border-radius: 10px;
min-width: 20px;
text-align: center;
font-weight: 500;
transition: all 0.3s ease;
&:hover {
background: #e6f7ff;
color: #1890ff;
}
}
}
.searchCard {
margin-bottom: 16px;
border-radius: 8px;
border: 1px solid #e8e8e8;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
.ant-card-body {
padding: 16px;
}
/* 搜索表单容器样式 */
.searchFormContainer {
.searchForm {
.ant-form-item {
margin-bottom: 16px;
.ant-form-item-label {
font-weight: 500;
color: #333;
label {
color: #333 !important;
font-size: 14px;
}
}
.ant-input,
.ant-select-selector,
.ant-picker {
border-radius: 6px;
border: 1px solid #d9d9d9;
transition: all 0.3s ease;
&:hover {
border-color: #4c7bff;
}
&:focus,
&.ant-select-focused .ant-select-selector,
&.ant-picker-focused {
border-color: #2d5cf6;
box-shadow: 0 0 0 2px rgba(45, 92, 246, 0.2);
}
}
.ant-select-selection-placeholder,
.ant-input::placeholder,
.ant-picker-input input::placeholder {
color: #bfbfbf;
}
}
}
}
/* 搜索按钮样式 */
.searchButton {
background: linear-gradient(135deg, #2d5cf6 0%, #4c7bff 100%);
border: none;
border-radius: 6px;
color: white;
font-weight: 500;
font-size: 14px;
box-shadow: 0 2px 8px rgba(45, 92, 246, 0.3);
transition: all 0.3s ease;
height: 32px;
padding: 0 16px;
&:hover,
&:focus {
background: linear-gradient(135deg, #4c7bff 0%, #6b8fff 100%);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(45, 92, 246, 0.4);
color: white;
}
&:active {
transform: translateY(0);
}
}
/* 重置按钮样式 */
.resetButton {
background: #fff;
border: 1px solid #d9d9d9;
color: #666;
border-radius: 6px;
font-weight: 500;
font-size: 14px;
transition: all 0.3s ease;
height: 32px;
padding: 0 16px;
&:hover,
&:focus {
border-color: #4c7bff;
color: #2d5cf6;
}
.anticon {
color: #ff7875;
}
}
/* 展开按钮样式 */
.expandButton {
color: #2d5cf6;
font-size: 14px;
padding: 0 8px;
height: 32px;
&:hover,
&:focus {
color: #4c7bff;
}
}
}
.actionBar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
.totalInfo {
color: #666;
font-size: 14px;
font-weight: 500;
}
.exportButton {
background: linear-gradient(135deg, #52c41a 0%, #73d13d 100%);
border: none;
color: white;
border-radius: 8px;
font-weight: 500;
font-size: 14px;
box-shadow: 0 4px 12px rgba(82, 196, 26, 0.3);
transition: all 0.3s ease;
// margin-top: -8px;
height: 35px;
padding: 0 16px;
&:hover,
&:focus {
background: linear-gradient(135deg, #73d13d 0%, #95de64 100%);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(82, 196, 26, 0.4);
color: white;
}
&:active {
transform: translateY(0);
}
.anticon {
color: white;
}
}
.addButton {
background: linear-gradient(135deg, #fa8c16 0%, #ffa940 100%);
border: none;
border-radius: 8px;
font-weight: 600;
font-size: 14px;
box-shadow: 0 4px 12px rgba(250, 140, 22, 0.3);
transition: all 0.3s ease;
// margin-top: -8px;
height: 35px;
padding: 0 16px;
&:hover,
&:focus {
background: linear-gradient(135deg, #ffa940 0%, #ffc069 100%);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(250, 140, 22, 0.4);
}
&:active {
transform: translateY(0);
}
}
}
.tableCard {
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
padding-bottom: 10px;
.ant-table-wrapper {
max-height: 600px;
overflow-y: auto;
/* 自定义滚动条样式 */
&::-webkit-scrollbar {
width: 8px;
}
&::-webkit-scrollbar-track {
background: #f5f5f5;
border-radius: 4px;
}
&::-webkit-scrollbar-thumb {
background: #d9d9d9;
border-radius: 4px;
&:hover {
background: #bfbfbf;
}
}
.ant-table-thead>tr>th {
background-color: #fafafa;
font-weight: 600;
color: #333;
border-bottom: 1px solid #e8e8e8;
position: sticky;
top: 0;
z-index: 1;
}
.ant-table-tbody>tr {
&:hover>td {
background-color: #f5f5f5 !important;
}
>td {
border-bottom: 1px solid #f0f0f0;
}
}
}
.paginationWrapper {
margin-top: 20px;
text-align: right;
.ant-pagination {
.ant-pagination-total-text {
color: #666;
}
.ant-pagination-item {
border-radius: 4px;
&.ant-pagination-item-active {
background-color: #2d5cf6;
border-color: #2d5cf6;
}
}
.ant-pagination-prev,
.ant-pagination-next {
border-radius: 4px;
}
}
}
}
}
}
.mainContent {
// padding: 12px;
.contentCard {
border: none !important;
.ant-card-head {
.ant-card-head-title {
font-size: 18px;
font-weight: 600;
color: #333;
}
}
}
.actionBar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
.totalInfo {
color: #666;
font-size: 14px;
}
}
:global {
.ant-card-body {
padding: 0 24px;
}
}
}
@keyframes scroll {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
// 响应式设计
@media (max-width: 1200px) {
.staffInfoContainer {
.mainContent {
.searchCard {
.ant-row {
.ant-col {
margin-bottom: 16px;
}
}
}
}
}
}
// 自定义主题色
.ant-btn-primary {
background-color: #2d5cf6;
border-color: #2d5cf6;
&:hover,
&:focus {
background-color: #4c7bff;
border-color: #4c7bff;
}
}
.ant-tree .ant-tree-node-selected {
background-color: #e6f7ff !important;
}
.ant-select-focused .ant-select-selector,
.ant-input-affix-wrapper-focused,
.ant-input:focus,
.ant-input-focused {
border-color: #2d5cf6 !important;
box-shadow: 0 0 0 2px rgba(45, 92, 246, 0.2) !important;
}
// 标签样式优化
.ant-tag {
border-radius: 4px;
font-size: 12px;
}
// 按钮组间距调整
.ant-space-item {
.ant-btn+.ant-btn {
margin-left: 8px;
}
}
// 表格链接按钮样式
.ant-btn-link {
padding: 0 4px;
font-size: 12px;
}

@ -0,0 +1,197 @@
import React, { PureComponent } from 'react';
import {
Modal,
Form,
Input,
Select,
InputNumber,
Row,
Col,
message
} from 'antd';
import {
UserOutlined,
PhoneOutlined,
TeamOutlined,
ApartmentOutlined
} from '@ant-design/icons';
const { Option } = Select;
class PerformanceAdd extends PureComponent {
constructor(props) {
super(props);
this.formRef = React.createRef();
}
// 提交表单
handleSubmit = (values) => {
console.log('新增人员信息:', values);
// 这里可以调用API接口保存数据
// 模拟保存成功
message.success('新增人员成功!');
// 重置表单
this.formRef.current?.resetFields();
// 调用父组件的回调函数
if (this.props.onSuccess) {
this.props.onSuccess(values);
}
// 关闭弹窗
this.handleCancel();
};
// 取消操作
handleCancel = () => {
// 重置表单
this.formRef.current?.resetFields();
// 调用父组件的关闭回调
if (this.props.onCancel) {
this.props.onCancel();
}
};
render() {
const { visible, loading = false } = this.props;
return (
<Modal
title="新增人员"
open={visible}
onOk={() => this.formRef.current?.submit()}
onCancel={this.handleCancel}
width={600}
confirmLoading={loading}
destroyOnClose={true}
maskClosable={false}
>
<Form
ref={this.formRef}
layout="vertical"
onFinish={this.handleSubmit}
initialValues={{
workType: '全职'
}}
>
<Row gutter={16}>
<Col span={12}>
<Form.Item
name="name"
label="姓名"
rules={[
{ required: true, message: '请输入姓名' },
{ min: 2, max: 10, message: '姓名长度为2-10个字符' }
]}
>
<Input
placeholder="请输入姓名"
prefix={<UserOutlined />}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
name="age"
label="年龄"
rules={[
{ required: true, message: '请输入年龄' }
]}
>
<InputNumber
placeholder="请输入年龄"
min={18}
max={65}
style={{ width: '100%' }}
/>
</Form.Item>
</Col>
</Row>
<Row gutter={16}>
<Col span={12}>
<Form.Item
name="department"
label="部门"
rules={[
{ required: true, message: '请选择部门' }
]}
>
<Select
placeholder="请选择部门"
suffixIcon={<ApartmentOutlined />}
>
<Option value="技术部">技术部</Option>
<Option value="产品部">产品部</Option>
<Option value="运营部">运营部</Option>
<Option value="财务部">财务部</Option>
<Option value="人事部">人事部</Option>
</Select>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
name="position"
label="岗位"
rules={[
{ required: true, message: '请选择岗位' }
]}
>
<Select
placeholder="请选择岗位"
suffixIcon={<TeamOutlined />}
>
<Option value="高级工程师">高级工程师</Option>
<Option value="产品经理">产品经理</Option>
<Option value="运营专员">运营专员</Option>
<Option value="会计">会计</Option>
<Option value="HR专员">HR专员</Option>
</Select>
</Form.Item>
</Col>
</Row>
<Row gutter={16}>
<Col span={12}>
<Form.Item
name="workType"
label="工作性质"
rules={[
{ required: true, message: '请选择工作性质' }
]}
>
<Select placeholder="请选择工作性质">
<Option value="全职">全职</Option>
{/* <Option value="兼职">兼职</Option> */}
<Option value="实习">实习</Option>
<Option value="外包">外包</Option>
</Select>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
name="phone"
label="电话"
rules={[
{ required: true, message: '请输入电话号码' },
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码' }
]}
>
<Input
placeholder="请输入电话号码"
prefix={<PhoneOutlined />}
maxLength={11}
/>
</Form.Item>
</Col>
</Row>
</Form>
</Modal>
);
}
}
export default PerformanceAdd;
Loading…
Cancel
Save