Teable 1.10 功能验证手册

Teable 1.10.0 核心功能 24 项逐条实测:注册/登录/令牌、空间项目表、6 类字段与公式实时计算、记录增删改查与历史评论、视图/分享/表单匿名提交、附件两步上传落盘、协作邀请、自动化 402 许可限制与 PostgreSQL 直连对账,附结论汇总表与 FAQ。

TeableTeable2026/10/18

Teable 1.10 功能验证手册

目标:对 Teable 1.10.0(Standalone 自托管)核心功能逐项实测——每项给出「操作(实测命令)→ 实测回显(逐字照录)→ 预期比对结论」。验证方式以 REST API 为主(等价于网页端操作),覆盖认证、空间/项目/表、字段类型、记录增删改查、视图、分享、表单、附件、评论、协作、自动化与 PostgreSQL 直连核对。本手册不删除任何实测资源,可作为升级后的回归检查清单。

一、环境信息

  • 操作系统:Ubuntu 22.04.4 LTS
  • Teable:1.10.0(发布件构建 release.2026-10-16T07-06-34Z.3445)
  • 部署形态:Standalone(应用 + PostgreSQL 15.4 + Redis 7.2.4),部署过程见《Teable Docker Compose 部署指南》
  • 访问入口:http://127.0.0.1:8105(PUBLIC_ORIGIN 一致)
  • 验证账号:
    • admin@teable.local / q1w2e3r4(首个注册用户,实例管理员,角色 owner)
    • member@teable.local / q1w2e3r4(验证中途注册的普通用户,邀请为空间 editor)
  • 验证日期:2026-10-18
  • API 调用方式:会话 Cookie 认证为主(登录后沿用),个人访问令牌(Bearer)为辅;OpenAPI 规范实测地址 GET /docs-json(749 个端点,规范 servers 指向 http://127.0.0.1:8105/api)

二、验证结论汇总表

#功能项关键操作实测结果结论
1用户注册(首个=管理员)POST /api/auth/signup返回 isAdmin: true✅ 通过
2密码登录/错误密码POST /api/auth/signin正确 200+Cookie;错误 400 invalid_credentials(含 attempts 计数)✅ 通过
3个人访问令牌POST /api/access-token必须显式 expiredTime;teable_<id>_<key> 格式✅ 通过
4令牌鉴权与作用域Bearer 调用用户级接口 200;表级资源 403(需单独授权)✅ 通过(有条件)
5空间创建POST /api/spacespc4MStcbvUDneupBHN✅ 通过
6项目创建POST /api/base/bseDnZ2ZGYocXpPptgh✅ 通过
7建表(含多字段类型)POST /api/base/{id}/table6 字段+2 记录一次成型;字段选项校验严格✅ 通过
8字段类型扩展POST /api/table/{id}/field/user/formula 创建成功;公式必须用字段 ID✅ 通过
9公式实时计算更新源字段后读记录工时 3.5→6,公式列 7→12✅ 通过
10记录批量创建POST …/record/3 条一次成功✅ 通过
11记录查询(过滤)GET …/record/?filter=过滤「优先级=高」命中 2 条✅ 通过
12记录更新PATCH …/record/{id}字段级更新回显正确✅ 通过
13记录删除DELETE …/record/?recordIds[]=返回删除快照,计数 5→4✅ 通过
14记录历史GET …/record/{id}/history字段级 before/after(3.5→6)✅ 通过
15记录评论POST /api/comment/.../create富文本结构写入成功,count=1✅ 通过
16视图创建POST …/view/kanban/form 视图创建成功✅ 通过
17视图分享POST …/enable-shareshareId=shrr2eaNc31pAjqpxKk✅ 通过
18匿名读分享数据GET /api/share/{id}/view/records无认证返回 4 条记录✅ 通过
19表单匿名提交POST /api/share/{id}/view/form-submit匿名写入记录成功✅ 通过
20附件上传(本地存储)signature→upload 两步文件落盘 uploads/private/table/✅ 通过
21空间协作邀请POST /api/space/{id}/collaboratormember 受邀为 editor✅ 通过
22自动化(工作流)POST /api/base/{id}/workflow402 未激活许可⚠️ 商业许可限制
23PostgreSQL 直连核对psql 查业务表记录即真实表(5 行、公式列已物化)✅ 通过
24健康检查GET /health{"status":"ok", ...}✅ 通过

总体结论:23/24 项通过;唯一受限项是自动化(需付费许可激活),详见 11.1。

三、认证与会话验证

3.1 首个用户注册自动成为管理员

操作(注册第一个账号):

curl -s -X POST "http://127.0.0.1:8105/api/auth/signup" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@teable.local","password":"q1w2e3r4"}'

实测回显:

{"id":"usrmBbQTvZwObJ4ugW8","name":"admin","phone":null,"email":"admin@teable.local","isAdmin":true,"lang":"en","notifyMeta":{"email":true},"avatar":"http://127.0.0.1:8105/api/attachments/read/public/avatar/usrmBbQTvZwObJ4ugW8","hasPassword":true}

预期比对:isAdmin: true ✅(首个注册用户自动成为实例管理员);头像 URL 前缀与 PUBLIC_ORIGIN 一致 ✅。

3.2 登录与错误密码

操作(错误密码登录):

curl -s -X POST "http://127.0.0.1:8105/api/auth/signin" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@teable.local","password":"wrongpass123"}'

实测回显:

{"message":"Email or password is incorrect","status":400,"code":"invalid_credentials","data":{"attempts":1,"localization":{"i18nKey":"httpErrors.auth.emailOrPasswordIncorrect"}}}

预期比对:错误密码返回 400 invalid_credentials ✅,且携带 attempts 连续失败计数(有防爆破计数机制)。

正确密码登录(实测回显关键头):

HTTP/1.1 200 OK
Set-Cookie: auth_session=s%3AfPNBo8DvYDPbnAEeeMOlMB_CYD215DZN.kULZwnWun4CiX5yUjo2jd9T8CJn89HiEF%2ByIOAzSBwU; Path=/; Expires=Mon, 18 Oct 2027 18:11:20 GMT; HttpOnly; SameSite=Lax

预期比对:Cookie HttpOnly + SameSite=Lax ✅(安全属性符合预期)。

3.3 个人访问令牌创建与作用域

操作(创建令牌;注意 expiredTime 必填):

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/access-token" \
  -H "Content-Type: application/json" \
  -d '{"name":"c1-expiry-test","scopes":["table|read"],"expiredTime":"2026-11-17T12:25:32.000Z"}'

实测回显:

{"id":"accXduBQVn9TPgLCycI","name":"c1-expiry-test","scopes":["table|read"],"expiredTime":"2026-11-17T12:25:32.000Z","createdTime":"2026-10-18T12:25:32.287Z","token":"teable_accXduBQVn9TPgLCycI_BcElAUIKV0lDfSxCEdW2yVYRh44mikBVrPCSWHkBoSc="}

预期比对:令牌格式 teable_<id>_<key> ✅;缺省 expiredTime 时返回 400 校验错误(实测 Invalid input: expected string, received undefined at "expiredTime")✅。

令牌调用用户级接口(GET /api/auth/user,Authorization: Bearer <token>):实测 200 返回用户信息 ✅。

令牌调用表级资源(GET /api/table/{tableId}/record/):实测返回 403:

{"message":"You are not allowed to access table tblNXuCPolP9Qv9xUvK","status":403,"code":"restricted_resource"}

预期比对与结论:令牌即使具备 table|read 作用域,仍需在具体资源(项目/表)上单独授权才能读写;作用域只是能力上限,不是资源授权本身。这是最容易踩坑的点:API 调用 403 时先检查令牌的资源授权,而不是怀疑令牌失效。

四、空间与项目验证

4.1 创建空间

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/space" \
  -H "Content-Type: application/json" -d '{"name":"功能验证空间"}'

实测回显:

{"id":"spc4MStcbvUDneupBHN","name":"功能验证空间"}

预期比对:空间 ID 前缀 spc ✅。

4.2 创建项目

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/base/" \
  -H "Content-Type: application/json" \
  -d '{"spaceId":"spc4MStcbvUDneupBHN","name":"验证项目"}'

实测回显:

{"id":"bseDnZ2ZGYocXpPptgh","name":"验证项目","icon":null,"spaceId":"spc4MStcbvUDneupBHN"}

预期比对:项目归属空间正确 ✅;项目 ID 前缀 bse ✅。

五、表与字段类型验证

5.1 建表(6 类字段 + 初始记录)

操作(POST /api/base/{baseId}/table,一次带 6 类字段与 2 条记录):

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/base/bseDnZ2ZGYocXpPptgh/table" \
  -H "Content-Type: application/json" -d '{
  "name":"任务清单",
  "fields":[
    {"type":"singleLineText","name":"任务名称"},
    {"type":"longText","name":"描述"},
    {"type":"number","name":"工时","options":{"formatting":{"type":"decimal","precision":1}}},
    {"type":"singleSelect","name":"优先级","options":{"choices":[{"name":"高"},{"name":"中"},{"name":"低"}]}},
    {"type":"checkbox","name":"完成"},
    {"type":"date","name":"截止日期","options":{"formatting":{"date":"ISO","time":"None","timeZone":"Asia/Shanghai"}}}
  ],
  "records":[
    {"fields":{"任务名称":"部署验证","工时":3.5,"优先级":"高","截止日期":"2026-10-20"}},
    {"fields":{"任务名称":"编写文档","工时":2,"优先级":"中","完成":true}}
  ]}'

实测回显(关键字段):

table id: tblNXuCPolP9Qv9xUvK | name: 任务清单 | dbTableName: bseDnZ2ZGYocXpPptgh.tblNXuCPolP9Qv9xUvK
defaultViewId: viwP2XIeWpn4lUNkDJE
fields:
  singleLineText | 任务名称 | fldGQWDqOgoU5f9WBfk
  longText | 描述 | fldA941jQjeCk4TNbsF
  number | 工时 | fldhT8P0IRZYM96wZiF
  singleSelect | 优先级 | fldNXYLM8MTxfCn3UK4
  checkbox | 完成 | fldgI0cpX0yPCBqjfNE
  date | 截止日期 | fldFStcsbQZrX0h2SmK
records: 2

预期比对:6 类字段全部创建成功 ✅;dbTableName 形如 <项目ID>.<表ID>(每个项目对应 PostgreSQL 一个 schema)✅。

过程中的校验实测(预期比对的重要补充——字段选项校验非常严格,三处常见错误实测):

  1. 单选颜色名必须是官方枚举(实测 "redDark" 报错:Invalid option: expected one of "blueLight2"|"blueLight1"|"blueBright"|"blue"|...);
  2. date 字段 formatting 必填(实测缺省报 expected object, received undefined at "formatting");
  3. date 字段 timeZone 必填且不能为 null(实测 Datetime formatting requires "timeZone" field)。

💡 建议:不熟悉选项结构时,先在网页端建一个样例字段,用 GET /api/table/{tableId}/field/ 读取其 options 作为模板。

5.2 扩展字段:用户与公式

创建用户字段:

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/field/" \
  -H "Content-Type: application/json" \
  -d '{"type":"user","name":"负责人","options":{"isMultiple":false}}'

实测回显:

{"id":"fldtf9lOI8soznZ49xx","name":"负责人","dbFieldName":"Fu_Ze_Ren","unique":false,"cellValueType":"string","dbFieldType":"TEXT","type":"user","options":{"isMultiple":false,"shouldNotify":false}}

创建公式字段(必须引用字段 ID):

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/field/" \
  -H "Content-Type: application/json" \
  -d '{"type":"formula","name":"工时翻倍","options":{"expression":"{fldhT8P0IRZYM96wZiF}*2"}}'

实测回显:

{"id":"fldMAm3cOhdnurquyfc","type":"formula","cellValueType":"number","dbFieldName":"Gong_Shi_Fan_Bei","options":{"expression":"{fldhT8P0IRZYM96wZiF}*2","timeZone":"Asia/Shanghai","formatting":{"type":"decimal","precision":2}}}

预期比对:公式字段创建成功 ✅。重要实测:用字段名 {工时} 报错 Formula references not found: 工时. Formulas must use field IDs (fldXXXXXXXXXXXXXXXX format), not field names.——公式表达式必须用字段 ID 引用。

5.3 公式实时计算验证

操作:把「部署验证」记录的工时从 3.5 改为 6,再读记录。

实测回显(更新后单条记录):

{"id":"recrrfQ8HxS3kPOTWkK","fields":{"任务名称":"部署验证(已复盘)","工时":6,"优先级":"高","完成":true,"截止日期":"2026-10-19T16:00:00.000Z","工时翻倍":12}}

预期比对:公式列 工时翻倍 由 7 实时重算为 12 ✅;日期按 Asia/Shanghai 时区转换为 UTC 存储(2026-10-20 00:00+08 → 2026-10-19T16:00:00Z)✅。

六、记录增删改查验证

6.1 批量创建

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/record/" \
  -H "Content-Type: application/json" \
  -d '{"records":[{"fields":{"任务名称":"联调测试","工时":5,"优先级":"低","描述":"与前端联调接口","完成":false}},{"fields":{"任务名称":"性能压测","工时":8,"优先级":"高"}},{"fields":{"任务名称":"上线检查","完成":true,"优先级":"中"}}]}'

实测回显(3 条全部成功):

rec9KV8E5fyHcxpC98a | 联调测试
recaZWPLXOLS5jw3B4c | 性能压测
recoytlv79Lml56ZgCh | 上线检查
created: 3

6.2 列表与过滤查询

列表读取(注意实测路由需要尾斜杠 /record/,不带斜杠返回 404——路由怪癖,见 13.1 FAQ):

curl -s -b /tmp/c1-cookie.txt "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/record/?take=10"

实测回显(节选):

{"records":[{"id":"recrrfQ8HxS3kPOTWkK","fields":{"任务名称":"部署验证","工时":3.5,"优先级":"高","截止日期":"2026-10-19T16:00:00.000Z"},"name":"部署验证","autoNumber":1,"createdTime":"2026-10-18T12:40:24.160Z","lastModifiedTime":"2026-10-18T12:40:24.160Z","createdBy":"usrmBbQTvZwObJ4ugW8","lastModifiedBy":"usrmBbQTvZwObJ4ugW8"}, ...]}

过滤查询(「优先级=高」,filter 为 JSON URL 编码):

GET /api/table/tblNXuCPolP9Qv9xUvK/record/?take=10&filter={"conjunction":"and","filterSet":[{"fieldId":"fldNXYLM8MTxfCn3UK4","operator":"is","value":"高"}]}

实测回显:命中 2 条(部署验证、性能压测,均为高优先级)✅。orderBy(排序)与 search 参数同接口支持(规范 GET /table/{tableId}/record 参数表)。

6.3 更新记录

curl -s -b /tmp/c1-cookie.txt -X PATCH \
  "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/record/recrrfQ8HxS3kPOTWkK" \
  -H "Content-Type: application/json" \
  -d '{"record":{"fields":{"工时":6,"完成":true,"任务名称":"部署验证(已复盘)"}}}'

实测回显:

{"id":"recrrfQ8HxS3kPOTWkK","fields":{"任务名称":"部署验证(已复盘)","工时":6,"优先级":"高","截止日期":"2026-10-19T16:00:00.000Z","完成":true}}

预期比对:三个字段同时更新成功,未更新字段保持不变 ✅。

6.4 删除记录

curl -s -b /tmp/c1-cookie.txt -X DELETE \
  "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/record/?recordIds%5B0%5D=recaZWPLXOLS5jw3B4c"

实测回显(返回被删记录快照):

{"records":[{"id":"recaZWPLXOLS5jw3B4c","fields":{"fldGQWDqOgoU5f9WBfk":"性能压测","fldhT8P0IRZYM96wZiF":8,"fldNXYLM8MTxfCn3UK4":"高"}}]}

预期比对:删除后列表计数 5→4 ✅。注意:请求体方式({"recordIds":[...]})实测报 400 expected array, received undefined,需用查询参数 recordIds[0]=... 形式——以实测为准。实测本版本删除记录未进入回收站(GET /api/trash?resourceType=space&resourceId=... 返回空列表)。

6.5 记录历史(字段级审计)

curl -s -b /tmp/c1-cookie.txt \
  "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/record/recrrfQ8HxS3kPOTWkK/history"

实测回显(节选,工时字段变更):

{"historyList":[{"id":"rhicd0c368cbe1167288b4e9b64","tableId":"tblNXuCPolP9Qv9xUvK","recordId":"recrrfQ8HxS3kPOTWkK","fieldId":"fldhT8P0IRZYM96wZiF","before":{"meta":{"type":"number","name":"工时"},"data":3.5},"after":...

预期比对:字段级 before/after 完整记录(3.5→6)✅,可追溯修改人。

6.6 记录评论

curl -s -b /tmp/c1-cookie.txt -X POST \
  "http://127.0.0.1:8105/api/comment/tblNXuCPolP9Qv9xUvK/recrrfQ8HxS3kPOTWkK/create" \
  -H "Content-Type: application/json" \
  -d '{"content":[{"type":"p","children":[{"type":"span","value":"部署验证已完成复盘,工时调整为 6 小时"}]}]}'

实测回显:

{"id":"comhjPQBZK8wrq2RCqh","recordId":"recrrfQ8HxS3kPOTWkK","content":[{"type":"p","children":[{"type":"span","value":"部署验证已完成复盘,工时调整为 6 小时"}]}]}

评论计数(GET /api/comment/{tableId}/{recordId}/count)实测:{"count":1} ✅。

💡 说明:评论正文是结构化富文本(type:"p" → children → type:"span" + value),传纯字符串会 400 校验失败(实测),结构按实测样例构造。

七、视图验证

7.1 视图创建与列表

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/view/" \
  -H "Content-Type: application/json" -d '{"type":"kanban","name":"按优先级看板"}'

实测回显:

{"id":"viwE6LgWZW18kyr2nFe","type":"kanban","name":"按优先级看板","options":{}}

同法创建表单视图(type=form)实测成功:viewId: viw91uXJO0QG2tJDbOM。视图列表(GET …/view/)实测:

viwP2XIeWpn4lUNkDJE | grid | Grid view
viwE6LgWZW18kyr2nFe | kanban | 按优先级看板
viw91uXJO0QG2tJDbOM | form | 任务提交表单

预期比对:Grid 默认视图 + Kanban/Form 自定义视图 ✅。

八、分享与表单验证

8.1 开启视图分享

curl -s -b /tmp/c1-cookie.txt -X POST \
  "http://127.0.0.1:8105/api/table/tblNXuCPolP9Qv9xUvK/view/viwP2XIeWpn4lUNkDJE/enable-share"

实测回显:

{"shareId":"shrr2eaNc31pAjqpxKk"}

分享状态核对(GET …/view/{viewId})实测:shareId: shrr2eaNc31pAjqpxKk | enableShare: True ✅。

8.2 匿名读取分享数据

操作(无任何认证):

curl -s "http://127.0.0.1:8105/api/share/shrr2eaNc31pAjqpxKk/view/records?take=10"

实测回显:返回 4 条记录(部署验证(已复盘)/编写文档/联调测试/上线检查)✅。

⚠️ 实测现象:分享视图的页面路由(/share/{shareId} 及变体)在本环境返回 404,而分享数据 API 与分享元信息(GET /api/share/{shareId}/view)完全正常——按 API 链路验证分享功能可用;若页面打不开,优先核对 PUBLIC_ORIGIN 与前端路由(SPA 深链)。

8.3 表单匿名提交(端到端)

操作(无认证,向表单视图分享提交一条记录):

curl -s -X POST "http://127.0.0.1:8105/api/share/shr5C9ny148mV6GnD5z/view/form-submit" \
  -H "Content-Type: application/json" \
  -d '{"fields":{"fldGQWDqOgoU5f9WBfk":"匿名表单提交测试"},"submissionTimes":1}'

实测回显:

{"id":"rec3l7KHK9w3Ebvk8qs","fields":{"fldGQWDqOgoU5f9WBfk":"匿名表单提交测试","fldMAm3cOhdnurquyfc":0}}

预期比对:匿名提交成功且记录 ID 已生成(rec3l7KHK9w3Ebvk8qs)✅;表中记录数随之 +1(第九章直查可见 5 行)✅。表单视图自身不展示记录列表(分享 records 返回空属预期行为)。

九、PostgreSQL 直连核对(架构级验证)

操作(直连主库,查询业务表——表名即 dbTableName):

docker compose exec -T teable-db psql -U teable -d teable \
  -c 'SELECT "__auto_number" AS 序号, "Ren_Wu_Ming_Cheng" AS 任务名称, "Gong_Shi" AS 工时, "You_Xian_Ji" AS 优先级, "Gong_Shi_Fan_Bei" AS 工时翻倍 FROM "bseDnZ2ZGYocXpPptgh"."tblNXuCPolP9Qv9xUvK" ORDER BY "__auto_number";'

实测回显:

 序号 |     任务名称     | 工时 | 优先级 | 工时翻倍
------+------------------+------+--------+----------
    1 | 部署验证(已复盘) |    6 | 高     |       12
    2 | 编写文档         |    2 | 中     |        4
    3 | 联调测试         |    5 | 低     |       10
    5 | 上线检查         |      | 中     |        0
    6 | 匿名表单提交测试 |      |        |        0
(5 rows)

预期比对结论:

  1. 记录即真实 PostgreSQL 表:界面里的 6 条操作(2 初始 + 3 批量 + 1 匿名表单 − 1 删除)与库中 5 行完全对账 ✅;
  2. 公式列已物化:Gong_Shi_Fan_Bei(工时翻倍)是数据库真实列,值随记录物化存储 ✅;
  3. 字段列名自动转换:中文字段名转为拼音 slug 列名(Ren_Wu_Ming_Cheng),另有系统列 __id、__auto_number、__created_time、__last_modified_time、__created_by、__last_modified_by、__version ✅;
  4. 每个 Project 对应一个独立 schema(实测 bseDnZ2ZGYocXpPptgh schema 内含 2 张业务表)✅。

⚠️ 注意:查询时 schema/表名/列名都要用双引号保留大小写;已删除记录行号(4)不回补,__auto_number 保持递增。

十、附件与本地存储验证

操作分两步(先取上传签名,再传文件):

# 1. 获取上传签名(须带实际字节数)
curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/attachments/signature" \
  -H "Content-Type: application/json" \
  -d '{"contentType":"text/plain","contentLength":72,"type":1,"expiresIn":3600,"baseId":"bseDnZ2ZGYocXpPptgh"}'

实测回显:

{"token":"5CrfXTdRfYyG","path":"table/5CrfXTdRfYyG","url":"/api/attachments/upload/5CrfXTdRfYyG","uploadMethod":"PUT","requestHeaders":{"Content-Type":"text/plain","Content-Length":72}}
# 2. 按签名 PUT 上传
curl -s -b /tmp/c1-cookie.txt -X PUT "http://127.0.0.1:8105/api/attachments/upload/5CrfXTdRfYyG" \
  -H "Content-Type: text/plain" --data-binary @/tmp/c4-attach.txt

实测回显:HTTP 200(空响应体)。落盘核对(本地存储卷内):

/app/.assets/uploads/private/table/5CrfXTdRfYyG    # 内容与上传文件一致(grep 核对通过)

预期比对:

  • 两步签名上传流程 ✅;contentLength 与实际字节数不一致时报 400 Size mismatch(实测)✅;
  • 默认 BACKEND_STORAGE_PROVIDER=local 时文件落在 uploads/private/table/<token>,与《Teable 1.10 配置参数详解》9.1 一致 ✅;
  • type 枚举 1~21(实测 1=Table 场景须带 baseId,否则报 The baseId is required when type is Table)。

十一、协作与自动化验证

11.1 空间协作邀请

注册普通用户 member@teable.local(实测回显 isAdmin: null,非管理员 ✅),随后邀请:

curl -s -b /tmp/c1-cookie.txt -X POST \
  "http://127.0.0.1:8105/api/space/spc4MStcbvUDneupBHN/collaborator" \
  -H "Content-Type: application/json" \
  -d '{"collaborators":[{"principalType":"user","principalId":"usrqnUm9BiC5MqleZhl"}],"role":"editor"}'

实测回显:HTTP 200(空响应体)。成员列表核对(GET …/collaborators?take=10):

{"total":2, "collaborators":[
  {"userName":"member","email":"member@teable.local","role":"editor", ...},
  {"userName":"admin","email":"admin@teable.local","role":"owner", ...}]}

预期比对:邀请成功、角色 editor 生效 ✅。角色枚举实测为 owner|creator|editor|commenter|viewer;请求结构要点:role 是顶层字段(不是每个 collaborator 内嵌),被邀请人用 principalId(用户 ID)+ principalType(实测报错回显枚举 user|department)标识。

11.2 自动化(工作流)——未激活许可实测

curl -s -b /tmp/c1-cookie.txt -X POST "http://127.0.0.1:8105/api/base/bseDnZ2ZGYocXpPptgh/workflow" \
  -H "Content-Type: application/json" -d '{"name":"新记录通知"}'

实测回显:

{"message":"Need to upgrade the subscription to use this feature","status":402,"code":"payment_required","data":{"feature":"automationEnable","localization":{"i18nKey":"httpErrors.billing.upgradeRequired"}}}

预期比对与结论:未激活商业许可的自托管实例,自动化能力(API 中称 workflow)返回 402 payment_required(feature=automationEnable) ⚠️。即:Standalone 部署默认不含自动化,需要按官方定价购买许可(license key)就地解锁;评估自动化能力时必须先确认许可状态。

十二、健康与版本回归

curl -s http://127.0.0.1:8105/health

实测回显:

{"status":"ok","info":{"metaDatabase":{"responseTime":2,"status":"up"}},"error":{},"details":{"metaDatabase":{"responseTime":2,"status":"up"}}}

OpenAPI 规范自检(GET /docs-json):openapi: 3.0.0 | title: Teable App | version: 1.0.0,共 749 个端点路径(automation 相关端点未在 Standalone 规范中暴露,与 11.2 的 402 行为一致)。Swagger UI 入口 GET /docs 实测 200。

十三、常见问题(FAQ)

Q1:GET /api/table/{tableId}/record 返回 404?

实测路由需要尾斜杠:GET /api/table/{tableId}/record/ 返回 200。这是本版本路由实现的真实行为(规范 servers 指向 /api、路径为 /table/{tableId}/record,实测不带斜杠 404)。同理记录删除等接口按实测路径写。

Q2:API 返回 402 payment_required?

该功能需要商业许可(实测 feature=automationEnable,自动化/工作流全组)。Standalone 未激活许可时创建/查询工作流均 402。处理:购买许可按官方流程激活,或评估期跳过自动化项。

Q3:个人访问令牌调用表接口 403?

令牌作用域(scopes)只定义能力上限,资源访问还要在项目/表上对令牌单独授权(实测 table|read 令牌读表仍 403 restricted_resource)。处理:在网页端把令牌加入对应项目的协作者,或改用会话 Cookie 调用。

Q4:字段选项校验报错怎么办?

1.10.0 对字段选项校验严格(实测三例:单选颜色枚举、date 的 formatting 必填、timeZone 必填且不可 null)。建议先用网页端建样例字段再读回 options 作为模板;公式表达式必须用字段 ID({fldXXXX}),用字段名报 Formula references not found。

Q5:删除记录为什么没进回收站?

实测本版本记录删除不产生 trash 项(/api/trash 返回空);回收站实测作用于空间/项目级删除(接口参数 resourceType=space|base)。重要记录删除前先做项目备份(《Teable Docker Compose 部署指南》5.4)。

Q6:表单提交接口返回的字段 ID 是什么?

表单提交(form-submit)按字段 ID 写入(实测 fldGQWDqOgoU5f9WBfk 对应「任务名称」)。先从建表/字段接口拿到字段 ID 映射再构造提交体。

十四、参考链接

  1. 官方 API 文档(749 端点规范同源):https://help.teable.ai/en/api-doc/token (查询日期 2026-10-18)
  2. 本实例 OpenAPI 规范:GET http://<服务器>:8105/docs-json(Swagger UI:/docs)
  3. 官方字段类型参考:https://help.teable.ai/en/basic/field/field (查询日期 2026-10-18)
  4. 官方自动化文档:https://help.teable.ai/en/basic/automation/ (查询日期 2026-10-18;自托管需许可)
  5. 关联文档:《Teable Docker Compose 部署指南》(环境与部署)、《Teable 1.10 配置参数详解》(参数与故障行为)、《Teable 1.10 介绍与选型指南》(版本与架构)