Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hexbee
Cloudreve
提交
48659f69
C
Cloudreve
项目概览
hexbee
/
Cloudreve
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Cloudreve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
48659f69
编写于
2月 24, 2020
作者:
H
HFO4
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Feat: uploading / transfer settings
上级
000a48ff
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
166 addition
and
6 deletion
+166
-6
models/migration.go
models/migration.go
+4
-6
routers/controllers/admin.go
routers/controllers/admin.go
+33
-0
routers/router.go
routers/router.go
+12
-0
service/admin/list.go
service/admin/list.go
+9
-0
service/admin/vas.go
service/admin/vas.go
+98
-0
service/vas/purchase.go
service/vas/purchase.go
+10
-0
未找到文件。
models/migration.go
浏览文件 @
48659f69
...
...
@@ -90,11 +90,10 @@ func addDefaultSettings() {
{
Name
:
"smtpPass"
,
Value
:
``
,
Type
:
"mail"
},
{
Name
:
"over_used_template"
,
Value
:
`<meta name="viewport"content="width=device-width"><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>容量超额提醒</title><style type="text/css">img{max-width:100%}body{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;width:100%!important;height:100%;line-height:1.6em}body{background-color:#f6f6f6}@media only screen and(max-width:640px){body{padding:0!important}h1{font-weight:800!important;margin:20px 0 5px!important}h2{font-weight:800!important;margin:20px 0 5px!important}h3{font-weight:800!important;margin:20px 0 5px!important}h4{font-weight:800!important;margin:20px 0 5px!important}h1{font-size:22px!important}h2{font-size:18px!important}h3{font-size:16px!important}.container{padding:0!important;width:100%!important}.content{padding:0!important}.content-wrap{padding:10px!important}.invoice{width:100%!important}}</style><table class="body-wrap"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;"bgcolor="#f6f6f6"><tbody><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;"valign="top"></td><td class="container"width="600"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; margin: 0 auto;"valign="top"><div class="content"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 20px;"><table class="main"width="100%"cellpadding="0"cellspacing="0"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px
solid #e9e9e9;"bgcolor="#fff"><tbody><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="alert alert-warning"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 16px; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: #FF9F00; margin: 0; padding: 20px;"align="center"bgcolor="#FF9F00"valign="top">容量超额警告</td></tr><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-wrap"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 20px;"valign="top"><table width="100%"cellpadding="0"cellspacing="0"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><tbody><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-block"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"valign="top">亲爱的<strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{userName}</strong>:</td></tr><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-block"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"valign="top">由于{notifyReason},您在{siteTitle}的账户的容量使用超出配额,您将无法继续上传新文件,请尽快清理文件,否则我们将会禁用您的账户。</td></tr><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-block"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"valign="top"><a href="{siteUrl}Login"class="btn-primary"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #348eda; margin: 0; border-color: #348eda; border-style: solid; border-width: 10px 20px;">登录{siteTitle}</a></td></tr><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="content-block"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"valign="top">感谢您选择{siteTitle}。</td></tr></tbody></table></td></tr></tbody></table><div class="footer"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;"><table width="100%"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><tbody><tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"><td class="aligncenter content-block"style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0 0 20px;"align="center"valign="top">此邮件由系统自动发送,请不要直接回复。</td></tr></tbody></table></div></div></td><td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;"valign="top"></td></tr></tbody></table>`
,
Type
:
"mail_template"
},
{
Name
:
"ban_time"
,
Value
:
`10`
,
Type
:
"storage_policy"
},
{
Name
:
"maxEditSize"
,
Value
:
`100000`
,
Type
:
"file_edit"
},
{
Name
:
"oss_timeout"
,
Value
:
`3600`
,
Type
:
"timeout"
},
{
Name
:
"archive_timeout"
,
Value
:
`30`
,
Type
:
"timeout"
},
{
Name
:
"download_timeout"
,
Value
:
`30`
,
Type
:
"timeout"
},
{
Name
:
"ban_time"
,
Value
:
`604800`
,
Type
:
"storage_policy"
},
{
Name
:
"maxEditSize"
,
Value
:
`4194304`
,
Type
:
"file_edit"
},
{
Name
:
"archive_timeout"
,
Value
:
`60`
,
Type
:
"timeout"
},
{
Name
:
"download_timeout"
,
Value
:
`60`
,
Type
:
"timeout"
},
{
Name
:
"preview_timeout"
,
Value
:
`60`
,
Type
:
"timeout"
},
{
Name
:
"doc_preview_timeout"
,
Value
:
`60`
,
Type
:
"timeout"
},
{
Name
:
"upload_credential_timeout"
,
Value
:
`1800`
,
Type
:
"timeout"
},
...
...
@@ -137,7 +136,6 @@ Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; verti
{
Name
:
"appkey"
,
Value
:
``
,
Type
:
"payment"
},
{
Name
:
"shopid"
,
Value
:
``
,
Type
:
"payment"
},
{
Name
:
"hot_share_num"
,
Value
:
`10`
,
Type
:
"share"
},
{
Name
:
"allow_buy_group"
,
Value
:
`1`
,
Type
:
"group_sell"
},
{
Name
:
"group_sell_data"
,
Value
:
`[]`
,
Type
:
"group_sell"
},
{
Name
:
"gravatar_server"
,
Value
:
`https://gravatar.loli.net/`
,
Type
:
"avatar"
},
{
Name
:
"defaultTheme"
,
Value
:
`#3f51b5`
,
Type
:
"basic"
},
...
...
routers/controllers/admin.go
浏览文件 @
48659f69
...
...
@@ -81,3 +81,36 @@ func AdminSendTestMail(c *gin.Context) {
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
// AdminListRedeems 列出激活码
func
AdminListRedeems
(
c
*
gin
.
Context
)
{
var
service
admin
.
AdminListService
if
err
:=
c
.
ShouldBindJSON
(
&
service
);
err
==
nil
{
res
:=
service
.
Redeems
()
c
.
JSON
(
200
,
res
)
}
else
{
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
// AdminGenerateRedeems 生成激活码
func
AdminGenerateRedeems
(
c
*
gin
.
Context
)
{
var
service
admin
.
GenerateRedeemsService
if
err
:=
c
.
ShouldBindJSON
(
&
service
);
err
==
nil
{
res
:=
service
.
Generate
()
c
.
JSON
(
200
,
res
)
}
else
{
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
// AdminDeleteRedeem 删除激活码
func
AdminDeleteRedeem
(
c
*
gin
.
Context
)
{
var
service
admin
.
SingleIDService
if
err
:=
c
.
ShouldBindUri
(
&
service
);
err
==
nil
{
res
:=
service
.
DeleteRedeem
()
c
.
JSON
(
200
,
res
)
}
else
{
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
routers/router.go
浏览文件 @
48659f69
...
...
@@ -303,6 +303,18 @@ func InitMasterRouter() *gin.Engine {
admin
.
GET
(
"reload/:service"
,
controllers
.
AdminReloadService
)
// 重新加载子服务
admin
.
POST
(
"mailTest"
,
controllers
.
AdminSendTestMail
)
// 兑换码相关
redeem
:=
admin
.
Group
(
"redeem"
)
{
// 列出激活码
redeem
.
POST
(
"list"
,
controllers
.
AdminListRedeems
)
// 生成激活码
redeem
.
POST
(
""
,
controllers
.
AdminGenerateRedeems
)
// 删除激活码
redeem
.
DELETE
(
":id"
,
controllers
.
AdminDeleteRedeem
)
}
}
// 用户
...
...
service/admin/list.go
浏览文件 @
48659f69
...
...
@@ -5,6 +5,15 @@ import (
"github.com/HFO4/cloudreve/pkg/serializer"
)
// AdminListService 仪表盘列条目服务
type
AdminListService
struct
{
Page
int
`json:"page" binding:"min=1,required"`
PageSize
int
`json:"page_size" binding:"min=1,required"`
OrderBy
string
`json:"order_by"`
Conditions
map
[
string
]
string
`form:"conditions"`
Searches
map
[
string
]
string
`form:"searches"`
}
// GroupList 获取用户组列表
func
(
service
*
NoParamService
)
GroupList
()
serializer
.
Response
{
var
res
[]
model
.
Group
...
...
service/admin/vas.go
0 → 100644
浏览文件 @
48659f69
package
admin
import
(
model
"github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/serializer"
"github.com/gofrs/uuid"
)
// GenerateRedeemsService 兑换码生成服务
type
GenerateRedeemsService
struct
{
Num
int
`json:"num" binding:"required,min=1,max=100"`
ID
int64
`json:"id"`
Time
int
`json:"time" binding:"required,min=1"`
Type
int
`json:"type" binding:"min=0,max=2"`
}
// SingleIDService 单ID服务
type
SingleIDService
struct
{
ID
uint
`uri:"id" binding:"required"`
}
// DeleteRedeem 删除兑换码
func
(
service
*
SingleIDService
)
DeleteRedeem
()
serializer
.
Response
{
if
err
:=
model
.
DB
.
Where
(
"id = ?"
,
service
.
ID
)
.
Delete
(
&
model
.
Redeem
{})
.
Error
;
err
!=
nil
{
return
serializer
.
DBErr
(
"无法删除兑换码"
,
err
)
}
return
serializer
.
Response
{}
}
// Generate 生成兑换码
func
(
service
*
GenerateRedeemsService
)
Generate
()
serializer
.
Response
{
res
:=
make
([]
string
,
service
.
Num
)
redeem
:=
model
.
Redeem
{}
// 开始事务
tx
:=
model
.
DB
.
Begin
()
if
err
:=
tx
.
Error
;
err
!=
nil
{
return
serializer
.
DBErr
(
"无法开启事务"
,
err
)
}
// 创建每个兑换码
for
i
:=
0
;
i
<
service
.
Num
;
i
++
{
redeem
.
Model
.
ID
=
0
redeem
.
Num
=
service
.
Time
redeem
.
Type
=
service
.
Type
redeem
.
ProductID
=
service
.
ID
redeem
.
Used
=
false
// 生成唯一兑换码
u2
,
err
:=
uuid
.
NewV4
()
if
err
!=
nil
{
tx
.
Rollback
()
return
serializer
.
Err
(
serializer
.
CodeInternalSetting
,
"无法生成兑换码"
,
err
)
}
redeem
.
Code
=
u2
.
String
()
if
err
:=
tx
.
Create
(
&
redeem
)
.
Error
;
err
!=
nil
{
tx
.
Rollback
()
return
serializer
.
DBErr
(
"无法创建兑换码记录"
,
err
)
}
res
[
i
]
=
redeem
.
Code
}
if
err
:=
tx
.
Commit
()
.
Error
;
err
!=
nil
{
return
serializer
.
DBErr
(
"无法创建兑换码记录"
,
err
)
}
return
serializer
.
Response
{
Data
:
res
}
}
// Redeems 列出激活码
func
(
service
*
AdminListService
)
Redeems
()
serializer
.
Response
{
var
res
[]
model
.
Redeem
total
:=
0
tx
:=
model
.
DB
.
Model
(
&
model
.
Redeem
{})
if
service
.
OrderBy
!=
""
{
tx
=
tx
.
Order
(
service
.
OrderBy
)
}
for
k
,
v
:=
range
service
.
Conditions
{
tx
=
tx
.
Where
(
"? = ?"
,
k
,
v
)
}
// 计算总数用于分页
tx
.
Count
(
&
total
)
// 查询记录
tx
.
Limit
(
service
.
PageSize
)
.
Offset
((
service
.
Page
-
1
)
*
service
.
PageSize
)
.
Find
(
&
res
)
return
serializer
.
Response
{
Data
:
map
[
string
]
interface
{}{
"total"
:
total
,
"items"
:
res
,
}}
}
service/vas/purchase.go
浏览文件 @
48659f69
...
...
@@ -61,6 +61,11 @@ func (service *RedeemService) Redeem(c *gin.Context, user *model.User) serialize
break
}
}
if
group
==
nil
{
return
serializer
.
Err
(
serializer
.
CodeNotFound
,
"商品已失效"
,
err
)
}
}
else
if
redeem
.
Type
==
model
.
PackOrderType
{
for
_
,
v
:=
range
packs
{
if
v
.
ID
==
redeem
.
ProductID
{
...
...
@@ -68,6 +73,11 @@ func (service *RedeemService) Redeem(c *gin.Context, user *model.User) serialize
break
}
}
if
pack
==
nil
{
return
serializer
.
Err
(
serializer
.
CodeNotFound
,
"商品已失效"
,
err
)
}
}
err
=
payment
.
GiveProduct
(
user
,
pack
,
group
,
redeem
.
Num
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录