From: 刘洪青 Date: Mon, 14 Dec 2020 09:46:30 +0000 (+0800) Subject: docs: 更新 用户数据同步 文档 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=6b63b58f127766033fe6f7b161c40f592437579a;p=institute%2Fdeploy-authx-service.git docs: 更新 用户数据同步 文档 --- diff --git "a/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.md" "b/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.md" index 106692d..68bc1e7 100644 --- "a/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.md" +++ "b/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.md" @@ -2,10 +2,385 @@ # 用户数据同步说明文档 -## 基于数据交换 +## 说明 + +本文档,主要为了让实施人员能够方便地将用户数据(包括组织机构、人员帐号)同步到用户服务相关业务表。 + + +## 用户服务 + +### 业务数据表说明 + +#### 字典 + +主要涉及用户数据 相关的 字典数据,详细『字典说明』 + +* 字典类型 TB_B_DICTIONARY_TYPE + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| CODE | 代码 | VARCHAR(120), NN | | +| NAME | 名称 | VARCHAR(200), NN | | +| MULTI_LEVEL | 是否多层级 | INT | 1:是,0:否;默认是 | +| ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | +| SORT | 排序 | BIGINT | | +| IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认否 | + + +* 字典项 TB_B_DICTIONARY + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| DICTIONARY_TYPE_ID | 字典类型 | VARCHAR(64), NN | TB_B_DICTIONARY_TYPE 表 ID | +| PARENT_DICTIONARY_ID | 父级字典 | VARCHAR(64) | TB_B_DICTIONARY 表 ID | +| CODE | 代码 | VARCHAR(120), NN | | +| NAME | 名称 | VARCHAR(200), NN | | +| ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | +| SORT | 排序 | BIGINT | | +| IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认否 | + + + +#### 身份 + +帐号身份类型,以及 身份 与 用户组下人员 的初始关联设置 + +* 身份类型 TB_B_IDENTITY_TYPE + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(100), PK, NN | | +| PARENT_IDENTITY_TYPE_ID | 父身份类型 | VARCHAR(64) | TB_B_IDENTITY_TYPE 表 ID | +| CODE | 代码 | VARCHAR(120), NN | | +| NAME | 名称 | VARCHAR(200), NN | | +| ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | +| SORT | 排序 | BIGINT | | + + +* 身份类型-用户组初始化关系 TB_B_IDENTITY_TYPE_GROUP_INITIAL + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(100), PK, NN | | +| IDENTITY_TYPE_ID | 身份类型ID | VARCHAR(64), NN | TB_B_IDENTITY_TYPE 表 ID | +| GROUP_ID | 用户组ID | VARCHAR(64), NN | TB_B_GROUP 表 ID | + + + +#### 组织机构 + +组织机构数据 + +* 组织机构 TB_B_ORGANIZATION + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| IS_ROOT_ORGANIZATION | 是否根组织机构 | INT | 0:否,1:是;默认否 | +| ROOT_ORGANIZATION_ID | 所属的根组织机构 | VARCHAR(64) | TB_B_ORGANIZATION 表 ID | +| PARENT_ORGANIZATION_ID | 所属的父级组织机构 | VARCHAR(64) | TB_B_ORGANIZATION 表 ID | +| CODE | 代码 | VARCHAR(120), NN | | +| NAME | 名称 | VARCHAR(200), NN | | +| DESCRIPTION | 描述 | VARCHAR(500) | | +| TYPE_ID | 组织机构部门类型 | VARCHAR(64), NN | TB_B_DICTIONARY 表 ID;字典类型:ORGANIZATION_TYPE | +| STATE | 状态 | INT | 0:正常,1:冻结,2:注销;默认正常 | +| ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | +| SORT | 排序 | BIGINT | | +| IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认是 | + + + +#### 用户 + +用户的基本信息、安全设置的数据 + +* 用户基础信息 TB_B_USER + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| UID | 唯一编号 | VARCHAR(64), NN | | +| PASSWORD | 账号密码 | VARCHAR(255), NN | | +| LDAP_USER_PASSWORD | 账号密码(LDAP同步用) | VARCHAR(255) | | +| PASSWORD_STATE | 密码过期状态 | INT | 0:正常 未过期,-1:已过期,>0:n天后即将过期;默认0 | +| NAME | 姓名 | VARCHAR(255), NN | | +| NAME_SPELLING | 姓名简拼 | VARCHAR(120) | | +| FULL_NAME_SPELLING | 姓名全拼 | VARCHAR(255) | | +| CERTIFICATE_TYPE_ID | 证件类型 | VARCHAR(64), NN | TB_B_DICTIONARY 表 ID;字典类型:CERTIFICATE_TYPE | +| CERTIFICATE_NUMBER | 证件号码 | VARCHAR(120), NN | | + +| PHONE_NUMBER | 手机号码 | VARCHAR(50) | | +| EMAIL | 邮箱 | VARCHAR(50) | | +| IMAGE_URL | 头像 | VARCHAR(255) | | +| GENDER_ID | 性别 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:GENDER | +| NATION_ID | 民族 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:NATION | +| COUNTRY_ID | 国家 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:COUNTRY | +| ADDRESS_ID | 地区 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:ADDRESS | + + +* 用户安全设置 TB_B_SAFETY + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| USER_ID | 用户ID | VARCHAR(64), NN | TB_B_USER 表 ID | +| SCORE | 账号安全得分 | VARCHAR(5), NN | 默认0 | +| PASSWORD_SCORE | 安全密码得分 | VARCHAR(5), NN | 默认0 | +| SECURE_EMAIL | 安全邮箱 | VARCHAR(60), NN | | +| SECURE_PHONE | 安全手机 | VARCHAR(20), NN | | + + +#### 帐号 + +帐号数据,帐号所属组织机构、帐号所属用户组等 + +* 帐号 TB_B_ACCOUNT + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| USER_ID | 用户ID | VARCHAR(64), NN | TB_B_USER 表 ID | +| ACCOUNT_NAME | 人员账号;唯一 | VARCHAR(64), NN | | +| ACCOUNT_EXPIRY_DATE | 账号有效日期[yyyy-MM-dd] | DATE | | +| ACCOUNT_LOCKED | 是否锁定 | INT | 0:未锁定;1:锁定;默认,0 未锁定 | +| ORGANIZATION_ID | 所属组织机构 | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | +| IDENTITY_TYPE_ID | 身份类型 | VARCHAR(64), NN | TB_B_IDENTITY_TYPE 表 ID | +| ACTIVATION | 是否激活定 | INT | 0:未激活;1:激活;默认,0 未激活 | +| STATE | 状态 | VARCHAR(20) | NORMAL:正常;FREEZE:冻结;WRITTENOFF:注销;默认,NORMAL | +| IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否;1:是;默认,1 是 | + + +* 帐号-组织机构关系(一人多部门关系) TB_B_ACCOUNT_ORGANIZATION + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| ROOT_ORGANIZATION_ID | 根组织机构ID | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | +| ACCOUNT_ID | 人员账户ID | VARCHAR(64), NN | TB_B_ACCOUNT 表 ID | +| ORGANIZATION_ID | 组织机构ID | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | + + +* 帐号-用户组关系 TB_B_ACCOUNT_GROUP + +| 字段 | 名称 | 类型(长度) | 说明 | +| - | - | - | - | +| ID | 编号 | VARCHAR(64), PK, NN | | +| ACCOUNT_ID | 人员账户ID | VARCHAR(64), NN | TB_B_ACCOUNT 表 ID | +| GROUP_ID | 用户组ID | VARCHAR(64), NN | TB_B_GROUP 表 ID | + + + + + +### 字典说明 + +若组织机构数据、人员数据中使用的字典与以下现有字典 不一致的,须进行重新初始化 + +* 组织机构类型 + +代码 | 名称 | 是否可调整 +- | - | - +10000 | 根组织机构 | 不要删除、调整 +10001 | 学校 | +10002 | 部门 | +10003 | 院系 | +10004 | 专业 | +10005 | 班级 | + +**注**,除 10000 外,其他组织机构类型代码都可以视项目情况,删除,然后新增 + + +* 证件类型 + +采用标准代码 + +代码 | 名称 +- | - +1 | 居民身份证 +2 | 军官证 +3 | 士兵证 +4 | 文职干部证 +5 | 部队离退休证 +6 | 香港特区护照/身份证明 +7 | 澳门特区护照/身份证明 +8 | 台湾居民来往大陆通行证 +9 | 境外永久居住证 +A | 护照 +B | 户口薄 +C | 外国人永久居留证 +Z | 其他 + + +* 性别 + +采用标准代码 + +代码 | 名称 +- | - +0 | 未知的性别 +1 | 男 +2 | 女 +9 | 未说明的性别 + + +* 民族 + +采用标准代码 + +代码 | 名称 +- | - +01 | 汉族 +02 | 蒙古族 +03 | 回族 +04 | 藏族 +05 | 维吾尔族 +06 | 苗族 +07 | 彝族 +08 | 壮族 +09 | 布依族 +10 | 朝鲜族 +11 | 满族 +12 | 侗族 +13 | 瑶族 +14 | 白族 +15 | 土家族 +16 | 哈尼族 +17 | 哈萨克族 +18 | 傣族 +19 | 黎族 +20 | 傈僳族 +21 | 佤族 +22 | 畲族 +23 | 高山族 +24 | 拉祜族 +25 | 水族 +26 | 东乡族 +27 | 纳西族 +28 | 景颇族 +29 | 柯尔克孜族 +30 | 土族 +31 | 达斡尔族 +32 | 仫佬族 +33 | 羌族 +34 | 布朗族 +35 | 撒拉族 +36 | 毛难族 +37 | 仡佬族 +38 | 锡伯族 +39 | 阿昌族 +40 | 普米族 +41 | 塔吉克族 +42 | 怒族 +43 | 乌孜别克族 +44 | 俄罗斯族 +45 | 鄂温克族 +46 | 德昂族 +47 | 保安族 +48 | 裕固族 +49 | 京族 +50 | 塔塔尔族 +51 | 独龙族 +52 | 鄂伦春族 +53 | 赫哲族 +54 | 门巴族 +55 | 珞巴族 +56 | 基诺族 +81 | 穿青人族 +97 | 其他 +98 | 外国血统中国籍人士 + + +* 国家 + +采用标准代码 + +代码 | 名称 +- | - +156 | 中国 + + +* 地区 + +采用标准代码,代码过多,此处只列出若干,详细可见系统的字典管理功能 + +代码 | 名称 +- | - +110000 | 北京市 +110100 | 市辖区 +110101 | 东城区 +110102 | 西城区 +| +120000 | 天津市 +120100 | 市辖区 +120101 | 和平区 +120102 | 河东区 +120103 | 河西区 +| +310000 | 上海市 +310100 | 市辖区 +310101 | 黄浦区 + + +### 身份说明 + +身份数据由项目根据实际情况 进行创建 + + +### 同步接口逻辑说明 + +#### 组织机构同步接口 + +保存数据时, +验证 组织机构数据 是否合法,代码、名称、是否启用、上级组织机构 不能为空 +判断 组织机构类型(字典) 是否存在?若不存在,则无法同步 +判断 上级组织机构 是否存在?若不存在,则无法同步 +根据 组织机构代码 判断组织机构是否已存在?若否,则新增;否则,更新 + +新增时,将 组织机构代码 作为 组织机构ID 进行保存。 +更新时,判断 组织机构ID 是否与 上级组织机构ID 一致?若是,则无法同步;否则 保存。 + +删除数据时, +将 组织机构数据 的状态修改为 `2:注销`,并不进行物理删除 + + +#### 帐号同步接口 + +保存数据时, +验证 帐号数据 是否合法,姓名、证件类型、证件号码、账号名、身份类型、所属组织机构 不能为空 +判断 证件类型(字典) 是否存在?若不存在,则无法同步 +判断 所属组织机构 是否存在?若不存在,则无法同步 +判断 所属组织机构 是否为行政组织机构?若不是,则无法同步 +判断 身份类型 是否存在?若不存在,则无法同步 + +根据 帐号名 获取帐号信息是否存在? + 若不存在,则须新增帐号,同时根据 证件号码 获取用户信息是否存在? + 若不存在,则须新增用户 + 否则,判断 姓名是否 一致?若不一致,则无法同步;否则,可更新用户 + 否则,可更新帐号,同时 可更新用户 + +新增用户时,设置激活状态,设置信息完善状态 +更新用户时,若一人一帐号,则 更新用户的 姓名、证件类型、证件号码 + +新增帐号时,设置激活状态(与用户的激活状态保持一致) +更新帐号时,不再更新 激活状态 + +删除数据时, +将 帐号数据 的状态修改为 `WRITTENOFF:注销`,并不进行物理删除 + + +## 基于同步程序 + +实施人员,将 组织机构、人员帐号 数据,通过数据交换等工具,交换至以下临时表中 + +同步程序会定时,读取待处理的数据,调用对应的同步接口,将数据同步到用户服务的相关业务表中 + ### 临时表说明 +#### 源头数据表 + * 组织机构表 @@ -67,10 +442,87 @@ STATE | varchar(20) | 账号状态[ NORMAL:正常 FREEZE:冻结 WRITTENOFF: IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填 + +#### 转换数据表 + + +* 组织机构表 + +TMP_ORGANIZATION_TRANS + +名称 | 类型 | 描述 | 是否必填 +- | - | - | - +TRANS_STATUS | VARCHAR(10) | 传输状态(0 无变化、1 新增、2 更新、3 删除) | +TRANS_TIME | DATETIME | 同步时间 | +PROC_STATUS | VARCHAR(10) | 处理状态(0 不处理、1 可处理) | +PROC_RESULT | VARCHAR(10) | 处理结果(0 未处理、1 处理成功、2 处理失败) | +PROC_TIME | DATETIME | 处理时间 | +ID | varchar(64) | ID,主键,随机生成 | 必填 +DELETED | int(1) | 是否删除 0:有效 1:删除 | 必填 +ADD_ACCOUNT | varchar(100) | 创建人用户名 +ADD_TIME | timestamp | 创建时间 +EDIT_ACCOUNT | varchar(100) | 修改人用户名 +EDIT_TIME | timestamp | 修改时间 +DELETE_ACCOUNT | varchar(100) | 删除人用户名 +DELETE_TIME | timestamp | 删除时间 +PARENT_ORGANIZATION_ID | varchar(64) | 所属的父级组织机构,顶级组织机构为 0 +CODE | varchar(120) | 组织机构代码 | 必填 +NAME | varchar(200) | 组织机构名称 | 必填 +DESCRIPTION | varchar(500) | 组织机构描述 +TYPE_ID | varchar(64) | 组织机构部门类型,字典表ID、代码均可 | 必填 +STATE | int(2) | 状态 [0:正常 1:冻结 2:注销];默认正常 | 必填 +ENABLE | int(1) | 是否启用 1:启用 0:不启用;默认启用 +IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填 + + +* 帐号表 + +TMP_ACCOUNT_TRANS + +名称 | 类型 | 描述 | 是否必填 +- | - | - | - +TRANS_STATUS | VARCHAR(10) | 传输状态(0 无变化、1 新增、2 更新、3 删除) | +TRANS_TIME | DATETIME | 同步时间 | +PROC_STATUS | VARCHAR(10) | 处理状态(0 不处理、1 可处理) | +PROC_RESULT | VARCHAR(10) | 处理结果(0 未处理、1 处理成功、2 处理失败) | +PROC_TIME | DATETIME | 处理时间 | +ID | varchar(64) | ID,主键,随机生成 | 必填 +DELETED | int(1) | 是否删除 0:有效 1:删除 | 必填 +ADD_ACCOUNT | varchar(100) | 创建人用户名 +ADD_TIME | timestamp | 创建时间 +EDIT_ACCOUNT | varchar(100) | 修改人用户名 +EDIT_TIME | timestamp | 修改时间 +DELETE_ACCOUNT | varchar(100) | 删除人用户名 +DELETE_TIME | timestamp | 删除时间 +UID | varchar(64) | 唯一编号 | 必填 +NAME | varchar(255) | 姓名 | 必填 +NAME_SPELLING | varchar(120) | 姓名简拼 +FULL_NAME_SPELLING | varchar(255) | 姓名全拼 +CERTIFICATE_TYPE_ID | varchar(64) | 证件类型,字典表ID、代码均可 | 必填 +CERTIFICATE_NUMBER | varchar(120) | 证件号码 | 必填 +PHONE_NUMBER | varchar(50) | 手机号码 +EMAIL | varchar(50) | 邮箱 +IMAGE_URL | varchar(255) | 个人照片地址 +GENDER_ID | varchar(64) | 性别,字典表ID、代码均可 +NATION_ID | varchar(64) | 民族,字典表ID、代码均可 +COUNTRY_ID | varchar(64) | 国家,字典表ID、代码均可 +ADDRESS_ID | varchar(64) | 地区,字典表ID、代码均可 +ACCOUNT_NAME | varchar(120) | 人员账号 | 必填,唯一 +ACCOUNT_EXPIRY_DATE | date | 账号有效日期[yyyy-MM-dd] +ORGANIZATION_ID | varchar(64) | 所属组织机构 | 必填 +IDENTITY_TYPE_ID | varchar(64) | 身份类型,身份表ID、代码均可 | 必填 +ACTIVATION | int(1) | 是否激活 [0:未激活 1:激活] | 必填 +STATE | varchar(20) | 账号状态[ NORMAL:正常 FREEZE:冻结 WRITTENOFF:注销] 默认正常状态 | 必填 +IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填 + + + ### 添加触发器 需在临时表上,增加更新触发器,执行以下脚本 +用于将 源头表 数据的变更,触发到 转换表 中,更新转换表的相关状态字段,方便同步程序进行处理 + ```sql DROP TRIGGER IF EXISTS after_update_organization_origin; @@ -259,154 +711,3 @@ delimiter ; ``` -### 字典说明 - -若组织机构数据、人员数据中使用的字典与以下现有字典 不一致的,须进行重新初始化 - -* 组织机构类型 - -代码 | 名称 | 是否可调整 -- | - | - -10000 | 根组织机构 | 不要删除、调整 -10001 | 学校 | -10002 | 部门 | -10003 | 院系 | -10004 | 专业 | -10005 | 班级 | - -**注**,除 10000 外,其他组织机构类型代码都可以视项目情况,删除,然后新增 - - -* 证件类型 - -采用标准代码 - -代码 | 名称 -- | - -1 | 居民身份证 -2 | 军官证 -3 | 士兵证 -4 | 文职干部证 -5 | 部队离退休证 -6 | 香港特区护照/身份证明 -7 | 澳门特区护照/身份证明 -8 | 台湾居民来往大陆通行证 -9 | 境外永久居住证 -A | 护照 -B | 户口薄 -C | 外国人永久居留证 -Z | 其他 - - -* 性别 - -采用标准代码 - -代码 | 名称 -- | - -0 | 未知的性别 -1 | 男 -2 | 女 -9 | 未说明的性别 - - -* 民族 - -采用标准代码 - -代码 | 名称 -- | - -01 | 汉族 -02 | 蒙古族 -03 | 回族 -04 | 藏族 -05 | 维吾尔族 -06 | 苗族 -07 | 彝族 -08 | 壮族 -09 | 布依族 -10 | 朝鲜族 -11 | 满族 -12 | 侗族 -13 | 瑶族 -14 | 白族 -15 | 土家族 -16 | 哈尼族 -17 | 哈萨克族 -18 | 傣族 -19 | 黎族 -20 | 傈僳族 -21 | 佤族 -22 | 畲族 -23 | 高山族 -24 | 拉祜族 -25 | 水族 -26 | 东乡族 -27 | 纳西族 -28 | 景颇族 -29 | 柯尔克孜族 -30 | 土族 -31 | 达斡尔族 -32 | 仫佬族 -33 | 羌族 -34 | 布朗族 -35 | 撒拉族 -36 | 毛难族 -37 | 仡佬族 -38 | 锡伯族 -39 | 阿昌族 -40 | 普米族 -41 | 塔吉克族 -42 | 怒族 -43 | 乌孜别克族 -44 | 俄罗斯族 -45 | 鄂温克族 -46 | 德昂族 -47 | 保安族 -48 | 裕固族 -49 | 京族 -50 | 塔塔尔族 -51 | 独龙族 -52 | 鄂伦春族 -53 | 赫哲族 -54 | 门巴族 -55 | 珞巴族 -56 | 基诺族 -81 | 穿青人族 -97 | 其他 -98 | 外国血统中国籍人士 - - -* 国家 - -采用标准代码 - -代码 | 名称 -- | - -156 | 中国 - - -* 地区 - -采用标准代码,代码过多,此处只列出若干,详细可见系统的字典管理功能 - -代码 | 名称 -- | - -110000 | 北京市 -110100 | 市辖区 -110101 | 东城区 -110102 | 西城区 -| -120000 | 天津市 -120100 | 市辖区 -120101 | 和平区 -120102 | 河东区 -120103 | 河西区 -| -310000 | 上海市 -310100 | 市辖区 -310101 | 黄浦区 - - - - diff --git "a/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.pdf" "b/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.pdf" index 802c925..beb8e65 100644 Binary files "a/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.pdf" and "b/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.pdf" differ