最近要在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%写出来了。