第一節javascript
@注意php
千萬注意格式、標籤名字;css
瀏覽器開發者模式修改頁面不顯示:在開發者模式下(F12進入),打開設置頁面(F1),勾選 Disable cache (while DevTools is open)
便可;html
提示沒有修改頁面的權限,在pycharm的debug裏面勾選allow unsigned requests;前端
html用chrome演示;vue
pycharm顯示pip19版本可是turminal是9版本:進入第三方庫目錄,刪掉pip19info文件夾,從新python -m pip install --upgrade pip;java
@坑python
php建站後使用比較麻煩mysql
計算機基礎sql
英語基礎
@先後端分離
vuejs框架和django,vuejs接管django的views模塊;
django打開頁面是不停刷新,用vuejs能夠不用太多跳轉;
@django的MTV
models
templates
views
@升級pip
python -m pip install --upgrade pip
@設計(Adobe xd 沒有Linux版本,找個ui設計軟件)
1.https://semantic-ui.com/ 源代碼裏找到dist/semantic.min.css,即打開view-source:https://semantic-ui.com/dist/semantic.min.css並複製,保存到semantic.min.css文件中,刪除@import那一行(從@到;刪掉,刪多了會顯示錯誤);
2.在html的head裏面添加<link rel="stylesheet" href="項目內路徑">
增長本身的mystyle.css,也添加到head引用;
3.設置四個導航欄(課程裏四列,可是我四列就變兩行了?)
<body>
<div class="top-menu">
<div class="ui container">
<div class="ui five column grid">
<div class="column">
首頁
</div>
<div class="column">
blog
</div>
<div class="column">
做品
</div>
<div class="column">
聯繫
</div>
</div>
</div>
</div>
</body>
4.打開網頁,f12,點擊手機方式瀏覽,在head連加入如下,實現移動設備優先
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
5.修改mystyle.css文件
html{
font-size:10px;
}
.top-menu{
background:#000;
color:#fff;
padding-top:1rem;/*1rem表示根元素的大小*/
}
.top-menu .column{
text-align:center;
}
6.首頁幻燈
https://www.swiper.com.cn/
找案例,看源代碼,找css引用文件並點擊打開,複製到新建的swiper.css文件中,並在html中引入樣式;從案例中複製body裏面的html內容到個人html中;複製案例中的js內容並保存到個人js文件裏,在html的body結束前插入引用(django裏面不用這種路徑就)<script src="../statics/swiper.css" charset="utf-8"></script>
增長js自主添加的編碼,也是複製案例裏面的
<script> var swiper = new Swiper('.swiper-container', { spaceBetween: 30, centeredSlides: true, autoplay: { delay: 2500, disableOnInteraction: false, }, pagination: { el: '.swiper-pagination', clickable: true, }, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, }); </script>
調整網頁
<div class="swiper-slide">Slide 6</div>
替換爲
<div class="swiper-slide"><img src="路徑" alt=''></div>
調整mystyle.css
positon:fixed;位置爲懸浮
heigh:3000px;框架高度
top:0;上邊距
z-index:999;位於最高
width:100%;
height:3rem;(html{}裏面font-size:10px;rem是font-size的倍數)
發現導航欄擋了一部分banner圖(用一下方法,或直接在html裏面將導航欄的透明度更改一下)
在之間建立一個div,id=’banner'
css裏面建立
#banner{ margin-top:5rem }
刪除輪播圖的箭頭(刪掉「<!-- Add Arrows --><div class="swiper-button-next"></div><div class="swiper-button-prev"></div>」)
7.作功能按鈕
圖片來源https://www.iconfont.cn/ 新浪微博登陸 圖片都改成拼音不用中文;
文章簡圖 創客貼;
8.放入django
@建立項目,建立app,配置settings:
註冊app;
STATIC_URL = '/statics/' MEDIA_URL='/upload/' MEDIA_ROOT=os.path.join(BASE_DIR,'upload').replace('//','/')
@修改urls
from django.contrib import admin
from django.urls import path,include
from django.conf import settings
from django.conf.urls.static import static
from myblog import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
@migrate一下
@配置views.py裏面的index
def index(request): return render(request,'index.html')
@處理載入問題
引入模板{% load static %}
配置連接
<link href="{% static "css/semantic.min.css" %}" rel="stylesheet"> <link href="{% static "css/mystyle.css" %}" rel="stylesheet"> <link href="{% static "css/swiper.min.css" %}" rel="stylesheet">
相關的圖片和js的引用也用相似格式修改
9.配置admin後臺
配置models,建立首頁模塊
class Topmenu(models.Model): #blank就是空的也能夠存,default默認爲空 title=models.CharField(default='',blank=True,null=True,max_length=20) url=models.CharField(default='',blank=True,null=True,max_length=20) def __str__(self): return self.title
@建立超級用戶python manage.py createsuperuser(用戶名字前倆,密碼s)
@註冊首頁模塊
from django.contrib import admin from myblog.models import Topmenu admin.site.register(Topmenu)
註冊了帳戶就須要合併數據庫,add首頁導航欄幾個名字,只寫title
@處理views
from django.shortcuts import render from .models import Topmenu # Create your views here. def index(request): topmenu=Topmenu.objects.all() content={ 'topmenu':topmenu } return render(request,'index.html',content)
@處理html,載入數據庫中的導航欄名稱
{% for item in topmenu %} <div class="column"> {{ item.title }} </div> {% endfor %}
10.vue.js
@兩種方式引入,開發用開發版本,會有報錯提示
<!-- 開發環境版本,包含了有幫助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
或者:
<!-- 生產環境版本,優化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script>
@引用vue.js
複製第一個引用連接,瀏覽器打開,複製全部,在項目中建立vue.js文件;
html的head中插入
<script src="{% static 'js/vue.js' %}" charset="utf-8"></script>
刷新頁面,查看開發者模式控制檯,有(
)表示引用成功。建立index.js並引用,先空着。
@編輯index.js
new Vue({ // el就是element el:'#index', data:{ // js語法:數組表示爲中括號,對象用大括號 topmenu:[{title:'首頁'},{title:'blog'},{title:'做品'},{title:'聯繫'},] }, })
提示vue不能獲取id,則說明頁面中script加入的位置太靠前,應該放在要顯示的位置的後面。
提示
,則說明script放在</div>前面了。html中用<div v-for='item in topmenu' class="column">代替原來的for循環,此時不顯示,body和script之間加入{% verbatim %}接管django,
@django模式的標籤地址屬性改成vuejs用的。
原爲:
<img src="{static ‘image/77263a9a-6416-4131-a10e-c43ba516170d.jpg’}">
後爲:
<img src="static/image/77263a9a-6416-4131-a10e-c43ba516170d.jpg">
@Ajax
https://www.npmjs.com/package/reqwest
@建立路由,在myblog子app裏面建立api.py,下載djangorestframework,並在settings裏面註冊子app 'rest_framework'
@修改api.py
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.decorators import api_view
from myblog.models import Topmenu
class Topmenuxuliehua(serializers.ModelSerializer):
class Meta:
depth=1
model=Topmenu
fields='__all__'
@api_view(['GET'])
def indexData(request):
print('ok')
return Response('ok')
@增長路由
path('api/index', api.indexData),
刷線以下圖
這就是rest_framework爲django提供的json格式界面,點擊get裏面的json可查看json格式數據。
@頁面載入js數據
def indexData(request): topmenu=Topmenu.objects.all() topmenuData=Topmenuxuliehua(topmenu,many=True) return Response({'topmenu':topmenuData.data})
此時頁面就能夠讀取js數據
@引用reqwest.js
複製reqwest文件到js文件夾中,引入到index頁面的頭部。
修改index.js
new Vue({ // el就是element el:'#index', data:{ // js語法:數組表示爲中括號,對象用大括號 topmenu:[{title:'首頁'},{title:'blog'},{title:'做品'},{title:'聯繫'},] }, methods:{ getData:function(){ reqwest({ url:'/api/index', method:'get', success:function(data){ console.log(data) } }) } } })
此時頁面可在開發者模式的console頁看到沒有成功執行console.log(data),須要添加方法
// mounted方法是載入html時最早執行的方法 mounted(){ console.log('ok') this.getData() },
js能夠正常工做
@修改index.js
new Vue({ // el就是element el:'#index', data:{ // js語法:數組表示爲中括號,對象用大括號 topmenu:[] }, // mounted方法是載入html時最早執行的方法 mounted(){ this.getData() }, methods:{ getData:function(){ // 避免this指向錯誤,設置self var self=this reqwest({ url:'/api/index', method:'get', type:'json', success:function(data){ console.log(data) self.topmenu=data.topmenu console.log(self.topmenu) } }) } } })
網站基礎應用搭建完畢,接下來豐富網站
完整項目流程:
11.豐富網站內容
@找b站封面圖片
右擊視頻審覈元素,找到上面的pic的class,複製裏面的圖片地址如‘//i0.hdslb.com/bfs/archive/91ca6962927787a14e6c0043d84db702ab14bb74.jpg@160w_100h.jpg’
連接前面加上‘http://’,後面改下w和h的值爲1140,717,依次得到三張圖片
@修改models.py(一旦修改model層,就要更新數據庫),新增:
class Banner(models.Model): img=models.ImageField(blank=True,null=True) def __str__(self): return self.id
在admin.py 裏面增長對Banner的引用,並註冊,此時admin後臺頁面就顯示增長了Banner;
此時在Banner處增長圖片,報錯,提示__str__ returned non-string (type int);
將Banner裏面的__str__改成__int__,網頁還不對的話,就從新啓動服務器;
由於以前配置了MEDIA_URL爲‘/upload/’因此在整個項目第一層會將全部新上傳媒體文件收錄到upload文件夾中。
@將上傳圖片返回到網頁
原先models層返回到views.py,如今是返回到api.py;
新增bannerData
#Author:Wen from rest_framework import serializers from rest_framework.response import Response from rest_framework.decorators import api_view from myblog.models import Topmenu,Banner class Topmenuxuliehua(serializers.ModelSerializer): class Meta: depth=1 model=Topmenu fields='__all__' class BannerData(serializers.ModelSerializer): class Meta: # 設置depth標記,方便數據關聯 depth=1 model=Banner # 就一個img字段,因此能夠用__all__,若是都選擇型顯示,能夠fields=(['img','lala']) fields='__all__' @api_view(['GET']) def indexData(request): # 首頁的導航欄 topmenu=Topmenu.objects.all() topmenuData=Topmenuxuliehua(topmenu,many=True) # 首頁的Banner banner=Banner.objects.all() bannerData=BannerData(banner,many=True) return Response({'topmenu':topmenuData.data,'banner':bannerData.data})
此時刷新http://127.0.0.1:8000/api/index,能夠看到返回的json數據
@api(即rest_framework)的json數據被vuejs(即index.js)獲取:index.js裏面新增banner數組,設置變量獲取數據,mounted方法中新增console.log(this)
查看頁面的返回信息
可見頁面渲染須要調取banner的img屬性
@用vuejs渲染index.html
<div v-for='item in banner' class="swiper-slide">
<img :src="item.img" alt="" style="width:100%">
</div>
刷新就顯示banner圖
12.用戶帳號
@用戶的前端製做
models裏面新增用戶模型
from django.contrib.auth.models import User
html修改,在{% endverbatim %}上面的</div>的上面新增
<div id="login">
<div class="userui">
<div class="ui container" style="background: #fff2f2">
<h3>登陸</h3>
<div class="input">
<div class="item">
<input type="text" name="" value="" placeholder="用戶名">
</div>
<div class="item">
<input type="text" name="" value="" placeholder='密碼'>
</div>
</div>
<button type="button" name="button">取消</button>
<button type="button" name="button" style="background: #0d71bb;color: #ffffff">肯定</button>
</div>
</div>
</div>
修改css
#login{ } #login .userui{ position:fixed; top:30rem; width:100%; height: 20rem; } #login .userui .ui.container{ background: #fff; padding:1rem 1rem 1rem 1rem; border:1px solid #efefef; text-align: center; } #login .userui .ui.container .item{ width:100%; height:4rem; margin-bottom: 1rem; } /*div下面的div用點,div下面不是div用空格*/ #login .userui .ui.container .item input{ width:100%; height:100%; border:1px solid #a96216; border-radius:2rem; text-align: center; } #login .userui .ui.container button{ background: #FFFFFF; width:8rem; height:3rem; margin-left:1rem; border:1px solid #0f0f10; }
@交互
修改api.py,新增
# 用戶管理 from django.contrib.auth import login from django.contrib.auth.models import User
@讓登錄框默認隱藏
index.js--data--新增userui:false,
index.html裏面找到要設置爲點擊打開登錄頁面的div,新增@click='showuserui()'
index.js--methods新增(別忘了前面加逗號)
showuserui:function(){ this.userui=!this.userui }
@前端捕獲用戶帳號密碼
index.js--data新增‘username’和‘password’兩個空數據;
index.html--input標籤中新增‘v-model='username'’;
@向後臺發送
index.html肯定按鈕新增@click='userlogin()'
index.js新增方法
userlogin:function(){
var self=this
reqwest({
url:'/api/index',
method:'post',
data:{
username:self.username,
password:self.password
},
success:function() {
console.log('ok')
},
error:function(err){
console.log(err)
},
})
},
api.py裝飾器中增長‘POST’方法
注意:出現favicon.ico缺失錯誤
<link rel="icon" href="data:;base64,=">
@後臺驗證帳號
api.py
from django.contrib.auth import login,authenticate #函數中新增 username=request.POST['username'] password=request.POST['password'] user=authenticate(username=username,password=password) print(user) if user!=None: login(request,user) return Response({'loginType':'ok'})
@處理跨站請求csrftoken
js.cookies.js文件複製到static/js文件夾中
html--在index.js引入前插入
<script type="text/javascript"> var csrftoken=Cookies.get('csrftoken') console.log(csrftoken) </script>
index.js--在userlogin方法下加入
type:'json', headers:{ 'X-CSRFTOKEN':csrftoken },
此時前端帳號登陸就能保證打開後臺頁面後臺也能夠登陸。
@
@登陸就關閉登陸框,而且登陸按鈕改成「個人」
index.js--method-userlogin-reqwest-seccess裏面新增
if(data.loginType=='ok'){ self.userui=false
index.html
<div v-if='loginButton' @click='showuserui()' class="column"> 登錄 </div> <div v-else class="column"> 個人 </div>
index.js--data--新增loginButton:true,
index.js--method-userlogin-reqwest-seccess裏面if下面新增loginButton:false,
@後臺驗證是否登陸
由於登陸失敗,django捕獲的request.user.id都爲none,因此用此判斷登陸狀態
if userid!=None: loginType='ok'
index.js新增loginType:true??
if(data.loginType=='ok'){ self.loginType=true }else{self.loginType=false}
@13.多app的關聯
@13p
在app的templates路徑下新建app同名文件夾,將html放進去;render()後面的渲染頁面路徑爲app名稱/html文件名;
在app的static路徑下新建app同名文件夾,把存放靜態文件的文件夾放進去;
新增的靜態文件須要settings內註冊地址:
STATICFILES_DIRS=[ os.path.join(BASE_DIR,'ak','static'), os.path.join(BASE_DIR,'myblog','static'), ]
html中引入靜態文件夾,修改靜態文件引入路徑爲django模式路徑
14.MYSQL
@準備
pip install mysqlclient;
配置settings
下載workbench,輸入數據庫密碼,建立數據庫庫名與django裏的settings一致;
建立django超級用戶;
數據遷移;
刷新頁面發現banner圖和導航欄不見了,在django官方後臺提交材料;
@
15.15p
@include
15-10
@能夠右鍵複製總體HTML;注意引用網頁模板的時候別落下js的引用。
@
@
@
@