{"id":13469844,"url":"https://github.com/leancloud/docs","last_synced_at":"2025-07-23T11:37:58.472Z","repository":{"id":255134646,"uuid":"848643525","full_name":"leancloud/docs","owner":"leancloud","description":"LeanCloud Documentation","archived":false,"fork":false,"pushed_at":"2025-04-15T02:54:32.000Z","size":121554,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-15T03:35:03.677Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"MDX","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leancloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-28T06:19:38.000Z","updated_at":"2025-04-15T02:54:34.000Z","dependencies_parsed_at":"2025-04-15T03:40:49.995Z","dependency_job_id":null,"html_url":"https://github.com/leancloud/docs","commit_stats":null,"previous_names":["leancloud/docs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/leancloud/docs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leancloud%2Fdocs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leancloud%2Fdocs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leancloud%2Fdocs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leancloud%2Fdocs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leancloud","download_url":"https://codeload.github.com/leancloud/docs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leancloud%2Fdocs/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265281038,"owners_count":23739859,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["documentation","leancloud","leanengine"],"created_at":"2024-07-31T16:00:17.559Z","updated_at":"2025-07-14T10:39:49.519Z","avatar_url":"https://github.com/leancloud.png","language":"MDX","funding_links":[],"categories":["CSS","JavaScript"],"sub_categories":[],"readme":"# TapTap 开发者中心文档\n\n## 本地预览\n\n```sh\nyarn\nyarn start\n\n# 预览英文文档\nyarn start --locale en\n\n### 国际版预览中文文档：\nyarn start --locale zh-hans\n```\n\n注意：`yarn start` 并不会检查坏链。如需检查坏链，需要运行 `yarn build`。坏链检查只会检查文档内部链接指向的页面是否存在，不会检查指向第三方网站的外部链接，也不会检查页内链接（hash link）。\n\n## 贡献\n\n我们欢迎所有 LeanCloud 用户以及公司同事修改文档或提交 issue 为我们贡献或者修正错误，LeanCloud 衷心感谢您的贡献。\n\n**贡献方法及注意事项：**\n\n* 搭建本地开发环境，需要 [Node.js](https://nodejs.org/en/download/package-manager) 18.0 或更高版本 （可以通过运行 `node -v` 命令来查看本地 Node.js 版本）。你可以使用 [nvm](https://github.com/nvm-sh/nvm) 管理同一台计算机上安装的多个 Node 版本。\n* Fork 这个项目。\n* 切换到本地 master 分支，git fetch 拉取远端最新修改到本地，如果远端 master 分支有修改，则将本地 master 分支 rebase 到最新的 master 分支上。\n* 在 master 上新建分支，在新分支修改文档。\n* 修改文档。\n  * 参考下文介绍的目录结构，在 docs（中文文档）目录下修改文档内容。\n  * 注意要同时在 i18n/en/docusaurus-plugin-content-docs/current（英文文档）目录下同步修改英文文档。\n  * 插入配图、图表和 PPT 等，可参考下文详细介绍。\n* 预览文档。运行 `yarn` 命令安装所需要依赖，运行 `yarn start` 命令可以本地预览。\n* 预览没问题后，提交修改并发起 Pull Request，并指定 Reviewer。\n  * Reviewer 同意修改后，才可以合并 Pull Request。\n  * Pull Request 合并后，会自动发布上线。\n  * Pull Request 合并后，可删除当前分支。\n* 文档规范可参考 [中文文案风格指南](https://blog.taptap.dev/pages/chinese-copywriting-guide)。\n\n## 目录结构\n\n```\n.\n├── docs                                     中文文档\n│   ├── ddos.mdx                             隐藏文档\n│   └── sdk                                  顶栏菜单项\n│       └── start                            侧栏菜单项\n│           └── overview.mdx                 文档内容\n├── i18n\n│   └── en                                   英文文档\n│       ├── code.json                        UI 翻译（用于文档内容以外的地方，如文档搜索）\n│       ├── docusaurus-plugin-content-docs\n│       │   ├── current                      全部文档内容，需与 `docs`（中文文档）结构一致\n│       │   └── current.json                 侧栏菜单项翻译\n│       └── docusaurus-theme-classic\n│           └── navbar.json                  顶栏菜单项翻译\n├── static                                   静态文件\n│   └── img                                  文档配图\n├── sidebars.js                              菜单配置\n└── src\n    ├── docComponents                        自定义组件（用于文档内容，如多编程语言）\n    ├── pages                                文档以外的页面（目前只包含首页）\n    ├── styles                               一些共享样式\n    └── theme                                自定义组件（用于文档内容以外的地方，如文档搜索）\n```\n\n其中编辑人员常用的目录有：\n\n- `docs`（中文文档）\n- `i18n/en/docusaurus-plugin-content-docs/current`（英文文档）\n- `static/img`（文档配图）\n\n## 文档编写\n\n### 名称风格\n\n文件路径和文件名请注意和 URL 路径保持一致，比如 URL 路径为 `/docs/community/features/` 的页面，文件路径请使用 `/docs/community/features.mdx`。\n\n### 文档前言（元信息 metadata）\n\n位于文档头部可提供一些文档本身的信息，以 `---` 开头并以 `---` 结束。\n\n\u003e - `*` 为必填项，`[]` 为字段说明\n\u003e - 回退到 XXX：指如果没有设置该值则使用 XXX 作为替代\n\u003e - [完整文档](https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-content-docs#markdown-frontmatter)\n\n```markdown\n---\ntitle: *[正文的标题，同时也会显示在浏览器标签处]\nsidebar_label: [显示在左侧边栏的标题，回退到 title]\nsidebar_position: [数字，决定左侧边栏的顺序，数字越小越靠前]\nslug: [URL 路径，一般情况下无需指定，回退到文件路径]\n---\n\n\u003e 之后是你的文档内容\n```\n\n### 侧边栏\n\n仅「一级导航」有侧边栏，分别为「游戏商店」、「游戏服务」、「设计资源」，分别对应 `docs` 目录下的 `store`、`sdk`、`design` 文件夹。\n\n如需添加「一级导航」，请提需求到*技术支持*。如需添加次级导航，则需要调整目录结构，项目将自动以目录结构生成对应侧边栏（二级导航/.../N 级导航）。\n\n如果不想文档出现在侧边栏，则可以放在「一级导航」同级，其他文档可以通过[链接到其他文档](#链接到其他文档)进行跳转，但此时目标页将不会显示侧边栏。这些文档需要在 YAML header 指定 `slug`，以免未来移动位置后 URL 改变；还需要指定 `noindex`，这样文档不会被文档搜索系统收录。\n\n例子：\n\n```markdown\n---\ntitle: 客服系统\nslug: /sdk/tap-support/guide/\n---\n\n\u003chead\u003e\n  \u003cmeta name=\"robots\" content=\"noindex\" /\u003e\n\u003c/head\u003e\n```\n\n### 组件\n\n可以在 `src/docComponents/doc.tsx` 中编写 React 组件并在 Markdown 文件（下称 md 文件）中引入。目前项目中已预设了部分组件可直接使用。\n\n如需要其他预设，请提需求到*技术支持*。\n\n```md\nimport { Gray, Blue, Red, Black, FaqLink } from '/src/docComponents/doc';\n\n\u003cRed\u003e这些字将是红色\u003c/Red\u003e\n\u003cGray\u003e这些字将是灰色\u003c/Gray\u003e\n[\u003cFaqLink\u003e1. 开发者注册流程\u003c/FaqLink\u003e](/store/store-register/)\n```\n\n#### 多编程语言\n\n多种编程语言的代码示例可以使用 `MultiLang` 组件：\n\n````md\n\u003cMultiLang\u003e\n\n```cs\npublic static void GetAccessToken (Action\u003cAccessToken, TapError\u003e action);\n```\n\n```java\npublic static AccessToken getCurrentToken;\n```\n\n```objectivec\n+ (AccessToken *)getCurrentToken;\n```\n\n\u003c/MultiLang\u003e\n````\n\n注意：\n\n- 如果文件开头没有引入 `MultiLang` 组件，那么需要引入一下：`import { MultiLang } from '/src/docComponents/doc';`\n- `\u003cMultiLang\u003e` 后、`\u003c/MultiLang\u003e` 前，以及不同语言的代码片段之间都要空一行，否则 MDX 语法无法正确解析。\n- 语言的顺序为 C#、Java、Objective-C，不能乱。\n- 有些地方多语言代码示例使用 `Tabs` 组件，它的效果和 `MultiLang` 是等效的（实际上 `MultiLang` 最终会生成 `Tabs` 组件）。因为 `MultiLang` 更简洁，所以新编写的多语言代码示例推荐使用 `MultiLang`。\n\n实际上，`MultiLang` 里不仅可以放入代码片段，还可以放入其他各种组件，只需保证：1) 内容顺序为 C#、Java、Objective-C，2) 不同编程语言内容在组件层级上是同级的。下面是一个例子：\n\n````md\n\u003cMultiLang\u003e\n\u003c\u003e\n\n```cs\npublic static void Login (LoginType loginType, string[] permissions);\n```\n\n**LoginType 参数说明**\n\n| 参数             | 描述        |\n| ---------------- | ----------- |\n| LoginType.TAPTAP | TapTap 登录 |\n\n\u003c/\u003e\n\u003c\u003e\n\n```java\n/**\n* @param type TapTap = 0\n*/\npublic static void login(Activity activity, @LoginType.ThirdPartyType int type, String... permissions);\n```\n\n**LoginType 参数说明**\n\n| 参数 | 描述        |\n| ---- | ----------- |\n| 0    | TapTap 登录 |\n\n\u003c/\u003e\n\u003c\u003e\n\n```objectivec\n+ (void)login:(TapBootstrapLoginType)type permissions:(NSArray *_Nullable)permissions;\n```\n\n**LoginType 参数说明**\n\n| 参数                        | 描述        |\n| --------------------------- | ----------- |\n| TapBootstrapLoginTypeTapTap | TapTap 登录 |\n\n\u003c/\u003e\n\u003c/MultiLang\u003e\n````\n\n上面的例子中，我们使用了空标签 `\u003c\u003e...\u003c/\u003e`（React 的 `Fragment` 组件）将 C#、Java、Objective-C 的不同内容包成三组。\n同样，空标签和 markdown 之间也需要留出空行。\n另外，由于 Docusaurus 的 TOC 生成并不能正确处理这种情况下的小标题（仅会根据第一个标签的内容生成小标题，切换标签后 TOC 的内容不变），请不要在 `MultiLang` 标签中使用 `h1`、`h2`、`h3` 级别的标题。\n最后，某些文档面向的平台并不是 Unity、iOS、Android，这种情况下可以用 `kind` 参数指定使用 `MultiLang` 的变体，比如云引擎文档使用 `\u003cMultiLang kind=\"engine\"\u003e`，顺序为 JavaScript、Python、PHP、Java、C#、Go。\n\n#### 图表\n\n支持 [Mermaid](https://mermaid-js.github.io/mermaid/#/)。\n\n在文件开头引入 `Mermaid` 组件：\n\n```js\nimport Mermaid from \"/src/docComponents/Mermaid\";\n```\n\n然后在 `Mermaid` 组件的 `diagram` 属性中写 Mermaid 语法：\n\n```js\n\u003cMermaid\n  diagram={`\ngraph LR\nA((delete))--\u003e|beforeDelete|H{error?}\nH--\u003eY(Yes)\nY--\u003eZ((interrupted))\nH--\u003eN(No)\nN--\u003eB[delete object on the cloud]\nB --\u003e|afterDelete|C((done))\n`}\n/\u003e\n```\n\n#### PowerPoint 幻灯片\n\n在文件开头引入 `OfficeDoc` 组件：\n\n```js\nimport { OfficeDoc } from \"/src/docComponents/doc\";\n```\n\n然后在正文中插入组件：\n\n```js\n\u003cOfficeDoc fileUrl=\"https://icepro.oss-cn-shanghai.aliyuncs.com/file/sample.ppt\" /\u003e\n```\n\n### 文档中的链接、配图、文件\n\n#### 链接\n\n##### 链接到其他文档\n\n链接时使用基于对应语言文档根目录的绝对路径，**不要使用相对路径**。\n\n- `docs/sdk/taptap-login/features.mdx` 在其他 md 文件中跳转需写作 `[跳转标题](/sdk/taptap-login/features/)`\n- `docs/design/design-moment.mdx` 在其他 md 文件中跳转需写作 `[跳转标题](/design/design-moment/)`\n- `i18n/en/docusaurus-plugin-content-docs/current/sdk/taptap-login/features.mdx` 在其他 md 文件中跳转需写作 `[跳转标题](/sdk/taptap-login/features/)`\n- 标题跳转需要去除标点、将空格换成 `-` 并将大写字母改为小写，比如 `[\u003cFaqLink\u003e1. 如何进行游戏认领？\u003c/FaqLink\u003e](/store/store-creategame#我的游戏已经被 TapTap 收录，可以进行游戏认领吗？)` 应写作 `[\u003cFaqLink\u003e1. 如何进行游戏认领？\u003c/FaqLink\u003e](/store/store-creategame#我的游戏已经被-taptap-收录可以进行游戏认领吗)`\n\n##### 链接到外部网站\n\n- 要链接到 `https://docusaurus.io/`，在 md 文件中引用需写作 `[链接文本](https://docusaurus.io/)`\n\n#### 配图\n\n配图风格和规则参照 [Figma: DC 文档规范](https://www.figma.com/file/tbgT7SaWYfYkr6RPko9dZo/%E6%96%87%E6%A1%A3%E9%85%8D%E5%9B%BE-%E8%AE%BE%E8%AE%A1%E6%8C%87%E5%8D%97?node-id=0%3A1)，规范包括游戏界面处理、标注规则、流程图规则、敏感信息遮盖、多图排版。\n\n##### 在文档中插入图片\n\n- 要插入位于 `img/design-1.1.png` 的图片，在 md 文件中引用需写作 `![图片说明](/img/design-1.1.png)`\n- 要插入位于 `https://img.tapimg.com/market/images/c53d78b9b120276b53f82aebb0d01537.png` 的图片，在 md 文件中引用需写作 `![图片说明](https://img.tapimg.com/market/images/c53d78b9b120276b53f82aebb0d01537.png)`\n\n##### 如何用 Figma 为截图添加标注\n\n1. 在 Figma 中新建一个文件，将截图拖放或粘贴（\u003ckbd\u003ecommand\u003c/kbd\u003e \u003ckbd\u003eV\u003c/kbd\u003e）到页面中的任意位置。\n2. 打开[文档配图指南](https://www.figma.com/file/tbgT7SaWYfYkr6RPko9dZo/%E6%96%87%E6%A1%A3%E9%85%8D%E5%9B%BE-%E8%AE%BE%E8%AE%A1%E6%8C%87%E5%8D%97%E3%80%90%E8%AE%BE%E8%AE%A1%E3%80%91?node-id=113%3A91)，从中拷贝（\u003ckbd\u003ecommand\u003c/kbd\u003e \u003ckbd\u003eC\u003c/kbd\u003e）你想使用的标注组件。\n3. 回到前面新建的文件，粘贴（\u003ckbd\u003ecommand\u003c/kbd\u003e \u003ckbd\u003eV\u003c/kbd\u003e）刚刚拷贝的标注组件。\n4. 将标注组件拖拽到合适的位置并调整大小。\n5. 如果调整好大小之后发现标注组件的边框太细或者里面的文本/箭头太小，可以适当缩小原始截图的大小（注意缩放截图时要按住 \u003ckbd\u003eshift\u003c/kbd\u003e 以保持原始长宽比），然后重复第 4 步。\n6. 如果截图需要多个标注，请重复第 2 至 5 步。注意更新标注组件里面用作序号的文本。\n7. 选中所有元素（\u003ckbd\u003ecommand\u003c/kbd\u003e \u003ckbd\u003eA\u003c/kbd\u003e），然后按下 \u003ckbd\u003eoption\u003c/kbd\u003e \u003ckbd\u003ecommand\u003c/kbd\u003e \u003ckbd\u003eG\u003c/kbd\u003e（或者右击选中的内容，点击「Frame selection」）。此时包括截图和标注在内的所有元素会被包裹进一个 Frame（可以理解为其他平面设计软件中「画板」和「编组」的结合体）。\n8. 点击右侧面板最下方的「Export」，保持默认设置，点击「Export _Frame 名称_」（如果没有改过 Frame 名称，那么这里默认会显示为「Export Frame 1」）。\n\n##### Tips\n\n- 可以用 Chrome 插件 GoFullPage 截图，之后再使用 Figma 完成敏感信息遮盖、标注等，最后导出图片。\n- 一些需要绘制的图片：比如内嵌动态的很多图片，可以使用 UI/UX 同事的设计稿。\n- IDE 或编辑器界面的截图：底色参考配图规范，尽量展示完整的界面。\n\n#### 文件\n\n视频等大文件可以上传到 LC 华北节点的 capacity-center 应用（App ID：lhzo7z96ayhad9flpynyiu79t2jpzuasz2ke8cdb09zduvug）。\n\n0. 初次上传前，先找 jiangruoxu、suixiaoxu 加你为应用的协作者，之后即可通过 LC 控制台上传文件。\n1. 登录 LC 控制台 \u003e 数据存储 \u003e 文件：\u003chttps://console.leancloud.cn/apps/lhzo7z96ayhad9flpynyiu79t2jpzuasz2ke8cdb09zduvug/storage/file\u003e\n2. 点击「上传」按钮上传文件。上传完成后，文件表格中的 URL 即为文件的 URL。\n\n图片等小文件请直接提交至仓库。\n\n## 翻译相关\n\n### md 文档文件翻译\n\n请放在其他语言（如 `en`）文件夹「相同路径」下。如想翻译 `docs/tap-download.mdx` 文件，则需要把翻译文件放在 `i18n/en/docusaurus-plugin-content-docs/current/tap-download.mdx`。\n\n### 文件夹翻译（如有困难可直接联系技术支持）\n\n首先请确保通过 `_category_.json` 为文件夹设置了中文 label：\n\n```json\n{\n  \"label\": \"中文侧边栏名\",\n  \"collapsed\": true,\n  \"position\": 3\n}\n```\n\n在非中文 `docs` 目录下有一个 `current.json` 文件用来存放所有中文 label 对应的英文翻译。下面的示例展示了包含 `docs/sdk/taptap-login`（TapTap 登录）和 `docs/sdk/taptap-login/guide`（开发指南）这两个目录的翻译的 `current.json` 文件：\n\n```json\n{\n  \"sidebar.sdk.category.TapTap 登录\": {\n    \"message\": \"TapTap Login\",\n    \"description\": \"The label for category TapTap 登录 in sidebar sdk\"\n  },\n  \"sidebar.sdk.category.开发指南\": {\n    \"message\": \"Guides\",\n    \"description\": \"The label for category 开发指南 in sidebar sdk\"\n  }\n}\n```\n\n## 文档发布注意事项\n\n- 不支持 html 文件脚本，直接复制 markdown 过来的文件可能无法初始化\n- 仔细检查 sidebars.js 结构，可能无法初始化左侧导航栏\n- docusaurus.config.js/#themeConfig.items 可以配置多个 headerLinks，但是要与 sidebars.js 对应，否则无法初始化菜单栏\n- 即便是代码块包裹的 dom 节点，也会无法编译，导致整个 md 无法加载。可以尝试用 markdown 转义符'\\'试试\n- 用不到的内容尽量删除（git 会保留历史）而不是注释掉，因为翻译人员不一定熟悉 HTML 注释标记，可能因此做无用功。\n- 一定要本地运行一下，检查更改过的代码文件是否能正常打开再 pr\n- 若端口冲突，可手动修改 package.json#start 脚本；可以添加外部访问 ip 段，或者指定全部 docusaurus start --port 3000 --host 0.0.0.0\n\n## 优化图片\n\n运行 `yarn optimg` 任务可以优化 `img` 下的 JPEG（有损压缩）和 PNG 图片（无损压缩）。这一任务运行时间较长，所以未加入构建环节，需要手动运行。建议过一段时间（比如一两个月）跑一下。\n\n## 多版本\n\n按照以下流程增加一个版本（`N` 表示当前版本；请将 `N` 替换为具体的数值）：\n\n1. 确认当前仓库没有包含任何新版本（`N+1` 版本）的内容\n2. 新建一个分支，比如 `vN`，运行 `yarn docusaurus docs:version vN`\n3. 替换 `versioned_docs/version-vN/` 下的内链，替换的正则是 `\\]\\(/(sdk|store|design)` 替换值为 `](/vN/$1`\n\n## 其他文档\n\n[Docusaurus 文档介绍](https://docusaurus.io/zh-CN/docs/docs-introduction)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleancloud%2Fdocs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleancloud%2Fdocs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleancloud%2Fdocs/lists"}