main
yupeng 2 months ago
commit 32d0ffa8bc

@ -0,0 +1,2 @@
PORT=8888
COMPRESS=none

18
.gitignore vendored

@ -0,0 +1,18 @@
/node_modules
/.env.local
/.umirc.local.ts
/config/config.local.ts
/src/.umi
/src/.umi-production
/src/.umi-test
/dist
.idea
.vscode
yarn.lock
package-lock.json
.DS_Store
**/.DS_Store
.DS_Store?

@ -0,0 +1,2 @@
registry=https://registry.npmmirror.com/
package-lock=false

@ -0,0 +1,50 @@
import defaultSettings from './config/defaultSettings'
import proxy from './config/proxy'
import routes from './config/routes'
import { defineConfig } from '@umijs/max'
const { REACT_APP_ENV } = process.env
export default defineConfig({
title: defaultSettings.title,
theme: {
'primary-color': defaultSettings.primaryColor
},
model: {},
antd: {
},
request: {},
initialState: {
loading: '@/components/Loading'
},
dva: {},
// layout: {},
mfsu: { strategy: 'normal' },
locale: {
default: 'zh-CN',
antd: true,
baseNavigator: false
},
fastRefresh: true,
history: {
type: 'browser'
},
hash: false,
// publicPath: "./", //本地静态化 for android
publicPath: "/", //部署到服务端需要 publicPath: "/",或者 publicPath: "/xxxxx/",
manifest: {
basePath: "/", //本地静态化 for android 部署到服务端需要 publicPath: "/",或者 publicPath: "/xxxxx/",
},
routes: routes,
proxy: proxy[REACT_APP_ENV || 'dev'],
codeSplitting: {
jsStrategy: 'granularChunks'
},
chainWebpack(config, { webpack }) {
config.plugin('code-inspector-plugin').use(require('code-inspector-plugin').codeInspectorPlugin, [
{
bundler: 'webpack',
},
]);
},
})

@ -0,0 +1,3 @@
# zngf_web
智能光伏web

@ -0,0 +1,8 @@
export default {
primaryColor: '#2969ff',
menu: {
locale: true,
},
title: 'AI文档审阅系统',
iconfontUrl: '//at.alicdn.com/t/font_2163129_p3ldyoksz3s.js'
}

@ -0,0 +1,22 @@
/**
* 在生产环境 代理是无法生效的所以这里没有生产环境的配置
* The agent cannot take effect in the production environment
* so there is no configuration of the production environment
* For details, please see
* https://pro.ant.design/docs/deploy
*/
export default {
dev: {
'/platform_system/': {
// target: 'http://192.168.7.5:9091',
target: 'http://127.0.0.1:9091',
changeOrigin: true,
pathRewrite: { '^/platform_system': '/platform_system' },
},
'/api/': {
target: 'http://192.168.13.131:8080',
changeOrigin: true,
pathRewrite: { '^/api': '/api' },
},
},
}

@ -0,0 +1,665 @@
export default [
{
path: '/',
redirect: '/topnavbar00/home',
},
{
name: 'login',
path: '/login',
component: './login/Login'
},
{
name: 'topnavbar',
icon: 'table',
path: '/topnavbar00',
component: './topnavbar/TopNavBar',
routes: [
{
path: '/topnavbar00/home',
name: 'home',
component: './home/HomeList'
},
// 多维统计
{
path: '/topnavbar00/multidstatistics',
name: 'multidstatistics',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/multidstatistics/staffstatistics',
// icon: 'bank',
name: 'staffstatistics',
component: './multi-d-statistics/multiDStatistics',
},
],
},
// 人员管理
{
path: '/topnavbar00/staffmanage',
name: 'staffmanage',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/staffmanage/staffinfo',
// icon: 'bank',
name: 'staffinfo',
component: './staffmanage_staffinfo/StaffInfo',
},
{
path: '/topnavbar00/staffmanage/staffresume',
// icon: 'bank',
name: 'staffresume',
component: './staffmanage_staffresume/StaffResume',
},
{
path: '/topnavbar00/staffmanage/staffadjust',
// icon: 'bank',
name: 'staffadjust',
component: './staffmanage_staffadjust/StaffAdjust',
},
{
path: '/topnavbar00/staffmanage/staffresume',
// icon: 'bank',
name: 'staffresume',
component: './staffmanage_staffresume/StaffResume',
},
],
},
// 组织管理
{
path: '/topnavbar00/organmanage',
name: 'organmanage',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/organmanage/organchart',
// icon: 'bank',
name: 'organchart',
component: './organmanage_organchart/OrganChart',
},
{
path: '/topnavbar00/organmanage/deptmaintain',
// icon: 'bank',
name: 'deptmaintain',
component: './organmanage_deptmaintain/DeptMaintain',
},
],
},
// 考勤管理
{
path: '/topnavbar00/attendancemanage',
name: 'attendancemanage',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/attendancemanage/attendancedata',
// icon: 'bank',
name: 'attendancedata',
component: './attendancemanage_attendancedata/attendancemanageAttendancedata',
},
],
},
// 绩效管理
{
path: '/topnavbar00/performancemanage',
name: 'performancemanage',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/performancemanage/performancelist',
// icon: 'bank',
name: 'performancelist',
component: './performancemanage_performancelist/PerformanceList',
},
{
path: '/topnavbar00/performancemanage/performanceruleset',
// icon: 'bank',
name: 'performanceruleset',
component: './performancemanage_performanceruleset/PerformanceRuleset',
},
{
path: '/topnavbar00/performancemanage/performanceassess',
// icon: 'bank',
name: 'performanceassess',
component: './performancemanage_performanceassess/PerformanceAssess',
},
],
},
// 薪酬管理
{
path: '/topnavbar00/salarymanage',
name: 'salarymanage',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/salarymanage/salarydata',
// icon: 'bank',
name: 'salarydata',
component: './salarymanage_salarydata/SalaryData',
},
{
path: '/topnavbar00/salarymanage/salaryruleset',
// icon: 'bank',
name: 'salaryruleset',
component: './salarymanage_salaryruleset/SalaryRuleset',
},
],
},
//效率管理
{
path: '/topnavbar00/hrefficiency',
name: 'hrefficiency',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/hrefficiency/timesheet',
// icon: 'bank',
name: 'timesheet',
component: './hrefficiency_timesheet/TimeSheetList',
},
{
path: '/topnavbar00/hrefficiency/documentUpdate',
// icon: 'bank',
name: 'documentUpdate',
component: './documentUpdate/TimeSheetList',
},
{
path: '/topnavbar00/hrefficiency/agentSetting',
// icon: 'bank',
name: 'agentSetting',
component: './agentSetting/TimeSheetList',
},
{
path: '/topnavbar00/hrefficiency/backgroundManagement',
// icon: 'bank',
name: 'backgroundManagement',
component: './backgroundManagement/TimeSheetList',
},
{
path: '/topnavbar00/hrefficiency/staffsheet',
// icon: 'bank',
name: 'staffsheet',
component: './hrefficiency_staffsheet/StaffSheetList',
},
{
path: '/topnavbar00/hrefficiency/staffuph',
// icon: 'bank',
name: 'staffuph',
component: './hrefficiency_staffuph/StaffUPHList',
},
{
path: '/topnavbar00/hrefficiency/deptuph',
// icon: 'bank',
name: 'deptuph',
component: './hrefficiency_deptuph/DeptUPHList',
},
{
path: '/topnavbar00/hrefficiency/allstaffuph',
// icon: 'bank',
name: 'allstaffuph',
component: './hrefficiency_allstaffuph/AllStaffUPHList',
},
{
path: '/topnavbar00/hrefficiency/workreport',
// icon: 'bank',
name: 'workreport',
component: './hrefficiency_workreport/WorkReport',
},
{
path: '/topnavbar00/hrefficiency/dataSet',
// icon: 'bank',
name: 'dataSet',
component: './dataSet/TimeSheetList',
},
{
path: '/topnavbar00/hrefficiency/systemMonitoring',
// icon: 'bank',
name: 'systemMonitoring',
component: './systemMonitoring/TimeSheetList',
},
{
path: '/topnavbar00/hrefficiency/systemApplicationStatistics',
// icon: 'bank',
name: 'systemApplicationStatistics',
component: './systemApplicationStatistics/TimeSheetList',
},
],
},
// 知识库管理
{
path: '/topnavbar00/knowledgebase',
name: 'knowledgebase',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/knowledgebase/qaknowledgebase',
// icon: 'bank',
name: 'qaknowledgebase',
component: './knowledgebase_qaknowledgebase/QaKnowledgebase',
},
{
path: '/topnavbar00/knowledgebase/docknowledgebase',
// icon: 'bank',
name: 'docknowledgebase',
component: './knowledgebase_docknowledgebase/DocKnowledgebase',
},
],
},
// 后台管理
{
path: '/topnavbar00/backendmanage',
name: 'backendmanage',
component: './nav_system_content/SystemContentList',
routes: [
{
path: '/topnavbar00/backendmanage/datadict',
// icon: 'bank',
name: 'datadict',
component: './backendmanage_datadict/DataDict',
},
{
path: '/topnavbar00/backendmanage/configmanage',
// icon: 'bank',
name: 'configmanage',
component: './backendmanage_configmanage/ConfigManage',
},
],
},
],
},
// 异常页
{
name: 'exception',
icon: 'warning',
path: '/exception00',
hideInMenu: true,
routes: [
// exception
{
path: '/exception00/403',
name: 'not-permission',
component: './exception/403'
},
{
path: '/exception00/404',
name: 'not-find',
component: './exception/404'
},
{
path: '/exception00/500',
name: 'server-error',
component: './exception/500'
},
{
path: '/exception00/1403',
name: 'not-license-permission',
hideLayout: true,
component: './exception/1403'
}
]
},
{
// icon,
hideInMenu: true,
routes: [
{
// 网站通用图标
routes: [
{ icon: 'accountBook' },
{ icon: 'aim' },
{ icon: 'alert' },
{ icon: 'apartment' },
{ icon: 'api' },
{ icon: 'appstoreAdd' },
{ icon: 'appstore' },
{ icon: 'audio' },
{ icon: 'audioMuted' },
{ icon: 'audit' },
{ icon: 'bank' },
{ icon: 'barcode' },
{ icon: 'bars' },
{ icon: 'bell' },
{ icon: 'block' },
{ icon: 'book' },
{ icon: 'border' },
{ icon: 'borderlessTable' },
{ icon: 'branches' },
{ icon: 'bug' },
{ icon: 'build' },
{ icon: 'bulb' },
{ icon: 'calculator' },
{ icon: 'calendar' },
{ icon: 'camera' },
{ icon: 'car' },
{ icon: 'carryOut' },
{ icon: 'ciCircle' },
{ icon: 'ci' },
{ icon: 'clear' },
{ icon: 'cloudDownload' },
{ icon: 'cloud' },
{ icon: 'cloudServer' },
{ icon: 'cloudSync' },
{ icon: 'cloudUpload' },
{ icon: 'cluster' },
{ icon: 'code' },
{ icon: 'coffee' },
{ icon: 'comment' },
{ icon: 'compass' },
{ icon: 'compress' },
{ icon: 'consoleSql' },
{ icon: 'contacts' },
{ icon: 'container' },
{ icon: 'control' },
{ icon: 'copyright' },
{ icon: 'creditCard' },
{ icon: 'crown' },
{ icon: 'customerService' },
{ icon: 'dashboard' },
{ icon: 'database' },
{ icon: 'deleteColumn' },
{ icon: 'deleteRow' },
{ icon: 'deliveredProcedure' },
{ icon: 'deploymentUnit' },
{ icon: 'desktop' },
{ icon: 'dingtalk' },
{ icon: 'disconnect' },
{ icon: 'dislike' },
{ icon: 'dollarCircle' },
{ icon: 'dollar' },
{ icon: 'download' },
{ icon: 'ellipsis' },
{ icon: 'environment' },
{ icon: 'euroCircle' },
{ icon: 'euro' },
{ icon: 'exception' },
{ icon: 'expandAlt' },
{ icon: 'expand' },
{ icon: 'experiment' },
{ icon: 'export' },
{ icon: 'eye' },
{ icon: 'fieldBinary' },
{ icon: 'fieldNumber' },
{ icon: 'fieldString' },
{ icon: 'fieldTime' },
{ icon: 'fileAdd' },
{ icon: 'fileDone' },
{ icon: 'fileExcel' },
{ icon: 'fileExclamation' },
{ icon: 'file' },
{ icon: 'fileGif' },
{ icon: 'fileImage' },
{ icon: 'fileJpg' },
{ icon: 'fileMarkdown' },
{ icon: 'filePdf' },
{ icon: 'filePpt' },
{ icon: 'fileProtect' },
{ icon: 'fileSearch' },
{ icon: 'fileSync' },
{ icon: 'fileText' },
{ icon: 'fileUnknown' },
{ icon: 'fileWord' },
{ icon: 'fileZip' },
{ icon: 'filter' },
{ icon: 'fire' },
{ icon: 'flag' },
{ icon: 'folderAdd' },
{ icon: 'folder' },
{ icon: 'folderView' },
{ icon: 'fork' },
{ icon: 'formatPainter' },
{ icon: 'frown' },
{ icon: 'function' },
{ icon: 'fundProjectionScreen' },
{ icon: 'fundView' },
{ icon: 'funnelPlot' },
{ icon: 'gateway' },
{ icon: 'gif' },
{ icon: 'gift' },
{ icon: 'global' },
{ icon: 'gold' },
{ icon: 'group' },
{ icon: 'hdd' },
{ icon: 'heart' },
{ icon: 'history' },
{ icon: 'home' },
{ icon: 'hourglass' },
{ icon: 'idcard' },
{ icon: 'import' },
{ icon: 'inbox' },
{ icon: 'insertRowAbove' },
{ icon: 'insertRowBelow' },
{ icon: 'insertRowLeft' },
{ icon: 'insertRowRight' },
{ icon: 'insurance' },
{ icon: 'interaction' },
{ icon: 'key' },
{ icon: 'laptop' },
{ icon: 'layout' },
{ icon: 'like' },
{ icon: 'line' },
{ icon: 'link' },
{ icon: 'loading3Quarters' },
{ icon: 'loading' },
{ icon: 'lock' },
{ icon: 'macCommand' },
{ icon: 'mail' },
{ icon: 'man' },
{ icon: 'medicineBox' },
{ icon: 'meh' },
{ icon: 'menu' },
{ icon: 'mergeCells' },
{ icon: 'message' },
{ icon: 'mobile' },
{ icon: 'moneyCollect' },
{ icon: 'monitor' },
{ icon: 'more' },
{ icon: 'nodeCollapse' },
{ icon: 'nodeExpand' },
{ icon: 'nodeIndex' },
{ icon: 'notification' },
{ icon: 'number' },
{ icon: 'oneToOne' },
{ icon: 'partition' },
{ icon: 'payCircle' },
{ icon: 'percentage' },
{ icon: 'phone' },
{ icon: 'picture' },
{ icon: 'playSquare' },
{ icon: 'poundCircle' },
{ icon: 'pound' },
{ icon: 'poweroff' },
{ icon: 'printer' },
{ icon: 'profile' },
{ icon: 'project' },
{ icon: 'propertySafety' },
{ icon: 'pullRequest' },
{ icon: 'pushpin' },
{ icon: 'qrcode' },
{ icon: 'read' },
{ icon: 'reconciliation' },
{ icon: 'redEnvelope' },
{ icon: 'reload' },
{ icon: 'rest' },
{ icon: 'robot' },
{ icon: 'rocket' },
{ icon: 'rotateLeft' },
{ icon: 'rotateRight' },
{ icon: 'safetyCertificate' },
{ icon: 'safety' },
{ icon: 'save' },
{ icon: 'scan' },
{ icon: 'schedule' },
{ icon: 'search' },
{ icon: 'securityScan' },
{ icon: 'select' },
{ icon: 'send' },
{ icon: 'setting' },
{ icon: 'shake' },
{ icon: 'shareAlt' },
{ icon: 'shop' },
{ icon: 'shoppingCart' },
{ icon: 'shopping' },
{ icon: 'sisternode' },
{ icon: 'skin' },
{ icon: 'smile' },
{ icon: 'solution' },
{ icon: 'sound' },
{ icon: 'splitCells' },
{ icon: 'star' },
{ icon: 'subnode' },
{ icon: 'switcher' },
{ icon: 'sync' },
{ icon: 'table' },
{ icon: 'tablet' },
{ icon: 'tag' },
{ icon: 'tags' },
{ icon: 'team' },
{ icon: 'thunderbolt' },
{ icon: 'toTop' },
{ icon: 'tool' },
{ icon: 'trademarkCircle' },
{ icon: 'trademark' },
{ icon: 'transaction' },
{ icon: 'translation' },
{ icon: 'trophy' },
{ icon: 'ungroup' },
{ icon: 'unlock' },
{ icon: 'upload' },
{ icon: 'usb' },
{ icon: 'userAdd' },
{ icon: 'userDelete' },
{ icon: 'user' },
{ icon: 'userSwitch' },
{ icon: 'usergroupAdd' },
{ icon: 'usergroupDelete' },
{ icon: 'verified' },
{ icon: 'videoCameraAdd' },
{ icon: 'videoCamera' },
{ icon: 'wallet' },
{ icon: 'whatsApp' },
{ icon: 'wifi' },
{ icon: 'woman' },
]
},
{
// 编辑类图标
routes: [
{ icon: 'edit' },
{ icon: 'form' },
{ icon: 'copy' },
{ icon: 'scissor' },
{ icon: 'delete' },
{ icon: 'snippets' },
{ icon: 'diff' },
{ icon: 'highlight' },
{ icon: 'alignCenter' },
{ icon: 'alignLeft' },
{ icon: 'alignRight' },
{ icon: 'bgColors' },
{ icon: 'bold' },
{ icon: 'italic' },
{ icon: 'underline' },
{ icon: 'strikethrough' },
{ icon: 'redo' },
{ icon: 'undo' },
{ icon: 'zoomIn' },
{ icon: 'zoomOut' },
{ icon: 'fontColors' },
{ icon: 'fontSize' },
{ icon: 'lineHeight' },
{ icon: 'dash' },
{ icon: 'smallDash' },
{ icon: 'sortAscending' },
{ icon: 'sortDescending' },
{ icon: 'drag' },
{ icon: 'orderedList' },
{ icon: 'unorderedList' },
{ icon: 'radiusSetting' },
{ icon: 'columnWidth' },
{ icon: 'columnHeight' },
]
},
{
// 数据类图标
routes: [
{ icon: 'areaChart' },
{ icon: 'pieChart' },
{ icon: 'barChart' },
{ icon: 'dotChart' },
{ icon: 'lineChart' },
{ icon: 'radarChart' },
{ icon: 'heatMap' },
{ icon: 'fall' },
{ icon: 'rise' },
{ icon: 'stock' },
{ icon: 'boxPlot' },
{ icon: 'fund' },
{ icon: 'sliders' },
]
},
{
// 品牌和标识
routes: [
{ icon: 'android' },
{ icon: 'apple' },
{ icon: 'windows' },
{ icon: 'ie' },
{ icon: 'chrome' },
{ icon: 'github' },
{ icon: 'aliwangwang' },
{ icon: 'dingding' },
{ icon: 'weiboSquare' },
{ icon: 'weiboCircle' },
{ icon: 'taobaoCircle' },
{ icon: 'html5' },
{ icon: 'weibo' },
{ icon: 'twitter' },
{ icon: 'wechat' },
{ icon: 'youtube' },
{ icon: 'alipayCircle' },
{ icon: 'taobao' },
{ icon: 'skype' },
{ icon: 'qq' },
{ icon: 'mediumWorkmark' },
{ icon: 'gitlab' },
{ icon: 'medium' },
{ icon: 'linkedin' },
{ icon: 'googlePlus' },
{ icon: 'dropbox' },
{ icon: 'facebook' },
{ icon: 'codepen' },
{ icon: 'codeSandbox' },
{ icon: 'amazon' },
{ icon: 'google' },
{ icon: 'codepenCircle' },
{ icon: 'alipay' },
{ icon: 'antDesign' },
{ icon: 'antCloud' },
{ icon: 'aliyun' },
{ icon: 'zhihu' },
{ icon: 'slack' },
{ icon: 'slackSquare' },
{ icon: 'behance' },
{ icon: 'behanceSquare' },
{ icon: 'dribbble' },
{ icon: 'dribbbleSquare' },
{ icon: 'instagram' },
{ icon: 'yuque' },
{ icon: 'alibaba' },
{ icon: 'yahoo' },
{ icon: 'reddit' },
{ icon: 'sketch' },
]
}
],
},
{
component: './404',
},
]

@ -0,0 +1,17 @@
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"@@/*": ["./src/.umi/*"],
"umi": ["./node_module/umi"],
"@umijs/max": ["./node_module/umi"],
"@umijs/max/typings": ["./src/.umi/typings"],
"ahooks": ["./node_module/ahooks"],
"@ant-design/icons": ["./node_module/@ant-design/icons"],
"dayjs": ["./node_module/dayjs"]
}
}
}

@ -0,0 +1,37 @@
{
"name": "flx-lms-fe",
"version": "1.0.0",
"private": true,
"author": "",
"scripts": {
"dev": "cross-env REACT_APP_ENV=dev max dev",
"build": "cross-env REACT_APP_ENV=prod max build",
"postinstall": "max setup",
"setup": "max setup",
"start": "cross-env REACT_APP_ENV=dev max dev",
"start:no-mock": "cross-env MOCK=none REACT_APP_ENV=dev max dev"
},
"dependencies": {
"@ant-design/icons": "^4.8.0",
"@umijs/max": "^4.0.70",
"antd": "5.6.0",
"braft-editor": "^2.3.9",
"braft-finder": "^0.0.21",
"braft-utils": "^3.0.2",
"echarts": "^4.9.0",
"echarts-for-react": "^3.0.2",
"moment": "^2.29.1",
"qs": "^6.11.0",
"react": "^18.2.0",
"react-contexify": "^5.0.0",
"react-dom": "^18.2.0",
"react-split-pane": "^0.1.92"
},
"devDependencies": {
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"code-inspector-plugin": "^1.2.3",
"cross-env": "^7.0.3",
"typescript": "^4.1.2"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

@ -0,0 +1,624 @@
<!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>
<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://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>
.font-pacifico {
font-family: 'Pacifico', serif;
}
.icon-center {
display: flex;
justify-content: center;
align-items: center;
}
.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%);
}
}
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="min-h-[1024px] bg-secondary flex flex-col">
<!-- 顶部导航栏 -->
<!-- <header class="w-full bg-primary shadow-sm">
<div class="container mx-auto px-4 h-[60px] flex items-center justify-between">
<div class="flex items-center">
<div class="text-xs bg-white text-primary px-3 py-1 rounded-button">人力</div>
</div>
<nav class="flex-1 px-8">
<ul class="flex space-x-4 whitespace-nowrap">
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">多维统计</a>
</li>
<li><a href="#" class="text-xs text-white bg-blue-600 px-3 py-1 rounded-button font-medium">人员管理</a>
</li>
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">组织管理</a>
</li>
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">考勤管理</a>
</li>
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">绩效管理</a>
</li>
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">薪酬管理</a>
</li>
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">知识库</a>
</li>
<li><a href="#"
class="text-xs text-white hover:bg-blue-600 px-3 py-1 rounded-button font-medium">后台管理</a>
</li>
</ul>
</nav>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..."
class="pl-10 pr-4 py-2 text-sm bg-white rounded-button w-32 focus:outline-none focus:ring-2 focus:ring-white focus:border-transparent">
<i class="fas fa-search absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-500"></i>
</div>
<div class="relative group">
<div
class="w-8 h-8 rounded-full bg-white text-primary flex items-center justify-center cursor-pointer">
<i class="fas fa-user"></i>
</div>
<div
class="absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg py-1 z-50 hidden group-hover:block">
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">个人中心</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">系统设置</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">退出登录</a>
</div>
</div>
<button
class="bg-white text-primary px-3 py-1 rounded-button flex items-center space-x-2 hover:bg-gray-100 transition text-sm">
<i class="fas fa-robot"></i>
<span>AI助手</span>
</button>
</div>
</div>
</header> -->
<!-- 公告栏 -->
<div class="w-full bg-blue-50 py-1">
<div class="container mx-auto px-4">
<div class="flex items-center text-xs text-gray-700">
<span class="font-medium text-primary mr-3">公告:</span>
<div class="scroll-container w-full">
<div class="scroll-content">
<span>2023年度员工体检将于11月20日开始请各部门安排好时间。</span>
<span class="ml-8">公司年会定于12月28日举行各部门请提前准备节目。</span>
<span class="ml-8">新版本人力资源系统已上线如有问题请联系IT支持。</span>
<span class="ml-8">2024年春节假期安排已发布请查看公司公告。</span>
</div>
</div>
</div>
</div>
</div>
<!-- 主体内容 -->
<main class="flex-1 container mx-auto px-4 py-6">
<div class="bg-white rounded-lg shadow-sm p-6">
<h2 class="text-xl font-semibold text-gray-800 mb-6">人员管理</h2>
<div class="flex space-x-6">
<!-- 左侧组织架构树 -->
<div class="w-[20%] bg-white border border-gray-200 rounded-lg p-4">
<div class="flex justify-between items-center mb-4">
<h3 class="font-medium text-gray-700">组织架构</h3>
<div class="flex space-x-2">
<button class="text-gray-500 hover:text-primary">
<i class="fas fa-sync-alt"></i>
</button>
<button class="text-gray-500 hover:text-primary">
<i class="fas fa-expand"></i>
</button>
</div>
</div>
<div class="overflow-y-auto h-[600px]">
<ul class="space-y-1">
<li>
<div class="flex items-center justify-between p-2 bg-blue-50 rounded-button">
<div class="flex items-center">
<i class="fas fa-building mr-2 text-gray-600"></i>
<span class="text-sm font-medium">飞利信集团</span>
</div>
<i class="fas fa-chevron-down text-gray-500"></i>
</div>
<ul class="ml-6 mt-1 space-y-1">
<li>
<div
class="flex items-center justify-between p-2 hover:bg-gray-50 rounded-button">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-600"></i>
<span>人力资源部</span>
</div>
<i class="fas fa-chevron-down text-gray-500"></i>
</div>
<ul class="ml-6 mt-1 space-y-1">
<li class="flex items-center p-2 hover:bg-gray-50 rounded-button">
<i class="fas fa-users mr-2 text-gray-600"></i>
<span class="text-primary font-medium">招聘组</span>
</li>
<li class="flex items-center p-2 hover:bg-gray-50 rounded-button">
<i class="fas fa-chart-line mr-2 text-gray-600"></i>
<span>绩效组</span>
</li>
<li class="flex items-center p-2 hover:bg-gray-50 rounded-button">
<i class="fas fa-money-bill-wave mr-2 text-gray-600"></i>
<span>薪酬组</span>
</li>
</ul>
</li>
<li>
<div
class="flex items-center justify-between p-2 hover:bg-gray-50 rounded-button">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-600"></i>
<span>技术研发部</span>
</div>
<i class="fas fa-chevron-down text-gray-500"></i>
</div>
</li>
<li>
<div
class="flex items-center justify-between p-2 hover:bg-gray-50 rounded-button">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-600"></i>
<span>市场营销部</span>
</div>
<i class="fas fa-chevron-down text-gray-500"></i>
</div>
</li>
<li>
<div
class="flex items-center justify-between p-2 hover:bg-gray-50 rounded-button">
<div class="flex items-center">
<i class="fas fa-sitemap mr-2 text-gray-600"></i>
<span>财务部</span>
</div>
<i class="fas fa-chevron-down text-gray-500"></i>
</div>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- 右侧人员信息区 -->
<div class="w-[80%]">
<!-- 筛选条件 -->
<div class="bg-gray-50 rounded-lg p-4 mb-6">
<div class="grid grid-cols-3 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">姓名</label>
<input type="text"
class="w-full border rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">电话</label>
<input type="text"
class="w-full border rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">身份证号</label>
<input type="text"
class="w-full border rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">部门</label>
<div class="relative">
<input type="text"
class="w-full border rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent">
<i
class="fas fa-chevron-down absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500"></i>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">岗位</label>
<div class="relative">
<input type="text"
class="w-full border rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent">
<i
class="fas fa-chevron-down absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500"></i>
</div>
</div>
<div class="flex items-end space-x-2">
<button
class="bg-primary text-white px-4 py-2 rounded-button hover:bg-blue-600 transition">搜索</button>
<button
class="border border-gray-300 text-gray-700 px-4 py-2 rounded-button hover:bg-gray-50 transition">重置</button>
</div>
</div>
</div>
<!-- 操作按钮 -->
<div class="flex justify-between items-center mb-4">
<div class="text-sm text-gray-600">共 356 条记录</div>
<div class="flex space-x-2">
<button
class="border border-gray-300 text-gray-700 px-3 py-1 rounded-button text-sm hover:bg-gray-50 transition">
<i class="fas fa-download mr-1"></i>导出
</button>
<button
class="bg-primary text-white px-3 py-1 rounded-button text-sm hover:bg-blue-600 transition">
<i class="fas fa-plus mr-1"></i>新增人员
</button>
</div>
</div>
<!-- 人员表格 -->
<div class="overflow-x-auto">
<table class="min-w-full bg-white border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-gray-50">
<tr>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
序号</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
姓名</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
性别</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
年龄</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
电话</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
部门</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
岗位</th>
<th
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
操作</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">1</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">张明远</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">32</td>
<td class="px-4 py-3 text-sm text-gray-700">138****5678</td>
<td class="px-4 py-3 text-sm text-gray-700">人力资源部</td>
<td class="px-4 py-3 text-sm text-gray-700">招聘经理</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">2</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">李静怡</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">28</td>
<td class="px-4 py-3 text-sm text-gray-700">159****2345</td>
<td class="px-4 py-3 text-sm text-gray-700">技术研发部</td>
<td class="px-4 py-3 text-sm text-gray-700">前端工程师</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">3</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">王建国</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">45</td>
<td class="px-4 py-3 text-sm text-gray-700">186****7890</td>
<td class="px-4 py-3 text-sm text-gray-700">市场营销部</td>
<td class="px-4 py-3 text-sm text-gray-700">市场总监</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">4</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">赵雪梅</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">36</td>
<td class="px-4 py-3 text-sm text-gray-700">137****4567</td>
<td class="px-4 py-3 text-sm text-gray-700">财务部</td>
<td class="px-4 py-3 text-sm text-gray-700">财务主管</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">5</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">刘志强</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">29</td>
<td class="px-4 py-3 text-sm text-gray-700">188****3456</td>
<td class="px-4 py-3 text-sm text-gray-700">技术研发部</td>
<td class="px-4 py-3 text-sm text-gray-700">后端工程师</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">6</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">陈雨桐</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">27</td>
<td class="px-4 py-3 text-sm text-gray-700">135****6789</td>
<td class="px-4 py-3 text-sm text-gray-700">人力资源部</td>
<td class="px-4 py-3 text-sm text-gray-700">薪酬专员</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">7</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">孙伟</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">31</td>
<td class="px-4 py-3 text-sm text-gray-700">139****1234</td>
<td class="px-4 py-3 text-sm text-gray-700">市场营销部</td>
<td class="px-4 py-3 text-sm text-gray-700">市场经理</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">8</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">周晓琳</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">33</td>
<td class="px-4 py-3 text-sm text-gray-700">158****4567</td>
<td class="px-4 py-3 text-sm text-gray-700">财务部</td>
<td class="px-4 py-3 text-sm text-gray-700">会计</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">9</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">吴刚</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">40</td>
<td class="px-4 py-3 text-sm text-gray-700">136****7890</td>
<td class="px-4 py-3 text-sm text-gray-700">技术研发部</td>
<td class="px-4 py-3 text-sm text-gray-700">技术总监</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 text-sm text-gray-700">10</td>
<td class="px-4 py-3 text-sm font-medium text-gray-900">郑美丽</td>
<td class="px-4 py-3 text-sm text-gray-700"></td>
<td class="px-4 py-3 text-sm text-gray-700">26</td>
<td class="px-4 py-3 text-sm text-gray-700">187****2345</td>
<td class="px-4 py-3 text-sm text-gray-700">人力资源部</td>
<td class="px-4 py-3 text-sm text-gray-700">招聘专员</td>
<td class="px-4 py-3 text-sm text-gray-700">
<div class="flex space-x-2">
<button class="text-blue-500 hover:text-blue-700">
<i class="fas fa-edit"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="flex items-center justify-between mt-4">
<div class="text-sm text-gray-600">显示 1 到 10 条,共 356 条记录</div>
<div class="flex space-x-1">
<button
class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">上一页</button>
<button class="px-3 py-1 border rounded-button text-sm bg-primary text-white">1</button>
<button
class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">2</button>
<button
class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">3</button>
<span class="px-3 py-1 text-sm text-gray-700">...</span>
<button
class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">36</button>
<button
class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">下一页</button>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="w-full bg-gray-800 text-white py-6">
<div class="container mx-auto px-4">
<div class="grid grid-cols-4 gap-6 mb-6">
<div>
<h3 class="text-base font-medium mb-3">关于我们</h3>
<ul class="space-y-1 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-lg font-medium mb-4">产品服务</h3>
<ul class="space-y-2 text-sm 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-lg font-medium mb-4">帮助中心</h3>
<ul class="space-y-2 text-sm 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-lg font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-sm text-gray-300">
<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> contact@feilixin.com</li>
<li class="flex space-x-4 mt-4">
<a href="#"
class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary">
<i class="fab fa-weixin"></i>
</a>
<a href="#"
class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary">
<i class="fab fa-weibo"></i>
</a>
<a href="#"
class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary">
<i class="fab fa-linkedin-in"></i>
</a>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 pt-6">
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="text-sm text-gray-400 mb-4 md:mb-0">
© 2023 飞利信人力资源管理系统 版权所有
</div>
<div class="flex space-x-6">
<a href="#" class="text-sm text-gray-400 hover:text-white">隐私政策</a>
<a href="#" class="text-sm text-gray-400 hover:text-white">服务条款</a>
<a href="#" class="text-sm text-gray-400 hover:text-white">法律声明</a>
<a href="#" class="text-sm text-gray-400 hover:text-white">ICP备案号京ICP备12345678号</a>
</div>
</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>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.5.0/echarts.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<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">
<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>
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
.chart-container {
width: 100%;
height: 300px;
}
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
}
</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 h-16 flex items-center justify-between">
<div class="flex items-center space-x-8">
<a href="#" class="text-2xl font-['Pacifico']">人力</a>
<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">
<input type="text" placeholder="搜索..." class="bg-white/20 text-sm px-4 py-2 rounded-button w-48 focus:outline-none focus:ring-2 focus:ring-white/50">
<i class="fa-icon fa-solid fa-magnifying-glass absolute right-3 top-1/2 transform -translate-y-1/2 text-white/70"></i>
</div>
<button class="flex items-center space-x-1 bg-white/10 hover:bg-white/20 px-3 py-1 rounded-button transition">
<i class="fa-icon fa-solid fa-robot"></i>
<span class="text-sm">AI助手</span>
</button>
<div class="w-8 h-8 rounded-full bg-white/20 flex items-center justify-center cursor-pointer">
<i class="fa-icon fa-solid fa-user"></i>
</div>
</div>
</div>
</header> -->
<!-- 主要内容 -->
<main class="container mx-auto px-6 py-8">
<!-- 数据卡片行 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
<div class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition">
<div class="flex justify-between items-start">
<div>
<p class="text-gray-500 text-sm">员工总数</p>
<p class="text-3xl font-bold mt-2">1,248</p>
</div>
<div class="bg-green-100 text-green-800 px-2 py-1 rounded-button text-xs flex items-center">
<i class="fa-icon fa-solid fa-arrow-up mr-1"></i>
<span>5.2%</span>
</div>
</div>
<p class="text-gray-500 text-xs mt-2">较上月增加 62 人</p>
</div>
<div class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition">
<div>
<p class="text-gray-500 text-sm">本月入职</p>
<p class="text-3xl font-bold mt-2">87</p>
</div>
<p class="text-gray-500 text-xs mt-2">其中社招 52 人,校招 35 人</p>
</div>
<div class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition">
<div>
<p class="text-gray-500 text-sm">本月离职</p>
<p class="text-3xl font-bold mt-2">25</p>
</div>
<p class="text-gray-500 text-xs mt-2">主动离职 18 人,被动离职 7 人</p>
</div>
<div class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition">
<div>
<p class="text-gray-500 text-sm">平均工龄</p>
<p class="text-3xl font-bold mt-2">3.2</p>
</div>
<p class="text-gray-500 text-xs mt-2">年,较行业平均高 0.8 年</p>
</div>
</div>
<!-- 图表行1 -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
<div class="bg-white p-6 rounded-lg shadow-sm">
<h3 class="text-lg font-semibold mb-4">部门人员分布</h3>
<div class="chart-container" id="departmentChart"></div>
</div>
<div class="bg-white p-6 rounded-lg shadow-sm">
<h3 class="text-lg font-semibold mb-4">职位分布</h3>
<div class="chart-container" id="positionChart"></div>
</div>
</div>
<!-- 图表行2 -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
<div class="bg-white p-6 rounded-lg shadow-sm">
<h3 class="text-lg font-semibold mb-4">员工年龄分布</h3>
<div class="chart-container" id="ageChart"></div>
</div>
<div class="bg-white p-6 rounded-lg shadow-sm">
<h3 class="text-lg font-semibold mb-4">员工工龄分布</h3>
<div class="chart-container" id="seniorityChart"></div>
</div>
</div>
<!-- 图表行3 -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
<div class="bg-white p-6 rounded-lg shadow-sm">
<h3 class="text-lg font-semibold mb-4">员工绩效分布</h3>
<div class="chart-container" id="performanceChart"></div>
</div>
<div class="bg-white p-6 rounded-lg shadow-sm">
<h3 class="text-lg font-semibold mb-4">招聘渠道分布</h3>
<div class="chart-container" id="recruitmentChart"></div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="w-full bg-gray-800 text-white py-8 mt-auto">
<div class="container mx-auto px-6">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div>
<h3 class="text-lg font-semibold 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="fa-icon fa-brands fa-weixin"></i></a>
<a href="#" class="text-gray-400 hover:text-white transition"><i class="fa-icon fa-brands fa-weibo"></i></a>
<a href="#" class="text-gray-400 hover:text-white transition"><i class="fa-icon fa-brands fa-linkedin"></i></a>
</div>
</div>
<div>
<h3 class="text-lg font-semibold mb-4">快速链接</h3>
<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>
<li><a href="#" class="text-sm text-gray-400 hover:text-white transition">帮助中心</a></li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold mb-4">联系我们</h3>
<ul class="space-y-2 text-sm text-gray-400">
<li class="flex items-start">
<i class="fa-icon fa-solid fa-map-marker-alt mt-1 mr-2"></i>
<span>北京市海淀区中关村软件园 12 号楼 3 层</span>
</li>
<li class="flex items-center">
<i class="fa-icon fa-solid fa-phone mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fa-icon fa-solid fa-envelope mr-2"></i>
<span>contact@hrtech.com</span>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-center text-sm text-gray-400">
<p>© 2023 人力科技 版权所有 | 京ICP备12345678号-1 | 京公网安备11010802023456号</p>
</div>
</div>
</footer>
<script>
// 部门分布图表
const departmentChart = echarts.init(document.getElementById('departmentChart'));
departmentChart.setOption({
animation: false,
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
right: 10,
top: 'center',
data: ['技术部', '产品部', '市场部', '销售部', '人力资源', '财务部', '行政部']
},
series: [
{
name: '部门分布',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '18',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 320, name: '技术部' },
{ value: 240, name: '产品部' },
{ value: 149, name: '市场部' },
{ value: 180, name: '销售部' },
{ value: 98, name: '人力资源' },
{ value: 56, name: '财务部' },
{ value: 105, name: '行政部' }
]
}
]
});
// 职位分布图表
const positionChart = echarts.init(document.getElementById('positionChart'));
positionChart.setOption({
animation: false,
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
right: 10,
top: 'center',
data: ['工程师', '产品经理', '设计师', '市场专员', '销售代表', 'HRBP', '财务专员', '行政专员']
},
series: [
{
name: '职位分布',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '18',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 280, name: '工程师' },
{ value: 120, name: '产品经理' },
{ value: 90, name: '设计师' },
{ value: 80, name: '市场专员' },
{ value: 150, name: '销售代表' },
{ value: 60, name: 'HRBP' },
{ value: 40, name: '财务专员' },
{ value: 80, name: '行政专员' }
]
}
]
});
// 年龄分布图表
const ageChart = echarts.init(document.getElementById('ageChart'));
ageChart.setOption({
animation: false,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: ['20-25岁', '26-30岁', '31-35岁', '36-40岁', '41岁以上'],
axisTick: {
alignWithLabel: true
}
},
yAxis: {
type: 'value'
},
series: [
{
name: '人数',
type: 'bar',
barWidth: '60%',
itemStyle: {
color: '#2D5CF6'
},
data: [120, 480, 360, 180, 108]
}
]
});
// 工龄分布图表
const seniorityChart = echarts.init(document.getElementById('seniorityChart'));
seniorityChart.setOption({
animation: false,
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
right: 10,
top: 'center',
data: ['1年以内', '1-3年', '3-5年', '5-10年', '10年以上']
},
series: [
{
name: '工龄分布',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '18',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 280, name: '1年以内' },
{ value: 420, name: '1-3年' },
{ value: 300, name: '3-5年' },
{ value: 180, name: '5-10年' },
{ value: 68, name: '10年以上' }
]
}
]
});
// 绩效分布图表
const performanceChart = echarts.init(document.getElementById('performanceChart'));
performanceChart.setOption({
animation: false,
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
right: 10,
top: 'center',
data: ['A(优秀)', 'B(良好)', 'C(合格)', 'D(待改进)']
},
series: [
{
name: '绩效分布',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '18',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 180, name: 'A(优秀)' },
{ value: 420, name: 'B(良好)' },
{ value: 480, name: 'C(合格)' },
{ value: 68, name: 'D(待改进)' }
]
}
]
});
// 招聘渠道图表
const recruitmentChart = echarts.init(document.getElementById('recruitmentChart'));
recruitmentChart.setOption({
animation: false,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {
data: ['猎头', '招聘网站', '内部推荐', '校园招聘', '社交媒体']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value'
},
yAxis: {
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月']
},
series: [
{
name: '猎头',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [5, 3, 7, 4, 6, 8]
},
{
name: '招聘网站',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [12, 10, 15, 18, 14, 16]
},
{
name: '内部推荐',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [8, 6, 10, 7, 9, 11]
},
{
name: '校园招聘',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [0, 0, 0, 15, 12, 10]
},
{
name: '社交媒体',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [3, 5, 4, 6, 5, 7]
}
]
});
// 窗口大小变化时重新调整图表大小
window.addEventListener('resize', function() {
departmentChart.resize();
positionChart.resize();
ageChart.resize();
seniorityChart.resize();
performanceChart.resize();
recruitmentChart.resize();
});
</script>
</body>
</html>

@ -0,0 +1,620 @@
<!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>
<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>
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-pacifico {
font-family: "Pacifico", serif;
}
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
.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%);
}
}
</style>
</head>
<body class="bg-secondary min-h-[1024px] flex flex-col">
<!-- 顶部导航 -->
<!-- <header class="bg-primary text-white w-full fixed top-0 z-50 shadow-md">
<div class="container mx-auto px-4 h-[60px] flex items-center justify-between">
<div class="flex items-center">
<span class="font-pacifico text-2xl mr-10">人力</span>
</div>
<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 class="flex items-center space-x-4">
<div class="relative hidden lg:block">
<input type="text" placeholder="搜索..."
class="bg-white/20 text-sm py-1 px-3 pl-8 rounded-button text-white placeholder-white/70 focus:outline-none focus:ring-1 focus:ring-white w-40">
<i
class="fas fa-search fa-icon absolute left-2 top-1/2 transform -translate-y-1/2 text-sm text-white/70"></i>
</div>
<button
class="bg-white/10 hover:bg-white/20 text-sm px-3 py-1 rounded-button flex items-center space-x-1 transition">
<i class="fas fa-robot fa-icon text-sm"></i>
<span>AI助手</span>
</button>
<div class="relative">
<img src="https://mastergo.com/ai/api/search-image?query=professional20business20portrait20of20a20asian20male20executive20in20suit20with20clean20background20high20quality20photo20realistic20detailed20face20corporate20style&width=100&height=100&orientation=squarish&flag=3efee3725d19ed6e79a0117bb8d09db5"
alt="用户头像" class="w-8 h-8 rounded-full object-cover border-2 border-white/30">
</div>
</div>
</div>
</header> -->
<!-- 公告栏 -->
<div class="bg-white py-2 px-4 shadow-sm">
<div class="container mx-auto">
<div class="scroll-container">
<div class="scroll-content text-sm text-gray-600">
<span class="font-medium text-primary mr-4">公告:</span>
<span class="mr-8">2023年度绩效考核工作将于12月1日正式启动</span>
<span class="mr-8">公司年度旅游活动报名截止日期延长至11月30日</span>
<span class="mr-8">新员工入职培训将于下周一上午9点在3楼会议室举行</span>
<span class="mr-8">公司福利政策更新:新增子女教育补贴项目</span>
<span class="mr-8">IT部门提醒请及时更新您的电脑系统至最新版本</span>
</div>
</div>
</div>
</div>
<!-- 主内容区 -->
<main class="flex-1 container mx-auto px-4 py-6 mt-4">
<!-- 面包屑导航 -->
<div class="flex items-center text-sm text-gray-500 mb-4">
<a href="#" class="hover:text-primary">首页</a>
<i class="fas fa-chevron-right mx-2 text-xs"></i>
<a href="#" class="hover:text-primary">人员管理</a>
<i class="fas fa-chevron-right mx-2 text-xs"></i>
<span class="text-gray-700">人员详情</span>
</div>
<!-- 个人信息卡片 -->
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
<div class="flex flex-col">
<!-- 头像区域 -->
<div class="flex-shrink-0 mb-4">
<img src="https://mastergo.com/ai/api/search-image?query=professional20business20portrait20of20a20asian20female20executive20in20suit20with20clean20background20high20quality20photo20realistic20detailed20face20corporate20style&width=80&height=80&orientation=squarish&flag=5ebb2186f7537b5a7e434d5cf8384120"
alt="员工头像" class="w-20 h-20 rounded-lg object-cover border border-gray-200">
</div>
<!-- 基本信息 -->
<div class="flex-1">
<div class="flex flex-col md:flex-row md:items-center md:justify-between mb-4">
<div>
<h1 class="text-2xl font-bold text-gray-800">林晓梅</h1>
<p class="text-gray-500">高级产品经理 | 产品研发中心</p>
</div>
<div class="flex space-x-2 mt-2 md:mt-0">
<button
class="bg-primary hover:bg-blue-700 text-white text-sm px-3 py-1 rounded-button flex items-center space-x-1 transition">
<i class="fas fa-edit fa-icon text-xs"></i>
<span>编辑</span>
</button>
<button
class="bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 text-sm px-3 py-1 rounded-button flex items-center space-x-1 transition">
<i class="fas fa-print fa-icon text-xs"></i>
<span>打印</span>
</button>
</div>
</div>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div>
<p class="text-xs text-gray-500">员工编号</p>
<p class="text-sm font-medium">EMP20230085</p>
</div>
<div>
<p class="text-xs text-gray-500">入职日期</p>
<p class="text-sm font-medium">2018-06-15</p>
</div>
<div>
<p class="text-xs text-gray-500">工作年限</p>
<p class="text-sm font-medium">5年4个月</p>
</div>
<div>
<p class="text-xs text-gray-500">员工状态</p>
<p class="text-sm font-medium text-green-600">在职</p>
</div>
</div>
</div>
</div>
</div>
<!-- 移除标签页导航 -->
<!-- 基本信息内容 -->
<div class="space-y-6 mb-6">
<!-- 个人信息 -->
<div class="bg-white rounded-lg shadow-md p-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-user-circle fa-icon text-primary mr-2"></i>
<span>个人信息</span>
</h2>
<div class="space-y-4">
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs text-gray-500">姓名</p>
<p class="text-sm font-medium">林晓梅</p>
</div>
<div>
<p class="text-xs text-gray-500">性别</p>
<p class="text-sm font-medium"></p>
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs text-gray-500">出生日期</p>
<p class="text-sm font-medium">1990-08-23</p>
</div>
<div>
<p class="text-xs text-gray-500">年龄</p>
<p class="text-sm font-medium">33岁</p>
</div>
</div>
<div>
<p class="text-xs text-gray-500">身份证号</p>
<p class="text-sm font-medium">310******19900823****</p>
</div>
<div>
<p class="text-xs text-gray-500">婚姻状况</p>
<p class="text-sm font-medium">已婚</p>
</div>
<div>
<p class="text-xs text-gray-500">联系电话</p>
<p class="text-sm font-medium">138****5678</p>
</div>
<div>
<p class="text-xs text-gray-500">电子邮箱</p>
<p class="text-sm font-medium">linxiaomei@company.com</p>
</div>
<div>
<p class="text-xs text-gray-500">现居住地</p>
<p class="text-sm font-medium">上海市浦东新区张江高科技园区科苑路88号</p>
</div>
</div>
</div>
<!-- 工作信息 -->
<div class="bg-white rounded-lg shadow-md p-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-briefcase fa-icon text-primary mr-2"></i>
<span>工作信息</span>
</h2>
<div class="space-y-4">
<div>
<p class="text-xs text-gray-500">所属部门</p>
<p class="text-sm font-medium">产品研发中心 - 产品设计部</p>
</div>
<div>
<p class="text-xs text-gray-500">直接上级</p>
<p class="text-sm font-medium">张伟(产品研发中心总监)</p>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs text-gray-500">职位</p>
<p class="text-sm font-medium">高级产品经理</p>
</div>
<div>
<p class="text-xs text-gray-500">职级</p>
<p class="text-sm font-medium">P7</p>
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs text-gray-500">员工类型</p>
<p class="text-sm font-medium">正式员工</p>
</div>
<div>
<p class="text-xs text-gray-500">工作地点</p>
<p class="text-sm font-medium">上海总部</p>
</div>
</div>
<div>
<p class="text-xs text-gray-500">工作职责</p>
<p class="text-sm font-medium">负责公司核心产品线的规划与设计,主导产品全生命周期管理,协调跨部门资源推动产品落地</p>
</div>
</div>
</div>
<!-- 职业履历 -->
<div class="bg-white rounded-lg shadow-md p-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-history fa-icon text-primary mr-2"></i>
<span>职业履历</span>
</h2>
<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>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">上海科技有限公司</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">高级产品经理</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2018-06-15 至今 · 5年4个月</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">主导公司核心产品线的规划与设计带领5人产品团队成功推出3款市场领先产品用户增长300%
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 py-1 text-xs rounded bg-primary/10 text-primary">当前公司</span>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">北京创新科技有限公司</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">产品经理</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2015-07-01 至 2018-05-30 · 2年11个月</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">负责企业级SaaS产品的设计与迭代成功将产品NPS从35提升至72客户续费率提升至85%
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap"></td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">深圳科技发展有限公司</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">产品助理</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2013-09-01 至 2015-06-30 · 1年10个月</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">协助产品经理完成需求分析、原型设计参与3个移动端项目从0到1的全过程</div>
</td>
<td class="px-6 py-4 whitespace-nowrap"></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 教育经历 -->
<div class="bg-white rounded-lg shadow-md p-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-graduation-cap fa-icon text-primary mr-2"></i>
<span>教育经历</span>
</h2>
<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>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">复旦大学</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">计算机科学与技术 · 硕士</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2010-09-01 至 2013-06-30</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">GPA 3.8/4.0,获得校级优秀毕业生称号,研究方向为人机交互与用户体验</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 py-1 text-xs rounded bg-primary/10 text-primary">最高学历</span>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">南京大学</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">软件工程 · 学士</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2006-09-01 至 2010-06-30</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">GPA 3.6/4.0获得国家奖学金参与2项校级科研项目</div>
</td>
<td class="px-6 py-4 whitespace-nowrap"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 组织架构图 -->
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-sitemap fa-icon text-primary mr-2"></i>
<span>组织架构</span>
</h2>
<div class="bg-gray-100 rounded-lg p-4 h-64 flex items-center justify-center">
<img src="https://ai-public.mastergo.com/gen_page/map_placeholder_1280x720.png" alt="组织架构图"
class="max-w-full max-h-full object-contain">
</div>
</div>
<!-- 职业履历 -->
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-history fa-icon text-primary mr-2"></i>
<span>职业履历</span>
</h2>
<div class="space-y-4">
<!-- 当前公司经历 -->
<div class="border-l-2 border-primary pl-4 py-2">
<div class="flex justify-between items-start">
<div>
<h3 class="font-medium text-gray-800">上海科技有限公司</h3>
<p class="text-sm text-gray-600">高级产品经理</p>
</div>
<span class="text-xs bg-primary/10 text-primary px-2 py-1 rounded">当前公司</span>
</div>
<p class="text-xs text-gray-500 mt-1">2018-06-15 至今 · 5年4个月</p>
<p class="text-sm text-gray-700 mt-2">主导公司核心产品线的规划与设计带领5人产品团队成功推出3款市场领先产品用户增长300%</p>
</div>
<!-- 过往经历1 -->
<div class="border-l-2 border-gray-200 pl-4 py-2">
<div class="flex justify-between items-start">
<div>
<h3 class="font-medium text-gray-800">北京创新科技有限公司</h3>
<p class="text-sm text-gray-600">产品经理</p>
</div>
</div>
<p class="text-xs text-gray-500 mt-1">2015-07-01 至 2018-05-30 · 2年11个月</p>
<p class="text-sm text-gray-700 mt-2">负责企业级SaaS产品的设计与迭代成功将产品NPS从35提升至72客户续费率提升至85%</p>
</div>
<!-- 过往经历2 -->
<div class="border-l-2 border-gray-200 pl-4 py-2">
<div class="flex justify-between items-start">
<div>
<h3 class="font-medium text-gray-800">深圳科技发展有限公司</h3>
<p class="text-sm text-gray-600">产品助理</p>
</div>
</div>
<p class="text-xs text-gray-500 mt-1">2013-09-01 至 2015-06-30 · 1年10个月</p>
<p class="text-sm text-gray-700 mt-2">协助产品经理完成需求分析、原型设计参与3个移动端项目从0到1的全过程</p>
</div>
</div>
</div>
<!-- 教育经历 -->
<div class="bg-white rounded-lg shadow-md p-6">
<h2 class="text-lg font-medium text-gray-800 mb-4 flex items-center">
<i class="fas fa-graduation-cap fa-icon text-primary mr-2"></i>
<span>教育经历</span>
</h2>
<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>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">复旦大学</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">计算机科学与技术 · 硕士</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2010-09-01 至 2013-06-30</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">GPA 3.8/4.0,获得校级优秀毕业生称号,研究方向为人机交互与用户体验</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 py-1 text-xs rounded bg-primary/10 text-primary">最高学历</span>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<div class="font-medium text-gray-800">南京大学</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-gray-600">软件工程 · 学士</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-xs text-gray-500">2006-09-01 至 2010-06-30</div>
</td>
<td class="px-6 py-4">
<div class="text-sm text-gray-700">GPA 3.6/4.0获得国家奖学金参与2项校级科研项目</div>
</td>
<td class="px-6 py-4 whitespace-nowrap"></td>
</tr>
</tbody>
</table>
</div>
</div>
</main>
<!-- 底部通栏 -->
<footer class="bg-gray-800 text-white w-full py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8 mb-6">
<div>
<h3 class="text-sm font-medium mb-4">关于我们</h3>
<ul class="space-y-2 text-xs 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>
<li><a href="#" class="hover:text-white transition">加入我们</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">产品服务</h3>
<ul class="space-y-2 text-xs 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>
<li><a href="#" class="hover:text-white transition">培训管理系统</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">帮助中心</h3>
<ul class="space-y-2 text-xs 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">API接口</a></li>
<li><a href="#" class="hover:text-white transition">联系我们</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-start">
<i class="fas fa-map-marker-alt fa-icon mr-2 mt-0.5"></i>
<span>上海市浦东新区张江高科技园区科苑路88号</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone fa-icon mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon mr-2"></i>
<span>service@hrsystem.com</span>
</li>
<li class="flex items-center space-x-3 mt-4">
<a href="#"
class="w-6 h-6 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary transition">
<i class="fab fa-weixin fa-icon text-xs"></i>
</a>
<a href="#"
class="w-6 h-6 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary transition">
<i class="fab fa-weibo fa-icon text-xs"></i>
</a>
<a href="#"
class="w-6 h-6 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary transition">
<i class="fab fa-linkedin-in fa-icon text-xs"></i>
</a>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 pt-6">
<div class="flex flex-col md:flex-row justify-between items-center">
<p class="text-xs text-gray-400 mb-2 md:mb-0">© 2023 人力资源管理系统 版权所有</p>
<div class="flex space-x-4">
<a href="#" class="text-xs text-gray-400 hover:text-white transition">隐私政策</a>
<a href="#" class="text-xs text-gray-400 hover:text-white transition">服务条款</a>
<a href="#" class="text-xs text-gray-400 hover:text-white transition">法律声明</a>
<a href="#" class="text-xs text-gray-400 hover:text-white transition">沪ICP备12345678号-1</a>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,572 @@
<!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 href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<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;
}
.nav-item:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.tree-node:hover {
background-color: rgba(45, 92, 246, 0.05);
}
.table-row:hover {
background-color: #F5F6FA;
}
.ai-icon {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { opacity: 0.8; }
50% { opacity: 1; }
100% { opacity: 0.8; }
}
.marquee {
animation: scroll 20s linear infinite;
}
@keyframes scroll {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
i {
display: flex !important;
justify-content: center !important;
align-items: center !important;
}
</style>
</head>
<body class="bg-secondary font-sans">
<!-- 顶部导航栏 -->
<!--<header class="bg-primary text-white w-full fixed top-0 z-50 shadow-md">
<div class="container mx-auto px-4 h-14 flex items-center justify-between">
<div class="flex items-center">
<span class="font-['Pacifico'] text-xl mr-8">人力</span>
<nav class="hidden md:flex space-x-1">
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">多维统计</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">人员管理</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">组织管理</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">考勤管理</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">绩效管理</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">薪酬管理</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">知识库</a>
<a href="#" class="nav-item px-3 py-1 text-sm rounded-button hover:bg-primary-600">后台管理</a>
</nav>
</div>
<div class="flex items-center space-x-4">
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..." class="bg-primary-600 text-white text-sm py-1 pl-8 pr-3 rounded-button border border-primary-400 focus:outline-none focus:ring-1 focus:ring-white w-48" />
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-white text-sm"></i>
</div>
<button class="flex items-center space-x-1 bg-primary-600 hover:bg-primary-700 px-2 py-1 rounded-button text-sm">
<i class="fas fa-robot ai-icon text-white text-sm"></i>
<span>AI助手</span>
</button>
<div class="flex items-center space-x-2 cursor-pointer">
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center text-primary font-semibold"></div>
<span class="text-sm hidden md:inline">张明远</span>
</div>
</div>
</div>
</header> -->
<!-- 主内容区 -->
<main class="container mx-auto px-4 pt-6 pb-10 flex">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-4">
<div class="bg-white rounded-md shadow-sm p-4 h-full">
<div class="flex items-center justify-between mb-4">
<h3 class="text-sm font-semibold text-gray-700">组织架构</h3>
<button class="text-primary text-sm">全部展开</button>
</div>
<div class="space-y-1 text-sm">
<!-- 一级部门 -->
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-building mr-2 text-gray-500 text-xs"></i>
<span>集团总部</span>
</div>
<!-- 二级部门 -->
<div class="pl-4 mt-1 space-y-1">
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-users mr-2 text-gray-500 text-xs"></i>
<span>人力资源部</span>
</div>
<!-- 三级部门 -->
<div class="pl-4 mt-1 space-y-1">
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer flex items-center">
<i class="fas fa-user-tie mr-2 text-gray-500 text-xs"></i>
<span>招聘组</span>
</div>
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer flex items-center">
<i class="fas fa-chart-line mr-2 text-gray-500 text-xs"></i>
<span>绩效组</span>
</div>
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer flex items-center">
<i class="fas fa-money-bill-wave mr-2 text-gray-500 text-xs"></i>
<span>薪酬组</span>
</div>
</div>
</div>
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-laptop-code mr-2 text-gray-500 text-xs"></i>
<span>技术研发部</span>
</div>
</div>
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-shopping-cart mr-2 text-gray-500 text-xs"></i>
<span>市场营销部</span>
</div>
</div>
</div>
</div>
<!-- 一级部门 -->
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-building mr-2 text-gray-500 text-xs"></i>
<span>华东分公司</span>
</div>
</div>
<!-- 一级部门 -->
<div class="tree-node pl-2 py-1 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-building mr-2 text-gray-500 text-xs"></i>
<span>华南分公司</span>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧内容区 -->
<div class="w-4/5">
<!-- 公告栏 -->
<div class="bg-white rounded-md shadow-sm p-3 mb-4 overflow-hidden">
<div class="flex items-center">
<i class="fas fa-bullhorn text-primary mr-2 text-sm"></i>
<div class="marquee whitespace-nowrap text-sm">
<span class="mr-8">【系统公告】2023年度绩效考核工作将于12月1日正式启动</span>
<span class="mr-8">【重要通知】全体员工请于11月30日前完成个人信息核对</span>
<span class="mr-8">【培训通知】11月25日将举办新员工入职培训请相关人员准时参加</span>
</div>
</div>
</div>
<!-- 筛选区 -->
<div class="bg-white rounded-md shadow-sm p-4 mb-4">
<div class="flex items-center flex-wrap gap-4">
<div class="flex items-center">
<span class="text-sm text-gray-600 mr-2">时间段:</span>
<div class="relative">
<input type="text" class="border rounded-button px-3 py-1 text-sm w-40" placeholder="开始日期" />
<i class="fas fa-calendar-alt absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
<span class="mx-2 text-sm text-gray-400"></span>
<div class="relative">
<input type="text" class="border rounded-button px-3 py-1 text-sm w-40" placeholder="结束日期" />
<i class="fas fa-calendar-alt absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
<div class="flex items-center">
<span class="text-sm text-gray-600 mr-2">作业人员:</span>
<div class="relative">
<input type="text" class="border rounded-button px-3 py-1 text-sm w-32" placeholder="姓名/工号" />
<i class="fas fa-search absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
<div class="flex items-center">
<span class="text-sm text-gray-600 mr-2">作业类型:</span>
<div class="relative">
<select class="border rounded-button px-3 py-1 text-sm w-32 appearance-none bg-white">
<option>全部</option>
<option>招聘面试</option>
<option>培训组织</option>
<option>绩效考核</option>
<option>薪酬核算</option>
</select>
<i class="fas fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
<button class="ml-auto bg-primary hover:bg-primary-600 text-white px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-filter mr-1 text-xs"></i>
筛选
</button>
<button class="bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-redo mr-1 text-xs"></i>
重置
</button>
</div>
</div>
<!-- 数据表格 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden">
<div class="p-4 border-b flex items-center justify-between">
<h3 class="text-sm font-semibold text-gray-700">作业明细</h3>
<div class="flex items-center space-x-2">
<button class="bg-primary hover:bg-primary-600 text-white px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-plus mr-1 text-xs"></i>
新增
</button>
<button class="bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-download mr-1 text-xs"></i>
导出
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200 text-sm">
<thead class="bg-gray-50">
<tr>
<th class="px-4 py-2 text-left text-gray-500 font-medium">序号</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">作业类型</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">部门</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">作业人员</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">开始时间</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">结束时间</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">持续时长</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">作业数量</th>
<th class="px-4 py-2 text-left text-gray-500 font-medium">操作</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr class="table-row">
<td class="px-4 py-2">1</td>
<td class="px-4 py-2">招聘面试</td>
<td class="px-4 py-2">人力资源部/招聘组</td>
<td class="px-4 py-2">张明远</td>
<td class="px-4 py-2">2023-11-01 09:00</td>
<td class="px-4 py-2">2023-11-01 11:30</td>
<td class="px-4 py-2">2.5小时</td>
<td class="px-4 py-2">3人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">2</td>
<td class="px-4 py-2">培训组织</td>
<td class="px-4 py-2">人力资源部</td>
<td class="px-4 py-2">李思雨</td>
<td class="px-4 py-2">2023-11-02 14:00</td>
<td class="px-4 py-2">2023-11-02 17:00</td>
<td class="px-4 py-2">3小时</td>
<td class="px-4 py-2">1场</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">3</td>
<td class="px-4 py-2">绩效考核</td>
<td class="px-4 py-2">人力资源部/绩效组</td>
<td class="px-4 py-2">王建国</td>
<td class="px-4 py-2">2023-11-03 10:00</td>
<td class="px-4 py-2">2023-11-03 12:00</td>
<td class="px-4 py-2">2小时</td>
<td class="px-4 py-2">5人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">4</td>
<td class="px-4 py-2">薪酬核算</td>
<td class="px-4 py-2">人力资源部/薪酬组</td>
<td class="px-4 py-2">赵晓芳</td>
<td class="px-4 py-2">2023-11-05 09:00</td>
<td class="px-4 py-2">2023-11-05 18:00</td>
<td class="px-4 py-2">8小时</td>
<td class="px-4 py-2">128人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">5</td>
<td class="px-4 py-2">招聘面试</td>
<td class="px-4 py-2">人力资源部/招聘组</td>
<td class="px-4 py-2">张明远</td>
<td class="px-4 py-2">2023-11-08 09:30</td>
<td class="px-4 py-2">2023-11-08 12:00</td>
<td class="px-4 py-2">2.5小时</td>
<td class="px-4 py-2">4人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">6</td>
<td class="px-4 py-2">培训组织</td>
<td class="px-4 py-2">人力资源部</td>
<td class="px-4 py-2">李思雨</td>
<td class="px-4 py-2">2023-11-10 13:30</td>
<td class="px-4 py-2">2023-11-10 16:30</td>
<td class="px-4 py-2">3小时</td>
<td class="px-4 py-2">1场</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">7</td>
<td class="px-4 py-2">绩效考核</td>
<td class="px-4 py-2">人力资源部/绩效组</td>
<td class="px-4 py-2">王建国</td>
<td class="px-4 py-2">2023-11-12 09:00</td>
<td class="px-4 py-2">2023-11-12 11:30</td>
<td class="px-4 py-2">2.5小时</td>
<td class="px-4 py-2">6人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">8</td>
<td class="px-4 py-2">薪酬核算</td>
<td class="px-4 py-2">人力资源部/薪酬组</td>
<td class="px-4 py-2">赵晓芳</td>
<td class="px-4 py-2">2023-11-15 09:00</td>
<td class="px-4 py-2">2023-11-15 17:30</td>
<td class="px-4 py-2">8.5小时</td>
<td class="px-4 py-2">135人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">9</td>
<td class="px-4 py-2">招聘面试</td>
<td class="px-4 py-2">人力资源部/招聘组</td>
<td class="px-4 py-2">张明远</td>
<td class="px-4 py-2">2023-11-18 09:00</td>
<td class="px-4 py-2">2023-11-18 11:00</td>
<td class="px-4 py-2">2小时</td>
<td class="px-4 py-2">2人</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">10</td>
<td class="px-4 py-2">培训组织</td>
<td class="px-4 py-2">人力资源部</td>
<td class="px-4 py-2">李思雨</td>
<td class="px-4 py-2">2023-11-20 14:00</td>
<td class="px-4 py-2">2023-11-20 17:00</td>
<td class="px-4 py-2">3小时</td>
<td class="px-4 py-2">1场</td>
<td class="px-4 py-2">
<button class="text-primary hover:text-primary-600 mr-2">
<i class="fas fa-edit text-xs"></i>
</button>
<button class="text-red-500 hover:text-red-600">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="px-4 py-3 border-t flex items-center justify-between">
<div class="text-sm text-gray-600">
显示 <span class="font-medium">1</span><span class="font-medium">10</span> 条,共 <span class="font-medium">128</span> 条记录
</div>
<div class="flex space-x-1">
<button class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50 disabled:opacity-50" disabled>
上一页
</button>
<button class="px-3 py-1 border rounded-button text-sm bg-primary text-white hover:bg-primary-600">
1
</button>
<button class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">
2
</button>
<button class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">
3
</button>
<span class="px-3 py-1 text-sm">...</span>
<button class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">
13
</button>
<button class="px-3 py-1 border rounded-button text-sm text-gray-700 hover:bg-gray-50">
下一页
</button>
</div>
</div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="bg-gray-800 text-white py-8 w-full">
<div class="container mx-auto px-4">
<div class="grid grid-cols-4 gap-8">
<div>
<h4 class="text-sm font-semibold 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-semibold 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-semibold 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-semibold mb-4">联系我们</h4>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-start">
<i class="fas fa-map-marker-alt mr-2 mt-1 text-xs"></i>
<span>上海市浦东新区张江高科技园区科苑路88号</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt mr-2 text-xs"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope mr-2 text-xs"></i>
<span>hr@company.com</span>
</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">
<div class="text-xs text-gray-400 mb-4 md:mb-0">
© 2023 人力资源管理系统 版权所有
</div>
<div class="flex space-x-4">
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-weixin text-sm"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-weibo text-sm"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-linkedin-in text-sm"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-github text-sm"></i>
</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,444 @@
<!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>
<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>
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-pacifico {
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 15s linear infinite;
}
@keyframes scroll {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
</style>
</head>
<body class="min-h-[1024px] bg-secondary flex flex-col">
<!-- 顶部导航栏 -->
<!-- <header class="bg-primary text-white w-full h-16 shadow-md">
<div class="container mx-auto h-full px-6 flex items-center justify-between">
<div class="flex items-center">
<h1 class="font-pacifico text-2xl mr-10">人力</h1>
<nav class="hidden md:flex space-x-8">
<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-6">
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..." class="bg-white text-gray-800 text-sm rounded-button pl-4 pr-10 py-2 w-48 focus:outline-none">
<i class="fas fa-search absolute right-3 top-2.5 text-gray-500 text-sm"></i>
</div>
<button class="hidden md:flex items-center space-x-1 bg-blue-600 hover:bg-blue-700 text-white text-sm px-3 py-1.5 rounded-button transition">
<i class="fas fa-robot fa-icon w-4 h-4"></i>
<span>AI助手</span>
</button>
<div class="flex items-center space-x-2 cursor-pointer">
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center">
<i class="fas fa-user text-primary"></i>
</div>
<span class="text-sm hidden md:block">张明远</span>
</div>
</div>
</div>
</header> -->
<!-- 主要内容区 -->
<main class="flex-1 container mx-auto px-6 py-8 flex">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-6">
<div class="bg-white rounded-md shadow p-4 h-full">
<div class="flex justify-between items-center mb-4">
<h2 class="font-medium text-gray-800">组织架构</h2>
<button class="text-primary text-sm">
<i class="fas fa-sync-alt fa-icon w-4 h-4"></i>
</button>
</div>
<div class="space-y-1">
<div class="flex items-center justify-between py-1.5 px-2 bg-gray-100 rounded">
<div class="flex items-center">
<i class="fas fa-building fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">集团公司</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-500"></i>
</div>
<div class="pl-6 space-y-1">
<div class="flex items-center justify-between py-1.5 px-2 hover:bg-gray-50 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">技术中心</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-500"></i>
</div>
<div class="pl-6 space-y-1">
<div class="flex items-center py-1.5 px-2 hover:bg-gray-50 rounded">
<i class="fas fa-code-branch fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">前端开发部</span>
</div>
<div class="flex items-center py-1.5 px-2 hover:bg-gray-50 rounded">
<i class="fas fa-code-branch fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">后端开发部</span>
</div>
<div class="flex items-center py-1.5 px-2 hover:bg-gray-50 rounded">
<i class="fas fa-code-branch fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">测试部</span>
</div>
</div>
<div class="flex items-center justify-between py-1.5 px-2 hover:bg-gray-50 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">产品中心</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-500"></i>
</div>
<div class="flex items-center justify-between py-1.5 px-2 hover:bg-gray-50 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">市场部</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-500"></i>
</div>
<div class="flex items-center justify-between py-1.5 px-2 hover:bg-gray-50 rounded">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-600"></i>
<span class="text-sm">人力资源部</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-500"></i>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧审批详情 -->
<div class="w-4/5">
<div class="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>
<div class="flex space-x-3">
<button class="bg-primary hover:bg-blue-700 text-white text-sm px-4 py-2 rounded-button transition">
<i class="fas fa-check fa-icon w-4 h-4 mr-1"></i>
<span>同意</span>
</button>
<button class="bg-red-500 hover:bg-red-600 text-white text-sm px-4 py-2 rounded-button transition">
<i class="fas fa-times fa-icon w-4 h-4 mr-1"></i>
<span>拒绝</span>
</button>
<button class="border border-gray-300 hover:bg-gray-50 text-gray-700 text-sm px-4 py-2 rounded-button transition">
<i class="fas fa-print fa-icon w-4 h-4 mr-1"></i>
<span>打印</span>
</button>
</div>
</div>
<!-- 基本信息 -->
<div class="mb-8">
<h3 class="text-lg font-medium text-gray-800 mb-4 pb-2 border-b">基本信息</h3>
<div class="grid grid-cols-3 gap-6">
<div class="col-span-1">
<div class="flex flex-col items-center">
<div class="w-32 h-32 rounded-full bg-gray-200 mb-3 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=professional20asian20businessman20portrait20with20white20background20high20quality20photo20realistic20detailed20face20corporate20style20neutral20expression&width=300&height=300&orientation=squarish&flag=4bef40f432379c943d4dcedd922e3bf6"
alt="员工照片" class="w-full h-full object-cover">
</div>
<span class="text-sm text-gray-600">员工照片</span>
</div>
</div>
<div class="col-span-2">
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-sm text-gray-500 mb-1">员工姓名</p>
<p class="text-gray-800 font-medium">林志强</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">员工编号</p>
<p class="text-gray-800 font-medium">EMP20230085</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">原部门</p>
<p class="text-gray-800 font-medium">前端开发部</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">新部门</p>
<p class="text-gray-800 font-medium">产品设计部</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">原岗位</p>
<p class="text-gray-800 font-medium">高级前端工程师</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">新岗位</p>
<p class="text-gray-800 font-medium">产品设计师</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">异动类型</p>
<p class="text-gray-800 font-medium">部门调动</p>
</div>
<div>
<p class="text-sm text-gray-500 mb-1">异动时间</p>
<p class="text-gray-800 font-medium">2023-06-15</p>
</div>
<div class="col-span-2">
<p class="text-sm text-gray-500 mb-1">异动原因</p>
<p class="text-gray-800 font-medium">根据公司人才发展规划,结合员工个人职业发展意愿,经双方协商一致,同意调动。</p>
</div>
</div>
</div>
</div>
</div>
<!-- 证件信息 -->
<div class="mb-8">
<h3 class="text-lg font-medium text-gray-800 mb-4 pb-2 border-b">证件信息</h3>
<div class="grid grid-cols-2 gap-6">
<div>
<p class="text-sm text-gray-500 mb-2">身份证正面</p>
<div class="h-48 bg-gray-100 rounded-md overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=Chinese20ID20card20front20side20realistic20photo20white20background20high20resolution20detailed20text20and20portrait&width=600&height=400&orientation=landscape&flag=e6c18985431a6efddd63bff3f2e5a4e9"
alt="身份证正面" class="w-full h-full object-cover">
</div>
</div>
<div>
<p class="text-sm text-gray-500 mb-2">身份证反面</p>
<div class="h-48 bg-gray-100 rounded-md overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=Chinese20ID20card20back20side20realistic20photo20white20background20high20resolution20detailed20text20and20barcode&width=600&height=400&orientation=landscape&flag=2737ba49402a36d436de3b0671643607"
alt="身份证反面" class="w-full h-full object-cover">
</div>
</div>
</div>
</div>
<!-- 审批流程 -->
<div>
<h3 class="text-lg font-medium text-gray-800 mb-4 pb-2 border-b">审批流程</h3>
<div class="relative">
<!-- 时间轴 -->
<div class="absolute left-8 top-0 bottom-0 w-0.5 bg-gray-200"></div>
<!-- 流程节点 -->
<div class="space-y-8">
<!-- 提交申请 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-green-500 border-4 border-green-100"></div>
</div>
<div class="bg-green-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-green-800">提交申请</h4>
<span class="text-sm text-green-600">2023-06-05 09:30</span>
</div>
<p class="text-sm text-gray-700">申请人:林志强</p>
</div>
</div>
<!-- 部门经理审批 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-green-500 border-4 border-green-100"></div>
</div>
<div class="bg-green-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-green-800">部门经理审批</h4>
<span class="text-sm text-green-600">2023-06-05 14:15</span>
</div>
<p class="text-sm text-gray-700">审批人:王建国(前端开发部经理)</p>
<p class="text-sm text-gray-700 mt-1">审批意见:同意调动,该员工在产品设计方面有潜力。</p>
</div>
</div>
<!-- 技术总监审批 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-green-500 border-4 border-green-100"></div>
</div>
<div class="bg-green-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-green-800">技术总监审批</h4>
<span class="text-sm text-green-600">2023-06-06 10:45</span>
</div>
<p class="text-sm text-gray-700">审批人:张伟(技术中心总监)</p>
<p class="text-sm text-gray-700 mt-1">审批意见:同意,符合技术人才发展规划。</p>
</div>
</div>
<!-- HR审批 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-green-500 border-4 border-green-100"></div>
</div>
<div class="bg-green-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-green-800">HR审批</h4>
<span class="text-sm text-green-600">2023-06-07 11:20</span>
</div>
<p class="text-sm text-gray-700">审批人:李芳(人力资源部经理)</p>
<p class="text-sm text-gray-700 mt-1">审批意见:已核实相关情况,同意调动。</p>
</div>
</div>
<!-- 总经理审批 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-green-500 border-4 border-green-100"></div>
</div>
<div class="bg-green-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-green-800">总经理审批</h4>
<span class="text-sm text-green-600">2023-06-08 16:30</span>
</div>
<p class="text-sm text-gray-700">审批人:陈明(总经理)</p>
<p class="text-sm text-gray-700 mt-1">审批意见:同意执行。</p>
</div>
</div>
<!-- 入职生效 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-blue-500 border-4 border-blue-100"></div>
</div>
<div class="bg-blue-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-blue-800">入职生效</h4>
<span class="text-sm text-blue-600">待处理</span>
</div>
<p class="text-sm text-gray-700">计划生效日期2023-06-15</p>
</div>
</div>
<!-- 审批完结 -->
<div class="relative pl-16">
<div class="absolute left-0 top-0 w-16 flex justify-center">
<div class="w-4 h-4 rounded-full bg-gray-300 border-4 border-gray-100"></div>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex justify-between items-center mb-2">
<h4 class="font-medium text-gray-800">审批完结</h4>
<span class="text-sm text-gray-500">未开始</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 底部通栏 -->
<footer class="bg-gray-800 text-white w-full py-8">
<div class="container mx-auto px-6">
<div class="grid grid-cols-4 gap-8">
<div>
<h3 class="text-sm font-medium mb-4">关于我们</h3>
<ul class="space-y-2">
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">公司简介</a></li>
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">发展历程</a></li>
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">企业文化</a></li>
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">管理团队</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">产品服务</h3>
<ul class="space-y-2">
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">人力资源系统</a></li>
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">薪酬管理系统</a></li>
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">绩效考核系统</a></li>
<li><a href="#" class="text-xs text-gray-400 hover:text-white transition">培训发展平台</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">联系我们</h3>
<ul class="space-y-2">
<li class="text-xs text-gray-400">电话400-888-8888</li>
<li class="text-xs text-gray-400">邮箱service@hrsystem.com</li>
<li class="text-xs text-gray-400">地址北京市海淀区科技园路88号</li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">关注我们</h3>
<div class="flex space-x-4">
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary transition">
<i class="fab fa-weixin fa-icon w-4 h-4"></i>
</a>
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary transition">
<i class="fab fa-weibo fa-icon w-4 h-4"></i>
</a>
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-primary transition">
<i class="fab fa-linkedin-in fa-icon w-4 h-4"></i>
</a>
</div>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-center">
<p class="text-xs text-gray-500">© 2023 人力资源管理系统 版权所有 京ICP备12345678号</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,581 @@
<!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 {
transition: all 0.3s ease;
}
.tree-item:hover {
background-color: rgba(45, 92, 246, 0.1);
}
.scroll-container {
scrollbar-width: thin;
scrollbar-color: #2D5CF6 #F5F6FA;
}
.scroll-container::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.scroll-container::-webkit-scrollbar-track {
background: #F5F6FA;
}
.scroll-container::-webkit-scrollbar-thumb {
background-color: #2D5CF6;
border-radius: 20px;
}
.marquee {
animation: marquee 20s linear infinite;
}
@keyframes marquee {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
.dropdown:hover .dropdown-menu {
display: block;
}
i.fa-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
}
</style>
</head>
<body class="min-h-[1024px] bg-secondary font-sans text-gray-800">
<!-- 顶部导航栏 -->
<!-- <header class="w-full bg-primary text-white shadow-md">
<div class="container mx-auto px-6 h-16 flex items-center justify-between">
<div class="flex items-center space-x-8">
<a href="#" class="text-xl font-['Pacifico']">人力</a>
<nav class="hidden md:flex space-x-6 text-sm">
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">多维统计</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">人员管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">组织管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">考勤管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">绩效管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">薪酬管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">知识库</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button">后台管理</a>
</nav>
</div>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..." class="bg-white/20 border-none text-white placeholder-white/70 rounded-button pl-8 pr-4 py-1 text-sm w-40 focus:w-60 transition-all duration-300 focus:outline-none">
<i class="fas fa-search fa-icon absolute left-2 top-1/2 transform -translate-y-1/2 text-white/70"></i>
</div>
<div class="relative group">
<div class="flex items-center space-x-2 cursor-pointer">
<div class="w-8 h-8 rounded-full bg-white/20 flex items-center justify-center">
<i class="fas fa-user fa-icon text-white"></i>
</div>
<span class="text-sm">张明远</span>
</div>
<div class="absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg z-10 hidden group-hover:block">
<div class="py-1">
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">个人中心</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">系统设置</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">退出登录</a>
</div>
</div>
</div>
<button class="bg-white text-primary rounded-button px-3 py-1 text-sm flex items-center space-x-1 hover:bg-white/90">
<i class="fas fa-robot fa-icon"></i>
<span>AI助手</span>
</button>
</div>
</div>
</header> -->
<!-- 公告栏 -->
<div class="bg-white border-b border-gray-200">
<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-button mr-3 whitespace-nowrap">最新公告</span>
<div class="overflow-hidden">
<div class="marquee whitespace-nowrap">
<span class="text-sm mr-8">系统将于2023年12月15日00:00-06:00进行升级维护</span>
<span class="text-sm mr-8">2023年度绩效考核工作已启动请各部门按时完成</span>
<span class="text-sm mr-8">新员工入职培训将于本周五下午2点在3楼会议室举行</span>
</div>
</div>
</div>
</div>
</div>
<!-- 主内容区 -->
<main class="container mx-auto px-6 py-8">
<div class="flex justify-between items-center mb-6">
<h1 class="text-2xl font-bold text-gray-800">数据字典管理</h1>
<div class="flex space-x-3">
<button class="bg-primary text-white rounded-button px-4 py-2 text-sm flex items-center space-x-1 hover:bg-primary/90">
<i class="fas fa-plus fa-icon"></i>
<span>新增元数据域</span>
</button>
<button class="bg-white border border-gray-300 rounded-button px-4 py-2 text-sm flex items-center space-x-1 hover:bg-gray-50">
<i class="fas fa-download fa-icon"></i>
<span>导出配置</span>
</button>
</div>
</div>
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<div class="flex border-b border-gray-200">
<div class="w-1/4 border-r border-gray-200">
<div class="p-4 border-b border-gray-200">
<div class="relative">
<input type="text" placeholder="搜索元数据域..." class="w-full border border-gray-300 rounded-button pl-8 pr-4 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<i class="fas fa-search fa-icon absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
</div>
</div>
<div class="h-[600px] overflow-y-auto scroll-container">
<div class="p-2">
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center justify-between">
<div class="flex items-center space-x-2">
<i class="fas fa-folder fa-icon text-yellow-500"></i>
<span>基础信息</span>
</div>
<i class="fas fa-chevron-down fa-icon text-gray-500"></i>
</div>
<div class="ml-6 mt-1">
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-id-card fa-icon text-blue-500"></i>
<span>员工编号</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-user fa-icon text-blue-500"></i>
<span>姓名</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-venus-mars fa-icon text-blue-500"></i>
<span>性别</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-birthday-cake fa-icon text-blue-500"></i>
<span>出生日期</span>
</div>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center justify-between mt-2">
<div class="flex items-center space-x-2">
<i class="fas fa-folder fa-icon text-yellow-500"></i>
<span>技术职务</span>
</div>
<i class="fas fa-chevron-right fa-icon text-gray-500"></i>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center justify-between mt-2">
<div class="flex items-center space-x-2">
<i class="fas fa-folder fa-icon text-yellow-500"></i>
<span>行政职务</span>
</div>
<i class="fas fa-chevron-down fa-icon text-gray-500"></i>
</div>
<div class="ml-6 mt-1">
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-sitemap fa-icon text-blue-500"></i>
<span>行政级别</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-money-bill-wave fa-icon text-blue-500"></i>
<span>级别待遇</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center space-x-2">
<i class="fas fa-calendar-alt fa-icon text-blue-500"></i>
<span>任职时间</span>
</div>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center justify-between mt-2">
<div class="flex items-center space-x-2">
<i class="fas fa-folder fa-icon text-yellow-500"></i>
<span>联系方式</span>
</div>
<i class="fas fa-chevron-right fa-icon text-gray-500"></i>
</div>
<div class="tree-item cursor-pointer p-2 rounded-button flex items-center justify-between mt-2">
<div class="flex items-center space-x-2">
<i class="fas fa-folder fa-icon text-yellow-500"></i>
<span>其他信息</span>
</div>
<i class="fas fa-chevron-right fa-icon text-gray-500"></i>
</div>
</div>
</div>
</div>
<div class="w-3/4">
<div class="p-4 border-b border-gray-200 flex justify-between items-center">
<h2 class="text-lg font-semibold">行政职务 - 属性配置</h2>
<button class="bg-primary text-white rounded-button px-3 py-1 text-sm flex items-center space-x-1 hover:bg-primary/90">
<i class="fas fa-plus fa-icon"></i>
<span>新增属性</span>
</button>
</div>
<div class="h-[600px] overflow-y-auto scroll-container">
<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>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">admin_level</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">
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-button text-xs">列表</span>
</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-button text-xs"></span>
</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">
<button class="text-primary hover:text-primary/80 mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">level_benefit</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">
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-button text-xs">列表</span>
</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-button text-xs"></span>
</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">
<button class="text-primary hover:text-primary/80 mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">appointment_date</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">
<span class="px-2 py-1 bg-purple-100 text-purple-800 rounded-button text-xs">日期</span>
</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-button text-xs"></span>
</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">
<button class="text-primary hover:text-primary/80 mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">department</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">
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-button text-xs">列表</span>
</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-button text-xs"></span>
</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">
<button class="text-primary hover:text-primary/80 mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">job_title</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">
<span class="px-2 py-1 bg-indigo-100 text-indigo-800 rounded-button text-xs">文本</span>
</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-button text-xs"></span>
</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">
<button class="text-primary hover:text-primary/80 mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">is_leader</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">
<span class="px-2 py-1 bg-pink-100 text-pink-800 rounded-button text-xs">布尔</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 py-1 bg-gray-100 text-gray-800 rounded-button text-xs"></span>
</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">
<button class="text-primary hover:text-primary/80 mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 列表数据配置弹窗 -->
<div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden" id="listConfigModal">
<div class="bg-white rounded-lg shadow-xl w-1/2 max-h-[80vh] overflow-hidden">
<div class="px-6 py-4 border-b border-gray-200 flex justify-between items-center">
<h3 class="text-lg font-semibold">列表数据配置 - 行政级别</h3>
<button onclick="document.getElementById('listConfigModal').classList.add('hidden')" class="text-gray-400 hover:text-gray-500">
<i class="fas fa-times fa-icon"></i>
</button>
</div>
<div class="p-6 overflow-y-auto h-[60vh]">
<div class="mb-6">
<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 id="staticData" name="dataSource" type="radio" class="h-4 w-4 text-primary focus:ring-primary border-gray-300" checked>
<label for="staticData" class="ml-2 block text-sm text-gray-700">静态数据</label>
</div>
<div class="flex items-center">
<input id="apiData" name="dataSource" type="radio" class="h-4 w-4 text-primary focus:ring-primary border-gray-300">
<label for="apiData" class="ml-2 block text-sm text-gray-700">API接口</label>
</div>
<div class="flex items-center">
<input id="functionData" name="dataSource" type="radio" class="h-4 w-4 text-primary focus:ring-primary border-gray-300">
<label for="functionData" class="ml-2 block text-sm text-gray-700">回调函数</label>
</div>
</div>
</div>
<div id="staticDataConfig">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">数据项</label>
<div class="bg-gray-50 rounded-lg p-4">
<div class="flex items-center justify-between mb-2">
<span class="text-sm font-medium">数据项列表</span>
<button class="text-primary text-sm flex items-center">
<i class="fas fa-plus fa-icon mr-1"></i>
<span>添加项</span>
</button>
</div>
<div class="space-y-2">
<div class="flex items-center space-x-2">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="1级">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="1">
<button class="text-red-500">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</div>
<div class="flex items-center space-x-2">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="2级">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="2">
<button class="text-red-500">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</div>
<div class="flex items-center space-x-2">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="3级">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="3">
<button class="text-red-500">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</div>
<div class="flex items-center space-x-2">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="4级">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" value="4">
<button class="text-red-500">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<div id="apiDataConfig" class="hidden">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">API地址</label>
<input type="text" class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" placeholder="请输入API地址">
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">请求方法</label>
<select class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>GET</option>
<option>POST</option>
<option>PUT</option>
<option>DELETE</option>
</select>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">请求参数</label>
<div class="bg-gray-50 rounded-lg p-4">
<div class="flex items-center justify-between mb-2">
<span class="text-sm font-medium">参数列表</span>
<button class="text-primary text-sm flex items-center">
<i class="fas fa-plus fa-icon mr-1"></i>
<span>添加参数</span>
</button>
</div>
<div class="space-y-2">
<div class="flex items-center space-x-2">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" placeholder="参数名">
<input type="text" class="flex-1 border border-gray-300 rounded-button px-3 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" placeholder="参数值">
<button class="text-red-500">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<div id="functionDataConfig" class="hidden">
<div class="mb-4">
<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-1 focus:ring-primary focus:border-primary" placeholder="请输入函数名称">
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">函数代码</label>
<textarea class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm font-mono h-40 focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary" placeholder="// 请在此处编写回调函数代码"></textarea>
</div>
</div>
</div>
<div class="px-6 py-4 border-t border-gray-200 flex justify-end space-x-3">
<button onclick="document.getElementById('listConfigModal').classList.add('hidden')" class="bg-white border border-gray-300 rounded-button px-4 py-2 text-sm hover:bg-gray-50">取消</button>
<button class="bg-primary text-white rounded-button px-4 py-2 text-sm hover:bg-primary/90">保存配置</button>
</div>
</div>
</div>
</main>
<!-- 底部区域 -->
<footer class="w-full bg-gray-800 text-white mt-auto">
<div class="container mx-auto px-6 py-8">
<div class="grid grid-cols-4 gap-8">
<div>
<h3 class="text-sm font-semibold uppercase tracking-wider 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-sm font-semibold uppercase tracking-wider 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-sm font-semibold uppercase tracking-wider 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-sm font-semibold uppercase tracking-wider mb-4">联系我们</h3>
<ul class="space-y-2 text-sm">
<li class="flex items-start">
<i class="fas fa-map-marker-alt fa-icon mt-1 mr-2"></i>
<span>北京市海淀区中关村软件园2号楼A座3层</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt fa-icon mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon mr-2"></i>
<span>service@hrsystem.com</span>
</li>
</ul>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-700 flex justify-between items-center">
<div class="text-sm">
© 2023 人力资源管理系统. 保留所有权利.
</div>
<div class="flex space-x-6">
<a href="#" class="hover:text-gray-300">
<i class="fab fa-weixin fa-icon"></i>
</a>
<a href="#" class="hover:text-gray-300">
<i class="fab fa-weibo fa-icon"></i>
</a>
<a href="#" class="hover:text-gray-300">
<i class="fab fa-linkedin fa-icon"></i>
</a>
<a href="#" class="hover:text-gray-300">
<i class="fab fa-github fa-icon"></i>
</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,400 @@
<!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 href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<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>
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
.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(-100%); }
}
.card-hover:hover {
transform: translateY(-4px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body class="min-h-[1024px] flex flex-col bg-secondary">
<!-- 顶部导航栏 -->
<!-- <header class="w-full bg-primary text-white shadow-md">
<div class="container mx-auto px-6 h-[60px] flex items-center justify-between">
<div class="flex items-center space-x-8">
<a href="#" class="text-2xl font-['Pacifico']">人力</a>
<nav class="hidden md:flex space-x-6">
<a href="#" class="text-sm hover:opacity-80">多维统计</a>
<a href="#" class="text-sm hover:opacity-80">人员管理</a>
<a href="#" class="text-sm hover:opacity-80">组织管理</a>
<a href="#" class="text-sm hover:opacity-80">考勤管理</a>
<a href="#" class="text-sm hover:opacity-80">绩效管理</a>
<a href="#" class="text-sm hover:opacity-80">薪酬管理</a>
<a href="#" class="text-sm font-semibold hover:opacity-80">知识库</a>
<a href="#" class="text-sm hover:opacity-80">后台管理</a>
</nav>
</div>
<div class="flex items-center space-x-4">
<div class="relative hidden md:block">
<input type="text" placeholder="搜索..." class="py-1 pl-8 pr-4 text-sm rounded-button bg-white bg-opacity-20 placeholder-white focus:outline-none focus:ring-1 focus:ring-white">
<i class="fas fa-search fa-icon text-sm absolute left-2 top-1/2 transform -translate-y-1/2"></i>
</div>
<button class="flex items-center space-x-1 bg-white bg-opacity-20 px-3 py-1 rounded-button hover:bg-opacity-30">
<i class="fas fa-robot fa-icon text-sm"></i>
<span class="text-sm whitespace-nowrap">AI 助手</span>
</button>
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=professional20business20profile20photo20of20a20young20asian20female20executive20with20short20hair20wearing20formal20attire20against20a20neutral20light20gray20background&width=80&height=80&orientation=squarish&flag=7fe686c57027aca4551bef56744d5fdf" alt="用户头像" class="w-full h-full object-cover">
</div>
</div>
</div>
</header> -->
<!-- 主内容区域 -->
<main class="flex-1 container mx-auto px-6 py-8">
<!-- 面包屑导航 -->
<!-- <div class="flex items-center text-sm text-gray-600 mb-4">
<a href="#" class="hover:text-primary">首页</a>
<i class="fas fa-chevron-right fa-icon mx-2 text-xs"></i>
<span>知识库</span>
</div> -->
<!-- 页面标题和操作区 -->
<div class="flex justify-between items-center mb-6">
<h1 class="text-2xl font-bold text-gray-800">知识库管理</h1>
<div class="flex space-x-3">
<div class="relative">
<input type="text" placeholder="搜索知识..." class="py-2 pl-10 pr-4 text-sm rounded-button border border-gray-300 focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<i class="fas fa-search fa-icon text-gray-400 absolute left-3 top-1/2 transform -translate-y-1/2"></i>
</div>
<button class="bg-primary text-white px-4 py-2 rounded-button hover:bg-opacity-90 flex items-center space-x-2">
<i class="fas fa-plus fa-icon text-sm"></i>
<span class="whitespace-nowrap">新建知识</span>
</button>
</div>
</div>
<!-- 公告栏 -->
<div class="bg-white rounded-md shadow-sm p-3 mb-6">
<div class="flex items-center">
<div class="bg-yellow-100 text-yellow-800 px-2 py-1 rounded-button text-xs font-medium mr-3">公告</div>
<div class="scroll-container w-full">
<div class="scroll-content text-sm text-gray-700">
<span class="mr-8">系统将于 2023 年 12 月 15 日 00:00 - 02:00 进行维护升级</span>
<span class="mr-8">新员工入职指南已更新,请及时查阅</span>
<span class="mr-8">2023 年度绩效考核标准已发布</span>
<span class="mr-8">系统将于 2023 年 12 月 15 日 00:00 - 02:00 进行维护升级</span>
</div>
</div>
</div>
</div>
<!-- 分类筛选 -->
<div class="flex items-center space-x-4 mb-6 overflow-x-auto pb-2">
<button class="px-4 py-2 bg-primary text-white rounded-button whitespace-nowrap">全部</button>
<button class="px-4 py-2 bg-white border border-gray-200 rounded-button hover:bg-gray-50 whitespace-nowrap">政策制度</button>
<button class="px-4 py-2 bg-white border border-gray-200 rounded-button hover:bg-gray-50 whitespace-nowrap">操作手册</button>
<button class="px-4 py-2 bg-white border border-gray-200 rounded-button hover:bg-gray-50 whitespace-nowrap">培训资料</button>
<button class="px-4 py-2 bg-white border border-gray-200 rounded-button hover:bg-gray-50 whitespace-nowrap">常见问题</button>
<button class="px-4 py-2 bg-white border border-gray-200 rounded-button hover:bg-gray-50 whitespace-nowrap">模板下载</button>
</div>
<!-- 知识卡片列表 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
<!-- 卡片1 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden transition-all duration-300 card-hover">
<div class="h-40 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=a20modern20business20document20with20clean20design20and20minimalist20layout20on20a20white20desk20with20a20pen20and20coffee20cup20in20the20background&width=400&height=200&orientation=landscape&flag=1e4cf2beacde2cc80fc63a0f89a9703a" alt="文档封面" class="w-full h-full object-cover">
</div>
<div class="p-4">
<div class="flex justify-between items-start mb-2">
<h3 class="font-medium text-gray-800">2023 年员工手册</h3>
<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded-button">政策制度</span>
</div>
<p class="text-sm text-gray-600 mb-3 line-clamp-2">包含公司文化、行为规范、考勤制度、福利政策等最新修订版员工手册,适用于全体员工。</p>
<div class="flex justify-between items-center text-xs text-gray-500">
<span>更新于 2023-11-20</span>
<span>下载 128 次</span>
</div>
<div class="mt-3 flex space-x-2">
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-eye fa-icon mr-1"></i> 预览
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-download fa-icon mr-1"></i> 下载
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-share-alt fa-icon mr-1"></i> 分享
</button>
</div>
</div>
</div>
<!-- 卡片2 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden transition-all duration-300 card-hover">
<div class="h-40 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=a20step20by20step20illustration20of20HR20software20interface20with20clear20numbering20and20annotations20on20a20light20gray20background&width=400&height=200&orientation=landscape&flag=108451af3b1eb2058f31b710d4071080" alt="操作手册封面" class="w-full h-full object-cover">
</div>
<div class="p-4">
<div class="flex justify-between items-start mb-2">
<h3 class="font-medium text-gray-800">考勤系统操作指南</h3>
<span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded-button">操作手册</span>
</div>
<p class="text-sm text-gray-600 mb-3 line-clamp-2">详细说明如何使用公司考勤系统,包括打卡、请假申请、加班申请、考勤异常处理等操作步骤。</p>
<div class="flex justify-between items-center text-xs text-gray-500">
<span>更新于 2023-10-15</span>
<span>下载 256 次</span>
</div>
<div class="mt-3 flex space-x-2">
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-eye fa-icon mr-1"></i> 预览
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-download fa-icon mr-1"></i> 下载
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-share-alt fa-icon mr-1"></i> 分享
</button>
</div>
</div>
</div>
<!-- 卡片3 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden transition-all duration-300 card-hover">
<div class="h-40 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=a20professional20training20presentation20slide20with20bullet20points20and20infographics20on20a20projector20screen20in20a20meeting20room&width=400&height=200&orientation=landscape&flag=91a52e2f3cc2550ca2a643ea105f2d4b" alt="培训资料封面" class="w-full h-full object-cover">
</div>
<div class="p-4">
<div class="flex justify-between items-start mb-2">
<h3 class="font-medium text-gray-800">新员工入职培训</h3>
<span class="bg-purple-100 text-purple-800 text-xs px-2 py-1 rounded-button">培训资料</span>
</div>
<p class="text-sm text-gray-600 mb-3 line-clamp-2">新员工入职培训全套资料,包含公司介绍、部门职能、产品知识、安全规范等内容。</p>
<div class="flex justify-between items-center text-xs text-gray-500">
<span>更新于 2023-09-28</span>
<span>下载 189 次</span>
</div>
<div class="mt-3 flex space-x-2">
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-eye fa-icon mr-1"></i> 预览
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-download fa-icon mr-1"></i> 下载
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-share-alt fa-icon mr-1"></i> 分享
</button>
</div>
</div>
</div>
<!-- 卡片4 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden transition-all duration-300 card-hover">
<div class="h-40 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=a20frequently20asked20questions20list20with20question20marks20and20answers20in20a20modern20digital20interface20design&width=400&height=200&orientation=landscape&flag=923ef06f9362683938111ad04bb8643c" alt="FAQ封面" class="w-full h-full object-cover">
</div>
<div class="p-4">
<div class="flex justify-between items-start mb-2">
<h3 class="font-medium text-gray-800">HR 系统常见问题</h3>
<span class="bg-orange-100 text-orange-800 text-xs px-2 py-1 rounded-button">常见问题</span>
</div>
<p class="text-sm text-gray-600 mb-3 line-clamp-2">整理了员工在使用 HR 系统过程中遇到的常见问题及解决方案,持续更新中。</p>
<div class="flex justify-between items-center text-xs text-gray-500">
<span>更新于 2023-11-05</span>
<span>浏览 342 次</span>
</div>
<div class="mt-3 flex space-x-2">
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-eye fa-icon mr-1"></i> 查看
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-bookmark fa-icon mr-1"></i> 收藏
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-share-alt fa-icon mr-1"></i> 分享
</button>
</div>
</div>
</div>
<!-- 卡片5 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden transition-all duration-300 card-hover">
<div class="h-40 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=a20collection20of20office20document20templates20including20forms20and20contracts20neatly20stacked20on20a20desk20with20a20laptop&width=400&height=200&orientation=landscape&flag=2a11c867bb72b869508c9cbccb7f198c" alt="模板封面" class="w-full h-full object-cover">
</div>
<div class="p-4">
<div class="flex justify-between items-start mb-2">
<h3 class="font-medium text-gray-800">人力资源常用模板</h3>
<span class="bg-red-100 text-red-800 text-xs px-2 py-1 rounded-button">模板下载</span>
</div>
<p class="text-sm text-gray-600 mb-3 line-clamp-2">包含劳动合同、离职申请表、转正申请表、调岗申请表等常用人力资源表格模板。</p>
<div class="flex justify-between items-center text-xs text-gray-500">
<span>更新于 2023-08-12</span>
<span>下载 421 次</span>
</div>
<div class="mt-3 flex space-x-2">
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-eye fa-icon mr-1"></i> 预览
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-download fa-icon mr-1"></i> 下载
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-share-alt fa-icon mr-1"></i> 分享
</button>
</div>
</div>
</div>
<!-- 卡片6 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden transition-all duration-300 card-hover">
<div class="h-40 overflow-hidden">
<img src="https://mastergo.com/ai/api/search-image?query=a20performance20management20framework20diagram20with20key20metrics20and20evaluation20criteria20presented20in20a20modern20corporate20style&width=400&height=200&orientation=landscape&flag=72c9f106f07f07f22208f2c8edfd99fb" alt="绩效封面" class="w-full h-full object-cover">
</div>
<div class="p-4">
<div class="flex justify-between items-start mb-2">
<h3 class="font-medium text-gray-800">绩效考核标准与流程</h3>
<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded-button">政策制度</span>
</div>
<p class="text-sm text-gray-600 mb-3 line-clamp-2">详细说明公司绩效考核的标准、流程、时间节点及评分细则,适用于管理人员参考。</p>
<div class="flex justify-between items-center text-xs text-gray-500">
<span>更新于 2023-07-30</span>
<span>下载 178 次</span>
</div>
<div class="mt-3 flex space-x-2">
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-eye fa-icon mr-1"></i> 预览
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-download fa-icon mr-1"></i> 下载
</button>
<button class="text-primary hover:text-primary-dark text-sm flex items-center">
<i class="fas fa-share-alt fa-icon mr-1"></i> 分享
</button>
</div>
</div>
</div>
</div>
<!-- 分页 -->
<div class="flex justify-center mt-8">
<nav class="inline-flex rounded-md shadow-sm">
<button class="px-3 py-1 rounded-l-md border border-gray-300 bg-white text-gray-700 hover:bg-gray-50">
<i class="fas fa-chevron-left fa-icon"></i>
</button>
<button class="px-3 py-1 border-t border-b border-gray-300 bg-primary text-white">1</button>
<button class="px-3 py-1 border-t border-b border-gray-300 bg-white text-gray-700 hover:bg-gray-50">2</button>
<button class="px-3 py-1 border-t border-b border-gray-300 bg-white text-gray-700 hover:bg-gray-50">3</button>
<button class="px-3 py-1 border-t border-b border-gray-300 bg-white text-gray-700 hover:bg-gray-50">4</button>
<button class="px-3 py-1 border-t border-b border-gray-300 bg-white text-gray-700 hover:bg-gray-50">5</button>
<button class="px-3 py-1 rounded-r-md border border-gray-300 bg-white text-gray-700 hover:bg-gray-50">
<i class="fas fa-chevron-right fa-icon"></i>
</button>
</nav>
</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 mb-6">
<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">公司简介</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-lg font-medium mb-4">帮助中心</h3>
<ul class="space-y-2 text-sm 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-lg font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-sm text-gray-300">
<li><i class="fas fa-map-marker-alt fa-icon mr-2"></i> 北京市海淀区中关村南大街5号</li>
<li><i class="fas fa-phone fa-icon mr-2"></i> 400-888-8888</li>
<li><i class="fas fa-envelope fa-icon mr-2"></i> hr@company.com</li>
<li><i class="fas fa-clock fa-icon mr-2"></i> 周一至周五 9:00-18:00</li>
</ul>
</div>
<div>
<h3 class="text-lg font-medium mb-4">关注我们</h3>
<div class="flex space-x-4 mb-4">
<a href="#" class="w-8 h-8 bg-gray-700 rounded-full flex items-center justify-center hover:bg-primary">
<i class="fab fa-weixin fa-icon"></i>
</a>
<a href="#" class="w-8 h-8 bg-gray-700 rounded-full flex items-center justify-center hover:bg-primary">
<i class="fab fa-weibo fa-icon"></i>
</a>
<a href="#" class="w-8 h-8 bg-gray-700 rounded-full flex items-center justify-center hover:bg-primary">
<i class="fab fa-linkedin-in fa-icon"></i>
</a>
<a href="#" class="w-8 h-8 bg-gray-700 rounded-full flex items-center justify-center hover:bg-primary">
<i class="fab fa-github fa-icon"></i>
</a>
</div>
<p class="text-sm text-gray-300">订阅我们的新闻通讯</p>
<div class="mt-2 flex">
<input type="email" placeholder="您的邮箱" class="py-2 px-3 text-sm rounded-l-md border-none focus:outline-none focus:ring-1 focus:ring-primary w-full">
<button class="bg-primary text-white px-3 py-2 rounded-r-md hover:bg-opacity-90">
<i class="fas fa-paper-plane fa-icon"></i>
</button>
</div>
</div>
</div>
<div class="pt-6 border-t border-gray-700 text-center text-sm text-gray-400">
<p>© 2023 人力管理系统 版权所有 | 京ICP备12345678号-1 | 京公网安备11010802012345号</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,510 @@
<!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;
}
.org-node {
transition: all 0.3s ease;
}
.org-node:hover {
transform: translateY(-2px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.marquee {
animation: marquee 20s linear infinite;
}
@keyframes marquee {
0% {
transform: translateX(100%);
}
100% {
transform: translateX(-100%);
}
}
</style>
</head>
<body class="bg-gray-50 min-h-[1024px] flex flex-col">
<!-- 顶部导航栏 -->
<!-- <header class="bg-primary text-white shadow-md fixed top-0 left-0 right-0 z-50">
<div class="container mx-auto px-4 h-16 flex items-center justify-between">
<div class="flex items-center">
<div class="font-logo text-2xl mr-10">人力</div>
<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 text-sm rounded-button pl-3 pr-8 py-1 w-40 focus:outline-none focus:ring-2 focus:ring-blue-300">
<i
class="fas fa-search absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 fa-icon w-4 h-4"></i>
</div>
<div class="relative">
<img src="https://mastergo.com/ai/api/search-image?query=professional20asian20business20woman20portrait20with20white20background20high20quality20photorealistic20detailed20facial20features20corporate20attire&width=40&height=40&orientation=squarish&flag=eb8362eb2348067d24cec632e6a759b0"
alt="用户头像" class="w-8 h-8 rounded-full object-cover cursor-pointer">
</div>
<button
class="bg-white text-primary text-sm px-3 py-1 rounded-button flex items-center space-x-1 hover:bg-gray-100 transition">
<i class="fas fa-robot fa-icon w-4 h-4"></i>
<span>AI助手</span>
</button>
<button class="md:hidden text-white">
<i class="fas fa-bars fa-icon w-6 h-6"></i>
</button>
</div>
</div>
</header> -->
<!-- 主要内容区 -->
<main class="flex-grow container mx-auto px-4 mb-8">
<!-- 公告栏 -->
<div class="bg-white rounded-md shadow-sm p-3 mb-6 overflow-hidden">
<div class="flex items-center">
<div
class="bg-yellow-100 text-yellow-800 rounded-md px-2 py-1 text-xs font-medium mr-3 whitespace-nowrap">
<i class="fas fa-bullhorn fa-icon w-3 h-3 mr-1"></i>
公告
</div>
<div class="overflow-hidden">
<div class="marquee whitespace-nowrap">
<span class="text-sm mr-8">2023年度绩效考核方案已发布请各部门负责人及时查阅</span>
<span class="text-sm mr-8">系统将于2023年12月25日00:00-06:00进行升级维护</span>
<span class="text-sm mr-8">新员工入职培训计划已更新,请相关人员注意查收邮件</span>
<span class="text-sm">年度优秀员工评选活动正式启动,详情请见内网公告</span>
</div>
</div>
</div>
</div>
<!-- 内容主体 -->
<div class="flex flex-col md:flex-row gap-6">
<!-- 左侧组织架构树 -->
<div class="w-full md:w-1/5 bg-white rounded-md shadow-sm p-4">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-medium">组织架构</h2>
<button class="text-primary text-sm">
<i class="fas fa-sync-alt fa-icon w-4 h-4"></i>
</button>
</div>
<div class="space-y-1">
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer flex items-center justify-between">
<div class="flex items-center">
<i class="fas fa-building fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">集团公司</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-400"></i>
</div>
<div class="ml-6 space-y-1">
<div
class="org-node bg-secondary p-2 rounded-md cursor-pointer flex items-center justify-between">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">行政中心</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-400"></i>
</div>
<div class="ml-6 space-y-1">
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-users fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">人力资源部</span>
</div>
</div>
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-file-invoice-dollar fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">财务部</span>
</div>
</div>
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-laptop fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">IT部</span>
</div>
</div>
</div>
<div
class="org-node bg-secondary p-2 rounded-md cursor-pointer flex items-center justify-between">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">营销中心</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-400"></i>
</div>
<div class="ml-6 space-y-1">
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-chart-line fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">市场部</span>
</div>
</div>
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-shopping-cart fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">销售部</span>
</div>
</div>
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-headset fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">客户服务部</span>
</div>
</div>
</div>
<div
class="org-node bg-secondary p-2 rounded-md cursor-pointer flex items-center justify-between">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">研发中心</span>
</div>
<i class="fas fa-chevron-down fa-icon w-3 h-3 text-gray-400"></i>
</div>
<div class="ml-6 space-y-1">
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-code fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">前端开发部</span>
</div>
</div>
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-database fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">后端开发部</span>
</div>
</div>
<div class="org-node bg-secondary p-2 rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-mobile-alt fa-icon w-4 h-4 mr-2 text-gray-500"></i>
<span class="text-sm">移动开发部</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧内容区 -->
<div class="w-full md:w-4/5">
<!-- 筛选区域 -->
<div class="bg-white rounded-md shadow-sm p-4 mb-6">
<div class="flex items-center justify-between">
<h2 class="text-lg font-medium">组织架构详情</h2>
<div class="flex items-center space-x-4">
<div class="flex items-center">
<span class="text-sm text-gray-600 mr-2">年份:</span>
<div class="relative">
<button
class="bg-secondary text-gray-700 text-sm px-3 py-1 rounded-button flex items-center space-x-1">
<span>2023</span>
<i class="fas fa-chevron-down fa-icon w-3 h-3"></i>
</button>
</div>
</div>
<button
class="bg-primary text-white text-sm px-3 py-1 rounded-button flex items-center space-x-1 hover:bg-blue-600 transition">
<i class="fas fa-download fa-icon w-4 h-4"></i>
<span>导出</span>
</button>
</div>
</div>
</div>
<!-- 组织架构树 -->
<div class="bg-white rounded-md shadow-sm p-6">
<div class="org-tree">
<div class="org-level-1 flex flex-col items-center">
<div class="org-node bg-primary text-white p-3 rounded-md shadow-md mb-4 w-48 text-center">
<h3 class="font-medium">集团公司</h3>
<p class="text-xs opacity-80">1,284人</p>
</div>
<div class="flex space-x-8">
<div class="org-level-2 flex flex-col items-center">
<div class="org-node bg-blue-100 p-3 rounded-md shadow-sm mb-4 w-40 text-center">
<h4 class="font-medium">行政中心</h4>
<p class="text-xs text-gray-600">356人</p>
</div>
<div class="flex space-x-6">
<div class="org-level-3 flex flex-col items-center">
<div class="org-node bg-blue-50 p-2 rounded-md mb-3 w-32 text-center">
<h5 class="text-sm">人力资源部</h5>
<p class="text-xs text-gray-500">45人</p>
</div>
<div class="org-node bg-blue-50 p-2 rounded-md mb-3 w-32 text-center">
<h5 class="text-sm">财务部</h5>
<p class="text-xs text-gray-500">32人</p>
</div>
<div class="org-node bg-blue-50 p-2 rounded-md w-32 text-center">
<h5 class="text-sm">IT部</h5>
<p class="text-xs text-gray-500">28人</p>
</div>
</div>
</div>
</div>
<div class="org-level-2 flex flex-col items-center">
<div class="org-node bg-blue-100 p-3 rounded-md shadow-sm mb-4 w-40 text-center">
<h4 class="font-medium">营销中心</h4>
<p class="text-xs text-gray-600">268人</p>
</div>
<div class="flex space-x-6">
<div class="org-level-3 flex flex-col items-center">
<div class="org-node bg-blue-50 p-2 rounded-md mb-3 w-32 text-center">
<h5 class="text-sm">市场部</h5>
<p class="text-xs text-gray-500">86人</p>
</div>
<div class="org-node bg-blue-50 p-2 rounded-md mb-3 w-32 text-center">
<h5 class="text-sm">销售部</h5>
<p class="text-xs text-gray-500">124人</p>
</div>
<div class="org-node bg-blue-50 p-2 rounded-md w-32 text-center">
<h5 class="text-sm">客户服务部</h5>
<p class="text-xs text-gray-500">58人</p>
</div>
</div>
</div>
</div>
<div class="org-level-2 flex flex-col items-center">
<div class="org-node bg-blue-100 p-3 rounded-md shadow-sm mb-4 w-40 text-center">
<h4 class="font-medium">研发中心</h4>
<p class="text-xs text-gray-600">232人</p>
</div>
<div class="flex space-x-6">
<div class="org-level-3 flex flex-col items-center">
<div class="org-node bg-blue-50 p-2 rounded-md mb-3 w-32 text-center">
<h5 class="text-sm">前端开发部</h5>
<p class="text-xs text-gray-500">76人</p>
</div>
<div class="org-node bg-blue-50 p-2 rounded-md mb-3 w-32 text-center">
<h5 class="text-sm">后端开发部</h5>
<p class="text-xs text-gray-500">92人</p>
</div>
<div class="org-node bg-blue-50 p-2 rounded-md w-32 text-center">
<h5 class="text-sm">移动开发部</h5>
<p class="text-xs text-gray-500">64人</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 部门统计 -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mt-8">
<div class="bg-secondary rounded-md p-4">
<div class="flex items-center justify-between mb-2">
<h3 class="text-sm font-medium text-gray-600">部门总数</h3>
<i class="fas fa-sitemap fa-icon w-5 h-5 text-primary"></i>
</div>
<div class="text-2xl font-bold">24</div>
<div class="text-xs text-gray-500 mt-1">较上月增加2个</div>
</div>
<div class="bg-secondary rounded-md p-4">
<div class="flex items-center justify-between mb-2">
<h3 class="text-sm font-medium text-gray-600">员工总数</h3>
<i class="fas fa-users fa-icon w-5 h-5 text-primary"></i>
</div>
<div class="text-2xl font-bold">1,284</div>
<div class="text-xs text-gray-500 mt-1">较上月增加56人</div>
</div>
<div class="bg-secondary rounded-md p-4">
<div class="flex items-center justify-between mb-2">
<h3 class="text-sm font-medium text-gray-600">平均在职时长</h3>
<i class="fas fa-clock fa-icon w-5 h-5 text-primary"></i>
</div>
<div class="text-2xl font-bold">3.2年</div>
<div class="text-xs text-gray-500 mt-1">较上月增加0.1年</div>
</div>
</div>
<!-- 部门人员分布 -->
<div class="mt-8">
<h3 class="text-lg font-medium mb-4">各部门人员分布</h3>
<div class="bg-secondary rounded-md p-4 h-64">
<div id="departmentChart" class="w-full h-full"></div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 底部通栏 -->
<footer class="bg-gray-800 text-white py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div>
<h3 class="text-sm font-medium mb-4">关于我们</h3>
<ul class="space-y-2 text-xs 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-sm font-medium mb-4">产品服务</h3>
<ul class="space-y-2 text-xs 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-sm font-medium mb-4">帮助中心</h3>
<ul class="space-y-2 text-xs 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-sm font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-start">
<i class="fas fa-map-marker-alt fa-icon w-3 h-3 mt-0.5 mr-2"></i>
<span>北京市海淀区中关村南大街5号</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt fa-icon w-3 h-3 mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon w-3 h-3 mr-2"></i>
<span>hr@company.com</span>
</li>
<li class="flex items-center">
<i class="fas fa-clock fa-icon w-3 h-3 mr-2"></i>
<span>周一至周五 9:00-18:00</span>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-center text-xs text-gray-400">
<p>© 2023 人力资源管理系统 版权所有 | 京ICP备12345678号-1 | 京公网安备11010802012345号</p>
</div>
</div>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.5.0/echarts.min.js"></script>
<script>
// 初始化部门人员分布图表
const departmentChart = echarts.init(document.getElementById('departmentChart'));
const departmentOption = {
animation: false,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
axisLine: {
show: false
},
axisTick: {
show: false
},
splitLine: {
lineStyle: {
color: '#e5e7eb'
}
}
},
yAxis: {
type: 'category',
data: ['人力资源部', '财务部', 'IT部', '市场部', '销售部', '客户服务部', '前端开发部', '后端开发部', '移动开发部'],
axisLine: {
show: false
},
axisTick: {
show: false
}
},
series: [
{
name: '人数',
type: 'bar',
data: [45, 32, 28, 86, 124, 58, 76, 92, 64],
itemStyle: {
color: '#2D5CF6',
borderRadius: [0, 4, 4, 0]
},
barWidth: 12
}
]
};
departmentChart.setOption(departmentOption);
// 响应式调整图表大小
window.addEventListener('resize', function () {
departmentChart.resize();
});
</script>
</body>
</html>

@ -0,0 +1,566 @@
<!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>
.marquee {
animation: marquee 15s linear infinite;
}
@keyframes marquee {
0% {
transform: translateX(100%);
}
100% {
transform: translateX(-100%);
}
}
.tree-item {
transition: all 0.2s ease;
}
.tree-item:hover {
background-color: #e0e0e0;
}
.table-row:hover {
background-color: #f0f4ff;
}
.search-input:focus {
outline: none;
box-shadow: 0 0 0 2px rgba(45, 92, 246, 0.2);
}
.dropdown:hover .dropdown-menu {
display: block;
}
i.fa-icon {
display: flex;
justify-content: center;
align-items: center;
width: 16px;
height: 16px;
}
</style>
</head>
<body class="bg-gray-50 min-h-screen flex flex-col">
<!-- 顶部导航栏 -->
<!-- <header class="w-full bg-primary text-white">
<div class="container mx-auto px-4">
<div class="flex items-center justify-between h-16">
<div class="flex items-center">
<span class="font-['Pacifico'] text-xl">人力</span>
</div>
<nav class="hidden md:flex space-x-6">
<a href="#" class="text-sm hover:text-gray-200 transition">多维统计</a>
<a href="#" class="text-sm font-medium">人员管理</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 class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..."
class="search-input bg-white bg-opacity-20 text-sm rounded-button pl-8 pr-4 py-1 w-40 focus:w-56 transition-all duration-300 placeholder-white">
<i
class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-white text-sm"></i>
</div>
<button
class="bg-white bg-opacity-20 hover:bg-opacity-30 text-white text-xs px-3 py-1 rounded-button flex items-center space-x-1 transition">
<i class="fas fa-robot text-sm"></i>
<span>AI助手</span>
</button>
<div class="dropdown relative">
<button class="flex items-center space-x-1">
<div class="w-8 h-8 rounded-full bg-white bg-opacity-20 flex items-center justify-center">
<i class="fas fa-user text-sm"></i>
</div>
</button>
<div class="dropdown-menu absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg z-10 hidden">
<div class="py-1">
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">个人中心</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">系统设置</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">退出登录</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="bg-yellow-50 h-10 flex items-center overflow-hidden">
<div class="container mx-auto px-4">
<div class="relative">
<div class="marquee whitespace-nowrap text-xs text-gray-900">
<span class="inline-block mr-8">【公告】2023年度绩效考核工作将于12月1日正式启动</span>
<span class="inline-block mr-8">【通知】关于2024年春节放假安排的通知</span>
<span class="inline-block mr-8">【提醒】请各部门及时更新员工信息</span>
<span class="inline-block">【培训】新员工入职培训将于下周一举行</span>
</div>
</div>
</div>
</div>
</header> -->
<!-- 主内容区 -->
<main class="flex-1 container mx-auto px-4 py-6">
<div class="flex">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-4">
<div class="bg-white rounded-md shadow p-4 h-full">
<div class="flex items-center justify-between mb-4">
<h3 class="text-sm font-medium">组织架构</h3>
<button class="text-primary text-xs hover:text-primary-dark">
<i class="fas fa-sync-alt fa-icon"></i>
</button>
</div>
<div class="space-y-1">
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-building fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">集团公司</span>
</div>
</div>
<div class="pl-6">
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">人力资源部</span>
</div>
</div>
<div class="pl-6">
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-users fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">招聘组</span>
</div>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-chart-line fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">绩效组</span>
</div>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-money-bill-wave fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">薪酬组</span>
</div>
</div>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">财务部</span>
</div>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md hover:bg-secondary">
<div class="flex items-center">
<i class="fas fa-sitemap fa-icon mr-2 text-gray-500"></i>
<span class="text-sm">技术研发中心</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧内容区 -->
<div class="w-4/5">
<div class="bg-white rounded-md shadow p-6">
<!-- 筛选区 -->
<div class="mb-6">
<h2 class="text-lg font-medium mb-4">人员筛选</h2>
<div class="grid grid-cols-4 gap-4">
<div>
<label class="block text-sm text-gray-600 mb-1">姓名</label>
<input type="text"
class="w-full border border-gray-300 rounded-button px-3 py-1 text-sm focus:border-primary focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">电话</label>
<input type="text"
class="w-full border border-gray-300 rounded-button px-3 py-1 text-sm focus:border-primary focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">身份证号</label>
<input type="text"
class="w-full border border-gray-300 rounded-button px-3 py-1 text-sm focus:border-primary focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">部门</label>
<div class="relative">
<select
class="w-full border border-gray-300 rounded-button px-3 py-1 text-sm appearance-none bg-white">
<option>全部部门</option>
<option>人力资源部</option>
<option>财务部</option>
<option>技术研发中心</option>
</select>
<div class="absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none">
<i class="fas fa-chevron-down fa-icon text-gray-400"></i>
</div>
</div>
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">性别</label>
<div class="flex space-x-2">
<label class="inline-flex items-center">
<input type="radio" name="gender" class="text-primary focus:ring-primary">
<span class="ml-1 text-sm"></span>
</label>
<label class="inline-flex items-center">
<input type="radio" name="gender" class="text-primary focus:ring-primary">
<span class="ml-1 text-sm"></span>
</label>
<label class="inline-flex items-center">
<input type="radio" name="gender" class="text-primary focus:ring-primary">
<span class="ml-1 text-sm">不限</span>
</label>
</div>
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">年龄范围</label>
<div class="flex space-x-2">
<input type="number" placeholder="最小"
class="w-1/2 border border-gray-300 rounded-button px-3 py-1 text-sm">
<input type="number" placeholder="最大"
class="w-1/2 border border-gray-300 rounded-button px-3 py-1 text-sm">
</div>
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">绩效状态</label>
<div class="relative">
<select
class="w-full border border-gray-300 rounded-button px-3 py-1 text-sm appearance-none bg-white">
<option>全部状态</option>
<option>新建</option>
<option>已审批</option>
<option>审批中</option>
<option>已确认</option>
</select>
<div class="absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none">
<i class="fas fa-chevron-down fa-icon text-gray-400"></i>
</div>
</div>
</div>
<div class="flex items-end">
<button
class="bg-primary hover:bg-primary-dark text-white px-4 py-1 rounded-button text-sm flex items-center">
<i class="fas fa-search fa-icon mr-1"></i>
<span>搜索</span>
</button>
<button
class="ml-2 border border-gray-300 hover:bg-gray-50 px-4 py-1 rounded-button text-sm">
重置
</button>
</div>
</div>
</div>
<!-- 操作按钮区 -->
<div class="flex justify-between items-center mb-4">
<h2 class="text-lg font-medium">人员绩效列表</h2>
<div class="flex space-x-2">
<button
class="bg-primary hover:bg-primary-dark text-white px-3 py-1 rounded-button text-sm flex items-center">
<i class="fas fa-plus fa-icon mr-1"></i>
<span>新增</span>
</button>
<button
class="border border-gray-300 hover:bg-gray-50 px-3 py-1 rounded-button text-sm flex items-center">
<i class="fas fa-download fa-icon mr-1"></i>
<span>导出</span>
</button>
<button
class="border border-gray-300 hover:bg-gray-50 px-3 py-1 rounded-button text-sm flex items-center">
<i class="fas fa-print fa-icon mr-1"></i>
<span>打印</span>
</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-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
序号</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
姓名</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
性别</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
年龄</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
部门</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
职位</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
绩效总分</th>
<th scope="col"
class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
绩效状态</th>
<th scope="col"
class="px-4 py-2 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">
<td class="px-4 py-2 whitespace-nowrap text-sm">1</td>
<td class="px-4 py-2 whitespace-nowrap text-sm font-medium">张明远</td>
<td class="px-4 py-2 whitespace-nowrap text-sm"></td>
<td class="px-4 py-2 whitespace-nowrap text-sm">32</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">人力资源部</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">招聘主管</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">92.5</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<span
class="px-2 py-1 text-xs rounded-full bg-green-100 text-green-800">已确认</span>
</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2 whitespace-nowrap text-sm">2</td>
<td class="px-4 py-2 whitespace-nowrap text-sm font-medium">李思雨</td>
<td class="px-4 py-2 whitespace-nowrap text-sm"></td>
<td class="px-4 py-2 whitespace-nowrap text-sm">28</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">财务部</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">会计</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">88.0</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<span
class="px-2 py-1 text-xs rounded-full bg-blue-100 text-blue-800">审批中</span>
</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2 whitespace-nowrap text-sm">3</td>
<td class="px-4 py-2 whitespace-nowrap text-sm font-medium">王建国</td>
<td class="px-4 py-2 whitespace-nowrap text-sm"></td>
<td class="px-4 py-2 whitespace-nowrap text-sm">45</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">技术研发中心</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">技术总监</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">95.5</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<span
class="px-2 py-1 text-xs rounded-full bg-green-100 text-green-800">已确认</span>
</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2 whitespace-nowrap text-sm">4</td>
<td class="px-4 py-2 whitespace-nowrap text-sm font-medium">赵雪</td>
<td class="px-4 py-2 whitespace-nowrap text-sm"></td>
<td class="px-4 py-2 whitespace-nowrap text-sm">26</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">人力资源部</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">薪酬专员</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">85.0</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<span
class="px-2 py-1 text-xs rounded-full bg-yellow-100 text-yellow-800">已审批</span>
</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2 whitespace-nowrap text-sm">5</td>
<td class="px-4 py-2 whitespace-nowrap text-sm font-medium">陈志强</td>
<td class="px-4 py-2 whitespace-nowrap text-sm"></td>
<td class="px-4 py-2 whitespace-nowrap text-sm">35</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">技术研发中心</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">高级工程师</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">90.5</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<span class="px-2 py-1 text-xs rounded-full bg-gray-100 text-gray-800">新建</span>
</td>
<td class="px-4 py-2 whitespace-nowrap text-sm">
<button class="text-primary hover:text-primary-dark mr-2">
<i class="fas fa-edit fa-icon"></i>
</button>
<button class="text-red-500 hover:text-red-700">
<i class="fas fa-trash-alt fa-icon"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页区 -->
<div class="flex items-center justify-between mt-4">
<div class="text-sm text-gray-500">
每页显示 <span class="font-medium">10</span> 条,当前 <span class="font-medium">1-10</span> 条,共
<span class="font-medium">128</span> 条记录
</div>
<div class="flex space-x-1">
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-white hover:bg-gray-50">
<i class="fas fa-angle-left fa-icon"></i>
</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-primary text-white">1</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-white hover:bg-gray-50">2</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-white hover:bg-gray-50">3</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-white hover:bg-gray-50">4</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-white hover:bg-gray-50">5</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm bg-white hover:bg-gray-50">
<i class="fas fa-angle-right fa-icon"></i>
</button>
</div>
</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-medium 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-medium 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-medium 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">API文档</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-start">
<i class="fas fa-map-marker-alt fa-icon mr-2 mt-1"></i>
<span>北京市海淀区中关村软件园2号楼</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone fa-icon mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon mr-2"></i>
<span>contact@hrsystem.com</span>
</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">
<div class="text-xs text-gray-400 mb-4 md:mb-0">
© 2023 人力资源管理系统 版权所有
</div>
<div class="flex space-x-4">
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-weixin fa-icon"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-weibo fa-icon"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-github fa-icon"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-linkedin-in fa-icon"></i>
</a>
</div>
<div class="text-xs text-gray-400 mt-4 md:mt-0">
京ICP备12345678号-1
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,738 @@
<!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>
<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>
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-left: 20px;
position: relative;
}
.tree-item::before {
content: "";
position: absolute;
left: 8px;
top: 0;
height: 100%;
border-left: 1px solid #e5e7eb;
}
.tree-item:last-child::before {
height: 50%;
}
.tree-item::after {
content: "";
position: absolute;
left: 8px;
top: 50%;
width: 8px;
border-bottom: 1px solid #e5e7eb;
}
.scroll-container {
scrollbar-width: thin;
scrollbar-color: #cbd5e1 #f1f5f9;
}
.scroll-container::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.scroll-container::-webkit-scrollbar-track {
background: #f1f5f9;
}
.scroll-container::-webkit-scrollbar-thumb {
background-color: #cbd5e1;
border-radius: 3px;
}
.hover-card:hover {
transform: translateY(-2px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
i.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body class="min-h-[1024px] bg-gray-50 flex flex-col">
<!-- 顶部导航 -->
<!-- <header class="bg-primary text-white shadow-md">
<div class="container mx-auto px-6 py-3 flex items-center justify-between">
<div class="flex items-center space-x-8">
<a href="#" class="text-xl font-['Pacifico']">人力</a>
<nav class="hidden md:flex space-x-6 text-sm">
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">多维统计</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">人员管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">组织管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">考勤管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">绩效管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">薪酬管理</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">知识库</a>
<a href="#" class="hover:bg-white/20 px-2 py-1 rounded-button transition">后台管理</a>
</nav>
</div>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..."
class="bg-white/20 text-white placeholder-white/70 text-sm rounded-button px-3 py-1 pl-8 w-40 focus:w-60 transition-all duration-300 focus:outline-none focus:ring-1 focus:ring-white/50">
<i
class="fa-icon fa-solid fa-magnifying-glass absolute left-2 top-1/2 transform -translate-y-1/2 text-white/70 text-xs"></i>
</div>
<button
class="bg-white/10 hover:bg-white/20 rounded-button px-3 py-1 text-sm flex items-center space-x-1 transition">
<i class="fa-icon fa-solid fa-robot text-xs"></i>
<span>AI 助手</span>
</button>
<div class="relative">
<img src="https://mastergo.com/ai/api/search-image?query=professional20business20profile20photo20of20a20young20asian20male20executive20with20white20background&width=32&height=32&orientation=squarish&flag=a6d20992702c7a888c93eb051f248a43"
alt="用户头像" class="w-8 h-8 rounded-full object-cover cursor-pointer">
</div>
</div>
</div>
</header> -->
<!-- 主内容区域 -->
<main class="flex-grow container mx-auto px-6 py-8">
<div class="flex flex-col space-y-6">
<!-- 面包屑导航 -->
<!-- <div class="flex items-center text-sm text-gray-600">
<a href="#" class="hover:text-primary">首页</a>
<i class="fa-icon fa-solid fa-chevron-right mx-2 text-xs"></i>
<a href="#" class="hover:text-primary">系统管理</a>
<i class="fa-icon fa-solid fa-chevron-right mx-2 text-xs"></i>
<span class="text-gray-800">数据字典管理</span>
</div> -->
<!-- 页面标题和操作按钮 -->
<div class="flex justify-between items-center">
<h1 class="text-2xl font-bold text-gray-800">数据字典管理</h1>
<div class="flex space-x-3">
<button
class="bg-primary hover:bg-blue-700 text-white rounded-button px-4 py-2 text-sm flex items-center space-x-2 transition">
<i class="fa-icon fa-solid fa-plus text-xs"></i>
<span>新增元数据域</span>
</button>
<button
class="bg-white border border-gray-300 hover:bg-gray-50 text-gray-700 rounded-button px-4 py-2 text-sm flex items-center space-x-2 transition">
<i class="fa-icon fa-solid fa-download text-xs"></i>
<span>导出配置</span>
</button>
</div>
</div>
<!-- 数据字典内容区域 -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden">
<div class="flex h-[1200px]">
<!-- 左侧树形结构 -->
<div class="w-1/4 border-r border-gray-200 overflow-y-auto scroll-container">
<div class="p-4 space-y-2">
<div class="flex items-center justify-between">
<h3 class="font-medium text-gray-700">员工模型</h3>
<button class="text-gray-400 hover:text-gray-600">
<i class="fa-icon fa-solid fa-ellipsis-vertical text-xs"></i>
</button>
</div>
<div class="mt-2 space-y-1">
<!-- 树形结构项 -->
<div class="tree-item">
<div
class="flex items-center justify-between py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<div class="flex items-center space-x-2">
<i class="fa-icon fa-solid fa-folder text-yellow-400 text-sm"></i>
<span class="text-sm">基础信息</span>
</div>
<i class="fa-icon fa-solid fa-chevron-down text-gray-400 text-xs"></i>
</div>
<div class="ml-4 mt-1 space-y-1">
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">员工编号</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">姓名</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">性别</span>
</div>
</div>
</div>
<div class="tree-item">
<div
class="flex items-center justify-between py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<div class="flex items-center space-x-2">
<i class="fa-icon fa-solid fa-folder text-yellow-400 text-sm"></i>
<span class="text-sm">技术职务</span>
</div>
<i class="fa-icon fa-solid fa-chevron-right text-gray-400 text-xs"></i>
</div>
</div>
<div class="tree-item">
<div
class="flex items-center justify-between py-1 px-2 rounded hover:bg-gray-100 cursor-pointer bg-blue-50">
<div class="flex items-center space-x-2">
<i class="fa-icon fa-solid fa-folder-open text-yellow-400 text-sm"></i>
<span class="text-sm font-medium text-primary">绩效参数</span>
</div>
<i class="fa-icon fa-solid fa-chevron-down text-gray-400 text-xs"></i>
</div>
<div class="ml-4 mt-1 space-y-1">
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">代码量</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">文档字数</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">出勤时长</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">项目金额</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">培训时长</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">会议次数</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">会议时长</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">千行 bug 数</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">运维响应时间</span>
</div>
<div
class="flex items-center py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<i class="fa-icon fa-solid fa-file text-blue-400 text-sm mr-2"></i>
<span class="text-sm">员工满意度</span>
</div>
</div>
</div>
<div class="tree-item">
<div
class="flex items-center justify-between py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<div class="flex items-center space-x-2">
<i class="fa-icon fa-solid fa-folder text-yellow-400 text-sm"></i>
<span class="text-sm">联系方式</span>
</div>
<i class="fa-icon fa-solid fa-chevron-right text-gray-400 text-xs"></i>
</div>
</div>
<div class="tree-item">
<div
class="flex items-center justify-between py-1 px-2 rounded hover:bg-gray-100 cursor-pointer">
<div class="flex items-center space-x-2">
<i class="fa-icon fa-solid fa-folder text-yellow-400 text-sm"></i>
<span class="text-sm">其他信息</span>
</div>
<i class="fa-icon fa-solid fa-chevron-right text-gray-400 text-xs"></i>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧属性配置面板 -->
<div class="w-3/4 overflow-y-auto scroll-container">
<div class="p-6">
<div class="flex justify-between items-center mb-6">
<h2 class="text-lg font-semibold text-gray-800">绩效参数属性配置</h2>
<button
class="bg-primary hover:bg-blue-700 text-white rounded-button px-3 py-1 text-sm flex items-center space-x-2 transition">
<i class="fa-icon fa-solid fa-plus text-xs"></i>
<span>新增属性</span>
</button>
</div>
<div class="bg-gray-50 rounded-lg p-4 mb-6">
<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" value="绩效参数"
class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">元数据域编码</label>
<input type="text" value="performance_params"
class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
</div>
<div class="col-span-2">
<label class="block text-sm font-medium text-gray-700 mb-1">描述</label>
<textarea
class="w-full border border-gray-300 rounded-button px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary"
rows="2">用于记录员工各项绩效指标的参数集合</textarea>
</div>
</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-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
属性名称</th>
<th scope="col"
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
编码</th>
<th scope="col"
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
数据类型</th>
<th scope="col"
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
单位</th>
<th scope="col"
class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
必填</th>
<th scope="col"
class="px-4 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:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
代码量</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">code_amount
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500"></td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox" checked
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
文档字数</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">doc_words</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500"></td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox" checked
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
出勤时长</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
attendance_hours</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">小时</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox" checked
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
项目金额</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">project_amount
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500"></td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox"
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
培训时长</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">training_hours
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">小时</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox"
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
会议次数</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">meeting_count
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500"></td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox" checked
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
会议时长</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">meeting_hours
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">分钟</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox"
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">千行
bug 数</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">bug_count</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">个/千行</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox" checked
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
运维响应时间</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">response_time
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">分钟</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox" checked
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">
员工满意度</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">satisfaction
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<select
class="border border-gray-300 rounded-button px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary">
<option>数字</option>
<option>文本</option>
<option>日期</option>
<option selected>列表</option>
</select>
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500"></td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<input type="checkbox"
class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">
<button class="text-blue-600 hover:text-blue-900 mr-2">
<i class="fa-icon fa-solid fa-pen text-xs"></i>
</button>
<button class="text-red-600 hover:text-red-900">
<i class="fa-icon fa-solid fa-trash text-xs"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="mt-6 flex items-center justify-between">
<div class="text-sm text-gray-500">
显示 <span class="font-medium">1</span><span class="font-medium">10</span> 条,共
<span class="font-medium">10</span> 条记录
</div>
<div class="flex space-x-1">
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm text-gray-700 bg-white hover:bg-gray-50">
上一页
</button>
<button
class="px-3 py-1 border border-primary bg-primary text-white rounded-button text-sm">
1
</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm text-gray-700 bg-white hover:bg-gray-50">
2
</button>
<button
class="px-3 py-1 border border-gray-300 rounded-button text-sm text-gray-700 bg-white hover:bg-gray-50">
下一页
</button>
</div>
</div>
</div>
</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-medium 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-medium 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-medium 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">API文档</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium mb-4">联系我们</h3>
<ul class="space-y-2 text-xs text-gray-300">
<li class="flex items-start">
<i class="fas fa-map-marker-alt fa-icon mr-2 mt-1"></i>
<span>北京市海淀区中关村软件园2号楼</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone fa-icon mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon mr-2"></i>
<span>contact@hrsystem.com</span>
</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">
<div class="text-xs text-gray-400 mb-4 md:mb-0">
© 2023 人力资源管理系统 版权所有
</div>
<div class="flex space-x-4">
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-weixin fa-icon"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-weibo fa-icon"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-github fa-icon"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fab fa-linkedin-in fa-icon"></i>
</a>
</div>
<div class="text-xs text-gray-400 mt-4 md:mt-0">
京ICP备12345678号-1
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,318 @@
<!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>
.marquee {
white-space: nowrap;
overflow: hidden;
box-sizing: border-box;
animation: marquee 20s linear infinite;
}
@keyframes marquee {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
.card-shadow {
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.icon-container {
display: flex;
justify-content: center;
align-items: center;
width: 24px;
height: 24px;
}
</style>
</head>
<body class="min-h-[1024px] bg-secondary flex flex-col">
<!-- 顶部导航 -->
<!-- <header class="w-full bg-primary text-white">
<nav class="max-w-7xl mx-auto px-4 py-3 flex items-center justify-between">
<div class="flex items-center space-x-10">
<h1 class="text-xl font-['Pacifico']">人力</h1>
<div class="flex space-x-6 text-sm">
<a href="#" class="hover:text-gray-200">多维统计</a>
<a href="#" class="hover:text-gray-200">人员管理</a>
<a href="#" class="hover:text-gray-200">组织管理</a>
<a href="#" class="hover:text-gray-200">考勤管理</a>
<a href="#" class="hover:text-gray-200">绩效管理</a>
<a href="#" class="hover:text-gray-200">薪酬管理</a>
<a href="#" class="hover:text-gray-200">知识库</a>
<a href="#" class="hover:text-gray-200">后台管理</a>
</div>
</div>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..." class="py-1 px-3 pl-8 text-sm rounded-button text-gray-800 w-40">
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-500"></i>
</div>
<div class="flex items-center space-x-2">
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center">
<i class="fas fa-user text-primary"></i>
</div>
<span class="text-sm">张明远</span>
</div>
<button class="bg-white text-primary text-sm py-1 px-3 rounded-button flex items-center space-x-1">
<i class="fas fa-robot"></i>
<span>AI助手</span>
</button>
</div>
</nav>
<div class="bg-amber-50 text-black py-1 px-4 text-xs">
<div class="marquee">
<span>【系统公告】2025年度绩效考核标准已更新请各部门负责人及时查阅。 | 2025年第一季度员工满意度调查结果已发布整体满意度达到92.5%。 | 提醒2025年上半年绩效计划填报截止日期为6月30日请及时完成。 | 新员工入职培训将于7月5日在总部3楼会议室举行。</span>
</div>
</div>
</header> -->
<!-- 主内容区 -->
<main class="flex-1 max-w-7xl mx-auto px-4 py-6 w-full">
<!-- 筛选区 -->
<div class="bg-white p-4 rounded-lg card-shadow mb-6">
<div class="grid grid-cols-4 gap-4">
<div>
<label class="block text-xs text-gray-600 mb-1">姓名</label>
<input type="text" class="w-full border border-gray-300 rounded-button px-2 py-1 text-sm">
</div>
<div>
<label class="block text-xs text-gray-600 mb-1">电话</label>
<input type="text" class="w-full border border-gray-300 rounded-button px-2 py-1 text-sm">
</div>
<div>
<label class="block text-xs text-gray-600 mb-1">身份证</label>
<input type="text" class="w-full border border-gray-300 rounded-button px-2 py-1 text-sm">
</div>
<div>
<label class="block text-xs text-gray-600 mb-1">绩效计划</label>
<div class="relative">
<button class="w-full border border-gray-300 rounded-button px-2 py-1 text-sm text-left flex justify-between items-center">
<span>2025年度</span>
<i class="fas fa-chevron-down text-xs"></i>
</button>
</div>
</div>
</div>
<div class="flex justify-end mt-4">
<button class="bg-primary text-white text-sm py-1 px-4 rounded-button mr-2">查询</button>
<button class="bg-white border border-gray-300 text-gray-700 text-sm py-1 px-4 rounded-button">重置</button>
</div>
</div>
<!-- 人员信息 -->
<div class="bg-white p-4 rounded-lg card-shadow mb-6">
<div class="flex items-center space-x-4">
<div class="w-16 h-16 rounded-full bg-gray-200 flex items-center justify-center">
<i class="fas fa-user text-gray-500 text-2xl"></i>
</div>
<div class="grid grid-cols-4 gap-4 flex-1">
<div>
<p class="text-xs text-gray-500">性别</p>
<p class="text-sm"></p>
</div>
<div>
<p class="text-xs text-gray-500">年龄</p>
<p class="text-sm">32</p>
</div>
<div>
<p class="text-xs text-gray-500">部门</p>
<p class="text-sm">技术研发中心</p>
</div>
<div>
<p class="text-xs text-gray-500">岗位</p>
<p class="text-sm">高级软件工程师</p>
</div>
</div>
<div>
<p class="text-xs text-gray-500">绩效计划名称</p>
<p class="text-sm">2025年度技术岗绩效计划</p>
</div>
</div>
</div>
<!-- 绩效公式 -->
<div class="bg-white p-4 rounded-lg card-shadow mb-6">
<p class="text-sm font-medium mb-2">绩效公式</p>
<p class="text-xs bg-gray-100 p-2 rounded-button">
总分 = 代码量 × 0.1 + 文档字数 × 0.01 + 培训次数 × 3 + 项目金额 × 0.01 + 项目比重 × 0.1 + 工作时长 × 0.01 + 执行力 × 0.1 + 对公司认同度 × 0.1
</p>
</div>
<!-- 绩效总分 -->
<div class="bg-white p-4 rounded-lg card-shadow mb-6">
<div class="flex justify-between">
<div>
<p class="text-xs text-gray-500">绩效总分</p>
<p class="text-2xl font-bold text-primary">92</p>
</div>
<div>
<p class="text-xs text-gray-500">审批状态</p>
<p class="text-sm text-green-600 font-medium">已确认</p>
</div>
</div>
</div>
<!-- 客观指标 -->
<div class="bg-white p-4 rounded-lg card-shadow mb-6">
<p class="text-sm font-medium mb-3">客观指标</p>
<div class="grid grid-cols-3 gap-4">
<div>
<p class="text-xs text-gray-500">代码量</p>
<p class="text-sm">15,672 行</p>
</div>
<div>
<p class="text-xs text-gray-500">文档字数</p>
<p class="text-sm">28,500 字</p>
</div>
<div>
<p class="text-xs text-gray-500">培训次数</p>
<p class="text-sm">8 次</p>
</div>
<div>
<p class="text-xs text-gray-500">项目金额</p>
<p class="text-sm">¥1,250,000</p>
</div>
<div>
<p class="text-xs text-gray-500">项目比重</p>
<p class="text-sm">35%</p>
</div>
<div>
<p class="text-xs text-gray-500">工作时长</p>
<p class="text-sm">1,850 小时</p>
</div>
</div>
</div>
<!-- 主观指标 -->
<div class="grid grid-cols-2 gap-4 mb-6">
<!-- 执行力 -->
<div class="bg-white p-4 rounded-lg card-shadow">
<p class="text-sm font-medium mb-3">执行力</p>
<div class="flex items-center space-x-2 mb-3">
<span class="text-xs text-gray-500">评分:</span>
<div class="flex">
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-gray-300"></i>
</div>
<span class="text-xs">4.0</span>
</div>
<div>
<p class="text-xs text-gray-500 mb-1">评价</p>
<textarea class="w-full border border-gray-300 rounded-button px-2 py-1 text-sm h-20" placeholder="请输入评价内容...">该员工能够高效执行分配的任务,在项目开发过程中表现出色,能够按时保质完成工作。在团队协作中主动承担责任,遇到问题能够积极寻求解决方案。</textarea>
</div>
</div>
<!-- 对公司认同 -->
<div class="bg-white p-4 rounded-lg card-shadow">
<p class="text-sm font-medium mb-3">对公司认同度</p>
<div class="flex items-center space-x-2 mb-3">
<span class="text-xs text-gray-500">评分:</span>
<div class="flex">
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star text-yellow-400"></i>
<i class="fas fa-star-half-alt text-yellow-400"></i>
</div>
<span class="text-xs">4.5</span>
</div>
<div>
<p class="text-xs text-gray-500 mb-1">评价</p>
<textarea class="w-full border border-gray-300 rounded-button px-2 py-1 text-sm h-20" placeholder="请输入评价内容...">该员工高度认同公司文化和价值观,积极参与公司组织的各项活动。在日常工作中能够主动传播正能量,对新员工起到良好的示范作用。对公司发展战略有深刻理解并积极支持。</textarea>
</div>
</div>
</div>
<!-- 操作按钮 -->
<div class="flex justify-end space-x-3 mb-6">
<button class="bg-primary text-white text-sm py-2 px-6 rounded-button">保存评价</button>
<button class="bg-white border border-primary text-primary text-sm py-2 px-6 rounded-button">返回列表</button>
</div>
</main>
<!-- 页脚 -->
<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>
<h3 class="text-sm font-medium mb-3">关于我们</h3>
<ul class="space-y-2 text-xs text-gray-400">
<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-medium mb-3">产品服务</h3>
<ul class="space-y-2 text-xs text-gray-400">
<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-medium mb-3">帮助中心</h3>
<ul class="space-y-2 text-xs text-gray-400">
<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-medium mb-3">联系我们</h3>
<ul class="space-y-2 text-xs text-gray-400">
<li>电话400-888-8888</li>
<li>邮箱service@hrsystem.com</li>
<li>地址北京市海淀区科技园路88号</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"></i></a>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-6 pt-6 text-center text-xs text-gray-400">
<p>© 2025 人力资源管理系统 版权所有 | 京ICP备12345678号-1 | 京公网安备11010802023456号</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,366 @@
<!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>
.fa-icon {
display: flex;
justify-content: center;
align-items: center;
width: 16px;
height: 16px;
}
.scroll-container {
scrollbar-width: none;
}
.scroll-container::-webkit-scrollbar {
display: none;
}
</style>
</head>
<body class="min-h-[1024px] bg-secondary font-sans text-sm text-gray-800">
<!-- <header class="w-full h-[60px] bg-primary text-white fixed top-0 z-50 shadow-md">
<div class="w-[1200px] h-full mx-auto flex items-center justify-between">
<div class="flex items-center">
<span class="font-['Pacifico'] text-2xl mr-10">人力</span>
</div>
<nav class="flex-1 flex items-center">
<ul class="flex space-x-6">
<li><a href="#" class="hover:text-gray-200 transition">多维统计</a></li>
<li><a href="#" class="hover:text-gray-200 transition">人员管理</a></li>
<li><a href="#" class="hover:text-gray-200 transition">组织管理</a></li>
<li><a href="#" class="hover:text-gray-200 transition font-semibold">考勤管理</a></li>
<li><a href="#" class="hover:text-gray-200 transition">绩效管理</a></li>
<li><a href="#" class="hover:text-gray-200 transition">薪酬管理</a></li>
<li><a href="#" class="hover:text-gray-200 transition">知识库</a></li>
<li><a href="#" class="hover:text-gray-200 transition">后台管理</a></li>
</ul>
</nav>
<div class="flex items-center space-x-4">
<div class="relative">
<input type="text" placeholder="搜索..." class="pl-8 pr-3 py-1 rounded-button bg-white bg-opacity-20 text-white placeholder-white focus:outline-none focus:ring-1 focus:ring-white w-[180px]">
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 fa-icon"></i>
</div>
<button class="flex items-center space-x-1 bg-white bg-opacity-20 hover:bg-opacity-30 px-3 py-1 rounded-button transition">
<i class="fas fa-robot fa-icon"></i>
<span>AI助手</span>
</button>
<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"></i>
</div>
</div>
</div>
</header> -->
<!-- 主内容区 -->
<main class="w-[1200px] mx-auto px-4 py-6">
<div class="flex space-x-4">
<!-- 左侧组织架构树 -->
<div class="w-1/5 bg-white rounded-md shadow-sm p-4">
<h2 class="font-medium text-gray-700 mb-4">组织架构</h2>
<div class="space-y-2">
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-building fa-icon text-gray-500"></i>
<span class="hover:text-primary">公司总部</span>
</div>
<div class="ml-6 space-y-2">
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-users fa-icon text-gray-500"></i>
<span class="hover:text-primary">人力资源部</span>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-users fa-icon text-gray-500"></i>
<span class="hover:text-primary">财务部</span>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-users fa-icon text-gray-500"></i>
<span class="hover:text-primary">技术研发部</span>
</div>
<div class="ml-6 space-y-2">
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-user fa-icon text-gray-500"></i>
<span class="hover:text-primary">前端开发组</span>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-user fa-icon text-gray-500"></i>
<span class="hover:text-primary">后端开发组</span>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-user fa-icon text-gray-500"></i>
<span class="hover:text-primary">测试组</span>
</div>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-users fa-icon text-gray-500"></i>
<span class="hover:text-primary">产品部</span>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<i class="fas fa-users fa-icon text-gray-500"></i>
<span class="hover:text-primary">市场部</span>
</div>
</div>
</div>
</div>
<!-- 右侧考勤管理区 -->
<div class="w-4/5 bg-white rounded-md shadow-sm p-4">
<h2 class="font-medium text-gray-700 mb-4">考勤管理</h2>
<!-- 筛选区 -->
<div class="grid grid-cols-4 gap-4 mb-6">
<div>
<label class="block text-gray-600 mb-1">员工ID</label>
<input type="text" class="w-full border rounded-button px-3 py-1 focus:outline-none focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-gray-600 mb-1">员工姓名</label>
<input type="text" class="w-full border rounded-button px-3 py-1 focus:outline-none focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-gray-600 mb-1">日期范围</label>
<div class="relative">
<input type="text" class="w-full border rounded-button px-3 py-1 focus:outline-none focus:ring-1 focus:ring-primary" placeholder="选择日期">
<i class="fas fa-calendar-alt absolute right-2 top-1/2 transform -translate-y-1/2 fa-icon text-gray-400"></i>
</div>
</div>
<div>
<label class="block text-gray-600 mb-1">考勤状态</label>
<div class="relative">
<select class="w-full border rounded-button px-3 py-1 appearance-none focus:outline-none focus:ring-1 focus:ring-primary">
<option>全部</option>
<option>正常</option>
<option>迟到</option>
<option>早退</option>
<option>缺勤</option>
</select>
<i class="fas fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 fa-icon text-gray-400"></i>
</div>
</div>
</div>
<!-- 操作按钮 -->
<div class="flex justify-between mb-4">
<div class="flex space-x-2">
<button class="bg-primary text-white px-3 py-1 rounded-button hover:bg-opacity-90 transition">
<i class="fas fa-search fa-icon mr-1"></i>
<span>查询</span>
</button>
<button class="border border-gray-300 px-3 py-1 rounded-button hover:bg-gray-50 transition">
<i class="fas fa-redo fa-icon mr-1"></i>
<span>重置</span>
</button>
</div>
<div>
<button class="bg-primary text-white px-3 py-1 rounded-button hover:bg-opacity-90 transition">
<i class="fas fa-download fa-icon mr-1"></i>
<span>导出</span>
</button>
</div>
</div>
<!-- 数据表格 -->
<div class="overflow-x-auto">
<table class="w-full">
<thead class="bg-secondary">
<tr>
<th class="px-4 py-2 text-left">员工ID</th>
<th class="px-4 py-2 text-left">员工姓名</th>
<th class="px-4 py-2 text-left">日期</th>
<th class="px-4 py-2 text-left">单位</th>
<th class="px-4 py-2 text-left">部门</th>
<th class="px-4 py-2 text-left">考勤状态</th>
<th class="px-4 py-2 text-left">上班时间</th>
<th class="px-4 py-2 text-left">下班时间</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10001</td>
<td class="px-4 py-2">张伟</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">技术研发部</td>
<td class="px-4 py-2 text-green-500">正常</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10002</td>
<td class="px-4 py-2">王芳</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">人力资源部</td>
<td class="px-4 py-2 text-yellow-500">迟到</td>
<td class="px-4 py-2">09:30:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10003</td>
<td class="px-4 py-2">李娜</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">财务部</td>
<td class="px-4 py-2 text-green-500">正常</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10004</td>
<td class="px-4 py-2">赵明</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">产品部</td>
<td class="px-4 py-2 text-green-500">正常</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10005</td>
<td class="px-4 py-2">刘强</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">市场部</td>
<td class="px-4 py-2 text-red-500">早退</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">17:30:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10006</td>
<td class="px-4 py-2">陈静</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">技术研发部</td>
<td class="px-4 py-2 text-green-500">正常</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10007</td>
<td class="px-4 py-2">杨光</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">人力资源部</td>
<td class="px-4 py-2 text-green-500">正常</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-2">10008</td>
<td class="px-4 py-2">周涛</td>
<td class="px-4 py-2">2023-06-01</td>
<td class="px-4 py-2">总部</td>
<td class="px-4 py-2">财务部</td>
<td class="px-4 py-2 text-green-500">正常</td>
<td class="px-4 py-2">09:00:00</td>
<td class="px-4 py-2">18:00:00</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="flex justify-between items-center mt-4">
<div class="text-gray-500">
显示 1 到 8 条,共 120 条记录
</div>
<div class="flex space-x-1">
<button class="w-8 h-8 border rounded-button flex items-center justify-center hover:bg-gray-50">
<i class="fas fa-angle-left fa-icon"></i>
</button>
<button class="w-8 h-8 border rounded-button flex items-center justify-center bg-primary text-white">1</button>
<button class="w-8 h-8 border rounded-button flex items-center justify-center hover:bg-gray-50">2</button>
<button class="w-8 h-8 border rounded-button flex items-center justify-center hover:bg-gray-50">3</button>
<button class="w-8 h-8 border rounded-button flex items-center justify-center hover:bg-gray-50">4</button>
<button class="w-8 h-8 border rounded-button flex items-center justify-center hover:bg-gray-50">5</button>
<button class="w-8 h-8 border rounded-button flex items-center justify-center hover:bg-gray-50">
<i class="fas fa-angle-right fa-icon"></i>
</button>
</div>
</div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="w-full bg-gray-800 text-gray-400 py-6">
<div class="w-[1200px] mx-auto">
<div class="grid grid-cols-3 gap-8">
<div>
<h3 class="text-white text-sm font-medium mb-3">关于我们</h3>
<p class="text-xs leading-6">人力资源管理系统致力于为企业提供专业的人力资源管理解决方案,帮助企业提升管理效率,优化人力资源配置。</p>
</div>
<div>
<h3 class="text-white text-sm font-medium mb-3">快速链接</h3>
<ul class="space-y-2 text-xs">
<li><a href="#" class="hover:text-white transition">帮助中心</a></li>
<li><a href="#" class="hover:text-white transition">API文档</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-white text-sm font-medium mb-3">联系方式</h3>
<ul class="space-y-2 text-xs">
<li class="flex items-center">
<i class="fas fa-phone fa-icon mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon mr-2"></i>
<span>service@hrms.com</span>
</li>
<li class="flex items-center">
<i class="fas fa-map-marker-alt fa-icon mr-2"></i>
<span>北京市海淀区科技园路88号</span>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-6 pt-4 text-xs text-center">
<p>© 2023 人力资源管理系统 版权所有 | 京ICP备12345678号</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,451 @@
<!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>
<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>
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;
}
.nav-item:hover {
background-color: rgba(255,255,255,0.1);
}
.tree-item:hover {
background-color: rgba(45,92,246,0.1);
}
.table-row:hover {
background-color: #F5F6FA;
}
.search-icon {
display: flex;
justify-content: center;
align-items: center;
width: 16px;
height: 16px;
}
.user-avatar {
width: 32px;
height: 32px;
}
.ai-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
}
</style>
</head>
<body class="bg-white font-sans text-gray-800">
<!-- 顶部导航栏 -->
<!-- <header class="w-full bg-primary text-white fixed top-0 left-0 z-50 shadow-md">
<div class="container mx-auto px-4 h-16 flex items-center justify-between">
<div class="flex items-center">
<div class="font-['Pacifico'] text-xl mr-8">人力</div>
<nav class="hidden md:flex space-x-5">
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">多维统计</a>
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">人员管理</a>
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">组织管理</a>
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">考勤管理</a>
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">绩效管理</a>
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">薪酬管理</a>
<a href="#" class="nav-item px-3 py-2 text-sm rounded-button whitespace-nowrap">知识库</a>
<a href="#" class="nav-item px-3 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="bg-white bg-opacity-20 text-white text-sm pl-8 pr-4 py-1 rounded-full border-none focus:ring-2 focus:ring-white focus:ring-opacity-50 placeholder-white placeholder-opacity-70 w-48">
<i class="fas fa-search search-icon absolute left-3 top-1/2 transform -translate-y-1/2 text-white text-opacity-70"></i>
</div>
<button class="flex items-center space-x-1 bg-white bg-opacity-20 hover:bg-opacity-30 px-3 py-1 rounded-button text-sm whitespace-nowrap">
<i class="fas fa-robot ai-icon text-white"></i>
<span>AI助手</span>
</button>
<div class="flex items-center space-x-2 cursor-pointer">
<div class="user-avatar rounded-full bg-white text-primary flex items-center justify-center font-semibold"></div>
</div>
</div>
</div>
</header> -->
<!-- 主体内容 -->
<main class="container mx-auto px-4 pb-10">
<div class="flex mt-6">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-4">
<div class="bg-secondary rounded-md shadow-sm p-4 h-full">
<h3 class="text-sm font-semibold mb-4 text-gray-700">组织架构</h3>
<div class="space-y-1">
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center">
<i class="fas fa-building mr-2 text-gray-500"></i>
<span>集团公司</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-4">
<i class="fas fa-sitemap mr-2 text-gray-500"></i>
<span>技术中心</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-8 bg-primary bg-opacity-10 text-primary">
<i class="fas fa-code-branch mr-2"></i>
<span>研发部</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-8">
<i class="fas fa-code-branch mr-2 text-gray-500"></i>
<span>测试部</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-4">
<i class="fas fa-sitemap mr-2 text-gray-500"></i>
<span>市场中心</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-8">
<i class="fas fa-code-branch mr-2 text-gray-500"></i>
<span>市场部</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-8">
<i class="fas fa-code-branch mr-2 text-gray-500"></i>
<span>品牌部</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-4">
<i class="fas fa-sitemap mr-2 text-gray-500"></i>
<span>运营中心</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-8">
<i class="fas fa-code-branch mr-2 text-gray-500"></i>
<span>客服部</span>
</div>
<div class="tree-item cursor-pointer p-2 rounded-md text-sm flex items-center ml-8">
<i class="fas fa-code-branch mr-2 text-gray-500"></i>
<span>运营部</span>
</div>
</div>
</div>
</div>
<!-- 右侧内容区 -->
<div class="w-4/5">
<!-- 筛选区域 -->
<div class="bg-white rounded-md shadow-sm p-4 mb-4">
<h3 class="text-sm font-semibold mb-4 text-gray-700">薪酬查询</h3>
<div class="grid grid-cols-4 gap-4">
<div>
<label class="block text-xs text-gray-500 mb-1">姓名</label>
<input type="text" class="w-full border border-gray-200 rounded-md px-3 py-1 text-sm focus:ring-primary focus:border-primary">
</div>
<div>
<label class="block text-xs text-gray-500 mb-1">电话</label>
<input type="text" class="w-full border border-gray-200 rounded-md px-3 py-1 text-sm focus:ring-primary focus:border-primary">
</div>
<div>
<label class="block text-xs text-gray-500 mb-1">月份</label>
<div class="relative">
<input type="text" class="w-full border border-gray-200 rounded-md px-3 py-1 text-sm focus:ring-primary focus:border-primary" placeholder="选择月份">
<i class="fas fa-calendar-alt absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 text-sm"></i>
</div>
</div>
<div class="flex items-end">
<button class="bg-primary text-white px-4 py-1 rounded-button text-sm whitespace-nowrap hover:bg-opacity-90">查询</button>
<button class="ml-2 border border-gray-200 px-4 py-1 rounded-button text-sm whitespace-nowrap hover:bg-gray-50">重置</button>
</div>
</div>
</div>
<!-- 薪酬列表 -->
<div class="bg-white rounded-md shadow-sm overflow-hidden">
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200 text-sm">
<thead class="bg-secondary">
<tr>
<th class="px-4 py-2 text-left font-medium text-gray-700">序号</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">姓名</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">性别</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">年龄</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">部门</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">岗位</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">月份</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">税前工资</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">税后工资</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">基本工资</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">浮动工资</th>
<th class="px-4 py-2 text-left font-medium text-gray-700">详情</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr class="table-row">
<td class="px-4 py-2">1</td>
<td class="px-4 py-2">张明远</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">32</td>
<td class="px-4 py-2">研发部</td>
<td class="px-4 py-2">高级工程师</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥28,500</td>
<td class="px-4 py-2">¥24,225</td>
<td class="px-4 py-2">¥18,000</td>
<td class="px-4 py-2">¥10,500</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">2</td>
<td class="px-4 py-2">李思雨</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">28</td>
<td class="px-4 py-2">市场部</td>
<td class="px-4 py-2">市场经理</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥25,800</td>
<td class="px-4 py-2">¥22,170</td>
<td class="px-4 py-2">¥16,000</td>
<td class="px-4 py-2">¥9,800</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">3</td>
<td class="px-4 py-2">王建国</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">45</td>
<td class="px-4 py-2">技术中心</td>
<td class="px-4 py-2">技术总监</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥42,000</td>
<td class="px-4 py-2">¥34,860</td>
<td class="px-4 py-2">¥25,000</td>
<td class="px-4 py-2">¥17,000</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">4</td>
<td class="px-4 py-2">赵雪</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">26</td>
<td class="px-4 py-2">运营部</td>
<td class="px-4 py-2">运营专员</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥15,000</td>
<td class="px-4 py-2">¥13,350</td>
<td class="px-4 py-2">¥10,000</td>
<td class="px-4 py-2">¥5,000</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">5</td>
<td class="px-4 py-2">陈志强</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">35</td>
<td class="px-4 py-2">测试部</td>
<td class="px-4 py-2">测试经理</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥22,500</td>
<td class="px-4 py-2">¥19,575</td>
<td class="px-4 py-2">¥15,000</td>
<td class="px-4 py-2">¥7,500</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">6</td>
<td class="px-4 py-2">刘芳</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">30</td>
<td class="px-4 py-2">品牌部</td>
<td class="px-4 py-2">品牌主管</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥19,800</td>
<td class="px-4 py-2">¥17,406</td>
<td class="px-4 py-2">¥12,000</td>
<td class="px-4 py-2">¥7,800</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">7</td>
<td class="px-4 py-2">周伟</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">29</td>
<td class="px-4 py-2">研发部</td>
<td class="px-4 py-2">前端工程师</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥20,000</td>
<td class="px-4 py-2">¥17,600</td>
<td class="px-4 py-2">¥13,000</td>
<td class="px-4 py-2">¥7,000</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">8</td>
<td class="px-4 py-2">吴晓梅</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">27</td>
<td class="px-4 py-2">客服部</td>
<td class="px-4 py-2">客服主管</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥16,500</td>
<td class="px-4 py-2">¥14,685</td>
<td class="px-4 py-2">¥11,000</td>
<td class="px-4 py-2">¥5,500</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">9</td>
<td class="px-4 py-2">郑阳</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">33</td>
<td class="px-4 py-2">研发部</td>
<td class="px-4 py-2">后端工程师</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥23,000</td>
<td class="px-4 py-2">¥19,910</td>
<td class="px-4 py-2">¥15,000</td>
<td class="px-4 py-2">¥8,000</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
<tr class="table-row">
<td class="px-4 py-2">10</td>
<td class="px-4 py-2">林静</td>
<td class="px-4 py-2"></td>
<td class="px-4 py-2">31</td>
<td class="px-4 py-2">市场部</td>
<td class="px-4 py-2">市场策划</td>
<td class="px-4 py-2">2023-10</td>
<td class="px-4 py-2">¥18,500</td>
<td class="px-4 py-2">¥16,315</td>
<td class="px-4 py-2">¥12,000</td>
<td class="px-4 py-2">¥6,500</td>
<td class="px-4 py-2">
<button class="text-primary hover:underline">查看</button>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="px-4 py-3 flex items-center justify-between border-t border-gray-200">
<div class="text-xs text-gray-500">
显示 1 到 10 条,共 128 条记录
</div>
<div class="flex space-x-1">
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm hover:bg-gray-50">&laquo;</button>
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm bg-primary text-white">1</button>
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm hover:bg-gray-50">2</button>
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm hover:bg-gray-50">3</button>
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm hover:bg-gray-50">...</button>
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm hover:bg-gray-50">13</button>
<button class="px-3 py-1 border border-gray-200 rounded-md text-sm hover:bg-gray-50">&raquo;</button>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 底部页脚 -->
<footer class="w-full bg-secondary border-t border-gray-200 mt-10">
<div class="container mx-auto px-4 py-8">
<div class="grid grid-cols-4 gap-8">
<div>
<h4 class="text-sm font-semibold mb-4">关于我们</h4>
<p class="text-xs text-gray-600 mb-4">人力科技是一家专注于企业人力资源数字化解决方案的高科技企业,致力于为企业提供专业、高效的人力资源管理服务。</p>
<div class="flex space-x-4">
<a href="#" class="text-gray-500 hover:text-primary"><i class="fab fa-weixin"></i></a>
<a href="#" class="text-gray-500 hover:text-primary"><i class="fab fa-weibo"></i></a>
<a href="#" class="text-gray-500 hover:text-primary"><i class="fab fa-linkedin"></i></a>
</div>
</div>
<div>
<h4 class="text-sm font-semibold mb-4">产品服务</h4>
<ul class="space-y-2 text-xs text-gray-600">
<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>
<li><a href="#" class="hover:text-primary">招聘管理系统</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-semibold mb-4">帮助中心</h4>
<ul class="space-y-2 text-xs text-gray-600">
<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>
<li><a href="#" class="hover:text-primary">在线客服</a></li>
</ul>
</div>
<div>
<h4 class="text-sm font-semibold mb-4">联系我们</h4>
<ul class="space-y-2 text-xs text-gray-600">
<li class="flex items-start">
<i class="fas fa-map-marker-alt mr-2 mt-0.5"></i>
<span>北京市海淀区中关村软件园二期</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope mr-2"></i>
<span>service@hrtech.com</span>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-200 mt-8 pt-6 text-center text-xs text-gray-500">
<p>© 2023 人力科技 版权所有 京ICP备12345678号</p>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,520 @@
<!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;
}
.nav-item:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.tree-node:hover {
background-color: #E6E9F0;
}
.form-card {
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.scroll-container {
animation: scroll 15s linear infinite;
}
@keyframes scroll {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
i.fa-icon {
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body class="bg-gray-50">
<!-- 顶部导航栏 -->
<!-- <header class="bg-primary text-white sticky top-0 z-50">
<div class="container mx-auto px-4 h-15 flex items-center justify-between">
<div class="flex items-center">
<span class="font-['Pacifico'] text-xl mr-10">人力</span>
</div>
<nav class="flex-1 flex justify-center">
<ul class="flex space-x-6">
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">多维统计</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">人员管理</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">组织管理</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">考勤管理</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">绩效管理</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">薪酬管理</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">知识库</li>
<li class="nav-item px-3 py-2 rounded-button cursor-pointer">后台管理</li>
</ul>
</nav>
<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 rounded-button pl-8 pr-4 py-1 w-40 focus:outline-none">
<i class="fa-icon fa-solid fa-magnifying-glass absolute left-2 top-1/2 transform -translate-y-1/2 text-white text-sm"></i>
</div>
<div class="flex items-center space-x-2 cursor-pointer">
<div class="w-8 h-8 rounded-full bg-white flex items-center justify-center">
<i class="fa-icon fa-solid fa-user text-primary text-sm"></i>
</div>
<span class="text-sm">张明远</span>
</div>
<button class="bg-white text-primary text-sm px-3 py-1 rounded-button flex items-center space-x-1">
<i class="fa-icon fa-solid fa-robot text-sm"></i>
<span>AI 助手</span>
</button>
</div>
</div>
</header> -->
<!-- 公告栏 -->
<div class="bg-primary bg-opacity-10 py-2 overflow-hidden">
<div class="container mx-auto px-4">
<div class="flex items-center">
<span class="bg-primary text-white text-xs px-2 py-1 rounded-button mr-3 whitespace-nowrap">公告</span>
<div class="relative w-full overflow-hidden">
<div class="scroll-container whitespace-nowrap">
<span class="text-sm mr-8">2023年度绩效考核方案已发布请各部门负责人及时查阅</span>
<span class="text-sm mr-8">薪酬管理系统将于本周五18:00-20:00进行升级维护</span>
<span class="text-sm mr-8">新员工入职培训计划已更新,请相关人员做好准备</span>
<span class="text-sm mr-8">2023年度绩效考核方案已发布请各部门负责人及时查阅</span>
<span class="text-sm mr-8">薪酬管理系统将于本周五18:00-20:00进行升级维护</span>
<span class="text-sm mr-8">新员工入职培训计划已更新,请相关人员做好准备</span>
</div>
</div>
</div>
</div>
</div>
<!-- 主体内容 -->
<main class="container mx-auto px-4 py-6">
<div class="flex">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-4">
<div class="bg-white rounded-md shadow-sm p-4 h-full">
<div class="flex justify-between items-center mb-4">
<h3 class="font-medium text-gray-700">组织架构</h3>
<div class="flex space-x-2">
<button class="text-gray-500 hover:text-primary">
<i class="fa-icon fa-solid fa-expand text-sm"></i>
</button>
<button class="text-gray-500 hover:text-primary">
<i class="fa-icon fa-solid fa-filter text-sm"></i>
</button>
</div>
</div>
<div class="space-y-1">
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-building text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">集团公司</span>
</div>
<div class="pl-4">
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-building text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">北京分公司</span>
</div>
<div class="pl-4">
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-users text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">人力资源部</span>
</div>
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-chart-line text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">财务部</span>
</div>
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-laptop-code text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">技术研发部</span>
</div>
</div>
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-building text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">上海分公司</span>
</div>
<div class="pl-4">
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-users text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">人力资源部</span>
</div>
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-shopping-bag text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">市场部</span>
</div>
</div>
</div>
<div class="tree-node flex items-center py-1 px-2 rounded-button cursor-pointer">
<i class="fa-icon fa-solid fa-building text-gray-500 mr-2 text-sm"></i>
<span class="text-sm">深圳分公司</span>
</div>
</div>
</div>
</div>
<!-- 右侧薪酬规则设置 -->
<div class="w-4/5">
<div class="bg-white rounded-md shadow-sm p-6">
<div class="flex justify-between items-center mb-6">
<h2 class="text-xl font-semibold text-gray-800">薪酬计算规则设置</h2>
<div class="flex space-x-3">
<button class="bg-primary text-white text-sm px-4 py-2 rounded-button flex items-center space-x-2">
<i class="fa-icon fa-solid fa-save text-sm"></i>
<span>保存规则</span>
</button>
<button class="bg-white border border-gray-300 text-gray-700 text-sm px-4 py-2 rounded-button flex items-center space-x-2">
<i class="fa-icon fa-solid fa-times text-sm"></i>
<span>取消</span>
</button>
</div>
</div>
<div class="space-y-6">
<!-- 基本信息 -->
<div class="form-card bg-secondary rounded-md p-4">
<h3 class="font-medium text-gray-700 mb-3">基本信息</h3>
<div class="grid grid-cols-3 gap-4">
<div>
<label class="block text-sm text-gray-600 mb-1">规则名称</label>
<input type="text" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">适用组织</label>
<div class="relative">
<input type="text" value="集团公司/北京分公司" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">生效日期</label>
<div class="relative">
<input type="text" value="2023-07-01" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-calendar-days absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
</div>
</div>
<!-- 薪酬项设置 -->
<div class="form-card bg-secondary rounded-md p-4">
<div class="flex justify-between items-center mb-3">
<h3 class="font-medium text-gray-700">薪酬项设置</h3>
<button class="text-primary text-sm flex items-center space-x-1">
<i class="fa-icon fa-solid fa-plus text-sm"></i>
<span>添加薪酬项</span>
</button>
</div>
<div class="overflow-x-auto">
<table class="w-full">
<thead>
<tr class="text-left text-sm text-gray-500 border-b border-gray-200">
<th class="pb-2">薪酬项名称</th>
<th class="pb-2">类型</th>
<th class="pb-2">计税方式</th>
<th class="pb-2">计算公式</th>
<th class="pb-2">操作</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr>
<td class="py-3">
<input type="text" value="基本工资" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
</td>
<td class="py-3">
<div class="relative">
<input type="text" value="固定工资" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</td>
<td class="py-3">
<div class="relative">
<input type="text" value="税前" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</td>
<td class="py-3">
<input type="text" value="岗位工资基数 * 职级系数" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-64 focus:outline-none focus:ring-1 focus:ring-primary">
</td>
<td class="py-3">
<button class="text-red-500 hover:text-red-700">
<i class="fa-icon fa-solid fa-trash text-sm"></i>
</button>
</td>
</tr>
<tr>
<td class="py-3">
<input type="text" value="绩效奖金" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
</td>
<td class="py-3">
<div class="relative">
<input type="text" value="浮动工资" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</td>
<td class="py-3">
<div class="relative">
<input type="text" value="税前" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</td>
<td class="py-3">
<input type="text" value="基本工资 * 绩效系数" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-64 focus:outline-none focus:ring-1 focus:ring-primary">
</td>
<td class="py-3">
<button class="text-red-500 hover:text-red-700">
<i class="fa-icon fa-solid fa-trash text-sm"></i>
</button>
</td>
</tr>
<tr>
<td class="py-3">
<input type="text" value="交通补贴" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
</td>
<td class="py-3">
<div class="relative">
<input type="text" value="补贴" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</td>
<td class="py-3">
<div class="relative">
<input type="text" value="税后" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-32 focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</td>
<td class="py-3">
<input type="text" value="固定金额 500" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-64 focus:outline-none focus:ring-1 focus:ring-primary">
</td>
<td class="py-3">
<button class="text-red-500 hover:text-red-700">
<i class="fa-icon fa-solid fa-trash text-sm"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 社保公积金设置 -->
<div class="form-card bg-secondary rounded-md p-4">
<h3 class="font-medium text-gray-700 mb-3">社保公积金设置</h3>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm text-gray-600 mb-1">社保缴纳基数</label>
<div class="relative">
<input type="text" value="员工基本工资" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">公积金缴纳基数</label>
<div class="relative">
<input type="text" value="员工基本工资" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
</div>
<div class="mt-4">
<label class="block text-sm text-gray-600 mb-2">缴纳比例</label>
<div class="overflow-x-auto">
<table class="w-full">
<thead>
<tr class="text-left text-sm text-gray-500 border-b border-gray-200">
<th class="pb-2">项目</th>
<th class="pb-2">单位比例</th>
<th class="pb-2">个人比例</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr>
<td class="py-2">养老保险</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="16%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="8%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
</tr>
<tr>
<td class="py-2">医疗保险</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="9.5%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="2%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
</tr>
<tr>
<td class="py-2">失业保险</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="0.5%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="0.5%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
</tr>
<tr>
<td class="py-2">公积金</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="12%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
<td class="py-2">
<div class="relative w-24">
<input type="text" value="12%" class="border border-gray-300 rounded-md px-2 py-1 text-sm w-full focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 个税设置 -->
<div class="form-card bg-secondary rounded-md p-4">
<h3 class="font-medium text-gray-700 mb-3">个人所得税设置</h3>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm text-gray-600 mb-1">起征点</label>
<div class="relative">
<input type="text" value="5000" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
</div>
</div>
<div>
<label class="block text-sm text-gray-600 mb-1">专项附加扣除</label>
<div class="relative">
<input type="text" value="自动计算" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary">
<i class="fa-icon fa-solid fa-chevron-down absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 text-xs"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 底部通栏 -->
<footer class="bg-gray-800 text-white py-8 mt-10">
<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">视频教程</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="fa-icon fa-solid fa-phone mr-2 text-sm"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fa-icon fa-solid fa-envelope mr-2 text-sm"></i>
<span>service@hrsystem.com</span>
</li>
<li class="flex items-center">
<i class="fa-icon fa-solid fa-location-dot mr-2 text-sm"></i>
<span>北京市海淀区中关村软件园</span>
</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="fa-icon fa-brands fa-weixin text-sm"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fa-icon fa-brands fa-weibo text-sm"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white">
<i class="fa-icon fa-brands fa-linkedin-in text-sm"></i>
</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,475 @@
<!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;
}
.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%); }
}
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="min-h-[1024px] bg-gray-50 flex flex-col">
<!-- 顶部导航栏 -->
<!-- <header class="w-full bg-primary text-white shadow-md">
<div class="container mx-auto px-6 h-[60px] flex items-center justify-between">
<div class="flex items-center space-x-8">
<div class="font-logo text-xl">人力</div>
<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-primary-light text-sm text-white placeholder-gray-300 rounded-button pl-8 pr-4 py-2 border border-gray-300 focus:outline-none focus:ring-1 focus:ring-blue-500">
<i class="fas fa-search absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-300 fa-icon w-4 h-4"></i>
</div>
<button class="bg-blue-600 hover:bg-blue-700 text-white text-sm px-4 py-2 rounded-button flex items-center space-x-2">
<i class="fas fa-robot fa-icon 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 fa-icon w-4 h-4"></i>
</div>
</div>
</div>
</header> -->
<!-- 公告栏 -->
<div class="w-full bg-yellow-50 py-2 px-6 border-b border-yellow-200">
<div class="container mx-auto flex items-center">
<span class="text-yellow-700 font-medium text-sm mr-4 whitespace-nowrap">公告:</span>
<div class="scroll-container w-full">
<div class="scroll-content text-sm text-yellow-700">
2023年度绩效考核工作将于12月1日正式启动请各部门提前做好准备。2023年度员工满意度调查结果已发布请各部门负责人查阅。公司年度旅游活动报名开始截止日期11月30日。2024年春节放假安排已发布请各部门做好工作安排。公司新办公区将于2024年1月正式启用请各部门做好搬迁准备。
</div>
</div>
</div>
</div>
<!-- 主体内容 -->
<main class="flex-1 container mx-auto px-6 py-6 flex">
<!-- 左侧组织架构树 -->
<div class="w-1/5 pr-4">
<div class="bg-white rounded-md shadow-sm p-4 h-full">
<div class="flex justify-between items-center mb-4">
<h3 class="font-medium text-gray-700">组织架构</h3>
<button class="text-primary hover:text-blue-700">
<i class="fas fa-sync-alt fa-icon w-4 h-4"></i>
</button>
</div>
<div class="space-y-1">
<div class="flex items-center justify-between p-2 hover:bg-secondary rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-building text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">集团公司</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
<div class="pl-6">
<div class="flex items-center justify-between p-2 hover:bg-secondary rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-sitemap text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">人力资源部</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
<div class="pl-6">
<div class="flex items-center p-2 hover:bg-secondary rounded-md cursor-pointer">
<i class="fas fa-users text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">招聘组</span>
</div>
<div class="flex items-center p-2 hover:bg-secondary rounded-md cursor-pointer">
<i class="fas fa-users text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">培训组</span>
</div>
<div class="flex items-center p-2 hover:bg-secondary rounded-md cursor-pointer">
<i class="fas fa-users text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">薪酬组</span>
</div>
</div>
<div class="flex items-center justify-between p-2 hover:bg-secondary rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-sitemap text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">财务部</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 p-2 hover:bg-secondary rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-sitemap text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">技术研发中心</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 p-2 hover:bg-secondary rounded-md cursor-pointer">
<div class="flex items-center">
<i class="fas fa-sitemap text-gray-500 fa-icon w-4 h-4 mr-2"></i>
<span class="text-sm">市场营销部</span>
</div>
<i class="fas fa-chevron-down text-gray-400 fa-icon w-3 h-3"></i>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧部门列表 -->
<div class="w-4/5 pl-4">
<div class="bg-white rounded-md shadow-sm p-6 h-full">
<div class="flex justify-between items-center mb-6">
<div class="flex items-center space-x-4">
<h2 class="text-lg font-medium text-gray-800">部门管理</h2>
<div class="flex items-center space-x-2">
<span class="text-sm text-gray-500">年份:</span>
<div class="relative">
<button class="flex items-center justify-between bg-white border border-gray-300 rounded-button px-3 py-1 text-sm text-gray-700 w-28">
<span>2023</span>
<i class="fas fa-chevron-down fa-icon w-3 h-3 ml-2"></i>
</button>
</div>
</div>
</div>
<button class="bg-primary hover:bg-blue-700 text-white text-sm px-4 py-2 rounded-button flex items-center space-x-2">
<i class="fas fa-plus fa-icon w-4 h-4"></i>
<span>添加部门</span>
</button>
</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>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">1</td>
<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">24</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<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 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">18</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">3</td>
<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">56</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">4</td>
<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">32</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">5</td>
<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">28</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">6</td>
<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">22</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">7</td>
<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">15</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<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 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</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">9</td>
<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">12</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon w-4 h-4"></i>
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">10</td>
<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">8</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<button class="text-primary hover:text-blue-700 mr-3">
<i class="fas fa-users fa-icon w-4 h-4"></i>
</button>
<button class="text-blue-600 hover:text-blue-800 mr-3">
<i class="fas fa-edit fa-icon w-4 h-4"></i>
</button>
<button class="text-red-600 hover:text-red-800">
<i class="fas fa-trash-alt fa-icon 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 到 10 条,共 15 条记录
</div>
<div class="flex space-x-1">
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm text-gray-700 bg-white hover:bg-gray-50">上一页</button>
<button class="px-3 py-1 border border-primary rounded-button text-sm text-white bg-primary hover:bg-blue-700">1</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm text-gray-700 bg-white hover:bg-gray-50">2</button>
<button class="px-3 py-1 border border-gray-300 rounded-button text-sm text-gray-700 bg-white hover:bg-gray-50">下一页</button>
</div>
</div>
</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-4 gap-8">
<div>
<h3 class="text-sm font-medium 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-medium 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-medium 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">API文档</a></li>
<li><a href="#" class="hover:text-white">联系我们</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-medium 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 fa-icon w-4 h-4 mr-2"></i>
<span>北京市海淀区中关村软件园</span>
</li>
<li class="flex items-center">
<i class="fas fa-phone-alt fa-icon w-4 h-4 mr-2"></i>
<span>400-888-8888</span>
</li>
<li class="flex items-center">
<i class="fas fa-envelope fa-icon w-4 h-4 mr-2"></i>
<span>contact@hrsystem.com</span>
</li>
</ul>
<div class="flex space-x-4 mt-4">
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-gray-600">
<i class="fab fa-weixin fa-icon w-4 h-4"></i>
</a>
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-gray-600">
<i class="fab fa-weibo fa-icon w-4 h-4"></i>
</a>
<a href="#" class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center hover:bg-gray-600">
<i class="fab fa-linkedin-in fa-icon w-4 h-4"></i>
</a>
</div>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-xs text-gray-400">
<div class="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>
</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>
body {
min-height: 1024px;
display: flex;
flex-direction: column;
}
.main-content {
flex: 1;
}
.nav-link:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.ai-assistant {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
opacity: 0.8;
}
50% {
opacity: 1;
transform: scale(1.05);
}
100% {
opacity: 0.8;
}
}
.table-row:hover {
background-color: #F5F6FA;
}
.search-input:focus {
outline: none;
box-shadow: 0 0 0 2px rgba(45, 92, 246, 0.5);
}
.card-shadow {
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
</style>
</head>
<body class="bg-gray-50">
<!-- 顶部导航栏 -->
<!-- <header class="bg-primary text-white sticky top-0 z-50">
<div class="container mx-auto px-4">
<div class="flex items-center justify-between h-16">
<div class="flex items-center">
<span class="font-['Pacifico'] text-xl mr-10">人力</span>
<nav class="hidden md:flex space-x-1">
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">多维统计</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">人员管理</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">组织管理</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">考勤管理</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">绩效管理</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">薪酬管理</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">知识库</a>
<a href="#" class="nav-link px-3 py-2 text-sm rounded-button">后台管理</a>
</nav>
</div>
<div class="flex items-center space-x-4">
<div class="relative hidden lg:block">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-search text-gray-400" style="width: 16px; height: 16px; display: flex; justify-content: center; align-items: center;"></i>
</div>
<input type="text" class="search-input bg-white text-gray-800 pl-10 pr-4 py-2 rounded-button text-sm w-64 focus:outline-none" placeholder="搜索...">
</div>
<div class="flex items-center">
<img src="https://mastergo.com/ai/api/search-image?query=professional+asian+business+man+headshot+with+white+background&width=32&height=32&orientation=squarish&flag=ccdb4f7d825487d0239ffd0e25db8ae5"
alt="用户头像"
class="w-8 h-8 rounded-full object-cover">
</div>
<button class="ai-assistant bg-white text-primary px-3 py-1 rounded-button text-sm flex items-center whitespace-nowrap">
<i class="fas fa-robot mr-2" style="width: 14px; height: 14px; display: flex; justify-content: center; align-items: center;"></i>
AI助手
</button>
</div>
</div>
</div>
</header> -->
<!-- 主要内容区 -->
<main class="main-content py-8">
<div class="container mx-auto px-4 max-w-6xl">
<!-- 页面标题和操作区 -->
<div class="flex justify-between items-center mb-6">
<h1 class="text-2xl font-semibold text-gray-800">配置项管理</h1>
<button class="bg-primary text-white px-4 py-2 rounded-button text-sm flex items-center whitespace-nowrap">
<i class="fas fa-plus mr-2" style="width: 14px; height: 14px; display: flex; justify-content: center; align-items: center;"></i>
新建配置项
</button>
</div>
<!-- 搜索区 -->
<div class="bg-white card-shadow rounded-md p-6 mb-6">
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">配置项名称</label>
<input type="text" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:ring-primary focus:border-primary">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">配置项 Code</label>
<input type="text" class="w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:ring-primary focus:border-primary">
</div>
<div class="flex items-end">
<button class="bg-primary text-white px-4 py-2 rounded-button text-sm whitespace-nowrap w-full">
<i class="fas fa-search mr-2" style="width: 14px; height: 14px;"></i>
查询
</button>
</div>
</div>
</div>
<!-- 配置项列表 -->
<div class="bg-white card-shadow rounded-md overflow-hidden">
<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">配置 Code</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-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="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">系统名称</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">system.name</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">人力管理系统</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">张明远</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-05-12 14:30</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
<tr class="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">登录超时时间</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">session.timeout</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">30分钟</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">李思雨</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-06-18 09:15</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
<tr class="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">默认每页条数</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">page.size</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">20</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">王建国</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-07-22 16:45</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
<tr class="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">系统Logo URL</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">system.logo</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">/assets/logo.png</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">赵晓雯</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-08-05 11:20</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
<tr class="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">数据备份路径</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">backup.path</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">/data/backup</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">陈宇航</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-09-14 13:10</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
<tr class="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">邮件服务器地址</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">mail.server</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">smtp.example.com</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">林志强</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-10-08 10:05</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
<tr class="table-row">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">系统维护时间</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">maintenance.time</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">每周日 02:00-04:00</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">吴晓峰</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">2023-11-19 15:30</td>
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button class="text-primary hover:text-primary-dark mr-3">编辑</button>
<button class="text-red-600 hover:text-red-900">删除</button>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="bg-white px-6 py-4 flex items-center justify-between border-t border-gray-200">
<div class="flex-1 flex justify-between sm:hidden">
<a href="#" 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">
上一页
</a>
<a href="#" 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">
下一页
</a>
</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">7</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">
<a href="#" 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" style="width: 12px; height: 12px; display: flex; justify-content: center; align-items: center;"></i>
</a>
<a href="#" 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
</a>
<a href="#" 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
</a>
<a href="#" 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
</a>
<span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700">
...
</span>
<a href="#" 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">
8
</a>
<a href="#" 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" style="width: 12px; height: 12px; display: flex; justify-content: center; align-items: center;"></i>
</a>
</nav>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 底部通栏 -->
<footer class="bg-gray-800 text-white py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div>
<h3 class="text-sm font-semibold uppercase tracking-wider mb-4">关于我们</h3>
<ul class="space-y-2">
<li><a href="#" class="text-gray-300 hover:text-white text-sm">公司简介</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">发展历程</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">企业文化</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">招贤纳士</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-semibold uppercase tracking-wider mb-4">产品服务</h3>
<ul class="space-y-2">
<li><a href="#" class="text-gray-300 hover:text-white text-sm">人力资源系统</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">薪酬管理系统</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">绩效管理系统</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">培训管理系统</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-semibold uppercase tracking-wider mb-4">帮助中心</h3>
<ul class="space-y-2">
<li><a href="#" class="text-gray-300 hover:text-white text-sm">使用指南</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">常见问题</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">视频教程</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">在线客服</a></li>
</ul>
</div>
<div>
<h3 class="text-sm font-semibold uppercase tracking-wider mb-4">联系我们</h3>
<ul class="space-y-2">
<li class="text-gray-300 text-sm">电话400-888-8888</li>
<li class="text-gray-300 text-sm">邮箱contact@hrsystem.com</li>
<li class="text-gray-300 text-sm">地址北京市海淀区科技园路88号</li>
<li class="flex space-x-4 mt-4">
<a href="#" class="text-gray-300 hover:text-white">
<i class="fab fa-weixin" style="width: 16px; height: 16px; display: flex; justify-content: center; align-items: center;"></i>
</a>
<a href="#" class="text-gray-300 hover:text-white">
<i class="fab fa-weibo" style="width: 16px; height: 16px; display: flex; justify-content: center; align-items: center;"></i>
</a>
<a href="#" class="text-gray-300 hover:text-white">
<i class="fab fa-linkedin" style="width: 16px; height: 16px; display: flex; justify-content: center; align-items: center;"></i>
</a>
</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center">
<p class="text-gray-400 text-xs">© 2023 人力管理系统 版权所有</p>
<div class="flex space-x-6 mt-4 md:mt-0">
<a href="#" class="text-gray-400 hover:text-white text-xs">隐私政策</a>
<a href="#" class="text-gray-400 hover:text-white text-xs">服务条款</a>
<a href="#" class="text-gray-400 hover:text-white text-xs">法律声明</a>
<a href="#" class="text-gray-400 hover:text-white text-xs">ICP备案号京ICP备12345678号</a>
</div>
</div>
</div>
</footer>
</body>
</html>

@ -0,0 +1,338 @@
// @ts-nocheck
import React from 'react'
import { history, RequestConfig, type AxiosResponse, matchPath } from '@umijs/max'
import { notification } from 'antd'
import NotificationTemplate from '@/components/NotificationTemplate'
import { getTokenAuthority, setUserInfo } from '@/utils/globalCommon'
import errorCode from '@/utils/errorCode'
import { queryCurrent } from '@/services/user'
import defaultSettings from '../config/defaultSettings'
import { getAllForProMenuByUserId } from '@/services/system/api_promenu'
import { getAllForProResourceActionByUserId } from '@/services/system/api_proresourceaction'
import * as allIcons from '@ant-design/icons'
import 'dayjs/locale/zh-cn'
import dayjs from 'dayjs'
import weekday from 'dayjs/plugin/weekday'
import localeData from 'dayjs/plugin/localeData'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.locale('zh-cn')
dayjs.extend(weekday)
dayjs.extend(localeData)
dayjs.extend(customParseFormat)
dayjs.extend(relativeTime)
const loginPath = '/login'
const { REACT_APP_ENV } = process.env
let staticMapList = ['/', '/login', '/register', '/exception00', '/exception00/403', '/exception00/404', '/exception00/500', '/exception00/1403']
let tempMapList = []
//约定 src/app.tsx 为运行时配置
export async function getInitialState (type) {
tempMapList = []
// 如果是登录页面,不执行
if (history.location.pathname !== loginPath || type === 'refresh') {
try {
history.replace({
pathname: "/topnavbar00/hrefficiency"
})
// if (!localStorage.getItem('antd-token-authority')) {
// history.replace({
// pathname: loginPath
// })
// localStorage.clear()
// throw new Error()
// }
// let response = await queryCurrent()
// const { datarecord: { user: currentUser, roles } } = response
// localStorage.setItem('antd-token-userid', currentUser.user_id ?? '')
// localStorage.setItem('antd-token-username', currentUser.user_name ?? '')
// localStorage.setItem('antd-token-poweruser', currentUser.poweruser ?? '')
// localStorage.setItem('antd-pro-authority', roles ? JSON.stringify(roles) : '')
// localStorage.setItem('antd-token-user', currentUser ? JSON.stringify(currentUser) : '')
// setUserInfo()
// let menuData = await getAllForProMenuByUserId({
// user_name: currentUser.user_name,
// parentid: '000000000000',
// systemid: '000000000000'
// })
// let resourceData = await getAllForProResourceActionByUserId({
// systemid: '000000000000'
// })
// localStorage.setItem('antd-pro-button', resourceData?.datarecord?.button ? JSON.stringify(resourceData?.datarecord?.button) : '')
// const toHump = (name) => name.replace(/-(\w)/g, (all, letter) => letter.toUpperCase())
// let tempList = []
// let tempMap = []
// const formatter = (data, list) => {
// data?.map(item => {
// tempMap.push((item?.redirect === '' ? null : item?.redirect) ?? item?.key)
// // if (item?.hideInMenu) return
// if (item?.alias === 'ywmk') {
// formatter(item?.children ?? [], tempList)
// return
// }
// let tempObj = {
// key: (item?.redirect === '' ? null : item?.redirect) ?? item?.key,
// label: item?.label,
// hideInMenu: item?.hideInMenu,
// children: []
// }
// if (item?.children || item?.routes) formatter(item?.children?.length > 0 ? item?.children : (item?.routes?.length > 0 ? item?.routes : []), tempObj.children)
// tempObj.children.length === 0 && delete tempObj.children
// if (item?.icon) {
// const { icon } = item
// const v4IconName = toHump(icon.replace(icon[0], icon[0].toUpperCase()))
// const NewIcon = allIcons[icon] || allIcons[''.concat(v4IconName, 'Outlined')]
// if (NewIcon) {
// try {
// tempObj.icon = React.createElement(NewIcon)
// } catch (error) {}
// }
// }
// list.push(tempObj)
// })
// }
// formatter(menuData.list ?? [], tempList)
// menuData.list = tempList
// tempMapList = tempMap
// window.dynamicRoute = tempList
return {
// currentUser,
settings: defaultSettings,
// menu: menuData.list,
// menuMap: tempMap
}
} catch (error) {
// notification.error({
// message: '网络异常',
// description: '用户信息获取失败!'
// })
// history.replace({
// pathname: loginPath
// })
}
}
return {
currentUser: null,
menu: null,
settings: defaultSettings
}
}
export function onRouteChange({ location }) {
const locationName = location.pathname
const menuMap = [...staticMapList, ...tempMapList]
let foundFlag = menuMap?.some(item => !!matchPath(item, locationName))
//本地开发注释掉下面这一行
// !foundFlag && (window.location.href = '/exception00/404')
}
/**
* 便
* @param error
*/
const printErrorInfo = (error: {}) => {
const { code, message, status, timestamp, request = {} } = error || {}
const { url, options } = request
const { method, headers, params, data } = options
const paramsKeys = Object.keys(params || {})
const tempParams = paramsKeys && paramsKeys.length ? params : data // 接口的参数有可能在 params 中也有可能在 data 里
const errorTagStyle = [
'color: #ff4d4f',
'background: #fff2f0',
'padding: 2px 6px',
'font-size: 12px',
'border-radius: 2px',
'border: 1px solid #ff4d4f'
].join('')
console.log('%c接口报错信息', errorTagStyle)
console.log(`
------------- error-start -------------
${timestamp || new Date().toString()}
HTTP Status${status || 200}
${url}
${method}
headers${JSON.stringify(headers)}
${JSON.stringify(tempParams || {})}
code${code}
message${message}
------------- error-end ---------------
`)
}
export const dva = {
config: {
onError(e: { preventDefault: () => void }) {
e.preventDefault()
}
}
}
/**
*
*/
const errorHandler = (error: any) => {
if (error && Object.keys(error).length > 0) {
REACT_APP_ENV === 'dev' && printErrorInfo(error)
const { status, success, message: msg } = error
if (status === 203 || status === 401) {
/*let duration = 4
let interval = setInterval(function(){
if(duration === 0) {
// 跳转到登录页 记录是从哪个页面跳转到登录页的,登录后直接跳转到对应的页面
const redirect = window.location.pathname === '/' || window.location.pathname === '/topnavbar/home' ? {} : { redirect: window.location.href }
history.replace({
pathname: loginPath,
search: JSON.stringify(redirect)
})
// 跳到登录页时需要将存储在本地的信息全部清除掉
localStorage.clear()
clearInterval(interval)
} else {
duration--
notification.error({
key: 'notification_login',
message: '未登录或登录已过期,请重新登录!',
description: `${duration === 0 ? '即': duration + ' 秒之后'}将跳转到登录页面`
})
}
}, 1000)*/
} else if (status <= 504 && status >= 500) {
history.push('/exception/500') //500
}/* else if (status === 403) {
history.push('/exception/403') //403
} */else if (status >= 404 && status < 422) {
history.push('/exception/404') //404
} else if (status === 1403) {
history.replace({
pathname: '/exception/1403'
}) //未授权
} else {
// 获取错误信息
let errorText = errorCode[status] || msg || errorCode['default']
if (errorText == 'Network Error') {
errorText = '后端接口连接异常'
} else if (errorText.includes('timeout')) {
errorText = '系统接口请求超时'
} else if (errorText.includes('Request failed with status code')) {
errorText = '系统接口请求异常'
}
// 注释掉错误提示,根据需求不再显示
/*notification.error({
message: `请求错误 ${errorText || ''}`,
description: <NotificationTemplate message={errorText || ''} />
})*/
}
} else {
// notification.config({ maxCount: 1 })
// notification.error({
// description: '您的网络发生异常,无法连接服务器',
// message: '网络异常'
// })
}
// reject出去之后使用时才可通过.catch对异常情况进行处理
// return Promise.reject(error)
}
/**
* headers
*/
const getHeaders = () => {
// 统一的headers
return {
Authorization: getTokenAuthority()
}
}
/**
* request
*/
export const request: RequestConfig = {
timeout: 20000,
errorConfig: {
errorHandler: errorHandler, // 默认错误处理
// errorThrower: printErrorInfo // 默认错误抛出
},
adaptor: (resData: any) => {
return {
...resData,
success: true,
errorMessage: resData.message
}
},
credentials: 'include', // 默认请求是否带上cookie
headers: getHeaders(),
requestInterceptors: [
(url: any, options: any) => {
let headers = getTokenAuthority() ? getHeaders() : {}
return {
url: url,
options: { ...options, headers: headers }
}
}
],
responseInterceptors: [
async (response: AxiosResponse<T>) => {
const responseClone = response || {}
if(responseClone.status === 200) {
// 二进制数据则直接返回
if(response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
return response
}
const data = await responseClone?.data || {}
let { success, message: msg, status } = data
if (!success) {
// msg = msg?.split('')[0] || msg?.match(/[\u4e00-\u9fa5|\uff01|\uff0c|\u3002]/gi).join(')
if(status) {
// 注意需要reject出去才会在请求不成功或返回错误的status时调用errorHandler
// data.message = msg
return Promise.reject(data)
} else {
// 只保留汉字 !,。
// message.error(msg)
// notification.error({
// message: `${msg?.split('')[0] || '请求错误'}: `,
// description: <NotificationTemplate message={data.message || ''}/>
// })
}
}
} else {
return Promise.reject({
status: responseClone.status,
statusText: responseClone.statusText
})
}
return response
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

@ -0,0 +1,162 @@
import React, { PureComponent } from 'react';
import { connect } from 'umi';
import { Modal, Tooltip, Input, Button } from 'antd';
import './index.less';
import style from "@/global.less";
import StandardTable from '@/components/StandardTable';
import { AX } from '@/utils/pr_new_datadictionary';
import { initTreeSelect } from '@/utils/globalCommon'
@connect(({ baseinfodata, loading }) => ({
baseinfodata,
loading: loading.models.baseinfodata,
}))
class A01UserTable extends PureComponent {
constructor(props) {
super(props);
this.state = {
visible: false,
selectedRows: [],
selectedRowKeys: [],
formValues: '',
};
}
UNSAFE_componentWillReceiveProps(nextProps) {
if (undefined != nextProps.visible) {
this.setState({ visible: nextProps.visible });
if(!nextProps.visible) {
this.setState({ selectedRows: [], formValues: '', selectedRowKeys: [] });
}
}
// if (undefined != nextProps.value) {
// this.setState({ selectedRowKeys: nextProps.value. });
// }
}
columns = [
{
title: '姓名',
dataIndex: 'za0101',
key: 'za0101',
width: 80,
fixed: 'left',
},
{
title: '性别',
dataIndex: 'aa0107',
key: 'aa0107',
render: val => {
const list = AX || [];
if (val) {
return (
<Tooltip title={initTreeSelect(list, val)}>
<span className={style.nowrapper} style={{ width: '150px' }}>
{initTreeSelect(list, val)}</span>
</Tooltip>
)
}
}
},
]
componentDidMount() {
const { dispatch } = this.props;
dispatch({
type: 'baseinfodata/query_page_for_aa01',
});
}
handleModalVisible() {
const { getChildrenMsg } = this.props;
const { selectedRows } = this.state;
if (getChildrenMsg && selectedRows[0]) {
getChildrenMsg(false, selectedRows[0]);
} else {
getChildrenMsg(false);
}
}
handleSelectRows = (selectedRowKeys, selectedRows) => {
this.setState({
selectedRowKeys: selectedRowKeys,
selectedRows: selectedRows,
});
};
handleStandardTableChange = (pagination, filtersArg, sorter) => {
const { dispatch } = this.props;
const { formValues } = this.state;
const params = {
currentPage: pagination.current,
pageSize: pagination.pageSize,
id: formValues || undefined,
};
if (sorter.field) {
params.sorter = `${sorter.field}_${sorter.order}`;
}
dispatch({
type: 'baseinfodata/query_page_for_aa01',
payload: params,
});
};
handleChangeSearch(e) {
this.setState({ formValues: e.target.value })
}
handleSearch() {
const { formValues } = this.state;
const params = { id: formValues }
dispatch({
type: 'baseinfodata/query_page_for_aa01',
payload: params,
});
}
render() {
const {
baseinfodata: { data },
loading,
} = this.props;
const { visible, selectedRows, selectedRowKeys } = this.state;
return (
<div className='a01-user-table'>
<Modal
title="用户列表"
width={300}
height={500}
bodyStyle={{ padding: '20px', maxHeight: '500px', overflowY: 'auto' }}
open={visible}
onOk={() => this.handleModalVisible(false)}
onCancel={() => this.handleModalVisible(false)}
>
<div style={{ marginBottom: '6px', display: 'flex' }}>
<Input onChange={(e) => this.handleChangeSearch(e)} placeholder="" style={{ width: '100%' }} />
<Button type="primary" onClick={this.handleSearch}>搜索</Button>
</div>
<StandardTable
rowKey={"id"}
selectedRows={selectedRows}
loading={loading}
data={data}
columns={this.columns}
// onSelectRow={this.handleSelectRows}
onChange={this.handleStandardTableChange}
rowSelection={{ type: 'radio', selectedRowKeys: selectedRowKeys, onChange: this.handleSelectRows }}
/>
</Modal>
</div>
);
}
}
export default A01UserTable;

@ -0,0 +1,446 @@
import React, {PureComponent} from 'react';
import {Input, message, Tree, Modal} from 'antd';
import {DeleteOutlined, EditOutlined, FileOutlined, PlusCircleOutlined, ExclamationCircleOutlined} from '@ant-design/icons';
import {contextMenu, Item, Menu} from 'react-contexify';
import 'react-contexify/dist/ReactContexify.min.css';
import {getNodeByKeyAndCallbackProcess} from '@/components/_utils/algorithmTools';
import {connect} from '@umijs/max';
const {Search} = Input;
@connect(({globaldata, loading}) => ({
globaldata,
loading: loading.models.globaldata,
}))
class AsyncTree extends PureComponent {
state = {
expandedKeys: ['000000000000'],
autoExpandParent: true,
selectedKeys: [],
treeData: [],
selectedTreeByRightClick: "",
searchValue: '',
dataList: [],
display: "block",
};
constructor(props) {
super(props);
this.state.treeData = [
{title: props.rootNodeName, id: '000000000000', key: '000000000000', value: '000000000000', levelcode: "000000000000"},
]
}
componentDidMount() {
const {dispatch, getTreeMethod, reQueryParent} = this.props;
if(!reQueryParent) {
return
}
dispatch({
type: 'globaldata/' + getTreeMethod,
payload: {
parentid: "#"
},
callback: (res) => {
console.log(res)
if (res.success == true && res?.list.length > 0) {
const temList = res.list?.map((item) => {
return {
key: item.id,
...item
}
})
this.setState({
treeData: temList
})
}
}
});
}
//展开收起
onExpand = expandedKeys => {
this.setState({
expandedKeys,
autoExpandParent: false,
});
};
// 选中的树节点
onSelect = (selectedKeys, {node}) => {
const {checkedTreeChild} = this.props;
this.setState({selectedKeys});
if(checkedTreeChild) {
checkedTreeChild(node);
}
};
addMenuTreeNode = () => {
const {handleModalVisible} = this.props;
handleModalVisible(true, this.state.selectedTreeByRightClick, this.reLoadCurrentTreeNode);
};
updateMenuTreeNode = () => {
const {handleUpdateModalVisible} = this.props;
handleUpdateModalVisible(true, this.state.selectedTreeByRightClick, this.reLoadCurrentTreeNodeUpdate);
};
viewMenuTreeNode = () => {
const {handleViewModalVisible} = this.props;
handleViewModalVisible(true, this.state.selectedTreeByRightClick);
};
deleteMenuTreeNode = () => {
const {handleDeleteRecord} = this.props;
Modal.confirm({
title: '你确定要删除吗?',
icon: <ExclamationCircleOutlined />,
content: '删除该节点后其子节点也会删除!这并不会删除该节点及其子节点的的关联数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
handleDeleteRecord(this.state.selectedTreeByRightClick, this.reLoadCurrentTreeNodeDelete)
},
});
};
// 响应右键点击
rightClickTreeNode = ({event, node}) => {
event.preventDefault();
contextMenu.show({
id: 'menu_id',
event: event,
props: {
foo: 'bar'
}
});
if (node.key != '000000000000') {
this.setState({
selectedTreeByRightClick: node,
display: "block",
});
} else {
this.setState({
selectedTreeByRightClick: node,
display: "none",
});
}
}
// 右键菜单
MyAwesomeMenu = () => (
<Menu id='menu_id' theme="light" style={{zIndex: 1000}}>
<Item onClick={this.addMenuTreeNode}>
<PlusCircleOutlined style={{fontSize: 16, paddingTop: 3}}/>
<span style={{paddingLeft: 10}}>添加</span>
</Item>
<Item onClick={this.updateMenuTreeNode} style={{display: this.state.display}}>
<EditOutlined style={{fontSize: 16, paddingTop: 3}}/>
<span style={{paddingLeft: 10}}>修改</span>
</Item>
<Item onClick={this.viewMenuTreeNode} style={{display: this.state.display}}>
<FileOutlined style={{fontSize: 16, paddingTop: 3}}/>
<span style={{paddingLeft: 10}}>查看</span>
</Item>
<Item onClick={this.deleteMenuTreeNode} style={{display: this.state.display}}>
<DeleteOutlined style={{fontSize: 16, paddingTop: 3}}/>
<span style={{paddingLeft: 10}}>删除</span>
</Item>
</Menu>
);
// 组装树数据
updateTreeData(list, key, children) {
return list.map(node => {
if (node.key === key) {
return {
...node,
children,
};
} else if (node.children) {
return {
...node,
children: this.updateTreeData(node.children, key, children),
};
}
return node;
});
}
/**
* 异步加载树数据
* @param key
* @param children
* @returns {Promise<unknown>}
*/
onLoadData = ({key, children}) => {
const {dispatch, getTreeMethod} = this.props;
const params = {
parentid: key
};
return new Promise((resolve) => {
// if (children) {
// resolve();
// return;
// }
dispatch({
type: 'globaldata/' + getTreeMethod,
payload: params,
callback: (res) => {
if (res.success == true) {
const temList = res.list?.map((item) => {
return {
key: item.id,
...item
}
})
this.setState({
treeData: this.updateTreeData(this.state.treeData, key, temList)
});
}
resolve();
}
});
});
};
reLoadCurrentTreeNode = (treeNode, dropKey) => {
const data = [...this.state.treeData];
treeNode.key = treeNode.id;
getNodeByKeyAndCallbackProcess(data, dropKey, (item) => {
item.children = item.children || [];
// where to insert 示例添加到尾部,可以是随意位置
item.children.push(treeNode);
});
this.setState({
treeData: data,
});
};
reLoadCurrentTreeNodeUpdate = (treeNode, currentTreeNodeKey, parentTreeNodeKey) => {
const data = [...this.state.treeData];
getNodeByKeyAndCallbackProcess(data, parentTreeNodeKey, (item) => {
item.children = item.children || {};
item.children = item.children.map((item, key) => item.key == currentTreeNodeKey ? {...item, ...treeNode} : item)
// item.children.push(treeNode);
});
this.setState({
treeData: data,
});
}
reLoadCurrentTreeNodeDelete = (currentTreeNodeKey) => {
const data = [...this.state.treeData];
getNodeByKeyAndCallbackProcess(data, currentTreeNodeKey, (item, index, arr) => {
arr.splice(index, 1);
});
this.setState({
treeData: data,
});
}
// 搜索事件
onChange = e => {
const {treeData, dataList} = this.state;
const {value} = e.target;
const expandedKeys = dataList.map(item => {
if (item.title.indexOf(value) > -1) {
return this.getParentKey(item.title, treeData);
}
return null;
}).filter((item, i, self) => item && self.indexOf(item) === i);
this.setState({
expandedKeys,
searchValue: value,
autoExpandParent: true,
});
};
getParentKey = (title, tree) => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some(item => item.title === title)) {
parentKey = node.key;
} else if (this.getParentKey(title, node.children)) {
parentKey = this.getParentKey(title, node.children);
}
}
}
return parentKey;
};
generateList = data => {
if (undefined == data) {
return false;
}
for (let i = 0; i < data.length; i++) {
const node = data[i];
const {key, title} = node;
this.state.dataList.push({key, title: title});
if (node.children) {
this.generateList(node.children);
}
}
};
onDrop = async info => {
const dropKey = info.node.key;
const dragKey = info.dragNode.key;
const dropPos = info.node.pos.split('-');
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
const source_parent_id = info.dragNode.parentid;
const source_levelcode = info.dragNode.levelcode;
let new_levelcode = "";
let dragKey_parent_id = "";
let sequences = "";
let sequencesArray = [];
const data = [...this.state.treeData];
// Find dragObject
let dragObj;
getNodeByKeyAndCallbackProcess(data, dragKey, (item, index, arr) => {
arr.splice(index, 1);
dragObj = item;
});
if (!info.dropToGap) {
let ar;
// Drop on the content 移动到未展开的节点里
getNodeByKeyAndCallbackProcess(data, dropKey, (item, index) => {
new_levelcode = item.levelcode + "/" + dragKey;
dragKey_parent_id = item.key;
ar = item.children || [];
dragObj.levelcode = new_levelcode;
dragObj.parentid = dragKey_parent_id;
item.children = item.children || [];
sequences = item.children.length;
// where to insert 示例添加到尾部,可以是随意位置 push
item.children.unshift(dragObj);
});
ar.forEach((item, index) => {
let arrs = {
id: item.key,
sequences: index
}
sequencesArray.push(arrs);
})
} else if (
(info.node.props.children || []).length > 0 && // Has children
info.node.props.expanded && // Is expanded
dropPosition === 1 // On the bottom gap
) {
getNodeByKeyAndCallbackProcess(data, dropKey, (item) => {
new_levelcode = item.levelcode + "/" + dragKey;
dragKey_parent_id = item.key
dragObj.levelcode = new_levelcode;
dragObj.parentid = dragKey_parent_id;
item.children = item.children || [];
item.children.unshift(dragObj);
});
} else {
let ar;
let i;
getNodeByKeyAndCallbackProcess(data, dropKey, (item, index, arr) => {
new_levelcode = item.levelcode.replace(item.key, "") + dragKey;
dragKey_parent_id = item.parentid
dragObj.levelcode = new_levelcode;
dragObj.parentid = dragKey_parent_id;
ar = arr;
i = index;
});
if (dropPosition === -1) {
sequences = i;
ar.splice(i, 0, dragObj);
} else {
sequences = i + 1;
ar.splice(i + 1, 0, dragObj);
}
ar.forEach((item, index, arr) => {
if(sequences <= index) {
let arrs = {
id: item.key,
sequences: index
}
sequencesArray.push(arrs);
}
})
}
const {dispatch, updateTreeNodeByDragUrl} = this.props;
await dispatch({
type: 'globaldata/' + updateTreeNodeByDragUrl,
payload: {
source_id: dragKey,
source_parentid: source_parent_id,
source_levelcode: source_levelcode,
target_id: dragKey_parent_id,
levelcode: new_levelcode,
sequences: sequences,
sequencesArray: sequencesArray
},
callback: async (res) => {
if(res.success == true) {
message.success('修改成功');
await this.setState({
treeData: data,
});
}
}
});
}
render() {
const { height, modify } = this.props;
const {autoExpandParent, expandedKeys, selectedKeys, treeData} = this.state;
this.generateList(treeData);
return (
<div style={{float: 'left', width: '30%'}}>
<Search style={{marginBottom: 8, width: '100%'}} placeholder={'请输入'}
onChange={this.onChange}/>
<Tree
loadData={this.onLoadData}
onExpand={this.onExpand}
expandedKeys={expandedKeys}
autoExpandParent={autoExpandParent}
onSelect={this.onSelect}
selectedKeys={selectedKeys}
onRightClick={this.rightClickTreeNode}
draggable={modify}
onDrop={this.onDrop}
treeData={treeData}
height={height || 700}
>
</Tree>
{modify ? this.MyAwesomeMenu() : null}
</div>
);
}
}
export default AsyncTree;

@ -0,0 +1,2 @@
@import '~antd/es/style/themes/default.less';

@ -0,0 +1,57 @@
@avatar-size-base: 32px;
@avatar-size-lg: 40px;
@avatar-size-sm: 24px;
@font-size-base: 14px;
@border-color-base: hsv(0, 0, 85%);
.avatarList {
display: inline-block;
ul {
display: inline-block;
margin-left: 8px;
font-size: 0;
}
}
.avatarItem {
display: inline-block;
width: @avatar-size-base;
height: @avatar-size-base;
margin-left: -8px;
font-size: @font-size-base;
:global {
.ant-avatar {
border: 1px solid @border-color-base;
}
}
}
.avatarItemLarge {
width: @avatar-size-lg;
height: @avatar-size-lg;
}
.avatarItemSmall {
width: @avatar-size-sm;
height: @avatar-size-sm;
}
.avatarItemMini {
width: 20px;
height: 20px;
:global {
.ant-avatar {
width: 20px;
height: 20px;
line-height: 20px;
.ant-avatar-string {
font-size: 12px;
line-height: 18px;
}
}
}
}

@ -0,0 +1,73 @@
import { Avatar, Tooltip } from 'antd'
import React from 'react'
import classNames from 'classnames'
import styles from './index.less'
export declare type SizeType = number | 'small' | 'default' | 'large'
export interface AvatarItemProps {
tips: React.ReactNode
src: string
size?: SizeType
style?: React.CSSProperties
onClick?: () => void
}
export interface AvatarListProps {
Item?: React.ReactElement<AvatarItemProps>
size?: SizeType
maxLength?: number
excessItemsStyle?: React.CSSProperties
style?: React.CSSProperties
children: React.ReactElement<AvatarItemProps> | React.ReactElement<AvatarItemProps>[]
}
const avatarSizeToClassName = (size?: SizeType | 'mini') =>
classNames(styles.avatarItem, {
[styles.avatarItemLarge]: size === 'large',
[styles.avatarItemSmall]: size === 'small',
[styles.avatarItemMini]: size === 'mini'
})
const Item: React.FC<AvatarItemProps> = ({ src, size, tips, onClick = () => {} }) => {
const cls = avatarSizeToClassName(size)
return (
<li className={cls} onClick={onClick}>
{tips ? (
<Tooltip title={tips}>
<Avatar src={src} size={size} style={{ cursor: 'pointer' }} />
</Tooltip>
) : (
<Avatar src={src} size={size} />
)}
</li>
)
}
const AvatarList: React.FC<AvatarListProps> & { Item: typeof Item } = ({children, size, maxLength = 5, excessItemsStyle, ...other}) => {
const numOfChildren = React.Children.count(children)
const numToShow = maxLength >= numOfChildren ? numOfChildren : maxLength
const childrenArray = React.Children.toArray(children) as React.ReactElement<AvatarItemProps>[]
const childrenWithProps = childrenArray.slice(0, numToShow).map((child) => React.cloneElement(child, { size }))
if (numToShow < numOfChildren) {
const cls = avatarSizeToClassName(size)
childrenWithProps.push(
<li key='exceed' className={cls}>
<Avatar size={size} style={excessItemsStyle}>{`+${numOfChildren - maxLength}`}</Avatar>
</li>
)
}
return (
<div {...other} className={styles.avatarList}>
<ul> {childrenWithProps} </ul>
</div>
)
}
AvatarList.Item = Item
export default AvatarList

File diff suppressed because it is too large Load Diff

@ -0,0 +1,900 @@
import React, { useState } from 'react';
import { CloseCircleOutlined } from '@ant-design/icons';
import {
Form,
Input,
DatePicker,
Modal,
Button,
Upload
} from 'antd';
import SelectOptionTree from '@/components/SelectOptionTree';
import { MyIcon } from "@/components/Icon"
import { XQ, AE, AX, _09, AB, OR, BG, AT, HC, OC, OD, RF, X4 } from '@/utils/pr_new_datadictionary';
import moment from 'moment';
import styles from '@/global.less';
import style from '../index.less';
const FormItem = Form.Item;
const Aa01CreateForm = (props) => {
const [form] = Form.useForm();
const { modalVisible, handleAdd, handleModalVisible, dictDataList } = props;
const [error, setError] = useState([]);
const [subLoading, setSubLoading] = useState(false);
const [imageUrl, setImageUrl] = useState('');
const [imageFile, setImageFile] = useState({});
const okHandle = () => {
form
.validateFields()
.then(fieldsValue => {
if(imageFile){
fieldsValue.imageFile = imageFile
}
setSubLoading(true);
setError([]);
handleAdd(fieldsValue, form, setSubLoading);
setImageUrl('')
setImageFile({})
})
.catch(errInfo => {
onFinishFailed(errInfo)
});
};
const onFinishFailed = (errorInfo) => {
setError(errorInfo.errorFields)
}
const getErrorInfo = (errors) => {
const errorCount = errors.filter((item) => item.errors.length > 0).length;
if (!errors || errorCount === 0) {
return null;
}
return (
<span className={styles.errorIcon}>
<CloseCircleOutlined />{errorCount}
</span>
);
};
const beforeUpload = file => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
if (!isJpgOrPng) {
message.error('只能上传 JPG/JPEG/PNG 格式的文件!');
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error('图像必须小于2MB!');
}
return isJpgOrPng && isLt2M;
}
const handleChange = info => {
if (info.file.status === 'done') {
// Get this url from response in real world.
if (window.FileReader) {
const reader = new FileReader();
reader.readAsDataURL(info.file.originFileObj);
reader.addEventListener('load', () => {
setImageUrl(reader.result);
});
}
setImageFile(info.file?.originFileObj);
}
};
const uploadButton = (<MyIcon className={style.headIcon} type="icon-user" />);
return (
<Modal
width={1300}
height={500}
bodyStyle={{ padding: '20px', maxHeight: '500px', overflowY: 'auto' }}
forceRender={true}
destroyOnClose
getContainer={false}
title="新增"
visible={modalVisible}
onCancel={() => handleModalVisible()}
afterClose={() => handleModalVisible()}
footer={<>{getErrorInfo(error)}
<Button onClick={() => handleModalVisible()}>关闭</Button>
<Button loading={subLoading} type="primary" onClick={() => okHandle()}>提交</Button></>}
>
<Form form={form} onFinish={okHandle} onFinishFailed={onFinishFailed}
colon={false} hideRequiredMark>
<table className={styles.formtable}>
<tbody>
<tr>
<td colSpan="28">人员基本情况信息</td>
</tr>
<tr>
<td colSpan="3">
<span>工号</span>
</td>
<td colSpan="4">
<FormItem label="" name="gh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>姓名</span>
</td>
<td colSpan="4">
<FormItem label="" name="za0101">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>性别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0107">
<SelectOptionTree treeData={AX || []} />
</FormItem>
</td>
{/* 照片za9998 */}
<td colSpan="7" style={{ position: 'relative', border: 'none' }}>
<div style={{ position: 'absolute', left: '28%', top: '20px' }} className={style.photoBox}>
<Upload
accept="image/jpg,image/jpeg,image/png"
listType="picture-card"
className="avatar-uploader"
showUploadList={false}
beforeUpload={beforeUpload}
onChange={handleChange}
style={{ display: 'table', width: '120px', height: '140px' }}
>
{imageUrl ? <img src={imageUrl} alt="图片加载失败" style={{ width: '120px', height: '130px' }} /> : uploadButton}
</Upload>
<div className="ant-upload-text" style={{ marginTop: '5px' }}>上传照片</div>
</div>
</td>
</tr>
<tr>
<td colSpan="3">
<span>手机</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010b">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010i">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>年龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0141">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>助记码</span>
</td>
<td colSpan="4">
<FormItem label="" name="zjm">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>公司</span>
</td>
<td colSpan="4">
<FormItem label="" name="gs">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>部门</span>
</td>
<td colSpan="4">
<FormItem label="" name="bm">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职位</span>
</td>
<td colSpan="4">
<FormItem label="" name="zw">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职称</span>
</td>
<td colSpan="4">
<FormItem label="" name="zc">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>险种</span>
</td>
<td colSpan="4">
<FormItem label="" name="xz">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>身份证</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0177">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>考勤卡号</span>
</td>
<td colSpan="4">
<FormItem label="" name="kqkh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>学历</span>
</td>
<td colSpan="4">
<FormItem label="" name="xl">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>婚姻状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0127">
<SelectOptionTree treeData={BG || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>员工密码</span>
</td>
<td colSpan="4">
<FormItem label="" name="ygmm">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>确认密码</span>
</td>
<td colSpan="4">
<FormItem label="" name="qrmm">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>学位</span>
</td>
<td colSpan="4">
<FormItem label="" name="xw">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>籍贯</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0114">
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>出生日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0111">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>民族</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0121">
<SelectOptionTree treeData={AE || []} />
</FormItem>
</td>
<td colSpan="3">
<span>政治面貌</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa2205">
<SelectOptionTree treeData={AT || []} />
</FormItem>
</td>
<td colSpan="3">
<span>类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="lb">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>毕业学校</span>
</td>
<td colSpan="4">
<FormItem label="" name="byxx">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>所学专业</span>
</td>
<td colSpan="4">
<FormItem label="" name="sxzy">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>毕业日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="byrq">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>基本工资</span>
</td>
<td colSpan="4">
<FormItem label="" name="jbgz">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>家庭住址</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010n">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>户口地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010m">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>微信账号</span>
</td>
<td colSpan="11">
<FormItem label="" name="wxzh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>档案地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="dadz">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>联系人</span>
</td>
<td colSpan="4">
<FormItem label="" name="lxr">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>联系人电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="lxrdh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>紧急联系人</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae010m">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>紧急联系人电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="ai0102">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>招聘专员</span>
</td>
<td colSpan="4">
<FormItem label="" name="zpzy">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职工类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="zglb">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>入职日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="rzrq">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>上岗日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="sgrq">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作场所</span>
</td>
<td colSpan="4">
<FormItem label="" name="gzcs">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>个人爱好</span>
</td>
<td colSpan="4">
<FormItem label="" name="grah">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工作日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="gzrq">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职称日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="zcrq">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="gzdh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>QQ账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="qqzh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>合同开始</span>
</td>
<td colSpan="4">
<FormItem label="" name="htks">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>合同结束</span>
</td>
<td colSpan="4">
<FormItem label="" name="htjs">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>实习开始</span>
</td>
<td colSpan="4">
<FormItem label="" name="sxks">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>实习结束</span>
</td>
<td colSpan="4">
<FormItem label="" name="sxjs">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>试用开始</span>
</td>
<td colSpan="4">
<FormItem label="" name="syks">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>试用结束</span>
</td>
<td colSpan="4">
<FormItem label="" name="syjs">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位工龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0101">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>人员类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa010d">
<SelectOptionTree treeData={OR || []} />
</FormItem>
</td>
<td colSpan="3">
<span>合同类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="htlb">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>招聘来源</span>
</td>
<td colSpan="4">
<FormItem label="" name="zply">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>部门岗位</span>
</td>
<td colSpan="4">
<FormItem label="" name="bmgw">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>岗位级别</span>
</td>
<td colSpan="4">
<FormItem label="" name="gwjb">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>员工状态</span>
</td>
<td colSpan="4">
<FormItem label="" name="ygzt">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>离职日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="lzrq">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>邮箱</span>
</td>
<td colSpan="4">
<FormItem label="" name="yx">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>出生地</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0117">
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
<td colSpan="3">
<span>离职方式</span>
</td>
<td colSpan="4">
<FormItem label="" name="lzfs">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>离职原因</span>
</td>
<td colSpan="4">
<FormItem label="" name="lzyy">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>货币编码</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0115">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>参加工作日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0141">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工资类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa5510">
<SelectOptionTree treeData={HC || []} />
</FormItem>
</td>
<td colSpan="3">
<span>扣税标准</span>
</td>
<td colSpan="4">
<FormItem label="" name="ksbz">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>进入本单位日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0144">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0151">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>开户银行</span>
</td>
<td colSpan="4">
<FormItem label="" name="khyh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工资账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010e">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>港澳台及外籍人士</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0181">
<SelectOptionTree treeData={OC || []} />
</FormItem>
</td>
<td colSpan="3">
<span>参加党派时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="cjdpsj">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>养老账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="ylzh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>医保账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="ybzh">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位</span>
</td>
<td colSpan="4">
<FormItem label="" name="ab0111">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>下属部门</span>
</td>
<td colSpan="4">
<FormItem label="" name="ab0112">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>失业账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="syzh">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>公积金账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="gjjzh">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>特长</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0103">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>减员时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0112">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>有效证件类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0117">
<SelectOptionTree treeData={OD || []} />
</FormItem>
</td>
<td colSpan="3">
<span>成本类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010a">
<SelectOptionTree treeData={X4 || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工资卡状态</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010k">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>连续工龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010o">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工资卡发放状态</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010j">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
</td>
<td colSpan="4">
</td>
</tr>
<tr>
<td colSpan="3">
<span>备注</span>
</td>
<td colSpan="25">
<FormItem label="" name="aa0108">
<Input placeholder="" />
</FormItem>
</td>
</tr>
</tbody>
</table>
</Form>
</Modal>
);
};
export default Aa01CreateForm;

@ -0,0 +1,98 @@
import {
Row,
Col,
Form,
Input,
DatePicker,
Button,
} from 'antd';
import SelectOptionTree from '@/components/SelectOptionTree';
import { AX, OR, } from '@/utils/pr_new_datadictionary';
import { UpOutlined } from '@ant-design/icons';
import style from "@/global.less";
const FormItem = Form.Item;
const Aa01RenderAdvancedForm = (props) => {
const [form] = Form.useForm();
const { handleSearch, handleFormReset, toggleForm } = props;
const onFinish = values => {
//console.log('Received values of form: ', values);
handleSearch(values);
};
const myhandleFormReset = () => {
form.resetFields();
handleFormReset();
};
return (
<Form form={form} onFinish={onFinish} layout="inline">
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchinput}>
<Col md={8} sm={24}>
<FormItem label="本单位工龄" name="aa0101">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="人工成本统计标识" name="aa0106">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
</Row>
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchinput}>
<Col md={8} sm={24}>
<FormItem label="性别" name="aa0107">
<SelectOptionTree treeData={AX || []} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="备注" name="aa0108">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="人员类别" name="aa010d">
<SelectOptionTree treeData={OR || []} />
</FormItem>
</Col>
</Row>
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchbox}>
<Col md={24} sm={24}>
<div style={{ marginBottom: 12, display: 'flex', justifyContent: 'flex-end' }}>
<Button type="primary" htmlType="submit">
查询
</Button>
<Button style={{ marginLeft: 8 }} onClick={myhandleFormReset}>
重置
</Button>
<a style={{ marginLeft: 8, lineHeight: '32px' }} onClick={toggleForm}>
收起 <UpOutlined />
</a>
</div>
</Col>
</Row>
</Form>
);
};
export default Aa01RenderAdvancedForm;

@ -0,0 +1,70 @@
import {
Row,
Col,
Form,
Input,
DatePicker,
Button,
} from 'antd';
import { DownOutlined } from '@ant-design/icons';
import style from "@/global.less";
const FormItem = Form.Item;
const Aa01RenderSimpleForm = (props) => {
const [form] = Form.useForm();
const { submitButtons, handleSearch, handleFormReset, toggleForm } = props;
const onFinish = values => {
//console.log('Received values of form: ', values);
handleSearch(values);
};
const myhandleFormReset = () => {
form.resetFields();
handleFormReset();
};
return (
<Form form={form} onFinish={onFinish} layout="inline">
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchinput}>
<Col md={8} sm={24}>
<FormItem label="本单位工龄" name="aa0101">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="人工成本统计标识" name="aa0106">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<div style={{ marginBottom: 12, display: 'flex', justifyContent: 'flex-end' }}>
<Button type="primary" htmlType="submit">
查询
</Button>
<Button style={{ marginLeft: 8 }} onClick={myhandleFormReset}>
重置
</Button>
<a style={{ marginLeft: 8, lineHeight: '32px' }} onClick={toggleForm}>
展开 <DownOutlined />
</a>
</div>
</Col>
</Row>
</Form>
);
};
export default Aa01RenderSimpleForm;

File diff suppressed because it is too large Load Diff

@ -0,0 +1,911 @@
import {
Form,
Input,
DatePicker,
Modal,
Upload
} from 'antd';
import SelectOptionTree from '@/components/SelectOptionTree';
import { XQ, AE, AX, _09, AB, OR, BG, AT, HC, OC, OD, RF, X4 } from '@/utils/pr_new_datadictionary';
import userAvatar from '@/assets/img/user_avatar.png';
import styles from "@/global.less";
import moment from 'moment';
import style from '../index.less';
import React, { useState } from 'react';
const FormItem = Form.Item;
const Aa01ViewForm = (props) => {
const { viewModalVisible, handleViewModalVisible, values } = props;
const [form] = Form.useForm();
const photoUrl = values?.zp?.fileurl ?? '';
React.useEffect(() => {
form?.setFieldsValue({
id: values.id,//ID主键
gh: values.gh, //工号,
za0101: values.za0101, //姓名,
aa0107: values.aa0107, //性别,
za9998: values.za9998, //照片,
ak010b: values.ak010b, //手机,
ak010i: values.ak010i, //电话,
ae0141: values.ae0141, //年龄,
zjm: values.zjm, //助记码,
gs: values.gs, //公司,
bm: values.bm, //部门,
zw: values.zw, //职位,
zc: values.zc, //职称,
xz: values.xz, //险种,
aa0177: values.aa0177, //身份证,
kqkh: values.kqkh, //考勤卡号,
xl: values.xl, //学历,
aa0127: values.aa0127, //婚姻状况,
ygmm: values.ygmm, //员工密码,
qrmm: values.qrmm, //确认密码,
xw: values.xw, //学位,
aa0114: values.aa0114, //籍贯,
aa0111: values?.aa0111 ? moment(values.aa0111, 'YYYY-MM-DD') : '', //出生日期,
aa0121: values.aa0121, //民族,
aa2205: values.aa2205, //政治面貌,
lb: values.lb, //类别,
byxx: values.byxx, //毕业学校,
sxzy: values.sxzy, //所学专业,
byrq: values?.byrq ? moment(values.byrq, 'YYYY-MM-DD') : '', //毕业日期,
jbgz: values.jbgz, //基本工资,
ak010n: values.ak010n, //家庭住址,
ak010m: values.ak010m, //户口地址,
wxzh: values.wxzh, //微信账号,
dadz: values.dadz, //档案地址,
lxr: values.lxr, //联系人,
lxrdh: values.lxrdh, //联系人电话,
ae010m: values.ae010m, //紧急联系人,
ai0102: values.ai0102, //紧急联系人电话,
zpzy: values.zpzy, //招聘专员
rzrq: values?.rzrq ? moment(values.rzrq, 'YYYY-MM-DD') : '', //入职日期
sgrq: values?.sgrq ? moment(values.sgrq, 'YYYY-MM-DD') : '', //上岗日期
gzcs: values.gzcs, //工作场所
grah: values.grah, //个人爱好
gzrq: values?.gzrq ? moment(values.gzrq, 'YYYY-MM-DD') : '', //工作日期
zcrq: values?.zcrq ? moment(values.zcrq, 'YYYY-MM-DD') : '', //职称日期
gzdh: values.gzdh, //工作电话
qqzh: values.qqzh, //QQ账号
htks: values.htks, //合同开始
htjs: values.htjs, //合同结束
sxks: values.sxks, //实习开始
sxjs: values.sxjs, //实习结束
syks: values.syks, //试用开始
syjs: values.syjs, //试用结束
aa0101: values.aa0101, //单位工龄
aa010d: values.aa010d, //人员类别
htlb: values.htlb, //合同类别
zply: values.zply, //招聘来源
bmgw: values.bmgw, //部门岗位
gwjb: values.gwjb, //岗位级别
ygzt: values.ygzt, //员工状态
lzrq: values?.lzrq ? moment(values.lzrq, 'YYYY-MM-DD') : '', //离职日期
yx: values.yx, //邮箱
aa0117: values.aa0117, //出生地
lzfs: values.lzfs, //离职方式
lzyy: values.lzyy, //离职原因
aa0115: values.aa0115, //货币编码
aa0141: values?.aa0141 ? moment(values.aa0141, 'YYYY-MM-DD') : '', //参加工作日期
aa5510: values.aa5510, //工资类别
ksbz: values.ksbz, //扣税标准
aa0144: values?.aa0144 ? moment(values.aa0144, 'YYYY-MM-DD') : '', //进入本单位日期
aa0151: values.aa0151, //工龄
khyh: values.khyh, //开户银行
ak010e: values.ak010e, //工资账号
aa0181: values.aa0181, //港澳台及外籍人士
cjdpsj: values?.cjdpsj ? moment(values.cjdpsj, 'YYYY-MM-DD') : '', //参加党派时间
ylzh: values.ylzh, //养老账号
ybzh: values.ybzh, //医保账号
ab0111: values.ab0111, //单位
ab0112: values.ab0112, //下属部门
syzh: values.syzh, //失业账号
gjjzh: values.gjjzh, //公积金账号
ae0103: values.ae0103, //特长
ae0112: values?.ae0112 ? moment(values.ae0112, 'YYYY-MM-DD') : '', //减员时间
ae0117: values.ae0117, //有效证件类别
ak010a: values.ak010a, //成本类别
ak010k: values.ak010k, //工资卡状态
ak010o: values.ak010o, //连续工龄
ak010j: values.ak010j, //工资卡发放状态
aa0108: values.aa0108, //备注
});
}, [values, form]);
return (
<Modal
width={1200}
height={500}
bodyStyle={{ padding: '20px', maxHeight: '500px', overflowY: 'auto' }}
forceRender={true}
getContainer={false}
title="查看"
visible={viewModalVisible}
onOk={() => handleViewModalVisible(false, values)}
onCancel={() => handleViewModalVisible(false, values)}
afterClose={() => handleViewModalVisible()}
>
<Form form={form} layout="vertical" hideRequiredMark>
<table className={styles.formtable}>
<tbody>
<tr>
<td colSpan="28">人员基本情况信息</td>
</tr>
<tr>
<td colSpan="3">
<span>工号</span>
</td>
<td colSpan="4">
<FormItem label="" name="gh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>姓名</span>
</td>
<td colSpan="4">
<FormItem label="" name="za0101">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>性别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0107">
<SelectOptionTree disabled treeData={AX || []} />
</FormItem>
</td>
{/* 照片za9998 */}
<td colSpan="7" style={{ position: 'relative', border: 'none' }}>
<div style={{ position: 'absolute', left: '28%', top: '50px' }} className={style.photoBox}>
<img src={photoUrl ? photoUrl : userAvatar} alt="avatar" style={{ width: '120px', height: '130px' }} />
</div>
</td>
</tr>
<tr>
<td colSpan="3">
<span>手机</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010b">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010i">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>年龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0141">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>助记码</span>
</td>
<td colSpan="4">
<FormItem label="" name="zjm">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>公司</span>
</td>
<td colSpan="4">
<FormItem label="" name="gs">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>部门</span>
</td>
<td colSpan="4">
<FormItem label="" name="bm">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职位</span>
</td>
<td colSpan="4">
<FormItem label="" name="zw">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职称</span>
</td>
<td colSpan="4">
<FormItem label="" name="zc">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>险种</span>
</td>
<td colSpan="4">
<FormItem label="" name="xz">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>身份证</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0177">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>考勤卡号</span>
</td>
<td colSpan="4">
<FormItem label="" name="kqkh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>学历</span>
</td>
<td colSpan="4">
<FormItem label="" name="xl">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>婚姻状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0127">
<SelectOptionTree disabled treeData={BG || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>员工密码</span>
</td>
<td colSpan="4">
<FormItem label="" name="ygmm">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>确认密码</span>
</td>
<td colSpan="4">
<FormItem label="" name="qrmm">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>学位</span>
</td>
<td colSpan="4">
<FormItem label="" name="xw">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>籍贯</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0114">
<SelectOptionTree disabled treeData={AB || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>出生日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0111">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>民族</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0121">
<SelectOptionTree disabled treeData={AE || []} />
</FormItem>
</td>
<td colSpan="3">
<span>政治面貌</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa2205">
<SelectOptionTree disabled treeData={AT || []} />
</FormItem>
</td>
<td colSpan="3">
<span>类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="lb">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>毕业学校</span>
</td>
<td colSpan="4">
<FormItem label="" name="byxx">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>所学专业</span>
</td>
<td colSpan="4">
<FormItem label="" name="sxzy">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>毕业日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="byrq">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>基本工资</span>
</td>
<td colSpan="4">
<FormItem label="" name="jbgz">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>家庭住址</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010n">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>户口地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010m">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>微信账号</span>
</td>
<td colSpan="11">
<FormItem label="" name="wxzh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>档案地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="dadz">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>联系人</span>
</td>
<td colSpan="4">
<FormItem label="" name="lxr">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>联系人电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="lxrdh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>紧急联系人</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae010m">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>紧急联系人电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="ai0102">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>招聘专员</span>
</td>
<td colSpan="4">
<FormItem label="" name="zpzy">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职工类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="zglb">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>入职日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="rzrq">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>上岗日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="sgrq">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作场所</span>
</td>
<td colSpan="4">
<FormItem label="" name="gzcs">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>个人爱好</span>
</td>
<td colSpan="4">
<FormItem label="" name="grah">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工作日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="gzrq">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职称日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="zcrq">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作电话</span>
</td>
<td colSpan="4">
<FormItem label="" name="gzdh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>QQ账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="qqzh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>合同开始</span>
</td>
<td colSpan="4">
<FormItem label="" name="htks">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>合同结束</span>
</td>
<td colSpan="4">
<FormItem label="" name="htjs">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>实习开始</span>
</td>
<td colSpan="4">
<FormItem label="" name="sxks">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>实习结束</span>
</td>
<td colSpan="4">
<FormItem label="" name="sxjs">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>试用开始</span>
</td>
<td colSpan="4">
<FormItem label="" name="syks">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>试用结束</span>
</td>
<td colSpan="4">
<FormItem label="" name="syjs">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位工龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0101">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>人员类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa010d">
<SelectOptionTree disabled treeData={OR || []} />
</FormItem>
</td>
<td colSpan="3">
<span>合同类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="htlb">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>招聘来源</span>
</td>
<td colSpan="4">
<FormItem label="" name="zply">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>部门岗位</span>
</td>
<td colSpan="4">
<FormItem label="" name="bmgw">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>岗位级别</span>
</td>
<td colSpan="4">
<FormItem label="" name="gwjb">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>员工状态</span>
</td>
<td colSpan="4">
<FormItem label="" name="ygzt">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>离职日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="lzrq">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>邮箱</span>
</td>
<td colSpan="4">
<FormItem label="" name="yx">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>出生地</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0117">
<SelectOptionTree disabled treeData={AB || []} />
</FormItem>
</td>
<td colSpan="3">
<span>离职方式</span>
</td>
<td colSpan="4">
<FormItem label="" name="lzfs">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>离职原因</span>
</td>
<td colSpan="4">
<FormItem label="" name="lzyy">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>货币编码</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0115">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>参加工作日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0141">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工资类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa5510">
<SelectOptionTree disabled treeData={HC || []} />
</FormItem>
</td>
<td colSpan="3">
<span>扣税标准</span>
</td>
<td colSpan="4">
<FormItem label="" name="ksbz">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>进入本单位日期</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0144">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0151">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>开户银行</span>
</td>
<td colSpan="4">
<FormItem label="" name="khyh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工资账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010e">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>港澳台及外籍人士</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0181">
<SelectOptionTree disabled treeData={OC || []} />
</FormItem>
</td>
<td colSpan="3">
<span>参加党派时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="cjdpsj">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>养老账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="ylzh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>医保账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="ybzh">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位</span>
</td>
<td colSpan="4">
<FormItem label="" name="ab0111">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>下属部门</span>
</td>
<td colSpan="4">
<FormItem label="" name="ab0112">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>失业账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="syzh">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>公积金账号</span>
</td>
<td colSpan="4">
<FormItem label="" name="gjjzh">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>特长</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0103">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>减员时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0112">
<DatePicker disabled format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>有效证件类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="ae0117">
<SelectOptionTree disabled treeData={OD || []} />
</FormItem>
</td>
<td colSpan="3">
<span>成本类别</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010a">
<SelectOptionTree disabled treeData={X4 || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工资卡状态</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010k">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>连续工龄</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010o">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>工资卡发放状态</span>
</td>
<td colSpan="4">
<FormItem label="" name="ak010j">
<Input readOnly placeholder="" />
</FormItem>
</td>
<td colSpan="3">
</td>
<td colSpan="4">
</td>
</tr>
<tr>
<td colSpan="3">
<span>备注</span>
</td>
<td colSpan="25">
<FormItem label="" name="aa0108">
<Input readOnly placeholder="" />
</FormItem>
</td>
</tr>
</tbody>
</table>
</Form>
</Modal>
);
}
export default Aa01ViewForm;

@ -0,0 +1,83 @@
.aa01tableList {
.aa01tableListOperator {
margin-bottom: 16px;
button {
margin-right: 8px;
}
}
}
.aa01tableListForm {
:global {
.ant-form-item {
display: flex;
margin-right: 0;
margin-bottom: 24px;
> .ant-form-item-label {
width: auto;
padding-right: 8px;
line-height: 32px;
}
.ant-form-item-control {
line-height: 32px;
}
}
.ant-form-item-control-wrapper {
flex: 1;
}
}
.submitButtons {
display: block;
margin-bottom: 24px;
white-space: nowrap;
}
}
.icon {
width: 0.8em;
height: 0.8em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.ant-upload{
width: 130px !important;
height: 140px !important;
}
.staffPhoto {
font-size: 70px;
vertical-align: middle;
}
.photoBox {
.headIcon {
display: flex;
justify-content: center;
svg {
height: 150px;
width: 140px;
opacity: .75;
}
}
:global {
.ant-upload-select-picture-card{
height: 150px;
width: 150px;
}
}
}
@media screen and (max-width: @screen-lg) {
.aa01tableListForm :global(.ant-form-item) {
margin-right: 24px;
}
}
@media screen and (max-width: @screen-md) {
.aa01tableListForm :global(.ant-form-item) {
margin-right: 8px;
}
}

@ -0,0 +1,579 @@
import { PureComponent, Fragment } from 'react';
import { DownOutlined, SearchOutlined, EditOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons';
import { history, connect } from 'umi';
import {
Card,
Button,
Dropdown,
Menu,
message,
DatePicker,
Divider,
Popconfirm,
Tooltip
} from 'antd';
import { initTreeSelect, userInfo } from '@/utils/globalCommon'
import { XQ, AE, AX, _09, AB, OR, BG, AT, HC, OC, OD, RF, X4 } from '@/utils/pr_new_datadictionary';
import Aa01VipCreateForm from './form/Aa01VipCreateForm'; //新增表单
import Aa01VipUpdateForm from './form/Aa01VipUpdateForm'; //修改表单
import Aa01VipViewForm from './form/Aa01VipViewForm'; //查看表单
import Aa01VipRenderSimpleForm from './form/Aa01VipRenderSimpleForm'; //简单查询表单
import Aa01VipRenderAdvancedForm from './form/Aa01VipRenderAdvancedForm'; //高级查询表单
import moment from 'moment';
import StandardTable from '@/components/StandardTable';
import style from '@/global.less';
import styles from './index.less';
const { RangePicker } = DatePicker;
/* eslint react/no-multi-comp:0 */
@connect(({ baseinfodata, loading }) => ({
baseinfodata,
loading: loading.models.baseinfodata,
}))
class Aa01VipTable extends PureComponent {
state = {
modalVisible: false,
updateModalVisible: false,
viewModalVisible: false,
expandForm: false,
selectedRows: [],
formValues: {},
updateFormValues: {},
viewFormValues: {},
};
columns = [
{
title: '姓名',
dataIndex: 'za0101',
key: 'za0101',
width: 80,
fixed: 'left',
},
{
title: '性别',
dataIndex: 'aa0107',
key: 'aa0107',
render: val => {
const list = AX || [];
if (val) {
return (
<Tooltip title={initTreeSelect(list, val)}>
<span className={style.nowrapper} style={{ width: '150px' }}>
{initTreeSelect(list, val)}</span>
</Tooltip>
)
}
}
},
{
title: '民族',
dataIndex: 'aa0121',
key: 'aa0121',
render: val => {
const list = AE || [];
if (val) {
return (
<Tooltip title={initTreeSelect(list, val)}>
<span className={style.nowrapper} style={{ width: '150px' }}>
{initTreeSelect(list, val)}</span>
</Tooltip>
)
}
}
},
{
title: '出生年月',
dataIndex: 'aa0111',
key: 'aa0111',
render: val => (<span>{moment(val).format("YYYY-MM")}</span>)
},
{
title: '籍贯',
dataIndex: 'aa0114',
key: 'aa0114',
render: val => {
const list = AB || [];
if (val) {
return (
<Tooltip title={initTreeSelect(list, val)}>
<span className={style.nowrapper} style={{ width: '150px' }}>
{initTreeSelect(list, val)}</span>
</Tooltip>
)
}
}
},
{
title: '参加工作时间',
dataIndex: 'aa0141',
key: 'aa0141',
},
{
title: '职称',
dataIndex: 'v_aa011a',
key: 'v_aa011a',
},
{
title: '婚姻状况',
dataIndex: 'aa0127',
key: 'aa0127',
render: val => {
const list = BG || [];
if (val) {
return (
<Tooltip title={initTreeSelect(list, val)}>
<span className={style.nowrapper} style={{ width: '150px' }}>
{initTreeSelect(list, val)}</span>
</Tooltip>
)
}
}
},
{
title: '健康状况',
dataIndex: 'v_aa011b',
key: 'v_aa011b',
},
{
title: '身份证号码',
dataIndex: 'aa0177',
key: 'aa0177',
},
{
title: '操作',
width: 220,
fixed: 'right',
render: (text, record) => (
<Fragment>
<a onClick={() => this.handleViewModalVisible(true, record)}> <SearchOutlined style={{ color: '#00FFFF' }} />查看 </a>
<Divider type="vertical" />
<a onClick={() => this.handleUpdateModalVisible(true, record)}> <EditOutlined style={{ color: '#FF4500' }} />编辑 </a>
<Divider type="vertical" />
<Popconfirm title="你确定要删除吗?" okText="确定" cancelText="取消" onConfirm={() => this.handleDeleteRecord(record)} >
<a href={"javascript"} > <DeleteOutlined style={{ color: '#40E0D0' }} /> 删除</a>
</Popconfirm>
</Fragment>
),
},
];
componentDidMount() {
const { dispatch } = this.props;
dispatch({
type: 'baseinfodata/query_page_for_aa01',
});
}
handleStandardTableChange = (pagination, filtersArg, sorter) => {
const { dispatch } = this.props;
const { formValues } = this.state;
const params = {
currentPage: pagination.current,
pageSize: pagination.pageSize,
...formValues,
};
if (sorter.field) {
params.sorter = `${sorter.field}_${sorter.order}`;
}
dispatch({
type: 'baseinfodata/query_page_for_aa01',
payload: params,
});
};
previewItem = record => {
const id = record.id;
//history.push(`/baseinfodata/basic/${id}{id}`);
};
handleFormReset = () => {
const { dispatch } = this.props;
this.setState({
formValues: {},
});
dispatch({
type: 'baseinfodata/query_page_for_aa01',
payload: {},
});
};
toggleForm = () => {
const { expandForm } = this.state;
this.setState({
expandForm: !expandForm,
});
};
handleSelectRows = rows => {
this.setState({
selectedRows: rows,
});
};
handleSearch = values => {
const { dispatch } = this.props;
this.setState({
formValues: values,
});
dispatch({
type: 'baseinfodata/query_page_for_aa01',
payload: values,
});
};
handleModalVisible = flag => {
this.setState({
modalVisible: !!flag,
});
};
handleUpdateModalVisible = (flag, record) => {
this.setState({
updateModalVisible: !!flag,
updateFormValues: record || {},
});
};
handleViewModalVisible = (flag, record) => {
this.setState({
viewModalVisible: !!flag,
viewFormValues: record || {},
});
};
handleAdd = (fields, form, loading) => {
const { dispatch } = this.props;
const params = {
za0101: fields.za0101, // 姓 名
aa0107: fields.aa0107, // 性 别 aa0107
aa0121: fields.aa0121, // 民 族 aa0121
aa0111: fields.aa0111, // 出 生 年 月 aa0111
aa0114: fields.aa0114, // 籍 贯 aa0114
aa0117: fields.aa0117, // 出生地 aa0117
aa0141: fields.aa0141, // 参加工作时间 aa0141
v_aa011n: fields.v_aa011n, // 党派交叉情况 v_aa011n
v_aa011a: fields.v_aa011a, // 职 称 v_aa011a
aa0127: fields.aa0127, // 婚 姻 状 况 aa0127
v_aa011b: fields.v_aa011b, // 健 康 状 况 v_aa011b
aa0177: fields.aa0177, // 身份证号 码 aa0177
v_aa011c: fields.v_aa011c, // 工作单位 v_aa011c
v_aa011d: fields.v_aa011d, // 职 务 v_aa011d
v_aa011h: fields.v_aa011h, // 职务层次 v_aa011h
v_aa011f: fields.v_aa011f, // 任现职务层次时间 v_aa011f
v_aa011e: fields.v_aa011e, // 职 级 v_aa011e
v_aa011g: fields.v_aa011g, // 任 现 职 级 时 间 v_aa011g
v_aa011i: fields.v_aa011i, // 单位地址 v_aa011i
v_aa011j: fields.v_aa011j, // 固定电话 v_aa011j
v_aa011k: fields.v_aa011k, // 家庭地址 v_aa011k
ak010g: fields.ak010g, // 邮政编码 ak010g
ak010b: fields.ak010b, // 手机号码 ak010b
v_aa011l: fields.v_aa011l, // 电子邮箱 v_aa011l
v_aa011m: fields.v_aa011m, // 专业专长 v_aa011m
// za9998: fields.za9998, // 头像
}
if(fields.file) {
const formData = new FormData();
formData.append('file', fields.file);
dispatch({
type: 'baseinfodata/upload_single_file',
payload: formData,
callback: ({ success, datarecord}) => {
loading(false);
if (success == true) {
params.za9998 = datarecord.id
dispatch({
type: 'baseinfodata/insert_for_aa01',
payload: params,
callback: (res) => {
loading(false);
if (res.success == true) {
message.success('添加成功');
form.resetFields();
this.handleModalVisible();
}
}
});
}
else {
message.error('照片上传失败');
}
}
});
} else {
dispatch({
type: 'baseinfodata/insert_for_aa01',
payload: params,
callback: (res) => {
loading(false);
if (res.success == true) {
message.success('添加成功');
form.resetFields();
this.handleModalVisible();
}
}
});
}
};
handleDeleteRecord = record => {
const { dispatch } = this.props;
dispatch({
type: 'baseinfodata/delete_by_primarykey_for_aa01',
payload: {
recordid: record.id,
},
callback: () => {
this.setState({
selectedRows: [],
});
},
});
message.success('删除成功');
};
handleUpdate = (fields, form, loading) => {
const { dispatch } = this.props;
const params = {
id: fields.id,
za0101: fields.za0101, // 姓 名
aa0107: fields.aa0107, // 性 别 aa0107
aa0121: fields.aa0121, // 民 族 aa0121
aa0111: fields.aa0111, // 出 生 年 月 aa0111
aa0114: fields.aa0114, // 籍 贯 aa0114
aa0117: fields.aa0117, // 出生地 aa0117
aa0141: fields.aa0141, // 参加工作时间 aa0141
v_aa011n: fields.v_aa011n, // 党派交叉情况 v_aa011n
v_aa011a: fields.v_aa011a, // 职 称 v_aa011a
aa0127: fields.aa0127, // 婚 姻 状 况 aa0127
v_aa011b: fields.v_aa011b, // 健 康 状 况 v_aa011b
aa0177: fields.aa0177, // 身份证号 码 aa0177
v_aa011c: fields.v_aa011c, // 工作单位 v_aa011c
v_aa011d: fields.v_aa011d, // 职 务 v_aa011d
v_aa011h: fields.v_aa011h, // 职务层次 v_aa011h
v_aa011f: fields.v_aa011f, // 任现职务层次时间 v_aa011f
v_aa011e: fields.v_aa011e, // 职 级 v_aa011e
v_aa011g: fields.v_aa011g, // 任 现 职 级 时 间 v_aa011g
v_aa011i: fields.v_aa011i, // 单位地址 v_aa011i
v_aa011j: fields.v_aa011j, // 固定电话 v_aa011j
v_aa011k: fields.v_aa011k, // 家庭地址 v_aa011k
ak010g: fields.ak010g, // 邮政编码 ak010g
ak010b: fields.ak010b, // 手机号码 ak010b
v_aa011l: fields.v_aa011l, // 电子邮箱 v_aa011l
v_aa011m: fields.v_aa011m, // 专业专长 v_aa011m
// za9998: fields.za9998, // 头像
}
if(fields.file) {
const formData = new FormData();
formData.append('file', fields.file);
dispatch({
type: 'baseinfodata/upload_single_file',
payload: formData,
callback: ({ success, datarecord}) => {
loading(false);
if (success == true) {
params.za9998 = datarecord.id
dispatch({
type: 'baseinfodata/update_for_aa01',
payload: params,
callback: (res) => {
loading(false);
if (res.success == true) {
message.success('修改成功');
form.resetFields();
this.handleUpdateModalVisible();
}
}
});
}
else {
message.error('照片上传失败');
}
}
});
} else {
dispatch({
type: 'baseinfodata/update_for_aa01',
payload: params,
callback: (res) => {
loading(false);
if (res.success == true) {
message.success('修改成功');
form.resetFields();
this.handleUpdateModalVisible();
}
}
});
}
};
renderSimpleForm() {
const parentMethods = {
handleSearch: this.handleSearch,
handleFormReset: this.handleFormReset,
toggleForm: this.toggleForm,
submitButtons: styles.submitButtons,
};
return (
<Aa01VipRenderSimpleForm {...parentMethods} />
);
}
renderAdvancedForm() {
const parentMethods = {
handleSearch: this.handleSearch,
handleFormReset: this.handleFormReset,
toggleForm: this.toggleForm,
};
return (
<Aa01VipRenderAdvancedForm {...parentMethods} />
);
}
renderForm() {
const { expandForm } = this.state;
return expandForm ? this.renderAdvancedForm() : this.renderSimpleForm();
}
render() {
const {
baseinfodata: { data },
loading,
} = this.props;
const { selectedRows, modalVisible, updateModalVisible, viewModalVisible, updateFormValues, viewFormValues } = this.state;
const menu = (
<Menu onClick={this.handleMenuClick} selectedKeys={[]}>
<Menu.Item key="remove">删除</Menu.Item>
<Menu.Item key="approval">批量审批</Menu.Item>
</Menu>
);
const parentMethods = {
handleAdd: this.handleAdd,
handleModalVisible: this.handleModalVisible,
};
const updateMethods = {
handleUpdateModalVisible: this.handleUpdateModalVisible,
handleUpdate: this.handleUpdate,
};
const viewMethods = {
handleViewModalVisible: this.handleViewModalVisible
};
return (
<>
<Card bordered={false}>
<div className={styles.aa01tableList}>
<div className={styles.aa01tableListForm}>{this.renderForm()}</div>
<div className={styles.aa01tableListOperator}>
<Button type="primary" onClick={() => this.handleModalVisible(true)}>
<PlusOutlined /> 新建
</Button>
{selectedRows.length > 0 && (
<span>
<Button>批量操作</Button>
<Dropdown overlay={menu}>
<Button>
更多操作 <DownOutlined />
</Button>
</Dropdown>
</span>
)}
</div>
<StandardTable
rowKey={"id"}
selectedRows={selectedRows}
loading={loading}
data={data}
columns={this.columns}
scroll={{ x: 1500 }}
onSelectRow={this.handleSelectRows}
onChange={this.handleStandardTableChange}
/>
</div>
</Card>
<Aa01VipCreateForm {...parentMethods} modalVisible={modalVisible} />
{updateFormValues && Object.keys(updateFormValues).length ? (
<Aa01VipUpdateForm
{...updateMethods}
updateModalVisible={updateModalVisible}
values={updateFormValues}
/>
) : null}
{viewFormValues && Object.keys(viewFormValues).length ? (
<Aa01VipViewForm
{...viewMethods}
viewModalVisible={viewModalVisible}
values={viewFormValues}
/>
) : null}
</>
);
}
}
export default Aa01VipTable;

@ -0,0 +1,366 @@
import React, { useState } from 'react';
import { CloseCircleOutlined } from '@ant-design/icons';
import {
Form,
Input,
DatePicker,
Modal,
Button,
Upload
} from 'antd';
import SelectOptionTree from '@/components/SelectOptionTree';
import { MyIcon } from "@/components/Icon"
import { XQ, AE, AX, _09, AB, OR, BG, AT, HC, OC, OD, RF, X4 } from '@/utils/pr_new_datadictionary';
import moment from 'moment';
import styles from '@/global.less';
import style from '../index.less';
const FormItem = Form.Item;
const Aa01CreateForm = (props) => {
const [form] = Form.useForm();
const { modalVisible, handleAdd, handleModalVisible, dictDataList } = props;
const [error, setError] = useState([]);
const [subLoading, setSubLoading] = useState(false);
const [imageUrl, setImageUrl] = useState('');
const [imageFile, setImageFile] = useState(null);
const okHandle = () => {
// za9998 头像
form
.validateFields()
.then(fieldsValue => {
console.log(fieldsValue, 'fieldsValue');
setSubLoading(true);
setError([]);
fieldsValue.aa0111 = fieldsValue.aa0111 ? moment(fieldsValue.aa0111).format("YYYY-MM-DD") : null;
fieldsValue.aa0141 = fieldsValue.aa0141 ? moment(fieldsValue.aa0141).format("YYYY-MM-DD") : null;
fieldsValue.v_aa011f = fieldsValue.v_aa011f ? moment(fieldsValue.v_aa011f).format("YYYY-MM-DD") : null;
fieldsValue.v_aa011g = fieldsValue.v_aa011g ? moment(fieldsValue.v_aa011g).format("YYYY-MM-DD") : null;
fieldsValue.file = imageFile;
handleAdd(fieldsValue, form, setSubLoading);
})
.catch(errInfo => {
onFinishFailed(errInfo)
});
};
const onFinishFailed = (errorInfo) => {
setError(errorInfo.errorFields)
}
const getErrorInfo = (errors) => {
const errorCount = errors.filter((item) => item.errors.length > 0).length;
if (!errors || errorCount === 0) {
return null;
}
return (
<span className={styles.errorIcon}>
<CloseCircleOutlined />{errorCount}
</span>
);
};
const beforeUpload = file => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
if (!isJpgOrPng) {
message.error('只能上传 JPG/JPEG/PNG 格式的文件!');
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error('图像必须小于2MB!');
}
return isJpgOrPng && isLt2M;
}
const handleChange = info => {
if (info.file.status === 'done') {
// Get this url from response in real world.
if (window.FileReader) {
const reader = new FileReader();
reader.readAsDataURL(info.file.originFileObj);
reader.addEventListener('load', () => {
setImageUrl(reader.result);
});
}
setImageFile(info.file.originFileObj);
}
};
const uploadButton = (<MyIcon className={style.headIcon} type="icon-user" />);
return (
<Modal
width={1200}
height={580}
bodyStyle={{ padding: '20px', maxHeight: '580px', overflowY: 'auto' }}
forceRender={true}
destroyOnClose
getContainer={false}
title="新增"
visible={modalVisible}
onCancel={() => handleModalVisible()}
afterClose={() => handleModalVisible()}
footer={<>{getErrorInfo(error)}
<Button onClick={() => handleModalVisible()}>关闭</Button>
<Button loading={subLoading} type="primary" onClick={() => okHandle()}>提交</Button></>}
>
<Form form={form} onFinish={okHandle} onFinishFailed={onFinishFailed}
colon={false} hideRequiredMark>
<table className={styles.formtable}>
<tbody>
<tr>
<td colSpan="28">人员基本情况信息</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>姓名</span>
</td>
<td colSpan="4">
<FormItem label="" name="za0101" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>性别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0107" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={AX || []} />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>民族</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0121" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={AE || []} />
</FormItem>
</td>
{/* 照片za9998 */}
<td colSpan="7" style={{ position: 'relative', border: 'none' }}>
<div style={{ position: 'absolute', left: '28%', top: '20px' }} className={style.photoBox}>
<Upload
accept="image/jpg,image/jpeg,image/png"
listType="picture-card"
className="avatar-uploader"
showUploadList={false}
beforeUpload={beforeUpload}
onChange={handleChange}
style={{ display: 'table', width: '120px', height: '140px' }}
>
{imageUrl ? <img src={imageUrl} alt="图片加载失败" style={{ width: '120px', height: '130px' }} /> : uploadButton}
</Upload>
<div className="ant-upload-text" style={{ marginTop: '5px' }}><span className={styles.required}></span></div>
</div>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>出生年月</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0111" rules={[{required: true, message: '请输入', type: "object"}]}>
<DatePicker format="YYYY-MM" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>籍贯</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0114" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
<td colSpan="3">
<span>出生地</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0117">
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>参加工作时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0141" rules={[{required: true, message: '请输入', type: "object"}]}>
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>党派交叉情况</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011n">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>职称</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011a" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>婚姻状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0127" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={BG || []} />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>健康状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011b" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>身份证号码</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0177" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作单位</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011c">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职务</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011d">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职务层次</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011h">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>任现职务层次时间</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011f">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职级</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011e">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>任现职级时间</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011g">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011i">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>固定电话</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011j">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>家庭地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011k" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>邮政编码</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010g" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>手机号码</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010b">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>电子邮箱</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011l">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>专业专长</span>
</td>
<td colSpan="25">
<FormItem label="" name="v_aa011m">
<Input placeholder="" />
</FormItem>
</td>
</tr>
</tbody>
</table>
</Form>
</Modal>
);
};
export default Aa01CreateForm;

@ -0,0 +1,99 @@
import {
Row,
Col,
Form,
Input,
DatePicker,
Button,
} from 'antd';
import { UpOutlined } from '@ant-design/icons';
import style from "@/global.less";
const FormItem = Form.Item;
const Aa01RenderAdvancedForm = (props) => {
const [form] = Form.useForm();
const { handleSearch, handleFormReset, toggleForm } = props;
const onFinish = values => {
//console.log('Received values of form: ', values);
handleSearch(values);
};
const myhandleFormReset = () => {
form.resetFields();
handleFormReset();
};
return (
<Form form={form} onFinish={onFinish} layout="inline">
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchinput}>
<Col md={8} sm={24}>
<FormItem label="本单位工龄" name="aa0101">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="人工成本统计标识" name="aa0106">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
</Row>
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchinput}>
<Col md={8} sm={24}>
<FormItem label="性别" name="aa0107">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="备注" name="aa0108">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="人员类别" name="aa010d">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
</Row>
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchbox}>
<Col md={24} sm={24}>
<div style={{ marginBottom: 12, display: 'flex', justifyContent: 'flex-end' }}>
<Button type="primary" htmlType="submit">
查询
</Button>
<Button style={{ marginLeft: 8 }} onClick={myhandleFormReset}>
重置
</Button>
<a style={{ marginLeft: 8, lineHeight: '32px' }} onClick={toggleForm}>
收起 <UpOutlined />
</a>
</div>
</Col>
</Row>
</Form>
);
};
export default Aa01RenderAdvancedForm;

@ -0,0 +1,70 @@
import {
Row,
Col,
Form,
Input,
DatePicker,
Button,
} from 'antd';
import { DownOutlined } from '@ant-design/icons';
import style from "@/global.less";
const FormItem = Form.Item;
const Aa01RenderSimpleForm = (props) => {
const [form] = Form.useForm();
const { submitButtons, handleSearch, handleFormReset, toggleForm } = props;
const onFinish = values => {
//console.log('Received values of form: ', values);
handleSearch(values);
};
const myhandleFormReset = () => {
form.resetFields();
handleFormReset();
};
return (
<Form form={form} onFinish={onFinish} layout="inline">
<Row gutter={{ md: 8, lg: 24, xl: 48 }} style={{ width: '100%' }} className={style.searchinput}>
<Col md={8} sm={24}>
<FormItem label="本单位工龄" name="aa0101">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<FormItem label="人工成本统计标识" name="aa0106">
<Input placeholder="" style={{ width: '100%' }} />
</FormItem>
</Col>
<Col md={8} sm={24}>
<div style={{ marginBottom: 12, display: 'flex', justifyContent: 'flex-end' }}>
<Button type="primary" htmlType="submit">
查询
</Button>
<Button style={{ marginLeft: 8 }} onClick={myhandleFormReset}>
重置
</Button>
<a style={{ marginLeft: 8, lineHeight: '32px' }} onClick={toggleForm}>
展开 <DownOutlined />
</a>
</div>
</Col>
</Row>
</Form>
);
};
export default Aa01RenderSimpleForm;

@ -0,0 +1,401 @@
import React, { useState } from 'react';
import { CloseCircleOutlined } from '@ant-design/icons';
import {
Form,
Input,
DatePicker,
Modal,
Button,
Upload
} from 'antd';
import SelectOptionTree from '@/components/SelectOptionTree';
import { MyIcon } from "@/components/Icon"
import { XQ, AE, AX, _09, AB, OR, BG, AT, HC, OC, OD, RF, X4 } from '@/utils/pr_new_datadictionary';
import moment from 'moment';
import styles from '@/global.less';
import style from '../index.less';
const FormItem = Form.Item;
const Aa01UpdateForm = (props) => {
const { handleUpdate, updateModalVisible, handleUpdateModalVisible, values, dictDataList } = props;
const [form] = Form.useForm();
const [error, setError] = useState([]);
const [subLoading, setSubLoading] = useState(false);
const [imageUrl, setImageUrl] = useState('');
const [imageFile, setImageFile] = useState(null);
React.useEffect(() => {
if(!!values.zp){
setImageUrl(values.zp.fileurl)
}
form?.setFieldsValue({
za0101: values.za0101, // 姓 名 za0101
aa0107: values.aa0107, // 性 别 aa0107
aa0121: values.aa0121, // 民 族 aa0121
aa0111: values.aa0111 ? moment(values.aa0111, "YYYY-MM") : null, // 出 生 年 月 aa0111
aa0114: values.aa0114, // 籍 贯 aa0114
aa0117: values.aa0117, // 出生地 aa0117
aa0141: values.aa0141 ? moment(values.aa0141, "YYYY-MM-DD") : null, // 参加工作时间 aa0141
v_aa011n: values.v_aa011n, // 党派交叉情况 v_aa011n
v_aa011a: values.v_aa011a, // 职 称 v_aa011a
aa0127: values.aa0127, // 婚 姻 状 况 aa0127
v_aa011b: values.v_aa011b, // 健 康 状 况 v_aa011b
aa0177: values.aa0177, // 身份证号 码 aa0177
v_aa011c: values.v_aa011c, // 工作单位 v_aa011c
v_aa011d: values.v_aa011d, // 职 务 v_aa011d
v_aa011h: values.v_aa011h, // 职务层次 v_aa011h
v_aa011f: values.v_aa011f ? moment(values.v_aa011f, "YYYY-MM-DD") : null, // 任现职务层次时间 v_aa011f
v_aa011e: values.v_aa011e, // 职 级 v_aa011e
v_aa011g: values.v_aa011g ? moment(values.v_aa011g, "YYYY-MM-DD") : null, // 任 现 职 级 时 间 v_aa011g
v_aa011i: values.v_aa011i, // 单位地址 v_aa011i
v_aa011j: values.v_aa011j, // 固定电话 v_aa011j
v_aa011k: values.v_aa011k, // 家庭地址 v_aa011k
ak010g: values.ak010g, // 邮政编码 ak010g
ak010b: values.ak010b, // 手机号码 ak010b
v_aa011l: values.v_aa011l, // 电子邮箱 v_aa011l
v_aa011m: values.v_aa011m, // 专业专长 v_aa011m
za9998: values.za9998, // 头像
});
}, [values, form]);
const handleLocalUpdate = () => {
form
.validateFields()
.then(fieldsValue => {
setSubLoading(true);
setError([]);
fieldsValue.id = values?.id;
fieldsValue.aa0111 = fieldsValue.aa0111 ? moment(fieldsValue.aa0111).format("YYYY-MM-DD") : null;
fieldsValue.aa0141 = fieldsValue.aa0141 ? moment(fieldsValue.aa0141).format("YYYY-MM-DD") : null;
fieldsValue.v_aa011f = fieldsValue.v_aa011f ? moment(fieldsValue.v_aa011f).format("YYYY-MM-DD") : null;
fieldsValue.v_aa011g = fieldsValue.v_aa011g ? moment(fieldsValue.v_aa011g).format("YYYY-MM-DD") : null;
fieldsValue.file = imageFile;
handleUpdate(fieldsValue, form, setSubLoading);
})
.catch(errInfo => {
onFinishFailed(errInfo)
});
};
const onFinishFailed = (errorInfo) => {
setError(errorInfo.errorFields)
}
const getErrorInfo = (errors) => {
const errorCount = errors.filter((item) => item.errors.length > 0).length;
if (!errors || errorCount === 0) {
return null;
}
return (
<span className={styles.errorIcon}>
<CloseCircleOutlined />{errorCount}
</span>
);
};
const beforeUpload = file => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
if (!isJpgOrPng) {
message.error('只能上传 JPG/JPEG/PNG 格式的文件!');
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error('图像必须小于2MB!');
}
return isJpgOrPng && isLt2M;
}
const handleChange = info => {
if (info.file.status === 'done') {
// Get this url from response in real world.
if (window.FileReader) {
const reader = new FileReader();
reader.readAsDataURL(info.file.originFileObj);
reader.addEventListener('load', () => {
setImageUrl(reader.result);
});
}
setImageFile(info.file.originFileObj);
}
};
const uploadButton = (<MyIcon className={style.headIcon} type="icon-user" />);
return (
<Modal
width={1300}
height={500}
bodyStyle={{ padding: '20px', maxHeight: '500px', overflowY: 'auto' }}
forceRender={true}
destroyOnClose
getContainer={false}
title="修改"
visible={updateModalVisible}
onOk={() => handleLocalUpdate()}
onCancel={() => handleUpdateModalVisible()}
footer={<>{getErrorInfo(error)}
<Button onClick={() => handleUpdateModalVisible()}>关闭</Button>
<Button loading={subLoading} type="primary" onClick={() => handleLocalUpdate()}>提交</Button></>}
>
<Form form={form} onFinish={handleLocalUpdate} onFinishFailed={onFinishFailed}
colon={false} hideRequiredMark>
<table className={styles.formtable}>
<tbody>
<tr>
<td colSpan="28">人员基本情况信息</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>姓名</span>
</td>
<td colSpan="4">
<FormItem label="" name="za0101" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>性别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0107" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={AX || []} />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>民族</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0121" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={AE || []} />
</FormItem>
</td>
{/* 照片za9998 */}
<td colSpan="7" style={{ position: 'relative', border: 'none' }}>
<div style={{ position: 'absolute', left: '28%', top: '20px' }} className={style.photoBox}>
<Upload
accept="image/jpg,image/jpeg,image/png"
listType="picture-card"
className="avatar-uploader"
showUploadList={false}
beforeUpload={beforeUpload}
onChange={handleChange}
style={{ display: 'table', width: '120px', height: '140px' }}
>
{imageUrl ? <img src={imageUrl} alt="图片加载失败" style={{ width: '120px', height: '130px' }} /> : uploadButton}
</Upload>
<div className="ant-upload-text" style={{ marginTop: '5px' }}><span className={styles.required}></span></div>
</div>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>出生年月</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0111" rules={[{required: true, message: '请输入', type: "object"}]}>
<DatePicker format="YYYY-MM" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>籍贯</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0114" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
<td colSpan="3">
<span>出生地</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0117">
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>参加工作时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0141" rules={[{required: true, message: '请输入', type: "object"}]}>
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>党派交叉情况</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011n">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>职称</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011a" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>婚姻状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0127" rules={[{required: true, message: '请输入', min: 1}]}>
<SelectOptionTree treeData={BG || []} />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>健康状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011b" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>身份证号码</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0177" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作单位</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011c">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职务</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011d">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职务层次</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011h">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>任现职务层次时间</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011f">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职级</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011e">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>任现职级时间</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011g">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011i">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>固定电话</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011j">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>家庭地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011k" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>邮政编码</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010g" rules={[{required: true, message: '请输入', min: 1}]}>
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>手机号码</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010b">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>电子邮箱</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011l">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>专业专长</span>
</td>
<td colSpan="25">
<FormItem label="" name="v_aa011m">
<Input placeholder="" />
</FormItem>
</td>
</tr>
</tbody>
</table>
</Form>
</Modal>
);
}
export default Aa01UpdateForm;

@ -0,0 +1,317 @@
import {
Form,
Input,
DatePicker,
Modal,
Upload
} from 'antd';
import SelectOptionTree from '@/components/SelectOptionTree';
import { XQ, AE, AX, _09, AB, OR, BG, AT, HC, OC, OD, RF, X4 } from '@/utils/pr_new_datadictionary';
import userAvatar from '@/assets/img/user_avatar.png';
import styles from "@/global.less";
import moment from 'moment';
import style from '../index.less';
import React, { useState } from 'react';
const FormItem = Form.Item;
const Aa01ViewForm = (props) => {
const { viewModalVisible, handleViewModalVisible, values } = props;
const [form] = Form.useForm();
const [photoUrl, setPhotoUrl] = useState();
React.useEffect(() => {
if(!!values.zp){
setPhotoUrl(values.zp.fileurl)
}
form?.setFieldsValue({
za0101: values.za0101, // 姓 名 za0101
aa0107: values.aa0107, // 性 别 aa0107
aa0121: values.aa0121, // 民 族 aa0121
aa0111: values.aa0111 ? moment(values.aa0111, "YYYY-MM") : null, // 出 生 年 月 aa0111
aa0114: values.aa0114, // 籍 贯 aa0114
aa0117: values.aa0117, // 出生地 aa0117
aa0141: values.aa0141 ? moment(values.aa0141, "YYYY-MM-DD") : null, // 参加工作时间 aa0141
v_aa011n: values.v_aa011n, // 党派交叉情况 v_aa011n
v_aa011a: values.v_aa011a, // 职 称 v_aa011a
aa0127: values.aa0127, // 婚 姻 状 况 aa0127
v_aa011b: values.v_aa011b, // 健 康 状 况 v_aa011b
aa0177: values.aa0177, // 身份证号 码 aa0177
v_aa011c: values.v_aa011c, // 工作单位 v_aa011c
v_aa011d: values.v_aa011d, // 职 务 v_aa011d
v_aa011h: values.v_aa011h, // 职务层次 v_aa011h
v_aa011f: values.v_aa011f ? moment(values.v_aa011f, "YYYY-MM-DD") : null, // 任现职务层次时间 v_aa011f
v_aa011e: values.v_aa011e, // 职 级 v_aa011e
v_aa011g: values.v_aa011g ? moment(values.v_aa011g, "YYYY-MM-DD") : null, // 任 现 职 级 时 间 v_aa011g
v_aa011i: values.v_aa011i, // 单位地址 v_aa011i
v_aa011j: values.v_aa011j, // 固定电话 v_aa011j
v_aa011k: values.v_aa011k, // 家庭地址 v_aa011k
ak010g: values.ak010g, // 邮政编码 ak010g
ak010b: values.ak010b, // 手机号码 ak010b
v_aa011l: values.v_aa011l, // 电子邮箱 v_aa011l
v_aa011m: values.v_aa011m, // 专业专长 v_aa011m
za9998: values.za9998, // 头像
});
}, [values, form]);
return (
<Modal
width={1200}
height={500}
bodyStyle={{ padding: '20px', maxHeight: '500px', overflowY: 'auto' }}
forceRender={true}
getContainer={false}
title="查看"
visible={viewModalVisible}
onOk={() => handleViewModalVisible(false, values)}
onCancel={() => handleViewModalVisible(false, values)}
afterClose={() => handleViewModalVisible()}
>
<Form form={form} layout="vertical" hideRequiredMark style={{ pointerEvents: 'none' }}>
<table className={styles.formtable}>
<tbody>
<tr>
<td colSpan="28">人员基本情况信息</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>姓名</span>
</td>
<td colSpan="4">
<FormItem label="" name="za0101">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>性别</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0107">
<SelectOptionTree treeData={AX || []} />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>民族</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0121">
<SelectOptionTree treeData={AE || []} />
</FormItem>
</td>
{/* 照片za9998 */}
<td colSpan="7" style={{ position: 'relative', border: 'none' }}>
<div style={{ position: 'absolute', left: '28%', top: '20px' }} className={style.photoBox}>
<img src={photoUrl ? photoUrl : userAvatar} alt="图片加载失败" style={{ width: '120px', height: '130px' }} />
</div>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>出生年月</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0111">
<DatePicker format="YYYY-MM" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>籍贯</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0114">
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
<td colSpan="3">
<span>出生地</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0117">
<SelectOptionTree treeData={AB || []} />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>参加工作时间</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0141">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>党派交叉情况</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011n">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>职称</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011a">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>婚姻状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0127">
<SelectOptionTree treeData={BG || []} />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>健康状况</span>
</td>
<td colSpan="4">
<FormItem label="" name="v_aa011b">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>身份证号码</span>
</td>
<td colSpan="4">
<FormItem label="" name="aa0177">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>工作单位</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011c">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>职务</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011d">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职务层次</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011h">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>任现职务层次时间</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011f">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>职级</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011e">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>任现职级时间</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011g">
<DatePicker format="YYYY-MM-DD" style={{ width: '100%' }} placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>单位地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011i">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>固定电话</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011j">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span className={styles.required}>家庭地址</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011k">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span className={styles.required}>邮政编码</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010g">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>手机号码</span>
</td>
<td colSpan="11">
<FormItem label="" name="ak010b">
<Input placeholder="" />
</FormItem>
</td>
<td colSpan="3">
<span>电子邮箱</span>
</td>
<td colSpan="11">
<FormItem label="" name="v_aa011l">
<Input placeholder="" />
</FormItem>
</td>
</tr>
<tr>
<td colSpan="3">
<span>专业专长</span>
</td>
<td colSpan="25">
<FormItem label="" name="v_aa011m">
<Input placeholder="" />
</FormItem>
</td>
</tr>
</tbody>
</table>
</Form>
</Modal>
);
}
export default Aa01ViewForm;

@ -0,0 +1,83 @@
.aa01tableList {
.aa01tableListOperator {
margin-bottom: 16px;
button {
margin-right: 8px;
}
}
}
.aa01tableListForm {
:global {
.ant-form-item {
display: flex;
margin-right: 0;
margin-bottom: 24px;
> .ant-form-item-label {
width: auto;
padding-right: 8px;
line-height: 32px;
}
.ant-form-item-control {
line-height: 32px;
}
}
.ant-form-item-control-wrapper {
flex: 1;
}
}
.submitButtons {
display: block;
margin-bottom: 24px;
white-space: nowrap;
}
}
.icon {
width: 0.8em;
height: 0.8em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.ant-upload{
width: 130px !important;
height: 140px !important;
}
.staffPhoto {
font-size: 70px;
vertical-align: middle;
}
.photoBox {
.headIcon {
display: flex;
justify-content: center;
svg {
height: 150px;
width: 140px;
opacity: .75;
}
}
:global {
.ant-upload-select-picture-card{
height: 150px;
width: 150px;
}
}
}
@media screen and (max-width: @screen-lg) {
.aa01tableListForm :global(.ant-form-item) {
margin-right: 24px;
}
}
@media screen and (max-width: @screen-md) {
.aa01tableListForm :global(.ant-form-item) {
margin-right: 8px;
}
}

@ -0,0 +1,75 @@
import { PureComponent } from 'react'
import * as plugins from 'antd'
class GlobalComponent extends PureComponent {
constructor(props) {
super(props)
this.props = props
this.Affix = plugins.Affix
this.Alert = plugins.Alert
this.Anchor = plugins.Anchor
this.AutoComplete = plugins.AutoComplete
this.Avatar = plugins.Avatar
this.BackTop = plugins.BackTop
this.Badge = plugins.Badge
this.Breadcrumb = plugins.Breadcrumb
this.Button = plugins.Button
this.Calendar = plugins.Calendar
this.Card = plugins.Card
this.Carousel = plugins.Carousel
this.Cascader = plugins.Cascader
this.Checkbox = plugins.Checkbox
this.Col = plugins.Col
this.Collapse = plugins.Collapse
// this.Comment = plugins.Comment
this.ConfigProvider = plugins.ConfigProvider
this.Descriptions = plugins.Descriptions
this.Divider = plugins.Divider
this.Drawer = plugins.Drawer
this.Dropdown = plugins.Dropdown
this.Empty = plugins.Empty
this.Form = plugins.Form
this.Grid = plugins.Grid
this.Image = plugins.Image
this.Input = plugins.Input
this.InputNumber = plugins.InputNumber
this.Layout = plugins.Layout
this.List = plugins.List
this.Mentions = plugins.Mentions
this.Menu = plugins.Menu
this.Modal = plugins.Modal
// this.PageHeader = plugins.PageHeader
this.Pagination = plugins.Pagination
this.Popconfirm = plugins.Popconfirm
this.Popover = plugins.Popover
this.Progress = plugins.Progress
this.Radio = plugins.Radio
this.Rate = plugins.Rate
this.Result = plugins.Result
this.Row = plugins.Row
this.Segmented = plugins.Segmented
this.Select = plugins.Select
this.Skeleton = plugins.Skeleton
this.Slider = plugins.Slider
this.Space = plugins.Space
this.Spin = plugins.Spin
this.Statistic = plugins.Statistic
this.Steps = plugins.Steps
this.Switch = plugins.Switch
this.Table = plugins.Table
this.Tabs = plugins.Tabs
this.Tag = plugins.Tag
this.TimePicker = plugins.TimePicker
this.Timeline = plugins.Timeline
this.Tooltip = plugins.Tooltip
this.Transfer = plugins.Transfer
this.Tree = plugins.Tree
this.TreeSelect = plugins.TreeSelect
this.Typography = plugins.Typography
this.Upload = plugins.Upload
this.message = plugins.message
}
}
export default GlobalComponent

@ -0,0 +1,6 @@
import { createFromIconfontCN } from '@ant-design/icons';
import defaultSettings from "../../../config/defaultSettings";
export const IconFont = createFromIconfontCN({
scriptUrl: `//at.alicdn.com/t/font_2163129_p3ldyoksz3s.js`
});

@ -0,0 +1,5 @@
import { IconFont } from "@/components/Icon/IconFont";
export default ({type, font = 13, style, className}) => {
return <IconFont type={type} style={{fontSize: font, ...style}} className={className}/>
}

@ -0,0 +1,12 @@
import MyIcon from "@/components/Icon/MyIcon"
export default ({icon, text, font = 13, style, className, onClick, back = true}) => {
return back ?
<span onClick={onClick} style={{...style}}>
<MyIcon icon={icon} font={font} style={{...style}} className={className}/> {text}
</span> :
<span onClick={onClick} style={{...style}}>
{text} <MyIcon font={font} style={{...style}} icon={icon} className={className}/>
</span>
}

@ -0,0 +1,7 @@
import { Tooltip } from "antd";
export default ({icon, title, font, style, onClick}) => {
return <Tooltip title={title}>
<span onClick={onClick} style={{cursor: 'pointer', fontSize: font, ...style}}>{icon}</span>
</Tooltip>
}

@ -0,0 +1,7 @@
import { Tooltip } from "antd";
export default ({icon, title, font, style, text, onClick}) => {
return <Tooltip title={title}>
<span onClick={onClick} style={{cursor: 'pointer', fontSize: font, ...style}}>{icon} {text}</span>
</Tooltip>
}

@ -0,0 +1,20 @@
import MyIcon from './MyIcon';
import TextIcon from './TextIcon';
import TooltipIcon from './TooltipIcon';
import TooltipTextIcon from './TooltipTextIcon';
const Icon = {
MyIcon,
TextIcon,
TooltipIcon,
TooltipTextIcon
};
export {
Icon as default,
MyIcon,
TextIcon,
TooltipIcon,
TooltipTextIcon
};

@ -0,0 +1,141 @@
import React, { PureComponent, createElement } from 'react'
import { Modal, Tabs, Tooltip, Input} from 'antd'
import * as Icon from '@ant-design/icons'
import classNames from 'classnames'
import styles from './index.less'
const { Search } = Input
const webIcons = ['AccountBookOutlined','AimOutlined','AlertOutlined','ApartmentOutlined','ApiOutlined','AppstoreAddOutlined','AppstoreOutlined','AudioOutlined','AudioMutedOutlined','AuditOutlined','BankOutlined','BarcodeOutlined','BarsOutlined','BellOutlined','BlockOutlined','BookOutlined','BorderOutlined','BorderlessTableOutlined','BranchesOutlined','BugOutlined','BuildOutlined','BulbOutlined','CalculatorOutlined','CalendarOutlined','CameraOutlined','CarOutlined','CarryOutOutlined','CiCircleOutlined','CiOutlined','ClearOutlined','CloudDownloadOutlined','CloudOutlined','CloudServerOutlined','CloudSyncOutlined','CloudUploadOutlined','ClusterOutlined','CodeOutlined','CoffeeOutlined','CommentOutlined','CompassOutlined','CompressOutlined','ConsoleSqlOutlined','ContactsOutlined','ContainerOutlined','ControlOutlined','CopyrightOutlined','CreditCardOutlined','CrownOutlined','CustomerServiceOutlined','DashboardOutlined','DatabaseOutlined','DeleteColumnOutlined','DeleteRowOutlined','DeliveredProcedureOutlined','DeploymentUnitOutlined','DesktopOutlined','DingtalkOutlined','DisconnectOutlined','DislikeOutlined','DollarCircleOutlined','DollarOutlined','DownloadOutlined','EllipsisOutlined','EnvironmentOutlined','EuroCircleOutlined','EuroOutlined','ExceptionOutlined','ExpandAltOutlined','ExpandOutlined','ExperimentOutlined','ExportOutlined','EyeOutlined','EyeInvisibleOutlined','FieldBinaryOutlined','FieldNumberOutlined','FieldStringOutlined','FieldTimeOutlined','FileAddOutlined','FileDoneOutlined','FileExcelOutlined','FileExclamationOutlined','FileOutlined','FileGifOutlined','FileImageOutlined','FileJpgOutlined','FileMarkdownOutlined','FilePdfOutlined','FilePptOutlined','FileProtectOutlined','FileSearchOutlined','FileSyncOutlined','FileTextOutlined','FileUnknownOutlined','FileWordOutlined','FileZipOutlined','FilterOutlined','FireOutlined','FlagOutlined','FolderAddOutlined','FolderOutlined','FolderOpenOutlined','FolderViewOutlined','ForkOutlined','FormatPainterOutlined','FrownOutlined','FunctionOutlined','FundProjectionScreenOutlined','FundViewOutlined','FunnelPlotOutlined','GatewayOutlined','GifOutlined','GiftOutlined','GlobalOutlined','GoldOutlined','GroupOutlined','HddOutlined','HeartOutlined','HistoryOutlined','HomeOutlined','HourglassOutlined','IdcardOutlined','ImportOutlined','InboxOutlined','InsertRowAboveOutlined','InsertRowBelowOutlined','InsertRowLeftOutlined','InsertRowRightOutlined','InsuranceOutlined','InteractionOutlined','KeyOutlined','LaptopOutlined','LayoutOutlined','LikeOutlined','LineOutlined','LinkOutlined','Loading3QuartersOutlined','LoadingOutlined','LockOutlined','MacCommandOutlined','MailOutlined','ManOutlined','MedicineBoxOutlined','MehOutlined','MenuOutlined','MergeCellsOutlined','MessageOutlined','MobileOutlined','MoneyCollectOutlined','MonitorOutlined','MoreOutlined','NodeCollapseOutlined','NodeExpandOutlined','NodeIndexOutlined','NotificationOutlined','NumberOutlined','OneToOneOutlined','PaperClipOutlined','PartitionOutlined','PayCircleOutlined','PercentageOutlined','PhoneOutlined','PictureOutlined','PlaySquareOutlined','PoundCircleOutlined','PoundOutlined','PoweroffOutlined','PrinterOutlined','ProfileOutlined','ProjectOutlined','PropertySafetyOutlined','PullRequestOutlined','PushpinOutlined','QrcodeOutlined','ReadOutlined','ReconciliationOutlined','RedEnvelopeOutlined','ReloadOutlined','RestOutlined','RobotOutlined','RocketOutlined','RotateLeftOutlined','RotateRightOutlined','SafetyCertificateOutlined','SafetyOutlined','SaveOutlined','ScanOutlined','ScheduleOutlined','SearchOutlined','SecurityScanOutlined','SelectOutlined','SendOutlined','SettingOutlined','ShakeOutlined','ShareAltOutlined','ShopOutlined','ShoppingCartOutlined','ShoppingOutlined','SisternodeOutlined','SkinOutlined','SmileOutlined','SolutionOutlined','SoundOutlined','SplitCellsOutlined','StarOutlined','SubnodeOutlined','SwitcherOutlined','SyncOutlined','TableOutlined','TabletOutlined','TagOutlined','TagsOutlined','TeamOutlined','ThunderboltOutlined','ToTopOutlined','ToolOutlined','TrademarkCircleOutlined','TrademarkOutlined','TransactionOutlined','TranslationOutlined','TrophyOutlined','UngroupOutlined','UnlockOutlined','UploadOutlined','UsbOutlined','UserAddOutlined','UserDeleteOutlined','UserOutlined','UserSwitchOutlined','UsergroupAddOutlined','UsergroupDeleteOutlined','VerifiedOutlined','VideoCameraAddOutlined','VideoCameraOutlined','WalletOutlined','WhatsAppOutlined','WifiOutlined','WomanOutlined']
const directionIcons = ['StepBackwardOutlined','StepForwardOutlined','FastBackwardOutlined','FastForwardOutlined','ShrinkOutlined','ArrowsAltOutlined','DownOutlined','UpOutlined','LeftOutlined','RightOutlined','CaretUpOutlined','CaretDownOutlined','CaretLeftOutlined','CaretRightOutlined','UpCircleOutlined','DownCircleOutlined','LeftCircleOutlined','RightCircleOutlined','DoubleRightOutlined','DoubleLeftOutlined','VerticalLeftOutlined','VerticalRightOutlined','VerticalAlignTopOutlined','VerticalAlignMiddleOutlined','VerticalAlignBottomOutlined','ForwardOutlined','BackwardOutlined','RollbackOutlined','EnterOutlined','RetweetOutlined','SwapOutlined','SwapLeftOutlined','SwapRightOutlined','ArrowUpOutlined','ArrowDownOutlined','ArrowLeftOutlined','ArrowRightOutlined','PlayCircleOutlined','UpSquareOutlined','DownSquareOutlined','LeftSquareOutlined','RightSquareOutlined','LoginOutlined','LogoutOutlined','MenuFoldOutlined','MenuUnfoldOutlined','BorderBottomOutlined','BorderHorizontalOutlined','BorderInnerOutlined','BorderOuterOutlined','BorderLeftOutlined','BorderRightOutlined','BorderTopOutlined','BorderVerticleOutlined','PicCenterOutlined','PicLeftOutlined','PicRightOutlined','RadiusBottomleftOutlined','RadiusBottomrightOutlined','RadiusUpleftOutlined','RadiusUprightOutlined','FullscreenOutlined','FullscreenExitOutlined']
const suggestionIcons = ['QuestionOutlined','QuestionCircleOutlined','PlusOutlined','PlusCircleOutlined','PauseOutlined','PauseCircleOutlined','MinusOutlined','MinusCircleOutlined','PlusSquareOutlined','MinusSquareOutlined','InfoOutlined','InfoCircleOutlined','ExclamationOutlined','ExclamationCircleOutlined','CloseOutlined','CloseCircleOutlined','CloseSquareOutlined','CheckOutlined','CheckCircleOutlined','CheckSquareOutlined','ClockCircleOutlined','WarningOutlined','IssuesCloseOutlined','StopOutlined']
const editIcons = ['EditOutlined','FormOutlined','CopyOutlined','ScissorOutlined','DeleteOutlined','SnippetsOutlined','DiffOutlined','HighlightOutlined','AlignCenterOutlined','AlignLeftOutlined','AlignRightOutlined','BgColorsOutlined','BoldOutlined','ItalicOutlined','UnderlineOutlined','StrikethroughOutlined','RedoOutlined','UndoOutlined','ZoomInOutlined','ZoomOutOutlined','FontColorsOutlined','FontSizeOutlined','LineHeightOutlined','DashOutlined','SmallDashOutlined','SortAscendingOutlined','SortDescendingOutlined','DragOutlined','OrderedListOutlined','UnorderedListOutlined','RadiusSettingOutlined','ColumnWidthOutlined','ColumnHeightOutlined']
const dataIcons = ['AreaChartOutlined','PieChartOutlined','BarChartOutlined','DotChartOutlined','LineChartOutlined','RadarChartOutlined','HeatMapOutlined','FallOutlined','RiseOutlined','StockOutlined','BoxPlotOutlined','FundOutlined','SlidersOutlined']
const logoIcons = ['AndroidOutlined','AppleOutlined','WindowsOutlined','IeOutlined','ChromeOutlined','GithubOutlined','AliwangwangOutlined','DingdingOutlined','WeiboSquareOutlined','WeiboCircleOutlined','TaobaoCircleOutlined','Html5Outlined','WeiboOutlined','TwitterOutlined','WechatOutlined','YoutubeOutlined','AlipayCircleOutlined','TaobaoOutlined','SkypeOutlined','QqOutlined','MediumWorkmarkOutlined','GitlabOutlined','MediumOutlined','LinkedinOutlined','GooglePlusOutlined','DropboxOutlined','FacebookOutlined','CodepenOutlined','CodeSandboxOutlined','AmazonOutlined','GoogleOutlined','CodepenCircleOutlined','AlipayOutlined','AntDesignOutlined','AntCloudOutlined','AliyunOutlined','ZhihuOutlined','SlackOutlined','SlackSquareOutlined','BehanceOutlined','BehanceSquareOutlined','DribbbleOutlined','DribbbleSquareOutlined','InstagramOutlined','YuqueOutlined','AlibabaOutlined','YahooOutlined','RedditOutlined','SketchOutlined']
class IconModal extends PureComponent {
state = {}
render() {
const { visible, handleOk, handleCancel, handleSearch, selectIcon, selectedItem, searchItem } = this.props
let webIconsTem
let directionIconsTem
let suggestionIconsTem
let editIconsTem
let dataIconsTem
let logoIconsTem
if (searchItem) {
webIconsTem = webIcons.filter(item=>item.toLocaleLowerCase().indexOf(searchItem?.toLocaleLowerCase()) > -1)
editIconsTem = editIcons.filter(item=>item.toLocaleLowerCase().indexOf(searchItem?.toLocaleLowerCase()) > -1)
dataIconsTem = dataIcons.filter(item=>item.toLocaleLowerCase().indexOf(searchItem?.toLocaleLowerCase()) > -1)
logoIconsTem = logoIcons.filter(item=>item.toLocaleLowerCase().indexOf(searchItem?.toLocaleLowerCase()) > -1)
} else {
webIconsTem = webIcons
editIconsTem = editIcons
dataIconsTem = dataIcons
logoIconsTem = logoIcons
}
const tabItems = [
{
key: '1',
label: '网站通用图标',
children: (
<div style={{ height: '220px', overflowY: 'auto' }}>
{webIconsTem.map((item) => {
return <Tooltip title={item} text key={item}>
{
createElement(
Icon[item],{
className: classNames(styles.icon, {[styles.selectedicon]: item?.toLocaleLowerCase() === selectedItem?.toLocaleLowerCase()}),
onClick: () => { selectIcon(item) }
}
)
}
</Tooltip>
})}
</div>
)
},
{
key: '2',
label: '编辑类图标',
children: (
<div style={{ height: '220px', overflowY: 'auto' }}>
{editIconsTem.map((item) => {
return <Tooltip title={item} text key={item}>
{
createElement(
Icon[item],{
className: classNames(styles.icon, {[styles.selectedicon]: item?.toLocaleLowerCase() === selectedItem?.toLocaleLowerCase()}),
onClick: () => { selectIcon(item) }
}
)
}
</Tooltip>
})}
</div>
)
},
{
key: '3',
label: '数据类图标',
children: (
<div style={{ height: '220px', overflowY: 'auto' }}>
{dataIconsTem.map((item) => {
return <Tooltip title={item} text key={item}>
{
createElement(
Icon[item],{
className: classNames(styles.icon, {[styles.selectedicon]: item?.toLocaleLowerCase() === selectedItem?.toLocaleLowerCase()}),
onClick: () => { selectIcon(item) }
}
)
}
</Tooltip>
})}
</div>
)
},
{
key: '4',
label: '品牌和标识',
children: (
<div style={{ height: '220px', overflowY: 'auto' }}>
{logoIconsTem.map((item) => {
return <Tooltip title={item} text key={item}>
{
createElement(
Icon[item],{
className: classNames(styles.icon, {[styles.selectedicon]: item?.toLocaleLowerCase() === selectedItem?.toLocaleLowerCase()}),
onClick: () => { selectIcon(item) }
}
)
}
</Tooltip>
})}
</div>
)
}
]
return (
<Modal
title='图标选择'
open={visible}
width='640px'
centered
destroyOnClose
onOk={handleOk}
onCancel={handleCancel}
>
<Search placeholder='在此搜索图标' onSearch={handleSearch} enterButton />
<Tabs items={tabItems} defaultActiveKey='1' />
</Modal>
)
}
}
export default IconModal

@ -0,0 +1,21 @@
.icon {
width: 40px;
height: 40px;
font-size: 20px;
line-height: 40px;
text-align: center;
justify-content: center;
}
.icon:hover {
cursor: pointer;
background: #515151;
color: honeydew;
border-radius: 5px;
}
.selectedicon {
background: #515151;
color: honeydew;
border-radius: 5px;
}

@ -0,0 +1,25 @@
import React, { PureComponent } from 'react'
import PropTypes from 'prop-types'
import { Tooltip } from 'antd'
import styles from './index.less'
export default class LineWrap extends PureComponent {
static propTypes = {
title: PropTypes.string,
lineClampNum: PropTypes.number,
// colWidth: PropTypes.string
}
render() {
const { title, lineClampNum, colWidth } = this.props
const lineWidth = colWidth !== '' && colWidth !== undefined ? colWidth : '80px'
return (
<Tooltip placement="topLeft" title={title}>
<span className={styles.col} style={{ WebkitLineClamp: lineClampNum, width: lineWidth }}>
{title}
</span>
</Tooltip>
)
}
}

@ -0,0 +1,10 @@
.col {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
display: inline-block;
}
.content > span {
display: block;
}

@ -0,0 +1,26 @@
import './index.less'
const Loading = () => {
return (
<div className='um_content'>
<div className='spinner'>
<div id='loading'>
<div className='spinDot'></div>
<div className='spinDot'></div>
<div className='spinDot'></div>
<div className='spinDot'></div>
<div className='spinDot'></div>
<div className='spinDot'></div>
<div className='spinDot'></div>
<div className='spinDot'></div>
</div>
<div className='loadingInfo'>
<span>页面初始化中......</span>
</div>
</div>
</div>
)
}
export default Loading

@ -0,0 +1,126 @@
.um_content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(255,255,255);
z-index: 1200;
overflow: auto;
margin: 0 auto;
width: 100%;
height: 100vh;
.spinner {
position: absolute;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
width: 120px;
height: 80px;
#loading {
position: relative;
width: 50px;
height: 50px;
margin: 0 auto;
.spinDot {
width: 0.3em;
height: 0.3em;
border-radius: 2px;
background: #68b2ce;
position: absolute;
animation: spinDot linear 0.8s infinite;
-webkit-animation: spinDot linear 0.8s infinite;
&:nth-child(1) {
left: 24px;
top: 2px;
animation-delay: 0s;
}
&:nth-child(2) {
left: 40px;
top: 8px;
animation-delay: 0.1s;
}
&:nth-child(3) {
left: 47px;
top: 24px;
animation-delay: 0.1s;
}
&:nth-child(4) {
left: 40px;
top: 40px;
animation-delay: 0.2s;
}
&:nth-child(5) {
left: 24px;
top: 47px;
animation-delay: 0.4s;
}
&:nth-child(6) {
left: 8px;
top: 40px;
animation-delay: 0.5s;
}
&:nth-child(7) {
left: 2px;
top: 24px;
animation-delay: 0.6s;
}
&:nth-child(8) {
left: 8px;
top: 8px;
animation-delay: 0.7s;
}
}
@keyframes spinDot {
0%, 40%, 100% {
transform: scale(1);
}
20% {
transform: scale(3);
}
}
@-webkit-keyframes spinDot {
0%, 40%, 100% {
transform: scale(1);
}
20% {
transform: scale(3);
}
}
}
}
.loadingInfo {
width: 140px;
height: 20px;
position: absolute;
top: 70%;
text-align: center;
text-indent: 4px;
> span {
font-family: "Microsoft YaHei", Helvetica, Arial, Lucida Grande, Tahoma, sans-serif, Raleway, sans-serif;
color: black;
display: block;
font-size: 16px;
text-align: center;
width: 100%;
}
}
}

@ -0,0 +1,7 @@
import { createFromIconfontCN } from '@ant-design/icons'
import defaultSettings from '../../../config/defaultSettings'
export default createFromIconfontCN({
// 该地址为iconfont中的项目地址根据实际进行修改
scriptUrl: defaultSettings.iconfontUrl
})

@ -0,0 +1,10 @@
import { PureComponent } from 'react'
class NotificationTemplate extends PureComponent {
// 根据需求,此组件不再显示任何内容
render() {
return <div style={{ display: 'none' }} />;
}
}
export default NotificationTemplate

@ -0,0 +1,23 @@
.deptContentHidden {
font-family: PingFangSC-Regular, serif;
font-size: 14px;
color: #666666;
letter-spacing: 0.2px;
text-align: justify;
line-height: 22px;
height: 45px;
overflow: hidden;
}
.deptContent {
font-family: PingFangSC-Regular, serif;
font-size: 14px;
color: #666666;
letter-spacing: 0.2px;
text-align: justify;
line-height: 22px;
}
.more-btn {
float: right;
}

@ -0,0 +1,59 @@
import React, {PureComponent} from 'react';
import { Input } from 'antd';
import styles from '../index.less'
const formatNumber = (value) => {
value += '';
const list = value.split('.');
const prefix = list[0].charAt(0) === '-' ? '-' : '';
let num = prefix ? list[0].slice(1) : list[0];
let result = '';
while (num.length > 3) {
result = `,${num.slice(-3)}${result}`;
num = num.slice(0, num.length - 3);
}
if (num) {
result = num + result;
}
return `${prefix}${result}${list[1] ? `.${list[1]}` : ''}`;
}
class NumberInput extends PureComponent {
onChange = e => {
const { value } = e.target;
const reg = /^\d*?$/;
if ((!isNaN(value) && reg.test(value)) || value === '') {
this.props.onChange(value);
}
};
// '.' at the end or only '-' in the input box.
onBlur = () => {
const { value, onBlur, onChange } = this.props;
let valueTemp = value;
if (value.charAt(value.length - 1) === '.') {
valueTemp = value.slice(0, -1);
}
onChange(valueTemp.replace(/0*(\d+)/, '$1'));
if (onBlur) {
onBlur();
}
};
render() {
const { placeholder, min } = this.props;
return (
<Input
min={min !== 0 ? min : 0}
{...this.props}
onChange={this.onChange}
// onBlur={this.onBlur}
placeholder={placeholder !== "" ? placeholder : ""}
// maxLength={25}
/>
);
}
}
export default NumberInput;

@ -0,0 +1,102 @@
import React, {PureComponent} from 'react';
import { Tooltip, InputNumber } from 'antd';
import styles from '../index.less'
import {NumberInput} from "@/components/NumberInput";
const formatNumber = (value) => {
value += '';
const list = value.split('.');
const prefix = list[0].charAt(0) === '-' ? '-' : '';
let num = prefix ? list[0].slice(1) : list[0];
let result = '';
while (num.length > 3) {
result = `,${num.slice(-3)}${result}`;
num = num.slice(0, num.length - 3);
}
if (num) {
result = num + result;
}
return `${prefix}${result}${list[1] ? `.${list[1]}` : ''}`;
}
/**
* 金额处理
*/
class NumericInput extends PureComponent {
state = {
disabled: false,
}
UNSAFE_componentWillReceiveProps(nextProps) {
if(undefined != nextProps.disabled && nextProps.disabled !== this.props.disabled) {
this.setState({disabled: nextProps.disabled});
}
}
onChange = e => {
// const { value } = e.target; // input 取值方式
const value = e + '';
const reg = /^\d*(\.\d*)?$/;
if ((!isNaN(value) && reg.test(value)) || value === '') {
this.props.onChange(value);
}
};
// '.' at the end or only '-' in the input box.
onBlur = () => {
const { value, onBlur, onChange } = this.props;
if(value) {
let valueTemp = value + '';
if (typeof(valueTemp) == 'string' && valueTemp?.charAt(valueTemp.length - 1) === '.') {
valueTemp = valueTemp.slice(0, -1);
}
onChange(valueTemp?.replace(/0*(\d+)/, '$1'));
if (onBlur) {
onBlur();
}
}
};
render() {
const { value, placeholder, min,precision } = this.props;
const valueTem = value || value != undefined ? value + '' : '';
const {disabled} = this.state;
const title = valueTem ? (
<span className={styles.numericInputTitle}>{valueTem !== '-' ? '¥' + formatNumber(valueTem) : '-'}</span>
) : (
'请输入'
);
return (
<Tooltip
trigger={['focus']}
title={title}
placement="topLeft"
overlayClassName="numeric-input"
>
<InputNumber
min={min !== 0 ? min : 0}
max={10000000000}
{...this.props}
value={valueTem}
onChange={this.onChange}
onBlur={this.onBlur}
placeholder={placeholder !== "" ? placeholder : ""}
formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',').replace(/¥+/g, "¥")}
parser={value => `${value}`.replace(/\¥|\$\sR?|(,*)/g, '').replace(/¥+/g, "")}
precision={precision? precision : 2}
maxLength={14}
disabled={disabled}
// addonAfter={('元')}
/>
</Tooltip>
);
}
}
export default NumericInput;

@ -0,0 +1,12 @@
import NumberInput from './NumberInput';
import NumericInput from './NumericInput';
const input = {
NumberInput,
NumericInput,
};
export {
input as default,
NumberInput,
NumericInput,
};

@ -0,0 +1,10 @@
.numeric-input .ant-tooltip-inner {
min-width: 32px;
min-height: 37px;
}
.numeric-input .numeric-input-title {
font-size: 14px;
}

@ -0,0 +1,125 @@
import {PureComponent} from 'react';
import {TreeSelect} from 'antd';
import { connect, history } from '@umijs/max';
const {TreeNode} = TreeSelect;
@connect(({globaldata, loading}) => ({
globaldata,
loading: loading.models.globaldata
}))
class SelectDeptTree extends PureComponent {
state = {
value: this.props.value,
treeData: [
{title: '部门', id: '000000000000', key: '000000000000', value: '000000000000', dept_id: '000000000000', dept_code: "000"},
],
};
UNSAFE_componentWillReceiveProps(nextProps) {
if(undefined != nextProps.value && nextProps.value !== this.props.value) {
this.setState({value: nextProps.value});
}
}
constructor(props) {
super(props);
}
onChange = (value, label, extra) => {
if (value != '000000000000') {
const {selectedDeptTreeValue} = this.props;
if(selectedDeptTreeValue){
const selectDept = {
dept_code: value,
title: label[0],
}
selectedDeptTreeValue(selectDept, label, extra);
}
this.setState({value});
}
};
onSelect = value => {
const {onSelect} = this.props;
if(onSelect){
onSelect(value)
}
}
onTreeExpand = expandedKeys => {
const {onTreeExpand} = this.props;
if(onTreeExpand){
onTreeExpand(expandedKeys)
}
}
updateTreeData(list, key, children) {
return list.map(node => {
if (node.key === key) {
return {
...node,
children,
};
} else if (node.children) {
return {
...node,
children: this.updateTreeData(node.children, key, children),
};
}
return node;
});
}
onLoadData = ({id, key, children}) => {
const {dispatch} = this.props;
const params = {
parentid: id,
};
return new Promise((resolve) => {
if (children) {
resolve();
return;
}
dispatch({
type: 'globaldata/get_prodepttree_by_parentid_for_prodept',
payload: params,
callback: (res) => {
if(res.success == true) {
// treeNode.props.dataRef.children = res.data;
this.setState({
treeData: this.updateTreeData(this.state.treeData, key, res.data)
});
resolve();
}
}
});
});
};
render() {
const { treeData, value } = this.state;
const { placeholder } = this.props;
return (
<TreeSelect
showSearch
value={value}
dropdownStyle={{maxHeight: 400, overflow: 'auto'}}
placeholder={placeholder == null ? null : "请选择部门"}
treeDefaultExpandAll
onSelect={this.onSelect}
onChange={this.onChange}
onTreeExpand={this.onTreeExpand}
loadData={this.onLoadData}
treeData={treeData}
/>
);
}
}
export default SelectDeptTree;

@ -0,0 +1,119 @@
import { PureComponent } from 'react'
import { TreeSelect } from 'antd'
const { TreeNode } = TreeSelect
class SelectEbookArticleTypeTree extends PureComponent {
state = {
value: undefined,
treeData: [
{ title: '分类', key: '000000000000', id: '000000000000', levelcode: '000000000000', value: '000000000000' }
]
}
constructor(props) {
super(props)
this.state.value = props?.value
}
onChange = (value, label, extra) => {
if (extra.key !== '000000000000') {
const { selectedEbookArticleTypeTreeValue } = this.props
selectedEbookArticleTypeTreeValue({key: value, label: label[0]})
this.setState({ value: {label: label[0]} })
}
}
onSelect = value => {
}
onTreeExpand = expandedKeys => {
}
updateTreeData(list, key, children) {
return list.map(node => {
if (node.key === key) {
return {
...node,
key: node.id,
value: node.value,
children
}
} else if (node.children) {
return {
...node,
key: node.id,
value: node.value,
children: this.updateTreeData(node.children, key, children)
}
}
return node
})
}
onLoadData = ({id, key, children}) => {
const { dispatch } = this.props
const params = {
parentid: id
}
return new Promise((resolve) => {
if (children) {
resolve()
return
}
dispatch({
type: 'globaldata/get_proebookarticletypetree_by_parentid',
payload: params,
callback: (res) => {
if(res.success === true) {
// treeNode.props.dataRef.children = res.list
this.setState({
treeData: this.updateTreeData(this.state.treeData, key, res.list)
})
resolve()
}
}
})
})
}
renderTreeNodes = data =>
data.map(item => {
if (item.children) {
return (
<TreeNode title={item.title} key={item.key} dataRef={item} value={item.key}>
{this.renderTreeNodes(item.children)}
</TreeNode>
)
}
return <TreeNode {...item} value={item.key} dataRef={item} title={item.title} key={item.key} />
})
render() {
const { value } = this.props
const { treeData } = this.state
return (
<TreeSelect
showSearch
value={value?.label}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder='请选择分类'
treeDefaultExpandAll
onSelect={this.onSelect}
onChange={this.onChange}
onTreeExpand={this.onTreeExpand}
loadData={this.onLoadData}
treeData={treeData}
/>
)
}
}
export default SelectEbookArticleTypeTree

@ -0,0 +1,122 @@
import { PureComponent } from 'react'
import { TreeSelect } from 'antd'
import { connect } from '@umijs/max'
const emptyValue = { label: null, value: null }
@connect(({ globaldata, loading }) => ({
globaldata,
loading: loading.models.globaldata
}))
class SelectMenuTree extends PureComponent {
state = {
treeData: [],
cacheTreeData: [],
value: emptyValue,
cacheValue: emptyValue
}
static getDerivedStateFromProps (nextProps, state) {
let newState = {}
if (!!nextProps.treeData && nextProps.treeData !== state.cacheTreeData) {
newState = {
...newState,
treeData: nextProps?.treeData ?? [],
cacheTreeData: nextProps?.treeData ?? []
}
}
if (!!nextProps.value && nextProps.value !== state.cacheValue) {
newState = {
...newState,
value: nextProps?.value ?? emptyValue,
cacheValue: nextProps?.cacheValue ?? emptyValue
}
}
return Object.keys(newState)?.length > 0 ? newState : null
}
updateTreeData(list, key, children) {
return list.map(node => {
if (node.id === key) {
return {
...node,
children
}
} else if (node.children) {
return {
...node,
children: this.updateTreeData(node.children, key, children)
}
}
return node
})
}
loadData = ({ id, key, children }) => {
const { dispatch, params: loadParams } = this.props
const params = {
parentid: id,
...loadParams
}
return new Promise(resolve => {
if (children) {
resolve()
return
}
dispatch({
type: 'globaldata/get_promenutree_by_parentid_for_promenu',
payload: params,
callback: res => {
if(res.success) {
this.setState({
treeData: this.updateTreeData(this.state.treeData, key, res.list)
})
resolve()
}
}
})
})
}
onChange = (data, _, extra) => {
const { selectMenuTree, onChange } = this.props
const { label, value } = data ?? {}
if (value === '000000000000') return
const params = { label: label ?? null, value: value ?? null }
selectMenuTree && selectMenuTree(params, label, extra)
!selectMenuTree && onChange && onChange(params)
this.setState({ value: params })
}
render () {
const { treeData, value } = this.state
return (
<TreeSelect
allowClear
showSearch
treeDefaultExpandAll
labelInValue
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
loadData={this.loadData}
treeData={treeData}
value={value}
onChange={this.onChange}
placeholder='请选择菜单'
fieldNames={{ label: 'title', value: 'id', children: 'children' }}
/>
)
}
}
export default SelectMenuTree

@ -0,0 +1,91 @@
import {PureComponent} from 'react';
import {TreeSelect} from 'antd';
const {TreeNode} = TreeSelect;
class SelectOptionTree extends PureComponent {
state = {
value: undefined,
treeData: this.props.treeData || []
}
constructor(props) {
super(props);
}
UNSAFE_componentWillReceiveProps(nextProps) {
if(undefined !== nextProps.value && nextProps.value !== this.props.value) {
this.setState({value: nextProps.value});
}
if(undefined !== nextProps.treeData) {
this.setState({treeData: nextProps.treeData});
}
}
onSelect = (value) => {
const {onChange} = this.props;
if(onChange){
onChange(value);
}
}
onChangeValue = (value) => {
const {onChange} = this.props;
let values = '';
if (undefined !== value) {
values = value;
}
if(onChange){
onChange(values);
}
this.setState({
value: values
})
}
renderTreeNodes = data =>
Array.from(data).map(item => {
const {type} = this.props;
let val = item.value ? item.value : null;
let title = `${item.title ? item.title : ''}[${val}]`;
if (item.children?.length > 0) {
item.disabled = type !== 'area';
return (
<TreeNode title={title} key={val} value={val} disabled={item.disabled}>
{this.renderTreeNodes(item.children)}
</TreeNode>
);
}
return <TreeNode {...item} title={title} key={val} value={val}/>;
});
render() {
const { placeholder, disabled, selectWidth } = this.props;
const { treeData, value } = this.state;
return (
<TreeSelect
allowClear
showSearch
value={value}
dropdownStyle={{maxHeight: 400, overflow: 'auto'}}
style={{width: '100%'}}
dropdownMatchSelectWidth={selectWidth ? selectWidth : 255}
placeholder={placeholder ? placeholder : ''}
disabled={disabled ? disabled : false}
onSelect={this.onSelect}
onChange={this.onChangeValue}
treeLine
treeNodeFilterProp="title"
>
{this.renderTreeNodes(treeData)}
</TreeSelect>
);
}
}
export default SelectOptionTree;

@ -0,0 +1,133 @@
import {PureComponent} from 'react'
import {TreeSelect} from 'antd'
import {connect} from '@umijs/max'
const {TreeNode} = TreeSelect
@connect(({globaldata, loading}) => ({
globaldata,
loading: loading.models.globaldata,
}))
class SelectOrganTree extends PureComponent {
state = {
value: undefined,
treeData: [
{ title: '机构', key: '000000000000', value: '000000000000', org_id: '000000000000', org_code: '0000', id: '000000000000' }
],
}
constructor(props) {
super(props)
}
UNSAFE_componentWillReceiveProps(nextProps) {
if(undefined !== nextProps.value && nextProps.value !== this.props.value) {
this.setState({value: nextProps.value})
}
}
onChange = (value, label, extra) => {
if (value !== '000000000000') {
const {selectedOrganTreeValue} = this.props
if(selectedOrganTreeValue){
const selectDept = {
org_code: value,
title: label[0]
}
selectedOrganTreeValue(selectDept, label, extra)
}
this.setState({value})
}
}
onSelect = value => {
const {onSelect} = this.props
if(onSelect){
onSelect(value)
}
}
onTreeExpand = expandedKeys => {
const {onTreeExpand} = this.props
if(onTreeExpand){
onTreeExpand(expandedKeys)
}
}
updateTreeData(list, key, children) {
return list.map(node => {
if (node.value === key) {
return {
...node,
children
}
} else if (node.children) {
return {
...node,
children: this.updateTreeData(node.children, key, children)
}
}
return node
})
}
onLoadData = ({ key, children, id }) => {
const { dispatch } = this.props
const params = { parentid: id }
return new Promise((resolve) => {
if (children) {
resolve()
return
}
dispatch({
type: 'globaldata/get_proorgtree_by_parentid_for_proorg',
payload: params,
callback: (res) => {
if(res.success === true) {
this.setState({
treeData: this.updateTreeData(this.state.treeData, key, res.list)
})
resolve()
}
}
})
})
}
renderTreeNodes = data =>
data.map(item => {
if (item.children) {
return (
<TreeNode title={item.title} key={item.title} dataRef={item} value={item.title}>
{this.renderTreeNodes(item.children)}
</TreeNode>
)
}
return <TreeNode {...item} value={item.title} dataRef={item} title={item.title} key={item.title}/>
})
render() {
const { treeData, value } = this.state
return (
<TreeSelect
showSearch
value={value}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder='请选择机构'
treeDefaultExpandAll
onSelect={this.onSelect}
onChange={this.onChange}
onTreeExpand={this.onTreeExpand}
loadData={this.onLoadData}
treeData={treeData}
/>
)
}
}
export default SelectOrganTree

@ -0,0 +1,95 @@
import { PureComponent } from 'react'
import { List } from 'antd'
import styles from './index.less'
const { Item: ListItem } = List
class StandardList extends PureComponent {
state = {
}
constructor(props) {
super(props)
const { selectedRows, data = {} } = props
}
/*static getDerivedStateFromProps(nextProps) {
// clean state
if (nextProps.selectedRows.length === 0) {
return {
selectedRowKeys: [],
}
}
return null
}*/
handleListChange = (pagination) => {
const { onChange } = this.props
/*this.setState({
indeterminate: false,
checkAll: false,
})*/
onChange && onChange(pagination)
}
onCheckAllChange = e => {
const { data = {}, onSelectRow } = this.props
this.setState({
selectedRows: e.target.checked ? data.list : [],
indeterminate: false,
checkAll: e.target.checked
})
onSelectRow && onSelectRow(e.target.checked ? data.list : [])
}
onChange = checkedValues => {
const { data = {}, onSelectRow } = this.props
this.setState({
selectedRows: checkedValues,
indeterminate: !!checkedValues.length && checkedValues.length < data.list.length,
checkAll: checkedValues.length === data.list.length
})
onSelectRow && onSelectRow(checkedValues)
}
render() {
const { data = {}, rowKey, loading, actions, details, className } = this.props
const { list = [], pagination } = data
const paginationProps = {
showSizeChanger: true,
showQuickJumper: true,
...pagination,
pageSizeOptions: [8, 16, 40, 80],
onChange: page => {
pagination.current = page
this.handleListChange(pagination)
}
}
return (
<div className={className ?? styles.cardList}>
{list &&
<List
rowKey={rowKey || 'key'}
grid={{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 3, xl: 4, xxl: 4 }}
loading={loading}
pagination={paginationProps}
dataSource={list}
renderItem={item => (
<ListItem>
{details(item)}
</ListItem>
)}
/>
}
</div>
)
}
}
export default StandardList

@ -0,0 +1,53 @@
@heading-color: fade(#000, 85%);
@primary-color: #1890ff;
@text-color-secondary: fade(#000, 45%);
.card {
:global {
.ant-card-meta-title {
margin-bottom: 4px;
& > a {
display: inline-block;
max-width: 100%;
color: @heading-color;
}
}
.ant-card-meta-description {
height: 44px;
overflow: hidden;
line-height: 22px;
}
}
&:hover {
:global {
.ant-card-meta-title > a {
color: @primary-color;
}
}
}
}
.cardItemContent {
display: flex;
height: 20px;
margin-top: 16px;
margin-bottom: -4px;
line-height: 20px;
& > span {
flex: 1;
color: @text-color-secondary;
font-size: 12px;
}
.avatarList {
flex: 0 1 auto;
}
}
.cardList {
margin-top: 24px;
}

@ -0,0 +1,19 @@
import React from 'react';
import { PaginationConfig, SorterResult, TableCurrentDataSource } from 'antd/lib/table';
export interface StandardTableProps {
columns: any;
onSelectRow: (row: any) => void;
data: any;
rowKey?: string;
selectedRows: any[];
onChange?: (
pagination: PaginationConfig,
filters: Record<keyof any, string[]>,
sorter: SorterResult<any>,
extra?: TableCurrentDataSource<any>
) => void;
loading?: boolean;
}
export default class StandardTable extends React.Component<StandardTableProps, any> {}

@ -0,0 +1,195 @@
import React, {Fragment, PureComponent} from 'react';
import {Alert, Table} from 'antd';
import styles from './index.less';
function initTotalList(columns) {
const totalList = [];
columns.forEach(column => {
if (column.needTotal) {
totalList.push({...column, total: 0});
}
});
return totalList;
}
class StandardTable extends PureComponent {
constructor(props) {
super(props);
const {columns} = props;
const needTotalList = initTotalList(columns);
this.state = {
selectedRowKeys: [],
selectedRows: [],
needTotalList,
};
}
static getDerivedStateFromProps(nextProps) {
// clean state
if (nextProps.selectedRows.length === 0) {
const needTotalList = initTotalList(nextProps.columns);
return {
selectedRowKeys: [],
selectedRows: [],
needTotalList,
};
}
return null;
}
handleRowSelectChange = (selectedRowKeys, selectedRows) => {
let {needTotalList} = this.state;
needTotalList = needTotalList.map(item => ({
...item,
total: selectedRows.reduce((sum, val) => sum + parseFloat(val[item.dataIndex], 10), 0),
}));
const {onSelectRow} = this.props;
if (onSelectRow) {
onSelectRow(selectedRows);
}
this.setState({selectedRowKeys, selectedRows, needTotalList});
};
handleTableChange = (pagination, filters, sorter) => {
const {onChange} = this.props;
if (onChange) {
onChange(pagination, filters, sorter);
}
};
cleanSelectedKeys = () => {
this.handleRowSelectChange([], []);
};
// 单击行事件
rowClick = (record) => {
const {selectionType, rowKey} = this.props;
const {selectedRowKeys, selectedRows} = this.state;
const key = record[rowKey] || record.key;
let newSelectedRowKeys = [];
let newSelectedRows = [];
if (selectedRowKeys.includes(key)) {
newSelectedRowKeys = selectedRowKeys.filter(item => item !== key)
newSelectedRows = selectedRows.filter(item => item.id !== key)
} else {
if("radio" != selectionType) {
newSelectedRowKeys = [...selectedRowKeys, key];
newSelectedRows = [...selectedRows, record];
}else {
newSelectedRowKeys = [key];
newSelectedRows = [record];
}
}
this.handleRowSelectChange(newSelectedRowKeys, newSelectedRows);
}
// 行操作事件
rowCallback = (record) => {
const {rowClick, rowDoubleClick, rowContextMenu, rowMouseEnter, rowMouseLeave} = this.props;
return {
onClick: event => {
const node = event.target;
const toolNode = event.currentTarget.lastChild;
const hasNode = toolNode.contains(node);
if (!hasNode) {
this.rowClick(record)
}
if(rowClick) {
rowClick(event, record);
}
}, // 点击行
onDoubleClick: event => {
if(rowDoubleClick) {
rowDoubleClick(event, record);
}
},
onContextMenu: event => {
if(rowContextMenu) {
rowContextMenu(event, record);
}
},
onMouseEnter: event => {
if(rowMouseEnter) {
rowMouseEnter(event, record);
}
}, // 鼠标移入行
onMouseLeave: event => {
if(rowMouseLeave) {
rowMouseLeave(event, record);
}
},
};
};
render() {
const {selectedRowKeys, needTotalList} = this.state;
const {data = {}, selectionType, rowKey, size, bodyStyle, isshowAlert,...rest} = this.props;
const {list = [], pagination} = data;
const toggleAlert = this.props.showAlert !== '' && this.props.showAlert !== undefined ? this.props.showAlert : true;
const paginationProps = {
showSizeChanger: true,
showQuickJumper: true,
current: pagination?.currentPage == 0 ? 1 : pagination?.currentPage,
...pagination,
};
const rowSelection = {
type: selectionType || "checkbox",
selectedRowKeys,
onChange: this.handleRowSelectChange,
getCheckboxProps: record => ({
disabled: record.disabled,
}),
};
return (
<div className={bodyStyle || styles.standardTable}>
{ isshowAlert&&(toggleAlert && toggleAlert !== undefined) ? (
<div className={styles.tableAlert}>
<Alert
message={
<Fragment>
已选择 <a style={{fontWeight: 600}}>{selectedRowKeys.length}</a> &nbsp;&nbsp;
{needTotalList.map(item => (
<span style={{marginLeft: 8}} key={item.dataIndex}>
{item.title} 总计&nbsp;
<span style={{fontWeight: 600}}>
{item.render ? item.render(item.total) : item.total}
</span>
</span>
))}
<a onClick={this.cleanSelectedKeys} style={{marginLeft: 24}}>
清空
</a>
</Fragment>
}
type="info"
showIcon
/>
</div>
) : null}
<Table
rowKey={rowKey || 'key'}
rowSelection={selectionType?rowSelection:null}
dataSource={list}
pagination={paginationProps}
onChange={this.handleTableChange}
onRow={this.rowCallback}
size={size || 'small'}
{...rest}
/>
</div>
);
}
}
export default StandardTable;

@ -0,0 +1,13 @@
.standardTable {
:global {
.ant-table-pagination {
margin-top: 24px;
}
}
.tableAlert {
margin-bottom: 16px;
}
}

@ -0,0 +1,11 @@
export function getNodeByKeyAndCallbackProcess (data, targetkey, callback) {
data.forEach((item, index, arr) => {
if (item.key === targetkey) {
return callback(item, index, arr)
}
if (item.children) {
return getNodeByKeyAndCallbackProcess(item.children, targetkey, callback)
}
})
}

@ -0,0 +1,6 @@
// /userinfo/2144/id => ['/userinfo','/useinfo/2144,'/userindo/2144/id']
// eslint-disable-next-line import/prefer-default-export
export function urlToList(url) {
const urllist = url.split('/').filter(i => i);
return urllist.map((urlItem, index) => `/${urllist.slice(0, index + 1).join('/')}`);
}

@ -0,0 +1,17 @@
import { urlToList } from './pathTools';
describe('test urlToList', () => {
it('A path', () => {
expect(urlToList('/userinfo')).toEqual(['/userinfo']);
});
it('Secondary path', () => {
expect(urlToList('/userinfo/2144')).toEqual(['/userinfo', '/userinfo/2144']);
});
it('Three paths', () => {
expect(urlToList('/userinfo/2144/addr')).toEqual([
'/userinfo',
'/userinfo/2144',
'/userinfo/2144/addr',
]);
});
});

@ -0,0 +1,98 @@
import React, { useMemo, forwardRef } from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'
import { deepMerge,deepClone } from '../../datav/usefull/index'
import useAutoResize from '../../datav/use/autoResize'
import './style.less'
const border = ['left-top', 'right-top', 'left-bottom', 'right-bottom']
const defaultColor = ['#4fd2dd', '#235fa7']
const BorderBox1 = forwardRef(({ children, className, style, color = [], backgroundColor = 'transparent' }, ref) => {
const { width, height, domRef } = useAutoResize(ref)
const mergedColor = useMemo(() => deepMerge(deepClone(defaultColor, true), color || []), [color])
const classNames = useMemo(() => classnames('dv-border-box-1', className), [
className
])
return (
<div className={classNames} style={style} ref={domRef}>
<svg className='border' width={width} height={height}>
<polygon fill={backgroundColor} points={`10, 27 10, ${height - 27} 13, ${height - 24} 13, ${height - 21} 24, ${height - 11}
38, ${height - 11} 41, ${height - 8} 73, ${height - 8} 75, ${height - 10} 81, ${height - 10}
85, ${height - 6} ${width - 85}, ${height - 6} ${width - 81}, ${height - 10} ${width - 75}, ${height - 10}
${width - 73}, ${height - 8} ${width - 41}, ${height - 8} ${width - 38}, ${height - 11}
${width - 24}, ${height - 11} ${width - 13}, ${height - 21} ${width - 13}, ${height - 24}
${width - 10}, ${height - 27} ${width - 10}, 27 ${width - 13}, 25 ${width - 13}, 21
${width - 24}, 11 ${width - 38}, 11 ${width - 41}, 8 ${width - 73}, 8 ${width - 75}, 10
${width - 81}, 10 ${width - 85}, 6 85, 6 81, 10 75, 10 73, 8 41, 8 38, 11 24, 11 13, 21 13, 24`} />
</svg>
{border.map(borderName => (
<svg
width='150px'
height='150px'
key={borderName}
className={`${borderName} border`}
>
<polygon
fill={mergedColor[0]}
points='6,66 6,18 12,12 18,12 24,6 27,6 30,9 36,9 39,6 84,6 81,9 75,9 73.2,7 40.8,7 37.8,10.2 24,10.2 12,21 12,24 9,27 9,51 7.8,54 7.8,63'
>
<animate
attributeName='fill'
values={`${mergedColor[0]};${mergedColor[1]};${mergedColor[0]}`}
dur='0.5s'
begin='0s'
repeatCount='indefinite'
/>
</polygon>
<polygon
fill={mergedColor[1]}
points='27.599999999999998,4.8 38.4,4.8 35.4,7.8 30.599999999999998,7.8'
>
<animate
attributeName='fill'
values={`${mergedColor[1]};${mergedColor[0]};${mergedColor[1]}`}
dur='0.5s'
begin='0s'
repeatCount='indefinite'
/>
</polygon>
<polygon
fill={mergedColor[0]}
points='9,54 9,63 7.199999999999999,66 7.199999999999999,75 7.8,78 7.8,110 8.4,110 8.4,66 9.6,66 9.6,54'
>
<animate
attributeName='fill'
values={`${mergedColor[0]};${mergedColor[1]};transparent`}
dur='1s'
begin='0s'
repeatCount='indefinite'
/>
</polygon>
</svg>
))}
<div className='border-box-content'>{children}</div>
</div>
)
})
BorderBox1.propTypes = {
children: PropTypes.node,
className: PropTypes.string,
style: PropTypes.object,
color: PropTypes.array,
backgroundColor: PropTypes.string
}
export default BorderBox1

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save