添加seo相关标签,以及seo优化

This commit is contained in:
srcrs 2023-09-02 23:45:35 +08:00
parent 6160450fcf
commit 007eae0b9d
2 changed files with 126 additions and 29 deletions

View File

@ -1,8 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS Reader</title>
<meta name="description" content='RSS Reader一个将订阅信息聚合展示的开源web工具便于了解近期关注的信息同时页面数据数据也实现了自动刷新。'>
<meta name="keywords" content="<< .Keywords >>">
<meta name="anthor" content="srcrs">
<!-- <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> -->
<link rel="stylesheet" href="static/index.min.css">
<link rel="icon" href="static/favicon.svg" type="image/x-icon">
@ -60,37 +64,67 @@
}
</style>
</head>
<body>
<div id="app">
<el-container>
<el-header>
<h1>RSS Reader</h1>
</el-header>
<el-main
v-loading.fullscreen.lock="fullscreenLoading"
element-loading-text="拼命加载中"
>
<el-main v-loading.fullscreen.lock="fullscreenLoading" element-loading-text="拼命加载中">
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="8" :lg="6" v-for="(feed, index) in feeds" :key="index" class="feed-col">
<el-card class="box-card">
<div slot="header" class="card-header">
<span>{{ feed.title }}</span>
</div>
<el-scrollbar style="height: 300px;">
<el-list v-for="(item, i) in feed.items" :key="i">
<el-list-item>
<div class="list-item-title">
<span>{{ i+1 }}. </span>
<el-link :href="item.link" target="_blank" :title="item.title">{{ item.title }}</el-link>
</div>
</el-list-item>
</el-list>
</el-scrollbar>
<div slot="footer" class="card-footer" style="height: 10px;">
<time class="time">{{ feed.custom.lastupdate }}</time>
</div>
</el-card>
</el-col>
<< range $index, $feed :=.RssDataList >>
<el-col v-if="showSEOFlag" :xs="24" :sm="12" :md="8" :lg="6" :key="index" class="feed-col">
<el-card class="box-card">
<div slot="header" class="card-header">
<span>
<< $feed.Title >>
</span>
</div>
<el-scrollbar style="height: 300px;">
<< range $i, $item :=$feed.Items >>
<el-list key="<< $i >>">
<el-list-item>
<div class="list-item-title">
<span>
<< inc $i >>.
</span>
<el-link href="<< $item.Link >>" target="_blank" title="<< $item.Title >>">
<< $item.Title >>
</el-link>
</div>
</el-list-item>
</el-list>
<< end >>
</el-scrollbar>
<div slot="footer" class="card-footer" style="height: 10px;">
<time class="time">
<< $feed.Custom.lastupdate >>
</time>
</div>
</el-card>
</el-col>
<< end>>
<el-col :xs="24" :sm="12" :md="8" :lg="6" v-for="(feed, index) in feeds" :key="index" class="feed-col">
<el-card class="box-card">
<div slot="header" class="card-header">
<span>{{ feed.title }}</span>
</div>
<el-scrollbar style="height: 300px;">
<el-list v-for="(item, i) in feed.items" :key="i">
<el-list-item>
<div class="list-item-title">
<span>{{ i+1 }}. </span>
<el-link :href="item.link" target="_blank" :title="item.title">{{ item.title }}</el-link>
</div>
</el-list-item>
</el-list>
</el-scrollbar>
<div slot="footer" class="card-footer" style="height: 10px;">
<time class="time">{{ feed.custom.lastupdate }}</time>
</div>
</el-card>
</el-col>
</el-row>
</el-main>
<el-footer>
@ -103,7 +137,7 @@
<!-- <script src="https://unpkg.com/vue@next"></script> -->
<script src="static/vue.global.prod.js"></script>
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/element-plus/2.3.3/index.full.js"></script> -->
<script src="static/index.full.min.js"></script>
<script>
@ -111,9 +145,13 @@
data() {
return {
feeds: [],
showSEOFlag: true,
fullscreenLoading: true,
};
},
async created() {
this.fullscreenLoading = false;
},
async mounted() {
const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
const connect = () => {
@ -126,7 +164,7 @@
} else {
this.feeds.push(feed);
}
this.fullscreenLoading = false;
this.showSEOFlag = false;
};
socket.onclose = event => {
console.log("WebSocket closed. Reconnecting...");
@ -152,4 +190,4 @@
app.mount("#app");
</script>
</body>
</html>
</html>

63
main.go
View File

@ -3,6 +3,7 @@ package main
import (
"embed"
"encoding/json"
"html/template"
"io/ioutil"
"log"
"net/http"
@ -57,7 +58,8 @@ func main() {
go updateFeeds()
http.HandleFunc("/feeds", getFeedsHandler)
http.HandleFunc("/ws", wsHandler)
http.HandleFunc("/", serveHome)
// http.HandleFunc("/", serveHome)
http.HandleFunc("/", tplHandler)
//加载静态文件
fs := http.FileServer(http.FS(dirStatic))
@ -70,6 +72,38 @@ func serveHome(w http.ResponseWriter, r *http.Request) {
w.Write(htmlContent)
}
func tplHandler(w http.ResponseWriter, r *http.Request) {
// 创建一个新的模板,并设置自定义分隔符为<< >>避免与Vue的语法冲突
tmplInstance := template.New("index.html").Delims("<<", ">>")
//添加加法函数计数
funcMap := template.FuncMap{
"inc": func(i int) int {
return i + 1
},
}
// 加载模板文件
tmpl, err := tmplInstance.Funcs(funcMap).ParseFiles("index.html")
if err != nil {
log.Println("模板加载错误:", err)
return
}
// 定义一个数据对象
data := struct {
Keywords string
RssDataList []feed
}{
Keywords: getKeywords(),
RssDataList: getFeeds(),
}
// 渲染模板并将结果写入响应
err = tmpl.Execute(w, data)
if err != nil {
log.Println("模板渲染错误:", err)
}
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
@ -153,7 +187,8 @@ func updateFeed(fp *gofeed.Parser, url, formattedTime string) {
dbMap[url] = customFeed
}
func getFeedsHandler(w http.ResponseWriter, r *http.Request) {
//获取feeds列表
func getFeeds() []feed {
feeds := make([]feed, 0, len(rssUrls.Values))
for _, url := range rssUrls.Values {
lock.RLock()
@ -166,6 +201,30 @@ func getFeedsHandler(w http.ResponseWriter, r *http.Request) {
feeds = append(feeds, cache)
}
return feeds
}
//获取关键词也就是title
//获取feeds列表
func getKeywords() string {
words := ""
for _, url := range rssUrls.Values {
lock.RLock()
cache, ok := dbMap[url]
lock.RUnlock()
if !ok {
log.Printf("Error getting feed from db is null %v", url)
continue
}
if cache.Title != "" {
words += cache.Title + ","
}
}
return words
}
func getFeedsHandler(w http.ResponseWriter, r *http.Request) {
feeds := getFeeds()
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(feeds)