mirror of https://github.com/mindoc-org/mindoc.git
parent
47687cc5b1
commit
3a1daba62a
|
@ -19,7 +19,7 @@ const RegexpEmail = `^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$`
|
||||||
const RegexpAccount = `^[a-zA-Z][a-zA-z0-9\.]{2,50}$`
|
const RegexpAccount = `^[a-zA-Z][a-zA-z0-9\.]{2,50}$`
|
||||||
|
|
||||||
// PageSize 默认分页条数.
|
// PageSize 默认分页条数.
|
||||||
const PageSize = 15
|
const PageSize = 5
|
||||||
|
|
||||||
// 用户权限
|
// 用户权限
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -768,6 +768,9 @@ func (c *DocumentController) Export() {
|
||||||
} else {
|
} else {
|
||||||
bookResult = isReadable(identify, token, c)
|
bookResult = isReadable(identify, token, c)
|
||||||
}
|
}
|
||||||
|
if bookResult.PrivatelyOwned == 0 {
|
||||||
|
//TODO 私有项目禁止导出
|
||||||
|
}
|
||||||
docs, err := models.NewDocument().FindListByBookId(bookResult.BookId)
|
docs, err := models.NewDocument().FindListByBookId(bookResult.BookId)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -6,21 +6,27 @@ import (
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
|
"math"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LabelController struct {
|
type LabelController struct {
|
||||||
BaseController
|
BaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *LabelController) Index() {
|
func (c *LabelController) Prepare() {
|
||||||
c.Prepare()
|
c.BaseController.Prepare()
|
||||||
c.TplName = "label/index.tpl"
|
|
||||||
|
|
||||||
//如果没有开启你们访问则跳转到登录
|
//如果没有开启你们访问则跳转到登录
|
||||||
if !c.EnableAnonymous && c.Member == nil {
|
if !c.EnableAnonymous && c.Member == nil {
|
||||||
c.Redirect(beego.URLFor("AccountController.Login"),302)
|
c.Redirect(beego.URLFor("AccountController.Login"),302)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//查看包含标签的文档列表.
|
||||||
|
func (c *LabelController) Index() {
|
||||||
|
c.Prepare()
|
||||||
|
c.TplName = "label/index.tpl"
|
||||||
|
|
||||||
labelName := c.Ctx.Input.Param(":key")
|
labelName := c.Ctx.Input.Param(":key")
|
||||||
pageIndex,_ := c.GetInt("page",1)
|
pageIndex,_ := c.GetInt("page",1)
|
||||||
|
@ -58,3 +64,30 @@ func (c *LabelController) Index() {
|
||||||
|
|
||||||
c.Data["LabelName"] = labelName
|
c.Data["LabelName"] = labelName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *LabelController) List() {
|
||||||
|
c.Prepare()
|
||||||
|
c.TplName = "label/list.tpl"
|
||||||
|
|
||||||
|
pageIndex,_ := c.GetInt("page",1)
|
||||||
|
pageSize := 200
|
||||||
|
|
||||||
|
labels ,totalCount,err := models.NewLabel().FindToPager(pageIndex,pageSize)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
c.ShowErrorPage(50001,err.Error())
|
||||||
|
}
|
||||||
|
if totalCount > 0 {
|
||||||
|
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, pageSize, totalCount)
|
||||||
|
|
||||||
|
c.Data["PageHtml"] = html
|
||||||
|
}else {
|
||||||
|
c.Data["PageHtml"] = ""
|
||||||
|
}
|
||||||
|
c.Data["TotalPages"] = int(math.Ceil(float64(totalCount) / float64(pageSize)))
|
||||||
|
|
||||||
|
c.Data["Labels"] = labels
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -85,5 +85,6 @@ func init() {
|
||||||
beego.Router("/search",&controllers.SearchController{},"get:Index")
|
beego.Router("/search",&controllers.SearchController{},"get:Index")
|
||||||
|
|
||||||
beego.Router("/tag/:key", &controllers.LabelController{},"get:Index")
|
beego.Router("/tag/:key", &controllers.LabelController{},"get:Index")
|
||||||
|
beego.Router("/tags", &controllers.LabelController{},"get:List")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -249,13 +249,24 @@ textarea{
|
||||||
height: 231px;
|
height: 231px;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
.manual-list .list-item .manual-item-standard>dt>a {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.manual-list .list-item .manual-item-standard>dt>a .image{
|
||||||
|
position: relative;
|
||||||
|
/*display: none;*/
|
||||||
|
}
|
||||||
.manual-list .list-item .manual-item-standard .cover {
|
.manual-list .list-item .manual-item-standard .cover {
|
||||||
border: 1px solid #999999;
|
border: none;
|
||||||
width: 171px;
|
width: 171px;
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 229px;
|
height: 229px;
|
||||||
background-color: #eee
|
background-color: #eee;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 0 1px 3px 0 #d4d4d5, 0 0 0 1px #d4d4d5;
|
||||||
}
|
}
|
||||||
.manual-list .list-item .manual-item-standard .b-cover:hover {
|
.manual-list .list-item .manual-item-standard .b-cover:hover {
|
||||||
border-color: #4db559;
|
border-color: #4db559;
|
||||||
|
@ -562,19 +573,27 @@ textarea{
|
||||||
|
|
||||||
.pagination-container {
|
.pagination-container {
|
||||||
margin: 5px auto;
|
margin: 5px auto;
|
||||||
text-align: center !important;
|
|
||||||
display: block !important;
|
display: block !important;
|
||||||
}
|
}
|
||||||
|
.pagination-container .pagination{
|
||||||
|
box-shadow: 0 1px 2px 0 #e3e3e0;
|
||||||
|
}
|
||||||
.pagination-container .pagination>li>a,.pagination-container .pagination>li>span{
|
.pagination-container .pagination>li>a,.pagination-container .pagination>li>span{
|
||||||
padding: 4px 9px !important;
|
padding: 8px 16px !important;
|
||||||
}
|
}
|
||||||
.pagination-container .pagination>li>a,.pagination-container .pagination>li>span{
|
.pagination-container .pagination>li>a,.pagination-container .pagination>li>span{
|
||||||
color: #333;
|
color: #272727;
|
||||||
}
|
}
|
||||||
.pagination-container .pagination>.active>a{
|
.pagination-container .pagination>.active>a{
|
||||||
color: #fff;
|
/*color: #fff;*/
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
border: 1px solid #e3e3e0;
|
||||||
}
|
}
|
||||||
/**************网站底部样式*************************/
|
.pagination-container .pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover{
|
||||||
|
color: #272727;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************网站底部样式*************************/
|
||||||
.footer{
|
.footer{
|
||||||
color: #777;
|
color: #777;
|
||||||
padding: 30px 0;
|
padding: 30px 0;
|
||||||
|
|
|
@ -25,6 +25,7 @@ type PageOptions struct {
|
||||||
NextPageText string //下一页文字 默认"下一页"
|
NextPageText string //下一页文字 默认"下一页"
|
||||||
EnableFirstLastLink bool //是否启用首尾连接 默认false 建议开启
|
EnableFirstLastLink bool //是否启用首尾连接 默认false 建议开启
|
||||||
EnablePreNexLink bool //是否启用上一页,下一页连接 默认false 建议开启
|
EnablePreNexLink bool //是否启用上一页,下一页连接 默认false 建议开启
|
||||||
|
TotalPages int
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,6 +100,7 @@ func GetPagerHtml(requestURI string,pageIndex, pageSize,totalCount int) (html.HT
|
||||||
PageSize: pageSize,
|
PageSize: pageSize,
|
||||||
EnableFirstLastLink : true,
|
EnableFirstLastLink : true,
|
||||||
ParamName : "page",
|
ParamName : "page",
|
||||||
|
TotalPages:int(math.Ceil(float64(totalCount) / float64(pageSize))),
|
||||||
}
|
}
|
||||||
totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))
|
totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))
|
||||||
|
|
||||||
|
@ -249,9 +251,13 @@ func fun1(po *PageOptions, totalpages int) string {
|
||||||
*/
|
*/
|
||||||
func getHeader(po *PageOptions, totalpages int) string {
|
func getHeader(po *PageOptions, totalpages int) string {
|
||||||
var rs string = "<ul class=\"pagination\">"
|
var rs string = "<ul class=\"pagination\">"
|
||||||
if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
|
|
||||||
|
|
||||||
rs += "<li" + judgeDisable(po, totalpages, 0) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(1) + "'>" + po.FirstPageText + "</a></li>"
|
if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
|
||||||
|
if po.CurrentPage == 1 {
|
||||||
|
rs += "<li" + judgeDisable(po, totalpages, 0) + " class=\"disabled\"><a href=\"###\">" + po.FirstPageText + "</a></li>"
|
||||||
|
}else{
|
||||||
|
rs += "<li" + judgeDisable(po, totalpages, 0) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(1) + "'>" + po.FirstPageText + "</a></li>"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if po.EnablePreNexLink { // disabled=\"disabled\"
|
if po.EnablePreNexLink { // disabled=\"disabled\"
|
||||||
var a int = po.CurrentPage - 1
|
var a int = po.CurrentPage - 1
|
||||||
|
@ -270,13 +276,14 @@ func getFooter(po *PageOptions, totalpages int) string {
|
||||||
var rs string = ""
|
var rs string = ""
|
||||||
if po.EnablePreNexLink {
|
if po.EnablePreNexLink {
|
||||||
var a int = po.CurrentPage + 1
|
var a int = po.CurrentPage + 1
|
||||||
if po.CurrentPage == totalpages {
|
|
||||||
a = totalpages
|
|
||||||
}
|
|
||||||
rs += "<li " + judgeDisable(po, totalpages, 1) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "'>" + po.NextPageText + "</a></li>"
|
rs += "<li " + judgeDisable(po, totalpages, 1) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "'>" + po.NextPageText + "</a></li>"
|
||||||
}
|
}
|
||||||
if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
|
if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
|
||||||
rs += "<li " + judgeDisable(po, totalpages, 1) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "'>" + po.LastPageText + "</a></li>"
|
if po.CurrentPage == totalpages {
|
||||||
|
rs += "<li " + judgeDisable(po, totalpages, 1) + " class=\"disabled\"><a href=\"###\">" + po.LastPageText + "</a></li>"
|
||||||
|
}else{
|
||||||
|
rs += "<li " + judgeDisable(po, totalpages, 1) + " ><a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "\">" + po.LastPageText + "</a></li>"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rs += "</ul>"
|
rs += "</ul>"
|
||||||
return rs
|
return rs
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
{{template "widgets/header.tpl" .}}
|
{{template "widgets/header.tpl" .}}
|
||||||
<div class="container manual-body">
|
<div class="container manual-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{{if gt (.Labels|len) 0}}
|
{{if gt (.Labels|len) 1000000}}
|
||||||
<div class="hide tag-container-outer">
|
<div class="hide tag-container-outer">
|
||||||
<span class="title">热门标签:</span>
|
<span class="title">热门标签:</span>
|
||||||
<span class="tags">
|
<span class="tags">
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
|
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
<nav>
|
<nav class="pagination-container">
|
||||||
{{.PageHtml}}
|
{{.PageHtml}}
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<title>标签列表 - Powered by MinDoc</title>
|
||||||
|
<meta name="author" content="Minho" />
|
||||||
|
<meta name="site" content="https://www.iminho.me" />
|
||||||
|
<!-- Bootstrap -->
|
||||||
|
<link href="{{cdncss "/static/bootstrap/css/bootstrap.min.css"}}" rel="stylesheet">
|
||||||
|
<link href="{{cdncss "/static/font-awesome/css/font-awesome.min.css"}}" rel="stylesheet">
|
||||||
|
|
||||||
|
<link href="{{cdncss "/static/css/main.css"}}" rel="stylesheet">
|
||||||
|
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||||
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="/static/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||||
|
<script src="/static/respond.js/1.4.2/respond.min.js"></script>
|
||||||
|
<![endif]-->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="manual-reader manual-container manual-search-reader">
|
||||||
|
{{template "widgets/header.tpl" .}}
|
||||||
|
<div class="container manual-body">
|
||||||
|
<div class="search-head">
|
||||||
|
<strong class="search-title">显示标签列表</strong>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
{{if gt (.Labels|len) 0}}
|
||||||
|
<div class="hide tag-container-outer" style="border: 0;margin-top: 0;padding: 5px 15px;min-height: 200px;">
|
||||||
|
<span class="tags">
|
||||||
|
{{range $index,$item := .Labels}}
|
||||||
|
<a href="{{urlfor "LabelController.Index" ":key" $item.LabelName}}">{{$item.LabelName}}<span class="detail">{{$item.BookNumber}}</span></a>
|
||||||
|
{{end}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{end}}
|
||||||
|
<nav class="pagination-container">
|
||||||
|
{{if gt .TotalPages 1}}
|
||||||
|
{{.PageHtml}}
|
||||||
|
{{end}}
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "widgets/footer.tpl" .}}
|
||||||
|
</div>
|
||||||
|
<script src="{{cdnjs "/static/jquery/1.12.4/jquery.min.js"}}" type="text/javascript"></script>
|
||||||
|
<script src="{{cdnjs "/static/bootstrap/js/bootstrap.min.js"}}" type="text/javascript"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -72,7 +72,7 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<nav>
|
<nav class="pagination-container">
|
||||||
{{.PageHtml}}
|
{{.PageHtml}}
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,14 +8,26 @@
|
||||||
{{.SITE_NAME}}
|
{{.SITE_NAME}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</a>
|
</a>
|
||||||
<div class="searchbar pull-left visible-lg-inline-block visible-md-inline-block">
|
<nav class="collapse navbar-collapse">
|
||||||
<form class="form-inline" action="{{urlfor "SearchController.Index"}}" method="get">
|
<ul class="nav navbar-nav">
|
||||||
<input class="form-control" name="keyword" type="search" style="width: 230px;" placeholder="请输入关键词..." value="{{.Keyword}}">
|
<li>
|
||||||
<button class="search-btn">
|
<a href="{{urlfor "HomeController.Index" }}" title="首页">首页</a>
|
||||||
<i class="fa fa-search"></i>
|
</li>
|
||||||
</button>
|
<li>
|
||||||
</form>
|
<a href="{{urlfor "LabelController.List" }}" title="标签">标签</a>
|
||||||
</div>
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="searchbar pull-left visible-lg-inline-block visible-md-inline-block">
|
||||||
|
<form class="form-inline" action="{{urlfor "SearchController.Index"}}" method="get">
|
||||||
|
<input class="form-control" name="keyword" type="search" style="width: 230px;" placeholder="请输入关键词..." value="{{.Keyword}}">
|
||||||
|
<button class="search-btn">
|
||||||
|
<i class="fa fa-search"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="btn-group dropdown-menu-right pull-right slidebar visible-xs-inline-block visible-sm-inline-block">
|
<div class="btn-group dropdown-menu-right pull-right slidebar visible-xs-inline-block visible-sm-inline-block">
|
||||||
<button class="btn btn-default dropdown-toggle hidden-lg" type="button" data-toggle="dropdown"><i class="fa fa-align-justify"></i></button>
|
<button class="btn btn-default dropdown-toggle hidden-lg" type="button" data-toggle="dropdown"><i class="fa fa-align-justify"></i></button>
|
||||||
|
|
Loading…
Reference in New Issue