{"id":19036115,"url":"https://github.com/tx7do/kratos-cms","last_synced_at":"2025-04-04T22:03:38.119Z","repository":{"id":65594564,"uuid":"529050394","full_name":"tx7do/kratos-cms","owner":"tx7do","description":"go-kratos Headless CMS","archived":false,"fork":false,"pushed_at":"2025-01-08T14:16:22.000Z","size":36345,"stargazers_count":171,"open_issues_count":3,"forks_count":29,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-03-28T21:04:15.847Z","etag":null,"topics":["antd","antd-design","blog","cms","flutter","golang","kratos","microservice","vben","vben-admin","vue3","vue3-admin","vue3-typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tx7do.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2022-08-25T23:33:30.000Z","updated_at":"2025-03-26T03:23:26.000Z","dependencies_parsed_at":"2023-10-29T16:24:04.044Z","dependency_job_id":"70ce7944-8107-46c0-bcc7-320cfceb2a57","html_url":"https://github.com/tx7do/kratos-cms","commit_stats":null,"previous_names":["tx7do/kratos-blog"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tx7do%2Fkratos-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tx7do%2Fkratos-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tx7do%2Fkratos-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tx7do%2Fkratos-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tx7do","download_url":"https://codeload.github.com/tx7do/kratos-cms/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247256104,"owners_count":20909240,"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":["antd","antd-design","blog","cms","flutter","golang","kratos","microservice","vben","vben-admin","vue3","vue3-admin","vue3-typescript"],"created_at":"2024-11-08T21:53:19.246Z","updated_at":"2025-04-04T22:03:38.101Z","avatar_url":"https://github.com/tx7do.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 克拉托斯波克 Kratos-Blog\n\n一个Golang的博客系统/CMS。\n\n- 后端基于 [golang](https://go.dev/) + [go-kratos](https://go-kratos.dev/)\n- 前端基于 [VUE3](https://vuejs.org/) + [TypeScript](https://www.typescriptlang.org/)\n\n## 项目结构\n\n| 子项目名 | 项目路径                                                                    |\n|------|-------------------------------------------------------------------------|\n| 后端   | [/backend](https://github.com/tx7do/kratos-blog/tree/main/backend)      |\n| 管理前端 | [/admin](https://github.com/tx7do/kratos-blog/tree/main/frontend/admin) |\n| 展现前端 | [/view](https://github.com/tx7do/kratos-blog/tree/main/rontend/app)     |\n\n## 管理后台截图\n\n- 登陆界面\n\n![登陆界面](./frontend/admin/docs/kratos-blog-login.png)\n\n- 分析页面\n\n![分析页面](./frontend/admin/docs/kratos-blog-analysis.png)\n\n- 博文列表\n\n![博文列表](./frontend/admin/docs/kratos-blog-posts.png)\n\n- 写文章\n\n![写文章](./frontend/admin/docs/kratos-blog-write-post.png)\n\n- 评论列表\n\n![评论列表](./frontend/admin/docs/kratos-blog-comments.png)\n\n## 博客基本功能设计要点\n\n### 文章（Post）\n\n博客系统的“文章”，正确的英文表达是post，英文单词里post和article的区别在于，post只是随心所欲写的文章，而article指的是论文那样的经过精心雕琢，旁征博引，并且有可能在学术期刊上发表的文章。\n\n文章需要具备：标题、Slug、创建时间、发布时间、修改时间、摘要和内容等要素，也会包含所属分类、标签、阅读量和点赞量等次要信息。\n\nSlug是博客的特色，它指的是一篇文章的URL。例如：文章：《Try the New Azure .NET\nSDK》，它的URL为 \u003chttps://edi.wang/post/2019/12/5/try-the-new-azure-net-sdk\u003e，其中**try-the-new-azure-net-sdk**\n即为该文章的Slug。Slug讲究的是 **“人类可读”**\n，一般情况下均为博客标题对应的英文表达，用中划线分割英文单词，Slug也对博客的SEO起到了关键作用。如果你的博客文章用的是数据库ID、文章标题的HTML\nEncoding等做URL，请更换为Slug。特别是遇到中文文章，如果标题被URL\nEncoding了，那么对于SEO和链接分享，都是灾难。一个Slug一旦定下，尽量不要改动，虽然大部分博客系统都支持修改Slug，但是对于被搜索引擎收入的文章，改了Slug就会导致404。比较完备的博客系统（如WordPress）支持采用301重定向方式告诉搜索引擎原文地址已变化。\n\n摘要有两个作用，一是用于在列表视图中显示文章信息预览，二是用于SEO，放在description这个meta标签中，可以帮助搜索引擎精准定收入的内容。对于中文内容，需要注意是否输出的HTML源代码被Encoding过，ASP.NET\nCore默认的Encoding会对SEO造成灾难（我的博客系统因为面向英语用户，不考虑中文支持，所以并不解决这个问题）。摘要可以自动抓取文章前几百字，也可以像微信公众号那样要求用户手工填写。我的博客采用的是自动取文章前400字。结合SEO的关系，我的文章通常开头段落就是概要，这样可以让用户在搜索引擎预览页面就能看到准确内容，而不是页面上无关紧要的UI元素。\n\n文章的状态通常包括：草稿、发布、回收。用户仅能看到已发布的文章，管理员可在后台更改文章状态。\n\n### 评论（Comment）\n\n评论是博客中作者和读者互动的主要方式。有些博客要求读者登录后才能发表评论，而有些可以允许游客评论。登录的好处在于可以识别你的读者，并有效防止垃广告评论。但要求登录也会给用户造成操作上多了一个步骤，嫌麻烦的用户就不会进行评论。\n\n### 分类（Category）\n\n像建文件夹一样将文章根据内容进行区分，即为分类。文章分类后，可以帮助读者快速检索同种类的文章。分类的另一个功能就是产生 OPML\n及 RSS/Atom 订阅源。\n\n分类需要一个标题、一个简介，以及一个路由名称。\n\n### 标签（Tag）\n\n一篇文章所提到的话题，即为文章的标签。和分类一样，标签也是多对多关系。标签可以作为检索文章的依据，类似关键词，快速查找相关内容的文章。\n\n标签云（Tag Cloud）是博客中用来列出最热门标签的功能。通常使用跟大号字、更明显的颜色来标识出对应文章较多的标签。标签云可以作为博客博主的个性化属性，一眼就能看出博主热衷于什么话题。\n\n### 归档（Archive）\n\n以时间（年、月、日）整理的博客文章即为归档，它和分类的区别在于归档只以时间为标准来划分文章。Archive的SEO相对于文章、分类、标签来说，并不那么关键。所以除了URL可以按年月划分以外，并没有额外的讲究。\n\n### 页面（Page）\n\n页面是博客的可选功能之一，事实上，它更接近于CMS的功能。有些内容并不适合以文章的形式发布，比如“关于”页面。这样的页面通常与发布时候的时间无关，内容也经常更新，排版设计也非常自由，不单纯是文字。\n\n页面通常不需要评论、标签和分类等属性，但可以有发布和编辑时间。和文章一样，页面也需要注意Slug。\n\n### 订阅（Subscription）\n\n读者订阅博客的主要方式有Feed（RSS/ATOM）及Newsletter。Feed方式本质上是被动订阅，需要客户端软件发起请求给服务器，检查是否有新文章发表，才能显示到客户端里。Newsletter一般采用Email形式主动发送给订阅用户，但这要求博客系统的编写者实现Email订阅功能，也要求管理员维护Email服务。订阅一般只推送近期发表的新文章，例如前10、20篇，而不会每次都推送全部文章导致客户端爆炸。\n\n订阅一般可按文章分类提供，以便于只对某些分类感兴趣的读者阅读。有些博客系统也提供文章评论的订阅源，以便读者观摩吐槽大会。\n\n### 版本控制（Version Control）\n\n更接近CMS的博客系统通常提供版本控制功能，允许用户回滚文章或页面的历史版本。设计版本控制的时候，不能只考虑往前回滚，得还能再滚得回来。通常，用户每次编辑一篇已经写好的文章，就会产生一个新版本，类似于git对于一个文件的commit。博客的版本控制也类似于代码版本控制，你可以选择保存一篇文章的完整内容作为历史版本，也可以选择每次只保存变化量信息（delta）。保存完整内容不容易后续花费大量时间精力\n，但是会占用较多存储空间。保存内容变化量节省数据库空间，但实现代码容易占用大量精力。\n\n### 主题及个性化（Theme）\n\n好用的博客系统通常支持主题，毕竟个性化是博客本身应有的特点之一。WordPress积累了大量的主题库，也允许自制主题。\n\n### 用户及权限（User \u0026 Permission）\n\n博客系统分为个人、团队及博客平台。个人博客系统一般为：单用户，不需要设计权限、注册等功能；多用户博客，则需要实现不同的角色和权限，比如博客管理员、审核专员、撰稿人、评论管理员等等。\n\n### 插件（Plugin）\n\n插件功能可以在不更改博客代码的情况下，按需拓展博客的功能。\n\n### 图片及附件的处理（Attachment）\n\n图片一般有3个地方存放：文件系统、数据库、云上OSS存储服务。\n\n### 敏感过滤及评论审查\n\n### 静态化（Staticize）\n\n静态化技术，即将服务端渲染完的页面保存为真正的HTML文件于磁盘上，Web服务器只需要传输静态文件，而不需要做其他工作，比如访问数据、脚本语言解析执行等，因此效率非常高，也极大减小了服务器的压力。\n\n### 通知系统（Notification）\n\n博客通可以通过Email、IM机器人，甚至语音的形式给管理员或用户发送通知。\n\n## 参考资料\n\n* [博客系统知多少：揭秘那些不为人知的学问（一）](https://mp.weixin.qq.com/s?__biz=MzU0MTA2MTkwMQ==\u0026mid=2247484915\u0026idx=1\u0026sn=b38ce4fc93cfce88a2f536db93862b77\u0026chksm=fb2ee391cc596a87176bbfa206fb3b90db0f5af7ac752a1f1eb5aad8df6ed477baa92a4b6250\u0026scene=21#wechat_redirect)\n* [Halo博客系统](https://halo.run/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftx7do%2Fkratos-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftx7do%2Fkratos-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftx7do%2Fkratos-cms/lists"}