基于django和vue的xdh官网设计
前言
本項(xiàng)目是使用三段分離的設(shè)計(jì)
前臺(tái)
使用materialize框架搭建的前臺(tái)頁(yè)面,后端使用的django寫的接口
后臺(tái)
使用Amazon UI 模板搭建的界面,管理各個(gè)部分的內(nèi)容
項(xiàng)目環(huán)境
python3.7.2 django2.2.9 vue axios jQuery materialize mysql摘 要
本設(shè)計(jì)采用前后端分離的設(shè)計(jì)模式,前端通過(guò)vue的axios發(fā)送ajax請(qǐng)求來(lái)調(diào)用后端接口,實(shí)現(xiàn)頁(yè)面的展示,后端使用Python中的django框架來(lái)訪問(wèn)數(shù)據(jù)庫(kù),并返回json數(shù)據(jù)。django是一個(gè)完整的開源web開源框架,使用起來(lái)能夠快速的搭建你想要的網(wǎng)站。本設(shè)計(jì)中后臺(tái)管理模板采用amazeUI頁(yè)面的樣式實(shí)現(xiàn)。數(shù)據(jù)庫(kù)部分采用開源的mysql數(shù)據(jù)庫(kù),由于django操作數(shù)據(jù)庫(kù)很方便,所以我們只需要關(guān)心框架中的models類的設(shè)計(jì)即可,只需要關(guān)心視圖邏輯,后臺(tái)管理系統(tǒng)即可實(shí)現(xiàn)基本的增刪改查功能。
關(guān)鍵詞:Python;Vue;Django;ajax;Mysql;
1. 基礎(chǔ)環(huán)境的簡(jiǎn)介
1.1 Python介紹。
Python是一種跨平臺(tái)的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。是一種面向?qū)ο蟮膭?dòng)態(tài)類型語(yǔ)言,最初被設(shè)計(jì)用于編寫自動(dòng)化腳本(shell),隨著版本的不斷更新和語(yǔ)言新功能的添加,越來(lái)越多被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。
Python的設(shè)計(jì)哲學(xué)是“優(yōu)雅”、“明確”、“簡(jiǎn)單”。因此,Perl語(yǔ)言中“總是有多種方法來(lái)做同一件事”的理念在Python開發(fā)者中通常是難以忍受的。Python開發(fā)者的哲學(xué)是“用一種方法,最好是只有一種方法來(lái)做一件事”。在設(shè)計(jì)Python語(yǔ)言時(shí),如果面臨多種選擇,Python開發(fā)者一般會(huì)拒絕花俏的語(yǔ)法,而選擇明確的沒有或者很少有歧義的語(yǔ)法。由于這種設(shè)計(jì)觀念的差異,Python源代碼通常被認(rèn)為比Perl具備更好的可讀性,并且能夠支撐大規(guī)模的軟件開發(fā)。這些準(zhǔn)則被稱為Python格言。在Python解釋器內(nèi)運(yùn)行import this可以獲得完整的列表。Python是完全面向?qū)ο蟮恼Z(yǔ)言。函數(shù)、模塊、數(shù)字、字符串都是對(duì)象。并且完全支持繼承、重載、派生、多繼承,有益于增強(qiáng)源代碼的復(fù)用性。
1.2 Python 特點(diǎn)
1.易于學(xué)習(xí)
Python有相對(duì)較少的關(guān)鍵字,結(jié)構(gòu)簡(jiǎn)單,學(xué)習(xí)起來(lái)更加簡(jiǎn)單。
2.易于閱讀
Python代碼定義的更清晰。
3.易于維護(hù)
Python的成功在于它的源代碼是相當(dāng)容易維護(hù)的。
4.一個(gè)廣泛的標(biāo)準(zhǔn)庫(kù)
Python的最大的優(yōu)勢(shì)之一是豐富的庫(kù),跨平臺(tái)的,兼容很好。
5.互動(dòng)模式
您可以從終端輸入執(zhí)行代碼并獲得結(jié)果的語(yǔ)言,互動(dòng)的測(cè)試和調(diào)試代碼片斷。
6.可移植
基于其開放源代碼的特性,Python已經(jīng)被移植(也就是使其工作)到許多平臺(tái)。
7.可擴(kuò)展
如果你需要一段運(yùn)行很快的關(guān)鍵代碼,或者是想要編寫一些不愿開放的算法,你可以使用C或C++完成那部分程序,然后從你的Python程序中調(diào)用。
8.數(shù)據(jù)庫(kù)
Python提供所有主要的商業(yè)數(shù)據(jù)庫(kù)的接口。
9.GUI編程
Python支持GUI可以創(chuàng)建和移植到許多系統(tǒng)調(diào)用。
10.可嵌入
你可以將Python嵌入到C/C++程序,讓你的程序的用戶獲得"腳本化"的能力。
1.3 Django介紹
Django 是一個(gè)高級(jí)的 Python 網(wǎng)絡(luò)框架,可以快速開發(fā)安全和可維護(hù)的網(wǎng)站。由經(jīng)驗(yàn)豐富的開發(fā)者構(gòu)建,Django負(fù)責(zé)處理網(wǎng)站開發(fā)中麻煩的部分,因此你可以專注于編寫應(yīng)用程序,而無(wú)需重新開發(fā)。
它是免費(fèi)和開源的,有活躍繁榮的社區(qū),豐富的文檔,以及很多免費(fèi)和付費(fèi)的解決方案。
1.3.1 完備性
Django遵循“功能完備”的理念,提供開發(fā)人員可能想要“開箱即用”的幾乎所有功能。因?yàn)槟阈枰囊磺卸际且粋€(gè)”產(chǎn)品“的一部分,它們都可以無(wú)縫結(jié)合在一起,遵循一致性設(shè)計(jì)原則,并且具有廣泛和最新的文檔.
1.3.2 通用性
Django 可以(并已經(jīng))用于構(gòu)建幾乎任何類型的網(wǎng)站—從內(nèi)容管理系統(tǒng)和維基,到社交網(wǎng)絡(luò)和新聞網(wǎng)站。它可以與任何客戶端框架一起工作,并且可以提供幾乎任何格式(包括 HTML,Rss源,JSON,XML等)的內(nèi)容。你正在閱讀的網(wǎng)站就是基于Django。
在內(nèi)部,盡管它為幾乎所有可能需要的功能(例如幾個(gè)流行的數(shù)據(jù)庫(kù),模版引擎等)提供了選擇,但是如果需要,它也可以擴(kuò)展到使用其他組件。
1.3.3 安全性
Django 幫助開發(fā)人員通過(guò)提供一個(gè)被設(shè)計(jì)為“做正確的事情”來(lái)自動(dòng)保護(hù)網(wǎng)站的框架來(lái)避免許多常見的安全錯(cuò)誤。例如,Django提供了一種安全的方式來(lái)管理用戶賬戶和密碼,避免了常見的錯(cuò)誤,比如將session放在cookie中這種易受攻擊的做法(取而代之的是cookies只包含一個(gè)密鑰,實(shí)際數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中)或直接存儲(chǔ)密碼而不是密碼哈希。
1.3.4 可擴(kuò)展
Django 使用基于組件的 “無(wú)共享” 架構(gòu) (架構(gòu)的每一部分獨(dú)立于其他架構(gòu),因此可以根據(jù)需要進(jìn)行替換或更改). 在不用部分之間有明確的分隔意味著它可以通過(guò)在任何級(jí)別添加硬件來(lái)擴(kuò)展服務(wù):緩存服務(wù)器,數(shù)據(jù)庫(kù)服務(wù)器或應(yīng)用程序服務(wù)器。一些最繁忙的網(wǎng)站已經(jīng)成功地縮放了Django,以滿足他們的需求(例如Instagram和Disqus,僅舉兩個(gè)例子,可自行添加)。
1.3.5 可維護(hù)性
Django 代碼編寫是遵照設(shè)計(jì)原則和模式,鼓勵(lì)創(chuàng)建可維護(hù)和可重復(fù)使用的代碼。特別是它使用了不要重復(fù)自己(DRY)原則,所以沒有不必要的重復(fù),減少了代碼的數(shù)量。Django還將相關(guān)功能分組到可重用的“應(yīng)用程序”中,并且在較低級(jí)別將相關(guān)代碼分組或模塊( 模型視圖控制器 (MVC) 模式).
1.3.6 靈活性
Django 是用Python編寫的,它在許多平臺(tái)上運(yùn)行。這意味著你不受任務(wù)特定的服務(wù)器平臺(tái)的限制,并且可以在許多種類的Linux,Windows和Mac OsX 上運(yùn)行應(yīng)用程序。此外,Django得到許多網(wǎng)絡(luò)托管提供商的好評(píng),他們經(jīng)常提供特定的基礎(chǔ)設(shè)施和托管Django網(wǎng)站的文檔。
1.4 Mysql介紹
MySQL 是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典 MySQL AB 公司開發(fā),目前屬于 Oracle 公司。
MySQL 使用的 SQL 語(yǔ)言是用于訪問(wèn)數(shù)據(jù)庫(kù)的最常用的標(biāo)準(zhǔn)化語(yǔ)言。
由于 MySQL 數(shù)據(jù)庫(kù)體積小、速度快、總體擁有成本低、開放源代碼,其有著廣泛的應(yīng)用,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。由于其社區(qū)版的性能卓越,因此搭配 PHP 和 Apache 服務(wù)器可組成良好的開發(fā)環(huán)境。
2. 需求分析
建站包括前臺(tái)功能系統(tǒng)和后臺(tái)管理系統(tǒng)兩大系統(tǒng)組成,分別由不同能力的人 員實(shí)現(xiàn),而前臺(tái)功能系統(tǒng)是屬于 UI 設(shè)計(jì)類的,后臺(tái)管理系統(tǒng)是程序類的,因此 本設(shè)計(jì)選擇進(jìn)行后臺(tái)管理系統(tǒng)設(shè)計(jì)。 由于本設(shè)計(jì)是后臺(tái)管理系統(tǒng),主要功能是對(duì)前臺(tái)展示的頁(yè)面進(jìn)行增刪改查的操作。
本站主要的功能是作為信息的展示和宣傳,大體上分為4個(gè)頁(yè)面:首頁(yè),課程頁(yè),教學(xué)特色頁(yè)和學(xué)員風(fēng)采頁(yè)。主要功能如下圖所示:
圖2.1 XDH官網(wǎng)需求分析圖
2.1 首頁(yè)
首頁(yè)主要分為以下幾部分:
(1)輪播圖
(2)兄弟會(huì)介紹
(3)兄弟會(huì)與傳統(tǒng)就業(yè)班區(qū)別
(4)師資力量
(5)就業(yè)喜報(bào)
(6)學(xué)科介紹
2.2 課程介紹
(1)培訓(xùn)課程,具體學(xué)科介紹 (2)兄弟會(huì)具體學(xué)科及分級(jí)介紹 (3)兄弟會(huì)解決了什么問(wèn)題 (4)重點(diǎn)突出兄弟會(huì)課程體系與傳統(tǒng)培訓(xùn)體系的不同 (5)學(xué)習(xí)的苦VS生活的苦(不吃學(xué)習(xí)的苦就要吃生活的苦)2.3 教學(xué)特色
(1)辦學(xué)理念-具有真實(shí)交付能力的程序員 (2)項(xiàng)目驅(qū)動(dòng)式學(xué)習(xí)-每階段都有可鍛煉的項(xiàng)目 (3)企業(yè)級(jí)項(xiàng)目經(jīng)理指導(dǎo) (4)真實(shí)的企業(yè)級(jí)商業(yè)項(xiàng)目全程開發(fā) (5)學(xué)習(xí)經(jīng)驗(yàn)分享 (6)企業(yè)文化培訓(xùn)(培養(yǎng)身心健康的程序員)2.4 學(xué)員風(fēng)采
(1)學(xué)員采訪視頻 (2)學(xué)員感言 (3)個(gè)人博客 (4)團(tuán)建活動(dòng) (5)我們的作品3. Django模型model類的設(shè)計(jì)
模型設(shè)計(jì)是整個(gè)項(xiàng)目的核心部分,直接決定了項(xiàng)目后續(xù)的可行性,這里我們分為兩個(gè) app 來(lái)進(jìn)行設(shè)計(jì),分別為api和bgapi,一個(gè)作為前臺(tái)的接口,一個(gè)是進(jìn)行后臺(tái)管理的接口。
3.1 導(dǎo)入所需模塊
from django.db import models from django.utils import timezone3.2 所有輪播圖
class Banner(models.Model):img = models.TextField()page = models.CharField(max_length=20)link = models.CharField(max_length=100)is_del = models.IntegerField(default=0)join_date = models.DateTimeField(default=timezone.now)3.3 工作信息表
class JobInfo(models.Model):major = models.CharField(max_length=50,default="") # 專業(yè)major 主修,專業(yè) (專指大學(xué))school = models.CharField(max_length=50)name = models.CharField(max_length=20)title = models.CharField(max_length=50)img = models.CharField(max_length=200)salary = models.CharField(max_length=20)date = models.DateField()is_del = models.IntegerField(default=0)join_date = models.DateTimeField(default=timezone.now)3.4 學(xué)員感言
class StudentSay(models.Model):img = models.CharField(max_length=50) # 頭像圖片 avator是頭像的意思name = models.CharField(max_length=20)title = models.CharField(max_length=255)content = models.TextField()is_del = models.IntegerField(default=0)join_date = models.DateTimeField(default=timezone.now)3.5 技術(shù)社區(qū)內(nèi)容
class Community(models.Model):subject = models.CharField(max_length=50)type = models.CharField(max_length=50)content = models.TextField()link = models.TextField()is_del = models.IntegerField(default=0)3.6 辦學(xué)特色
class Feature(models.Model):img = models.CharField(max_length=250)title = models.CharField(max_length=250)type = models.CharField(max_length=250)content = models.TextField()is_del = models.IntegerField(default=0)join_date = models.DateTimeField(default=timezone.now)3.7 課程內(nèi)容
class Source(models.Model):text = models.CharField(max_length=150)link = models.CharField(max_length=250)is_del = models.IntegerField(default=0)join_date = models.DateTimeField(default=timezone.now)3.8 個(gè)人博客
class Blog(models.Model):name = models.CharField(max_length=20)link = models.CharField(max_length=100)img = models.CharField(max_length=255)title = models.CharField(max_length=255)description = models.TextField()is_del = models.IntegerField(default=0)join_date = models.DateTimeField(default=timezone.now)3.9 用于登錄token表
class Token(models.Model):token_data = models.CharField(max_length=250)token_key = models.CharField(max_length=250)change_time = models.DateTimeField('最后修改日期',auto_now=True)4. view視圖函數(shù)
視圖函數(shù)是本項(xiàng)目的核心,主要負(fù)責(zé)收到前端ajax的請(qǐng)求,進(jìn)行初步的處理,然后去數(shù)據(jù)庫(kù)中進(jìn)行增刪改查操作,并返回JSON格式的數(shù)據(jù)給請(qǐng)求方。具體的代碼可參考附錄II
5. 接口文檔
前后臺(tái)分離后,他們兩端之間的通訊是通過(guò)前臺(tái)調(diào)用后臺(tái)的接口實(shí)現(xiàn)的,所以一份清晰明了的接口文檔會(huì)增加項(xiàng)目開發(fā)的效率,本項(xiàng)目的接口文檔如附錄中所示,其中包含了接口名稱、 接口url、請(qǐng)求方法和請(qǐng)求參數(shù)。
6. 部署上線
6.1 域名
本項(xiàng)目上線前需要購(gòu)買一個(gè)域名,并進(jìn)行域名的解析,在域名解析前需要先進(jìn)行網(wǎng)站的備案,只有備案后才能將域名綁定在相應(yīng)的服務(wù)器上面
6.2 服務(wù)器
本項(xiàng)目的后臺(tái)采用的是阿里云服務(wù)器,使用寶塔工具連接遠(yuǎn)程服務(wù)器,對(duì)服務(wù)器和數(shù)據(jù)庫(kù)進(jìn)行管理,寶塔Linux面板是提升運(yùn)維效率的服務(wù)器管理軟件,支持一鍵LAMP/LNMP/集群/監(jiān)控/網(wǎng)站/FTP/數(shù)據(jù)庫(kù)/JAVA等100多項(xiàng)服務(wù)器管理功能。
有20個(gè)人的專業(yè)團(tuán)隊(duì)研發(fā)及維護(hù),經(jīng)過(guò)200多個(gè)版本的迭代,功能全,少出錯(cuò)且足夠安全,已獲得全球百萬(wàn)用戶認(rèn)可安裝。
6.3 數(shù)據(jù)庫(kù)
本項(xiàng)目的數(shù)據(jù)庫(kù)使用的是mysql5.7版本,由于mysql具有開源免費(fèi)等優(yōu)點(diǎn),加上寶塔工具的控制,進(jìn)行數(shù)據(jù)庫(kù)的部署也十分的方便。
7. 項(xiàng)目總結(jié)
本項(xiàng)目通過(guò)采用前后端分離的方式來(lái)進(jìn)行設(shè)計(jì),能夠分離減少各個(gè)項(xiàng)目部分之間的耦合性,一方面有利于將項(xiàng)目不同的部分分配給擅長(zhǎng)不同領(lǐng)域的開發(fā)人員進(jìn)行開發(fā),另一方面,可以增加后期項(xiàng)目的可維護(hù)性。
整個(gè)項(xiàng)目用時(shí)一周,雖然其中有很多的漏洞,但是在做完整個(gè)項(xiàng)目后還是收獲了很多的,這能夠?yàn)橐院蟮膶W(xué)習(xí)和工作增添一些經(jīng)歷和項(xiàng)目經(jīng)驗(yàn)吧。
參考文獻(xiàn)
[1] Django項(xiàng)目實(shí)例精解(第2版)作者:[美]安東尼奧米勒 清華大學(xué)出版社
[2] Python Web開發(fā)實(shí)戰(zhàn) 作者:董偉明著 出版社:電子工業(yè)出版社
[3] MySQL 5.7從入門到精通(視頻教學(xué)版)(第2版)張工廠 清華大學(xué)出版社
[4] Python Django Web典型模塊開發(fā)實(shí)戰(zhàn) 作者:寇雪松 出版社:機(jī)械工業(yè)出版社
附錄
附錄I 接口文檔
后臺(tái) 接口名稱 接口url 請(qǐng)求方法 請(qǐng)求參數(shù) 登錄 用于管理員登錄 /bgapi/login/ post請(qǐng)求 username獲取驗(yàn)證碼 /bgapi/verification/ 博客 列表 /bgapi/blog/list/ get請(qǐng)求 博客 社區(qū)資源 添加 /bgapi/blog/add/ post請(qǐng)求 name=file修改 /bgapi/blog/edit/ post請(qǐng)求 name=file刪除 /bgapi/blog/del/ get請(qǐng)求 ?id=1列表 /bgapi/community/list/ get請(qǐng)求 社區(qū)資源 輪播圖 添加 /bgapi/community/add/ post請(qǐng)求 subject,修改 /bgapi/community/edit/ post請(qǐng)求 id,subject,刪除 /bgapi/community/delete/ get請(qǐng)求 id列表 /bgapi/banner/list/ get請(qǐng)求 啥也不用 輪播圖 學(xué)生視頻 添加 /bgapi/banner/add/ post請(qǐng)求 name=file修改 /bgapi/banner/edit/ post請(qǐng)求 name=file刪除 /bgapi/banner/del/ get請(qǐng)求 id列表 /bgapi/assessvideo/list/ get請(qǐng)求 學(xué)生視頻 辦學(xué)特色 添加 /bgapi/assessvideo/add/ post請(qǐng)求 video,img修改 /bgapi/assessvideo/edit/ post請(qǐng)求 video,img刪除 /bgapi/assessvideo/delete/ get請(qǐng)求 id列表 /bgapi/feature/list/ get請(qǐng)求 辦學(xué)特色 首頁(yè)信息 添加 /bgapi/feature/add/ post請(qǐng)求 name=file修改 /bgapi/feature/edit/ post請(qǐng)求 name=file刪除 /bgapi/feature/delete/ get請(qǐng)求 id列表 /bgapi/mainpuretext/list/ get請(qǐng)求 首頁(yè)信息 首頁(yè)學(xué)科 添加 /bgapi/mainpuretext/add/ post請(qǐng)求 title,content修改 /bgapi/mainpuretext/edit/ post請(qǐng)求 id,title,content刪除 /bgapi/mainpuretext/delete/ get請(qǐng)求 id列表 /bgapi/mainsubject/list/ get請(qǐng)求 首頁(yè)學(xué)科 階段管理 添加 /bgapi/mainsubject/add/ post請(qǐng)求 name=file修改 /bgapi/mainsubject/edit/ post請(qǐng)求 name=file刪除 /bgapi/mainsubject/delete/ get請(qǐng)求 id列表 /bgapi/stage/list/ get請(qǐng)求 階段管理 學(xué)員感言 添加 /bgapi/stage/add/ post請(qǐng)求 name=file修改 /bgapi/stage/edit/ post請(qǐng)求 name=file刪除 /bgapi/stage/delete/ get請(qǐng)求 id列表 /bgapi/studentsay/list/ get請(qǐng)求 學(xué)員感言 學(xué)員作品 添加 /bgapi/studentsay/add/ post請(qǐng)求 name=file修改 /bgapi/studentsay/edit/ post請(qǐng)求 name=file刪除 /bgapi/studentsay/delete/ get請(qǐng)求 id列表 /bgapi/studentworks/list/ get請(qǐng)求 學(xué)員作品 工作信息 添加 /bgapi/studentworks/add/ post請(qǐng)求 name=file修改 /bgapi/studentworks/edit/ post請(qǐng)求 name=file刪除 /bgapi/studentworks/delete/ get請(qǐng)求 id列表 /bgapi/jobinfo/list/ get請(qǐng)求 工作信息 教師信息 添加 /bgapi/jobinfo/add/ post請(qǐng)求 name=file修改 /bgapi/jobinfo/edit/ post請(qǐng)求 name=file刪除 /bgapi/jobinfo/delete/ get請(qǐng)求 id列表 /bgapi/teacher/list/ get請(qǐng)求 教師信息 課程詳情 添加 /bgapi/teacher/add/ post請(qǐng)求 name=file修改 /bgapi/teacher/edit/ post請(qǐng)求 name=file刪除 /bgapi/teacher/delete/ get請(qǐng)求 id列表 /bgapi/coursedetail/list/ get請(qǐng)求 課程詳情 活動(dòng)管理 添加 /bgapi/coursedetail/add/ post請(qǐng)求 name=file修改 /bgapi/coursedetail/edit/ post請(qǐng)求 name=file刪除 /bgapi/coursedetail/delete/ get請(qǐng)求 id列表 /bgapi/activity/list/ get請(qǐng)求 活動(dòng)管理 添加 /bgapi/activity/add/ post請(qǐng)求 name=file修改 /bgapi/activity/edit/ post請(qǐng)求 name=file刪除 /bgapi/activity/delete/ get請(qǐng)求 id附錄II:視圖函數(shù)程序代碼
課程管理視圖函數(shù)
from django.forms import model_to_dict from django.shortcuts import render from django.http import JsonResponse,HttpResponsefrom api.models import CourseDetail,Token from django.conf import settingsfrom .utils import add_data,edit_data,delete_data,list_data,check_token,check_md5def list(request):if check_token(request):passelse:u_dict = {"status": "509","info": "請(qǐng)先登錄!",}return JsonResponse(u_dict)'''列表顯示視圖函數(shù):param request:請(qǐng)求參數(shù):return:返回json格式數(shù)據(jù)'''# # 驗(yàn)證是否登錄# if check_token(request):# # 如果成了# pass# else:# u_dict = {# "status": "509",# "info": "請(qǐng)先登錄!",# }# return JsonResponse(u_dict)# 驗(yàn)證完了u_dict = list_data(CourseDetail)response = JsonResponse(u_dict)return responsedef add(request):# 驗(yàn)證是否登錄if check_md5(request):# 如果成了passelse:u_dict = {"status": "509","info": "請(qǐng)先登錄!",}return JsonResponse(u_dict)# 驗(yàn)證完了'''添加視圖函數(shù):param request:請(qǐng)求參數(shù):return:返回json格式數(shù)據(jù)'''u_dict = add_data(request,CourseDetail)return JsonResponse(u_dict)def edit(request):# 驗(yàn)證是否登錄if check_md5(request):# 如果成了passelse:u_dict = {"status": "509","info": "請(qǐng)先登錄!",}return JsonResponse(u_dict)# 驗(yàn)證完了'''編輯視圖函數(shù):param request:請(qǐng)求參數(shù):return:返回json格式數(shù)據(jù)'''u_dict = edit_data(request,CourseDetail)return JsonResponse(u_dict)def delete(request):# 驗(yàn)證是否登錄if check_token(request):# 如果成了passelse:u_dict = {"status": "509","info": "請(qǐng)先登錄!",}return JsonResponse(u_dict)# 驗(yàn)證完了'''刪除視圖函數(shù):param request:請(qǐng)求參數(shù):return:返回json格式數(shù)據(jù)'''u_dict = delete_data(request,CourseDetail)return JsonResponse(u_dict) 封裝工具類 保存文件 def save_file(file):'''用于保存文件,返回保存文件的路徑:param file::return:'''if file:# 上傳了頭像import hashlib# 待加密信息(隨機(jī)數(shù))ran_str = str(random.randint(0, 9999999))# 創(chuàng)建md5對(duì)象hl = hashlib.md5()to_md5_str = str(time()) + ran_str# Tips# 此處必須聲明encode# 若寫法為hl.update(str) 報(bào)錯(cuò)為: Unicode-objects must be encoded before hashinghl.update(to_md5_str.encode(encoding='utf-8'))# 加密完的md5字符串md5_str = hl.hexdigest()# 文件擴(kuò)展名file_extend_name = file.name.split('.').pop()# 拼接文件名filename = md5_str + '.' + file_extend_namewith open(f'./media/' + filename, 'wb+') as f:f.write(file.read())# with open(f'./media/uploads/' + filename, 'wb+') as fp:# fp.write(file.read())return filenameelse:return ""刪除文件 def del_file(path):'''用于刪除文件,返回刪沒刪成功:param path::return:'''import osmy_file = settings.BASE_DIR + settings.MEDIA_URL + pathprint(my_file)if os.path.exists(my_file):# 刪除文件,可使用以下兩種方法。os.remove(my_file)return Trueelse:return False成功返回?cái)?shù)據(jù) def success_response(u_dict):'''正確返回?cái)?shù)據(jù) 過(guò)濾器:param u_dict: 返回的數(shù)據(jù)主體內(nèi)容:return: 嵌套后的數(shù)據(jù)'''u_dict = {"status": "200","info": "返回信息成功!","data": u_dict}return u_dict返回錯(cuò)誤信息 def error_response(u_dict, err_info):'''返回錯(cuò)誤json:param u_dict: json返回的主要內(nèi)容:param err_info: 錯(cuò)誤提示信息:return:'''u_dict = {"status": "500","info": err_info,"data": u_dict}return u_dict查詢數(shù)據(jù) def list_data(a_model_object):'''用于列表返回所有數(shù)據(jù)庫(kù)數(shù)據(jù):param a_model_object: 一個(gè)模型對(duì)象:return: 返回json數(shù)據(jù)格式的字典dict類型數(shù)據(jù)'''print("--------------------------開始列表視圖函數(shù)---------------------------")u_dict = {}try:u_dict = all_data(a_model_object)# 嵌套一層u_dict = success_response(u_dict)except:u_dict = error_response(u_dict, "服務(wù)器錯(cuò)誤,查詢異常!")return u_dict 添加數(shù)據(jù) def add_data(request, a_model_object):'''封裝的添加方法:param request: http的請(qǐng)求request參數(shù):param a_model_object: 一個(gè)模型對(duì)象:return: 返回json之前的字典類型的數(shù)據(jù)'''print("--------------------------開始添加視圖函數(shù)---------------------------")# 定義返回?cái)?shù)據(jù)u_dict = {}# 判斷請(qǐng)求方式if (request.method == 'POST'):# try:# 開始處理圖片# 1.獲取表單內(nèi)容data = request.POST.dict()print(data)# 要是有l(wèi)ink,那就判斷一下是不是真的linkif "link" in data.keys():curr_link = data["link"]if check_link(curr_link):# 要是鏈接,啥也不干passelse:# 要是不行,那直接就給踢回去u_dict = {"info": "鏈接類型不正確,請(qǐng)檢查格式!","status": "506"}return u_dict# 先刪除tokendata.pop("token")# 2. 獲取表單中的文件file = request.FILES.get('file', None)print("file", file)# 3. 執(zhí)行保存文件,并返回文件路徑# save_file ---> 自定義函數(shù)path = save_file(file)# TODO 這里判斷文件類型try:kind = filetype.guess(settings.BASE_DIR+settings.MEDIA_URL+path)print("猜出來(lái)的類型是:",kind)print("猜出來(lái)的類型extension是:",kind.extension)print("猜出來(lái)的類型mime是:",kind.mime)# TODO: write code.....# # 判斷真的文件類型if kind.extension == "png" or kind.extension == "jpg":# 要是符合類型的,啥也不干passelse:# 要不是這倆類型# 直接我就返回,錯(cuò)誤信息u_dict = {"info": "圖片類型不正確,請(qǐng)上傳png或者jpg格式!","status": "505"}return u_dictexcept:u_dict = {"info": "圖片類型不正確,請(qǐng)上傳png或者jpg格式!","status": "505"}return u_dictif not path:data.pop("file")# 構(gòu)建img字段數(shù)據(jù)data["img"] = path# data.pop("file")# 保存數(shù)據(jù)a_model_object(**data).save()# 返回?cái)?shù)據(jù)內(nèi)容u_dict = {"info": "ok","status": "200"}# except:# u_dict = {# "info": "error",# "status": "500"# }if (request.method == 'GET'):u_dict = {"info": "缺心眼啊,用瀏覽器訪問(wèn)!","status": "666"}return u_dict 修改數(shù)據(jù) def edit_data(request, a_model_object):'''用于編輯的封裝函數(shù):param request: 一個(gè)請(qǐng)求的參數(shù):param a_model_object: 一個(gè)模型類對(duì)象:return: 返回提示信息的json格式字典dict'''print("--------------------------開始編輯視圖函數(shù)---------------------------")u_dict = {}print("request.POST:", request.POST)print("request.FILES:", request.FILES)if (request.method == 'POST'):# 獲取修改的iddata = request.POST.dict()print(data)# 先刪除tokendata.pop("token")# 要是有l(wèi)ink,那就判斷一下是不是真的linkif "link" in data.keys():curr_link = data["link"]if check_link(curr_link):# 要是鏈接,啥也不干passelse:# 要是不行,那直接就給踢回去u_dict = {"info": "鏈接類型不正確,請(qǐng)檢查格式!","status": "506"}return u_dict# print(data.__dict__)id = data["id"]# 獲取原來(lái)的對(duì)象obj = a_model_object.objects.get(id=id)dict = model_to_dict(obj)old_path = dict['img']# 2. 獲取表單中的文件new_file = request.FILES.get('file', None)# 判斷有沒有新文件print("new_file:", new_file)# 要是有新文件的話if new_file:# print(new_file)# print(type(new_file))# print("走的有文件")# 刪除舊文件del_file(old_path)# 保存新文件path = save_file(new_file)print("new_path:", path)# 構(gòu)建img字段數(shù)據(jù)data["img"] = pathelse:# print("走的沒文件")# print(new_file)# print(type(new_file))# 沒有新文件data["img"] = old_pathdata.pop("file")obj = a_model_object.objects.filter(id=id)obj.update(**data)# else:# u_dict = {# "info": "刪除文件失敗!",# "status": "501"# }# return JsonResponse(u_dict)# 成功狀態(tài)碼u_dict = {"info": "ok","status": "200"}if (request.method == 'GET'):# 請(qǐng)求方式不對(duì)狀態(tài)碼u_dict = {"info": "no","status": "666"}return u_dict 刪除數(shù)據(jù) def delete_data(request, a_model_object):'''用于刪除封裝的方法:param request: 一個(gè)請(qǐng)求參數(shù):param a_model_object: 一個(gè)模型對(duì)象:return: 返回json類型的字典數(shù)據(jù)'''u_dict = {"info": "default","status": "888"}print("--------------------------開始刪除視圖函數(shù)---------------------------")try:# 嘗試刪除id = request.GET.get("id")obj = a_model_object.objects.get(id=id)# 刪除源文件# 獲取文件路徑dict = model_to_dict(obj)# 刪除庫(kù)obj.delete()# 原始路徑old_path = dict['img']print("old_path:", old_path)# 執(zhí)行刪除del_file(old_path)u_dict = {"info": "ok","status": "200"}except:u_dict = {"info": "error","status": "500"}return u_dict總結(jié)
以上是生活随笔為你收集整理的基于django和vue的xdh官网设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 百度云 自然语言处理(Nlp)
- 下一篇: Vue相关知识总结