社区启用 Gopher 2.0 版本

Golang 中国社区今天正式启用 2.0 版本。目前改版除了后台管理,前端完成了90%,对原来的版本做了减法,非社区功能以及不常用功能都去掉了。

下面简要回顾一下社区的历史和新版本的变化。

Gopher 1.0

我大概在 2010 年左右了解到了 Go 语言,当时只是做了一些简单了解,并没有深入学习。2012年3月28日,Go 语言的第一个正式版本 Go1 发布。我决定系统的学习一下该语言。单纯的学习一个语言会无聊,寻思着做点东西玩玩。

灵光一现,做个网站吧。Godaddy 上去搜索一下 golang 域名,跳出来一个 golang.tc。TC?天朝?不错,就它了。

域名有了,那就开发吧,第一反应去找个 Web 框架吧,翻遍 Github 只找到一个 goweb 的半成品框架,也跑不起来,只能放弃。

经过一番寻找,找到了个大猩猩工具包 Gorilla web toolkit,可以提供路由分发和 Cookie 功能。

那就够了,用 Golang 自带的 net/httphtml/template 进行开发。期间过程相当痛苦,网上几乎找不到任何 Golang Web 开发的资料和例子,只能不断的翻看文档,源码,踩坑,实验。

至于数据库为什么选用 MongoDB,那是因为没得选,关系数据库找不到相应的驱动。只找到 MongoDB 的一个 mgo 驱动。

经过几个月业余时间开发,在 2012年8月29日,我把网站部署到 Linode ,绑定好域名,发布了第一个帖子《Golang中国社区启动》, 2012年8月31日我把代码提交到 github.com/jimmykuu/gopher,做了一些简单推广,然后我就忙其他事情去了。过了几个月上去一看,网站运行的挺好,加入了好多用户,讨论也很活跃。于是我又继续进行社区的维护和开发。

几个月后收到通知,Godaddy 取消了 tc 后缀的域名,golang.tc 一年后没收,于是重新申请了一个 golangtc.com 域名,由于更换域名,搜索引擎搜不到了,导致沉寂了一段时间。

后面我又加了不少功能,也有一些用户贡献了代码。

Gopher 2.0

随着时间的推移,Golang 也越来越火,Web 框架已经满天飞了。社区代码经过多年改进其实有一些 Web 框架雏形,但是由于我的精力和水平有限,并没有发展成一个框架。这个过程中我也研究过不少 Web 框架。寻摸着对社区进行重构。

2016年11月启用 2.0 重构计划,Web 框架采用 Lunny 开发的 Tango,CSS 框架不再使用 Bootstrap,改用 Semantic UI,现在采用的是 Bulma

期间由于拖延症,Markdown 编辑器选择都经历了一波三折。终于在 2019年春节,把一些以前没解决的问题都解决了。

当前架构

后端渲染

考虑到 SEO,所有页面均采用后端渲染。

React 前端渲染

页面的表单提交,使用 React 组件在浏览器端进行渲染,通过 API 和后端进行交互。交互代码直接用 babel 写在页面中,如评论 Form:

<div id="form"></div>

<script type="text/babel">
  class NewCommentForm extends React.Component {
    constructor(props) {
    super(props);
      this.state = {
        submiting: false,
        markdown: '',
        html: ''
      }
    }
  
    // ...
    
    handleSubmit = (e) => {
      e.preventDefault();
      this.setState({submiting: true});
      const { markdown, html } = this.state;

      post('/api/comments', {
        content_id: topicId,
        markdown: markdown,
        html: html
      }).then((data) => {
        if (data.status) {
          window.location.reload();
        } else {
          alert(data.message);
          this.setState({
            submiting: false
          });
        }
      });
    }

    render() {
      const disabled = !this.state.html;

      return (<form onSubmit={this.handleSubmit}>
        <div className="field">
          <div className="control">
            <MarkdownEditor markdown={this.state.markdown} onChange={this.handleMarkdownChange}></MarkdownEditor>
          </div>
        </div>

        <div className="field is-grouped is-right">
          <div className="control">
            <SubmitButton size="is-medium" isSubmiting={this.state.submiting} disabled={disabled} />
          </div>
        </div>
      </form>);
    }
  }
  
  ReactDOM.render(<NewCommentForm />, document.getElementById('form'));
</script>

后续工作会继续进行页面优化和美工调整,以及一些未完成功能的开发,还有管理后台的开发,管理后台会采用 React 做成单页面应用。

两个版本页面对比

1.0 首页
2.0 首页

共 32 个回复


charlotte

恭喜2.0上线啦!!!

关于首页和帖内的一点建议
190218084652.png

首页友情链接这个位置建议用来放登录前和登录后的用户信息 和  热门讨论主题或者最新回复信息,因为友情连接显示在前面感觉很奇怪

20190218084830.png

帖内右侧可以放楼主信息 或者 帖子所在节点的信息 和ad ,这样就不会显得空

@jimmykuu

# 0

charlotte

20190218085531.png

注册页面的标题显示的是 登录 点击忘记密码页面会提示 not found

# 1

jimmykuu

多谢建议,还有10%的功能没有完成,会继续完成。

# 2

charlotte

20190218130514.png
@jimmykuu 站长注册功能没完成吗?发现不管你注册的时候是否输入邮箱都会提示 请输入邮箱地址 阻止注册

# 3

jimmykuu

是有问题,晚上会修复这个问题。

# 4

kheviloc

很早就在vps上运行过2.0的测试版本了,今天终于看到站长发布正式版本了,恭喜一下先。晚上回去尝下鲜。

# 5

kheviloc

http://18.136.18.18:8000/topic/new 发表不了主题,一直在打转,是怎么回事啊,站长。

# 6

jimmykuu

可以打开开发者工具看看,你的 http://18.136.18.18:8000/api/nodes 没有返回值,导致进行不下去了。这块我没做判断。

# 7

kheviloc

慢慢测试。

# 8

rockman

以几乎一人之力能做成这样非常不容易了,👍

# 9

alphayan

这个评论功能在Firefox上面不能用

# 10

jimmykuu

能提供下你的环境么,什么操作系统,Firefox 什么版本?

我在 macOS 上的 Firefox 65 正常。

可以的话,打开菜单【工具】->【Web 开发者】->【Web 控制台】看下是否有报错。

# 11

LoliSquad

@jimmykuu 站长建议注册和登录用户名不区分大小写,刚刚试了下我的用户名是LoliSquad 但是用全小写lolisquad也能注册 这样容易同一个用户名有多个用户使用 造成混淆 李逵 李鬼分不清,还有就是markdown编辑器不能@用户  只有所见即所得的时候 才能正确解析@xxx

# 12

charlotte

lzl.png
@jimmykuu  站长 做个楼中楼回复吧,现在这种回复太坑了  好比 原作者在1楼发表评论,你进来回复这个用户的评论时,已经到10楼了,原作者再回复你又到20楼了。其他用户看到10楼时,早已经忘记原作者说了什么了。

还有一个反馈是  验证码的问题  现在golangtc上的验证 在用户登录或者注册的时候 比如出现 错误提示 或者登录的时候密码错误 点击登录提示错误后  验证码不好刷新让用户重新验证  而是要手动刷新网页来刷新验证码 这很不友好哦!

# 13

jimmykuu

确实是有大小写这个问题,我限制一下,然后把 Jimmykuu 这用户删除。

# 14

jimmykuu

@charlotte 我考虑下这种回复方式。

# 15

charlotte

@jimmykuu 嗯 感觉楼中楼还是蛮有用的 ,站长考虑把注册的时候邮箱验证加上吧  用户需要邮箱验证才能发文  一来可以防广告 二来可以保证用户邮箱的有效性  现在随便输入个邮箱都能注册  如果是随手输入的 以后用户找回密码就困扰了!

# 16

jimmykuu

我会加个是否需要验证的配置选项,曾经用过这个功能,很多用户收不到邮件或在垃圾邮箱里,所以取消了这个功能。

# 17

bigbear

来顶个贴,恭喜新版上线。

另外,会员列表哪里,点头像会出现错误。

# 18

xiaolunwen

恭喜恭喜!!!

# 19

testaccount

@jimmykuu 我记得以前是用的editor.md? 请问站长为什么改用tui.editor呢? 以及不选用其他一些编辑器的原因?

# 20

jiujuan

恭贺恭贺

  • 加了圆角比以前更圆润漂亮了
# 21

duanquanyong

非常不错,看着比以前舒服多了

# 22

fising

站长,支持一下记住登录的功能呀。每次都要登录好烦啊。

# 23

jimmykuu

@fising 默认就是记住的,你用的什么浏览器?

# 24

fising

@jimmykuu 是chrome

# 25

fising

@jimmykuu 现在是关闭浏览器,登录就失效。我建议给 cookie 加一个超长的有效期。

# 26

jimmykuu

@fising 问题找到了,已修复,设置 cookie 时 expires 拼写错误,写成 expores 了。

# 29

wang10756

请问在哪下载Golang的环境

# 30

a7a2

本想快速搭建一个bbs系统的,所以找到你的而开源项目,无奈此项目还不完善,例如后台。

https://github.com/jimmykuu/gopher

上的templates/base.html内容中的关于tui.editor的外部调用404,

main.go 的t.Run()缺参数fmt.Sprintf("%s%s%s", conf.Config.Host, ":", conf.Config.Port)

etc/config.json的Host参数应该是ip如127.0.0.1或0.0.0.0之类,而非http(s)之类,因为服务器可能有多ip,Host应该是服务于监听ip的

etc/config.json时区应该免于设置的,因为服务器时间就包含时区,逻辑代码可以判断。

港真,对于强类型语言跟orm配合得好可以免于使用github.com/asaskevich/govalidator ,习惯了php的都校验一下提交的数据,这样浪费时间

望修正!


还有奉劝尽可能少使用第三方服务(如geetest.com的验证,先不说是否稳定,开源很多解决方案)+外链调用资源,因为不稳定不适用某些地区,例如访问本站就很慢就是因为这些外部调用js/css,这些外部调用的js、css之类应该是由网站主设置是否配置使用cdn的!


# 31