Auuu Nya Blog

只会写Hello,World的菜鸟

Golang生成静态页面文件

Posted at — May 9, 2018

最近要在dingo添加一个功能,就是一键导出文章静态页面,在网上搜了很多,也请教了很多人,不过碍于自己的技术太菜听不怎么太明白,后来搜到一片文章,借用此篇文章和自己的一些测试终究是完成了这个功能。 文章作者写的生成器git地址:blog-generator

定义要渲染的模板路径

func getTemplate() (*template.Template, error) {
	path, err := os.Getwd()
	if err != nil {
		fmt.Errorf("Path is Error")
	}
    #使用filepath包把当前路径和模板路径拼接在一起
	templatePath := filepath.Join(path, "staticPost", "template.html")
	t := template.New("template.html")
	t, err = t.ParseFiles(templatePath)
	if err != nil {
		return nil, fmt.Errorf("error reading template %v", err)
	}
	return t, nil
}

上面代码定义好要渲染的模板,如果有模板函数可以在template.New()后面Funcs注入模板函数

根据文章名称保存

func WriteIndexHTML(name string, post *model.Post) error {
	t, err := getTemplate()
	path, _ := os.Getwd()
    #当时想一次创建好,结果发现os.create不能创建目录,所以又用mkdirall创建好所需要的目录
	err = os.MkdirAll(filepath.Join(path, "staticPost", "PostsView", name), 0777)
	if err != nil {
		panic(err)
	}
    #根据文章名称保存到指定路径
	filePath := filepath.Join(path, "staticPost", "PostsView", name, "index.html")
	#创建文章
    f, err := os.Create(filePath)
	if err != nil {
		return fmt.Errorf("error creating file %s: %v", filePath, err)
	}
	defer f.Close()
	w := bufio.NewWriter(f)
    #td 是我想要传送给前台需要渲染的文章参数
	td := map[string]interface{}{
		"Title":   post.Title,
		"Post":    post,
		"Content": post,
	}
	if err := t.Execute(w, td); err != nil {
		return fmt.Errorf("error executing template %s: %v", filePath, err)
	}
	if err := w.Flush(); err != nil {
		return fmt.Errorf("error writing file %s: %v", filePath, err)
	}
	return nil
}

当时看上面大佬的写的代码有些复杂,有很多细节都写到了。在这块我只是简单把需要用的代码抠出来再做一次简化,如果有兴趣可以去看看上面git,做这个功能在网上泡了好几天,一直没有头绪,看了代码之后也就1~2个小时就把90%写出来了。