# 人事管理系统HRMS
**Repository Path**: helloWorldTiaoTiaoWa/HRMS
## Basic Information
- **Project Name**: 人事管理系统HRMS
- **Description**: 一个开源的人事管理系统,支持员工信息管理、考勤、薪资与流程审批,助力企业高效人事运营。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 3
- **Created**: 2026-07-31
- **Last Updated**: 2026-09-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Vue, Java, React
## README
# HRMS 人事管理系统
**线上访问地址:
** —— 我的这个轻量应用服务器内存只有1G,cpu只有1核, 用的是 H2 内嵌数据库一体包部署。 因为h2数据库适配目前还存在一些bug,线上环境可能存在一些问题,仅供演示,具体使用建议下载或者git拉取源码本地使用mysql部署。
**演示账号(线上可直接登录):** 管理员 `admin` / `Admin@123` · 部门主管 `manager` / `Manager@123` · 人事专员 `hr` / `Hr@123456` · 普通员工 `employee` / `Employee@123`
**基于 Spring Boot 3 + Vue 3 + 微信小程序 构建的现代化企业人事管理平台**
员工档案 · 组织架构 · 考勤打卡 · 加班休假 · 补卡审批 · 入转调离 · 地图围栏 · 移动办公
[项目预览](#项目预览) · [核心功能](#核心功能) · [导航与设置](#导航与设置) · [微信小程序端功能介绍](#微信小程序端功能介绍) · [快速开始](#快速开始) · [配置说明](#配置说明) · [更新日志](./CHANGELOG.md)
---
## 项目简介
HRMS 是一套面向中小型企业的人事管理系统,采用前后端分离架构,覆盖组织资料、员工档案、入转调离、定位打卡、考勤报表、加班休假、补卡审批、假期余额、通知及报表等常见人事业务。
系统内置 `EMPLOYEE`、`MANAGER`、`HR`、`ADMIN` 四类角色,通过前端菜单与操作可见性、路由守卫和后端接口鉴权实现多层权限控制。项目包含完整数据库迁移、演示数据、Excel 导入导出、附件管理、微信小程序移动端及 Windows 新手启动文档,可用于学习、二次开发或内部系统原型搭建。
> 本项目默认配置与演示账号仅用于本地开发和功能体验。正式部署前请修改数据库密码、JWT 密钥及所有初始密码。
## 项目预览
### 工作台
集中展示员工、加班、休假、审批等核心业务数据,让待办事项和人事动态一目了然。

### 员工管理
统一维护员工档案、组织归属、登录账号、假期额度及附件资料,支持 Excel 批量导入导出。

### 休假管理
支持休假申请、余额提示、职务代理人确认、材料上传及完整审批进度追踪。

查看更多系统截图
#### 系统设置
工作时段、工作日、加班上限、休假规则、验证码及统一假期标准均可动态配置。

#### 节假日管理
维护法定节假日、调休日和补班日期,为工时与休假计算提供准确依据。

#### 通知中心
集中查看审批通知和业务消息,支持未读提醒、消息弹窗和已读管理。

### 微信小程序端
> 小程序(hrms-wx)面向全体员工,提供移动端的自助办公能力。员工无需登录 PC,在手机上即可发起请假 / 加班、查看本人假期余额、处理待办审批、接收站内消息。截图如下:
| 登录页 | 首页(工作台) |
| --- | ------- |
| 登录页 | 首页 |
| 我的(个人中心) | 单据(请假 / 加班记录) |
| -------- | ------------- |
| 我的 | 单据 |
| 审批(待办 / 已办) | 消息(站内通知) |
| ----------- | -------- |
| 审批 | 消息 |
## 核心功能
| 模块 | 功能说明 |
| ----------- | --------------------------------------------------------------------------------------- |
| 工作台 | 人员、加班、休假、审批等核心数据概览 |
| 员工管理 | 员工档案、组织归属、账号创建、密码重置、账号解锁、Excel 导入导出 |
| 组织管理 | 公司、分支、部门、岗位、职级、负责人维护与可视化组织架构 |
| 入转调离 | 入职、转正、调动和离职事件,支持业务日期、审批流转与幂等生效 |
| 考勤管理 | 本人考勤记录、HR 月度报表、上下班打卡、迟到早退、缺卡和工作日统计 |
| 电子围栏 | 多办公地点、地图点击/拖动选点、半径预览、地址搜索、GCJ-02 坐标及服务端范围校验(可按需开关「围栏校验」) |
| 补卡管理 | PC/小程序补卡申请、月度次数限制、重复校验、统一审批、考勤回填与结果通知 |
| 加班管理 | 加班申请、草稿编辑、附件上传、动态工时计算、审批记录及审批通过后生成调休 |
| 休假管理 | 休假申请、职务代理人确认、审批流程、证明材料及权威余额校验 |
| 假期余额 | 全员统一标准、员工个人额度、人工调整、有效期、余额明细与调休来源控制 |
| 审批中心 | 加班、休假、补卡和员工生命周期待办/已办,支持业务详情、审批时间线与规则化审批人解析 |
| 审批规则 | 按部门和业务类型配置审批流程与审批节点,支持 `MAKEUP` 等工作流类型 |
| 津贴管理 | 津贴记录、附件维护与 Excel 批量处理 |
| 节假日 | 法定节假日、调休日和补班日期维护,为考勤与工时计算提供依据 |
| 系统设置 | 按 Tab 管理业务功能开关、工作制度、考勤、加班、假期和登录安全参数;功能开关同时约束 PC、微信小程序和后端接口 |
| 考试管理 | 题库分类与题目维护、手工录题、按分类/题型随机组卷、考卷总分与及格分配置、考场/场次配置、考生绑定与专属二维码;客观题自动评分、简答题人工评卷;支持 PC 直连与手机扫码作答 |
| 通知中心 | 申请提交、审批待办、进度、通过/驳回消息,以及未读和已读管理 |
| 报表中心 | 人事业务统计与可视化分析 |
| 个人中心 | 个人资料、账号安全、密码修改及本人假期余额 |
| 公告管理 / 公告中心 | 公告的标题、类型、有效期与状态维护;员工在公告中心查阅已发布公告 |
| 审计日志 | 按操作人、模块检索系统操作留痕 |
| 数据健康检查 | 数据一致性与异常项体检,按错误/警告分级展示 |
| 劳动合同 | 合同编号、合同类型、期限、签订日期、状态与合同附件管理 |
| 证明申请 | 在职/收入等证明的申请、用途与开具状态跟踪 |
| 员工关怀 | 关怀积分与积分记录、勋章定义与授予记录、积分排行 |
| 绩效管理 | 考核周期、绩效目标与权重、绩效评分、360 评价 |
| 招聘管理 | 招聘需求、候选人跟踪、面试安排与结果、Offer 管理 |
| 培训管理 | 培训计划、课程安排与签到记录,课程可关联考卷 |
| 班次管理 | 班次上下班时间、迟到/早退宽容分钟数、默认班次与展示颜色 |
| 排班表 | 按部门/员工安排每日班次 |
| q出差管理 | 出差申请单、目的地、起止日期、天数、交通工具、预估费用与附件 |
| 报销管理 | 报销单与多明细(费用类别、金额、发生日期、发票凭证、说明) |
| 薪资核算 | 工资月份与计薪周期;薪资记录含基本工资、津贴、加班费、奖金、扣款、社保、公积金、个税与实发工资,并支持自定义薪资项目 |
| 奖惩与福利 | 奖励/处罚登记(走审批生效,单号 RD- 前缀)、审批留痕与台账统计;生日/节日/婚育/慰问福利发放台账,转已发放自动通知员工 |
| 移动办公(小程序) | 手机登录、定位打卡、补卡、请假/加班、假期余额、统一审批和站内消息 |
## 导航与设置
### PC 二级菜单
左侧导航按使用频率和业务相关性组织,路由地址保持不变:
| 导航层级 | 模块 |
| ------ | --------------------------------------- |
| 高频一级入口 | 工作台、审批中心、通知中心、公告中心 |
| 组织人事 | 员工档案、组织架构、入转调离、劳动合同、奖惩与福利、招聘管理 |
| 员工自助 | 证明申请、员工关怀 |
| 绩效发展 | 绩效管理 |
| 培训发展 | 培训管理 |
| 考勤休假 | 考勤管理、班次管理、排班表、出差管理、报销管理、休假管理、加班管理、节假日管理 |
| 薪酬数据 | 津贴管理、薪资核算、报表中心 |
| 系统配置 | 组织设置、审批规则、系统设置、公告管理、审计日志、数据健康检查 |
| 考试管理 | 题库管理、考卷配置、考场配置、考生配置 |
除一级入口外,所有业务模块都受功能开关约束:模块对应的业务开关关闭时菜单项自动隐藏,后端同时拒绝相关操作。
菜单会依据当前角色过滤;没有可访问子项的目录自动隐藏。当前页面所属目录自动展开,侧栏折叠时可通过弹出子菜单访问,移动端选择菜单后会自动关闭导航。
### 系统设置分类
系统设置使用六个 Tab 分隔展示:
| Tab | 设置项 |
| ---- | -------------------------------------------------------- |
| 功能管理 | 分别控制考勤打卡(含「围栏校验」子开关)、请假、加班三类业务及其审批;关闭业务时同步关闭审批,设置同时作用于 PC、微信小程序和后端接口 |
| 工作制度 | 上午/下午工作时段、每周工作周期和制度摘要 |
| 考勤规则 | 电子围栏、地图选点、地址搜索、打卡位置要求和每月补卡次数 |
| 加班规则 | 工作日每日上限、月累计上限、单次上限和默认加班时段 |
| 假期规则 | 休假取整粒度、调休有效期和统一假期标准 |
| 登录安全 | 图形验证码开关 |
基础参数由页面右上角统一保存;围栏和假期标准分别通过各自操作即时维护。功能管理保存后立即刷新 PC 菜单;小程序进入工作台或业务页面时获取最新配置。关闭业务后客户端入口隐藏且后端拒绝相关操作;仅关闭审批时暂停申请提交与审批处理,历史记录仍保留可查。
## 微信小程序端功能介绍
`hrms-wx` 是面向**全体员工**的移动办公入口,让员工不必登录 PC 即可在手机上处理人事事务。小程序与 `hrms-server` 后端共用同一套 JWT 鉴权与数据,和 PC 端数据实时互通。
### 功能地图
| 页面 / 模块 | 功能说明 |
| -------- | ----------------------------------------------------- |
| 登录页 | 支持微信授权快速登录;已绑定账号可直接输入工号 / 手机号 + 密码登录,登录态本地持久化 |
| 首页(工作台) | 展示待办审批、我的请假/加班概览、同事生日、公司公告等人事动态,提供考勤和业务快捷入口 |
| 考勤打卡 | 展示今日工作日、标准班次、上下班状态和定位信息;每次打卡重新获取 `GCJ-02` 坐标并由服务端校验围栏 |
| 补卡申请 | 选择日期、上/下班卡类型、拟补时间和原因,展示当月次数及申请历史,并进入统一审批流 |
| 我的(个人中心) | 查看个人信息、本人假期余额、账号安全入口,统一跳转各业务功能 |
| 单据 | 我的请假、加班和补卡单据列表与详情,支持状态筛选、审批进度、驳回原因和材料附件 |
| 审批 | 待办/已办双标签;处理加班、休假、补卡等工作流,支持业务详情、同意、驳回和审批时间线 |
| 消息 | 站内通知中心,覆盖提交、待审批、审批进度和结果通知,支持未读提醒与已读管理 |
| 请假申请 | 选择假种、日期区间与职务代理人;调用后端实时估算请假时长,支持上传证明材料 |
| 加班申请 | 支持一天内多段加班明细(计划/实际起止)、读取系统工作时段计算时长,可上传附件 |
| 假期余额 | 汇总展示调休、年假等可用余额,逐条列出额度明细与有效期;未审批加班不产生调休 |
| 个人资料 | 维护个人资料、修改密码等账号安全设置 |
### 计算与一致性设计
- **工时计算动态读取系统设置**:请假 / 加班时长、起止时间均依据后端 `system_setting` 表中配置的工作时段(如上午 `08:30-12:00`、下午 `13:00-17:30`)与工作日规则计算,不写死固定上下班点,跟随管理后台设置实时变化。
- **假期余额同源**:余额页汇总与 PC 端一致,统一来自后端的 `LeaveBalanceService`,避免「首页显示 0、列表显示 5 天」这类口径不一致。
- **日期解析兼容**:接口接受 `2026-07-31 09:00:00` 与 `2026-07-31T09:00:00` 两种格式,避免解析失败导致 500。
- **本地估算 + 后端权威**:端内对工时、围栏距离做即时估算以提升交互体验,最终以后端返回值为准。
- **实时定位与围栏**:每次打卡重新调用 `wx.getLocation({ type: 'gcj02' })`,服务端根据启用围栏重新计算距离,客户端坐标和按钮状态不能绕过服务端校验。
- **补卡审批一致性**:补卡与加班、休假共用 `approval_task`,审批通过后才回填考勤;并发审批使用状态前置检查和数据库锁避免重复处理。
- **跨端功能开关**:小程序工作台、打卡、补卡、请假、加班及审批页面实时读取系统功能配置;PC 与小程序仅负责入口和操作可见性,后端对打卡、申请提交和审批处理进行最终强制校验。
- **调休来源控制**:调休余额统一读取 `leave_balance.remaining_amount`,只有审批通过且补偿方式为 `COMP_LEAVE` 的加班才能产生调休。
### 技术要点
- 原生小程序运行时(WXML / WXSS / JS),无需打包构建,导入微信开发者工具即可运行。
- 网络层基于 `wx.request` 封装,统一附加 `Authorization: Bearer `;附件使用 `wx.uploadFile` 上传。
- 环境通过 `config/index.js` 的 `ENV` 切换(`dev` / `prod`),分别对应本地与线上 `baseUrl`。
- 底部导航使用 `custom-tab-bar` 自定义,红点提示审批与消息未读数。
### 安全能力
- Spring Security + JWT 无状态认证
- 登录密码使用一次性 RSA-OAEP-256 公钥加密传输
- 数据库密码使用 BCrypt 单向散列
- 可开关图形验证码
- 1 分钟内连续登录失败 5 次,临时锁定账号 5 分钟
- 管理员可查看锁定状态并手动解锁
- 登录过期统一返回 `401`,前端提示并引导重新登录
- 普通权限不足保持 `403`,不会错误清除登录状态
- 前端菜单、路由、操作入口与后端接口权限协同控制
## 角色权限
| 角色 | 主要权限 |
| --------------- | ---------------------------------- |
| `EMPLOYEE` 普通员工 | 查看个人工作台、提交本人加班与休假、处理代理确认、查看通知和个人资料 |
| `MANAGER` 部门主管 | 普通员工能力、审批待办、查看员工及组织信息、访问管理报表 |
| `HR` 人事专员 | 员工与组织维护、假期额度、津贴、节假日、审批规则及系统业务参数管理 |
| `ADMIN` 系统管理员 | 系统全部管理能力、账号安全管理及锁定账号解锁 |
## 技术栈
### 后端
| 技术 | 版本 / 用途 |
| ----------------- | ----------------------- |
| Java | 17+ |
| Spring Boot | 3.3.2 |
| Spring Security | 身份认证与角色权限 |
| Spring JDBC | 基于 `JdbcTemplate` 的数据访问 |
| MySQL | 8.0(开发/生产环境) |
| H2 | 2.2.224(内嵌模式,轻量部署) |
| Flyway | 数据库版本迁移 |
| JJWT | 0.12.6,JWT 签发与校验 |
| Apache POI | 5.3.0,Excel 模板、导入与导出 |
| SpringDoc OpenAPI | 2.6.0,Swagger 接口文档 |
| Maven | 项目构建与依赖管理 |
### 前端
| 技术 | 版本 / 用途 |
| ------------ | ------------------- |
| Vue | 3.5 |
| TypeScript | 6.0 |
| Vite | 8.1 |
| Element Plus | 2.14 |
| Pinia | 4.0,状态管理 |
| Vue Router | 5.2,路由与权限守卫 |
| Axios | 1.19,HTTP 请求与登录过期拦截 |
| ECharts | 6.1,数据可视化 |
| Day.js | 日期时间格式化 |
### 微信小程序端
| 技术 | 版本 / 用途 |
| ------- | ---------------------------------------------------- |
| 微信小程序原生 | 基于 WXML / WXSS / JS 的运行时,无需构建工具 |
| 微信开发者工具 | libVersion 3.4.0,真机预览与代码上传 |
| 网络层 | `wx.request` 封装 + `wx.uploadFile` 上传附件,Bearer JWT 鉴权 |
| 本地存储 | `wx.setStorageSync` 持久化登录态(token / 用户 / 档案) |
| 业务逻辑 | 工时计算、假期余额汇总、请假 / 加班时长估算均在端内封装 |
## 项目结构
```text
HRMS/
├─ hrms-server/ # Spring Boot 后端
│ ├─ src/main/java/com/asys/hrms/
│ │ ├─ auth/ # 登录、验证码与账号锁定
│ │ ├─ security/ # JWT 与安全配置
│ │ ├─ employee/ # 员工管理与入转调离
│ │ ├─ organization/ # 组织架构
│ │ ├─ attendance/ # 考勤、围栏、补卡和地图地点搜索
│ │ ├─ overtime/ # 加班管理
│ │ ├─ leave/ # 休假与假期余额
│ │ ├─ approval/ # 审批任务与规则
│ │ ├─ allowance/ # 津贴管理
│ │ ├─ holiday/ # 节假日管理
│ │ ├─ notification/ # 通知中心
│ │ ├─ settings/ # 系统设置
│ │ └─ excel/ # Excel 导入导出
│ └─ src/main/resources/
│ ├─ application.yml # 应用配置
│ └─ db/migration/ # Flyway 迁移脚本
├─ hrms-web/ # Vue 3 前端
│ └─ src/
│ ├─ views/ # 业务页面
│ ├─ components/ # 公共组件
│ ├─ layouts/ # 页面布局
│ ├─ router/ # 路由配置
│ ├─ stores/ # Pinia 状态
│ └─ utils/ # 请求、权限、字典工具
├─ hrms-wx/ # 微信小程序端
│ ├─ pages/ # 页面:登录、首页、我的、单据、审批、消息等
│ │ ├─ login/ # 微信登录(手机号授权 + 账号绑定)
│ │ ├─ home/ # 首页工作台,待办与人事动态概览
│ │ ├─ attendance/ # 实时定位打卡与当月考勤
│ │ ├─ makeup/ # 补卡申请与申请历史
│ │ ├─ leave-apply/ # 请假申请,含时长自动估算
│ │ ├─ overtime-apply/ # 加班申请,支持多段明细与附件
│ │ ├─ balance/ # 假期余额汇总与明细
│ │ ├─ profile/ # 个人资料与安全设置
│ │ ├─ bills/ # 请假 / 加班单据列表与详情
│ │ ├─ approval/ # 待办 / 已办审批
│ │ ├─ message/ # 站内消息中心
│ │ ├─ about/ # 关于与版本信息
│ │ └─ mine/ # 我的(个人中心入口)
│ ├─ components/ # 业务组件(审批卡片、详情、tab-bar 等)
│ ├─ utils/ # api、request、working-time 等封装
│ ├─ config/ # 环境配置(dev / prod 的 baseUrl)
│ ├─ custom-tab-bar/ # 自定义底部导航
│ ├─ app.js / app.json / app.wxss # 小程序全局逻辑、页面与样式
│ └─ project.config.json # 微信开发者工具项目配置
├─ 人事管理系统操作手册.md
├─ 人事管理系统新手初次启动手册.md
└─ README.md
```
## 快速开始
### 方式一:一体包部署(推荐,无需 MySQL)
适用于轻量服务器或快速体验,使用内嵌 H2 数据库,前端资源打包在 jar 中。
#### 1. 环境要求
| 环境 | 推荐版本 |
| --- | -------- |
| JDK | 17 或更高版本 |
#### 2. 构建一体包
```cmd
cd /d D:\OtherProject\HRMS
build-allinone.bat
```
或 Linux/Mac:
```bash
./build-allinone.sh
```
该脚本会自动:
1. 构建前端(`npm install && npm run build`)
2. 将前端产物复制到后端的 `static` 目录
3. 打包后端 jar(内嵌 H2 数据库,无需 MySQL)
#### 3. 启动应用
Windows:
```cmd
start-hrms.bat
```
或 Linux/Mac:
```bash
./start-hrms.sh
```
首次启动会自动创建 H2 数据库文件(`hrms-server/hrms-data/`)并执行全部数据迁移。
访问地址:`http://localhost:8080`
默认账号:`admin` / `Admin@123`
> 内嵌模式使用 `embedded` profile,数据保存在本地 H2 文件中。适合单机部署和快速体验;如需多实例或大数据量,建议使用方式二(MySQL)。
#### 4. Linux 服务器后台部署(H2 一体包)
将构建产物 `hrms-server-1.0.0.jar` 上传到服务器(示例目录 `/home/HRMS/`),指定 `embedded` Profile 并通过 `--server.port` 指定端口,使用 `nohup` 后台启动:
```bash
nohup /path/to/jdk/bin/java -jar /home/HRMS/hrms-server-1.0.0.jar \
--spring.profiles.active=embedded \
--server.port=18080 \
> /home/HRMS/app.log 2>&1 &
```
查看启动日志:
```bash
tail -f /home/HRMS/app.log
```
确认端口监听:
```bash
ss -lntp | grep 18080
```
放行防火墙端口(firewalld 示例;云服务器还需在云平台安全组中放行对应端口):
```bash
sudo firewall-cmd --permanent --add-port=18080/tcp
sudo firewall-cmd --reload
```
当前示例线上地址:
```text
http://39.96.73.55:18080/
```
> H2 数据文件保存在启动目录下的 `hrms-data/` 中,备份时请同时备份该目录;`embedded` Profile 下默认无需外部 MySQL。
---
### 方式二:开发环境(需要 MySQL)
#### 1. 环境要求
| 环境 | 推荐版本 |
| ------- | ----------------------------- |
| JDK | 17 或更高版本 |
| Maven | 3.9.x,或直接使用项目内的 Maven Wrapper |
| Node.js | 22 LTS,至少满足 Vite 8 的运行要求 |
| npm | 随 Node.js 安装 |
| MySQL | 8.0 |
Windows 新手可以参考 [《人事管理系统新手初次启动手册》](./人事管理系统新手初次启动手册.md),其中包含 Java、Maven、Node.js、MySQL 及 phpStudy 的安装说明。
### 2. 准备数据库
确保 MySQL 8 已启动。默认开发配置如下:
```text
地址:localhost:3306
数据库:hrms
用户名:root
密码:root
```
数据库连接串启用了 `createDatabaseIfNotExist=true`。数据库账号具有建库权限时,首次启动会自动创建 `hrms` 数据库,并由 Flyway 执行全部表结构和初始化数据迁移。
如果本机密码不是 `root`,可通过环境变量覆盖:
```cmd
set DB_USERNAME=root
set DB_PASSWORD=你的数据库密码
```
也可同时自定义数据库地址:
```cmd
set DB_URL=jdbc:mysql://localhost:3306/hrms?createDatabaseIfNotExist=true^&useUnicode=true^&characterEncoding=utf8^&serverTimezone=Asia/Shanghai^&allowPublicKeyRetrieval=true^&useSSL=false
```
### 3. 启动后端
后端未显式指定 Profile 时默认使用 `dev`:本地数据库默认为 `localhost:3306/hrms`、账号密码为 `root/root`,并可通过前述 `DB_*` 环境变量覆盖。生产部署必须显式指定 `prod`,且必须提供数据库和 JWT 环境变量。
打开一个新的 `cmd` 窗口:
```cmd
cd /d D:\OtherProject\HRMS\hrms-server
mvnw.cmd spring-boot:run
```
如果已全局安装 Maven,也可以使用:
```cmd
mvn spring-boot:run
```
后端默认地址:
```text
http://localhost:8080
```
生产环境必须显式激活 `prod`:
```cmd
set SPRING_PROFILES_ACTIVE=prod
set DB_URL=jdbc:mysql://数据库地址:3306/hrms
set DB_USERNAME=生产数据库账号
set DB_PASSWORD=生产数据库密码
set JWT_SECRET=至少32字节的随机密钥
mvnw.cmd spring-boot:run
```
也可使用 `mvnw.cmd spring-boot:run -Dspring-boot.run.profiles=prod`。不要在生产环境省略 Profile,否则会按设计使用 `dev`。
Swagger 接口文档:
```text
http://localhost:8080/swagger-ui.html
```
### 4. 启动前端
再打开一个新的 `cmd` 窗口:
```cmd
cd /d D:\OtherProject\HRMS\hrms-web
npm ci
npm run dev
```
浏览器访问:
```text
http://localhost:5173
```
开发环境中,Vite 会将 `/api` 请求代理到 `http://localhost:8080`。
### 5. 运行微信小程序端
1. 用[微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)打开 `hrms-wx` 目录(已内置 `project.config.json`,AppID:`wx536861e25cc26da8`)。
2. 在微信开发者工具中勾选 **「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」**(开发阶段必须,否则无法访问 `localhost`)。
3. 确认 `hrms-wx/config/index.js` 中的环境为 `dev`,接口地址指向 `http://localhost:8080/api/v1`;若要连接正式环境,将 `ENV` 改为 `prod` 并填写对应域名。
4. 编译预览,使用小程序端「登录页」以演示账号(如 `employee / Employee@123`)登录即可进入工作台。
> 小程序登录与后端共用同一套 JWT;PC 端与小程序端可使用相同账号互通数据。
## 演示账号
Flyway 初始化数据包含以下本地演示账号:
| 角色 | 用户名 | 初始密码 |
| ----- | ---------- | -------------- |
| 系统管理员 | `admin` | `Admin@123` |
| 部门主管 | `manager` | `Manager@123` |
| 人事专员 | `hr` | `Hr@123456` |
| 普通员工 | `employee` | `Employee@123` |
> 演示账号仅供本地体验。正式环境必须修改或停用这些账号,并避免在公开环境使用默认密码。
## 配置说明
后端主配置位于:
```text
hrms-server/src/main/resources/application.yml
```
常用环境变量:
| 环境变量 | 默认值 | 说明 |
| ----------------------------- | -------------------------- | ----------------------------- |
| `DB_URL` | 本机 `hrms` 数据库 | JDBC 数据库连接串 |
| `DB_USERNAME` | `root` | 数据库用户名 |
| `DB_PASSWORD` | `root` | 数据库密码 |
| `SERVER_PORT` | `8080` | 后端服务端口 |
| `JWT_SECRET` | 内置开发值 | JWT 签名密钥 |
| `JWT_EXPIRATION_HOURS` | `12` | 登录令牌有效小时数 |
| `APP_ATTACHMENT_STORAGE_PATH` | `./data/attachments` | 附件保存目录 |
| `WX_APP_ID` | 空 | 微信小程序 AppID |
| `WX_APP_SECRET` | 空 | 微信小程序 AppSecret |
| `WX_MOCK_ENABLED` | `true` | 未配置微信凭据时是否启用本地模拟模式 |
| `AMAP_WEB_SERVICE_KEY` | 空 | 高德地图“Web 服务”类型 Key,用于电子围栏地点搜索 |
| `AMAP_API_BASE` | `https://restapi.amap.com` | 高德 Web 服务 API 地址,一般无需修改 |
### 地图与地点搜索配置
电子围栏底图、地图点击、标记拖动和半径预览由 PC 前端 Leaflet 组件完成。地点关键词搜索由后端代理高德 Web 服务,以避免将 Key 暴露到浏览器。
1. 在高德开放平台创建应用并申请 **Web 服务** 类型 Key。
2. 启动后端前设置环境变量:
```cmd
set AMAP_WEB_SERVICE_KEY=你的高德Web服务Key
```
1. 重启后端,在“系统配置 → 系统设置 → 考勤规则 → 新增打卡范围”中搜索地点。
地图和微信小程序统一使用 `GCJ-02` 坐标。浏览器“定位当前位置”依赖 Windows 位置服务;台式机没有可用定位源时可能超时,不影响搜索地点、点击地图或拖动标记选点。
### 微信小程序配置
本地开发未配置 `WX_APP_ID`/`WX_APP_SECRET` 时,可通过 `WX_MOCK_ENABLED=true` 使用模拟模式。正式环境应设置真实凭据并关闭模拟模式:
```cmd
set WX_APP_ID=你的微信小程序AppID
set WX_APP_SECRET=你的微信小程序AppSecret
set WX_MOCK_ENABLED=false
```
正式发布还需要在微信公众平台配置合法的 HTTPS `request`、`uploadFile` 和 `downloadFile` 域名。开发者工具中的 `localhost` 仅适用于模拟器,真机连接本机后端时应使用局域网 IP 并允许防火墙访问。
生产环境至少应设置:
```cmd
set DB_URL=你的生产数据库连接串
set DB_USERNAME=你的数据库账号
set DB_PASSWORD=高强度数据库密码
set JWT_SECRET=长度足够且随机生成的JWT密钥
```
请勿将真实密码、密钥、员工隐私数据和生产环境配置提交到 Git 仓库。
## 数据库迁移
项目使用 Flyway 自动管理数据库版本,迁移脚本位于:
```text
hrms-server/src/main/resources/db/migration
```
应用启动时自动执行尚未运行的迁移。已经执行过的迁移文件不应直接修改;数据库结构发生变化时,应创建新的 `V{版本号}__描述.sql` 文件。
当前功能管理由 `V22__business_feature_switches.sql` 初始化,新增考勤、请假、加班三类业务及审批开关,默认均为启用。`system_setting` 的新增记录必须同时提供非空的 `value_type` 和 `category` 字段。若本地数据库曾执行过早期有误的 V22 并留下 `Failed` 记录,应先清理半成品数据,再执行 Flyway `repair` 后重新迁移;正常首次安装无需人工处理。
### 考试管理
四个 PC 配置页(位于侧边栏“考试管理”二级菜单,仅 `HR`/`ADMIN` 可见):
1. **题库配置**:维护题目分类与题库题目,支持单选题、多选题、判断题、简答题及选项、正确答案和解析。
2. **考卷配置**:支持手工录题和从题库随机组卷;随机组卷可按分类、题型、数量和每题分值配置。新建考卷默认总分 `100`、及格分 `60`,题目或组卷规则的分值合计必须与配置总分一致。
3. **考场配置**:设置考试场次,关联已发布考卷,配置开放时间窗、考试限时、考场地点、座位数与及格分;支持开启/关闭、考生统计。
4. **考生配置**:为考场绑定考生,支持从员工批量导入或手动添加;每位考生生成专属考试二维码(含 `session`、`cand`、`token`);支持重置、删除与简答题人工评卷。
考试作答与评卷逻辑:
- 考生通过专属链接进入考试,支持 **PC 浏览器直连**与**手机扫码**(微信浏览器或小程序 `web-view` 加载同一套响应式 H5 页面)。
- 服务端权威计时:考试开始时间以考生首次进入为准,截止时间为 `开始时间 + 限时` 与场次结束时间取早者;到时自动交卷。
- 客观题(单选/多选/判断)提交后自动评分;简答题标记“待评卷”,由 HR 在考生配置中评卷并发布总分。
- 状态机:`READY → STARTED → SUBMITTED/GRADED/EXPIRED`,防止重复提交;作答每 15 秒自动保存。
- 公开考试接口(`/api/v1/exam/public/**`)仅依赖考生 `token` 鉴权,已在 `SecurityConfig` 中放行,无需登录即可作答。
考试相关迁移:`V23__exam_paper.sql`(考卷/考题)、`V24__exam_session.sql`(考场/场次)、`V25__exam_candidate.sql`(考生/作答/成绩)、`V26__exam_question_bank.sql`(题库分类/题库题目/组卷规则)、`V27__remove_question_bank_default_score.sql`(移除题库默认分值)、`V28__exam_paper_configured_total_score.sql`(考卷配置总分)。
### V29 及以后
| 版本 | 说明 |
| ------------------------------------- | ------------------------------------------------------------------------------ |
| `V29` | 人事字段校验约束 |
| `V30` | 业务单号序号表 |
| `V31` | 已上传附件的归属记录 |
| `V32` | 同一业务单据仅保留单一待办审批任务 |
| `V33` / `V34` | 审计日志表及其查询索引 |
| `V35` / `V36` | 登录锁定策略设置、审计日志保留期设置 |
| `V37` | 员工头像 |
| `V38` / `V39` / `V40` | 通知偏好、公告、登录页品牌配置 |
| `V41` | 劳动合同 |
| `V42` | 班次与排班 |
| `V43` / `V44` / `V45` | 出差、费用报销、证明申请 |
| `V46` / `V47` / `V48` / `V49` / `V50` | 绩效、招聘、培训、薪资、员工关怀 |
| `V51` | 证明申请纳入审批流 |
| `V52` / `V53` | 绩效反馈、账号与员工绑定的唯一约束 |
| `V54` | 扩展功能开关(覆盖新增业务模块) |
| `V55` | 登录尝试记录补充 IP 维度,支持按账号 + IP 复合锁定 |
| `V56` | 补 `leave_application.agent_id` 索引,避免附件鉴权中 `OR` 退化为全表扫描 |
| `V57` | 补 `leave_application.start_time`、`overtime_record.apply_date` 索引,支撑看板月份统计的范围查询 |
| `V58` | 奖惩与福利:`reward_discipline`(奖惩记录,审批生效)、`welfare_record`(福利发放台账)及功能开关 |
## 构建与部署
### 后端构建
```cmd
cd /d D:\OtherProject\HRMS\hrms-server
mvnw.cmd clean package
```
构建产物:
```text
hrms-server/target/hrms-server-1.0.0.jar
```
运行 JAR:
```cmd
java -jar hrms-server\target\hrms-server-1.0.0.jar
```
### 前端构建
```cmd
cd /d D:\OtherProject\HRMS\hrms-web
npm ci
npm run build
```
构建产物:
```text
hrms-web/dist
```
生产环境建议使用 Nginx、IIS 或其他 Web 服务器托管 `dist`,并将 `/api` 反向代理到后端服务。
## 项目文档
- [更新日志](./CHANGELOG.md):版本功能、新增配置、数据库迁移与问题修复记录
- [人事管理系统操作手册](./人事管理系统操作手册.md):角色权限、业务流程与系统操作说明
- [人事管理系统新手初次启动手册](./人事管理系统新手初次启动手册.md):Windows 环境安装、首次启动、构建部署与常见问题
- [后端模块说明](./hrms-server/README.md)
- [前端模块说明](./hrms-web/README.md)
## 常见问题
启动后端时无法连接 MySQL
确认 MySQL 服务已经启动,端口为 `3306`,并检查 `DB_USERNAME`、`DB_PASSWORD` 与实际账号一致。MySQL 账号还需具备创建和访问 `hrms` 数据库的权限。
前端请求接口失败
确认后端已在 `8080` 端口启动。开发环境由 Vite 自动代理 `/api`;如果修改了后端端口,需要同步修改 `hrms-web/vite.config.ts`。
数据库表没有自动创建
检查后端启动日志中的 Flyway 信息,并确认数据库账号具备建库和建表权限。不要手动删除 `flyway_schema_history`,除非明确了解迁移恢复流程。
登录后提示账号被锁定
同一账号在 1 分钟内连续输入错误密码 5 次会锁定 5 分钟。可等待自动解锁,或联系系统管理员在员工管理中手动解除锁定。
## 开发建议
1. 数据库变更统一通过新的 Flyway 迁移提交。
2. 新增接口时同步配置后端 `@PreAuthorize` 和前端操作可见性。
3. 不依赖前端隐藏实现安全控制,敏感接口必须在后端鉴权。
4. 提交前执行后端构建和前端类型检查:
```cmd
cd /d D:\OtherProject\HRMS\hrms-server
mvnw.cmd -DskipTests package
cd /d D:\OtherProject\HRMS\hrms-web
npm run build
```
## 联系方式
如果在使用、部署或二次开发过程中发现问题,或对项目有改进建议,欢迎通过以下方式联系:
- **创建 Issue**:请在当前 Gitee 仓库的 Issue 页面提交问题或建议。建议附上问题描述、复现步骤、运行环境及相关截图或错误日志,便于快速定位。
- **发送邮件**:[`1125196499@qq.com`](mailto:1125196499@qq.com?subject=HRMS%20人事管理系统问题反馈)
发送邮件时,请在邮件标题或正文中注明:
```text
项目名称:HRMS 人事管理系统
问题类型:功能异常 / 启动部署 / 使用建议 / 其他
问题描述:请描述操作步骤、预期结果和实际结果
环境信息:操作系统、Java、Node.js、MySQL 版本
```
> 为保护数据安全,请勿在公开 Issue 或邮件中发送数据库密码、JWT 密钥、真实员工隐私数据等敏感信息。
## License
本项目基于 [Apache License 2.0](./LICENSE) 开源。
---
如果这个项目对你有帮助,欢迎在 Gitee 点一个 Star。
有问题或建议,欢迎提交 Issue 或发送邮件交流。