Coder Social home page Coder Social logo

truthhun / dochub Goto Github PK

View Code? Open in Web Editor NEW
2.9K 246.0 737.0 12.09 MB

参考百度文库,使用Beego(Golang)开发的开源文库系统

Home Page: https://www.wenkuzhijia.cn

License: Apache License 2.0

Go 86.43% HTML 13.56% Dockerfile 0.02%
dochub beego golang office

dochub's Introduction

DocHub文库重构版本来了!!!新文库系统叫moredoc,即魔豆文库

开源地址


LOGO


目录:

重要:所有forkDocHub项目的朋友,麻烦同时点一下watch,以便关注项目更新动态和跟进一些重要的Bug的修复。

提示:DocHub移动端模板已经放出来,链接地址

说明(于2018-06-08):DocHub项目是我学完Go语言之后的第二个独立开发的Go语言项目,项目是在2016年12月份开始开发的。当时对Go语言和Beego框架都还不怎么熟。DocHub项目开源出来之后,看到star飙升的有点快(相对个人之前的开源项目),非常感谢大家的认可和厚爱,然后自己诚惶诚恐地认真review了一遍代码... 路由在模板页面写死了... 数据表一些数据字段也出现了冗余... 有些函数和方法封装,难以使用的一塌糊涂... 请大家给我点时间,我会把整套程序都优化好,当然,现在的版本是可用的,以后的升级版本也会是兼容升级。

说明(2018-06-12): DocHub演示站点:http://dochub.bookstack.cn 后台地址是:http://dochub.bookstack.cn/admin ;管理员账号密码均是admin您心目中的验证码芝麻开门。 安装和部署教程以及Docker镜像,稍后跟上。

文库简介

还在读大学的时候,当时就想着要搭建一个类似百度文库的文库站点,实现文档在线浏览。

然而,时间一晃,好几年过去了,自己终于亲自动手开发实现了一套开源文库程序。

尽管离百度文库还有着巨大的差距,尽管可(一)能(定)会存在Bug,但是,整套程序从前端到后端到数据库再到丑陋的LOGO设计,都是自己独立完成的,满满的成就感...

程序命名

起初开发这套程序,是想自己做一个IT行业的文库站点,也就是现在的IT文库(http://wenku.it),当初给文库起名就叫IT文库,但是决定开源出来之后,觉得这样不妥,于是起了个叫DocHub的名字。

毕竟,有个Git仓库管理的站点叫GitHub,那文档(Doc)仓库也就是文库,我干嘛不叫DocHub呢?

DocHub的中文名叫多哈,程序猿,写代码就要开心,开心就要哈哈哈哈哈哈哈哈,多...(好幼稚)

源码地址

程序源码,托管在GitHubGitee

QQ交流群

为方便相互学习和交流,建了个QQ群,加群请备注来自DocHub

QQ交流群:457803862(猿军团)

同时要说明的是,这个是学习交流群,如果是程序相关问题,请提交issue,再把issue链接发群里。

主要技术栈

后端

Go语言框架Beego

前端

基于Bootstrap的前端框架Flat-UI

数据库

MySQL,数据存储

依赖环境

Libreoffice(或Openoffice)

用于将office文档转PDF

使用命令:

soffice --headless --invisible --convert-to pdf path/to/officefile --outdir path/to/outdir

pdf2svg

注意,这个要用最新版的pdf2svg

pdf2svg,用于将PDF转成svg矢量图片,以供阅读。

使用命令:

pdf2svg <in file.pdf> <out file.svg> [<page no>]

calibre

用于将mobichmepub等文档转成PDF,然后再将pdf转成svg

注意:目前mobiepub等文档的在线阅读功能还没有实现

阿里云OSS

存储office文档、PDF文档以及svg等文件

注意:目前只支持阿里云的OSS云存储,暂时不支持其他云存储(后期我再抽时间开发和扩展其他云存储),不支持本地化存储(现在云存储和CDN价钱比以前便宜多了)

功能特点

文档在线阅读

DocHub文库通过svg矢量图来实现文档阅读体验的,我知道的文库站点中,新浪爱问是通过png等图片提供文档阅读体验的。

SVG相比pngjpeg等图片格式有很大的优势,至少放大不会失真,而且与JPEG 和 GIF 图像比起来,svg尺寸更小,可压缩性更强,DocHub通过gzip,将svg文件压缩,一般情况下,能减少70%的文件大小,比如200kb的svg,gzip压缩后,只有60kb左右的大小。

使用svg,大大提升了加载速度,优化了内容的阅读体验。

office文档在线阅读

这个需要经过两层转化:

office --> pdf --> svg

office文档在线阅读

之前有考虑过office文档不经过转化,然后直接在线浏览的,但是方案比较复杂,部署不容易,至少我没部署成功过...

PDF文档在线阅读

将PDF文档通过pdf2svg转化,提供在线阅读

没有使用mozila的pdf.js作为PDF文档阅读的实现方案,主要是我没有解决pdf.js分片分页加载的问题,每次都需要将整个PDF文档下载下来才能提供阅读。如果文档大的话,用户需要等待好长时间,而且也比较耗费服务器带宽资源。

mobi、epub、chm文档在线阅读

使用calibre将文档转成PDF,然后pdf再转svg。

目前该功能还没实现,epub、mobi等文档,现在还是暂时不能在线阅读

全文搜索

全文搜索功能,之前是使用coreseek开发实现了这个功能的,但是现在coreseek的官网都已经挂了...打算用elasticsearch重新实现这个功能。

文档采集功能【TODO】

建站初期,站点内容的填充,是一个大难点。

然而,GitBookReadTheDoc等站点上,就有一大堆的开源技术文档,提供mobipdfepub离线文档下载。

初略统计了一下,GitBook有10多万文档,按可用文档为5万估算,每份文档,提供3种格式的下载,光从gitbook采集文档,做成文库,就有15万多的文档了。

然后,你再借助下搜索引擎,搜索filetype:文档格式 + 搜索关键字,如filetype:pdf 入门教程,你就会发现惊喜!不信,你试着赋值下面两个链接地址在浏览器打开:

https://cn.bing.com/search?q=filetype%3apdf+%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B&first=11
https://www.sogou.com/web?query=filetype%3Apdf+%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B

如果再爬其他文档,一年之内,单枪匹马搞个上百万文档的文库站点,应该不是个事儿。

不过,现在综合类的文库站点,如百度文库等已经做起来了,如果你打算做综合类的文库站点,还是不现实,因为空间太小了.

但是,你可以做专注于某一个方向的文库站点,比如课后习题答案文库站点、IT行业文库站点、教育类文库站点等,专注于一个行业领域方向,还是有很大成长空间的。就好比图片站点,现在很多搜索引擎都能搜索图片,但是Pinterest花瓣网等还不是做起来了吗?

给你提供了程序,还给你提供了思路,给个star鼓励一下?

积分功能

用户签到、上传分享文档,获得积分奖励;用户下载文档,需要消耗积分

阅读文档水印功能

在提供阅读的svg文件上添加水印

页面一览

没有哪一个时代不是看脸的...

  • 首页

首页

  • 文档阅读页

文档阅读页

  • 用户中心

用户中心

  • 管理后台

管理后台

  • 搜索结果

搜索结果

搜索结果

使用教程

当运行程序的时候,程序会自动初始化数据,默认的初始管理员账号密码均是admin

但是由于环境依赖安装问题,所以有必要整理一个使用教程处理,使用教程放在书栈网(BookStack)上,教程地址:https://www.bookstack.cn/books/dochub

演示站点

目前还没有搭建演示站点,争取在这周内搭建出来。

不过,在这之前,你可以访问IT文库(http://wenku.it)看网站效果,但是由于这个站点,在进行迁移的时候,部分依赖没配置好,所以上传的office、PDF等文档,暂时不支持预览,搜索功能也用不了。

所以,请耐心等待,届时搭建好了演示站点,会把演示站点的管理员账号密码放出来,以便体验使用。

文库模板

DocHub文库的前端模板,包括PC模板和移动端模板,也会放出来。但是,模板可能跟套在程序上的有差距,毕竟在开发的时候有对页面做了一些调整。

PC端模板

移动端模板

关于本人

2014年7月本科"毕业"踏入IT行业;Web全栈工程师;什么都懂一点,什么都不精通。

赞助我

由于整套程序都是独立一个人开发完成,限于个人经验、知识面和技术栈体系的限制,现在的程序不会是完美的,但至少,我在努力,我会争取把开源文库程序做好,缩短与成熟文库系统的差距。

所以,给出你的意见和建议,给出你的打赏与鼓励,让我知道,我不是一个人在孤独地战斗。

赞助的时候,麻烦备注一下你的称呼,以便公开并表示感谢

支付宝打赏赞助

支付宝打赏

微信打赏赞助

微信打赏

dochub's People

Contributors

cyenoch avatar truthhun avatar truthhun88 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  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

dochub's Issues

用户注册获取邮箱验证出现问题

在ubuntu18.04上部署的是2.0的linux压缩版,用户注册页面上填写完用户邮箱,点击获取邮箱验证码,顶部出现有个红色提示,但没有文字内容,也不能正常注册,后台又不能添加用户,根本就用不了啊~

Dockerfile 未添加zoneinfo.zip导致install时报500错误

使用Docker的形式运行,安装的时候控制台报如下错误:
Handler crashed with error register db Ping default, open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory

已找到解决方法:
需提供zoneinfo.zip并在Dockerfile添加 COPY ./zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip

参考:
http://blog.swiftflamel.com/2018/03/09/golang%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%ADtime%E5%8C%85%E7%9A%84zonefile-zip%E9%97%AE%E9%A2%98/

希望增加对MD文件的支持,改进阅读页面翻页体验。

希望可以编辑上传采集MD文件,现在很多人写作都是用的markdown格式,版面和阅读体验都挺好的。
阅读界面现在要一直向下滚动,能否增加设置,可以设置成不用滚动,而是像书籍一样翻页的效果。
感谢开源这么用心的作品。

竟然不支持.txt文档在线预览?

看到这个提示:当前格式(txt)文档暂时不支持在线预览,请下载原文档对内容进行浏览。

复杂的实现了,最简单的却忘了。

open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory

具体的报错信息如下:

2018-07-19 17:28:32:[ORM]2018/07/19 09:28:32 register db Ping `default`, open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
2018-07-19 17:28:32:panic: register db Ping `default`, open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
2018-07-19 17:28:32:goroutine 1 [running]:
2018-07-19 17:28:32:github.com/TruthHun/DocHub/models.RegisterDB()
2018-07-19 17:28:32:	/Users/TruthHun/goworkspace/src/github.com/TruthHun/DocHub/models/Models.go:203 +0xb00
2018-07-19 17:28:32:github.com/TruthHun/DocHub/models.Init()
2018-07-19 17:28:32:	/Users/TruthHun/goworkspace/src/github.com/TruthHun/DocHub/models/Models.go:119 +0x26
2018-07-19 17:28:32:main.init.0()
2018-07-19 17:28:32:	/Users/TruthHun/goworkspace/src/github.com/TruthHun/DocHub/main.go:24 +0x180
2018-07-19 17:28:32:main.init()
2018-07-19 17:28:32:	<autogenerated>:1 +0x6c

显示是zoneinfo处理的问题
参考下面的链接,我修改我的docker-compose
可以解决

version: '2'
services:
  dochub:
    build: .
    volumes:
    - /home/flyingstudio/wenku/conf:/www/dochub/conf
    - /usr/share/zoneinfo:/usr/share/zoneinfo
    ports:
      - 8090:8090
    restart: always

FATAL: Invalid OffPeakPeriods value: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory.

PS:在其他地方也看到了一些解决办法,您可以参考下:
pod error: panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory

咨询个问题basecontroller的问题

在调用BaseController中的ResponseJson()函数,为什么不会抛map空指针的panic?
一般,在继承了BaseController之后,然后在调用他的ResponseJson的时候,不是会抛:Handler crashed with error assignment to entry in nil map
希望能帮忙解答下

package controllers

import (
"github.com/astaxie/beego"
)

type T1Controller struct {
// BaseController
beego.Controller
T2Controller

}

type T2Controller struct {
beego.Controller
}

func (this *T2Controller) Test() {
data := map[string]interface{}{"status": "ok"}
this.Data["json"] = data
this.ServeJSON()
this.StopRun()
}

func (this *T1Controller) New() {
re := this.GetString("status")
if re == "test" {
this.Test()
}
this.Ctx.WriteString("Hello World!")
this.ServeJSON()

}

特别建议提供其它文件的下载

 配合文档内容,可能有单独的其他文件的资源(比如程序源码、图片、视频等),也附带这些资源的上传和下载就更完备了。
再次感谢作者的开源项目。

无法设置邮箱,v2.1源码编译不通过

1、通过下载zip包解压后,docker run拉起来后,系统后台可以正常进入,前台页面也可正常加载,但无法通过后台管理页面设置邮箱及oss,从而也无法注册用户和上传文件,望解答,谢谢~
image

2、git下载项目源码v2.1后,go build编译失败(相关依赖已go get安装),望解答,谢谢~
image

文档编辑标签数量加减错误

文档编辑函数中

//文档编辑
func (this *UserController) DocEdit() {

原分类-1操作应该放置在info的相关量重新赋值之前!相关代码如下:

// 原分类-1
models.Regulate(models.GetTableCategory(), "Cnt", -1, fmt.Sprintf("Id in(%v,%v,%v)", info.ChanelId, info.Cid, info.Pid))

doc.Title = params["Title"].(string)
doc.Keywords = ### params["Tags"].(string)
doc.Description = params["Intro"].(string)
info.Pid = params["Pid"].(int)
info.Cid = params["Cid"].(int)
info.ChanelId = params["Chanel"].(int)
info.Price = params["Price"].(int)
info.TimeUpdate = int(time.Now().Unix())
orm.NewOrm().Update(&doc, "Title", "Keywords", "Description")
orm.NewOrm().Update(&info, "Pid", "Cid", "ChanelId", "Price")


//新分类+1
models.Regulate(models.GetTableCategory(), "Cnt", 1, fmt.Sprintf("Id in(%v,%v,%v)", params["Chanel"], params["Cid"], params["Pid"]))
this.ResponseJson(true, "文档编辑成功")

关于积分的缺陷

当用户上传一个文档后,会增加积分。但当用户删除自己上传的文档时,积分没有变动。所以,如果有人上传一个文档,又删除,上传又删除,如此反复,他的积分理论上就无上限了。

初始化友链数据失败,查询全局配置失败

2018/09/28 07:16:52.293 [E] [Install.go:123] 初始化友链数据失败:Error 1146: Table 'dochub.hc_friend' doesn't exist
2018/09/28 07:16:52.301 [E] [ConfigModel.go:69] 查询全局配置失败,config表中全局配置信息为空

后台管理演示的最新地址

目前DocHub能否做到设置用户的文档管理权限。比如A用户只能预览所有文档,不能下载。
DocHub对应的后台管理演示地址更新了吗?若更新,求最新地址。

Error 1055: this is incompatible with sql_mode=only_full_group_by

问题:

Error 1055: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'wenku.i.Id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

介绍
我的mysql: Ver 14.14 Distrib 5.7.18
修复建议:

  1. models/DocumentModel.go 155行,添加 "d.Id"
where %v group by d.Title, d.Id order by di.%v desc limit %v
  1. models/Models.go 416行,添加 "d.Title"
if sql, err := LeftJoinSqlBuild(tables, on, map[string][]string{"i": []string{"Count"}}, 1, 100000000, nil, []string{"i.DsId", "d.Title"}, cond); err == nil {

3.models/Models.go 431行,添加, "i.Score", "i.TimeCreate", "i.Id"

if sql, err := LeftJoinSqlBuild(tables, on, fields, p, listRows, orderBy, []string{"i.DsId", "i.Score", "i.TimeCreate", "i.Id"}, cond); err == nil {

存在sql_mode=only_full_group_by问题

网站首页的文章列表查询中存在sql_mode=only_full_group_by的问题,建议将DocumentModel.go的第186行修改为fields := "d.Title,any_value(d.Id) Id,any_value(ds.Ext) Ext,any_value(ds.ExtCate) ExtCate",第190行修改为where %v group by d.Title order by any_value(di.%v) desc limit %v,即可无视sql_mode=only_full_group_by的问题

build from draft

目前dockerfile有两个问题
直接下载release版本的二进制文件后运行
但是实际部署经常是本地重新编译的,因此建议修改dockerfile,增加build部分

另外一个问题是dockerfile的基础镜像truthhun/dochub像个黑盒子
能否也提供下相应的dockerfile,以便确定下这里做了什么便于修改和debug

用户注册时间未导入,docker容器时区设置

models/UserModel.go 125行
用户信息导入的时候,注册时间未添加
添加TimeCreate字段的插入

var userinfo = UserInfo{Id: user.Id, Status: true, Coin: coin, TimeCreate: int(time.Now().Unix())}

同时这样更改之后,Docker默认时区不是**,进行Docker默认时区的更改
建议:在Dockerfile添加时区定义

# 时区设置
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

sitemap找不到

你好,我在导入项目后,提示sitemap找不到请问是什么原因

helper.go->DownFile

没有关闭链接,建议加上一句
defer resp.Body.Close()
否则在执行大量下载后会保持大量的established状态连接以及close wait连接,最后机子可能会失联

建议增加全文搜索功能

您既然已经抽取了各类文件的全文文本,并且保存在了mysql的表hc_doc_text中,为什么不使用

elasticsearch 实现全文搜索的功能呢,他有着非常广泛的应用场景,参考google book,也是类似的

文库系统,但是全文搜索功能让人炫目。

最后,感谢您努力实现的作品,我们非常喜欢,虽然不是太复杂的系统,但适合我们的应用需求。

谢谢!

部署-Docker。

似乎作者教程正在做,希望部署教程添加Docker版本~

上传页面出现未知错误!

查看控制台输出,可能是413 Request Entity Too Large

所以如果使用Nginx反代,最好提前设置好文件上传大小限制
即在xx.conf文件添加

# 允许上传大小50M
client_max_body_size 52428800;

install数据库问题

版本:doc2.1

在install阶段出现
dial tcp:address too many colons in address。

数据库外网地址:

腾讯云云数据库外网地址

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.