去年帮学弟调试毕业设计时,我完整走通了这套Flask+Vue的博客系统开发流程。不同于市面上简单的Demo项目,这个系统实现了前后端分离架构下的完整博客功能闭环,包含富文本编辑、标签分类、用户权限管理等实际生产环境需要的功能模块。特别适合计算机专业学生作为毕业设计参考,也值得中小团队用来搭建技术社区。
系统采用Python+Flask处理后端API逻辑,Vue3+Element Plus构建管理后台,MySQL持久化数据。这种技术组合既保证了开发效率(Flask的轻量级特性),又能体现现代Web开发的最佳实践(前后端分离)。下面我将从架构设计到代码实现,拆解每个关键环节的实操要点。
作为轻量级Web框架,Flask相比Django更适合教学场景:
前端选用Vue3+TypeScript的组合优势在于:
mermaid复制graph TD
A[前端Vue项目] -->|Axios请求| B[Flask API]
B --> C[MySQL数据库]
B --> D[Redis缓存]
A --> E[Markdown编辑器]
A --> F[权限控制模块]
主要功能模块包括:
使用Flask-JWT-Extended实现安全的token机制:
python复制# 登录接口示例
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
user = User.query.filter_by(username=username).first()
if not user or not check_password_hash(user.password, password):
return jsonify({"msg": "Bad credentials"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token)
安全注意事项:
处理Markdown内容存储的特殊逻辑:
python复制@app.route('/articles', methods=['POST'])
@jwt_required()
def create_article():
data = request.get_json()
# 清洗HTML标签防止XSS
clean_content = bleach.clean(
data['content'],
tags=ALLOWED_TAGS,
attributes=ALLOWED_ATTRIBUTES
)
new_article = Article(
title=data['title'],
content=clean_content,
user_id=get_jwt_identity()
)
db.session.add(new_article)
db.session.commit()
return jsonify({"id": new_article.id}), 201
使用ToastUI Editor实现Markdown双预览:
javascript复制import Editor from '@toast-ui/editor'
const editor = new Editor({
el: document.querySelector('#editor'),
height: '500px',
initialEditType: 'markdown',
previewStyle: 'vertical'
})
// 获取内容
const markdownContent = editor.getMarkdown()
编辑器优化技巧:
基于Vue Router的全局守卫:
javascript复制router.beforeEach((to, from, next) => {
const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
const userRole = store.getters.currentUser?.role
if (requiresAuth && !userRole) {
next('/login')
} else if (to.meta.roles && !to.meta.roles.includes(userRole)) {
next('/403')
} else {
next()
}
})
推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
backend:
build: ./backend
ports:
- "5000:5000"
environment:
- DATABASE_URL=mysql://root:password@db:3306/blog
depends_on:
- db
frontend:
build: ./frontend
ports:
- "8080:80"
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=blog
volumes:
db_data:
数据库优化:
前端优化:
后端优化:
使用ECharts实现阅读量趋势图:
javascript复制// 在Vue组件中
const initChart = () => {
const chart = echarts.init(document.getElementById('chart'))
chart.setOption({
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
},
yAxis: { type: 'value' },
series: [{
data: [120, 200, 150, 80, 70],
type: 'bar'
}]
})
}
使用pytest编写后端测试用例:
python复制def test_article_creation(client, auth_headers):
response = client.post(
'/articles',
json={'title': 'Test', 'content': 'Sample'},
headers=auth_headers
)
assert response.status_code == 201
assert 'id' in response.json
Flask端配置CORS:
python复制from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources={
r"/api/*": {
"origins": ["http://localhost:8080"],
"methods": ["GET", "POST", "PUT"],
"allow_headers": ["Authorization"]
}
})
调整Flask配置:
python复制app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB
app.config['UPLOAD_EXTENSIONS'] = ['.jpg', '.png']
使用SQLAlchemy连接池:
python复制app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'pool_size': 10,
'pool_recycle': 3600,
'pool_pre_ping': True
}
使用Swagger UI自动生成:
python复制from flasgger import Swagger
app.config['SWAGGER'] = {
'title': 'Blog API',
'version': '1.0'
}
Swagger(app)
访问/apidocs即可获得交互式文档。
遵循Google风格文档字符串:
python复制def get_article(article_id):
"""根据ID获取单篇文章详情
Args:
article_id: 文章唯一标识符
Returns:
Article对象或404错误
"""
return Article.query.get_or_404(article_id)
社交功能扩展:
内容增强:
技术深化:
这套系统我在三个不同规模的团队中实施过,最大的日活达到2W+。对于毕业设计来说,建议先完成基础功能再考虑扩展模块。Flask的灵活架构使得后续添加新功能非常方便,比如要增加付费模块时,只需要新建一个blueprint即可保持代码整洁。