例图:
搭建 命令:
前提已装好node.js
开始创建项目结构
npm init -y
package.json: { "name": "ex01", "version": "1.0.0", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "description": "" }
安装必要的依赖
npm install express sqlite3 ejs express-session body-parser
目录:
代码:
app.js
const express = require('express'); const session = require('express-session'); const bodyParser = require('body-parser'); const path = require('path'); const db = require('./database'); const app = express(); // 配置中间件 app.set('view engine', 'ejs'); app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyParser.urlencoded({ extended: false })); app.use(session({ secret: 'blog_secret_key', resave: false, saveUninitialized: true })); // 首页路由 app.get('/', async (req, res) => { try { const category_id = req.query.category; const search = req.query.search; let posts; let categories = await db.all('SELECT * FROM categories'); if (search) { // 搜索标题和内容 posts = await db.all(` SELECT posts.*, categories.name as category_name FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC`, [`%${search}%`, `%${search}%`] ); } else if (category_id) { posts = await db.all(` SELECT posts.*, categories.name as category_name FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE category_id = ? ORDER BY created_at DESC`, [category_id]); } else { posts = await db.all(` SELECT posts.*, categories.name as category_name FROM posts LEFT JOIN categories ON posts.category_id = categories.id ORDER BY created_at DESC`); } res.render('index', { posts, categories, current_category: category_id, search_query: search || '' }); } catch (err) { res.status(500).send('数据库错误'); } }); // 创建博文页面 app.get('/post/new', async (req, res) => { try { const categories = await db.all('SELECT * FROM categories'); res.render('new', { categories }); } catch (err) { res.status(500).send('获取分类失败'); } }); // 提交新博文 app.post('/post/new', async (req, res) => { const { title, content, category_id } = req.body; try { await db.run( 'INSERT INTO posts (title, content, category_id, created_at) VALUES (?, ?, ?, ?)', [title, content, category_id, new Date().toISOString()] ); res.redirect('/'); } catch (err) { res.status(500).send('创建博文失败'); } }); // 查看单篇博文 app.get('/post/:id', async (req, res) => { try { const post = await db.get(` SELECT posts.*, categories.name as category_name FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE posts.id = ?`, [req.params.id]); if (post) { res.render('post', { post }); } else { res.status(404).send('博文不存在'); } } catch (err) { res.statu