一、技术选型
- 后端:
- 语言:可以选择 Python(搭配 Django 或 Flask 框架)、Node.js(搭配 Express 框架)等。以 Python 的 Django 为例,它具有丰富的插件和工具,能快速搭建功能完备的后端。
- 数据库:使用关系型数据库如 MySQL 或 PostgreSQL,也可以选择非关系型数据库 MongoDB。如果注重数据一致性和事务处理,MySQL 是不错的选择;若数据结构灵活多变,MongoDB 更合适。
-
前端:
-
框架:Vue.js 或 React 都很适合构建交互式前端界面。这里以 Vue.js 为例,它具有简洁的语法和良好的生态。
-
UI 库:Element - UI 或 Vuetify 等可以帮助快速搭建美观的界面,减少样式开发的工作量。
二、后端开发
- 项目初始化:
-
使用 Django 时,通过命令
django - admin startproject jianshu_project创建项目。 -
然后创建一个应用,例如
python manage.py startapp article。 -
数据模型设计:
-
在
article/models.py中定义文章相关的模型。例如:
收起
python
from django.db import modelsfrom django.contrib.auth.models import Userclass Article(models.Model): title = models.CharField(max_length = 200) content = models.TextField() author = models.ForeignKey(User, on_delete = models.CASCADE) created_at = models.DateTimeField(auto_now_add = True) updated_at = models.DateTimeField(auto_now = True)
- 运行
python manage.py makemigrations和python manage.py migrate来创建数据库表。
- API 接口开发:
- 使用 Django REST framework 来创建 API。首先安装
pip install djangorestframework。 - 在
article/views.py中编写视图函数:
收起
python
from rest_framework import viewsetsfrom.serializers import ArticleSerializerfrom.models import Articleclass ArticleViewSet(viewsets.ModelViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer
- 定义序列化器
article/serializers.py:
收起
python
from rest_framework import serializersfrom.models import Articleclass ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = '__all__'
- 在项目的
urls.py中配置 API 路由:
收起
python
from django.contrib import adminfrom django.urls import path, includefrom rest_framework import routersfrom article.views import ArticleViewSetrouter = routers.DefaultRouter()router.register(r'articles', ArticleViewSet)urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls))]
三、前端开发
- 项目初始化:
-
使用 Vue CLI 初始化项目,
vue create jianshu_frontend。 -
页面布局和组件设计:
-
创建文章列表页面
ArticleList.vue,用于展示文章列表:
收起
html
<template> <div> <h1>文章列表</h1> <ul> <li v - for="article in articles" :key="article.id"> <router - link :to="`/articles/${article.id}`">{{ article.title }}</router - link> </li> </ul> </div></template><script>export default { data() { return { articles: [] }; }, created() { this.fetchArticles(); }, methods: { async fetchArticles() { try { const response = await this.$axios.get('/api/articles/'); this.articles = response.data; } catch (error) { console.error('获取文章列表失败', error); } } }};</script>
- 创建文章详情页面
ArticleDetail.vue,用于展示文章内容:
收起
html
<template> <div> <h1>{{ article.title }}</h1> <p>{{ article.content }}</p> </div></template><script>export default { data() { return { article: {} }; }, created() { this.fetchArticle(); }, methods: { async fetchArticle() { try { const response = await this.$axios.get(`/api/articles/${this.$route.params.id}`); this.article = response.data; } catch (error) { console.error('获取文章详情失败', error); } } }};</script>
- 创建写文章页面
WriteArticle.vue:
收起
html
<template> <div> <h1>写文章</h1> <form @submit.prevent="submitArticle"> <label for="title">标题:</label> <input type="text" id="title" v - model="article.title"> <br> <label for="content">内容:</label> <textarea id="content" v - model="article.content"></textarea> <br> <button type="submit">提交</button> </form> </div></template><script>export default { data() { return { article: { title: '', content: '' } }; }, methods: { async submitArticle() { try { await this.$axios.post('/api/articles/', this.article); this.$router.push('/articles'); } catch (error) { console.error('提交文章失败', error); } } }};</script>
- 路由配置:
- 在
router/index.js中配置路由:
收起
javascript
import { createRouter, createWebHistory } from 'vue - router';import ArticleList from '../views/ArticleList.vue';import ArticleDetail from '../views/ArticleDetail.vue';import WriteArticle from '../views/WriteArticle.vue';const routes = [ { path: '/', name: 'ArticleList', component: ArticleList }, { path: '/articles/:id', name: 'ArticleDetail', component: ArticleDetail }, { path: '/write', name: 'WriteArticle', component: WriteArticle }];const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes});export default router;
四、用户认证和权限管理(可选扩展)
- 后端:
- 在 Django 中,可以使用内置的用户认证系统。安装并配置
djangorestframework - simplejwt来实现 JWT(JSON Web Token)认证。 - 首先安装
pip install djangorestframework - simplejwt。 - 在
settings.py中配置:
收起
python
from datetime import timedeltaSIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes = 30), 'REFRESH_TOKEN_LIFETIME': timedelta(days = 1),}
- 在
urls.py中添加认证路由:
收起
python
from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView,)urlpatterns = [ # 其他路由... path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh')]
- 前端:
- 在请求 API 时,将 JWT token 添加到请求头中。例如,在
main.js中配置 axios 拦截器:
收起
javascript
import axios from 'axios';import store from './store';axios.interceptors.request.use(config => { const token = store.getters['auth/token']; if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config;}, error => { return Promise.reject(error);});
五、部署
- 后端:
-
可以将 Django 项目部署到服务器上,例如使用 Nginx 作为 Web 服务器,Gunicorn 作为应用服务器。
-
配置 Nginx 反向代理到 Gunicorn 的端口(例如 8000)。
-
前端:
-
使用
npm run build命令打包 Vue 项目,将生成的dist目录上传到服务器,可以放在 Nginx 的静态文件目录下,配置 Nginx 使其能够正确访问前端页面。
以上只是一个基本的快速开发框架,实际的简书网站还会涉及到更多的功能,如评论系统、点赞功能、标签分类、搜索功能等,可以在这个基础上逐步扩展。