1. 项目背景
公司随着业务的增长各个管理系统越来越多,导致运营以及销售等同学需要频繁的登录不同的系统,以及行政在员工入职离职需要操作多个系统。
2. 重构目标
- 统一现有各个管理系统用户、组织架构,员工维护、组织架构维护
- 实现单点登录
- 通过API接口提供给其他系统员工数据
3. 重构方案
公司目前正在使用企业微信,且企业微信拥有完善的开放API,所以决定以企业微信为主进行重构。由于用户数据关系相对简单并且访问量大,决定使用 Redis 缓存全部数据,mysql 作为数据备份。
3.1 解决思路:
这里我选择禁止在企业微信后台添加编辑员工,所有员工操作由员工管理平台编辑,再将变更调用API推送至企业微信。主要解决用户唯一标识生成的问题,其次如果双端都开放编辑功能,将会大大增加服务的复杂度。
3.2 解决方案
如图所示员工中心服务分为两部分,Service 层 与 API 层。
- 所以业务逻辑全部封装在 Service 层并提供功能接口
- 除通用功能接口以外,提供如权限等服务需要的定制接口
- API 层封装对外暴露的接口,增加登录状态检测的过滤器
3.3 Service层功能列表
模块 | 功能 | 备注 |
---|---|---|
1. 企业微信API封装 | 1.1 员工创建/编辑API调用 | |
- | 1.2 删除员工API调用 | |
- | 1.3 部门创建/编辑API调用 | |
- | 1.4 删除部门API调用 | |
2. 员工管理(通用) | 2.1 员工创建/编辑 | 绑定系统角色、权限 |
- | 2.2 员工激活邮件发送 | |
- | 2.3 员工激活 | |
- | 2.4 设置密码 | 系统管理员操作 |
- | 2.5 找回密码邮件发送 | 员工通过企业邮箱自行找回 |
- | 2.6 找回密码 | |
- | 2.7 获取员工信息 | |
- | 2.8 获取员工信息(批量) | |
- | 2.9 获取员工简要信息 | 姓名、头像 |
- | 2.10 获取员工简要信息(批量) | |
- | 2.11 根据部门获取员工列表 | |
3. 部门管理(通用) | 3.1 部门创建/编辑 | |
- | 3.2 获取部门列表(树形结构) | |
- | 3.3 获取子部门列表(树形结构) | 根据某个部门获取以下部门数据 |
- | 3.4 获取部门名称 | |
- | 3.5 获取部门名称(批量) | |
4. 登录授权 | 4.1 账号密码登录 | |
- | 4.2 手机号密码登录 | |
- | 4.3 企业微信扫码登录 | |
- | 4.4 检测登录状态 | 根据 Token |
- | 4.5 获取登录用户信息 | 根据 Token |
5. 数据缓存 | 5.1 全部员工数据缓存 | |
- | 5.2 根据部门员工数据缓存 | |
- | 5.3 全部部门数据缓存 | |
6. 员工管理定制接口 | 6.1 检测用户状态(批量) | 根据用户ID查询是否在职 |
- | 6.2 获取上级部门拥有指定角色的用户ID |
3.4 API层功能列表
模块 | 功能 | 备注 |
---|---|---|
1. 员工管理 | 1.1 根据部门获取员工列表 | |
1.2 获取员工详细信息 | ||
1.3 员工激活邮件发送 | ||
1.4 员工激活 | ||
1.5 找回密码邮件发送 | ||
1.6 找回密码 | ||
2. 部门管理 | 2.1 获取部门列表(树形结构) | |
3. 数据缓存 | 3.1 全部员工数据缓存 | |
3.2 根据部门员工数据缓存 | ||
3.3 全部部门数据缓存 | ||
4. 登录授权 | 4.1 账号密码登录 | |
4.2 手机号密码登录 | ||
4.3 企业微信扫码登录 |
3.5 数据库设计:
- 员工信息表
- 部门信息表
- 员工部门关系表(一个员工可能属于多个部门)
3.6 用户模块 Redis 设计:
账号对应用户标识
Key:
账号Value:
用户标识- 用户使用账号+密码登录时使用
手机号对应用户标识
Key:
手机号Value:
用户标识- 用户使用手机号+密码登录时使用
用户标识对应所属部门
Key:
用户标识Value:
所属部门数组(转换JSON字符串)- 用户使用手机号+密码登录时使用
用户标识对应用户信息
Key:
用户标识Value:
用户信息(转换JSON字符串)- 查询用户详情,这里将用户相关将会使用的数据全部存储。列如:系统角色、所属部门、系统权限...等。
用户标识对应姓名
Key:
用户标识Value:
姓名- 其他服务需要将用户标识转换姓名是使用
3.7 部门模块 Redis 设计:
部门下所有子部门标识数组
Key:
部门标识Value:
子部门标识数组(转换JSON字符串)- 主要提供给权限服务使用
部门下所有用户标识
Key:
部门标识Value:
用户标识数组(转换JSON字符串)- 提供用户权限服务
部门下子部门树形结构
Key:
部门标识Value:
子部门树形结构保护当前部门(转换JSON字符串)- 通讯录等功能展示使用
3.8 登录模块 Redis 设计:
用户标识对应登录令牌
Key:
用户标识Value:
登录令牌- 登出以及检测用户是否已登录(登录互斥)时使用
登录令牌对应用户标识
Key:
登录令牌Value:
用户标志- 检测用户是否登录时使用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。