Browse Source

Remove lots of useless files.

master
lishuang 5 years ago
parent
commit
b6b72e0273
  1. 2
      README.md
  2. 134
      README_EN.md
  3. 13
      build/doc/README_en.md
  4. 12
      build/doc/README_zh.md
  5. 15
      build/doc/TODO.md
  6. 132
      build/doc/alien_zh.md
  7. 798
      build/doc/api_zh.md
  8. 14
      build/doc/dependency.md
  9. BIN
      build/doc/img/download-time-line.png
  10. BIN
      build/doc/img/upload-time-line.png
  11. 6
      build/doc/sql/schema.sql
  12. 267
      build/doc/webdav/PROPFIND.md
  13. 28
      build/html/asset-manifest.json
  14. 2
      build/html/index.html
  15. 90
      build/html/precache-manifest.ccfa339629826c4f691fddd04a755bb3.js
  16. 39
      build/html/service-worker.js
  17. 13
      build/html/static/css/2.1e26383f.chunk.css
  18. 1
      build/html/static/css/2.1e26383f.chunk.css.map
  19. 6
      build/html/static/css/2.a7c12095.chunk.css
  20. 1
      build/html/static/css/2.a7c12095.chunk.css.map
  21. 2
      build/html/static/css/main.057cbed1.chunk.css
  22. 1
      build/html/static/css/main.057cbed1.chunk.css.map
  23. 2
      build/html/static/css/main.ad2716e3.chunk.css
  24. 1
      build/html/static/css/main.ad2716e3.chunk.css.map
  25. 3
      build/html/static/js/2.4025fae7.chunk.js
  26. 3
      build/html/static/js/2.cf834e40.chunk.js
  27. 0
      build/html/static/js/2.cf834e40.chunk.js.LICENSE.txt
  28. 2
      build/html/static/js/2.cf834e40.chunk.js.map
  29. 2
      build/html/static/js/main.3f3aecb2.chunk.js
  30. 1
      build/html/static/js/main.3f3aecb2.chunk.js.map
  31. 2
      build/html/static/js/main.7c593b59.chunk.js
  32. 1
      build/html/static/js/main.7c593b59.chunk.js.map
  33. 2
      code/rest/matter_model.go

2
README.md

@ -1,6 +1,6 @@
[![蓝眼云盘logo](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/logo.png)](https://github.com/eyebluecn/tank)
[English Version](./README_EN.md)
[English Version](https://tank-doc.eyeblue.cn/en)
# 蓝眼云盘(3.0.6)

134
README_EN.md

@ -1,134 +0,0 @@
[![蓝眼云盘logo](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/logo.png)](https://github.com/eyebluecn/tank)
[中文版](./README_EN.md)
# Eyeblue Cloud Disk(2.0.0)
[Online Demo](https://tank.eyeblue.cn) (demo@tank.eyeblue.cn 123456)
![](https://tank.eyeblue.cn/api/alien/download/df372827-ba56-415e-42d1-0e3a34fdb2a1/github20x20.png "github20x20.png") [tank backend](https://github.com/eyebluecn/tank)
![](https://tank.eyeblue.cn/api/alien/download/df372827-ba56-415e-42d1-0e3a34fdb2a1/github20x20.png "github20x20.png") [tank-front frontend](https://github.com/eyebluecn/tank-front)
### Description
Eyeblue Cloud Disk is one of [Eyeblue Softwares](https://github.com/eyebluecn), and it is the basic software for other eyeblue softwares.Eyeblue Cloud Disk has the following features.
**1. Easy to use**
- Docker available
- [Install package](https://github.com/eyebluecn/tank/releases) is about 10M. Cross platform.
- Unpack the install zip, and run it with one command.
- Installation Guide
- Dashboard to view UV and PV.
- Preview usual files (doc,ppt,xls,pdf,mp3,mp4,jpg,png)
**2. Core features all in readiness**
- Manage your files on cloud.
- Responsive on PC and mobile.
- Normal user and administrator
**3. Custom Api supported**
- Support [Custom Api](https://github.com/eyebluecn/tank/blob/master/build/doc/alien_zh.md)
- Manage files by api.
If this project is helpful for you, star ⭐ it.
### Screen Shot
#### PC
![](./build/doc/img/tank0.png)
![](./build/doc/img/tank1.png)
![](./build/doc/img/tank2.png)
![](./build/doc/img/tank3.png)
![](./build/doc/img/tank4.png)
#### Mobile
![](./build/doc/img/mobile.png)
### Installation by Docker
##### a) Run
```
docker run --name tank -p 6010:6010 -d eyeblue/tank:2.0.0
```
If you'd like to start you mysql by docker, use the following command.
```
docker run --name mysql4tank -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=tank -e MYSQL_USER=tank -e MYSQL_PASSWORD=tank123 -v ~/data/mysqldemo1:/var/lib/mysql -d mysql:5.7
```
##### b) Validation
Open http://127.0.0.1:6010 it succeed if you see the installation guide.
### Installation by installation package (windows/linux almost the same)
##### a) Prepare
1. [Mysql](https://www.mysql.com/downloads/) (Use utf8 charset)
2. [Here](https://github.com/eyebluecn/tank/releases) download installation package.
3. Unzip on server
##### b) Run
- Double click `tank.exe` on windows
- Run the following command on linux
```
cd ApplicationDirectory
./tank
```
If you'd like to run in daemon mode.
```shell
# Run the application
cd ApplicationDirectory/service
./startup.sh
# Stop the application
cd ApplicationDirectory/service
./shutdown.sh
```
##### c) Validation
Open http://127.0.0.1:6010 it succeed if you see the installation guide.
### Reference
[api](https://github.com/eyebluecn/tank/blob/master/build/doc/api_zh.md)
[Custom API](https://github.com/eyebluecn/tank/blob/master/build/doc/alien_zh.md)
### Contribution
Thanks these authors [@zicla](https://github.com/zicla),[@seaheart](https://github.com/seaheart),[@yemuhe](https://github.com/yemuhe),[@hxsherry](https://github.com/hxsherry)
You can join us by scanning the following qcode.
![](./build/doc/img/dingding.jpg)
### License
[MIT](http://opensource.org/licenses/MIT)
Copyright (c) 2017-present, eyeblue.cn

13
build/doc/README_en.md

@ -1,13 +0,0 @@
# Eyeblue Tank
> The document is comming...
go build -mod=readonly
### Program Arguments
-mode=mirror -username=admin -password=123456 -src=/Users/fusu/d/temp -dest=/morning

12
build/doc/README_zh.md

@ -1,12 +0,0 @@
# 蓝眼云盘
> 详细文档正在撰写中,敬请期待...
## go module
### install new package
go get golang.org/x/net
### update package
go get -u

15
build/doc/TODO.md

@ -1,15 +0,0 @@
# TODO LIST
- 允许自定义分享码
- webdav能力增强 这个webdav项目我使用了1年多,感觉还不错,如果确有上述问题,改善时可供参考。
https://github.com/hacdias/webdav.git
- 手机端上传视频还有问题,es用起来还有问题。
- 后台Office做成可配置的
- 前端按照文件类型显示

132
build/doc/alien_zh.md

@ -1,132 +0,0 @@
# 蓝眼云盘编程接口
- 蓝眼云盘提供了[编程接口](https://github.com/eyebluecn/tank/blob/master/build/doc/alien_zh.md),实现了云存储(如:[七牛云](https://www.qiniu.com),[阿里云OSS](https://www.aliyun.com/product/oss))的核心功能,可以使用编程接口上传文件,作为其他网站、系统、app的资源存储器。可以在下载图片时对图片做缩放裁剪处理,可以有效地节省客户端流量。
- 蓝眼系列开源软件之二的[《蓝眼博客》](https://github.com/eyebluecn/blog)正是使用蓝眼博客作为第三方资源存储器。蓝眼博客中的所有图片,附件均是存储在蓝眼云盘中。
所有的编程接口均定义在`alien_controller`中,主要包括以下几个接口:
`/api/alien/fetch/upload/token` 获取上传token
`/api/alien/fetch/download/token` 获取下载token
`/api/alien/confirm` 来蓝眼云盘确认文件
`/api/alien/upload` 使用form表单上传文件
`/api/alien/download/{uuid}/{filename}` 下载文件
### 上传时序图
![上传时序图](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/upload-time-line.png)
### 下载时序图
![下载时序图](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/download-time-line.png)
### 接口详情
#### /api/alien/fetch/upload/token
功能:一个蓝眼云盘受信任的用户请求一个`UploadToken`,用于给另一个用户向蓝眼云盘上传文件。
一般的使用场景是`应用服务器`向`蓝眼云盘`请求`UploadToken`,然后将此`UploadToken`交由`浏览器`去向`蓝眼云盘`上传文件。
参数 | 类型 | 描述
--------- | ---- | -----------
email | `string` | 【必填】邮箱,用于确定请求者身份
password | `string` | 【必填】密码,用于确定请求者身份
filename | `string` | 【必填】即将上传的文件名,不能包含以下特殊符号:`< > \| * ? / \`
expire | `int` | 【选填】UploadToken过期时间,单位:s。默认 86400s 即24h
privacy | `bool` | 【必填】文件的共有性。`true`表示文件私有,下载时必须要DownloadToken. `false`表示文件公有,任何人可以通过下载链接直接下载
size | `int` | 【必填】文件的大小。单位:byte
dir | `string` | 【必填】文件存放的路径。不能为空,必须以`/`开头,不能出现连续的`//`,不能包含以下特殊符号:`< > \| * ? \`。举例:`/app/blog/20180101121212001`
#### /api/alien/upload
功能:浏览器拿着`UploadToken`通过FormData向蓝眼云盘上传文件。
一般的使用场景是`应用服务器`向`蓝眼云盘`请求`UploadToken`,然后将此`UploadToken`交由`浏览器`去向`蓝眼云盘`上传文件。由于在请求`UploadToken`的时候已经传入了文件元信息,因此这里的文件信息必须要和`/api/alien/fetch/upload/token`传入的参数信息一致。
参数 | 类型 | 描述
--------- | ---- | -----------
uploadTokenUuid | `string` | 【必填】uploadToken标识,`/api/alien/fetch/upload/token`请求返回对象中的`uuid`
file | `file` | 【必填】文件,在浏览器中是通过`<input type="file" name="file"/>`来选择的
#### /api/alien/confirm
功能:`应用服务器`向蓝眼云盘确认某个文件是否确实已经上传好了。
参数 | 类型 | 描述
--------- | ---- | -----------
email | `string` | 【必填】邮箱,用于确定请求者身份
password | `string` | 【必填】密码,用于确定请求者身份
matterUuid | `string` | 【必填】浏览器上传完毕后,蓝眼云盘返回给浏览器的`uuid`
#### /api/alien/fetch/download/token
功能:一个蓝眼云盘受信任的用户请求一个`DownloadToken`,用于给另一个用户下载蓝眼云盘上的私有文件。
一般的使用场景是`应用服务器`向`蓝眼云盘`请求`DownloadToken`,然后将此`DownloadToken`交由`浏览器`去向`蓝眼云盘`下载文件。
参数 | 类型 | 描述
--------- | ---- | -----------
email | `string` | 【必填】邮箱,用于确定请求者身份
password | `string` | 【必填】密码,用于确定请求者身份
matterUuid | `string` | 【必填】文件uuid,要想下载的文件`uuid`
expire | `int` | 【选填】UploadToken过期时间,单位:s。默认 86400s 即24h
#### /api/alien/download/{uuid}/{filename}
功能:在浏览器中下载文件
这个接口既可以下载公有文件,又可以下载私有文件。同时对于图片文件还可以做裁剪缩放等操作。
参数 | 类型 | 描述
--------- | ---- | -----------
uuid | `string` | 【必填】文件的uuid,该参数放在url的路径中
filename | `string` | 【必填】文件的名称,该参数放在url的路径中
downloadTokenUuid | `string` | 【选填】download的uuid,如果是私有文件该参数必须,公有文件无需填写。
该接口同时还可以对图片进行缩放预处理
> 图片缩放支持的格式有:".jpg", ".jpeg", ".png", ".tif", ".tiff", ".bmp", ".gif"
##### 额外参数
| 参数 | 类型 | 描述 | 取值范围 |
| ------------ | ---- | ------------ | ------------ |
| imageProcess | `string` | 指定图片处理的方式,对于图片缩放固定为`resize` | 固定为`resize` |
| imageResizeM | `string` | 指定图片缩放的策略,有三种策略,`fit` 表示固定一边,另一边按比例缩放;`fill`表示先将图片延伸出指定W与H的矩形框外,然后进行居中裁剪;`fixed`表示直接按照指定的W和H缩放图片,这种方式可能导致图片变形 | [`fit`,`fill`,`fixed`] 不填默认`fit` |
| imageResizeW | `int` | 指定的宽度,对于`fit`可以不指定 | 1 ~ 4096 |
| imageResizeH | `int` | 指定的高度,对于`fit`可以不指定 | 1 ~ 4096 |
##### 示例
原图:
![将宽度指定为200,高度等比例缩放](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg)
1. 将宽度指定为200,高度等比例缩放
![将宽度指定为200,高度等比例缩放](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fit&imageResizeW=200)
[http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fit&imageResizeW=200](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fit&imageResizeW=200)
2. 将高度指定为200,宽度等比例缩放
![将高度指定为200,宽度等比例缩放](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fit&imageResizeH=200)
[http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fit&imageResizeH=200](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fit&imageResizeH=200)
3. 图片自动填充在200*200的大小中 (这种情况用得最多)
![图片自动填充在200*200的大小中](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fill&imageResizeW=200&imageResizeH=200)
[http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fill&imageResizeW=200&imageResizeH=200](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fill&imageResizeW=200&imageResizeH=200)
4. 图片固定大小200*200 (一般会导致变形)
![图片自动填充在200*200的大小中](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fixed&imageResizeW=200&imageResizeH=200)
[http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fixed&imageResizeW=200&imageResizeH=200](http://tank.eyeblue.cn/api/alien/download/3f4b3090-e688-4d63-7705-93a120690505/horse.jpg?imageProcess=resize&imageResizeM=fixed&imageResizeW=200&imageResizeH=200)

798
build/doc/api_zh.md

@ -1,798 +0,0 @@
# 蓝眼云盘api接口
## 一、实体
在详细介绍各controller中的接口前,有必要先介绍蓝眼云盘中的各实体,所有的实体基类均为`Base`
#### Base
`Base`定义如下,所有会在数据库中持久化的实体均会继承`Base`,`Controller`在返回实体给前端时,会将字段和值序列化成json字符串,其中键就和每个实体字段后面的`json`标签一致,下文也会有详细例子介绍
```
type Base struct {
//唯一标识
Uuid string `gorm:"primary_key" json:"uuid"`
//排序用的字段,一般是时间戳来表示序号先后
Sort int64 `json:"sort"`
//修改时间
ModifyTime time.Time `json:"modifyTime"`
//创建时间
CreateTime time.Time `json:"createTime"`
}
```
#### Preference
`Preference`是整个网站的偏好设置,网站的名称,logo,favicon,版权,备案号等信息均由这个实体负责。定义如下:
```
type Preference struct {
//继承Base,也就是说Base中的Uuid,Sort,ModifyTime,CreateTime这里也会有
Base
//网站名称
Name string `json:"name"`
//网站的logo url
LogoUrl string `json:"logoUrl"`
//网站的favicon.ico url
FaviconUrl string `json:"faviconUrl"`
//网站下方第一行信息,一般是版权信息
FooterLine1 string `json:"footerLine1"`
//网站下方的第二行信息,一般是本案信息
FooterLine2 string `json:"footerLine2"`
//当前运行的蓝眼博客版本,这个字段不可修改,每次发版时硬编码
Version string `json:"version"`
}
```
#### Matter
`Matter`是代表文件(文件夹是一种特殊的文件),为了和系统的`file`重复,这里使用`matter`,这个实体是蓝眼云盘最重要的实体:
```
type Matter struct {
//继承Base,也就是说Base中的Uuid,Sort,ModifyTime,CreateTime这里也会有
Base
//所在的文件夹的uuid,如果在根目录下,这个字段为 root
Puuid string `json:"puuid"`
//创建这个文件的用户uuid
UserUuid string `json:"userUuid"`
//该文件是否是文件夹
Dir bool `json:"dir"`
//该文件是否是应用文件,比如用户上传的头像这个字段就为true. 一般上传的文件就为false
Alien bool `json:"alien"`
//文件名,带后缀名。例如:avatar.jpg
Name string `json:"name"`
//文件的md5值,目前该功能尚未实现,作为保留字段
Md5 string `json:"md5"`
//文件大小,单位 byte。比如某个文件1M大,那么这里就为: 1048576
Size int64 `json:"size"`
//文件是否为私有,如果true则该文件只能作者或超级管理员可以下载,如果false所有人均可以通过下载链接下载。
Privacy bool `json:"privacy"`
//文件在磁盘中的路径,前端无需关心这个字段。但是后端在寻找文件时这个字段非常关键。
Path string `json:"path"`
//该文件的父级matter,该字段不会持久化到数据集,属于获取matter详情时临时组装出来的。
Parent *Matter `gorm:"-" json:"parent"`
}
```
#### User
`User`是代表用户:
```
type User struct {
//继承Base,也就是说Base中的Uuid,Sort,ModifyTime,CreateTime这里也会有
Base
//角色,有以下枚举值:GUEST(游客,不会持久化到数据库),USER(普通用户),ADMINISTRATOR(超级管理员)
Role string `json:"role"`
//用户名,在Matter的path字段中很有用。
Username string `json:"username"`
//密码,默认不会返回给前端
Password string `json:"-"`
//邮箱,作为登录时的账户
Email string `json:"email"`
//手机
Phone string `json:"phone"`
//性别,有以下枚举值:MALE(男性),FEMALE(女性),UNKNOWN(未知)
Gender string `json:"gender"`
//城市
City string `json:"city"`
//头像Url
AvatarUrl string `json:"avatarUrl"`
//上次登录时的ip
LastIp string `json:"lastIp"`
//上次登录的时间
LastTime time.Time `json:"lastTime"`
//该用户允许上传的单文件最大大小
SizeLimit int64 `json:"sizeLimit"`
//状态,有以下枚举值:OK(正常),DISABLED(被禁用)
Status string `json:"status"`
}
```
### UploadToken
用于给陌生人上传的token
```
type UploadToken struct {
//继承Base,也就是说Base中的Uuid,Sort,ModifyTime,CreateTime这里也会有
Base
//颁发该token的用户,系统中任何用户都能颁发token
UserUuid string `json:"userUuid"`
//使用这个token上传文件就必须上传在这个文件夹下
FolderUuid string `json:"folderUuid"`
//陌生人上传好了的文件uuid
MatterUuid string `json:"matterUuid"`
//过期时间
ExpireTime time.Time `json:"expireTime"`
//使用这个token上传文件就必须是这个文件名
Filename string `json:"filename"`
//使用这个token上传文件就必须是这个公私有性
Privacy bool `json:"privacy"`
//使用这个token上传文件就必须这个大小
Size int64 `json:"size"`
//使用这个token上传文件陌生人的ip
Ip string `json:"ip"`
}
```
### DownloadToken
用于给陌生人下载的token,一个matter如果Privacy=true,那么就意味着只有自己或者超级管理员可以下载,如果让某些自己信任的用户也能下载,那么就需要生成`DownloadToken`给这些用户来下载。
```
type DownloadToken struct {
//继承Base,也就是说Base中的Uuid,Sort,ModifyTime,CreateTime这里也会有
Base
//颁发该token的用户
UserUuid string `json:"userUuid"`
//该token只能下载这个文件
MatterUuid string `json:"matterUuid"`
//有效期截止
ExpireTime time.Time `json:"expireTime"`
//下载者的ip
Ip string `json:"ip"`
}
```
### Pager
在前端请求一个列表时,通常返回的都是一个`Pager`,`Pager`中就是装的各个实体的列表。
```
type Pager struct {
//当前页数,0基
Page int `json:"page"`
//每页的大小
PageSize int `json:"pageSize"`
//总的条目数
TotalItems int `json:"totalItems"`
//总的页数
TotalPages int `json:"totalPages"`
//实体的数组
Data interface{} `json:"data"`
}
```
### WebResult
`WebResult`并不是会持久化到数据库中实体,`WebResult`是在`controller`返回数据给前端时包装的一层,有了`WebResult`后每个接口返回的数据会更加统一,方便了前端的统一处理。
```
type WebResult struct {
//状态码,具体每个码的意义参考下文
Code int `json:"code"`
//一句话描述请求结果,通常会是出错时指明出错原因,或者修改权限等小操作时提示的`操作成功`
Msg string `json:"msg"`
//内容可能是一个实体,也可能是一个 Pager.
Data interface{} `json:"data"`
}
```
状态码对应关系如下:
```
const (
//正常
RESULT_CODE_OK = 200
//未登录
RESULT_CODE_LOGIN = -400
//没有权限
RESULT_CODE_UNAUTHORIZED = -401
//请求错误
RESULT_CODE_BAD_REQUEST = -402
//没有找到
RESULT_CODE_NOT_FOUND = -404
//登录过期
RESULT_CODE_LOGIN_EXPIRED = -405
//该登录用户不是有效用户
RESULT_CODE_LOGIN_INVALID = -406
//提交的表单验证不通过
RESULT_CODE_FORM_INVALID = -410
//请求太频繁
RESULT_CODE_FREQUENCY = -420
//服务器出错。
RESULT_CODE_SERVER_ERROR = -500
//远程服务不可用
RESULT_CODE_NOT_AVAILABLE = -501
//并发异常
RESULT_CODE_CONCURRENCY = -511
//远程微服务没有找到
RESULT_CODE_SERVICE_NOT_FOUND = -600
//远程微服务连接超时
RESULT_CODE_SERVICE_TIME_OUT = -610
//通用的异常
RESULT_CODE_UTIL_EXCEPTION = -700
)
```
## 二、返回规范
蓝眼云盘采用前后端分离的模式,前端调用后端接口时,url均以`/api`开头,返回均是json字符串。
- 返回的json字符串的key均为小写开头的驼峰法,具体参考实体类中`json`标签
- 返回的时间格式均为 `YYYY-MM-dd HH:mm:ss`(例如:2018-01-06 17:57:00)
返回内容均是由`WebResult`进行包装,因此具有高度的统一性,在这里我们约定一些说法,后面介绍`Controller`时便不再赘述。
1. 返回一个`XX`实体
指的是`WebResult`的`Code=200`, `Data=一个XX实体对象`
例:返回一个User,则前端会收到以下json字符串:
```
{
"code": 200,
"msg": "",
"data": {
"uuid": "eed2c66d-1de6-47ff-645e-b67beaa10365",
"sort": 1514803034507,
"modifyTime": "2018-01-06 18:00:58",
"createTime": "2018-01-01 18:37:15",
"role": "USER",
"username": "demo",
"email": "demo@tank.eyeblue.cn",
"phone": "",
"gender": "UNKNOWN",
"city": "",
"avatarUrl": "/api/alien/download/ea490cb6-368e-436d-71c0-fcfb08854c80/1180472.png",
"lastIp": "124.78.220.82",
"lastTime": "2018-01-06 18:00:58",
"sizeLimit": 1048576,
"status": "OK"
}
}
```
2. 返回`XX`的`Pager`
指的是`WebResult`的`Code=200`, `Data=XX的Pager`
例:返回`User`的`Pager`,则前端会收到以下json字符串:
```
{
"code": 200,
"msg": "",
"data": {
"page": 0,
"pageSize": 10,
"totalItems": 2,
"totalPages": 1,
"data": [
{
"uuid": "6a661938-8289-4957-4096-5a1b584bf371",
"sort": 1515057859613,
"modifyTime": "2018-01-04 17:26:01",
"createTime": "2018-01-04 17:24:20",
"role": "ADMINISTRATOR",
"username": "simba",
"email": "y******5@163.com",
"phone": "",
"gender": "MALE",
"city": "",
"avatarUrl": "/api/alien/download/d1e453cb-3170-4bdb-73f2-fa0372ee017b/1180480.png",
"lastIp": "180.173.103.207",
"lastTime": "2018-01-04 17:26:01",
"sizeLimit": -1,
"status": "OK"
},
{
"uuid": "e59be6a3-f806-463e-553a-4c5892eedf78",
"sort": 1514881002975,
"modifyTime": "2018-01-02 16:16:43",
"createTime": "2018-01-02 16:16:43",
"role": "USER",
"username": "blog_dev",
"email": "b*****@tank.eyeblue.cn",
"phone": "",
"gender": "MALE",
"city": "",
"avatarUrl": "/api/alien/download/fdca6eee-d009-4eb3-5ad4-15ba3701cb2e/jump.jpg",
"lastIp": "",
"lastTime": "2018-01-02 16:16:43",
"sizeLimit": 1048576,
"status": "OK"
}
]
}
}
```
3. 返回错误信息:yyy
指的是`WebResult`的`Code=-400`, `Msg=yyy`。(这里的Code具体值参考上文的code表)
例:返回错误信息:"【新建文件夹】已经存在了,请使用其他名称。",则前端会收到以下json字符串:
```
{
"code": -700,
"msg": "【新建文件夹】已经存在了,请使用其他名称。",
"data": null
}
```
4. 返回成功信息:zzz
指的是`WebResult`的`Code=200`, `Msg=zzz`。(这里的Code具体值参考上文的code表)
例:返回成功信息:"删除成功。",则前端会收到以下json字符串:
```
{
"code": 200,
"msg": "删除成功。",
"data": null
}
```
## 三、接口
蓝眼云盘所有的接口均定义在`controller`中,总共定义了以下`controller`:
名称 | 所在文件 | 描述
--------- | ---- | -----------
PreferenceController | `preference_controller.go` | 网站标题,logo,版权说明等信息的增删改查
MatterController | `matter_controller.go` | 站内创建文件夹,上传文件,删除文件,修改权限等
UserController | `user_controller.go` | 登录,管理操作站内用户
AlienController | `alien_controller.go` | 第三方授权上传,下载,预处理
每个接口都有不同的访问级别,系统中定义了三种访问级别,分别是:
`游客` < `注册用户` < `管理员`
### PreferenceController
该Controller负责网站中的偏好设置,主要操作`Preference`实体
----------
#### /api/preference/fetch
**功能**:读取网站偏好设置,网站名称,logo,版权,备案信息均从此接口读取。
**访问级别**:`游客`,`注册用户`,`管理员`
**请求参数**:无
**返回**: 一个`Preference`实体
----------
#### /api/preference/edit
**功能**:编辑网站偏好设置,修改网站名称,logo,版权,备案信息。
**访问级别**:`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
name | `string` | 必填 | 网站名称
logoUrl | `string` | 选填 | 网站logoUrl,如果不填默认使用蓝眼云盘logo
faviconUrl | `string` | 选填 | 网站faviconUrl,如果不填默认使用蓝眼云盘favicon.ico
footerLine1 | `string` | 选填 | 网站版权所有信息
footerLine2 | `string` | 选填 | 网站备案信息
**返回**: 一个`Preference`实体
----------
### MatterController
该Controller负责站内创建文件夹,上传文件,删除文件,修改权限等,主要操作`Matter`实体
----------
#### /api/matter/create/directory
**功能**:创建文件夹
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
puuid | `string` | 必填 | 准备创建的目录所在的目录,如果在根目录下创建传`root`
name | `string` | 必填 | 文件夹名称, 不能包含以下特殊符号:`< > \| * ? / \`
**返回**: 新建的这个文件夹的`Matter`实体
----------
#### /api/matter/upload
**功能**:上传文件
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
userUuid | `string` | 选填 | 该文件的归属人,如果不填则使用当前登录的用户uuid;如果是管理员要给用户A上传文件,那么这里应该填A的uuid.
alien | `bool` | 选填 | 是否是应用数据,true表示应用数据,这时会自动放置在`应用数据`这个文件夹下,比如上传头像。false表示非应用数据,这时`puuid`字段为必填
puuid | `bool` | 选填 | 文件上传到哪个目录下。 如果`alien`=false,这个字段必填。
privacy | `bool` | 选填 | 文件的私有性,默认`false`
file | `file` | 必填 | 文件,在浏览器中是通过`<input type="file" name="file"/>`来选择的
**返回**: 刚上传的这个文件的`Matter`实体
----------
#### /api/matter/delete
**功能**:删除文件或者文件夹
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 待删除的文件或文件夹的uuid
**返回**: 成功信息“删除成功”
----------
#### /api/matter/delete/batch
**功能**:批量删除文件或文件夹
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuids | `string` | 必填 | 待删除的文件或文件夹的uuids,用逗号(,)分隔。
**返回**: 成功信息“删除成功”
----------
#### /api/matter/rename
**功能**:重命名文件或文件夹
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 文件的uuid
name | `string` | 必填 | 新名字,不能包含以下特殊符号:`< > \| * ? / \`
**返回**: 刚重命名的这个文件的`Matter`实体
----------
#### /api/matter/change/privacy
**功能**:改变文件的公私有属性
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 文件的uuid
privacy | `bool` | 选填 | 文件的私有性,默认`false`
**返回**: 成功信息“设置成功”
----------
#### /api/matter/move
**功能**:将一个文件夹或者文件移入到另一个文件夹下。
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
srcUuids | `string` | 必填 | 待移动的文件或文件夹的uuids,用逗号(,)分隔。
destUuid | `string` | 必填 | 目标文件夹,根目录用`root`
**返回**: 成功信息“设置成功”
----------
#### /api/matter/detail
**功能**:产看文件详情
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 该文件的uuid。
destUuid | `string` | 必填 | 目标文件夹,根目录用`root`
**返回**: 这个文件的`Matter`实体
----------
#### /api/matter/page
**功能**:按照分页的方式获取某个文件夹下文件和子文件夹的列表
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
puuid | `string` | 选填 | 文件夹uuid,如果根目录填`root`
page | `int` | 选填 | 当前页数,0基,默认0
pageSize | `int` | 选填 | 每页条目数,默认200
userUuid | `string` | 选填 | 筛选文件拥有者,对于普通用户使用当前登录的用户uuid.
name | `string` | 选填 | 模糊筛选文件名
dir | `bool` | 选填 | 筛选是否为文件夹
orderDir | `DESC`或`ASC` | 选填 | 按文件夹排序,`DESC`降序排,`ASC`升序排
orderCreateTime | `DESC`或`ASC` | 选填 | 按创建时间排序,`DESC`降序排,`ASC`升序排
orderSize | `DESC`或`ASC` | 选填 | 按文件大小排序,`DESC`降序排,`ASC`升序排
orderName | `DESC`或`ASC` | 选填 | 按名称排序,`DESC`降序排,`ASC`升序排
extensions | `string` | 选填 | 按文件后缀名筛选,逗号(,)分隔。例:`jpg,png,pdf`
**返回**: `Matter`的`Pager`
----------
#### /api/alien/download/{uuid}/{filename}
这个接口的定义在在`AlienController`中的,具体使用请参考[蓝眼云盘编程接口](https://github.com/eyebluecn/tank/blob/master/build/doc/alien_zh.md) 这里只做简单的下载使用。
**功能**:下载文件。
**访问级别**:`游客`,`注册用户`,`管理员`
**请求参数**: 均是放置在url中
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 要下载的文件uuid
filename | `string` | 必填 | 要下载的文件名
**返回**: 二进制的文件
----------
### UserController
该Controller负责站内创建文件夹,上传文件,删除文件,修改权限等,主要操作`Matter`实体
----------
#### /api/user/create
**功能**:创建用户
**访问级别**:`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
username | `string` | 必填 | 用户名,且只能包含字母,数字和'_'
password | `string` | 必填 | 密码,密码长度至少为6位
email | `string` | 必填 | 邮箱,作为用户登录的凭证
avatarUrl | `string` | 选填 | 头像
phone | `string` | 选填 | 电话
gender | `string` | 选填 | 性别
role | `string` | 选填 | 角色
city | `string` | 选填 | 城市
sizeLimit | `string` | 选填 | 用户上传单文件限制,单位byte. 如果负数表示无限制。
**返回**: 新建的`User`实体
----------
#### /api/user/edit
**功能**:编辑用户
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 待编辑的用户uuid
avatarUrl | `string` | 选填 | 头像
phone | `string` | 选填 | 电话
gender | `string` | 选填 | 性别
role | `string` | 选填 | 角色
city | `string` | 选填 | 城市
sizeLimit | `string` | 选填 | 用户上传单文件限制,单位byte. 如果负数表示无限制。
**返回**: 编辑的`User`实体
----------
#### /api/user/change/password
**功能**:用户修改密码
**访问级别**:`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
oldPassword | `string` | 必填 | 旧密码
newPassword | `string` | 必填 | 新密码
**返回**: 修改密码的`User`实体
----------
#### /api/user/change/password
**功能**:管理员重置用户密码
**访问级别**:`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
userUuid | `string` | 必填 | 待重置密码的用户uuid
password | `string` | 必填 | 密码
**返回**: 修改密码的`User`实体
----------
#### /api/user/login
**功能**:登录
**访问级别**:`游客`,`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
email | `string` | 必填 | 邮箱
password | `string` | 必填 | 密码
**返回**: 当前登录的`User`实体
----------
#### /api/user/logout
**功能**:登录
**访问级别**:`注册用户`,`管理员`
**请求参数**:无
**返回**: 成功信息"退出成功!"
----------
#### /api/user/detail
**功能**:查看用户详情
**访问级别**:`游客`,`注册用户`,`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 待查看的用户uuid
**返回**: `User`实体
----------
#### /api/user/page
**功能**:查看用户列表
**访问级别**:`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
page | `int` | 选填 | 当前页数,0基,默认0
pageSize | `int` | 选填 | 每页条目数,默认200
username | `string` | 选填 | 模糊筛选用户名
email | `string` | 选填 | 模糊筛选邮箱
phone | `string` | 选填 | 模糊筛选电话
orderLastTime | `DESC`或`ASC` | 选填 | 按上次登录时间排序,`DESC`降序排,`ASC`升序排
orderCreateTime | `DESC`或`ASC` | 选填 | 按创建时间排序,`DESC`降序排,`ASC`升序排
**返回**: `User`实体的`Pager`
----------
#### /api/user/disable
**功能**:禁用用户
**访问级别**:`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 待操作的用户
**返回**: 被操作的用户`User`实体
----------
#### /api/user/enable
**功能**:启用用户
**访问级别**:`管理员`
**请求参数**:
名称 | 类型 | 必填性 | 描述
--------- | ---- | ---- | -----------
uuid | `string` | 必填 | 待操作的用户
**返回**: 被操作的用户`User`实体
----------
### AlienController
这个Controller主要暴露给第三方使用,详情请参考:[蓝眼云盘编程接口](https://github.com/eyebluecn/tank/blob/master/build/doc/alien_zh.md)

14
build/doc/dependency.md

@ -1,14 +0,0 @@
# Package dependency
```
main
├── bin
├── pkg
├── src
│   ├── github.com
│   ├── golang.org
│   ├── tank
│   │   ├── build
│   │   │   ├── conf
│   │   │   ├── doc
```

BIN
build/doc/img/download-time-line.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

BIN
build/doc/img/upload-time-line.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

6
build/doc/sql/schema.sql

@ -94,10 +94,11 @@ CREATE TABLE `tank31_matter` (
`path` varchar(1024) DEFAULT NULL,
`times` bigint(20) NOT NULL DEFAULT '0',
`prop` varchar(1024) NOT NULL DEFAULT '{}',
`visit_time` timestamp NULL DEFAULT '2018-01-01 00:00:00',
PRIMARY KEY (`uuid`),
UNIQUE KEY `uuid` (`uuid`),
KEY `idx_puuid` (`puuid`),
KEY `idx_uu` (`user_uuid`)
KEY `idx_uu` (`user_uuid`),
KEY `idx_puuid` (`puuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `tank31_preference` (
@ -115,6 +116,7 @@ CREATE TABLE `tank31_preference` (
`default_total_size_limit` bigint(20) NOT NULL DEFAULT '-1',
`allow_register` tinyint(1) NOT NULL DEFAULT '0',
`preview_config` text,
`scan_config` text,
PRIMARY KEY (`uuid`),
UNIQUE KEY `uuid` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

267
build/doc/webdav/PROPFIND.md

@ -1,267 +0,0 @@
#### PROPFIND 列出目录情况
request method
```
PROPFIND
```
request header
```
Authorization=Basic YWRtaW46YWRtaW4=
Content-Type=text/xml
Accept-Encoding=gzip
Depth=infinity
```
request body
```
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:resourcetype />
<D:getcontentlength />
<D:creationdate />
<D:getlastmodified />
</D:prop>
</D:propfind>
```
response body
```
<?xml version="1.0" encoding="UTF-8"?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>/api/dav/</D:href>
<D:propstat>
<D:prop>
<D:displayname>dav</D:displayname>
<D:getlastmodified>Tue, 16 Apr 2019 17:50:59 GMT</D:getlastmodified>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:resourcetype>
<D:collection xmlns:D="DAV:"/>
</D:resourcetype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/api/</D:href>
<D:propstat>
<D:prop>
<D:displayname>api</D:displayname>
<D:getlastmodified>Tue, 16 Apr 2019 17:51:03 GMT</D:getlastmodified>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:resourcetype>
<D:collection xmlns:D="DAV:"/>
</D:resourcetype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/api/dav/</D:href>
<D:propstat>
<D:prop>
<D:displayname>dav</D:displayname>
<D:getlastmodified>Tue, 16 Apr 2019 17:51:38 GMT</D:getlastmodified>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:resourcetype>
<D:collection xmlns:D="DAV:"/>
</D:resourcetype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/api/dav/body.txt</D:href>
<D:propstat>
<D:prop>
<D:displayname>body.txt</D:displayname>
<D:getlastmodified>Tue, 16 Apr 2019 17:51:38 GMT</D:getlastmodified>
<D:getcontenttype>text/plain; charset=utf-8</D:getcontenttype>
<D:getetag>"159605ccc1d0f3c410"</D:getetag>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:resourcetype></D:resourcetype>
<D:getcontentlength>16</D:getcontentlength>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/api/dav/cat.txt</D:href>
<D:propstat>
<D:prop>
<D:resourcetype></D:resourcetype>
<D:getcontentlength>24</D:getcontentlength>
<D:getlastmodified>Tue, 16 Apr 2019 17:51:19 GMT</D:getlastmodified>
<D:getcontenttype>text/plain; charset=utf-8</D:getcontenttype>
<D:getetag>"159605c862b0d64c18"</D:getetag>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:displayname>cat.txt</D:displayname>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/cat/</D:href>
<D:propstat>
<D:prop>
<D:getlastmodified>Sat, 13 Apr 2019 16:55:54 GMT</D:getlastmodified>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:displayname>cat</D:displayname>
<D:resourcetype>
<D:collection xmlns:D="DAV:"/>
</D:resourcetype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/cat/dog/</D:href>
<D:propstat>
<D:prop>
<D:getlastmodified>Sat, 13 Apr 2019 16:55:58 GMT</D:getlastmodified>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:displayname>dog</D:displayname>
<D:resourcetype>
<D:collection xmlns:D="DAV:"/>
</D:resourcetype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/cat/dog/pig/</D:href>
<D:propstat>
<D:prop>
<D:resourcetype>
<D:collection xmlns:D="DAV:"/>
</D:resourcetype>
<D:getlastmodified>Sat, 13 Apr 2019 16:56:08 GMT</D:getlastmodified>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:displayname>pig</D:displayname>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/cat/dog/pig/hi.txt</D:href>
<D:propstat>
<D:prop>
<D:getlastmodified>Sat, 13 Apr 2019 16:56:08 GMT</D:getlastmodified>
<D:getcontenttype>text/plain; charset=utf-8</D:getcontenttype>
<D:getetag>"15951707dc1116d87"</D:getetag>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
<D:displayname>hi.txt</D:displayname>
<D:resourcetype></D:resourcetype>
<D:getcontentlength>7</D:getcontentlength>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/api/dav/morning.txt</D:href>
<D:propstat>
<D:prop>
<D:resourcetype></D:resourcetype>
<D:getcontentlength>13</D:getcontentlength>
<D:displayname>morning.txt</D:displayname>
<D:getlastmodified>Sat, 13 Apr 2019 16:52:08 GMT</D:getlastmodified>
<D:getcontenttype>text/plain; charset=utf-8</D:getcontenttype>
<D:getetag>"159516cfe790beecd"</D:getetag>
<D:supportedlock>
<D:lockentry xmlns:D="DAV:">
<D:lockscope>
<D:exclusive/>
</D:lockscope>
<D:locktype>
<D:write/>
</D:locktype>
</D:lockentry>
</D:supportedlock>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>
```

28
build/html/asset-manifest.json

@ -1,19 +1,17 @@
{
"files": {
"main.css": "/static/css/main.ad2716e3.chunk.css",
"main.js": "/static/js/main.7c593b59.chunk.js",
"main.js.map": "/static/js/main.7c593b59.chunk.js.map",
"main.css": "/static/css/main.057cbed1.chunk.css",
"main.js": "/static/js/main.3f3aecb2.chunk.js",
"main.js.map": "/static/js/main.3f3aecb2.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.d1de6cff.js",
"runtime-main.js.map": "/static/js/runtime-main.d1de6cff.js.map",
"static/css/2.1e26383f.chunk.css": "/static/css/2.1e26383f.chunk.css",
"static/js/2.4025fae7.chunk.js": "/static/js/2.4025fae7.chunk.js",
"static/js/2.4025fae7.chunk.js.map": "/static/js/2.4025fae7.chunk.js.map",
"static/css/2.a7c12095.chunk.css": "/static/css/2.a7c12095.chunk.css",
"static/js/2.cf834e40.chunk.js": "/static/js/2.cf834e40.chunk.js",
"static/js/2.cf834e40.chunk.js.map": "/static/js/2.cf834e40.chunk.js.map",
"index.html": "/index.html",
"precache-manifest.ccfa339629826c4f691fddd04a755bb3.js": "/precache-manifest.ccfa339629826c4f691fddd04a755bb3.js",
"service-worker.js": "/service-worker.js",
"static/css/2.1e26383f.chunk.css.map": "/static/css/2.1e26383f.chunk.css.map",
"static/css/main.ad2716e3.chunk.css.map": "/static/css/main.ad2716e3.chunk.css.map",
"static/js/2.4025fae7.chunk.js.LICENSE.txt": "/static/js/2.4025fae7.chunk.js.LICENSE.txt",
"static/css/2.a7c12095.chunk.css.map": "/static/css/2.a7c12095.chunk.css.map",
"static/css/main.057cbed1.chunk.css.map": "/static/css/main.057cbed1.chunk.css.map",
"static/js/2.cf834e40.chunk.js.LICENSE.txt": "/static/js/2.cf834e40.chunk.js.LICENSE.txt",
"static/media/archive.svg": "/static/media/archive.77d78eb7.svg",
"static/media/audio.svg": "/static/media/audio.30a1ea02.svg",
"static/media/default-skin.css": "/static/media/default-skin.b257fa9c.svg",
@ -32,9 +30,9 @@
},
"entrypoints": [
"static/js/runtime-main.d1de6cff.js",
"static/css/2.1e26383f.chunk.css",
"static/js/2.4025fae7.chunk.js",
"static/css/main.ad2716e3.chunk.css",
"static/js/main.7c593b59.chunk.js"
"static/css/2.a7c12095.chunk.css",
"static/js/2.cf834e40.chunk.js",
"static/css/main.057cbed1.chunk.css",
"static/js/main.3f3aecb2.chunk.js"
]
}

2
build/html/index.html

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="eyeblue tank"/><title>EyeblueTank</title><link href="/static/css/2.1e26383f.chunk.css" rel="stylesheet"><link href="/static/css/main.ad2716e3.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run EyeblueTank.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,f,l=t[0],a=t[1],i=t[2],c=0,s=[];c<l.length;c++)f=l[c],Object.prototype.hasOwnProperty.call(o,f)&&o[f]&&s.push(o[f][0]),o[f]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(p&&p(t);s.length;)s.shift()();return u.push.apply(u,i||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var a=r[l];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=f(f.s=r[0]))}return e}var n={},o={1:0},u=[];function f(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=e,f.c=n,f.d=function(e,t,r){f.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,t){if(1&t&&(e=f(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(f.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)f.d(r,n,function(t){return e[t]}.bind(null,n));return r},f.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(t,"a",t),t},f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f.p="/";var l=this["webpackJsonptank-front"]=this["webpackJsonptank-front"]||[],a=l.push.bind(l);l.push=t,l=l.slice();for(var i=0;i<l.length;i++)t(l[i]);var p=a;r()}([])</script><script src="/static/js/2.4025fae7.chunk.js"></script><script src="/static/js/main.7c593b59.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="eyeblue tank"/><title>EyeblueTank</title><link href="/static/css/2.a7c12095.chunk.css" rel="stylesheet"><link href="/static/css/main.057cbed1.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run EyeblueTank.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,f,l=t[0],a=t[1],i=t[2],c=0,s=[];c<l.length;c++)f=l[c],Object.prototype.hasOwnProperty.call(o,f)&&o[f]&&s.push(o[f][0]),o[f]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(p&&p(t);s.length;)s.shift()();return u.push.apply(u,i||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var a=r[l];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=f(f.s=r[0]))}return e}var n={},o={1:0},u=[];function f(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=e,f.c=n,f.d=function(e,t,r){f.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,t){if(1&t&&(e=f(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(f.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)f.d(r,n,function(t){return e[t]}.bind(null,n));return r},f.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(t,"a",t),t},f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f.p="/";var l=this["webpackJsonptank-front"]=this["webpackJsonptank-front"]||[],a=l.push.bind(l);l.push=t,l=l.slice();for(var i=0;i<l.length;i++)t(l[i]);var p=a;r()}([])</script><script src="/static/js/2.cf834e40.chunk.js"></script><script src="/static/js/main.3f3aecb2.chunk.js"></script></body></html>

90
build/html/precache-manifest.ccfa339629826c4f691fddd04a755bb3.js

@ -1,90 +0,0 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "d48c6f871f2d20f2e614c0e496b75377",
"url": "/index.html"
},
{
"revision": "a23ead7f090fe419ff83",
"url": "/static/css/2.1e26383f.chunk.css"
},
{
"revision": "2c9ccc9736d8b6eb4a24",
"url": "/static/css/main.ad2716e3.chunk.css"
},
{
"revision": "a23ead7f090fe419ff83",
"url": "/static/js/2.4025fae7.chunk.js"
},
{
"revision": "d75343be710138f6c1989a9a015f0200",
"url": "/static/js/2.4025fae7.chunk.js.LICENSE.txt"
},
{
"revision": "2c9ccc9736d8b6eb4a24",
"url": "/static/js/main.7c593b59.chunk.js"
},
{
"revision": "29e6ed1c3e1c813c99bd",
"url": "/static/js/runtime-main.d1de6cff.js"
},
{
"revision": "77d78eb7f0a09aefee1f95f08411be46",
"url": "/static/media/archive.77d78eb7.svg"
},
{
"revision": "30a1ea0240c7d661749676da6b67f88e",
"url": "/static/media/audio.30a1ea02.svg"
},
{
"revision": "b257fa9c5ac8c515ac4d77a667ce2943",
"url": "/static/media/default-skin.b257fa9c.svg"
},
{
"revision": "1e70a87cbcfdd0396f2108aa45daf0df",
"url": "/static/media/doc.1e70a87c.svg"
},
{
"revision": "babf4d0801025493697c945389bb2e68",
"url": "/static/media/empty.babf4d08.svg"
},
{
"revision": "fd3e15f8a714653c3005a2773cd00b15",
"url": "/static/media/file.fd3e15f8.svg"
},
{
"revision": "f8d1b5009857e24890a42c866bbfe925",
"url": "/static/media/folder.f8d1b500.svg"
},
{
"revision": "06f036cece1ba8775007f41d6d22933c",
"url": "/static/media/image.06f036ce.svg"
},
{
"revision": "21458adb4d8cc0f1f6b4ee85b5a10f91",
"url": "/static/media/logo.21458adb.png"
},
{
"revision": "c256fdcbab556414dd550c6c5c5e568d",
"url": "/static/media/pdf.c256fdcb.svg"
},
{
"revision": "9ec3e0182feb8729760dad76c4e3378d",
"url": "/static/media/ppt.9ec3e018.svg"
},
{
"revision": "be6691be501376640a7c1e1dd678b2a8",
"url": "/static/media/psd.be6691be.svg"
},
{
"revision": "49dc13ae6f6d73ab9bdb3969eee980fa",
"url": "/static/media/text.49dc13ae.svg"
},
{
"revision": "4387235d573fc92ce361822a3306e532",
"url": "/static/media/video.4387235d.svg"
},
{
"revision": "ef5ba31bd69bdb3c3aec2db584781e53",
"url": "/static/media/xls.ef5ba31b.svg"
}
]);

39
build/html/service-worker.js

@ -1,39 +0,0 @@
/**
* Welcome to your Workbox-powered service worker!
*
* You'll need to register this file in your web app and you should
* disable HTTP caching for this file too.
* See https://goo.gl/nhQhGp
*
* The rest of the code is auto-generated. Please don't update this file
* directly; instead, make changes to your Workbox build configuration
* and re-run your build process.
* See https://goo.gl/2aRDsh
*/
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"/precache-manifest.ccfa339629826c4f691fddd04a755bb3.js"
);
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
workbox.core.clientsClaim();
/**
* The workboxSW.precacheAndRoute() method efficiently caches and responds to
* requests for URLs in the manifest.
* See https://goo.gl/S9QRab
*/
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("/index.html"), {
blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/],
});

13
build/html/static/css/2.1e26383f.chunk.css

File diff suppressed because one or more lines are too long

1
build/html/static/css/2.1e26383f.chunk.css.map

File diff suppressed because one or more lines are too long

6
build/html/static/css/2.a7c12095.chunk.css

File diff suppressed because one or more lines are too long

1
build/html/static/css/2.a7c12095.chunk.css.map

File diff suppressed because one or more lines are too long

2
build/html/static/css/main.057cbed1.chunk.css

File diff suppressed because one or more lines are too long

1
build/html/static/css/main.057cbed1.chunk.css.map

File diff suppressed because one or more lines are too long

2
build/html/static/css/main.ad2716e3.chunk.css

File diff suppressed because one or more lines are too long

1
build/html/static/css/main.ad2716e3.chunk.css.map

File diff suppressed because one or more lines are too long

3
build/html/static/js/2.4025fae7.chunk.js

File diff suppressed because one or more lines are too long

3
build/html/static/js/2.cf834e40.chunk.js

File diff suppressed because one or more lines are too long

0
build/html/static/js/2.4025fae7.chunk.js.LICENSE.txt → build/html/static/js/2.cf834e40.chunk.js.LICENSE.txt

2
build/html/static/js/2.4025fae7.chunk.js.map → build/html/static/js/2.cf834e40.chunk.js.map

File diff suppressed because one or more lines are too long

2
build/html/static/js/main.3f3aecb2.chunk.js

File diff suppressed because one or more lines are too long

1
build/html/static/js/main.3f3aecb2.chunk.js.map

File diff suppressed because one or more lines are too long

2
build/html/static/js/main.7c593b59.chunk.js

File diff suppressed because one or more lines are too long

1
build/html/static/js/main.7c593b59.chunk.js.map

File diff suppressed because one or more lines are too long

2
code/rest/matter_model.go

@ -39,7 +39,7 @@ type Matter struct {
Md5 string `json:"md5" gorm:"type:varchar(45)"`
Size int64 `json:"size" gorm:"type:bigint(20) not null;default:0"`
Privacy bool `json:"privacy" gorm:"type:tinyint(1) not null;default:0"`
Path string `json:"path" gorm:"type:varchar(1024);index:idx_p"`
Path string `json:"path" gorm:"type:varchar(1024)"`
Times int64 `json:"times" gorm:"type:bigint(20) not null;default:0"`
Parent *Matter `json:"parent" gorm:"-"`
Children []*Matter `json:"-" gorm:"-"`

Loading…
Cancel
Save