# 系统交互模型
系统交互模型,描述了软件产品的网站类型项目中系统基础功能模块的流程、数据模型以及相应 API 输入输出标准格式,包含以下内容:
- 用户登录,包含登录形式及流程
- 认证授权方式
- 数据模型输出
目标在于各端作为 数据服务供应商 或 数据应用消费者 在交互上统一行为,面向标准接口开发,使得项目新建之初可依照 系统交互模型 快速完成系统基础功能建设,从而更从容而有序应对企业后续不断增加的项目和业务
# 基础原则
# API 路径命名规则
基于 数据交互格式标准 - API 交互规则 规则, 在路径命名中应用 开发规范 - 路由命名规则 规则,简言之特性如下
- 路径使用功能/业务描述性命名,例:/user/profile/del/{id}
- 单词均使用小写方式书写
- 词组使用 -符号分隔,例:/config/user-role/list
# 对象、属性命名规则
对于数据接口中输出的对象名,以及对象中的属性等内容,应使用驼峰命名法(Camel Case)
✖
{
  "user_info": {
    "Name": "zhangsan",
    "age": 18,
    "phone_number": "13655555555",
    "admin_type": 1
  }
}
✔
{
  "userInfo": {
    "name": "zhangsan",
    "age": 18,
    "phoneNumber": "13655555555",
    "adminType": 1
  }
}
xxx_yyy_zzz 命名格式仅推荐应用于数据库(表名及表字段名)环境
在编程环境中,即使是变量的声明都应尽可能不使用该格式,在自动化语法检查工具中,也有相应的检查/推荐规则:ESLint - "camelcase" 规则 (opens new window),但常量的命名是个例外
// javascript
const MASTER_ADMIN = 1
const STATUS_ENABLED = 1
const STATUS_DISABLED = 2
// java
public static final String STATUS_ENABLED = 1;
public static final String STATUS_DISABLED = 2;
# 流程示意

# 数据模型
罗列了系统功能相关的基础数据模型,此处仅列举满足系统功能的模型及元素,后续可根据实际情况进行增补修订
# 用户
{
  "id"         : number, // 用户 id
  "name"       : string, // 用户名称
  "avatar"     : string, // 用户头像
  "companyId"  : string, // 用户当前所属公司 id
  "companyName": string, // 公司名称
  "companyLogo": string, // 公司 logo
  "adminType"  : number  // 管理员类型(0:普通用户 1:主管理员 2:子管理员)
}
# 公司
{
  "id"  : number, // 公司 id
  "name": string, // 公司名称
  "logo": string  // 公司 logo
}
# 菜单
{
  "id"      : number, // 菜单 id
  "name"    : string, // 菜单名称
  "icon"    : string, // 菜单图标
  "parentId": number, // 菜单父节点 id
  "sort"    : number, // 排列顺序
  "code"    : string, // 菜单编码
  "status"  : number  // 菜单状态(1:启用,0:禁用)
}
系统菜单应全量输出,但需要在 status 属性中体现该菜单节点的状态
注意
code 字段为菜单项目的编码,是前端系统中作为功能模块的唯一标识编码而定义,该编码由前端统一进行定义
# 权限
{
  [code]: {
    // 权限数据节点输出,内容根据具体系统情况而定
  },
  ...
}
此处的 code 与上述 菜单模型 中的 code 属性对应,代表了某个功能模块
# API 接口
系统功能模块 API 接口,内容仅为请求成功后返回的数据格式,完整数据交换格式请参考:数据交互格式标准
# 图形验证码初始化
图形验证码使用的是极验图形验证码,根据返回的数据初始化图形验证码插件
接口路径: /auth/captcha-init
// 入参
无
// 返回数据
// 该格式为极验插件的标准数据格式
{
  "code": 0,
  "data": {
    "success": number,
    "gt": string,
    "challenge": string,
    "newCaptcha": boolean
  }
}
# 密码登录
使用 用户名 和 密码 进行登录
接口路径:/auth/pwd-login
// 入参
{
  "username": string, // 用户名
  "password": string  // 密码
}
// 返回数据
{
  "code": 0,
  "data": {
    "access": {
      "accessToken": string,
      "expiresIn": number
    }
  }
}
# 获取手机短信验证码
使用 手机号 获得验证码用于系统登录,成功访问接口后,相应手机号的手机将收到包含验证码的短信
接口路径:/auth/sms-code
// 入参
{
  "phone": string // 手机号
}
// 返回数据
无
# 手机短信验证码登录
使用 手机号 和 验证码 进行登录
接口路径:/auth/sms-login
// 入参
{
  "phone": string, // 手机号
  "code": string   // 短信验证码
}
// 返回数据
{
  "code": 0,
  "data": {
    "access": {
      "accessToken": string,
      "expiresIn": number
    }
  }
}
# 获取当前用户数据
在使用 密码登录 或 手机短信验证码登录 登录成功后,获取当前用户的系统功能模型集合,系统根据该模型集合自行进行数据转换、过滤以及缓存,完成网站基础框架功能初始化
接口路径:/auth/profile
// 入参
无
// 返回数据
{
  "code": 0,
  "data": {
    "user": {
      // 用户模型
    },
    "companys": [
      {
        // 公司模型
      }, {
        ...
      }
    ],
    "menus": [
      {
        // 菜单模型
      }, {
        ...
      }
    ],
    "permission": {
      [菜单节点编码]: {
        // 权限数据节点
      },
      ...
    }
  }
}
数据节点与数据模型的对应关系
| 数据节点 | 数据模型 | 
|---|---|
| user | 用户模型 | 
| companys | 公司模型 | 
| menus | 菜单模型 | 
| permission | 权限模型 | 
# 切换公司
切换用户当前所属公司,该操作相当于用户重新登录,所以需要重新分发用户的访问令牌。在完成公司切换的操作后,前端系统会自行再次访问 获取当前用户数据 接口,更新用户信息中当前所属公司等相关信息
接口路径:/auth/switch-company
// 入参
{
  "companyId": number // 待切换的公司 id
}
// 返回数据
{
  "code": 0,
  "data": {
    "access": {
      "accessToken": string,
      "expiresIn": number
    }
  }
}
事实上有多个接口均为获取用户访问令牌的功能:
数据格式及处理规则请参考 数据交互格式标准 - 登录授权
