后端:
python manage.py startapp block 创建APP,并在settings的INSATLLED_APP中添加'block'。
block目录下创建models.py
from django.db import models # Create your models here. # models.py class Blog(models.Model): title = models.CharField(max_length=50) content = models.CharField(max_length=500) # 自定义表名 class Meta: db_table = "t_blog"
与数据库连接
python manage.py makemigrations
python manage.py migeate
终端打开python manage.py shell
手动添加数据
from block.models import Blog
Blog.objects.create("title="b1", content="b1 content")
Blog.objects.create("title="b1", content="b1 content")
查询目前添加的数据 Blog.objects.all()
退出exit()
使用rest_framework, pip install djangorestframework安装包
settings的INSATLLED_APP中添加'rest_framework'
block目录下创建serializers.py
#serializers.py from rest_framework import serializers from .models import Blog class BlogSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Blog # 序列化的对象名 fields = '__all__' # 序列化的字段名,或者指定字段 fields = ("id","name","age")
block目录下创建views.py
#views.py from rest_framework import viewsets from .models import Blog from .serializers import BlogSerializer class BlogViewSet(viewsets.ModelViewSet): queryset = Blog.objects.all() serializer_class = BlogSerializer
配置路由
crude目录下urls.py文件
#urls.py from django.contrib import admin from django.urls import path, include from rest_framework import routers from block.views import BlogViewSet router = routers.DefaultRouter() router.register('blog', BlogViewSet) urlpatterns = [ path('admin/', admin.site.urls), path('', include(router.urls)) ]
解决跨域问题
pip install django-cors-headers
在settings.py中做如下修改
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'corsheaders', 'block', ]
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
CORS_ORIGIN_ALLOW_ALL = True CORS_ALLOW_CREDENTIALS = True
最后文件构成为
前端
vue init webpack crude创建vue项目
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.css"> <title>crude</title> </head> <body> <div class="container"> <nav class="navbar" navbar-dark bg-success> <a class="navbar-brand">博客系统</a> <form class="form-inline"> <input class="form-control" mr-sm-2 type="search" placeholder="Search" aria-label="Search"> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button> </form> </nav> <div id="app"></div> </div> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>
APP.vue
<template> <div id="app"> <router-view/> </div> </template> <script> export default { name: 'App', } </script> <style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
src/components/Container.vue
<template> <div class="row"> <!--左右两屏--> <div class="col-md-4"> <!--左边是编辑部分--> <div class="form-group"> <input type="hidden" v-model="url"> </div> <div class="form-group"> <input type="text" v-model="title" class="form-control" placeholder="标题"> </div> <div class="form-group"> <textarea class="form-control" v-model="content" placeholder="内容"></textarea> </div> <div class="form-group"> <button class="btn btn-block btn-success" @click="saveBlog()">保存</button> </div> <div class="form-group"> </div> </div> <div class="col-md-8"> <!--右边是博客内容表格部分--> <table class="table table-bordered table-hover"> <thead> <th class="text-center">标题</th> <th class="text-center">内容</th> <th class="text-center">编辑</th> <th class="text-center">删除</th> </thead> <tbody> <tr v-for="blog in blogs" :key="blog.url"> <td>{{blog.title}}</td> <td>{{blog.content}}</td> <td> <button class="btn btn-success" @click="editBlog(blog)"> <i class="fa fa-edit"></i> </button> </td> <td> <button class="btn btn-success" @click="deleteBlog(blog)"> <i class="fa fa-trash"></i> </button> </td> </tr> </tbody> </table> </div> </div> </template> <script> //添加axios.http请求组件 import axios from 'axios' export default { name: 'Container', props:{ }, data(){ return{ base_url:"http://127.0.0.1:8000/api/blog/", blogs:null, url:"", title:"", content:"", } }, methods:{ getAll(){ axios.get(this.base_url) .then(res=>{ this.blogs = res.data; //获取列表数据 this.url=""; this.title=""; this.content=""; }); }, saveBlog(){ //新增 if(this.url==""){ axios.post(this.base_url,{title:this.title, content:this.content}) .then(()=>{ this.getAll(); }) } //修改 else{ axios.put(this.url,{title:this.title, content:this.content}) .then(()=>{ this.getAll(); }) } }, editBlog(blog){ this.url= blog.url; this.title=blog.title; this.content=blog.content; }, deleteBlog(blog){ axios.delete(blog.url) .then(()=>{ this.getAll(); }); }, }, mounted(){ this.getAll(); } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
router/index.js
import Vue from 'vue' import Router from 'vue-router' import Container from '@/components/Container' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'Container', component: Container } ] })