当前位置:   article > 正文

开源网盘系统推荐 - 开源云盘 - 安装及开发教程_eyebluetank

eyebluetank

开源网盘系统推荐 - 开源云盘 - 安装及开发教程

 

云盘界面

 

介绍

本开源云盘致力于打造成一个优雅,好用,高效,克制的开源云盘。

在线体验 (账号demo/123456)

 

软件架构

本开源云盘采用前后端分离的模式开发。后端使用Golang语言,前端采用Vue框架;前端打包后的静态文件夹放置于后端/html目录下,后端对前后端资源做统一路由。

eyebluecn/tank 

eyebluecn/tank-front

 

特色

  • 支持Docker安装
  • 安装包仅10M左右,跨平台支持。windowslinuxmacOS均提供安装包
  • 支持 文件上传,文件预览,文件下载,聚合下载,提取码分享
  • 提供编程接口,可以当作网站的第三方文件存储器
  • 支持图片缓存,可使用参数对图片进行处理
  • 支持多用户,支持用户空间限制
  • 支持简体中文和英文

 

Todo

本开源云盘仍然处于持续迭代中,以下特性还不支持,但是已经在开发计划中:

  • 支持Sqlite
  • 支持文件混合预览,增强对常见文件的预览能力

 

加入讨论区

加入钉钉群可以体验最新Beta版本,你的任何合理需求,我都会尽量满足

 

安装

Linux

基本步骤

  1. 安装MySQL,并创建一个数据库(使用UTF-8编码,否则不能存储中文)
  2. 下载最新版本的开源云盘,去下载
  3. 解压,运行根目录下tank
./tank

     打开 http://127.0.0.1:6010 看到安装引导页面即表示软件安装成功。接着按照UI引导安装开源云盘即可。

更多的运行方法

  1. 文件tank是可执行文件,可以直接运行,如步骤3所示。

  2. 如果你只是简单地希望开源云盘常驻后台运行,请使用根目录service文件夹下的脚本文件。

  1. # 启动系统
  2. ./startup.sh
  3. # 停止系统
  4. ./shutdown.sh

[推荐] 如果你希望开机启动云盘,或者可以使用系统的systemctlservice来控制开源云盘。

  • /etc/systemd/system/下创建tank.service文件
vim /etc/systemd/system/tank.service
  • tank.service的内容如下所示,其中ExecStart根据实际情况指定tank可执行文件
  1. [Unit]
  2. Description=EyeblueTank
  3. Documentation=https://tank-doc.eyeblue.cn
  4. Wants=network.target
  5. After=network.target
  6. [Service]
  7. Type=simple
  8. DynamicUser=yes
  9. ExecStart=/data/program/tank/tank
  10. Restart=always
  11. RestartSec=3
  12. [Install]
  13. WantedBy=multi-user.target
  • 装载tank服务,并启动(停止)开源云盘
  1. # 装载tank服务
  2. systemctl daemon-reload
  3. # 设置tank开机启动
  4. systemctl enable tank.service
  5. # 查看tank状态
  6. systemctl status tank.service
  7. # 启动tank
  8. systemctl start tank.service
  9. # 重启tank
  10. systemctl restart tank.service
  11. # 停止tank
  12. systemctl stop tank.service

 

Windows

  1. 安装MySQL,并创建一个数据库(使用UTF-8编码,否则不能存储中文)
  2. 下载最新版本的开源云盘,去下载
  3. 解压,双击根目录下的tank.exe运行
  4. 打开 http://127.0.0.1:6010 看到安装引导页面即表示软件安装成功。接着按照UI引导安装开源云盘即可。

 

MacOS

基本步骤

  1. 安装MySQL(使用UTF-8编码)
  2. 下载最新版本的开源云盘,去下载
  3. 解压,运行根目录下tank
./tank

     打开 http://127.0.0.1:6010 看到安装引导页面即表示软件安装成功。接着按照UI引导安装开源云盘即可。

更多的运行方法

  1. 文件tank是可执行文件,可以直接运行,如步骤3所示。

  2. 如果你只是简单地希望开源云盘常驻后台运行,请使用根目录service文件夹下的脚本文件。

  1. # 启动开源云盘
  2. ./startup.sh
  3. # 停止开源云盘
  4. ./shutdown.sh

 

Docker

  1. Docker中启动mysql
docker run --name dockermysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=tank -e MYSQL_USER=tank -e MYSQL_PASSWORD=tank123 -v ~/data/dockermysql:/var/lib/mysql -d mysql:5.7

提示

容器名称为dockermysql,占用宿主13306端口,root密码123456,创建了一个tank数据库,用户名tank,密码tank123 ,将文件挂载于宿主的~/data/dockermysql文件夹。

  1. Docker中启动开源云盘,x.x.x使用最新版本,参考这里
docker run --name tank -p 6010:6010 --link dockermysql:mysql -v ~/data/dockermatter:/data/build/matter -d eyeblue/tank:x.x.x

提示

容器名称为tank,占用宿主6010端口,链接数据库为mysql,即通过mysql可以访问到步骤1中mysql的地址,将文件挂载于宿主的~/data/dockermatter文件夹。

  1. 打开 http://127.0.0.1:6010 看到安装引导页面即表示软件安装成功。

提示

  1. MySQL Host => mysql
  2. MySQL 端口 => 3306
  3. MySQL 库名 => tank
  4. MySQL 用户名 => tank
  5. MySQL 密码 => tank123

 

自行编译

 

前端项目打包

  1. clone  eyebluecn/tank-front

  2. 安装依赖项

npm install

执行打包命令

npm run build

通过前面三步可以在dist文件夹下得到打包后的静态文件,将dist目录下的所有文件拷贝到后端项目的build/html文件夹下。

 

后端项目打包

  1. clone  eyebluecn/tank

  2. 安装Golang,配置环境变量GOPATH (因为使用go module,所以对GOPATH路径没有要求)

  3. 打包

  • windows平台双击运行 tank/build/pack/build.bat,成功之后可在tank/dist下看到tank-x.x.x文件夹,该文件夹即为最终安装包。

  • linux平台运行如下命令:

  1. cd tank/build/pack/
  2. ./build.sh

成功之后可在tank/dist下看到tank-x.x.x.linux-xxx.tar.gz

利用得到的安装包即可参考安装一节进行安装。

 

提示

如果你在安装依赖时,发现速度太慢,那么可以尝试修改脚本中的GOPROXY,常用的GOPROXY值有:

  1. https://athens.azurefd.net
  2. https://goproxy.io
  3. https://goproxy.cn

 

软件下载

3.0.6

文件名操作系统(OS)架构(Arch)大小
tank-3.0.6.windows-amd64.zipWindowsx86-6411.3M
tank-3.0.6.linux-amd64.tar.gzlinuxx86-6411.5M
tank-3.0.6.darwin-amd64.tar.gzmacOSx86-6411.5M
tank-3.0.6.android-arm64.tar.gzandroidarm6411.3M
tank-3.0.6.linux-arm64.tar.gzlinuxarm6411.3M
eyeblue/tank:3.0.6Dockerx86-641.24G

3.0.5

文件名操作系统(OS)架构(Arch)大小
tank-3.0.5.windows-amd64.zipWindowsx86-6411.3M
tank-3.0.5.linux-amd64.tar.gzlinuxx86-6411.5M
tank-3.0.5.darwin-amd64.tar.gzmacOSx86-6411.5M
tank-3.0.5.linux-arm64.tar.gzlinuxarm6411.5M
tank-3.0.5.linux-mips64le.tar.gzlinuxmips64le11.5M
eyeblue/tank:3.0.5Dockerx86-641.24G

3.0.4

文件名操作系统(OS)架构(Arch)大小
tank-3.0.4.windows-amd64.zipWindowsx86-6411.3M
tank-3.0.4.linux-amd64.tar.gzlinuxx86-6411.5M
tank-3.0.4.darwin-amd64.tar.gzmacOSx86-6411.5M
tank-3.0.4.linux-arm64.tar.gzlinuxarm6410.7M
eyeblue/tank:3.0.4Dockerx86-641.24G

3.0.3

文件名操作系统(OS)架构(Arch)大小
tank-3.0.3.windows-amd64.zipWindowsx86-6411.3M
tank-3.0.3.linux-amd64.tar.gzlinuxx86-6411.5M
tank-3.0.3.darwin-amd64.tar.gzmacOSx86-6411.5M
tank-3.0.3.linux-arm64.tar.gzlinuxarm6410.7M
eyeblue/tank:3.0.3Dockerx86-641.24G

3.0.2

文件名操作系统(OS)架构(Arch)大小
tank-3.0.2.windows-amd64.zipWindowsx86-6411.3M
tank-3.0.2.linux-amd64.tar.gzlinuxx86-6411.5M
tank-3.0.2.darwin-amd64.tar.gzlinuxx86-6411.4M
eyeblue/tank:3.0.2Dockerx86-641.24G

3.0.0

文件名操作系统(OS)架构(Arch)大小
tank-3.0.0.windows-amd64.zipWindowsx86-6411.3M
tank-3.0.0.linux-amd64.tar.gzlinuxx86-6411.5M
tank-3.0.0.darwin-amd64.tar.gzmacOSx86-6411.4M
tank-3.0.0.linux-arm64.tar.gzLinuxARMv810.7M

 

命令行工具

开源云盘提供了很多实用的命令行工具,tank(或者tank.exe)文件本质上就是一个可执行文件,可以接受参数,当我们输入一定的参数时,就可以把它当成命令行工具使用。

 

准备条件

在使用命令行工具时,请首先启动开源云盘。因为命令行工具本质上去调用开源云盘的http接口

 

查看版本

查看当前开源云盘版本

./tank -mode=version

 

映射本地文件映射

将本地文件映射到开源云盘中

./tank -mode=mirror -username=YourUsername -password=YourPassword -src=SourcePath -dest=DestPath [-host=EyeblueTankHost]

提示

YourUsername => 超级管理员的用户名

YourPassword => 超级管理员的密码

SourcePath => 想要映射的本地文件夹,例如:/data/temp

DestPath => 开源云盘的文件夹,例如 /morning

-host => 可以指定开源云盘地址,默认使用 http://127.0.0.1:6010

 

拉取远程文件

将一个远程文件拉取到开源云盘中

./tank -mode=crawl -username=YourUsername -password=YourPassword -src=SourcePath -dest=DestPath

提示

  1. YourUsername => 超级管理员的用户名
  2. YourPassword => 超级管理员的密码
  3. SourcePath => 远程的资源文件,一般是http://或者https://开头
  4. DestPath => 开源云盘的文件夹,例如 /morning

 

版本迁移

 

2.0.x迁移到3.0.x版本

由于2.0.x文件目录的结构按照时间戳顺序进行组织,3.0.0按照和开源云盘中一致的物理目录组织,因此导致文件存放的结构不一致。为了让2.0.0的用户更优雅的使用3.0.x版本,作者特意写了一个迁移工具,按照以下步骤进行迁移。

 

准备条件:

  1. 停止tank2.0.x
  2. 安装好tank3.0.x,即至少已经有一个超级管理员了。
  3. 2.0.x3.0.x使用同一个数据库
  4. 执行以下迁移命令,其中YourUsernameYourPassword是指开源云盘3.0.x的超级管理员账号密码。Tank2.0MatterPath是指2.0.x版本的MatterPath,可以在tank.conf文件中找到,如果这个字段为空,例如2.0.x的安装目录为/data/tank2.0,那么就使用/data/tank2.0/matter
  1. cd tank 3.0.x安装目录
  2. ./tank -mode=migrate20to30 -username=YourUsername -password=YourPassword -src=Tank2.0MatterPath

迁移时间长短会和你的文件多少有关,请耐心等待,如果要想查看迁移过程日志:

  1. cd tank 3.0安装目录
  2. tail -f ./log/tank.log

迁移完毕后,所有2.0.x的用户名后会加上_20.

 

Webdav

访问地址

https://tank.eyeblue.cn/api/dav

(以官方开源云盘为例)

 

使用单独的域名作为WebDAV地址

如果你想去掉 /api/dav 的后缀,并且使用其他域名作为WebDAV的访问地址,你可以参考以下的nginx配置:

  1. #https://tank-dav.eyeblue.cn
  2. server{
  3. listen 443 ssl;
  4. server_name tank-dav.eyeblue.cn;
  5. ssl on;
  6. ssl_certificate /data/security/letsencrypt/eyebluecn/full_chain.pem;
  7. #private key
  8. ssl_certificate_key /data/security/letsencrypt/eyebluecn/private.key;
  9. location / {
  10. rewrite /(.*) /api/dav/$1 break;
  11. proxy_pass http://127.0.0.1:6010;
  12. proxy_set_header host $host;
  13. proxy_set_header X-Forwarded-For $remote_addr;
  14. proxy_pass_request_headers on;
  15. client_max_body_size 2048m;
  16. }
  17. }
  18. #http://tank-dav.eyeblue.cn
  19. server {
  20. listen 80;
  21. server_name tank-dav.eyeblue.cn;
  22. rewrite ^(.*)$ https://tank-dav.eyeblue.cn$1 permanent;
  23. }

通过以上的配置,WebDAV的访问地址就变成了:https://tank-dav.eyeblue.cn

 

支持WebDAV的常用客户端

Windows平台

WinSCP

这是windows平台的一个免费软件,下载地址: https://winscp.net/eng/download.php

 

Potplayer

这是一个windows平台的免费播放器,可以通过WebDAV直接观看网盘中的视频,下载地址:http://potplayer.daum.net

 

NetDrive 3

NetDrive 3是一个收费软件,不过可以支持7天试用,而且跨平台,下载地址:http://www.netdrive.net/

 

MacOS平台

NetDrive 3

 

Android平台

ES文件浏览器

在各大应用商店搜索即可下载。添加的方式 网络 -> ftp -> WebDAV

 

IOS平台

FE文件管理器

AppStore中搜索“FE文件管理器”即可下载,按照引导添加即可。

 

图片处理

/api/alien/download/{uuid}/{filename}

/api/alien/preview/{uuid}/{filename}

功能:在浏览器中下载文件

这个两个接口既可以下载公有文件,又可以下载私有文件。同时对于图片文件还可以做裁剪缩放等操作。

区别是download接口会在http header中加上Content-Disposition,浏览器会自动当成下载处理。

区别是preview接口不会在http header中加上Content-Disposition,因此浏览器会直接以预览模式打开。

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填文件的uuid,该参数放在url的路径中
filenamestring必填文件的名称,该参数放在url的路径中
downloadTokenUuidstring选填download的uuid,如果是私有文件该参数必须,公有文件无需填写

返回: 二进制的文件

该接口同时还可以对图片进行缩放预处理

图片缩放支持的格式有:".jpg", ".jpeg", ".png", ".tif", ".tiff", ".bmp", ".gif"

额外参数

格式为 ir=mode_width_height

参数类型描述取值范围
modestring指定图片缩放的策略,有三种策略,fit 表示固定一边,另一边按比例缩放;fill表示先将图片延伸出指定W与H的矩形框外,然后进行居中裁剪;fixed表示直接按照指定的W和H缩放图片,这种方式可能导致图片变形[fit,fill,fixed]
widthint指定的宽度,0表示自动适应1 ~ 4096
heightint指定的高度,0表示自动适应1 ~ 4096

示例

原图:

将宽度指定为200,高度等比例缩放

  1. 将宽度指定为200,高度等比例缩放

将宽度指定为200,高度等比例缩放

http://tank.eyeblue.cn/api/alien/preview/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?ir=fit_200_0

  1. 将高度指定为200,宽度等比例缩放

将高度指定为200,宽度等比例缩放

http://tank.eyeblue.cn/api/alien/preview/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?ir=fit_0_200

  1. 图片自动填充在200*200的大小中 (这种情况用得最多)

图片自动填充在200*200的大小中

http://tank.eyeblue.cn/api/alien/preview/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?ir=fill_200_200

  1. 图片固定大小200*200 (一般会导致变形)

图片自动填充在200*200的大小中

http://tank.eyeblue.cn/api/alien/preview/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?ir=fixed_200_200

 

第三方存储

AlienController

  • 开源云盘提供了编程接口,实现了云存储(如:七牛云阿里云OSS)的核心功能,可以使用编程接口上传文件,作为其他网站、系统、app的资源存储器。可以在下载图片时对图片做缩放裁剪处理,可以有效地节省客户端流量

  • 开源系列开源软件之二的《开源博客》正是使用开源博客作为第三方资源存储器。开源博客中的所有图片,附件均是存储在开源云盘中

上传时序图

 

下载时序图

 


接口详情

/api/alien/fetch/upload/token

功能:一个开源云盘受信任的用户请求一个UploadToken,用于给另一个用户向开源云盘上传文件

一般的使用场景是应用服务器向开源云盘请求UploadToken,然后将此UploadToken交由浏览器去向开源云盘上传文件

访问级别注册用户,管理员

请求参数

名称类型必填性描述
filenamestring必填文件名
expireTimestring必填UploadToken过期时间
privacybool选填文件的共有性。true表示文件私有,下载时必须要DownloadToken. false表示文件公有,任何人可以通过下载链接直接下载,默认值为false
sizeint必填文件的大小。单位:byte
dirPathstring必填文件存放的路径。不能为空,必须以/开头,不能出现连续的//,不能包含以下特殊符号:< > \| * ? \。举例:/app/blog/20180101121212001

/api/alien/fetch/download/token

功能:一个开源云盘受信任的用户请求一个DownloadToken,用于给另一个用户下载开源云盘上的私有文件

一般的使用场景是应用服务器向开源云盘请求DownloadToken,然后将此DownloadToken交由浏览器去向开源云盘下载文件

访问级别注册用户,管理员

请求参数

名称类型必填性描述
matterUuidstring必填文件uuid,要想下载的文件uuid
expireTimestring必填UploadToken过期时间,单位:s。默认 86400s 即24h

/api/alien/confirm

功能应用服务器向开源云盘确认某个文件是否确实已经上传好了

访问级别注册用户,管理员

请求参数

名称类型必填性描述
matterUuidstring必填浏览器上传完毕后,开源云盘返回给浏览器的uuid

/api/alien/upload

功能:浏览器拿着UploadToken通过FormData向开源云盘上传文件

一般的使用场景是应用服务器向开源云盘请求UploadToken,然后将此UploadToken交由浏览器去向开源云盘上传文件。由于在请求UploadToken的时候已经传入了文件元信息,因此这里的文件信息必须要和/api/alien/fetch/upload/token传入的参数信息一致

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
uploadTokenUuidstring必填uploadToken标识,/api/alien/fetch/upload/token请求返回对象中的uuid
filefile必填文件,在浏览器中是通过<input type="file" name="file"/>来选择的

/api/alien/crawl/token

功能:获取一个token,提供给第三方去调用的一个接口

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
uploadTokenUuidstring必填uploadToken标识,/api/alien/fetch/upload/token请求返回对象中的uuid
urlstring选填获取文件的链接

/api/alien/crawl/direct

功能:让开源云盘去拉取一个url资源

访问级别注册用户,管理员

请求参数

名称类型必填性描述
filenamestring必填文件名
privacybool选填文件的共有性。true表示文件私有,下载时必须要DownloadToken. false表示文件公有,任何人可以通过下载链接直接下载,默认值为false
dirPathstring选填文件存放路径
urlstring选填获取文件的链接

/api/alien/preview/{uuid}/{filename}

功能:这个接口实现预览功能

访问级别游客,注册用户,管理员

请求参数: 均是放置在url中

名称类型必填性描述
uuidstring必填文件的uuid,该参数放在url的路径中
filenamestring必填文件的名称,该参数放在url的路径中
downloadTokenUuidstring选填download的uuid,如果是私有文件该参数必须,公有文件无需填写

返回: 二进制的文件


/api/alien/download/{uuid}/{filename}

功能:在浏览器中下载文件

这个接口既可以下载公有文件,又可以下载私有文件。同时对于图片文件还可以做裁剪缩放等操作

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填文件的uuid,该参数放在url的路径中
filenamestring必填文件的名称,该参数放在url的路径中
downloadTokenUuidstring选填download的uuid,如果是私有文件该参数必须,公有文件无需填写

返回: 二进制的文件

该接口同时还可以对图片进行缩放预处理,请参考这里

 

开源云盘api接口

一、实体

在详细介绍各controller中的接口前,有必要先介绍开源云盘中的各实体,所有的实体基类均为Base

Base

Base定义如下,所有会在数据库中持久化的实体均会继承BaseController在返回实体给前端时,会将字段和值序列化成json字符串,其中键就和每个实体字段后面的json标签一致,下文也会有详细例子介绍

  1. type Base struct {
  2. //唯一标识
  3. Uuid string `gorm:"primary_key" json:"uuid"`
  4. //排序用的字段,一般是时间戳来表示序号先后
  5. Sort int64 `json:"sort"`
  6. //修改时间
  7. UpdateTime time.Time `json:"updateTime"`
  8. //创建时间
  9. CreateTime time.Time `json:"createTime"`
  10. }

 

Pager

在前端请求一个列表时,通常返回的都是一个PagerPager中就是装的各个实体的列表

  1. type Pager struct {
  2. //当前页数,0
  3. Page int `json:"page"`
  4. //每页的大小
  5. PageSize int `json:"pageSize"`
  6. //总的条目数
  7. TotalItems int `json:"totalItems"`
  8. //总的页数
  9. TotalPages int `json:"totalPages"`
  10. //实体的数组
  11. Data interface{} `json:"data"`
  12. }

 

Matter

Matter是代表文件(文件夹是一种特殊的文件),为了避免和系统的file重复,这里使用matter,这个实体是开源云盘最重要也是最基本的实体:

  1. type Matter struct {
  2. //继承Base,也就是说Base中的Uuid,Sort,ModifyTime,CreateTime这里也会有
  3. Base
  4. //所在的文件夹的uuid,如果在根目录下,这个字段为 root
  5. Puuid string `json:"puuid"`
  6. //创建这个文件的用户uuid
  7. UserUuid string `json:"userUuid"`
  8. //创建这个文件的用户名
  9. Username string `json:"username"`
  10. //该文件是否是文件夹
  11. Dir bool `json:"dir"`
  12. //文件名,带后缀名。例如:avatar.jpg
  13. Name string `json:"name"`
  14. //文件的md5值,目前该功能尚未实现,作为保留字段
  15. Md5 string `json:"md5"`
  16. //文件大小,单位 byte。比如某个文件1M大,那么这里就为: 1048576
  17. Size int64 `json:"size"`
  18. //文件是否为私有,如果true则该文件只能作者或超级管理员可以下载,如果false所有人均可以通过下载链接下载
  19. Privacy bool `json:"privacy"`
  20. //文件在磁盘中的路径,前端无需关心这个字段。但是后端在寻找文件时这个字段非常关键
  21. Path string `json:"path"`
  22. //文件下载次数
  23. Times int64 `json:"times"`
  24. //该文件的父级matter,该字段不会持久化到数据集,属于获取matter详情时临时组装出来的
  25. Parent *Matter `gorm:"-" json:"parent"`
  26. //该文件的子级matter数组,该字段不会持久化到数据集,属于获取matter详情时临时组装出来的
  27. Children *Matter `gorm:"-" json:"-"`
  28. }

 

User

User是代表用户:

  1. type User struct {
  2. //继承Base,功能同上
  3. Base
  4. //角色,有以下枚举值:GUEST(游客,不会持久化到数据库),USER(普通用户),ADMINISTRATOR(超级管理员)
  5. Role string `json:"role"`
  6. //用户名,在Matter的path字段中很有用
  7. Username string `json:"username"`
  8. //密码,默认不会返回给前端
  9. Password string `json:"-"`
  10. //头像Url
  11. AvatarUrl string `json:"avatarUrl"`
  12. //上次登录时的ip
  13. LastIp string `json:"lastIp"`
  14. //上次登录的时间
  15. LastTime time.Time `json:"lastTime"`
  16. //该用户允许上传的单文件最大大小
  17. SizeLimit int64 `json:"sizeLimit"`
  18. //该用户允许上传的文件总量最大大小
  19. TotalSizeLimit int64 `json:"totalSizeLimit"`
  20. //该用户已上传的文件总量大小
  21. TotalSize int64 `json:"totalSize"`
  22. //状态,有以下枚举值:OK(正常),DISABLED(被禁用)
  23. Status string `json:"status"`
  24. }

 

Preference

Preference是整个网站的偏好设置,网站的名称,logo,favicon,版权,备案号等信息均由这个实体负责。定义如下:

  1. type Preference struct {
  2. //继承Base,功能同上
  3. Base
  4. //网站名称
  5. Name string `json:"name"`
  6. //网站的logo url
  7. LogoUrl string `json:"logoUrl"`
  8. //版权信息
  9. Copyright string `json:"copyright"`
  10. Record string `json:"record"`
  11. //大小限制
  12. DownloadDirMaxSize int64 `json:"downloadDirMaxSize"`
  13. //文件数量
  14. DownloadDirMaxNum int64 `json:"downloadDirMaxNum"`
  15. //用户默认总大小限制
  16. DefaultTotalSizeLimit int64 `json:"defaultTotalSizeLimit"`
  17. //是否允许自主注册
  18. AllowRegister bool `json:"allowRegister"`
  19. //当前运行的开源博客版本,这个字段不可修改,每次发版时硬编码
  20. Version string `json:"version"`
  21. }

 

UploadToken

用于给陌生人上传的token

  1. type UploadToken struct {
  2. //继承Base,功能同上
  3. Base
  4. //颁发该token的用户,系统中任何用户都能颁发token
  5. UserUuid string `json:"userUuid"`
  6. //使用这个token上传文件就必须上传在这个文件夹下
  7. FolderUuid string `json:"folderUuid"`
  8. //陌生人上传好了的文件uuid
  9. MatterUuid string `json:"matterUuid"`
  10. //过期时间
  11. ExpireTime time.Time `json:"expireTime"`
  12. //使用这个token上传文件就必须是这个文件名
  13. Filename string `json:"filename"`
  14. //使用这个token上传文件就必须是这个公私有性
  15. Privacy bool `json:"privacy"`
  16. //使用这个token上传文件就必须这个大小
  17. Size int64 `json:"size"`
  18. //使用这个token上传文件陌生人的ip
  19. Ip string `json:"ip"`
  20. }

 

DownloadToken

用于给陌生人下载的token,一个matter如果Privacy=true,那么就意味着只有自己或者超级管理员可以下载,如果让某些自己信任的用户也能下载,那么就需要生成DownloadToken给这些用户来下载

  1. type DownloadToken struct {
  2. //继承Base,功能同上
  3. Base
  4. //颁发该token的用户
  5. UserUuid string `json:"userUuid"`
  6. //该token只能下载这个文件
  7. MatterUuid string `json:"matterUuid"`
  8. //有效期截止
  9. ExpireTime time.Time `json:"expireTime"`
  10. //下载者的ip
  11. Ip string `json:"ip"`
  12. }

 

Dashboard

开源云盘的控制面板,显示云盘的统计数据:PV/UV、'活跃'文件、活跃IP

  1. type Dashboard struct {
  2. //继承Base,功能同上
  3. Base
  4. //环比,表示连续2个单位周期(比如连续两周)内的量的变化比。
  5. InvokeNum int64 `json:"invokeNum"`
  6. //总环比
  7. TotalInvokeNum int64 `json:"totalInvokeNum"`
  8. //当日UV
  9. Uv int64 `json:"uv"`
  10. //总UV
  11. TotalUv int64 `json:"totalUv"`
  12. //当日文件总数
  13. MatterNum int64 `json:"matterNum"`
  14. //总文件总数
  15. TotalMatterNum int64 `json:"totalMatterNum"`
  16. //当日文件总大小
  17. FileSize int64 `json:"fileSize"`
  18. //文件总大小
  19. TotalFileSize int64 `json:"totalFileSize"`
  20. //平均耗时,反映了服务器整体的响应速度
  21. AvgCost int64 `json:"avgCost"`
  22. //日期
  23. Dt string `json:"dt"`
  24. }

 

Share

文件分享记录

  1. type Share struct {
  2. //继承Base,功能同上
  3. Base
  4. //分享该记录的名称
  5. Name string `json:"name"`
  6. //分享类型,文件/文件夹/混合类型
  7. ShareType string `json:"shareType"`
  8. //分享该记录的用户
  9. Username string `json:"username"`
  10. //分享该记录的用户标识
  11. UserUuid string `json:"userUuid"`
  12. //下载次数
  13. DownloadTimes int64 `json:"downloadTimes"`
  14. //提取码
  15. Code string `json:"code"`
  16. //是否过期失效
  17. ExpireInfinity bool `json:"expireInfinity"`
  18. //过期时间
  19. ExpireTime time.Time `json:"expireTime"`
  20. //文件夹文件
  21. DirMatter *Matter `json:"dirMatter"`
  22. //文件集合
  23. Matters []*Matter `json:"matters"`
  24. }

 

WebResult

WebResult并不是会持久化到数据库中实体,WebResult是在controller返回数据给前端时包装的一层,有了WebResult后每个接口返回的数据会更加统一,方便了前端的统一处理

  1. type WebResult struct {
  2. //状态码,具体每个码的意义参考下文
  3. Code int `json:"code"`
  4. //一句话描述请求结果,通常会是出错时指明出错原因,或者修改权限等小操作时提示的`操作成功`
  5. Msg string `json:"msg"`
  6. //内容可能是一个实体,也可能是一个 Pager.
  7. Data interface{} `json:"data"`
  8. }

 

状态码对应关系如下:

  1. const (
  2. //正常
  3. RESULT_CODE_OK = 200
  4. //未登录
  5. RESULT_CODE_LOGIN = -400
  6. //没有权限
  7. RESULT_CODE_UNAUTHORIZED = -401
  8. //请求错误
  9. RESULT_CODE_BAD_REQUEST = -402
  10. //没有找到
  11. RESULT_CODE_NOT_FOUND = -404
  12. //登录过期
  13. RESULT_CODE_LOGIN_EXPIRED = -405
  14. //该登录用户不是有效用户
  15. RESULT_CODE_LOGIN_INVALID = -406
  16. //提交的表单验证不通过
  17. RESULT_CODE_FORM_INVALID = -410
  18. //请求太频繁
  19. RESULT_CODE_FREQUENCY = -420
  20. //服务器出错
  21. RESULT_CODE_SERVER_ERROR = -500
  22. //远程服务不可用
  23. RESULT_CODE_NOT_AVAILABLE = -501
  24. //并发异常
  25. RESULT_CODE_CONCURRENCY = -511
  26. //远程微服务没有找到
  27. RESULT_CODE_SERVICE_NOT_FOUND = -600
  28. //远程微服务连接超时
  29. RESULT_CODE_SERVICE_TIME_OUT = -610
  30. //通用的异常
  31. RESULT_CODE_UTIL_EXCEPTION = -700
  32. )

 

二、返回规范

开源云盘采用前后端分离的模式,前端调用后端接口时,url均以/api开头,返回均是json字符串

  • 返回的json字符串的key均为小写开头的驼峰法,具体参考实体类中json标签

  • 返回的时间格式均为 YYYY-MM-dd HH:mm:ss(例如:2018-01-06 17:57:00)

返回内容均是由WebResult进行包装,因此具有高度的统一性,在这里我们约定一些说法,后面介绍Controller时便不再赘述

  1. 返回一个XX实体

    指的是WebResultCode=200Data=一个XX实体对象

    例:返回一个User,则前端会收到以下json字符串:

    1. {
    2. "code": 200,
    3. "msg": "",
    4. "data": {
    5. "uuid": "eed2c66d-1de6-47ff-645e-b67beaa10365",
    6. "sort": 1514803034507,
    7. "modifyTime": "2018-01-06 18:00:58",
    8. "createTime": "2018-01-01 18:37:15",
    9. "role": "USER",
    10. "username": "demo",
    11. "avatarUrl": "/api/alien/download/ea490cb6-368e-436d-71c0-fcfb08854c80/1180472.png",
    12. "lastIp": "124.78.220.82",
    13. "lastTime": "2018-01-06 18:00:58",
    14. "sizeLimit": 1048576,
    15. "totalSizeLimit": 104857600,
    16. "totalSize": 10485760,
    17. "status": "OK"
    18. }
    19. }

     

  2. 返回XXPager

    指的是WebResultCode=200Data=XX的Pager

    例:返回UserPager,则前端会收到以下json字符串:

    1. {
    2. "code": 200,
    3. "msg": "",
    4. "data": {
    5. "page": 0,
    6. "pageSize": 10,
    7. "totalItems": 2,
    8. "totalPages": 1,
    9. "data": [
    10. {
    11. "uuid": "6a661938-8289-4957-4096-5a1b584bf371",
    12. "sort": 1515057859613,
    13. "modifyTime": "2018-01-04 17:26:01",
    14. "createTime": "2018-01-04 17:24:20",
    15. "role": "ADMINISTRATOR",
    16. "username": "simba",
    17. "avatarUrl": "/api/alien/download/d1e453cb-3170-4bdb-73f2-fa0372ee017b/1180480.png",
    18. "lastIp": "180.173.103.207",
    19. "lastTime": "2018-01-04 17:26:01",
    20. "sizeLimit": -1,
    21. "totalSizeLimit": 104857600,
    22. "totalSize": 10485760,
    23. "status": "OK"
    24. },
    25. {
    26. "uuid": "e59be6a3-f806-463e-553a-4c5892eedf78",
    27. "sort": 1514881002975,
    28. "modifyTime": "2018-01-02 16:16:43",
    29. "createTime": "2018-01-02 16:16:43",
    30. "role": "USER",
    31. "username": "blog_dev",
    32. "avatarUrl": "/api/alien/download/fdca6eee-d009-4eb3-5ad4-15ba3701cb2e/jump.jpg",
    33. "lastIp": "",
    34. "lastTime": "2018-01-02 16:16:43",
    35. "sizeLimit": 1048576,
    36. "totalSizeLimit": 104857600,
    37. "totalSize": 10485760,
    38. "status": "OK"
    39. }
    40. ]
    41. }
    42. }

     

  3. 返回错误信息:yyy

    指的是WebResultCode=-400Msg=yyy(这里的Code具体值参考上文的code表)

    例:返回错误信息:"【新建文件夹】已经存在了,请使用其他名称。",则前端会收到以下json字符串:

    1. {
    2. "code": -700,
    3. "msg": "【新建文件夹】已经存在了,请使用其他名称。",
    4. "data": null
    5. }

     

  4. 返回成功信息:zzz

    指的是WebResultCode=200Msg=zzz(这里的Code具体值参考上文的code表)

    例:返回成功信息:"删除成功。",则前端会收到以下json字符串:

    1. {
    2. "code": 200,
    3. "msg": "删除成功。",
    4. "data": null
    5. }

     

三、接口

开源云盘所有的接口均定义在controller中,总共定义了以下controller

名称所在文件描述
PreferenceControllerpreference_controller.go网站标题,logo,版权说明等信息的增删改查
MatterControllermatter_controller.go站内创建文件夹,上传文件,删除文件,修改权限等
UserControlleruser_controller.go登录,管理操作站内用户
AlienControlleralien_controller.go第三方授权上传,下载,预处理
DashboardControllerdashboard_controller.go云盘控制面板,查看整体数据,PU/PV访问情况
ShareControllershare_controller.go分享,操作、获取、下载分享文件/文件夹

每个接口都有不同的访问级别,系统中定义了三种访问级别,分别是:

游客 < 注册用户 < 管理员

PreferenceController

该Controller负责网站中的偏好设置,主要操作Preference实体


/api/preference/fetch

功能:读取网站偏好设置,网站名称,logo,版权,备案信息,zip下载大小限制,zip下载数量限制,用户默认总大小限制,是否允许自主注册均从此接口读取

访问级别游客,注册用户,管理员

请求参数:无

返回: 一个Preference实体


/api/preference/edit

功能:编辑网站偏好设置,修改网站名称,logo,版权,备案信息,zip下载大小限制,zip下载数量限制,用户默认总大小限制,是否允许自主注册

访问级别管理员

请求参数

名称类型必填性描述
namestring必填网站名称
logoUrlstring选填网站logoUrl,如果不填默认使用开源云盘logo
faviconUrlstring选填网站faviconUrl,如果不填默认使用开源云盘favicon.ico
copyrightstring选填网站版权所有信息
recordstring选填网站备案信息
downloadDirMaxSizeStrint选填zip下载大小限制
downloadDirMaxNumStrint选填zip下载数量限制
defaultTotalSizeLimitStrint选填用户默认总大小限制
allowRegisterStrbool选填是否允许自主注册

返回: 一个Preference实体


/api/preference/system/cleanup

功能:重置系统,谨慎操作

访问级别管理员

请求参数

名称类型必填性描述
passwordstring必填管理员用户密码

返回: 成功信息“重置成功”


MatterController

该Controller负责站内创建文件夹,上传文件,修改文件路径,删除文件,修改文件访问权限等,主要操作Matter实体


/api/matter/create/directory

功能:创建文件夹

访问级别注册用户,管理员

请求参数

名称类型必填性描述
userUuidstring必填用户的唯一标识,文件存放在该用户名下
puuidstring必填准备创建的目录所在的目录,如果在根目录下创建传root
namestring必填文件夹名称, 不能包含以下特殊符号:< > \| * ? / \

返回: 新建的这个文件夹的Matter实体


/api/matter/upload

功能:上传文件

访问级别注册用户,管理员

请求参数

名称类型必填性描述
userUuidstring必填用户的唯一标识,文件存放在该用户名下
puuidstring选填文件上传到哪个目录下
filefile必填二进制文件,在浏览器中是通过<input type="file" name="file"/>来选择的
alienbool选填是否为第三方文件,默认false
privacybool选填文件的私有性,默认true

返回: 刚上传的这个文件的Matter实体


/api/matter/crawl(命令行工具)

功能:通过url获取文件

访问级别注册用户,管理员

请求参数

名称类型必填性描述
urlstring选填文件url路径
destPathstring选填目的路径
filenamestring必填文件名称

返回: 刚上传的这个文件的Matter实体


/api/matter/delete

功能:删除文件或者文件夹

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填待删除的文件或文件夹的uuid

返回: 成功信息“删除成功”


/api/matter/delete/batch

功能:批量删除文件或文件夹

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidsstring必填待删除的文件或文件夹的uuids,用逗号(,)分隔

返回: 成功信息“删除成功”


/api/matter/rename

功能:重命名文件或文件夹

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填文件的uuid
namestring必填新名字,不能包含以下特殊符号:< > \| * ? / \

返回: 刚重命名的这个文件的Matter实体


/api/matter/change/privacy

功能:改变文件的公私有属性

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填文件的uuid
privacybool选填文件的私有性,默认false

返回: 成功信息“设置成功”


/api/matter/move

功能:将一个文件夹或者文件移入到另一个文件夹下

访问级别注册用户,管理员

请求参数

名称类型必填性描述
srcUuidsstring必填待移动的文件或文件夹的uuids,用逗号(,)分隔
destUuidstring必填目标文件夹,根目录用root

返回: 成功信息“设置成功”


/api/matter/detail

功能:产看文件详情

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填该文件的uuid

返回: 这个文件的Matter实体


/api/matter/page

功能:按照分页的方式获取某个文件夹下文件和子文件夹的列表

访问级别注册用户,管理员

请求参数

名称类型必填性描述
puuidstring选填文件夹uuid,如果根目录填root
pageint选填当前页数,0基,默认0
pageSizeint选填每页条目数,默认200
userUuidstring选填筛选文件拥有者,对于普通用户使用当前登录的用户uuid.
namestring选填模糊筛选文件名
dirbool选填筛选是否为文件夹
orderDirDESCASC选填按文件夹排序,DESC降序排,ASC升序排
orderCreateTimeDESCASC选填按创建时间排序,DESC降序排,ASC升序排
orderUpdateTimeDESCASC选填按最近修改时间排序,DESC降序排,ASC升序排
orderSortDESCASC选填默认排序,DESC降序排,ASC升序排
orderTimesDESCASC选填按下载次数排序,DESC降序排,ASC升序排
orderSizeDESCASC选填按文件大小排序,DESC降序排,ASC升序排
orderNameDESCASC选填按名称排序,DESC降序排,ASC升序排
extensionsstring选填按文件后缀名筛选,逗号(,)分隔。例:jpg,png,pdf
shareUuidstring选填分享的uuid,如果为空的话则puuid则为必填项
shareCodestring选填提取码
shareRootUuidstring选填分享根目录uuid

返回MatterPager


/api/matter/mirror

功能:把本地文件映射到开源云盘中(命令行工具)

访问级别注册用户,管理员

请求参数

名称类型必填性描述
srcPathstring必填原文件路径
destPathstring选填目标路径
overwritebool选填是否覆盖,默认false

/api/matter/zip

功能:把文件批量打包下载

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidsstring必填待下载的文件或文件夹的uuids,用逗号(,)分隔

UserController

该Controller负责站内创建文件夹,上传文件,删除文件,修改权限等,主要操作Matter实体


/api/user/login

功能:登录

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
usernamestring必填用户名
passwordstring必填密码

返回: 当前登录的User实体


/api/user/authentication/login

功能:授权变身登录

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
authenticationstring必填授权验证信息

返回: 当前登录的User实体


/api/user/register

功能:自助注册

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
usernamestring必填用户名
passwordstring必填密码

返回: 当前登录的User实体


/api/user/edit

功能:编辑用户

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填待编辑的用户uuid
avatarUrlstring选填头像
sizeLimitint必填用户上传单文件限制,单位byte. 如果负数表示无限制
totalSizeLimitstring必填该用户允许上传的总文件最大大小,单位byte
rolestring选填角色

返回: 编辑的User实体


/api/user/detail

功能:查看用户详情

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填待查看的用户uuid

返回User实体


/api/user/logout

功能:退出登录

访问级别游客,注册用户,管理员

请求参数:无

返回: 成功信息"退出成功!"


/api/user/page

功能:查看用户列表

访问级别管理员

请求参数

名称类型必填性描述
pageint选填当前页数,0基,默认0
pageSizeint选填每页条目数,默认200
usernamestring选填模糊筛选用户名
statusstring选填用户状态,枚举类型
orderSortDESCASC选填默认排序,DESC降序排,ASC升序排
orderLastTimeDESCASC选填按上次登录时间排序,DESC降序排,ASC升序排
orderCreateTimeDESCASC选填按创建时间排序,DESC降序排,ASC升序排
orderUpdateTimeDESCASC选填按创建时间排序,DESC降序排,ASC升序排

返回User实体的Pager


/api/user/change/password

功能:开源云盘用户修改用户密码

访问级别注册用户,管理员

请求参数

名称类型必填性描述
oldPasswordstring必填旧密码
newPasswordstring必填新密码

返回: 修改密码的User实体


/api/user/reset/password

功能:管理员重置用户密码

访问级别管理员

请求参数

名称类型必填性描述
userUuidstring必填待重置密码的用户uuid
passwordstring必填新密码

返回: 修改密码的User实体


/api/user/toggle/status

功能:管理员修改用户状态

访问级别管理员

请求参数

名称类型必填性描述
uuidstring必填待操作的用户

返回: 修改状态的User实体


/api/user/transfiguration

功能:管理员变身

访问级别管理员

请求参数

名称类型必填性描述
uuidstring必填用户id

返回: 变身用户的uuid


DashboardController

该Controller为开源云盘的控制面板,帮助了解云盘的统计数据:PV/UV、'活跃'文件、活跃IP


/api/dashboard/page

功能:获取近一段时间统计数据

访问级别管理员

请求参数

名称类型必填性描述
pageint选填当前页数,0基,默认0
pageSizeint选填每页条目数,默认200
orderSortDESCASC选填默认排序,DESC降序排,ASC升序排
orderDtDESCASC选填按日期排序,DESC降序排,ASC升序排
orderCreateTimeDESCASC选填按创建时间排序,DESC降序排,ASC升序排
orderUpdateTimeDESCASC选填按创建时间排序,DESC降序排,ASC升序排

返回Dashboard实体的Pager


/api/dashboard/active/ip/top10

功能:获取Top10活跃IP

访问级别管理员

请求参数:无

返回: 由iptimes组成的List


ShareController

该Controller为开源云盘的提供分享功能,可以用来分享一切你想要分享的东西(文件/文件夹)


/api/share/create

功能:创建文件分享

访问级别注册用户,管理员

请求参数

名称类型必填性描述
matterUuidsstring必填文件uuid,要想分享的文件uuid,分享多个文件uuid用逗号隔开
expireInfinitybool必填分享是否过期失效,默认false
expireTimestring必填过期日期,如果expireInfinity为true则默认为当天

返回: 被分享的Share实体


/api/share/delete

功能:在我的分享里删除文件分享

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidstring必填文件uuid,要想删除分享的文件uuid

返回: 成功信息“操作成功”


/api/share/delete/batch

功能:在我的分享里批量删除文件分享

访问级别注册用户,管理员

请求参数

名称类型必填性描述
uuidsstring必填文件uuid,要想删除分享的文件uuid,删除多个文件分享uuid用逗号隔开

返回: 成功信息“操作成功”


/api/share/page

功能:获取我的文件分享列表

访问级别注册用户,管理员

请求参数

名称类型必填性描述
pageint选填当前页数,0基,默认0
pageSizeint选填每页条目数,默认200
orderCreateTimeDESCASC选填按创建时间排序,DESC降序排,ASC升序排

返回Share实体的Pager


/api/share/browse

功能:被分享者打开文件分享

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
shareUuidstring必填当前分享实体的uuid
codestring选填提取码,如果不是自己的分享则为必填项
puuidstring选填文件uuid
rootUuidstring选填当前分享正在查看的根目录uuid,前端辅助字段

返回: 被分享的Share实体


/api/share/zip

功能:被分享者下载文件分享

访问级别游客,注册用户,管理员

请求参数

名称类型必填性描述
shareUuidstring必填当前分享实体的uuid
codestring选填提取码,如果不是自己的分享则为必填项
puuidstring选填文件uuid
rootUuidstring选填当前分享正在查看的根目录uuid,前端辅助字段

返回: 无

 

开源云盘前端

开源云盘前端采用vue2.0 + vue-router + vue-resource + es6 +less的技术栈,项目中引入了model层,其层级与数据库存储层级相对应,为视图层提供模型, 进而视图层能够完全面向对象思想进行开发,这是本项目的精髓所在,components文件夹下放了一些通用的组件,欢迎大家使用并提出意见!

 

项目部分结构

  1. ├── doc // vue-cli创建后配置文档
  2. ├── node_modules // 依赖包存放目录
  3. ├── public // 入口目录
  4. ├── src // 源码目录
  5. │   ├── assets // 静态资源
  6. │   ├── common // 通用
  7. │   │   ├── directive // 自定义指令
  8. │   │   │   ├── directive.js // 验证规则指令
  9. │   │   ├── filter // 格式化
  10. │   │   ├── fork // 引用外部插件
  11. │   │   ├── i18n // 国际化通用
  12. │   │   ├── util // 工具包
  13. │   ├── components // 公用组件
  14. │   │   ├── copy // 复制工具
  15. │   │   ├── filter // 筛选工具
  16. │   │   ├── photoswipe // 图片预览
  17. │   │   ├── previewer // 预览通用
  18. │   │   ├── CreateSaveButton.vue // 保存创建按钮组件
  19. │   │   ├── LoadingFrame.vue // 框架加载组件
  20. │   │   ├── NbBtnDropdown.vue // 按钮下拉组件
  21. │   │   ├── NbCheckbox.vue // 复选框组件
  22. │   │   ├── NbExpanding.vue // 收缩展开组件
  23. │   │   ├── NbPager.vue // 分页组件
  24. │   │   ├── NbRadio.vue // 单选框组件
  25. │   │   ├── NbSlidePanel.vue // 动画组件
  26. │   │   ├── NbSwitcher.vue // 开关按钮组件
  27. │   ├── model // 前端模型层
  28. │   │   ├── base //
  29. │   │   │   ├── Base.js // 基类
  30. │   │   │   ├── BaseEntity.js // 实体基类
  31. │   │   │   ├── Filter.js // 过滤器类
  32. │   │   │   ├── Pager.js // 分页类
  33. │   │   ├── dashboard // 控制面板类
  34. │   │   ├── download // 下载token类
  35. │   │   ├── image // 图片缓存类
  36. │   │   ├── install // 配置类
  37. │   │   ├── matter // 文件类
  38. │   │   ├── preference // 个性类
  39. │   │   ├── share // 分享
  40. │   │   │   ├── Share.js // 分享类
  41. │   │   │   ├── ShareExpireOption.js // 分享时限类
  42. │   │   │   ├── ShareType.js // 分享文件类型类
  43. │   │   ├── user // 用户
  44. │   │   │   ├── User.js // 用户类
  45. │   │   │   ├── UserRole.js // 用户角色类
  46. │   │   │   ├── UserStatus.js // 用户状态类
  47. │   ├── router // 路由层
  48. │   ├── views // 视图层
  49. │   │   ├── dashboard // 控制面板视图
  50. │   │   │   ├── theme.json // echarts配置文件
  51. │   │   ├── install // 云盘配置视图
  52. │   │   ├── layout // 布局视图
  53. │   │   │   ├── BottomNavigation.vue // 尾部布局
  54. │   │   │   ├── SideMenu.vue // 侧边栏菜单
  55. │   │   │   ├── SideNavigation.vue // 侧边栏布局
  56. │   │   │   ├── TopNavigation.vue // 头部布局
  57. │   │   ├── matter // 文件视图
  58. │   │   │   ├── widget
  59. │   │   │   │   ├── imageCache // 图片缓存插件
  60. │   │   │   │   ├── Director.js // 单个文件的导演类
  61. │   │   │   │   ├── FolderTree.vue // 文件夹递归树组件
  62. │   │   │   │   ├── MatterImage.vue // 图片类型文件上传组件
  63. │   │   │   │   ├── MatterPanel.vue // 单文件或文件夹个体
  64. │   │   │   │   ├── MoveBatchPanel.vue // 批量文件移动组件
  65. │   │   │   │   ├── UploadMatterPanel.vue // 文件上传组件
  66. │   │   ├── preference // 个性化视图
  67. │   │   ├── share // 分享视图
  68. │   │   ├── user // 用户视图
  69. │   │   │   ├── feature // 权限枚举
  70. │   │   ├── Frame.vue // 大架子
  71. │   ├── vuex // store

 

 

常见问题

 

为什么不能上传中文文件?

请首先检查数据库的编码,采用utf-8编码就可以上传中文。

以下提供常用数据库指令,以下数据库名为tank,表为tank30_user

  1. # 查看数据库编码
  2. USE tank;
  3. SHOW VARIABLES LIKE 'character_set_database';
  4. # 修改数据库编码
  5. ALTER SCHEMA `tank` DEFAULT CHARACTER SET utf8 ;
  6. # 查看表以及字段编码
  7. show create table tank.tank30_user;
  8. # 修改表编码
  9. ALTER TABLE `tank`.`tank30_user`
  10. CHARACTER SET = utf8 ;
  11. # 修改字段编码
  12. ALTER TABLE `tank`.`tank30_user`
  13. CHANGE COLUMN `username` `username` VARCHAR(45) CHARACTER SET 'utf8' NOT NULL ;

 

如何配置nginx反向代理?

通常我们不希望把6010端口暴露到公网,这时需要nginx进行反向代理,让用户使用域名及80端口(或443端口)就能访问开源云盘。以下是tank.eyeblue.cn的nginx配置

  1. #https://tank.eyeblue.cn
  2. server{
  3. listen 443 ssl;
  4. server_name tank.eyeblue.cn;
  5. ssl on;
  6. ssl_certificate /letsencrypt/full_chain.pem;
  7. #private key
  8. ssl_certificate_key /letsencrypt/private.key;
  9. gzip on; #开启或关闭gzip on off
  10. gzip_disable "msie6"; #不使用gzip IE6
  11. gzip_min_length 100k; #gzip压缩最小文件大小,超出进行压缩(自行调节)
  12. gzip_buffers 4 16k; #buffer 不用修改
  13. gzip_comp_level 3; #压缩级别:1-10,数字越大压缩的越好,时间也越长
  14. gzip_types application/javascript text/css text/javascript; # 压缩文件类型
  15. gzip_vary off; #跟Squid等缓存服务有关,on的话会在Header里增加 "Vary: Accept-Encoding"
  16. location / {
  17. proxy_pass http://127.0.0.1:6010;
  18. proxy_set_header host $host;
  19. proxy_set_header X-Forwarded-For $remote_addr;
  20. proxy_pass_request_headers on;
  21. client_max_body_size 2048m;
  22. }
  23. }
  24. #http://tank.eyeblue.cn 转发所有80的请求到443
  25. server {
  26. listen 80;
  27. server_name tank.eyeblue.cn;
  28. rewrite ^(.*)$ https://tank.eyeblue.cn$1 permanent;
  29. }

提示

由于前端资源文件chunk-vendors.js 约2M,因此在nginx的配置中使用gzip压缩可以显著提升访问速度。

 

为什么太大的文件就不能上传了?

可能是反向代理的软件对post大小限制了,比如上方nginx配置的client_max_body_size 2048m;就使得最大只能上传2G的文件

 

为什么我的doc,ppt,xls等office文件不能预览?

由于预览office文件是借助了微软的接口,因此预览有这几个限制。

  • 你部署的开源云盘必须是公网ip或者外网可以访问的域名。(也就是或127.0.0.1或者localhost都不行)
  • 文件不能太大,超过10M微软的预览接口便不支持了。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号