BaseFile (Doc)

BaseFile 本质上是一个dict类型的数据,是Bitcron上每个文件对应的数据,不论是d.get_doc直接获得,还是 Post 或者 Image, 最基础的数据本身就是一个BaseFile

基础属性

key 说明
type 文档的类型,比如`post`、`image`、`template`、`file`、`folder`、`folder_doc`、`scv` .etc的其中一种
path 文件相对于网站的路径,全小写
real_path 同`path`,但尽可能保留原始的大小写
filename 仅文件名,包含后缀,但是不包含其所在目录的其它路径信息。
ext 文件名后缀,比如`js`、`txt`、`css` .etc
images_count 文件夹内包含的所有图片数 (遍历所有子文件夹), 如果是image类型,则恒等于1
_images_count 仅仅 `folder` 类型才有的字段,表示直接所属的文件夹内有多少张图片
posts_count 文件夹内包含的所有文章数 (遍历所有子文件夹), 如果是post类型,则恒等于1
_posts_count 仅仅 `folder` 类型才有的字段,表示**直接所属**的文件夹内有多少篇文章
is_dir True/False, 表示是否是一个文件夹

系统属性

如非特别场合,一般用不到。

key 说明
id 文档ID
version 文档的版本哈希值
site_id 所属站点的ID
account_id 所属账户的ID
size 文件大小,类型为`int`
sys_date 在Bitcron系统内的最后修改时间

复合属性

复合属性所指的字段,这并非BaseFile上的原始数据,只要在调用的时候才会生效,比如post.category是能获得有效的category对象,而post.json进行JSON化时,其中则是没有category这个字段的。

url

返回文档的URL,比如一篇文章详细地址、一张图片的可浏览地址。

raw_file_content

文档本身对应的原始内容。

category

表示文档所在目录对应的文件夹的Category对象
注意: 这里的category与变量空间posts.category下是有区别的,posts.category是根据当前URL自动判别的,而这里的category则是当前文件所在的文件夹决定的。

comments

表示当前文档对应的评论列表,数据类型为list,list内的每个comment为一个dict类型,一般有以下属性:

key 说明
author 评论者的名称
date 评论日期
ip 评论者的IP地址
site 评论者留下的网站地址(可能为空)
content 评论的内容
email 评论者的邮箱地址 **(非特殊情况,不要进行曝露!)**

注意: comments 实际上对应的是一个csv文件,一般在网站的文件管理器内,/_comments/下能找到对应的评论文件。

comments_as_html

默认自动将comments视觉化,并有提交评论的表单。
具体的源码实现,可以参见本文末的

comments_as_html 的实现

仅做参考,一般不建议重新实现一遍Bitcron的评论机制。

mixin one_comment(comment)
    li.comment: .comment_wrapper
        .author
            if comment.email and account.is_admin_email(comment.email)
                author_name = comment.author or site.configs.admin_name or 'Admin'
            else
                author_name = comment.author
                if not author_name and comment.email
                    author_name = comment.email.split('@')[0]
                author_name = author_name or 'Anonymous'
            avatar = site.visitor_avatar if comment.author else site.admin_avatar
            avatar = account.get_avatar(comment.email, match=True) or avatar
            .avatar: img(src=avatar)
            .author-name
                if comment.site
                    a(href="{{comment.site or '#'}}", rel="external nofollow")
                        b= author_name
                else
                    b= author_name
            .author-date
                small= comment.date("%Y-%m-%d %H:%M:%S")
        .comment_content= comment.content.plain_html

+_('Comments', '发表评论', 'zh_cn')
+_('Write a Comment', '撰写评论', 'zh_cn')
+_('Submit!', '提交评论', 'zh_cn')
+_('Name', '昵称', 'zh_cn')
+_('Email', '邮箱', 'zh_cn')
+_('Website', '网站', 'zh_cn')

+h.load('/fb_static/api/comment/style.css')

.doc_comments: .doc_comments_wrapper
    .comments_block_title= _('Comments')
    form#new_comment_form(method="post", action="/service/comment/new")
        input(name="path", type="hidden", value=doc.path)
        .comment_trigger
            .avatar: img(src=site.visitor_avatar)
            .trigger_title= _('Write a Comment')
        .new_comment
            textarea.textarea_box(name="content",rows="2")
            span.comment_error
        .comment_triggered: .input_body
            if not request.is_login: ul.ident
                li: input(type="text", name="author", placeholder=_('Name'))
                li: input(type="text", name="email", placeholder=_('Email'))
                li: input(type="text", name="site", placeholder=_('Website'))
            input.comment_submit_button(type="submit", value=_('Submit!'), class="c_button")

    ul.comments: for comment in doc.comments
        +one_comment(comment)

    +h.load('jquery')
    +h.load('/fb_static/lib/js.cookie.js')
    +h.load('/fb_static/api/comment/script.js')