Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hexbee
Cloudreve
提交
2076d56f
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 搜索 >>
提交
2076d56f
编写于
5月 19, 2020
作者:
H
HFO4
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Feat: dynamic writing site title, favicon, description, custom html (#286)
上级
280308bc
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
144 addition
and
1 deletion
+144
-1
assets
assets
+1
-1
middleware/option.go
middleware/option.go
+43
-0
middleware/option_test.go
middleware/option_test.go
+98
-0
models/migration.go
models/migration.go
+1
-0
routers/router.go
routers/router.go
+1
-0
未找到文件。
assets
@
b44dc051
比较
63ee122d
...
b44dc051
Subproject commit
63ee122d977284e3ccf20f4c1ed228584e705c4d
Subproject commit
b44dc0514520580fc284937400743123bbb2c6d4
middleware/option.go
浏览文件 @
2076d56f
package
middleware
import
(
"github.com/HFO4/cloudreve/bootstrap"
model
"github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/hashid"
"github.com/HFO4/cloudreve/pkg/serializer"
"github.com/HFO4/cloudreve/pkg/util"
"github.com/gin-gonic/gin"
"io/ioutil"
)
// HashID 将给定对象的HashID转换为真实ID
...
...
@@ -38,3 +41,43 @@ func IsFunctionEnabled(key string) gin.HandlerFunc {
c
.
Next
()
}
}
// InjectSiteInfo 向首页html中插入站点信息
func
InjectSiteInfo
()
gin
.
HandlerFunc
{
ignoreFunc
:=
func
(
c
*
gin
.
Context
)
{
c
.
Next
()
}
// 读取index.html
file
,
err
:=
bootstrap
.
StaticFS
.
Open
(
"/index.html"
)
if
err
!=
nil
{
util
.
Log
()
.
Warning
(
"静态文件[index.html]不存在,可能会影响首页展示"
)
return
ignoreFunc
}
fileContentBytes
,
err
:=
ioutil
.
ReadAll
(
file
)
if
err
!=
nil
{
util
.
Log
()
.
Warning
(
"静态文件[index.html]读取失败,可能会影响首页展示"
)
return
ignoreFunc
}
fileContent
:=
string
(
fileContentBytes
)
return
func
(
c
*
gin
.
Context
)
{
if
c
.
Request
.
URL
.
Path
==
"/"
||
c
.
Request
.
URL
.
Path
==
"/index.html"
{
// 读取、替换站点设置
options
:=
model
.
GetSettingByNames
(
"siteName"
,
"siteKeywords"
,
"siteScript"
,
"pwa_small_icon"
)
finalHTML
:=
util
.
Replace
(
map
[
string
]
string
{
"{siteName}"
:
options
[
"siteName"
],
"{siteDes}"
:
options
[
"siteDes"
],
"{siteScript}"
:
options
[
"siteScript"
],
"{pwa_small_icon}"
:
options
[
"pwa_small_icon"
],
},
fileContent
)
c
.
Header
(
"Content-Type"
,
"text/html"
)
c
.
String
(
200
,
finalHTML
)
c
.
Abort
()
return
}
c
.
Next
()
}
}
middleware/option_test.go
浏览文件 @
2076d56f
package
middleware
import
(
"errors"
"github.com/HFO4/cloudreve/bootstrap"
"github.com/HFO4/cloudreve/pkg/cache"
"github.com/HFO4/cloudreve/pkg/hashid"
"github.com/HFO4/cloudreve/pkg/util"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
testMock
"github.com/stretchr/testify/mock"
"net/http"
"net/http/httptest"
"os"
"testing"
)
...
...
@@ -75,3 +80,96 @@ func TestIsFunctionEnabled(t *testing.T) {
}
}
type
StaticMock
struct
{
testMock
.
Mock
}
func
(
m
StaticMock
)
Open
(
name
string
)
(
http
.
File
,
error
)
{
args
:=
m
.
Called
(
name
)
return
args
.
Get
(
0
)
.
(
http
.
File
),
args
.
Error
(
1
)
}
func
(
m
StaticMock
)
Exists
(
prefix
string
,
filepath
string
)
bool
{
args
:=
m
.
Called
(
prefix
,
filepath
)
return
args
.
Bool
(
0
)
}
func
TestInjectSiteInfo
(
t
*
testing
.
T
)
{
asserts
:=
assert
.
New
(
t
)
rec
:=
httptest
.
NewRecorder
()
// index.html 不存在
{
testStatic
:=
&
StaticMock
{}
bootstrap
.
StaticFS
=
testStatic
testStatic
.
On
(
"Open"
,
"/index.html"
)
.
Return
(
&
os
.
File
{},
errors
.
New
(
"error"
))
TestFunc
:=
InjectSiteInfo
()
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Params
=
[]
gin
.
Param
{}
c
.
Request
,
_
=
http
.
NewRequest
(
"GET"
,
"/"
,
nil
)
TestFunc
(
c
)
asserts
.
False
(
c
.
IsAborted
())
}
// index.html 读取失败
{
file
,
_
:=
util
.
CreatNestedFile
(
"tests/index.html"
)
file
.
Close
()
testStatic
:=
&
StaticMock
{}
bootstrap
.
StaticFS
=
testStatic
testStatic
.
On
(
"Open"
,
"/index.html"
)
.
Return
(
file
,
nil
)
TestFunc
:=
InjectSiteInfo
()
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Params
=
[]
gin
.
Param
{}
c
.
Request
,
_
=
http
.
NewRequest
(
"GET"
,
"/"
,
nil
)
TestFunc
(
c
)
asserts
.
False
(
c
.
IsAborted
())
}
// 成功且命中
{
file
,
_
:=
util
.
CreatNestedFile
(
"tests/index.html"
)
defer
file
.
Close
()
testStatic
:=
&
StaticMock
{}
bootstrap
.
StaticFS
=
testStatic
testStatic
.
On
(
"Open"
,
"/index.html"
)
.
Return
(
file
,
nil
)
TestFunc
:=
InjectSiteInfo
()
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Params
=
[]
gin
.
Param
{}
c
.
Request
,
_
=
http
.
NewRequest
(
"GET"
,
"/"
,
nil
)
cache
.
Set
(
"setting_siteName"
,
"cloudreve"
,
0
)
cache
.
Set
(
"setting_siteKeywords"
,
"cloudreve"
,
0
)
cache
.
Set
(
"setting_siteScript"
,
"cloudreve"
,
0
)
cache
.
Set
(
"setting_pwa_small_icon"
,
"cloudreve"
,
0
)
TestFunc
(
c
)
asserts
.
True
(
c
.
IsAborted
())
}
// 成功且未命中
{
file
,
_
:=
util
.
CreatNestedFile
(
"tests/index.html"
)
defer
file
.
Close
()
testStatic
:=
&
StaticMock
{}
bootstrap
.
StaticFS
=
testStatic
testStatic
.
On
(
"Open"
,
"/index.html"
)
.
Return
(
file
,
nil
)
TestFunc
:=
InjectSiteInfo
()
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Params
=
[]
gin
.
Param
{}
c
.
Request
,
_
=
http
.
NewRequest
(
"GET"
,
"/2"
,
nil
)
TestFunc
(
c
)
asserts
.
False
(
c
.
IsAborted
())
}
}
models/migration.go
浏览文件 @
2076d56f
...
...
@@ -82,6 +82,7 @@ func addDefaultSettings() {
{
Name
:
"siteKeywords"
,
Value
:
`网盘,网盘`
,
Type
:
"basic"
},
{
Name
:
"siteDes"
,
Value
:
`Cloudreve`
,
Type
:
"basic"
},
{
Name
:
"siteTitle"
,
Value
:
`平步云端`
,
Type
:
"basic"
},
{
Name
:
"siteScript"
,
Value
:
``
,
Type
:
"basic"
},
{
Name
:
"fromName"
,
Value
:
`Cloudreve`
,
Type
:
"mail"
},
{
Name
:
"mail_keepalive"
,
Value
:
`30`
,
Type
:
"mail"
},
{
Name
:
"fromAdress"
,
Value
:
`no-reply@acg.blue`
,
Type
:
"mail"
},
...
...
routers/router.go
浏览文件 @
2076d56f
...
...
@@ -82,6 +82,7 @@ func InitMasterRouter() *gin.Engine {
静态资源
*/
r
.
Use
(
gzip
.
Gzip
(
gzip
.
DefaultCompression
,
gzip
.
WithExcludedPaths
([]
string
{
"/api/"
})))
r
.
Use
(
middleware
.
InjectSiteInfo
())
r
.
Use
(
static
.
Serve
(
"/"
,
bootstrap
.
StaticFS
))
r
.
GET
(
"manifest.json"
,
controllers
.
Manifest
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录