Golang 语雀内容系统(3) 输出HTML文章

132 阅读1分钟

实现功能

  • 增加配置文件
  • 读取语雀内容,并且输出到HTML上

具体步骤

本节完整代码,参考:github.com/golangtips/…

main.go 增加配置解析,把 services 传入 http 请求处理函数

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/golangtips/yuque/service"

	"github.com/golangtips/yuque/config"

	"github.com/BurntSushi/toml"
	"github.com/golangtips/yuque/handler"

	"github.com/gorilla/mux"
)

func main() {
	err := run()
	if err != nil {
		log.Fatal(err)
	}
}

func run() error {

	// 解析配置文件
	var config config.Toml
	if _, err := toml.DecodeFile("config.toml", &config); err != nil {
		return err
	}

	// 初始化服务
	s, err := service.NewSet(&config)
	if err != nil {
		return err
	}

	r := mux.NewRouter()

	// 文章详情页
	r.Methods("GET").Path("/").HandlerFunc(handler.HomePage)

	// 文章详情页
	r.Methods("GET").Path("/posts/{slug:[a-zA-Z0-9.]+}").HandlerFunc(handler.PostDetail(s.YuQue))

	// 文章详情页
	r.Methods("GET").Path("/posts").HandlerFunc(handler.PostList(s.YuQue))

	// 文章搜索页
	r.Methods("GET").Path("/search").HandlerFunc(handler.Search(s.YuQue))

	server := &http.Server{
		Handler:      r,
		Addr:         fmt.Sprintf(":%d", config.HTTPPort),
		WriteTimeout: 5 * time.Second,
		ReadTimeout:  5 * time.Second,
	}

	errs := make(chan error)

	// HTTP 服务
	go (func() {
		log.Println("HTTP服务启动")
		errs <- server.ListenAndServe()
	})()

	// 退出信号处理
	go (func() {
		ch := make(chan os.Signal, 1)
		signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
		errs <- fmt.Errorf("%s", <-ch)
	})()

	// 退出日志
	log.Println("exit", <-errs)

	return nil
}

handler/post.go 增加 service.IYuQue 传参

package handler

import (
	"log"
	"net/http"
	"strconv"
	"time"

	service "github.com/golangtips/yuque/service/intf"
	"github.com/gorilla/mux"

	"html/template"
)


// PostDetail 文章详情页
func PostDetail(s service.IYuQue) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
    	// ... 这里省略....
	}
}

// PostList 文章列表页
func PostList(s service.IYuQue) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// ... 这里省略....
	}
}


type Post struct {
	Title     string
	Content   template.HTML
	Slug      string
	CreatedAt time.Time
}