豌豆Ai站群搜索引擎系统 V.25.10.25 网址:www.wd.chat

🗣 Wd提问: 博客系统源码支持SEO

🤖 Ai回答:
这里为您提供一个具备SEO优化功能的博客系统源码实现方案,包含核心代码和实现思路。

一、技术栈选择

后端: Node.js + Express
数据库: MongoDB + Mongoose
前端: EJS模板引擎
SEO关键组件:
自定义meta标签
结构化数据(JSON-LD)
自动生成sitemap
友好的URL结构

二、核心代码实现

1、数据库模型 (models/Post.js)
javascript
const mongoose = require('mongoose');
const slugify = require('slugify');

const postSchema = new mongoose.Schema({
title: {
type: String,
required: true,
trim: true
},
slug: {
type: String,
unique: true,
index: true
},
content: {
type: String,
required: true
},
excerpt: {
type: String,
maxlength: 160 // 适合meta description的长度
},
metaDescription: {
type: String,
maxlength: 160
},
tags: [{
type: String,
lowercase: true
}],
featuredImage: String,
published: {
type: Boolean,
default: false
},
publishedAt: Date
}, {
timestamps: true
});

// 保存前生成slug
postSchema.pre('save', function(next) {
if (this.isModified('title')) {
this.slug = slugify(this.title, {
lower: true,
strict: true,
remove: /[*+~.()'!:@]/g
});
}

// 自动生成摘要
if (this.isModified('content') && !this.excerpt) {
this.excerpt = this.content.substring(0, 160).replace(/<[^]*/g, '');
}

next();
});

module.exports = mongoose.model('Post', postSchema);

2、SEO中间件 (middleware/seo.js)
javascript
function generateSEOData(req, res, next) {
res.locals.seo = {
title: '我的博客 分享技术文章',
description: '一个专注于Web开发、SEO优化技术的博客',
keywords: '博客,技术,SEO,Web开发',
canonical: `${process.env.BASE_URL}${req.originalUrl}`,
og: {
title: '我的博客',
description: '技术分享博客',
image: `${process.env.BASE_URL}/images/og-image.jpg`,
url: `${process.env.BASE_URL}${req.originalUrl}`
},
jsonLd: null
};

next();
}

module.exports = generateSEOData;

3、文章控制器 (controllers/postController.js)
javascript
const Post = require('../models/Post');

exports.getPost = async (req, res) = {
try {
const post = await Post.findOne({ slug: req.params.slug, published: true });

if (!post) {
return res.status(404).render('404', {
title: '文章未找到',
seo: {
title: '文章未找到 我的博客',
robots: 'noindex, follow'
}
});
}

// 结构化数据
const jsonLd = {
@context: https://schema.org,
@type: BlogPosting,
headline: post.title,
description: post.metaDescription post.excerpt,
datePublished: post.publishedAt.toISOString(),
dateModified: post.updatedAt.toISOString(),
author: {
@type: Person,
name: 作者名
},
publisher: {
@type: Organization,
name: 我的博客,
logo: {
@type: ImageObject,
url: `${process.env.BASE_URL}/images/logo.png`
}
}
};

res.render('post', {
post,
seo: {
title: `${post.title} 我的博客`,
description: post.metaDescription post.excerpt,
keywords: post.tags.join(','),
canonical: `${process.env.BASE_URL}/post/${post.slug}`,
og: {
title: post.title,
description: post.metaDescription post.excerpt,
image: post.featuredImage `${process.env.BASE_URL}/images/default-og.jpg`
},
jsonLd: JSON.stringify(jsonLd)
}
});
} catch (error) {
res.status(500).render('error');
}
};

4、Sitemap生成 (utils/sitemapGenerator.js)
javascript
const Post = require('../models/Post');
const { SitemapStream, streamToPromise } = require('sitemap');
const { createGzip } = require('zlib');

let sitemap;

const generateSitemap = async () = {
try {
const posts = await Post.find({ published: true })
.select('slug updatedAt')
.sort({ updatedAt: -1 });

const smStream = new SitemapStream({
hostname: process.env.BASE_URL
});

const pipeline = smStream.pipe(createGzip());

// 添加静态页面
smStream.write({ url: '/', changefreq: 'daily', priority: 1.0 });
smStream.write({ url: '/about', changefreq: 'monthly', priority: 0.7 });

// 添加文章
posts.forEach(post = {
smStream.write({
url: `/post/${post.slug}`,
lastmod: post.updatedAt.toISOString(),
changefreq: 'monthly',
priority: 0.8
});
});

smStream.end();

const sitemapBuffer = await streamToPromise(pipeline);
sitemap = sitemapBuffer.toString();

console.log('Sitemap generated successfully');
} catch (error) {
console.error('Sitemap generation error:', error);
}
};

// 定期重新生成sitemap
setInterval(generateSitemap, 24 * 60 * 60 * 1000); // 每天

module.exports = {
generateSitemap,
getSitemap: () = sitemap
};

5、头部模板部分 (views/partials/head.ejs)
html
<head
<meta charset=UTF-8
<meta name=viewport content=width=device-width, initial-scale=1.0

<! SEO Meta Tags
<title<%= seo.title %</title
<meta name=description content=<%= seo.description %
<meta name=keywords content=<%= seo.keywords %
<meta name=author content=作者名

<! Canonical URL
<link rel=canonical href=<%= seo.canonical %

<! Open Graph
<meta property=og:type content=website
<meta property=og:title content=<%= seo.og.title %
<meta property=og:description content=<%= seo.og.description %
<meta property=og:image content=<%= seo.og.image %
<meta property=og:url content=<%= seo.og.url %
<meta property=og:site_name content=我的博客

<! Twitter Card
<meta name=twitter:card content=summary_large_image
<meta name=twitter:title content=<%= seo.og.title %
<meta name=twitter:description content=<%= seo.og.description %
<meta name=twitter:image content=<%= seo.og.image %

<! Robots
<meta name=robots content=<%= seo.robots 'index, follow' %

<! Structured Data
<% if (seo.jsonLd) { %
<script type=application/ld+json
<%= seo.jsonLd %
</script
<% } %

<link rel=stylesheet href=/css/style.css
</head

6、路由设置 (routes/index.js)
javascript
const express = require('express');
const router = express.Router();
const postController = require('../controllers/postController');
const { getSitemap } = require('../utils/sitemapGenerator');

// 文章详情页
router.get('/post/:slug', postController.getPost);

// Sitemap路由
router.get('/sitemap.xml', (req, res) = {
res.header('Content-Type', 'application/xml');
res.send(getSitemap());
});

// Robots.txt
router.get('/robots.txt', (req, res) = {
res.type('text/plain');
res.send(`User-agent: *
Allow: /
Sitemap: ${process.env.BASE_URL}/sitemap.xml`);
});

module.exports = router;

三、关键SEO特性说明

1、友好的URL结构: 使用slug而非ID作为文章标识
2、Meta标签优化: 动态生成title、description、keywords
3

Ai作答

📣 商家广告


香港vps

香港vps

日付VPS

高防vps

广告招商


0

IP地址: 225.161.132.178

搜索次数: 0

提问时间: 2025-11-11 08:38:57

🛒 域名购买
kkky.com.cn
wenchangji.cn
53.gold
27.gs
26.gold
53.biz
32.cx
jqe.com.cn
gjxs.cn
lifeisacharm.com

❓️ 热门提问
idc包含idc机房配套吗
网站停留时间提升
安卓云手机挂机
csgo东南亚服务器
vps香港购买
站群软件推荐
什么云服务器可以试用
vps搭建服务器上网
超融合是云计算吗
cn域名的网站
豌豆Ai站群搜索引擎系统

🌐 域名评估
tesla.nm.cn
oppo.qh.cn
wj.cx
rr.gz.cn
62.chat
g.xj.cn
6.tj.cn
kaichong.com
sbnjt.net
719.net.cn

⛏ 最新挖掘
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜

🖌 热门作画

🤝 关于我们:
豌豆Ai 域名 建站 站群 留痕 推广 评估 源码
开发Ai 工具 日记 价格 加盟 广告 流量 留言 联系

🗨 加入群聊
群

🔗 友情链接
搜站网  사이트 순위  ai提问

🧰 站长工具
Ai工具  whois查询  搜索

📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。

👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。

上一篇 87725 87726 87727 下一篇