Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
FLIPPED-AURORA
gin-vue-admin
提交
0d7a291b
G
gin-vue-admin
项目概览
FLIPPED-AURORA
/
gin-vue-admin
大约 1 年 前同步成功
通知
342
Star
18155
Fork
5506
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gin-vue-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0d7a291b
编写于
4月 25, 2020
作者:
G
Granty1
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixed callback bug in front end file upload & move some constants to config.yaml
上级
d761b91d
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
143 addition
and
123 deletion
+143
-123
server/api/v1/exa_file_upload_download.go
server/api/v1/exa_file_upload_download.go
+2
-3
server/api/v1/sys_user.go
server/api/v1/sys_user.go
+1
-6
server/config.yaml
server/config.yaml
+4
-1
server/config/config.go
server/config/config.go
+2
-0
server/utils/upload.go
server/utils/upload.go
+6
-7
web/src/view/example/upload/upload.vue
web/src/view/example/upload/upload.vue
+128
-106
未找到文件。
server/api/v1/exa_file_upload_download.go
浏览文件 @
0d7a291b
...
@@ -27,7 +27,7 @@ func UploadFile(c *gin.Context) {
...
@@ -27,7 +27,7 @@ func UploadFile(c *gin.Context) {
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"上传文件失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"上传文件失败,%v"
,
err
),
c
)
}
else
{
}
else
{
//文件上传后拿到文件路径
//文件上传后拿到文件路径
err
,
filePath
,
key
:=
utils
.
Upload
(
header
,
USER_HEADER_BUCKET
,
USER_HEADER_IMG_PATH
)
err
,
filePath
,
key
:=
utils
.
Upload
(
header
)
if
err
!=
nil
{
if
err
!=
nil
{
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"接收返回值失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"接收返回值失败,%v"
,
err
),
c
)
}
else
{
}
else
{
...
@@ -45,7 +45,6 @@ func UploadFile(c *gin.Context) {
...
@@ -45,7 +45,6 @@ func UploadFile(c *gin.Context) {
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"修改数据库链接失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"修改数据库链接失败,%v"
,
err
),
c
)
}
else
{
}
else
{
response
.
OkDetailed
(
resp
.
ExaFileResponse
{
File
:
file
},
"上传成功"
,
c
)
response
.
OkDetailed
(
resp
.
ExaFileResponse
{
File
:
file
},
"上传成功"
,
c
)
}
}
}
}
}
}
...
@@ -65,7 +64,7 @@ func DeleteFile(c *gin.Context) {
...
@@ -65,7 +64,7 @@ func DeleteFile(c *gin.Context) {
if
err
!=
nil
{
if
err
!=
nil
{
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"删除失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"删除失败,%v"
,
err
),
c
)
}
else
{
}
else
{
err
=
utils
.
DeleteFile
(
USER_HEADER_BUCKET
,
f
.
Key
)
err
=
utils
.
DeleteFile
(
f
.
Key
)
if
err
!=
nil
{
if
err
!=
nil
{
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"删除失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"删除失败,%v"
,
err
),
c
)
...
...
server/api/v1/sys_user.go
浏览文件 @
0d7a291b
...
@@ -18,11 +18,6 @@ import (
...
@@ -18,11 +18,6 @@ import (
"time"
"time"
)
)
const
(
USER_HEADER_IMG_PATH
string
=
"http://qmplusimg.henrongyi.top"
USER_HEADER_BUCKET
string
=
"qm-plus-img"
)
// @Tags Base
// @Tags Base
// @Summary 用户注册账号
// @Summary 用户注册账号
// @Produce application/json
// @Produce application/json
...
@@ -172,7 +167,7 @@ func UploadHeaderImg(c *gin.Context) {
...
@@ -172,7 +167,7 @@ func UploadHeaderImg(c *gin.Context) {
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"上传文件失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"上传文件失败,%v"
,
err
),
c
)
}
else
{
}
else
{
//文件上传后拿到文件路径
//文件上传后拿到文件路径
err
,
filePath
,
_
:=
utils
.
Upload
(
header
,
USER_HEADER_BUCKET
,
USER_HEADER_IMG_PATH
)
err
,
filePath
,
_
:=
utils
.
Upload
(
header
)
if
err
!=
nil
{
if
err
!=
nil
{
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"接收返回值失败,%v"
,
err
),
c
)
response
.
FailWithMessage
(
fmt
.
Sprintf
(
"接收返回值失败,%v"
,
err
),
c
)
}
else
{
}
else
{
...
...
server/config.yaml
浏览文件 @
0d7a291b
...
@@ -18,16 +18,19 @@ mysql:
...
@@ -18,16 +18,19 @@ mysql:
max-idle-conns
:
10
max-idle-conns
:
10
max-open-conns
:
10
max-open-conns
:
10
log-mode
:
true
log-mode
:
true
#sqlite 配置
#sqlite 配置
sqlite
:
sqlite
:
path
:
db.db
path
:
db.db
log-mode
:
true
log-mode
:
true
config
:
'
loc=Asia/Shanghai'
config
:
'
loc=Asia/Shanghai'
# oss configuration
# oss configuration
qiniu
:
qiniu
:
access-key
:
'
25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ'
access-key
:
'
25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ'
secret-key
:
'
pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
secret-key
:
'
pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
bucket
:
'
qm-plus-img'
img-path
:
'
http://qmplusimg.henrongyi.top'
# redis configuration
# redis configuration
redis
:
redis
:
addr
:
'
127.0.0.1:6379'
addr
:
'
127.0.0.1:6379'
...
...
server/config/config.go
浏览文件 @
0d7a291b
...
@@ -46,6 +46,8 @@ type Redis struct {
...
@@ -46,6 +46,8 @@ type Redis struct {
type
Qiniu
struct
{
type
Qiniu
struct
{
AccessKey
string
`mapstructure:"access-key" json:"accessKey" yaml:"access-key"`
AccessKey
string
`mapstructure:"access-key" json:"accessKey" yaml:"access-key"`
SecretKey
string
`mapstructure:"secret-key" json:"secretKey" yaml:"secret-key"`
SecretKey
string
`mapstructure:"secret-key" json:"secretKey" yaml:"secret-key"`
Bucket
string
`mapstructure:"bucket" json:"bucket" yaml:"bucket"`
ImgPath
string
`mapstructure:"img-path" json:"imgPath" yaml:"img-path"`
}
}
type
Captcha
struct
{
type
Captcha
struct
{
...
...
server/utils/upload.go
浏览文件 @
0d7a291b
...
@@ -14,9 +14,9 @@ var accessKey string = global.GVA_CONFIG.Qiniu.AccessKey // 你在七牛云的ac
...
@@ -14,9 +14,9 @@ var accessKey string = global.GVA_CONFIG.Qiniu.AccessKey // 你在七牛云的ac
var
secretKey
string
=
global
.
GVA_CONFIG
.
Qiniu
.
SecretKey
// 你在七牛云的secretKey 这里是我个人测试号的key 仅供测试使用 恳请大家不要乱传东西
var
secretKey
string
=
global
.
GVA_CONFIG
.
Qiniu
.
SecretKey
// 你在七牛云的secretKey 这里是我个人测试号的key 仅供测试使用 恳请大家不要乱传东西
// 接收两个参数 一个文件流 一个 bucket 你的七牛云标准空间的名字
// 接收两个参数 一个文件流 一个 bucket 你的七牛云标准空间的名字
func
Upload
(
file
*
multipart
.
FileHeader
,
bucket
string
,
urlPath
string
)
(
err
error
,
path
string
,
key
string
)
{
func
Upload
(
file
*
multipart
.
FileHeader
)
(
err
error
,
path
string
,
key
string
)
{
putPolicy
:=
storage
.
PutPolicy
{
putPolicy
:=
storage
.
PutPolicy
{
Scope
:
b
ucket
,
Scope
:
global
.
GVA_CONFIG
.
Qiniu
.
B
ucket
,
}
}
mac
:=
qbox
.
NewMac
(
accessKey
,
secretKey
)
mac
:=
qbox
.
NewMac
(
accessKey
,
secretKey
)
upToken
:=
putPolicy
.
UploadToken
(
mac
)
upToken
:=
putPolicy
.
UploadToken
(
mac
)
...
@@ -43,14 +43,13 @@ func Upload(file *multipart.FileHeader, bucket string, urlPath string) (err erro
...
@@ -43,14 +43,13 @@ func Upload(file *multipart.FileHeader, bucket string, urlPath string) (err erro
fileKey
:=
fmt
.
Sprintf
(
"%d%s"
,
time
.
Now
()
.
Unix
(),
file
.
Filename
)
// 文件名格式 自己可以改 建议保证唯一性
fileKey
:=
fmt
.
Sprintf
(
"%d%s"
,
time
.
Now
()
.
Unix
(),
file
.
Filename
)
// 文件名格式 自己可以改 建议保证唯一性
err
=
formUploader
.
Put
(
context
.
Background
(),
&
ret
,
upToken
,
fileKey
,
f
,
dataLen
,
&
putExtra
)
err
=
formUploader
.
Put
(
context
.
Background
(),
&
ret
,
upToken
,
fileKey
,
f
,
dataLen
,
&
putExtra
)
if
err
!=
nil
{
if
err
!=
nil
{
fmt
.
Println
(
err
)
global
.
GVA_LOG
.
Error
(
"upload file fail:"
,
err
)
//qmlog.QMLog.Info(err)
return
err
,
""
,
""
return
err
,
""
,
""
}
}
return
err
,
url
Path
+
"/"
+
ret
.
Key
,
ret
.
Key
return
err
,
global
.
GVA_CONFIG
.
Qiniu
.
Img
Path
+
"/"
+
ret
.
Key
,
ret
.
Key
}
}
func
DeleteFile
(
bucket
string
,
key
string
)
error
{
func
DeleteFile
(
key
string
)
error
{
mac
:=
qbox
.
NewMac
(
accessKey
,
secretKey
)
mac
:=
qbox
.
NewMac
(
accessKey
,
secretKey
)
cfg
:=
storage
.
Config
{
cfg
:=
storage
.
Config
{
...
@@ -61,7 +60,7 @@ func DeleteFile(bucket string, key string) error {
...
@@ -61,7 +60,7 @@ func DeleteFile(bucket string, key string) error {
// 如果没有特殊需求,默认不需要指定
// 如果没有特殊需求,默认不需要指定
//cfg.Zone=&storage.ZoneHuabei
//cfg.Zone=&storage.ZoneHuabei
bucketManager
:=
storage
.
NewBucketManager
(
mac
,
&
cfg
)
bucketManager
:=
storage
.
NewBucketManager
(
mac
,
&
cfg
)
err
:=
bucketManager
.
Delete
(
b
ucket
,
key
)
err
:=
bucketManager
.
Delete
(
global
.
GVA_CONFIG
.
Qiniu
.
B
ucket
,
key
)
if
err
!=
nil
{
if
err
!=
nil
{
fmt
.
Println
(
err
)
fmt
.
Println
(
err
)
return
err
return
err
...
...
web/src/view/example/upload/upload.vue
浏览文件 @
0d7a291b
...
@@ -4,39 +4,55 @@
...
@@ -4,39 +4,55 @@
<el-upload
<el-upload
:action=
"`$
{path}/fileUploadAndDownload/upload`"
:action=
"`$
{path}/fileUploadAndDownload/upload`"
:before-upload="checkFile"
:before-upload="checkFile"
:headers="{'x-token':token
}"
:headers="{ 'x-token': token
}"
:on-error="uploadError"
:on-error="uploadError"
:on-success="uploadSuccess"
:on-success="uploadSuccess"
:show-file-list="false"
:show-file-list="false"
>
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
class=
"el-upload__tip"
slot=
"tip"
>
只能上传jpg/png文件,且不超过500kb
</div>
<div
class=
"el-upload__tip"
slot=
"tip"
>
只能上传jpg/png文件,且不超过500kb
</div>
</el-upload>
</el-upload>
<el-table
:data=
"tableData"
border
stripe
>
<el-table
:data=
"tableData"
border
stripe
>
<el-table-column
label=
"预览"
width=
"100"
>
<el-table-column
label=
"预览"
width=
"100"
>
<template
slot-scope=
"scope"
>
<template
slot-scope=
"scope"
>
<img
:alt=
"scope.row.alt"
:src=
"scope.row.url"
height=
"80"
width=
"80"
/>
<img
:alt=
"scope.row.alt"
:src=
"scope.row.url"
height=
"80"
width=
"80"
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
label=
"日期"
prop=
"UpdatedAt"
width=
"180"
>
<el-table-column
label=
"日期"
prop=
"UpdatedAt"
width=
"180"
>
<
template
slot-scope=
"scope"
>
<
template
slot-scope=
"scope"
>
<div>
{{
scope
.
row
.
UpdatedAt
|
formatDate
}}
</div>
<div>
{{
scope
.
row
.
UpdatedAt
|
formatDate
}}
</div>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
label=
"文件名"
prop=
"name"
width=
"180"
></el-table-column>
<el-table-column
label=
"文件名"
prop=
"name"
width=
"180"
></el-table-column>
<el-table-column
label=
"链接"
prop=
"url"
></el-table-column>
<el-table-column
label=
"链接"
prop=
"url"
></el-table-column>
<el-table-column
label=
"标签"
prop=
"tag"
width=
"100"
>
<el-table-column
label=
"标签"
prop=
"tag"
width=
"100"
>
<
template
slot-scope=
"scope"
>
<
template
slot-scope=
"scope"
>
<el-tag
<el-tag
:type=
"scope.row.tag === 'jpg' ? 'primary' : 'success'"
:type=
"scope.row.tag === 'jpg' ? 'primary' : 'success'"
disable-transitions
disable-transitions
>
{{
scope
.
row
.
tag
}}
</el-tag>
>
{{
scope
.
row
.
tag
}}
</el-tag
>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
label=
"操作"
width=
"100"
>
<el-table-column
label=
"操作"
width=
"100"
>
<
template
slot-scope=
"scope"
>
<
template
slot-scope=
"scope"
>
<el-button
@
click=
"downloadFile(scope.row)"
size=
"small"
type=
"text"
>
下载
</el-button>
<el-button
@
click=
"downloadFile(scope.row)"
size=
"small"
type=
"text"
<el-button
@
click=
"deleteFile(scope.row)"
size=
"small"
type=
"text"
>
删除
</el-button>
>
下载
</el-button
>
<el-button
@
click=
"deleteFile(scope.row)"
size=
"small"
type=
"text"
>
删除
</el-button
>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
</el-table>
...
@@ -44,7 +60,7 @@
...
@@ -44,7 +60,7 @@
:current-page=
"page"
:current-page=
"page"
:page-size=
"pageSize"
:page-size=
"pageSize"
:page-sizes=
"[10, 30, 50, 100]"
:page-sizes=
"[10, 30, 50, 100]"
:style=
"{float:'right',padding:'20px'
}"
:style=
"{ float: 'right', padding: '20px'
}"
:total=
"total"
:total=
"total"
@
current-change=
"handleCurrentChange"
@
current-change=
"handleCurrentChange"
@
size-change=
"handleSizeChange"
@
size-change=
"handleSizeChange"
...
@@ -55,99 +71,105 @@
...
@@ -55,99 +71,105 @@
</template>
</template>
<
script
>
<
script
>
const
path
=
process
.
env
.
VUE_APP_BASE_API
const
path
=
process
.
env
.
VUE_APP_BASE_API
;
import
{
mapGetters
}
from
'
vuex
'
import
{
mapGetters
}
from
"
vuex
"
;
import
infoList
from
'
@/components/mixins/infoList
'
import
infoList
from
"
@/components/mixins/infoList
"
;
import
{
getFileList
,
deleteFile
}
from
'
@/api/fileUploadAndDownload
'
import
{
getFileList
,
deleteFile
}
from
"
@/api/fileUploadAndDownload
"
;
import
{
downloadImage
}
from
'
@/utils/downloadImg
'
import
{
downloadImage
}
from
"
@/utils/downloadImg
"
;
import
{
formatTimeToStr
}
from
'
@/utils/data
'
import
{
formatTimeToStr
}
from
"
@/utils/data
"
;
export
default
{
export
default
{
name
:
'
Upload
'
,
name
:
"
Upload
"
,
mixins
:
[
infoList
],
mixins
:
[
infoList
],
data
()
{
data
()
{
return
{
return
{
fullscreenLoading
:
false
,
fullscreenLoading
:
false
,
listApi
:
getFileList
,
listApi
:
getFileList
,
path
:
path
,
path
:
path
,
tableData
:
[]
tableData
:
[]
,
}
}
;
},
},
computed
:
{
computed
:
{
...
mapGetters
(
'
user
'
,
[
'
userInfo
'
,
'
token
'
])
...
mapGetters
(
"
user
"
,
[
"
userInfo
"
,
"
token
"
]),
},
},
filters
:
{
filters
:
{
formatDate
:
function
(
time
)
{
formatDate
:
function
(
time
)
{
if
(
time
!=
null
&&
time
!=
''
)
{
if
(
time
!=
null
&&
time
!=
""
)
{
var
date
=
new
Date
(
time
)
var
date
=
new
Date
(
time
)
;
return
formatTimeToStr
(
date
,
'
yyyy-MM-dd hh:mm:ss
'
)
return
formatTimeToStr
(
date
,
"
yyyy-MM-dd hh:mm:ss
"
);
}
else
{
}
else
{
return
''
return
""
;
}
}
}
},
},
},
methods
:
{
methods
:
{
async
deleteFile
(
row
)
{
async
deleteFile
(
row
)
{
this
.
$confirm
(
'
此操作将永久文件, 是否继续?
'
,
'
提示
'
,
{
this
.
$confirm
(
"
此操作将永久文件, 是否继续?
"
,
"
提示
"
,
{
confirmButtonText
:
'
确定
'
,
confirmButtonText
:
"
确定
"
,
cancelButtonText
:
'
取消
'
,
cancelButtonText
:
"
取消
"
,
type
:
'
warning
'
type
:
"
warning
"
,
})
})
.
then
(
async
()
=>
{
.
then
(
async
()
=>
{
const
res
=
await
deleteFile
(
row
)
const
res
=
await
deleteFile
(
row
)
;
if
(
res
.
code
==
0
)
{
if
(
res
.
code
==
0
)
{
this
.
$message
({
this
.
$message
({
type
:
'
success
'
,
type
:
"
success
"
,
message
:
'
删除成功!
'
message
:
"
删除成功!
"
,
})
})
;
this
.
getTableData
()
this
.
getTableData
()
;
}
}
})
})
.
catch
(()
=>
{
.
catch
(()
=>
{
this
.
$message
({
this
.
$message
({
type
:
'
info
'
,
type
:
"
info
"
,
message
:
'
已取消删除
'
message
:
"
已取消删除
"
,
})
})
;
})
})
;
},
},
checkFile
(
file
)
{
checkFile
(
file
)
{
this
.
fullscreenLoading
=
true
this
.
fullscreenLoading
=
true
;
const
isJPG
=
file
.
type
===
'
image/jpeg
'
const
isJPG
=
file
.
type
===
"
image/jpeg
"
;
const
isPng
=
file
.
type
===
'
image/png
'
const
isPng
=
file
.
type
===
"
image/png
"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
2
const
isLt2M
=
file
.
size
/
1024
/
1024
<
2
;
if
(
!
isJPG
&&
!
isPng
)
{
if
(
!
isJPG
&&
!
isPng
)
{
this
.
$message
.
error
(
'
上传头像图片只能是 JPG或png 格式!
'
)
this
.
$message
.
error
(
"
上传头像图片只能是 JPG或png 格式!
"
);
this
.
fullscreenLoading
=
false
this
.
fullscreenLoading
=
false
;
}
}
if
(
!
isLt2M
)
{
if
(
!
isLt2M
)
{
this
.
$message
.
error
(
'
上传头像图片大小不能超过 2MB!
'
)
this
.
$message
.
error
(
"
上传头像图片大小不能超过 2MB!
"
);
this
.
fullscreenLoading
=
false
this
.
fullscreenLoading
=
false
;
}
}
return
(
isPng
||
isJPG
)
&&
isLt2M
return
(
isPng
||
isJPG
)
&&
isLt2M
;
},
},
uploadSuccess
(
res
)
{
uploadSuccess
(
res
)
{
this
.
fullscreenLoading
=
false
;
if
(
res
.
code
==
0
)
{
this
.
$message
({
this
.
$message
({
type
:
'
success
'
,
type
:
"
success
"
,
message
:
'
上传成功
'
message
:
"
上传成功
"
,
})
});
if
(
res
.
code
==
0
)
{
if
(
res
.
code
==
0
)
{
this
.
getTableData
()
this
.
getTableData
();
}
}
else
{
this
.
$message
({
type
:
"
warning
"
,
message
:
res
.
msg
,
});
}
}
this
.
fullscreenLoading
=
false
},
},
uploadError
()
{
uploadError
()
{
this
.
$message
({
this
.
$message
({
type
:
'
error
'
,
type
:
"
error
"
,
message
:
'
上传失败
'
message
:
"
上传失败
"
,
})
});
this
.
fullscreenLoading
=
false
this
.
fullscreenLoading
=
false
;
},
},
downloadFile
(
row
)
{
downloadFile
(
row
)
{
downloadImage
(
row
.
url
,
row
.
name
)
downloadImage
(
row
.
url
,
row
.
name
);
}
},
},
created
(){
},
this
.
getTableData
()
created
()
{
}
this
.
getTableData
();
}
},
};
</
script
>
</
script
>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录