实现功能

  • 增加静态页模版
  • 增加分页功能
  • 解决图片防盗链

增加静态页模版

main.go 中,增加静态请求处理

r := mux.NewRouter()

// 静态文件
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

将模版中 css/js/img 目录,复制 static 目录下

├── static
│   ├── css
│   │   ├── bootstrap.min.css
│   │   ├── custom.css
│   │   ├── highlights
│   │   │   ├── autumn.css
│   │   │   ├── borland.css
│   │   │   ├── bw.css
│   │   │   ├── colorful.css
│   │   │   ├── default.css
│   │   │   ├── emacs.css
│   │   │   ├── friendly.css
│   │   │   ├── fruity.css
│   │   │   ├── github.css
│   │   │   ├── manni.css
│   │   │   ├── monokai.css
│   │   │   ├── murphy.css
│   │   │   ├── native.css
│   │   │   ├── pastie.css
│   │   │   ├── perldoc.css
│   │   │   ├── tango.css
│   │   │   ├── trac.css
│   │   │   ├── vim.css
│   │   │   ├── vs.css
│   │   │   └── zenburn.css
│   │   └── pace.css
│   ├── img
│   │   └── me.jpg
│   └── js
│       ├── bootstrap.min.js
│       ├── jquery-2.1.3.min.js
│       ├── modernizr.custom.js
│       ├── pace.min.js
│       └── script.js

图片防盗链

解决方法

通过反向代理,解决跨域图片加载
handler/post.go 添加

// CDNProxy 反向代理,解决跨域图片加载问题
func CDNProxy(w http.ResponseWriter, r *http.Request) {

    remote, err := url.Parse("https://cdn.nlark.com")
    if err != nil {
        return
    }

    proxy := httputil.NewSingleHostReverseProxy(remote)
    d := proxy.Director
    proxy.Director = func(r *http.Request) {
        r.Header.Set("Referer", "")
        r.Host = remote.Host
        d(r)
    }
    proxy.ServeHTTP(w, r)
}


// PostDetail 文章详情页
func PostDetail(s service.IYuQue) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // 文章内容
        content := detail.Data.BodyHtml
        // 替换html中的cdn链接进行反向代理
        content = strings.Replace(content, "https://cdn.nlark.com/", "/", -1)

        // 模块变量
        post := Post{
            Title:     detail.Data.Title,
            Content:   template.HTML(content),
            CreatedAt: detail.Data.CreatedAt,
        }
        // 省略...
    }
}

cmd/main.go 添加

// 反向代理,解决跨域图片加载问题
r.PathPrefix("/yuque/").HandlerFunc(handler.CDNProxy)

增加分页功能

HomePage 处理器,增加分页处理

// HomePage 首页
func HomePage(s service.IYuQue) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // 省略....

        // 获取文章总数
        allDocs, _ := s.GetRepoDocList(r.Context(), nil)
        total := len(allDocs.Data)

        // 分页处理
        p := util.NewPagination(total, pageSizeInt, pageInt, 10)
        p.Paginate()

        t.Execute(w, map[string]interface{}{
            "posts":     posts,
            "paginator": p,
        })
    }
}

更新 home.html 中 pagination

                <div class="pagination">
                    <ul>
                        {{if .paginator.HasPrev}}
                        <li><a href="?page={{.paginator.FirstPage}}">{{.paginator.FirstPage}}</a></li>
                        ...
                        {{end}}

                        {{$currentPage := .paginator.CurrentPage}}
                        {{range $i := .paginator.Pages}}
                        {{if eq $i $currentPage}}
                        <li class="current"><a href="?page={{$i}}">{{ $i }}</a></li>
                        {{else}}
                        <li><a href="?page={{$i}}">{{ $i }}</a></li>
                        {{end}}
                        {{end}}

                        {{if .paginator.HasNext}}
                        ...
                        <li><a href="?page={{.paginator.TotalPages}}">{{.paginator.TotalPages}}</a></li>
                        {{end}}
                    </ul>
                </div>