Golang生成静态页面文件

3 minute read

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

定义要渲染的模板路径

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

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

根据文章名称保存

 1func WriteIndexHTML(name string, post *model.Post) error {
 2	t, err := getTemplate()
 3	path, _ := os.Getwd()
 4    #当时想一次创建好,结果发现os.create不能创建目录,所以又用mkdirall创建好所需要的目录
 5	err = os.MkdirAll(filepath.Join(path, "staticPost", "PostsView", name), 0777)
 6	if err != nil {
 7		panic(err)
 8	}
 9    #根据文章名称保存到指定路径
10	filePath := filepath.Join(path, "staticPost", "PostsView", name, "index.html")
11	#创建文章
12    f, err := os.Create(filePath)
13	if err != nil {
14		return fmt.Errorf("error creating file %s: %v", filePath, err)
15	}
16	defer f.Close()
17	w := bufio.NewWriter(f)
18    #td 是我想要传送给前台需要渲染的文章参数
19	td := map[string]interface{}{
20		"Title":   post.Title,
21		"Post":    post,
22		"Content": post,
23	}
24	if err := t.Execute(w, td); err != nil {
25		return fmt.Errorf("error executing template %s: %v", filePath, err)
26	}
27	if err := w.Flush(); err != nil {
28		return fmt.Errorf("error writing file %s: %v", filePath, err)
29	}
30	return nil
31}

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