码巢引擎2026年开发文档
00-开发规范
后端规范
README
后端开发手册
前端规范
README
TypeScript最佳实践
前端布局规范
前端页面模板
前端颜色与组件规范
核心规范
组件配置手册
问题排查指南
页面模板
最佳实践
README
bp-20260223-m7ps
图片上传优化总结
BUG自动记录系统使用指南
README
TYPE_SAFETY_GUIDE
常见BUG知识库
常见BUG知识库
开发前检查清单
开发安全规范
开发规范-完整版-含FutureBirdAadminAi部署
数据模型字典
文档分类规范
文档标准化规范
文档模板-基础版
文档模板-技术版
类型安全快速参考卡
类型安全规范体系
规范更新指南
过期文档清理机制
错误处理规范
错误预防指南
常见BUG知识库
常见BUG知识库
01-快速开始
Gitee快速开始
README
协作快速开始
快速开始
质量保证快速开始
02-部署指南
Docker更新指南
Docker部署
FutureBirdAadminAi部署指南
FutureBirdAadminAi部署问题分析
README
发布指南
宝塔Docker部署教程
宝塔PM2部署教程
宝塔图形化部署教程
快速发布指南
数据库和依赖变更处理指南
构建和发布
构建标准
构建检查清单
生产部署快速开始
生产部署方案
生产部署标准
生产部署检查清单
程序备份性能
自动修复和发布指南
自动化发布命令使用指南
部署快速开始
部署指南
项目更新部署指南
03-开发指南
Git凭据配置
Git推送规则
Git自动配置
README
全局样式
协作设置
定时任务
开发指南
开发流程
开发环境标准
技术改进
贡献指南
项目目录树
项目目录结构
04-API文档
API接口文档
README
hr-api
企业API
05-数据库
DATABASE_SCHEMA
README
分区指南
数据库字典
数据持久化
数据模型统一
数据迁移
06-架构设计
RBAC-PERMISSIONS
README
SaaS客户引导流程设计
companyId统一规范
employee-permission-system-design
enterprise-data-linkage
仓库实现总结
仓库模式
企业管理端员工权限系统分析
前端架构
前端重构总结
员工权限系统评估报告
员工管理菜单重构方案
权限系统混乱问题分析
架构优化计划
架构使用指南
架构结构
架构结构
状态管理
用户身份管理体系
系统架构
面试管理模块重构规划
项目技术栈
07-测试质量
README
测试修复标准
测试报告
质量保证系统
08-版本管理
CHANGELOG
README
VERSION_RULES
09-配置指南
README
SMTP配置指南
主题切换指南
渠道配置指南
环境变量指南
环境隔离
12-项目记忆
README
知识库导入指南
记忆系统指南
13-迁移指南
README
备份迁移指南
管理员迁移指南
迁移快速开始
17-其他
README
压缩摘要
18-开放平台
01-架构设计
02-API接口设计
03-安全机制
04-前端设计
05-数据库设计
开放平台API指南
开放平台API说明
19-智能进化
AI执行规则
AI进化机制
README
自动化实现总览
黄金规则
40-操作教程
README
微信公众号域名配置指南
微信本地开发调试指南
44-技能文件
alipay-payment-integration
references
checklist
SKILL
audio
python
README
typescript
README
SKILL
database
python
README
typescript
README
SKILL
design-style-thinking
SKILL
doctor
references
sql-patterns
SKILL
document-generation
python
README
SKILL
email
SKILL
embedding
python
README
typescript
README
SKILL
expo-advanced
references
audio-record-play
file-upload
masonry-layout
save-to-gallery
top-tab-navigation
SKILL
feishu-base
SKILL
feishu-message
SKILL
fetch-url
python
README
typescript
README
SKILL
frontend-design
LICENSE
SKILL
FutureBird-coding-web-performance-best-practice
SKILL
general-dev-preview
references
web-preview
SKILL
image-generation
python
README
typescript
README
SKILL
knowledge
references
python
README
typescript
README
cli
SKILL
llm
python
README
typescript
README
SKILL
miniapp-upload-asr
SKILL
pptx-generation
python
README
SKILL
project-memory-loader
scripts
project_memory_loader
SKILL
repair
scripts
merge-commit-map
SKILL
shadcn-web-base-theme
assets
colors
amber
artistic-green
bento-blue
blue
cyan
emerald
fuchsia
gray
green
indigo
lime
low-pink
neutral
orange
purple
red
retro-brown
rose
sky
supbase-green
teal
tech-purple
vintage-grey
violet
yellow
fonts
business
classic
playful
radius
2xl
2xs
lg
md
none
sm
xl
xs
shadow
artistic
bento
cool
retro
superbase
tech
tool
vintage
default
references
colors
fonts
quick
radius
shadows
scripts
theme
SKILL
package
skill-creator-coze
scripts
init_skill
quick_validate
SKILL
storage
python
README
typescript
README
SKILL
supabase
assets
supabase-client
supabase-client
references
_future
asset-supabase-browser
asset-supabase-config-inject
asset-supabase-config-route
python-auth
python-realtime
python-storage
typescript-auth
typescript-realtime
typescript-storage
typescript-supabase-browser
typescript-supabase-config-inject
typescript-supabase-config-route
python
README
database
edge-functions
orm-model-guide
supabase_client
typescript
README
database
drizzle-schema-guide
edge-functions
supabase-client
cli
rls
SKILL
supabase-auth
references
typescript
supabase-browser
supabase-config-inject
supabase-config-route
auth-config
verify-session
SKILL
ui-design-ref
reference
3D黏土风
克莱因蓝高定风
暗黑科技风
杂志风
极光柔和
柔和卡片
玻璃拟态
纯白极简风
自然有机
SKILL
ui-ux-pro-max
scripts
core
design_system
search
SKILL
vercel-composition-patterns
rules
architecture-avoid-boolean-props
architecture-compound-components
patterns-children-over-render-props
patterns-explicit-variants
react19-no-forwardref
state-context-interface
state-decouple-implementation
state-lift-state
AGENTS
SKILL
vercel-react-best-practices
rules
advanced-event-handler-refs
advanced-init-once
advanced-use-latest
async-api-routes
async-defer-await
async-dependencies
async-parallel
async-suspense-boundaries
bundle-barrel-imports
bundle-conditional
bundle-defer-third-party
bundle-dynamic-imports
bundle-preload
client-event-listeners
client-localstorage-schema
client-passive-event-listeners
client-swr-dedup
js-batch-dom-css
js-cache-function-results
js-cache-property-access
js-cache-storage
js-combine-iterations
js-early-exit
js-hoist-regexp
js-index-maps
js-length-check-first
js-min-max-loop
js-set-map-lookups
js-tosorted-immutable
rendering-activity
rendering-animate-svg-wrapper
rendering-conditional-render
rendering-content-visibility
rendering-hoist-jsx
rendering-hydration-no-flicker
rendering-hydration-suppress-warning
rendering-svg-precision
rendering-usetransition-loading
rerender-defer-reads
rerender-dependencies
rerender-derived-state-no-effect
rerender-derived-state
rerender-functional-setstate
rerender-lazy-state-init
rerender-memo-with-default-value
rerender-memo
rerender-move-effect-to-event
rerender-simple-expression-in-memo
rerender-transitions
rerender-use-ref-transient-values
server-auth-actions
server-cache-lru
server-cache-react
server-dedup-props
server-parallel-fetching
server-serialization
AGENTS
SKILL
video-edit
python
README
typescript
README
SKILL
video-generation
python
README
typescript
README
SKILL
volcano-ark
SKILL
web-design-guidelines
SKILL
web-search
python
README
typescript
README
SKILL
webrtc-best-practice
SKILL
websocket-guide
references
nextjs
nodejs
SKILL
wechat-bot
SKILL
wechat-official-account
SKILL
README
README
未来鸟:企业数字化转型奔腾的力量!
-
+
首页
employee-permission-system-design
# 企业管理后台 - 员工权限管理系统设计文档 > **文档版本**:V4.0 > **更新日期**:2024年3月 > **文档状态**:待确认 --- ## 目录 - [一、系统概述](#一系统概述) - [二、系统定位与边界](#二系统定位与边界) - [三、角色与用户体系](#三角色与用户体系) - [四、动态权限架构设计](#四动态权限架构设计) - [五、账号创建与认证流程](#五账号创建与认证流程) - [六、操作日志系统](#六操作日志系统) - [七、页面功能设计](#七页面功能设计) - [八、邮件通知系统](#八邮件通知系统) - [九、数据库设计](#九数据库设计) - [十、新增功能权限集成流程](#十新增功能权限集成流程) - [十一、安全增强措施](#十一安全增强措施) - [十二、实施计划](#十二实施计划) --- ## 一、系统概述 ### 1.1 背景 企业管理数字化中台需要一套完善的权限管理系统,用于控制企业内部人员对**企业管理后台**的访问权限。本系统不涉及员工端权限,员工端用户直接通过员工端查看自己的数据(如工资条、考勤等),无需在此系统管理。 ### 1.2 系统目标 ``` ┌─────────────────────────────────────────────────────────────┐ │ 系统核心目标 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 精细化权限控制:菜单级、Tab级、操作级的权限粒度 │ │ │ │ 2. 动态权限管理:随功能开发自动更新权限配置,无需硬编码 │ │ │ │ 3. 安全审计追踪:完整记录所有操作行为,支持追溯定责 │ │ │ │ 4. 便捷账号管理:快速创建账号,自动关联员工信息 │ │ │ │ 5. 防范安全风险:实名认证、登录保护、异常预警 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 二、系统定位与边界 ### 2.1 系统定位 | 维度 | 说明 | |------|------| | **适用范围** | 企业管理后台(/tenant、/admin、/license-system等路由) | | **目标用户** | 企业内部管理人员、HR、财务、IT管理员等需要后台操作权限的员工 | | **核心功能** | 角色管理、账号管理、权限分配、操作日志 | ### 2.2 系统边界 ``` ┌─────────────────────────────────────────────────────────────┐ │ 系统边界说明 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ✅ 本系统管理范围: │ │ ├─ 企业管理后台的访问权限 │ │ ├─ 后台账号的创建、分配、禁用 │ │ ├─ 后台功能模块的权限配置 │ │ └─ 后台所有操作的日志记录 │ │ │ │ ❌ 本系统不管理: │ │ ├─ 员工端用户权限(员工端有独立的访问逻辑) │ │ ├─ 员工查看自己工资条的权限(员工端默认可查看自己的数据) │ │ ├─ 员工查看自己考勤的权限(员工端默认可查看自己的数据) │ │ └─ 员工端的任何功能权限 │ │ │ │ 📌 员工端说明: │ │ ├─ 员工通过手机号/工号登录员工端 │ │ ├─ 员工端只能查看自己的数据(工资条、考勤、个人信息等) │ │ └─ 员工端无需配置权限,系统自动过滤为"仅本人数据" │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 2.3 用户类型对比 | 用户类型 | 访问入口 | 权限特点 | 是否需要本系统管理 | |----------|----------|----------|-------------------| | **后台管理员** | 企业管理后台 | 可访问授权的后台功能模块 | ✅ 是 | | **HR人员** | 企业管理后台 | 人事管理相关功能 | ✅ 是 | | **财务人员** | 企业管理后台 | 薪酬管理相关功能 | ✅ 是 | | **普通员工** | 员工端/小程序 | 仅查看自己的数据 | ❌ 否 | --- ## 三、角色与用户体系 ### 3.1 角色层级设计 ``` ┌─────────────────────────────────────────────────────────────┐ │ 角色层级体系 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Level 1: 超级管理员(企业创建人) │ │ ├── 拥有所有权限,不可被删除/降级 │ │ ├── 可以管理所有其他管理员的权限 │ │ └── 每个企业仅1人 │ │ │ │ Level 2: 系统管理员 │ │ ├── 可管理员工权限、查看操作日志 │ │ ├── 可以创建/编辑/禁用普通管理员账号 │ │ ├── 不可操作超级管理员 │ │ └── 通常由超级管理员指定1-3人 │ │ │ │ Level 3: 业务管理员(按模块分配) │ │ ├── 人事管理员:人事管理、组织架构模块 │ │ ├── 薪酬管理员:薪酬管理模块 │ │ ├── 招聘管理员:招聘管理模块 │ │ ├── 可组合多个模块权限 │ │ └── 不可进入系统设置 │ │ │ │ Level 4: 普通操作员 │ │ ├── 只能访问被授权的特定功能 │ │ ├── 如:只能查看员工列表,不能导出/删除 │ │ └── 如:只能处理入职审批,不能查看薪酬 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 3.2 预设角色模板 | 角色名称 | 角色代码 | 权限范围 | 说明 | |----------|----------|----------|------| | 超级管理员 | super_admin | 全部权限 | 企业创建人,系统内置 | | 系统管理员 | system_admin | 系统设置+操作日志 | 管理后台账号 | | 人事管理员 | hr_admin | 人事管理+组织架构 | HR负责人 | | 人事专员 | hr_staff | 人事管理(部分) | HR操作员 | | 薪酬管理员 | salary_admin | 薪酬管理 | 财务负责人 | | 薪酬专员 | salary_staff | 工资条查看+导出 | 财务操作员 | | 招聘管理员 | recruitment_admin | 招聘管理 | 招聘负责人 | | 数据分析员 | data_analyst | 各模块查看+导出 | 只读权限 | ### 3.3 角色权限矩阵 ``` ┌──────────────┬─────────────────────────────────────────────┐ │ 角色 │ 权限范围 │ ├──────────────┼─────────────────────────────────────────────┤ │ 超级管理员 │ ████████████████████████████████████ 100% │ │ 系统管理员 │ ████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 20% │ │ 人事管理员 │ ████████████████░░░░░░░░░░░░░░░░░░░░ 40% │ │ 人事专员 │ ████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 20% │ │ 薪酬管理员 │ ████████████░░░░░░░░░░░░░░░░░░░░░░░░ 30% │ │ 薪酬专员 │ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 10% │ │ 招聘管理员 │ ████████████░░░░░░░░░░░░░░░░░░░░░░░░ 30% │ │ 数据分析员 │ ████████████████████░░░░░░░░░░░░░░░░ 50% │ │ │ (查看+导出权限,无创建/编辑/删除权限) │ └──────────────┴─────────────────────────────────────────────┘ ``` --- ## 四、动态权限架构设计 ### 4.1 设计理念 ``` ┌─────────────────────────────────────────────────────────────┐ │ 权限系统设计原则 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ❌ 硬编码权限列表 │ │ └─ 维护困难,新增功能需改代码 │ │ │ │ ✅ 权限注册机制 │ │ ├─ 每个功能模块自行注册权限点 │ │ ├─ 权限树动态生成 │ │ └─ 新增功能只需添加权限定义文件 │ │ │ │ ✅ 权限与功能联动 │ │ ├─ 路由守卫自动校验访问权限 │ │ ├─ Tab根据权限自动过滤 │ │ └─ 按钮根据权限自动显示/隐藏 │ │ │ │ ✅ 权限版本化管理 │ │ ├─ 记录权限引入版本 │ │ ├─ 支持权限废弃和迁移 │ │ └─ 向下兼容处理 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 4.2 权限层级模型 ``` ┌─────────────────────────────────────────────────────────────┐ │ 权限层级结构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 第1层:模块(Module) │ │ └─ 如:人事管理、薪酬管理、组织架构 │ │ │ │ 第2层:菜单(Menu) │ │ └─ 如:员工列表、入职管理、工资表管理 │ │ │ │ 第3层:页面/Tab(Page/Tab) │ │ └─ 如:在职员工Tab、离职员工Tab、待入职Tab │ │ │ │ 第4层:操作(Action) │ │ └─ 如:添加、编辑、删除、导出、导入、审批 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 4.3 权限层级示例 ``` 人事管理(模块) ├── 员工列表(菜单) │ ├── 在职员工(Tab) │ │ ├── 查看员工(操作) │ │ ├── 添加员工(操作) │ │ ├── 编辑员工(操作) │ │ ├── 批量编辑(操作) │ │ ├── 删除员工(操作) │ │ ├── 批量删除(操作) │ │ ├── 导入员工(操作) │ │ ├── 导出员工(操作) │ │ ├── 标签管理(操作) │ │ ├── 列配置(操作) │ │ ├── 合同管理(操作) │ │ └── 查看工资条(操作) │ ├── 离职员工(Tab) │ │ ├── 查看(操作) │ │ └── 导出(操作) │ └── 待入职员工(Tab) │ ├── 查看(操作) │ └── 导出(操作) ├── 入职管理(菜单) │ ├── 待入职(Tab) │ │ ├── 新建入职(操作) │ │ ├── 审批入职(操作) │ │ ├── 发送通知(操作) │ │ └── 导出(操作) │ ├── 入职中(Tab) │ └── 已入职(Tab) ├── 试用期管理(菜单) ├── 转正管理(菜单) ├── 调动管理(菜单) ├── 离职管理(菜单) └── 员工关怀(菜单) 薪酬管理(模块) ├── 工资表管理(菜单) │ ├── 待审核(Tab) │ │ ├── 查看(操作) │ │ ├── 审核(操作) │ │ └── 导出(操作) │ ├── 已审核(Tab) │ └── 已发送(Tab) ├── 工资条查询(菜单) └── 薪酬设置(菜单) 组织架构(模块) ├── 部门管理(菜单) │ ├── 查看部门(操作) │ ├── 添加部门(操作) │ ├── 编辑部门(操作) │ └── 删除部门(操作) ├── 岗位管理(菜单) └── 编制管理(菜单) 企业中心(模块) ├── 企业信息(菜单) ├── 员工权限(菜单)← 本功能 │ ├── 角色管理(Tab) │ ├── 员工账号(Tab) │ └── 操作日志(Tab) └── 集成管理(菜单) ``` ### 4.4 权限点定义规范 ```typescript interface PermissionDefinition { // ========== 唯一标识 ========== code: string; // 权限码:模块.菜单.页面.操作 // 示例:employee.list.current.create // ========== 显示信息 ========== name: string; // 显示名称:添加员工 description?: string; // 描述说明 // ========== 层级关系 ========== level: 'module' | 'menu' | 'page' | 'action'; parentCode?: string; // 父级权限码 // ========== 关联信息 ========== route?: string; // 关联路由(菜单/页面级) tabKey?: string; // 关联Tab键(页面级) actionType?: 'view' | 'create' | 'edit' | 'delete' | 'export' | 'import' | 'approve' | 'send' | 'config' | 'manage'; // ========== 权限特性 ========== isDefault?: boolean; // 默认拥有(如查看权限) isSystem?: boolean; // 系统权限(不可删除) // ========== 元数据 ========== icon?: string; // 图标 sortOrder: number; // 排序 // ========== 版本信息 ========== sinceVersion: string; // 引入版本 deprecated?: boolean; // 是否废弃 replacedBy?: string; // 替换为新权限码 } ``` ### 4.5 权限码命名规范 ``` 格式:<module>.<menu>.<page>.<action> 示例: ├── employee # 模块:人事管理 │ ├── employee.list # 菜单:员工列表 │ │ ├── employee.list.current # 页面:在职员工Tab │ │ │ ├── employee.list.current.view # 操作:查看 │ │ │ ├── employee.list.current.create # 操作:添加 │ │ │ ├── employee.list.current.edit # 操作:编辑 │ │ │ ├── employee.list.current.export # 操作:导出 │ │ │ └── ... │ │ └── employee.list.resigned # 页面:离职员工Tab │ └── employee.onboarding # 菜单:入职管理 │ └── ... └── salary # 模块:薪酬管理 └── ... ``` --- ## 五、账号创建与认证流程 ### 5.1 创建后台账号 #### 输入字段 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | 姓名 | 文本 | ✅ | 真实姓名 | | 手机号 | 文本 | ✅ | 11位手机号,作为登录账号 | | 身份证号 | 文本 | ✅ | 用于实名验证 | | 角色 | 下拉 | ✅ | 选择预设角色 | | 邮箱 | 文本 | ❌ | 用于接收账号通知 | | 备注 | 文本 | ❌ | 可选备注信息 | #### 创建后自动处理 ``` ┌─────────────────────────────────────────────────────────────┐ │ 账号创建自动处理流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 生成初始密码 │ │ ├─ 12位随机密码 │ │ ├─ 包含:大写+小写+数字+特殊字符 │ │ └─ 加密存储,仅首次创建时显示 │ │ │ │ 2. 匹配员工信息 │ │ ├─ 查询员工表,匹配 姓名+身份证号 │ │ ├─ 匹配成功 → 自动补全: │ │ │ ├─ 工号(employeeNo) │ │ │ ├─ 部门(department) │ │ │ ├─ 岗位(position) │ │ │ └─ 入职日期(hireDate) │ │ └─ 未匹配 → 仅保存基本信息,后续可手动关联 │ │ │ │ 3. 设置初始状态 │ │ ├─ status: 'pending'(待激活) │ │ ├─ mustChangePassword: true(首次登录必须修改密码) │ │ └─ idCardVerified: false(待首次登录验证) │ │ │ │ 4. 显示账号信息(管理员手动通知) │ │ ├─ 弹窗展示完整账号信息 │ │ ├─ 提供一键复制功能 │ │ ├─ 可选发送邮件通知 │ │ └─ 管理员自行发送给具体人员 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` #### 通知方式说明 ``` ┌─────────────────────────────────────────────────────────────┐ │ 通知方式说明 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 📋 一键复制(默认) │ │ ├─ 创建成功后弹窗显示完整账号信息 │ │ ├─ 提供一键复制按钮,方便发送 │ │ └─ 管理员通过微信/邮件/电话等方式通知 │ │ │ │ 📧 邮件通知(可选) │ │ ├─ 填写了邮箱时可选择发送邮件通知 │ │ ├─ 使用系统配置的SMTP服务发送 │ │ │ ├─ 优先使用企业自己配置的SMTP │ │ │ └─ 企业未配置则使用平台默认SMTP │ │ └─ 邮件内容:账号+初始密码+登录指引 │ │ │ │ 📱 短信通知(预留,暂不开放) │ │ ├─ 功能已预留接口 │ │ ├─ 因短信模板审核严格,暂不开放 │ │ └─ 后续条件允许时可快速接入 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 5.2 首次登录流程 ``` ┌─────────────────────────────────────────────────────────────┐ │ 首次登录流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Step 1: 输入账号密码 │ │ └─ 手机号 + 初始密码 │ │ ↓ │ │ Step 2: 【强制】手机号验证 │ │ ├─ 发送短信验证码 │ │ ├─ 用户输入验证码 │ │ ├─ 验证手机号归属人 │ │ └─ 验证通过 → idCardVerified = true │ │ ↓ │ │ Step 3: 【强制】修改密码 │ │ ├─ 输入新密码 │ │ ├─ 密码强度校验: │ │ │ ├─ 至少8位 │ │ │ ├─ 包含大写字母 │ │ │ ├─ 包含小写字母 │ │ │ ├─ 包含数字 │ │ │ └─ 不能与初始密码相同 │ │ └─ 修改成功 → mustChangePassword = false │ │ ↓ │ │ Step 4: 【可选】绑定设备 │ │ ├─ 绑定微信(用于扫码登录) │ │ └─ 绑定企业微信 │ │ ↓ │ │ Step 5: 进入系统 │ │ ├─ status = 'active' │ │ ├─ firstLoginAt = 当前时间 │ │ └─ 显示权限说明页 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 5.3 后续登录安全策略 | 场景 | 处理方式 | 日志记录 | |------|----------|----------| | 正常登录 | 直接进入 | ✅ 记录 | | 新设备登录 | 短信验证码确认 | ✅ 记录 | | 异常IP登录 | 记录日志 + 可选提醒 | ✅ 记录 + 高优先级 | | 连续失败5次 | 账号锁定15分钟 | ✅ 记录 | | 密码过期(90天) | 强制修改密码 | ✅ 记录 | | 被禁用账号登录 | 拒绝登录 + 提示 | ✅ 记录 | ### 5.4 登录入口区分 ``` ┌─────────────────────────────────────────────────────────────┐ │ 登录入口设计 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 企业管理后台登录 │ │ ├─ 入口:/admin/login 或 /tenant/login │ │ ├─ 用户:后台管理员、HR、财务等 │ │ ├─ 认证:手机号 + 密码 │ │ ├─ 权限:根据角色配置动态生成菜单 │ │ └─ 说明:本系统管理的用户 │ │ │ │ 员工端登录 │ │ ├─ 入口:/employee/login 或小程序 │ │ ├─ 用户:企业普通员工 │ │ ├─ 认证:手机号 + 验证码 │ │ ├─ 权限:仅查看自己的数据 │ │ └─ 说明:不在此系统管理 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 六、操作日志系统 ### 6.1 日志系统定位 ``` ┌─────────────────────────────────────────────────────────────┐ │ 操作日志核心价值 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 审计追溯 │ │ └─ 所有操作可追溯,明确责任归属 │ │ │ │ 2. 安全取证 │ │ └─ 账号泄露时提供证据,避免企业与平台纠纷 │ │ │ │ 3. 异常检测 │ │ └─ 识别异常操作行为,及时预警 │ │ │ │ 4. 合规要求 │ │ └─ 满足企业内控审计要求 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 6.2 日志记录内容 #### 基础信息 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | id | UUID | 日志唯一ID | `log_abc123` | | tenantId | string | 租户ID | `tenant_001` | | createdAt | timestamp | 操作时间 | `2024-03-15 14:30:25` | #### 操作人信息 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | operatorId | string | 操作人ID | `user_001` | | operatorName | string | 操作人姓名 | `张三` | | operatorPhone | string | 操作人手机号 | `138****1234` | | operatorRole | string | 操作时角色 | `人事管理员` | #### 操作信息 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | module | string | 操作模块 | `人事管理` | | moduleCode | string | 模块代码 | `employee` | | action | string | 操作类型 | `export` | | actionDesc | string | 操作描述 | `导出员工列表数据` | | targetId | string | 操作对象ID | `emp_001` | | targetName | string | 操作对象名称 | `员工列表` | #### 变更详情 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | beforeData | JSON | 变更前数据 | `{"name": "张三", "status": "active"}` | | afterData | JSON | 变更后数据 | `{"name": "张三", "status": "resigned"}` | | changeSummary | string | 变更摘要 | `状态从"在职"变更为"离职"` | #### 设备信息 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | ipAddress | string | IP地址 | `192.168.1.100` | | port | string | 端口号 | `54321` | | userAgent | string | 浏览器UA | `Mozilla/5.0...` | | deviceId | string | 设备指纹 | `device_fingerprint_hash` | | deviceName | string | 设备名称 | `Chrome on Windows 11` | | browserInfo | JSON | 浏览器详情 | `{"browser": "Chrome", "version": "122"}` | | osInfo | JSON | 操作系统详情 | `{"os": "Windows", "version": "11"}` | #### 位置信息 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | location | string | 地理位置 | `北京市朝阳区` | | country | string | 国家 | `中国` | | province | string | 省份 | `北京市` | | city | string | 城市 | `北京市` | | isp | string | 网络运营商 | `中国电信` | #### 日志级别 | 字段 | 类型 | 说明 | 取值 | |------|------|------|------| | severity | string | 日志级别 | `critical`/`high`/`normal`/`low` | #### 权限关联 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | permissionCode | string | 关联权限码 | `employee.list.current.export` | ### 6.3 需要记录的操作 #### 敏感操作(critical级别) | 操作 | 记录内容 | 特殊处理 | |------|----------|----------| | 登录成功 | IP、设备、位置 | 异常IP/设备告警 | | 登录失败 | IP、设备、原因 | 连续失败告警 | | 修改密码 | IP、设备 | 系统通知本人 | | 导出数据 | 导出条件、条数 | 大量导出告警 | | 删除数据 | 删除内容详情 | 不可恢复提示 | | 批量操作 | 操作范围、数量 | 二次确认 | | 权限变更 | 变更前后对比 | 通知被变更人 | | 账号创建/禁用 | 操作详情 | 通知相关人员 | #### 重要操作(high级别) | 操作 | 记录内容 | |------|----------| | 审批操作 | 审批结果、意见 | | 发送通知 | 发送内容、接收人 | | 配置修改 | 修改前后对比 | | 数据导入 | 导入条数、失败数 | #### 普通操作(normal级别) | 操作 | 记录内容 | |------|----------| | 新增数据 | 新增内容 | | 编辑数据 | 变更前后对比 | | 查看详情 | 查看对象 | #### 访问操作(low级别) | 操作 | 记录内容 | |------|----------| | 列表查询 | 查询条件 | | 页面访问 | 访问路由 | ### 6.4 日志存储策略 ``` ┌─────────────────────────────────────────────────────────────┐ │ 日志存储策略 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 存储方式:按月分区表 │ │ ├─ operation_logs_2024_01 │ │ ├─ operation_logs_2024_02 │ │ └─ ... │ │ │ │ 保留期限: │ │ ├─ critical级别:永久保留 │ │ ├─ high级别:3年 │ │ ├─ normal级别:2年 │ │ └─ low级别:180天 │ │ │ │ 存储优化: │ │ ├─ 90天后压缩存储 │ │ ├─ 1年后归档到冷存储 │ │ └─ 建立索引:tenant_id, operator_id, created_at, module │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 6.5 日志访问规则 ``` ┌─────────────────────────────────────────────────────────────┐ │ 日志访问规则 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 谁可以查看: │ │ ├─ 超级管理员:可查看本企业所有日志 │ │ ├─ 系统管理员:可查看本企业所有日志 │ │ └─ 其他角色:不可查看日志 │ │ │ │ 操作限制: │ │ ├─ 企业不可删除日志 │ │ ├─ 企业不可修改日志 │ │ ├─ 企业可申请导出日志(需审批) │ │ └─ 平台可提供日志公证服务 │ │ │ │ 平台权限: │ │ ├─ 平台可查看所有企业的日志(需审计审批) │ │ ├─ 平台不可删除日志 │ │ └─ 平台配合司法取证 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 6.6 日志查询界面 ``` ┌─────────────────────────────────────────────────────────────┐ │ 操作日志 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 筛选条件: │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 时间范围: [2024-03-01] 至 [2024-03-15] [近7天 ▼] │ │ │ │ 操作人: [全部 ▼] 或 输入姓名/手机号搜索 │ │ │ │ 操作模块: [全部 ▼] │ │ │ │ 操作类型: [全部 ▼] │ │ │ │ 日志级别: [全部 ▼] [critical ▼] │ │ │ │ [重置] [查询] [导出] │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 统计概览: │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 今日操作: 1,234 次 │ 敏感操作: 56 次 │ │ │ │ 异常登录: 2 次 │ 数据导出: 12 次 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 日志列表: │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 时间 │ 操作人 │ 操作 │ 对象 │ IP │ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 03-15 │ 张三 │ 导出 │ 员工列表 │ 192.168.* │ │ │ │ 14:30:25 │ │ │ (100条) │ 北京电信 │ │ │ │ │ │ [查看详情] │ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 03-15 │ 李四 │ 登录成功 │ 系统 │ 192.168.* │ │ │ │ 14:28:10 │ │ │ │ 北京移动 │ │ │ │ │ │ 新设备登录 [查看详情] │ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 03-15 │ 张三 │ 编辑 │ 员工信息 │ 192.168.* │ │ │ │ 14:25:33 │ │ │ 王五 │ 北京电信 │ │ │ │ │ 部门: 技术部 → 产品部 [查看] │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ [上一页] 1 / 125 [下一页] │ │ │ │ ───────────────────────────────────────────────────────── │ │ 注:操作日志不可删除,敏感操作日志永久保留 │ │ 如需导出日志用于审计,请联系平台申请 │ │ ───────────────────────────────────────────────────────── │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 6.7 日志详情弹窗 ``` ┌─────────────────────────────────────────────────────────────┐ │ 操作日志详情 [×] │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【基本信息】 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 操作时间: 2024-03-15 14:30:25 │ │ │ │ 日志级别: 🔴 敏感操作 (critical) │ │ │ │ 操作模块: 人事管理 │ │ │ │ 操作类型: 导出 │ │ │ │ 操作描述: 导出员工列表数据 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 【操作人信息】 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 姓名: 张三 │ 手机号: 138****1234 │ │ │ │ 角色: 人事管理员 │ 权限码: employee.list.export │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 【操作内容】 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 导出条件: │ │ │ │ - 部门: 全部 │ │ │ │ - 状态: 在职 │ │ │ │ - 入职日期: 2024-01-01 ~ 2024-03-15 │ │ │ │ │ │ │ │ 导出结果: │ │ │ │ - 成功: 100 条 │ │ │ │ - 失败: 0 条 │ │ │ │ - 文件名: 员工列表_20240315.xlsx │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 【设备信息】 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ IP地址: 192.168.1.100 │ 端口: 54321 │ │ │ │ 地理位置: 北京市朝阳区 │ 运营商: 中国电信 │ │ │ │ 设备名称: Chrome on Windows 11 │ │ │ │ 设备指纹: device_abc123def456 │ │ │ │ 浏览器: Chrome 122.0.0 │ │ │ │ 操作系统: Windows 11 │ │ │ │ User-Agent: Mozilla/5.0 (Windows NT 10.0...) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ [关闭] [导出此记录] │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 七、页面功能设计 ### 7.1 整体布局 ``` 企业管理后台 └── 企业中心 └── 员工权限 ├── 角色管理 (Tab) ├── 员工账号 (Tab) └── 操作日志 (Tab) ``` ### 7.2 角色管理 Tab ``` ┌─────────────────────────────────────────────────────────────┐ │ 员工权限 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [角色管理] [员工账号] [操作日志] │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [+新建角色] [搜索角色名称...] │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 角色名称 │ 描述 │ 人数 │ 权限概览 │ 操作│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 超级管理员 │ 企业最高权限 │ 1 │ 全部权限 │ - │ │ │ │ 🔒系统内置 │ │ │ │ │ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 系统管理员 │ 后台权限管理 │ 2 │ 系统设置 │ 编辑│ │ │ │ 🔒系统内置 │ │ │ 操作日志 │ 复制│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 人事管理员 │ 人事模块权限 │ 3 │ 人事管理 │ 编辑│ │ │ │ │ │ │ 组织架构 │ 复制│ │ │ │ │ │ │ │ 删除│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 薪酬管理员 │ 薪酬模块权限 │ 1 │ 薪酬管理 │ 编辑│ │ │ │ │ │ │ │ 复制│ │ │ │ │ │ │ │ 删除│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 招聘管理员 │ 招聘模块权限 │ 2 │ 招聘管理 │ 编辑│ │ │ │ │ │ │ │ 复制│ │ │ │ │ │ │ │ 删除│ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 显示 5 条,共 5 条 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.3 新建/编辑角色弹窗 ``` ┌─────────────────────────────────────────────────────────────┐ │ 新建角色 [×] │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 角色名称: [________________] *必填 │ │ │ │ 角色描述: [________________] │ │ │ │ [________________] │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 权限配置 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ [人事管理] [招聘管理] [薪酬管理] [组织架构] [企业中心]│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ │ │ │ │ ☑ 人事管理 │ │ │ │ ├─ ☑ 员工列表 │ │ │ │ │ ├─ ☑ 在职员工 │ │ │ │ │ │ ├─ ☑ 查看 (默认) │ │ │ │ │ │ ├─ ☑ 添加 │ │ │ │ │ │ ├─ ☑ 编辑 │ │ │ │ │ │ ├─ ☐ 批量编辑 │ │ │ │ │ │ ├─ ☐ 删除 │ │ │ │ │ │ ├─ ☐ 批量删除 │ │ │ │ │ │ ├─ ☑ 导入 │ │ │ │ │ │ ├─ ☐ 导出 │ │ │ │ │ │ ├─ ☐ 标签管理 │ │ │ │ │ │ ├─ ☑ 列配置 (默认) │ │ │ │ │ │ └─ ☐ 查看工资条 │ │ │ │ │ ├─ ☑ 离职员工 │ │ │ │ │ └─ ☑ 待入职员工 │ │ │ │ ├─ ☑ 入职管理 │ │ │ │ ├─ ☑ 试用期管理 │ │ │ │ ├─ ☑ 转正管理 │ │ │ │ ├─ ☐ 调动管理 │ │ │ │ ├─ ☐ 离职管理 │ │ │ │ └─ ☐ 员工关怀 │ │ │ │ │ │ │ │ [全选当前模块] [清空当前模块] │ │ │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 已选择: 12 项权限 │ │ │ │ [取消] [保存] │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.4 员工账号 Tab ``` ┌─────────────────────────────────────────────────────────────┐ │ 员工权限 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [角色管理] [员工账号] [操作日志] │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [+添加账号] [批量导入] [搜索姓名/手机号] │ │ │ │ 筛选: 角色[全部▼] 状态[全部▼] 部门[全部▼] │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 姓名 │ 手机号 │ 角色 │ 关联员工 │ 状态 │ 操作│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 张三 │ 138****1234│ 人事管理员 │ EMP001 │ ●正常 │ 更多│ │ │ │ │ │ │ 技术部 │ 2小时前│ ├编辑│ │ │ │ │ │ │ │ │ ├重置│ │ │ │ │ │ │ │ │ │密码│ │ │ │ │ │ │ │ │ ├禁用│ │ │ │ │ │ │ │ │ └查看│ │ │ │ │ │ │ │ │ 日志│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 李四 │ 139****5678│ 薪酬管理员 │ EMP002 │ ●正常 │ 更多│ │ │ │ │ │ │ 财务部 │ 1天前 │ │ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 王五 │ 137****9012│ 人事专员 │ 未关联 │ ◐待激活│ 更多│ │ │ │ │ │ │ │ - │ ├激活│ │ │ │ │ │ │ │ │ ├编辑│ │ │ │ │ │ │ │ │ └删除│ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ 赵六 │ 136****3456│ 招聘管理员 │ EMP003 │ ○已禁用│ 更多│ │ │ │ │ │ │ 人事部 │ 3天前 │ ├启用│ │ │ │ │ │ │ │ │ └删除│ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 显示 4 条,共 12 条 [上一页] 1/3 [下一页] │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.5 添加账号弹窗 ``` ┌─────────────────────────────────────────────────────────────┐ │ 添加后台账号 [×] │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 姓名: [____________] *必填 │ │ │ │ │ │ │ │ 手机号: [_______________] *必填 │ │ │ │ 将作为登录账号使用 │ │ │ │ │ │ │ │ 身份证号: [______________________] *必填 │ │ │ │ 用于实名验证,将自动匹配员工信息 │ │ │ │ │ │ │ │ 角色: [请选择角色 ▼] *必填 │ │ │ │ ├─ 超级管理员 (不可选) │ │ │ │ ├─ 系统管理员 │ │ │ │ ├─ 人事管理员 │ │ │ │ ├─ 薪酬管理员 │ │ │ │ └─ ... │ │ │ │ │ │ │ │ 邮箱: [____________________] 选填 │ │ │ │ 用于接收账号通知 │ │ │ │ │ │ │ │ 备注: [________________________________] │ │ │ │ [________________________________] │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ ☐ 发送邮件通知账号信息 │ │ │ │ (需配置邮件服务,否则使用平台默认邮件服务) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ ℹ️ 创建后将自动: │ │ │ │ 1. 生成随机初始密码 │ │ │ │ 2. 匹配员工信息(如存在) │ │ │ │ 3. 显示账号信息供复制 │ │ │ │ │ │ │ │ ⚠️ 首次登录需要: │ │ │ │ 1. 验证手机号 │ │ │ │ 2. 修改初始密码 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ [取消] [创建账号] │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.6 账号创建成功弹窗 ``` ┌─────────────────────────────────────────────────────────────┐ │ ✓ 账号创建成功 [×] │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ 账号信息 │ │ │ │ │ │ │ │ │ │ │ │ 姓名:张三 │ │ │ │ │ │ 手机号:13812345678 │ │ │ │ │ │ 初始密码:Xk9#mP2$vL5@qR │ │ │ │ │ │ 角色:人事管理员 │ │ │ │ │ │ 登录地址:https://xxx.com/admin/login │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ [📋 一键复制账号信息] │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ 已匹配员工信息: │ │ │ │ ├─ 工号: EMP001 │ │ │ │ ├─ 部门: 技术部 │ │ │ │ └─ 岗位: 高级工程师 │ │ │ │ │ │ │ │ ─────────────────────────────────────────────────│ │ │ │ 邮件通知: ✅ 已发送至 zhangsan@example.com │ │ │ │ (使用企业SMTP配置 / 使用平台默认SMTP) │ │ │ │ 或:☐ 未发送,请手动通知 │ │ │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 📋 复制内容预览: │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ 【企业管理后台账号通知】 │ │ │ │ │ │ │ │ │ │ │ │ 您好,张三: │ │ │ │ │ │ │ │ │ │ │ │ 您已被分配企业管理后台账号,请使用以下信息登录:│ │ │ │ │ │ │ │ │ │ │ │ 登录地址:https://xxx.com/admin/login │ │ │ │ │ │ 登录账号:13812345678 │ │ │ │ │ │ 初始密码:Xk9#mP2$vL5@qR │ │ │ │ │ │ │ │ │ │ │ │ ⚠️ 首次登录需要: │ │ │ │ │ │ 1. 验证手机号 │ │ │ │ │ │ 2. 修改初始密码 │ │ │ │ │ │ │ │ │ │ │ │ 请妥善保管您的账号信息。 │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ⚠️ 请妥善保管初始密码,此密码仅显示一次 │ │ 建议通过微信、邮件等方式发送给相关人员 │ │ │ │ [继续添加] [完成] │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.7 复制内容格式 复制到剪贴板的内容格式如下: ``` 【企业管理后台账号通知】 您好,张三: 您已被分配企业管理后台账号,请使用以下信息登录: 登录地址:https://xxx.com/admin/login 登录账号:13812345678 初始密码:Xk9#mP2$vL5@qR ⚠️ 首次登录需要: 1. 验证手机号 2. 修改初始密码 请妥善保管您的账号信息。 ``` ### 7.8 通知方式对比 | 方式 | 状态 | 说明 | |------|------|------| | 一键复制 | ✅ 默认开启 | 复制格式化文本,方便发送 | | 邮件通知 | ⚙️ 可选 | 优先企业SMTP,无则用平台SMTP | | 短信通知 | ⏸️ 预留暂不开放 | 后续条件允许时可接入 | --- ## 八、邮件通知系统 ### 8.1 邮件服务架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ 邮件服务架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 邮件发送请求 │ │ │ │ │ ▼ │ │ ┌────────────────────────┐ │ │ │ 查询企业SMTP配置 │ │ │ │ GET /api/v1/email/ │ │ │ │ smtp-config │ │ │ └────────────────────────┘ │ │ │ │ │ ┌────────────┴────────────┐ │ │ │ │ │ │ ▼ ▼ │ │ ┌────────────────┐ ┌────────────────┐ │ │ │ 企业已配置SMTP │ │ 企业未配置SMTP │ │ │ │ │ │ │ │ │ │ 使用企业配置 │ │ 使用平台默认 │ │ │ │ 发送邮件 │ │ SMTP发送邮件 │ │ │ └────────────────┘ └────────────────┘ │ │ │ │ │ │ └────────────┬────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ 发送邮件 │ │ │ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 8.2 SMTP配置优先级 ``` 优先级逻辑: ┌─────────────────────────────────────────────────────────────┐ │ │ │ 1. 企业自定义SMTP配置(最高优先级) │ │ └─ 在"企业设置-集成管理-邮件服务"中配置 │ │ │ │ 2. 平台默认SMTP配置(降级方案) │ │ └─ 由平台管理员统一配置,供未配置的企业使用 │ │ │ │ 配置来源: │ │ ├─ 企业配置:tenant_id = 当前企业ID │ │ └─ 平台配置:tenant_id = 'platform' 或 system级别 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 8.3 现有邮件配置功能 系统已具备完整的SMTP配置功能(路径:`/admin/settings/integrations/email`): | 功能 | 说明 | |------|------| | **SMTP配置** | 服务器地址、端口、用户名、密码/授权码 | | **快速预设** | QQ邮箱、163邮箱、Gmail 一键填充配置 | | **发件人信息** | 发件人邮箱、发件人名称 | | **加密方式** | TLS/SSL 开关 | | **测试发送** | 可发送测试邮件验证配置是否正确 | | **开关控制** | 启用/禁用邮件服务 | ### 8.4 现有API接口 ``` 获取SMTP配置: GET /api/v1/email/smtp-config 保存SMTP配置: POST /api/v1/email/smtp-config Body: { host: string, // SMTP服务器 port: number, // 端口 username: string, // 用户名 password: string, // 密码/授权码 fromEmail: string, // 发件人邮箱 fromName: string, // 发件人名称 useTls: boolean, // 是否使用TLS enabled: boolean // 是否启用 } 获取邮件模板: GET /api/v1/email/templates ``` ### 8.5 邮件发送服务实现 ```typescript // src/lib/email/service.ts interface EmailOptions { to: string | string[]; // 收件人 subject: string; // 邮件主题 html?: string; // HTML内容 text?: string; // 纯文本内容 templateId?: string; // 模板ID templateData?: Record<string, any>; // 模板变量 } class EmailService { /** * 发送邮件 * 自动选择企业配置或平台配置 */ async send(options: EmailOptions): Promise<{ success: boolean; error?: string }> { // 1. 获取SMTP配置(优先企业配置) const config = await this.getSmtpConfig(); if (!config || !config.enabled) { return { success: false, error: '邮件服务未配置或未启用' }; } // 2. 构建邮件内容 const { subject, html, text } = await this.buildEmailContent(options); // 3. 发送邮件 try { await this.sendViaSmtp(config, { from: `${config.fromName} <${config.fromEmail}>`, to: Array.isArray(options.to) ? options.to.join(',') : options.to, subject, html, text, }); return { success: true }; } catch (error) { console.error('邮件发送失败:', error); return { success: false, error: '邮件发送失败' }; } } /** * 获取SMTP配置 * 优先使用企业配置,无则使用平台默认配置 */ private async getSmtpConfig(): Promise<SmtpConfig | null> { // 获取当前租户ID const tenantId = await this.getCurrentTenantId(); // 1. 尝试获取企业配置 const enterpriseConfig = await this.fetchConfig(tenantId); if (enterpriseConfig && enterpriseConfig.enabled) { return enterpriseConfig; } // 2. 降级使用平台默认配置 const platformConfig = await this.fetchConfig('platform'); return platformConfig; } /** * 发送后台账号创建通知邮件 */ async sendAccountCreatedNotification(data: { email: string; name: string; phone: string; password: string; role: string; loginUrl: string; }): Promise<{ success: boolean; error?: string }> { const html = this.generateAccountNotificationHtml(data); return this.send({ to: data.email, subject: '【企业管理后台】账号创建通知', html, }); } /** * 生成账号通知邮件HTML */ private generateAccountNotificationHtml(data: { name: string; phone: string; password: string; role: string; loginUrl: string; }): string { return ` <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;"> <h2 style="color: #1890ff;">【企业管理后台】账号创建通知</h2> <p>您好,${data.name}:</p> <p>您已被分配企业管理后台账号,请使用以下信息登录:</p> <div style="background: #f5f5f5; padding: 15px; border-radius: 5px; margin: 20px 0;"> <p><strong>登录地址:</strong><a href="${data.loginUrl}">${data.loginUrl}</a></p> <p><strong>登录账号:</strong>${data.phone}</p> <p><strong>初始密码:</strong><code style="background: #fff; padding: 2px 8px; border-radius: 3px;">${data.password}</code></p> <p><strong>分配角色:</strong>${data.role}</p> </div> <div style="background: #fff3cd; padding: 15px; border-radius: 5px; margin: 20px 0; border-left: 4px solid #ffc107;"> <p style="margin: 0; font-weight: bold;">⚠️ 首次登录需要:</p> <ol style="margin: 10px 0 0 0; padding-left: 20px;"> <li>验证手机号</li> <li>修改初始密码</li> </ol> </div> <p style="color: #666; font-size: 12px; margin-top: 30px;"> 此邮件由系统自动发送,请勿回复。<br> 如有疑问,请联系企业管理员。 </p> </div> `; } } export const emailService = new EmailService(); ``` ### 8.6 使用示例 ```typescript // 在账号创建API中使用 import { emailService } from '@/lib/email/service'; // 创建账号后发送邮件通知 if (values.email && values.sendEmail) { const result = await emailService.sendAccountCreatedNotification({ email: values.email, name: values.realName, phone: values.phone, password: generatedPassword, role: roleInfo.name, loginUrl: `${process.env.NEXT_PUBLIC_BASE_URL}/admin/login`, }); if (result.success) { console.log('邮件发送成功'); } else { console.warn('邮件发送失败:', result.error); // 不影响账号创建,仅记录日志 } } ``` --- ## 九、数据库设计 ### 9.1 权限定义表 ```sql CREATE TABLE permission_definitions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- 租户隔离(system表示系统级权限,所有租户共享) tenant_id VARCHAR(64) DEFAULT 'system', -- 基本信息 code VARCHAR(128) NOT NULL, name VARCHAR(128) NOT NULL, description TEXT, -- 层级关系 level VARCHAR(20) NOT NULL, -- module/menu/page/action parent_code VARCHAR(128), -- 关联信息 route VARCHAR(256), -- 关联路由 tab_key VARCHAR(64), -- 关联Tab action_type VARCHAR(32), -- 操作类型 -- 权限特性 is_default BOOLEAN DEFAULT FALSE, is_system BOOLEAN DEFAULT FALSE, sort_order INT DEFAULT 0, -- 版本信息 since_version VARCHAR(32), deprecated BOOLEAN DEFAULT FALSE, replaced_by VARCHAR(128), -- 审计 created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), UNIQUE(tenant_id, code) ); -- 创建索引 CREATE INDEX idx_perm_level ON permission_definitions(level); CREATE INDEX idx_perm_parent ON permission_definitions(parent_code); CREATE INDEX idx_perm_route ON permission_definitions(route); ``` ### 9.2 角色表 ```sql CREATE TABLE backend_roles ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id VARCHAR(64) NOT NULL, -- 基本信息 name VARCHAR(64) NOT NULL, code VARCHAR(64) NOT NULL, description TEXT, -- 权限配置 permissions TEXT[], -- 权限码数组 -- 元数据 is_system BOOLEAN DEFAULT FALSE, is_active BOOLEAN DEFAULT TRUE, sort_order INT DEFAULT 0, -- 审计 created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), created_by VARCHAR(64), UNIQUE(tenant_id, code) ); ``` ### 9.3 后台用户表 ```sql CREATE TABLE backend_users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id VARCHAR(64) NOT NULL, -- ========== 账号信息 ========== phone VARCHAR(20) NOT NULL, email VARCHAR(128), -- 邮箱(用于邮件通知) password_hash VARCHAR(256), initial_password_encrypted VARCHAR(256), password_changed_at TIMESTAMP, password_expired_at TIMESTAMP, must_change_password BOOLEAN DEFAULT TRUE, -- ========== 实名信息 ========== real_name VARCHAR(64) NOT NULL, id_card_encrypted VARCHAR(256), id_card_verified BOOLEAN DEFAULT FALSE, -- ========== 关联员工 ========== employee_id VARCHAR(64), employee_no VARCHAR(64), department_name VARCHAR(128), position_name VARCHAR(128), -- ========== 角色信息 ========== role_id UUID REFERENCES backend_roles(id), role_name VARCHAR(64), -- ========== 状态信息 ========== status VARCHAR(20) DEFAULT 'pending', -- pending/active/disabled/locked first_login_at TIMESTAMP, last_login_at TIMESTAMP, login_count INT DEFAULT 0, -- ========== 安全信息 ========== login_failed_count INT DEFAULT 0, locked_until TIMESTAMP, -- ========== 设备绑定 ========== bound_devices JSONB, -- ========== 备注信息 ========== remark TEXT, -- ========== 审计信息 ========== created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), created_by VARCHAR(64), UNIQUE(tenant_id, phone) ); -- 创建索引 CREATE INDEX idx_backend_users_phone ON backend_users(phone); CREATE INDEX idx_backend_users_email ON backend_users(email); CREATE INDEX idx_backend_users_employee ON backend_users(employee_id); CREATE INDEX idx_backend_users_role ON backend_users(role_id); CREATE INDEX idx_backend_users_status ON backend_users(status); ``` ### 9.4 操作日志表 ```sql -- 创建主表(分区表) CREATE TABLE operation_logs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id VARCHAR(64) NOT NULL, -- ========== 操作人信息 ========== operator_id VARCHAR(64) NOT NULL, operator_name VARCHAR(64), operator_phone VARCHAR(20), operator_role VARCHAR(64), -- ========== 操作信息 ========== module VARCHAR(64) NOT NULL, module_code VARCHAR(64), action VARCHAR(64) NOT NULL, action_desc TEXT, target_id VARCHAR(64), target_name VARCHAR(256), -- ========== 变更详情 ========== before_data JSONB, after_data JSONB, change_summary TEXT, -- ========== 设备信息 ========== ip_address VARCHAR(64), port VARCHAR(16), user_agent TEXT, device_id VARCHAR(128), device_name VARCHAR(256), browser_info JSONB, os_info JSONB, -- ========== 位置信息 ========== location VARCHAR(256), country VARCHAR(64), province VARCHAR(64), city VARCHAR(64), isp VARCHAR(64), -- ========== 日志级别 ========== severity VARCHAR(20) DEFAULT 'normal', -- critical/high/normal/low -- ========== 权限关联 ========== permission_code VARCHAR(128), -- ========== 时间戳 ========== created_at TIMESTAMP DEFAULT NOW() ) PARTITION BY RANGE (created_at); -- 创建月分区(示例) CREATE TABLE operation_logs_2024_03 PARTITION OF operation_logs FOR VALUES FROM ('2024-03-01') TO ('2024-04-01'); CREATE TABLE operation_logs_2024_04 PARTITION OF operation_logs FOR VALUES FROM ('2024-04-01') TO ('2024-05-01'); -- 创建索引 CREATE INDEX idx_logs_tenant ON operation_logs(tenant_id); CREATE INDEX idx_logs_operator ON operation_logs(operator_id); CREATE INDEX idx_logs_module ON operation_logs(module); CREATE INDEX idx_logs_severity ON operation_logs(severity); CREATE INDEX idx_logs_created ON operation_logs(created_at); ``` ### 9.5 ER图 ``` ┌────────────────────┐ ┌────────────────────┐ │ permission_ │ │ backend_roles │ │ definitions │ │ │ ├────────────────────┤ ├────────────────────┤ │ id │ │ id │ │ tenant_id │ │ tenant_id │ │ code │ │ name │ │ name │ │ code │ │ level │ │ permissions[] │◄─────┐ │ parent_code │ │ is_system │ │ │ route │ │ created_at │ │ │ ... │ └────────────────────┘ │ └────────────────────┘ │ │ │ 1:N │ ▼ │ ┌────────────────────┐ │ │ backend_users │ │ ├────────────────────┤ │ │ id │ │ │ tenant_id │ │ │ phone │ │ │ email │ │ │ real_name │ │ │ role_id ───────────┼──────┘ │ status │ │ ... │ └────────────────────┘ │ │ 1:N ▼ ┌────────────────────┐ │ operation_logs │ ├────────────────────┤ │ id │ │ tenant_id │ │ operator_id │ │ module │ │ action │ │ ip_address │ │ device_id │ │ ... │ └────────────────────┘ ``` --- ## 十、新增功能权限集成流程 ### 10.1 开发新功能时的权限集成 ``` ┌─────────────────────────────────────────────────────────────┐ │ 新增功能权限集成流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Step 1: 定义权限点 │ │ ├─ 在 src/permissions/modules/ 下创建权限定义文件 │ │ └─ 或在现有文件中添加新权限 │ │ │ │ Step 2: 注册到权限中心 │ │ └─ 在 src/permissions/index.ts 中导入 │ │ │ │ Step 3: 组件中使用权限控制 │ │ ├─ 使用 PermissionGuard 包裹页面/组件 │ │ ├─ 使用 PermissionButton 替代普通按钮 │ │ └─ 使用 PermissionTabs 替代普通Tab │ │ │ │ Step 4: API层权限校验 │ │ └─ 在 route.ts 中调用 checkPermission() │ │ │ │ Step 5: 添加操作日志 │ │ └─ 在操作完成后调用 logger.log() │ │ │ │ Step 6: 运行权限同步脚本 │ │ └─ pnpm run sync-permissions │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 10.2 代码示例 #### 定义权限点 ```typescript // src/permissions/modules/training.ts import { PermissionDefinition } from '../types'; export const trainingPermissions: PermissionDefinition[] = [ // 模块 { code: 'training', name: '培训管理', description: '企业培训课程和记录管理', level: 'module', sortOrder: 8, sinceVersion: '1.2.0', }, // 菜单 { code: 'training.courses', name: '课程管理', level: 'menu', parentCode: 'training', route: '/tenant/training/courses', sortOrder: 1, sinceVersion: '1.2.0', }, // Tab { code: 'training.courses.list', name: '课程列表', level: 'page', parentCode: 'training.courses', tabKey: 'list', isDefault: true, sortOrder: 1, sinceVersion: '1.2.0', }, // 操作 { code: 'training.courses.list.create', name: '创建课程', level: 'action', parentCode: 'training.courses.list', actionType: 'create', sortOrder: 1, sinceVersion: '1.2.0', }, // ... 更多权限点 ]; ``` #### 注册权限 ```typescript // src/permissions/index.ts import { trainingPermissions } from './modules/training'; export const allPermissions: PermissionDefinition[] = [ ...employeePermissions, ...recruitmentPermissions, ...salaryPermissions, ...organizationPermissions, ...enterprisePermissions, ...systemPermissions, ...trainingPermissions, // 新增 ]; ``` #### 页面使用 ```tsx // src/app/tenant/training/courses/page.tsx import { PermissionGuard, PermissionButton, PermissionTabs } from '@/permissions'; export default function TrainingCoursesPage() { return ( <PermissionGuard code="training.courses"> <div className="p-6"> <PermissionTabs parentCode="training.courses" tabs={[ { key: 'list', label: '课程列表', children: <CourseList /> }, { key: 'records', label: '培训记录', children: <Records /> }, ]} /> </div> </PermissionGuard> ); } ``` --- ## 十一、安全增强措施 ### 11.1 账号安全 | 措施 | 说明 | |------|------| | 实名认证 | 手机号+身份证号双重验证 | | 初始密码 | 随机生成,首次登录强制修改 | | 密码策略 | 8位以上,大小写+数字,90天过期 | | 登录限制 | 5次失败锁定,新设备验证 | | 会话管理 | 单点登录,超时自动登出 | ### 11.2 权限安全 | 措施 | 说明 | |------|------| | 最小权限原则 | 默认无权限,按需分配 | | 定期审计 | 每季度审查权限合理性 | | 离职回收 | 员工离职立即回收权限 | | 敏感操作确认 | 删除、导出等需二次确认 | ### 11.3 日志安全 | 措施 | 说明 | |------|------| | 完整记录 | IP、端口、设备指纹、位置等 | | 不可篡改 | 日志只增不改 | | 不可删除 | 企业无删除权限 | | 异常预警 | 敏感操作实时告警 | ### 11.4 风险预警 | 风险场景 | 预警方式 | 日志级别 | |----------|----------|----------| | 异常时间登录 | 系统通知/邮件通知管理员 | critical | | 敏感数据导出 | 记录日志+系统通知 | critical | | 批量删除操作 | 强制二次确认+记录日志 | critical | | 权限变更 | 系统通知被变更人 | high | | 同账号多设备在线 | 强制下线+系统通知 | high | | 连续登录失败 | 账号锁定+系统通知 | high | > 注:系统通知指在用户下次登录时显示的站内消息;邮件通知使用企业SMTP或平台默认SMTP --- ## 十二、实施计划 ### 12.1 开发阶段 ``` ┌─────────────────────────────────────────────────────────────┐ │ 开发阶段规划 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 阶段一:基础设施(核心) │ │ ├─ [ ] 权限注册中心实现 │ │ ├─ [ ] 数据库表创建 │ │ ├─ [ ] 权限同步脚本 │ │ └─ [ ] 基础权限定义(现有模块) │ │ │ │ 阶段二:角色管理 │ │ ├─ [ ] 角色列表页面 │ │ ├─ [ ] 角色创建/编辑弹窗 │ │ ├─ [ ] 动态权限树组件 │ │ └─ [ ] 预设角色初始化 │ │ │ │ 阶段三:账号管理 │ │ ├─ [ ] 账号列表页面 │ │ ├─ [ ] 账号创建弹窗+流程 │ │ ├─ [ ] 一键复制功能 │ │ ├─ [ ] 邮件通知集成 │ │ ├─ [ ] 账号编辑/禁用功能 │ │ ├─ [ ] 密码重置功能 │ │ └─ [ ] 员工信息自动匹配 │ │ │ │ 阶段四:登录认证 │ │ ├─ [ ] 后台登录页面 │ │ ├─ [ ] 首次登录流程 │ │ ├─ [ ] 手机号验证 │ │ ├─ [ ] 密码修改流程 │ │ └─ [ ] 登录安全策略 │ │ │ │ 阶段五:权限控制 │ │ ├─ [ ] 路由守卫中间件 │ │ ├─ [ ] PermissionGuard组件 │ │ ├─ [ ] PermissionButton组件 │ │ ├─ [ ] PermissionTabs组件 │ │ └─ [ ] API权限校验 │ │ │ │ 阶段六:操作日志 │ │ ├─ [ ] 日志记录服务 │ │ ├─ [ ] 日志列表页面 │ │ ├─ [ ] 日志详情弹窗 │ │ ├─ [ ] 日志导出功能 │ │ └─ [ ] 异常预警机制 │ │ │ │ 阶段七:现有功能集成 │ │ ├─ [ ] 各模块权限控制集成 │ │ ├─ [ ] 各操作日志埋点 │ │ └─ [ ] 权限配置迁移 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 12.2 优先级说明 | 优先级 | 模块 | 说明 | |--------|------|------| | P0 | 权限基础设施 | 必须先有权限注册机制 | | P0 | 角色管理 | 核心功能,必须先有角色 | | P0 | 账号管理 | 核心功能 | | P0 | 登录认证 | 安全必需 | | P1 | 权限控制组件 | 业务功能所需 | | P1 | 操作日志 | 审计必需 | | P1 | 邮件通知 | 复用现有服务,快速实现 | | P2 | 现有功能集成 | 渐进式完成 | --- ## 附录 ### A. 权限码完整列表 > 见文档:`docs/permissions-full-list.md`(开发时自动生成) ### B. API接口列表 > 见文档:`docs/api/permission-api.md`(开发时自动生成) ### C. 前端组件文档 > 见文档:`docs/components/permission-components.md`(开发时自动生成) --- ## 待确认事项 请确认以下几点: 1. **权限粒度**:四级层级(模块-菜单-页面-操作)是否足够? 2. **角色预设**:预设的角色模板是否满足需求?是否需要调整? 3. **操作日志**:日志记录的内容和保留策略是否满足审计要求? 4. **登录安全**:安全策略(密码策略、锁定策略等)是否合理? 5. **员工端边界**:确认员工端完全不在此系统管理范围内? 6. **邮件通知**: - ✅ 已确认:优先使用企业SMTP配置,无则使用平台默认 - ✅ 已确认:复用现有邮件服务API - ⚠️ 待确认:是否需要在账号创建时默认勾选"发送邮件通知"? 7. **其他需求**:是否有遗漏的功能点? --- ## 更新记录 | 版本 | 日期 | 更新内容 | |------|------|----------| | V4.0 | 2024-03 | 新增邮件通知系统章节,明确SMTP配置优先级;复用现有邮件服务 | | V3.1 | 2024-03 | 修改通知方式:管理员手动通知+一键复制;短信预留暂不开放;新增邮件通知选项 | | V3.0 | 2024-03 | 完善操作日志设计;明确系统边界;动态权限架构 | | V2.0 | 2024-03 | 新增动态权限架构;权限注册机制;四级权限层级 | | V1.0 | 2024-03 | 初始版本 | --- **文档结束** > 请审阅后确认,确认后将按照此方案开始开发。
未来鸟
2026年7月27日 10:30
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
分享
链接
类型
密码
更新密码
有效期
Markdown文件
Word文件
PDF文档(打印)
AI