Discourse 定制教程#2 - 开始定制
开始讲技术了
本文目的
看完后对 Discourse 的代码有一定概念。
包括使用的技术,文件夹结构,用了什么数据库等等。
对读者的期望值
你是一名 Web 开发者,对一些基础概念都了解(起码简单的 HTML/CSS)。
不是完全的技术小白。
最好情况是 Ruby on Rails + Ember.js 开发者。
官方 Github
https://github.com/discourse/discourse
我们的整体计划
自己定制完了自己部署到服务器
Discourse 技术栈
- 前端:Ember.js
- 后端:Ruby on Rails
- 数据库:PostgreSQL
- Sidekiq
- Redis
- 其他细枝末节请翻阅 Gemfile
特别注意
Discourse 开始于 2013 年,很多决定都是基于当时做的。
不能按现在 2018 年最新的 Ruby on Rails 5 + Ember.js 3.0 的思维套进去。
开发前强烈建议
- Discourse 官网仔细看一遍
- 官方 DEMO 仔细看一遍(支持哪些第三方登录,发帖界面等等都是怎样的)
- Github 上的 README 仔细看一遍
我的当前版本和环境
因为你很有可能是几个月甚至几年后读到这篇文章,那么很多东西都会变动。
把当前时间和版本列出来是很有帮助的
- 2018年4月
- Discourse 版本:v2.0.0.beta6 (来源 Github 的 release)
- Ruby on Rails 版本 5.2.0
- Ember.js 版本 3.0.0
官方提供的定制指南
都是一些论坛帖子(会不断更新,每次看到好的就加进来):
步骤 0
先运行起 PostgreSQL 和 Redis 之后,再跑 Rails (Mac 上命令如下)
# PostgreSQL
pg_ctl -D /usr/local/var/postgres start
# Redis
redis-server &
# Discourse
rails s
步骤1
直接看官方指南:https://github.com/discourse/discourse/blob/master/docs/DEVELOPER-ADVANCED.md
内容重点:
- 安装环境
- git clone 下来+一些必须操作(比如 bundle install 等)
(注:从后文开始我就假设你有一定 Ruby on Rails 和 Ember.js 基础了,
因为很多概念我没法在文章里介绍,比如我不可能直接在这里教你 Ruby on Rails ,这样文章就太长了)
步骤2
我现在把代码里一些重要概念都列出来:
- 使用了 ember-rails
文件地址:discourse/Gemfile
gem 'ember-rails', '0.18.5'
-
根目录下一些以.(句号)开头的文件基本都可以忽略掉,没有特别重要的。
都是一些第三方服务的配置文件,比如
Code Climate (.codeclimate.yml)
Travis-CI (.travis.yml)
Transifex (.tx 文件夹)
-
Discourse 的代码注释非常少
(不管是 controller / model / view / javascript等等)
Controller:
Model:
View:
我去官方论坛发了个帖子问『为什么注释这么少?』
"Why so little code comment in Discourse Codebase? (Github) "
有2个回答:
https://meta.discourse.org/t/why-so-little-code-comment-in-discourse-codebase-github/85710/6
Because comments tend to rot and deprecate which makes them useless (and sometimes counter intuitive) over time.
模块分析
(以下随意排序,并非按照先后或重要顺序排序)
(没有完全列全,会不断更新)
大致分了以下,有这些功能:
用户:注册登录
搜索:右上角
备份:后台点了按钮可以直接建,带文件/不带文件,得到一个 .sql.gz 文件可以下载下来
邮件:可以设置邮件模板
通知系统:轮询和表结构是咋样的?轮询间隔是可以后台控制的
设置:
API:还有 Webhook
标签
插件:没有简单的安装方式,要改代码
帖子:
评论:
点赞:
第三方登录:google yahoo twitter facebook instagram github SSO
小组:http://localhost:3000/admin/groups/custom
日志:http://localhost:3000/admin/logs/watched_words/action/block
可以设置敏感词。特定词不允许发布,特定词会被替换,特定词需要审核
搜索log:可以看到用户搜索了什么,搜了多少次
日志2:http://localhost:3000/logs
标记?flag,http://localhost:3000/admin/flags/active
-
用户系统没有用 devise(Gemfile 里没有)
-
Google Tag Manager
文件路径discourse/app/views/common/_google_tag_manager_head.html.erb
是帮助 Marketing 的,收集数据. 需要自己加 meta tag 等操作。 -
&. 语法是什么?
答案:
https://ruby-china.org/topics/35195 -
||= 语法是什么?
答案:
https://stackoverflow.com/questions/995593/what-does-or-equals-mean-in-ruby -
Discourse 用了 Ember. 但是没有用 Ember Data.
https://discuss.emberjs.com/t/why-discourse-is-not-using-ember-data/7169 -
Discourse 里 Ruby on Rails 的 View 层很薄。
discourse/app/views/
因为用了 Ember, 所以绝大部分模板在 Ember 那边。
(可以看到截图里, views/ 下的文件数量很少,每个文件夹1-4个文件,文件内代码也很少)
(待写)