Giter VIP home page Giter VIP logo

docs's Introduction

LeanCloud Documentation

Build Status devDependency Status

LeanCloud 开发者文档

技术咨询

与开发相关的技术问题,请直接到 LeanCloud 论坛 中提问。使用 LeanCloud 商用版的用户,请 提交工单。若文档内容有误,可以直接在文档页面上留言或提交 Github Issue。

说明

这个项目是 LeanCloud 文档 上的所有文档的 Markdown 格式的源码,通过转换最终被渲染成 HTML 文档。因此 Markdown 文件里部分链接写的是最终渲染后的链接,如果直接点击会出现 404 错误。

贡献

我们欢迎所有用户提交 PR 或 issue 为我们贡献或者修正错误,LeanCloud 衷心感谢您的贡献。

贡献方法及注意事项

  • fork 这个项目
  • npm ci 安装相关依赖
  • 执行 npm run preview 可以本地预览
  • 修改 /views 目录中的文档
    • /views 中是模板文件,会被编译为 /md 目录中对应的文档文件。
    • 模板支持嵌套,如 /viewsa.md 是可以被嵌套在 a.tmpl 中,方法参见下文 [一套模板多份渲染](#一套模板多份渲染)。
    • 相关图片放在 /images 目录中,引用格式为 ![图片文字说明](images/livekit-gifts.png)
    • 由于文档会经过 Nunjucks 和 AngularJS 渲染,当文档中需要显示 {{content}} 这种格式时,需要:
      • 在文档开头增加 {% set content = '{{content}}' %},如果没有声明 Nunjucks 会将其渲染为空白。
      • 在正文中加上 <span ng-non-bindable>{{content}}</span>,避免被 AngularJS 渲染。
  • 新增一个文档
    • 命名使用中划线和小写字母,如 livekit-android.mdquick-start-ios.md
    • 如需要,更新文档首页 templates/pages/index.html 和顶部导航菜单 templates/include/header.html
  • 修改文中标题或文件名称
    • 确认要修改的标题 h1-h6 或文件名称有没有被 /views/templates 目录下任何文件所引用,以免产生断链。  - 系统自动生成的 h1-h6 标题的 id,将所有空格、中西文标点替换为由数字和减号组成的 hash 值。在编写 Markdown 需要引用这些标题时,要将原文中的连续空白替换成一个减号即可,例如引用标题 ## 使用 SSO 登录 时,应写为 请参考 [SSO 登录](#使用-SSO-登录),以数字开头的标题要先在前面加个下划线,比如标题 ### 601 引用写为 [错误码 601](#_601)
  • 提交修改并发起 Pull Request,可以参考 Git Commit 日志风格指南

目录结构

├── README.md                          // 说明文档
├── custom                             // 文档页面样式及 JavaScript 代码
├── images                             // 文档中引用的所有图片
├── md                                 // 临时目录(文档均为自动生成,因为不要修改)
├── dist                               // 编译之后生成的文件将会在此目录下
├── private                            // 未完成、未发布的文档临时保存在这里,以便让重建全站文档索引的系统任务忽略这些文件
├── react                              // 文档评论功能所需要用的 React 组件
├── server_public                      // 文档评论功能所需要用的 React 组件
├── templates                          // 文档网站的 HTML 页面模板
├── views                              // Markdown 格式文档的模板文件和源文件,使用时会被编译到 md 目录中
├── app.coffee
├── app.json
├── CHANGELOG.md                       // changelog 记录
├── circle.yml
├── CONTRIBUTING.md                    // 贡献指南
├── package.json
└── ...

预览

开发服务基于 Grunt,所以需要有 Nodejs 环境,通过 NPM 安装测试需要的依赖

安装 Grunt

$ sudo npm install -g grunt-cli

安装需要的依赖

$ npm ci

本地启动一个 HTTP Server,然后打开浏览器访问 http://localhost:9000 即可

$ npm run preview

注意保持网络畅通(如有必要请使用代理),因为部分 Native 依赖在网络不畅的情况下无法获取预编译文件,会触发本地编译,耗时较长,也有较大几率会编译失败。

特殊语法

Nunjucks 模板

Nunjucks 模板语法类似 Jinja,详见官方文档

多语言多平台共享文案解决方案 1 - 使用预编译宏

单个产品线包含的单个子模块的文档只拥有一份文字描述文档,而多平台/多语言/多运行通过内置的拓展语法/前端展现来实现切换。

即时通讯开发指南就采用了这种方案。 比如即时通讯开发指南第一篇对应文档 realtime-guide-beginner.md,在它内部通过 Web 前端技术的来做不同语言的示例代码切换。

切换按钮如下图:

image

导入预编译宏

{% import "views/_helper.njk" as docs %}

不同语言中定义的功能一致但是名称不一致的类名

例如存储对象 AVObject:

iOS Android js php python c#
AVObject AVObject AV.Object LCObject LeanCloud.Object AVObject

在文档中使用如下方式,前端会自动根据当前用户选择实例代码来渲染类名:

  1. 首先在 views/_helper.njk 里面添加如下字典:
     {% macro useStorageLangSpec() %}
       {{ useLangSpec('AVObject',[
         { lang: "js", value: "AV.Object" },
         { lang: "objc", value: "AVObject" },
         { lang: "java", value: "AVObject"},
         { lang: "cs", value: "AVObject"},
         { lang: "php", value: "LCObject"},
         { lang: "python", value: "LeanCloud.Object"}
       ])}}
     {% endmacro %}
    
  2. 然后在文档开头指定默认的语言:{{ docs.defaultLang('js') }},这样就是告知文档引擎当前文档需要开启自动切换类名的开关。

这意味着你在全文任何地方只要单独编写了如下 `AVObject`这样的独立字段都会根据语言切换,实例代码的变量名和类名不会受到影响

不同语言存在小部分文字描述不一致

例如有一部分配置文件是某一个平台独有,而其他平台没有的,这部分可以用如下方式来编写:

{{ docs.langSpecStart('js') }} 

这里的内容只有在用户选择 js 示例代码的时候才会显示

{{ docs.langSpecEnd('js') }} 

为文档设置默认的语言

{% import "views/_helper.njk" as docs %} 之后可以引入如下内容:

{{ docs.defaultLang('js') }}

这样设置表示当前文档的默认首选语言是 js。

多语言多平台共享文案解决方案 2 - 内容集中到一份 tmpl 文件,每个语言 md 文件仅作骨架

这种方案下,所有的内容都在 topic.tmpl 下,不同语言主要依靠模板的 if else 结构支持:

{% if platform_name === "JavaScript" %}
// Code here
{% endif %}
{% if platform_name === "Swift" %}
// Code here
{% endif %}

topic-lang.md 只有两行,一行是继承 topic.tmpl,一行是指定当前 lang (赋值 platform_name 变量),除此以外没有其他新增内容。

{% extends "./leanstorage_guide.tmpl" %}
{% set platform_name = "JavaScript" %}

新文档可以根据需求酌情选用方案 1、方案 2。

多语言多平台共享文案解决方案 3 - 一套模板多份渲染

目前还有部分旧文档采用这种方式编写。

这个和上面一种方案类似,只不过不同语言特有内容并不通过 if else 结构包含在 topic.tmpl 内,而是采用如下方式「占位」:

{% block <blockName> %}{% endblock %}

然后在 topic-lang.md 中写入具体内容:

{% block <blockName> %}具体内容{% endblock%}

使用这种方案的情况下,可以通过 node server 命令运行一个简单的辅助工具,帮助编写文档。 使用步骤如下:

  1. 使用浏览器打开 http://localhost:3001,将会看到一个「选择模板」的下拉列表框,该列表框里会显示 views/<tmplName>.tmpl 的所有模板文件,文件名的 tmplName 部分是下拉列表框选项的名称。选择你需要编写的模板(比如 leanengine_guide)。
  2. 你会看到模板文件被读取,其中所有 {% block <blockName> %}<content>{% endblock %} 部分的下面都会有一些按钮。这些按钮表示该「模板」拥有的不同「渲染」,也就是对应的 views/<tmplName>-<impl>.md 文件,文件名的 impl 部分是按钮的名称。
  3. 点击对应的按钮,即可看到「渲染」文件中对应 block 的内容已经读取到一个文本域中,如果为空,表明该「渲染」文件未渲染该 block,或者内容为空。
  4. 在文本域中写入需要的内容,然后点击保存,编写的内容就会保存到对应的「渲染」文件的 block 中。
  5. 最后建议打开「渲染」文件确认下内容,没问题即可通过 grunt serve 查看效果。当然整个过程打开 grunt serve 也是没问题的,它会发现「渲染」文件变动后重新加载。有问题请与 [email protected] 联系。

文档上线

请保证 master 分支处于随时可发布状态。 如果相应功能或修复尚未上线,可以使用 draft pr,或者在 pr 标题注明「DO NOT MERGE」之类的字样。 PR 合并后,要让改动最终生效还需要通过 Jenkins 执行 cn-avoscloud-docs-prod-ucloud 任务进行发布。

License

LGPL-3.0

docs's People

Contributors

aisk avatar binaryhb avatar daweibayu avatar debugger87 avatar dependabot[bot] avatar hjiang avatar juvenn avatar jwfing avatar jysperm avatar killme2008 avatar kylinbin avatar lbt05 avatar leeyeh avatar liuchong avatar lzwjava avatar myleslee avatar nicecui avatar onerain88 avatar sdjcw avatar sdjdd avatar sparanoid avatar sunchanglong avatar sunng87 avatar sxiaoxu avatar tang3w avatar ufosky avatar wangxiao avatar weakish avatar ylgrgyq avatar zapcannon87 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

docs's Issues

整理文件結構

現在 custom/ 和 fonts/ 和 images/ 是混著用的,有多處文件重複

Ubuntu 下字形問題

之前在 V2 提过一次,你们的文档在 Ubuntu 14.04 的 Chrome 下,文字大小不一致。

感觉文档有点分散

一般来说我是直接看的对应平台的xx指南,但其实有时候有些重要的东西在总览里面才有,希望能够合并到一起,方便查看,如果合并比较麻烦,可以考虑在xx指南里面写出相应标题,给出链接也行(虽然指南顶部有总览的链接,但并不方便查看 给出具体标题也是好的)

另外,如上所说 总览里面的REST推送部分,竟然包含了我找了很久的 Android平台 推送返回的json格式(一直到我实际测试得到json结果后无意中才看到这个部分) 所以我希望能够改进一下 :)

在所有文檔上增加當前文檔最後的更新時間

-> https://github.com/leancloud/avfr/issues/176

freewing99 commented on Jan 13
精确到天即可,这个时间在html渲染的时候,读取一下github上 当前的 md 文档最后被更新的时间即可。
格式我建议是:2015-01-04 这种国际通俗易懂的即可。

wangxiao commented on Jan 13
好建议,文档更新日期挺重要的。

sunchanglong commented on Jan 14
上次 @sparanoid 还说加一个 文档的 对应 GitHub 地址

sunchanglong commented on Jan 14
如果在加上 一个类似 History 链接呢

sparanoid commented on Jan 14
當時我參考了 Linode 的文檔:
https://www.linode.com/docs/getting-started

wangxiao commented on Jan 14
行,就是有个「文档更新历史」之类的可查的链接也行。

sparanoid commented on Jan 14
我覺得主要目的是可以讓用戶看到我們的文檔有錯誤或者不足時直接就可以轉到 GitHub 那邊 fork 或者提 issue(大概就是 Linode 那樣)

wangxiao commented on Jan 14
更新时间也很重要的。
我之前基于 Google 开发就遇到过类似问题,前一天还支持的接口,第二天发现文档里面找不到了,
后来看了下更新日期,才发现晚上更新了文档。
文档变成新的接口了,没有更新日期的化,真是死无对证了。

sunchanglong commented a day ago
尝试了利用 GitHub API ,获取更新日期以及相关信息,在 build 文档的时候处理。
1 get contents by md dir path.
2 遍历每个 md 文件的 commit 信息。(path = md 文件名)
可以实现,但是遇到 API rate limit 的问题,build 多次就会出问题。暂时还没有想到其他方案。

规范文档排版

@leancloud/developers

文档这个 repo 在创建初期的时候,由于多人撰写导致排版、格式很不规范,我统一使用了 vinta/paranoid-auto-spacing 用来自动规范排版。这个 lib 的主要功能就是在应该有空格的地方加上空格,让文档总体上看起来舒服一些

但这并不是一个完美的解决方案

比如我们的文档中经常会有全角/半角标点用错:

LeanCloud平台提供了一个移动App的完整后端解决方案,我们的目标是完全消除写 后端代码和维护服务器的必要性.

我们的 JavaScript SDK 基于流行的 Backbone.js 框架.它与已经存在的 Backbone程序是兼容的,只需要在你的代码中做出一点点改变,我们的最小化 配置,让你很快地用在LeanCloud上使用JavaScript和HTML5.

又或者名词大小写不规范的情况出现:

公开AVAnalytics.h头文件,osx可以使用统计功能了。

在LeanCloud上你可以为你的每一个移动应用创建一个App,每一个App都有它专属 的App id和App key.你在LeanCloud上的账户可以容纳多个App.对每一个应用你都 可以部署不同的版本到测试或生产环境.

单纯的选择自动排版,只会让我们和贡献者继续忽略这些细节,所以从现在开始,我 禁用掉了 pangu.page_spacing();,这样各位可以明显的看出来哪些文档还有排版问题,希望各位可以在今后的修改中陆续完善现有文档的排版、并将这个传统保持下去

谢谢大家

下面是有用的链接:

补充 AV.Object.extend() 只能用在全局变量的说明

JS 保存保量一节

var GameScore = AV.Object.extend("GameScore");
var gameScore = new GameScore();
gameScore.set("score", 1337);
gameScore.set("playerName", "Sean Plott");
gameScore.set("cheatMode", false);

开发者很容易在局部变量使用,造成栈溢出。

补充文档:用户扩展多媒体消息,一级字段只能有_lctype 和_lcattrs,其它字段得放在_lcattrs

Android 的设计是通过反射获取成员,_lctype 之外可以有其它任意的一级字段。

iOS这边是 TypedMessage 的一级字段只能有_lctype,_lctext和_lcattrs、_lcloc原有的属性,因为定义了一个大的对象,AVIMDynamicObject,里面有所有location,attrs等,然后从里面得到 json 。所以,当定义了如 nickname 的一级字段的时候,无法生成相应的content。

iOS 改成 Android 那样估计略麻烦,而且这么自由没多大必要。所以,建议补充文档:

用户自定义消息,一级字段只能有_lctype 和_lcattrs,扩充的其它字段得放在_lcattrs

Android 自定义消息的参考实现,
https://github.com/leancloud/leanchat-android/blob/master/app/src/main/java/com/avoscloud/chat/entity/AVIMUserInfoMessage.java

iOS 自定义消息的参考实现,

https://github.com/leancloud/leanchat-ios/blob/master/leanchat-ios/AVOSChatDemo/models/AVIMUserInfoMessage.m

对于这种情况可以讨论一下,

@ufosky @lbt05 @jwfing

没问题的话,就得补充下文档了。已经有用户掉坑里了。

增加字段客户端不可见的说明

该字段是否可以通过 equalTo 来查询。当 include 时,该字段是否也会被 include 进去,出现在返回结果中。举一两个使用例子?

用户说到一个挺好的例子,匿名发帖,把真实作者的字段设为客户端不可见。

@killme2008

导出数据描述不准备

导出数据
这里对于导出数据的描述不准确

我们还支持您可以导出所有的应用数据(不包括用户密码)

这里应该是

我们还支持您可以导出所有的应用数据(包括加密后的用户密码)

IMClientCallback应该为AVIMClientCallback

Android实时通信SDK文档中

AVIMClient imClient = AVIMClient.getInstance("Tom");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了(假设为 MainActivity)。
      Intent intent = new Intent(currentActivity, MainActivity.class);
      currentActivity.startActivity(intent);
    };
  }
});

这一段里的new IMClientCallback(){...}应该改为new AVIMClientCallback(){...}
前者不存在这个类。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.