Changelog
v0.17.0 - 2026-04-30
新增
- 部门权限范围(scope)强制校验:manager 只能操作本部门及子部门的资源,不能操作同级或上级部门
- Employee Service 的 GetByID/Update/Delete/Create 增加 scopeDeptIDs 参数,校验目标是否在管辖范围内
- Department Service 的 GetByID/Update/Create 增加 scopeDeptIDs 参数,校验目标部门/父部门是否在管辖范围内
- Attendance Service 的 GenerateSummary 增加 scopeDeptIDs 参数
- Leave Service 的 CreateRequest 增加 scopeDeptIDs 参数
- 新增 checkScope 辅助函数(service/scope_helper.go)
- 新增 getScopeDeptIDs 辅助函数(handler/employee_handler.go)
- Router 为 GET /employees/:id、GET /depts/:id、DELETE /employees/:id、POST /attendance/summaries/generate、POST /leaves 加 RequireDeptAccess 中间件
- 新增 service 层 scope 测试(employee/department/attendance/leave out-of-scope 场景)
- api_test.http 补充 scope 场景测试(zhangsan 访问人事部/财务部资源 → 403)
v0.16.0 - 2026-04-30
新增
- handler 层 500 错误现在会 log.Printf 打印详情,响应 message 包含具体错误信息(internalError 辅助函数)
- seed 全面重写,覆盖所有业务实体和流程示例
修复
- ClockIn 未匹配的 GORM ErrRecordNotFound 被裸抛为 500 的问题
v0.15.0 - 2026-04-29
新增
- POST /users 接口,admin 可直接创建用户(指定角色或默认 staff)
v0.14.0 - 2026-04-29
新增
- User 模型新增 CreatedAt、UpdatedAt 字段
- GET /users 支持分页+搜索+排序(keyword、sort_by、sort_desc、page、page_size)
- DELETE /users/:id 删除用户(不能删除自己)
改动
- UserRepository.List 签名变更:
List() ([]models.User, error)→List(query ListQuery) (*ListResult, error) - UserService.List 签名变更:同步适配新 ListQuery/ListResult
- UserService 新增 Delete(id, currentUserID) 方法
v0.13.0 - 2026-04-29
新增
- Employee 模型新增 UserID(关联 User ID,唯一索引)和 User 关联对象
- Department 模型新增 LeaderID(部门负责人 Employee ID,索引)和 Leader 关联对象
- DeptTreeNode 新增 LeaderID、LeaderName 字段
- JWT Claims 新增 Role(admin/manager/staff)和 EmployeeID 字段
- RBAC 权限控制:RequireAdminOnly、RequireRole、RequireDeptAccess 中间件
- GET /employees/me 获取当前登录用户的员工档案
- 创建员工接口支持可选 user_id 字段(关联登录账号)
- 创建/更新部门接口支持可选 leader_id 字段(指定部门负责人)
- 员工列表按角色返回不同范围:admin 全部、manager 本部门+子部门、staff 403
- 打卡/请假 staff 只能操作自己,后端强制使用 JWT 中的 employee_id
- 请假审批 manager 只有本部门范围权限
- 薪资管理全部改为 admin only
- 用户管理全部改为 admin only
- 审计日志改为 admin only
改动
- RequireRole 签名变更:不再需要 userRepo 参数,从 JWT Claims 直接读取 role
- 路由注册:RequireRole/RequireAdminOnly/RequireDeptAccess 替换旧的 RequireRole(userRepo, ...)
- POST /auth/login 返回的 JWT payload 新增 role、employee_id 字段
- PUT /users/:id/password 归入 /users 组(需 admin 角色),非 admin 暂不可修改密码
- AuthService 构造函数新增 empRepo 参数(用于登录时查找关联员工)
v0.12.0 - 2026-04-29
新增
- AuditLog 操作日志模型(操作人、操作类型、实体类型/ID、变更内容 jsonb、IP 地址)
- 所有写操作自动记录审计日志(handler 层 logAudit 辅助函数)
- GET /audit-logs 审计日志查询接口(支持按操作人/实体类型/时间范围筛选,需 admin 角色)
- InjectAuditLog 中间件:通过 gin.Context 注入 AuditLogService
- AuditLogRepository、AuditLogService、AuditLogHandler 完整实现
- handler/service/repository 三层测试用例
v0.11.0 - 2026-04-28
新增
- Department 模型新增 Description(描述,最长 500)和 ParentID(父部门 ID)字段
- Department 自引用层级树:通过 parent_id 邻接表 + 内存拼树
- DeptTreeNode 树形响应结构
- GET /depts/tree 部门树查询接口
- DepartmentRepository 新增 GetByParentID、HasChildren 方法
- 创建部门支持 description 和 parent_id 参数
- 更新部门时校验循环引用(不能设自己为父,不能形成环路)
- 删除部门时校验是否有子部门(有子部门不可删除)
- 删除部门时校验是否有员工(有员工不可删除)
- ErrDeptHasChildren、ErrDeptHasEmployees、ErrDeptCircularRef sentinel error
- 种子数据添加二级部门层级关系
v0.10.0 - 2026-04-28
新增
- AttendanceRecord 打卡记录模型(上班/下班打卡,每日一条)
- AttendanceSummary 考勤月度统计模型(正常/迟到/早退/缺勤天数)
- LeaveRequest 请假申请模型(年假/病假/事假,单级审批)
- Employee 模型新增 WorkStartTime/WorkEndTime 字段(默认 09:00/18:00)
- 上班打卡接口:POST /attendance/clock-in
- 下班打卡接口:PUT /attendance/clock-out
- 打卡记录查询:GET /attendance/records(支持日期范围筛选)
- 考勤统计生成:POST /attendance/summaries/generate
- 考勤统计查询:GET /attendance/summaries
- 提交请假:POST /leaves
- 请假审批:PUT /leaves/:id/approve、PUT /leaves/:id/reject
- 请假查询:GET /leaves(支持状态筛选)
v0.9.0 - 2026-04-28
新增
- SalaryRecord 状态生命周期:draft → pending → approved → paid,加 rejected 驳回
- SalaryRecord 添加 StructureID、Status、ReviewedBy/At、PaidBy/At 字段
- PUT /salaries/records/:id/submit 提交审核
- PUT /salaries/records/:id/approve 审核通过
- PUT /salaries/records/:id/reject 审核驳回
- PUT /salaries/records/:id/pay 确认发放(仅 admin)
- PUT /salaries/records/:id 修改薪资记录(仅 draft/rejected 状态)
- POST /salaries/records/batch 批量生成月度薪资记录(支持按员工/部门/全员)
- GET /salaries/records 支持按 status 筛选
- 修改绩效系数时自动重算 actual_salary
v0.8.0 - 2026-04-28
新增
- SalaryStructure 薪资结构模型(基本工资/岗位津贴/绩效系数)
- SalaryRecord 月度薪资记录模型
- 薪资结构 CRUD 接口:POST/GET/PUT/DELETE /salaries/structures
- 月度薪资计算与记录:POST /salaries/records
- 薪资历史查询:GET /salaries/records(支持按员工/年/月筛选)
- 薪资计算公式:(基本工资 + 岗位津贴) × 绩效系数
- 权限控制:查看需认证,创建/编辑需 admin/manager,删除需 admin
v0.7.0 - 2026-04-28
新增
- Role 模型 + 种子数据(admin/manager/staff)
- User 模型添加 Status(active/disabled)和 Roles 多对多关联
- RBAC 中间件 RequireRole,按角色控制接口访问
- JWT Claims 添加 UserID 字段
- GET /roles 角色列表接口
- GET /users 用户列表接口
- GET /users/:id 用户详情接口
- PUT /users/:id/status 启用/禁用用户接口
- PUT /users/:id/roles 分配角色接口
- PUT /users/:id/password 修改/重置密码接口
- 注册支持 role_ids 参数,首个用户自动 admin
- 被禁用用户无法登录
v0.6.0 - 2026-04-28
新增
- Employee 模型添加 updated_at、created_by、updated_by 字段
- Department 模型添加 created_at、updated_at、created_by、updated_by 字段
- 创建时自动填充 created_by 和 updated_by(从 JWT 提取当前用户名)
- 更新时自动填充 updated_by
v0.5.0 - 2026-04-28
新增
- GET /auth/me 获取当前登录用户信息接口
- UserRepository.GetByID 按 ID 查询用户
- AuthService.GetCurrentUser 通过用户名获取当前用户
- ErrUserNotFound sentinel error
- handler/service 测试用例
v0.4.0 - 2026-04-28
新增
- Redis 集成:config/redis.go,InitRedis 连接重试(30 次,2 秒间隔)
- 员工列表 Redis 缓存:按查询参数生成缓存 key,过期时间 10 分钟
- 缓存一致性:员工创建/更新/删除后自动清除所有员工缓存
- JWT Token 存入 Redis(auth:token:{jti}),过期时间与 JWT 相同(24 小时)
- JWT 中间件校验 Redis 中 Token 存在性,注销后 Token 立即失效
- POST /auth/logout 注销接口:从 Redis 删除 Token
- docker-compose.yml 添加 redis:7-alpine 服务
- 环境变量:REDIS_HOST、REDIS_PORT、REDIS_PASSWORD
- miniredis 测试:auth service、employee service 缓存测试
- config/redis_test.go:Redis 配置测试
改动
- EmployeeService 构造函数新增 *redis.Client 参数
- 缓存逻辑从 handler 层下沉到 service 层(handler 不再直接操作 Redis)
- auth_service_test.go 使用 miniredis 替代手动 mock Redis
- handler/employee_handler_test.go 移除 Redis 依赖
- repository/employee_repo_test.go 修复 interface{} 类型断言
v0.3.0 - 2026-04-28
新增
- Employee 添加 phone(手机号)、id_number(身份证号)字段
- 员工列表接口改为分页查询:支持 keyword 模糊搜索、sort_by 排序、page/page_size 分页
- 部门重名检测(创建/更新时校验)
- 部门 CRUD 补全:GetByID、Update、Delete
- 员工 GetByID 接口
- PRE_COMMIT.md 提交前检查清单
- CLAUDE.md 项目协作指南
改动
- GET /employees 从返回数组改为返回分页结构(data/total/page/page_size/total_pages)
v0.2.0 - 2026-04-28
改动
- 数据库从 SQLite 切换到 PostgreSQL 16
- 引入分层架构:handler → service → repository
- handler/service/repository 各层定义接口,支持 mock 测试
- 去掉全局 DB 变量,改为依赖注入
- 新增 service 层,业务逻辑从 handler 下沉
- 新增 CORS 中间件
- 配置改用环境变量,支持 DB_HOST/PORT/USER/PASSWORD/NAME/SSLMode
新增
- Dockerfile(多阶段构建)
- docker-compose.yml(app + postgres)
- GitHub Actions CI/CD(lint + test + build image)
- 项目文档(mdbook)
移除
- SQLite 依赖
- 全局变量 config.DB
- config/testdb.go
v0.1.0 - 2026-04-28
初始功能
- 部门 CRUD:创建、查询列表
- 员工 CRUD:创建、查询列表、更新、删除
- 员工邮箱唯一性校验
- 员工所属部门存在性校验
- SQLite 数据库
- 种子数据工具(tools/seed.go)