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)