Remove lots of useless files.
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
[](https://github.com/eyebluecn/tank)
|
[](https://github.com/eyebluecn/tank)
|
||||||
|
|
||||||
[English Version](./README_EN.md)
|
[English Version](https://tank-doc.eyeblue.cn/en)
|
||||||
|
|
||||||
# 蓝眼云盘(3.0.6)
|
# 蓝眼云盘(3.0.6)
|
||||||
|
|
||||||
|
134
README_EN.md
134
README_EN.md
@ -1,134 +0,0 @@
|
|||||||
[](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)
|
|
||||||
|
|
||||||
 [tank backend](https://github.com/eyebluecn/tank)
|
|
||||||
|
|
||||||
 [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
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
#### Mobile
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### 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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### License
|
|
||||||
|
|
||||||
[MIT](http://opensource.org/licenses/MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2017-present, eyeblue.cn
|
|
@ -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
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
# 蓝眼云盘
|
|
||||||
|
|
||||||
> 详细文档正在撰写中,敬请期待...
|
|
||||||
|
|
||||||
|
|
||||||
## go module
|
|
||||||
|
|
||||||
### install new package
|
|
||||||
go get golang.org/x/net
|
|
||||||
|
|
||||||
### update package
|
|
||||||
go get -u
|
|
@ -1,15 +0,0 @@
|
|||||||
# TODO LIST
|
|
||||||
|
|
||||||
- 允许自定义分享码
|
|
||||||
|
|
||||||
- webdav能力增强 这个webdav项目我使用了1年多,感觉还不错,如果确有上述问题,改善时可供参考。
|
|
||||||
https://github.com/hacdias/webdav.git
|
|
||||||
|
|
||||||
- 手机端上传视频还有问题,es用起来还有问题。
|
|
||||||
|
|
||||||
- 后台Office做成可配置的
|
|
||||||
|
|
||||||
- 前端按照文件类型显示
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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}` 下载文件
|
|
||||||
|
|
||||||
### 上传时序图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 下载时序图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 接口详情
|
|
||||||
|
|
||||||
#### /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 |
|
|
||||||
|
|
||||||
##### 示例
|
|
||||||
|
|
||||||
原图:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
1. 将宽度指定为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,宽度等比例缩放
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
[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的大小中 (这种情况用得最多)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
[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 (一般会导致变形)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
[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)
|
|
@ -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)
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
# Package dependency
|
|
||||||
|
|
||||||
```
|
|
||||||
main
|
|
||||||
├── bin
|
|
||||||
├── pkg
|
|
||||||
├── src
|
|
||||||
│ ├── github.com
|
|
||||||
│ ├── golang.org
|
|
||||||
│ ├── tank
|
|
||||||
│ │ ├── build
|
|
||||||
│ │ │ ├── conf
|
|
||||||
│ │ │ ├── doc
|
|
||||||
```
|
|
Binary file not shown.
Before Width: | Height: | Size: 37 KiB |
Binary file not shown.
Before Width: | Height: | Size: 49 KiB |
@ -94,10 +94,11 @@ CREATE TABLE `tank31_matter` (
|
|||||||
`path` varchar(1024) DEFAULT NULL,
|
`path` varchar(1024) DEFAULT NULL,
|
||||||
`times` bigint(20) NOT NULL DEFAULT '0',
|
`times` bigint(20) NOT NULL DEFAULT '0',
|
||||||
`prop` varchar(1024) NOT NULL DEFAULT '{}',
|
`prop` varchar(1024) NOT NULL DEFAULT '{}',
|
||||||
|
`visit_time` timestamp NULL DEFAULT '2018-01-01 00:00:00',
|
||||||
PRIMARY KEY (`uuid`),
|
PRIMARY KEY (`uuid`),
|
||||||
UNIQUE KEY `uuid` (`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;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
CREATE TABLE `tank31_preference` (
|
CREATE TABLE `tank31_preference` (
|
||||||
@ -115,6 +116,7 @@ CREATE TABLE `tank31_preference` (
|
|||||||
`default_total_size_limit` bigint(20) NOT NULL DEFAULT '-1',
|
`default_total_size_limit` bigint(20) NOT NULL DEFAULT '-1',
|
||||||
`allow_register` tinyint(1) NOT NULL DEFAULT '0',
|
`allow_register` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
`preview_config` text,
|
`preview_config` text,
|
||||||
|
`scan_config` text,
|
||||||
PRIMARY KEY (`uuid`),
|
PRIMARY KEY (`uuid`),
|
||||||
UNIQUE KEY `uuid` (`uuid`)
|
UNIQUE KEY `uuid` (`uuid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
@ -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>
|
|
||||||
```
|
|
@ -1,19 +1,17 @@
|
|||||||
{
|
{
|
||||||
"files": {
|
"files": {
|
||||||
"main.css": "/static/css/main.ad2716e3.chunk.css",
|
"main.css": "/static/css/main.057cbed1.chunk.css",
|
||||||
"main.js": "/static/js/main.7c593b59.chunk.js",
|
"main.js": "/static/js/main.3f3aecb2.chunk.js",
|
||||||
"main.js.map": "/static/js/main.7c593b59.chunk.js.map",
|
"main.js.map": "/static/js/main.3f3aecb2.chunk.js.map",
|
||||||
"runtime-main.js": "/static/js/runtime-main.d1de6cff.js",
|
"runtime-main.js": "/static/js/runtime-main.d1de6cff.js",
|
||||||
"runtime-main.js.map": "/static/js/runtime-main.d1de6cff.js.map",
|
"runtime-main.js.map": "/static/js/runtime-main.d1de6cff.js.map",
|
||||||
"static/css/2.1e26383f.chunk.css": "/static/css/2.1e26383f.chunk.css",
|
"static/css/2.a7c12095.chunk.css": "/static/css/2.a7c12095.chunk.css",
|
||||||
"static/js/2.4025fae7.chunk.js": "/static/js/2.4025fae7.chunk.js",
|
"static/js/2.cf834e40.chunk.js": "/static/js/2.cf834e40.chunk.js",
|
||||||
"static/js/2.4025fae7.chunk.js.map": "/static/js/2.4025fae7.chunk.js.map",
|
"static/js/2.cf834e40.chunk.js.map": "/static/js/2.cf834e40.chunk.js.map",
|
||||||
"index.html": "/index.html",
|
"index.html": "/index.html",
|
||||||
"precache-manifest.ccfa339629826c4f691fddd04a755bb3.js": "/precache-manifest.ccfa339629826c4f691fddd04a755bb3.js",
|
"static/css/2.a7c12095.chunk.css.map": "/static/css/2.a7c12095.chunk.css.map",
|
||||||
"service-worker.js": "/service-worker.js",
|
"static/css/main.057cbed1.chunk.css.map": "/static/css/main.057cbed1.chunk.css.map",
|
||||||
"static/css/2.1e26383f.chunk.css.map": "/static/css/2.1e26383f.chunk.css.map",
|
"static/js/2.cf834e40.chunk.js.LICENSE.txt": "/static/js/2.cf834e40.chunk.js.LICENSE.txt",
|
||||||
"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/media/archive.svg": "/static/media/archive.77d78eb7.svg",
|
"static/media/archive.svg": "/static/media/archive.77d78eb7.svg",
|
||||||
"static/media/audio.svg": "/static/media/audio.30a1ea02.svg",
|
"static/media/audio.svg": "/static/media/audio.30a1ea02.svg",
|
||||||
"static/media/default-skin.css": "/static/media/default-skin.b257fa9c.svg",
|
"static/media/default-skin.css": "/static/media/default-skin.b257fa9c.svg",
|
||||||
@ -32,9 +30,9 @@
|
|||||||
},
|
},
|
||||||
"entrypoints": [
|
"entrypoints": [
|
||||||
"static/js/runtime-main.d1de6cff.js",
|
"static/js/runtime-main.d1de6cff.js",
|
||||||
"static/css/2.1e26383f.chunk.css",
|
"static/css/2.a7c12095.chunk.css",
|
||||||
"static/js/2.4025fae7.chunk.js",
|
"static/js/2.cf834e40.chunk.js",
|
||||||
"static/css/main.ad2716e3.chunk.css",
|
"static/css/main.057cbed1.chunk.css",
|
||||||
"static/js/main.7c593b59.chunk.js"
|
"static/js/main.3f3aecb2.chunk.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -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>
|
@ -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"
|
|
||||||
}
|
|
||||||
]);
|
|
@ -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: [/^\/_/,/\/[^/?]+\.[^/]+$/],
|
|
||||||
});
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
6
build/html/static/css/2.a7c12095.chunk.css
Normal file
6
build/html/static/css/2.a7c12095.chunk.css
Normal file
File diff suppressed because one or more lines are too long
1
build/html/static/css/2.a7c12095.chunk.css.map
Normal file
1
build/html/static/css/2.a7c12095.chunk.css.map
Normal file
File diff suppressed because one or more lines are too long
2
build/html/static/css/main.057cbed1.chunk.css
Normal file
2
build/html/static/css/main.057cbed1.chunk.css
Normal file
File diff suppressed because one or more lines are too long
1
build/html/static/css/main.057cbed1.chunk.css.map
Normal file
1
build/html/static/css/main.057cbed1.chunk.css.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
3
build/html/static/js/2.cf834e40.chunk.js
Normal file
3
build/html/static/js/2.cf834e40.chunk.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/html/static/js/main.3f3aecb2.chunk.js
Normal file
2
build/html/static/js/main.3f3aecb2.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
build/html/static/js/main.3f3aecb2.chunk.js.map
Normal file
1
build/html/static/js/main.3f3aecb2.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -39,7 +39,7 @@ type Matter struct {
|
|||||||
Md5 string `json:"md5" gorm:"type:varchar(45)"`
|
Md5 string `json:"md5" gorm:"type:varchar(45)"`
|
||||||
Size int64 `json:"size" gorm:"type:bigint(20) not null;default:0"`
|
Size int64 `json:"size" gorm:"type:bigint(20) not null;default:0"`
|
||||||
Privacy bool `json:"privacy" gorm:"type:tinyint(1) 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"`
|
Times int64 `json:"times" gorm:"type:bigint(20) not null;default:0"`
|
||||||
Parent *Matter `json:"parent" gorm:"-"`
|
Parent *Matter `json:"parent" gorm:"-"`
|
||||||
Children []*Matter `json:"-" gorm:"-"`
|
Children []*Matter `json:"-" gorm:"-"`
|
||||||
|
Reference in New Issue
Block a user