1. 系統(tǒng)簡介
該實(shí)驗(yàn)設(shè)計(jì)開發(fā)一個(gè)簡單的圖書管理數(shù)據(jù)庫系統(tǒng),包括圖書館內(nèi)書籍的信息、學(xué)校在校師生的信息以及師生的借閱信息。此系統(tǒng)用戶面向圖書管理員和借閱讀者,圖書館管理員可以完成圖書、讀者等基本信息的增加、刪除和修改、查看;讀者可以進(jìn)行圖書的借閱、查看、預(yù)約等操作。構(gòu)建基于B/S架構(gòu),MySQL數(shù)據(jù)庫為基礎(chǔ),應(yīng)用Django框架建設(shè)過程和方法。本系統(tǒng)主要包含以下基本功能,主要是前臺展示和后臺管理兩部分,其中前臺展示包括登陸模塊、首頁展示、書籍檢索、分類查看等。
系統(tǒng)開發(fā)技術(shù)及工具:Python? Django ?HTML? MySQL數(shù)據(jù)庫 Windows11系統(tǒng) ?PyCharm
- 2.系統(tǒng)分析
- 2.1 功能簡介:
?
2.2 功能需求描述
借閱功能:
圖書出借時(shí)考慮的問題:
讀者是否因?yàn)槌?、罰款等情況被關(guān)閉了借閱權(quán)限;
讀者是否已經(jīng)借滿其限額。
該書是否不在庫中;
如果不存在以上情況,則可以出借。
預(yù)約功能:
讀者想借的書如果不在庫中(已經(jīng)被出借),讀者可以預(yù)約該圖書
讀者管理功能:
對讀者信息進(jìn)行查看、添加、修改、刪除。將讀者分為不同類別,賦以不同權(quán)限。
系統(tǒng)管理功能:
對管理員的登錄賬號、密碼進(jìn)行添加、修改、刪除。
違規(guī)管理功能:
對違規(guī)信息進(jìn)行查看、添加、修改、刪除。
3系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)
3.1系統(tǒng)概念模型設(shè)計(jì)
數(shù)據(jù)庫需要描述的數(shù)據(jù)信息包括以下幾種:
(1)讀者信息
(2)書籍信息
(3)管理員信息
(4)讀者與書籍之間的關(guān)系(借閱關(guān)系E-R圖)
3.2數(shù)據(jù)庫的詳細(xì)設(shè)計(jì)
3.2.1數(shù)據(jù)表的詳細(xì)設(shè)計(jì)
圖書管理系統(tǒng)由三個(gè)實(shí)體:圖書實(shí)體,讀者實(shí)體,管理員實(shí)體,圖書種類實(shí)體組成,共六個(gè)表如下:
1、書籍表
屬性:圖書編號,ISBN,書名,作者,出版社,出版日期,價(jià)格,學(xué)科類型,藏書類型,總量,余量
主鍵:圖書編號
2、讀者表
屬性:讀者編號,讀者姓名,聯(lián)系電話,郵箱地址,所在系,權(quán)限狀況
主鍵:讀者編號
3、管理員用戶表
屬性:編號,賬號,密碼,姓名
4、借閱表
屬性:圖書編號,讀者編號,借閱日期,應(yīng)還日期
5、預(yù)約信息
屬性:編號,圖書編號,讀者編號,預(yù)約日期
6、違規(guī)表
屬性:編號,讀者編號,圖書編號,逾期(0/1),破壞書籍(0/1)
3.2.2 E-R圖
1、圖書實(shí)體E-R圖
圖書具有圖書編號,ISBN,書名,作者,出版社,出版日期,價(jià)格,總量,余量等九個(gè)屬性,便于讀者在使用圖書館管理系統(tǒng)時(shí),更加準(zhǔn)確的定位到所選圖書的位置,了解圖書的信息。也可以方便讀者利用碎片化的信息,從大量的圖書中篩選自己可能心儀圖書。
?
2、圖書館管理員實(shí)體E-R圖
圖書管理員實(shí)體具有編號,賬號,密碼,姓名,聯(lián)系方式
3、讀者實(shí)體E-R圖
讀者具有讀者編號,讀者姓名,聯(lián)系電話,郵箱地址,備注,便于圖書管理員及時(shí)的維護(hù)管理借閱系統(tǒng),明確每一本圖書的去向,對與圖書館圖書的情況有一個(gè)把握。維護(hù)圖書管理系統(tǒng)的正常運(yùn)行。
4、總體E-R圖
在圖書管理系統(tǒng)中,一名讀者可以借閱多本圖書,多名圖書管理員同時(shí)管理多本圖書,一名讀書管理員可以同時(shí)管理多名讀者。通過實(shí)體之間的相互聯(lián)系,構(gòu)成了圖書管理系統(tǒng)的總體E-R圖。
3.3表設(shè)計(jì)
1、讀者表(reader)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
編號 |
|
reader_id |
int |
11 |
學(xué)號 |
|
password |
char |
20 |
密碼 |
|
name |
char |
10 |
讀者姓名 |
|
telephone |
char |
15 |
聯(lián)系電話 |
|
|
char |
30 |
郵箱地址 |
|
dept |
char |
20 |
所在院系 |
|
right |
int |
1 |
借閱權(quán)限(0或1) |
2、圖書表(book)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
編號 |
|
bookname |
char |
20 |
書籍名稱 |
|
author |
char |
20 |
書籍作者 |
|
pubdate |
date |
出版日期 |
||
publish |
char |
30 |
出版社 |
|
price |
decimal |
7,2 |
非空 |
價(jià)格 |
ISBN |
char |
17 |
非空 |
書籍ISBN碼 |
bookclass |
int |
11 |
外鍵 |
學(xué)科類型 |
total |
int |
非空 |
總量 |
|
margin |
int |
非空 |
余量 |
|
booktype |
int |
11 |
外鍵 |
藏書類型 |
- 管理員用戶表(admin)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
Int |
主鍵 |
|
|
usernum |
Char |
20 |
|
|
password |
Char |
11 |
|
|
username |
char |
10 |
管理員姓名 |
4.借閱表(borrow)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
借閱編號 |
|
readerid |
int |
讀者編號 |
||
bookid |
int |
圖書編號 |
||
borrowdate |
date |
出借日期 |
||
due |
date |
應(yīng)還日期 |
5.預(yù)約表(preconcert)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
預(yù)約編號 |
|
readerid |
int |
讀者編號 |
||
bookid |
int |
圖書編號 |
||
predate |
date |
預(yù)約日期 |
6.違規(guī)表(break_rule)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
違規(guī)編號 |
|
reader_id |
int |
讀者編號 |
||
book_id |
int |
圖書編號 |
||
verdue |
int |
逾期(0或1) |
||
destory |
int |
破壞書籍(0或1) |
3配置環(huán)境
3.1安裝和配置環(huán)境
3.3表設(shè)計(jì)
1、讀者表(reader)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
編號 |
|
reader_id |
int |
11 |
學(xué)號 |
|
password |
char |
20 |
密碼 |
|
name |
char |
10 |
讀者姓名 |
|
telephone |
char |
15 |
聯(lián)系電話 |
|
|
char |
30 |
郵箱地址 |
|
dept |
char |
20 |
所在院系 |
|
right |
int |
1 |
借閱權(quán)限(0或1) |
2、圖書表(book)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
編號 |
|
bookname |
char |
20 |
書籍名稱 |
|
author |
char |
20 |
書籍作者 |
|
pubdate |
date |
出版日期 |
||
publish |
char |
30 |
出版社 |
|
price |
decimal |
7,2 |
非空 |
價(jià)格 |
ISBN |
char |
17 |
非空 |
書籍ISBN碼 |
bookclass |
int |
11 |
外鍵 |
學(xué)科類型 |
total |
int |
非空 |
總量 |
|
margin |
int |
非空 |
余量 |
|
booktype |
int |
11 |
外鍵 |
藏書類型 |
- 管理員用戶表(admin)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
Int |
主鍵 |
|
|
usernum |
Char |
20 |
|
|
password |
Char |
11 |
|
|
username |
char |
10 |
管理員姓名 |
4.借閱表(borrow)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
借閱編號 |
|
readerid |
int |
讀者編號 |
||
bookid |
int |
圖書編號 |
||
borrowdate |
date |
出借日期 |
||
due |
date |
應(yīng)還日期 |
5.預(yù)約表(preconcert)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
預(yù)約編號 |
|
readerid |
int |
讀者編號 |
||
bookid |
int |
圖書編號 |
||
predate |
date |
預(yù)約日期 |
6.違規(guī)表(break_rule)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
違規(guī)編號 |
|
reader_id |
int |
讀者編號 |
||
book_id |
int |
圖書編號 |
||
verdue |
int |
逾期(0或1) |
||
destory |
int |
破壞書籍(0或1) |
3配置環(huán)境
3.1安裝和配置環(huán)境
3.3表設(shè)計(jì)
1、讀者表(reader)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
編號 |
|
reader_id |
int |
11 |
學(xué)號 |
|
password |
char |
20 |
密碼 |
|
name |
char |
10 |
讀者姓名 |
|
telephone |
char |
15 |
聯(lián)系電話 |
|
|
char |
30 |
郵箱地址 |
|
dept |
char |
20 |
所在院系 |
|
right |
int |
1 |
借閱權(quán)限(0或1) |
2、圖書表(book)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
編號 |
|
bookname |
char |
20 |
書籍名稱 |
|
author |
char |
20 |
書籍作者 |
|
pubdate |
date |
出版日期 |
||
publish |
char |
30 |
出版社 |
|
price |
decimal |
7,2 |
非空 |
價(jià)格 |
ISBN |
char |
17 |
非空 |
書籍ISBN碼 |
bookclass |
int |
11 |
外鍵 |
學(xué)科類型 |
total |
int |
非空 |
總量 |
|
margin |
int |
非空 |
余量 |
|
booktype |
int |
11 |
外鍵 |
藏書類型 |
- 管理員用戶表(admin)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
Int |
主鍵 |
|
|
usernum |
Char |
20 |
|
|
password |
Char |
11 |
|
|
username |
char |
10 |
管理員姓名 |
4.借閱表(borrow)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
借閱編號 |
|
readerid |
int |
讀者編號 |
||
bookid |
int |
圖書編號 |
||
borrowdate |
date |
出借日期 |
||
due |
date |
應(yīng)還日期 |
5.預(yù)約表(preconcert)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
預(yù)約編號 |
|
readerid |
int |
讀者編號 |
||
bookid |
int |
圖書編號 |
||
predate |
date |
預(yù)約日期 |
6.違規(guī)表(break_rule)
列名 |
類型 |
長度 |
約束 |
備注 |
id |
int |
主鍵 |
違規(guī)編號 |
|
reader_id |
int |
讀者編號 |
||
book_id |
int |
圖書編號 |
||
verdue |
int |
逾期(0或1) |
||
destory |
int |
破壞書籍(0或1) |
3配置環(huán)境
3.1安裝和配置環(huán)境
選擇Pycharm工具進(jìn)行本次項(xiàng)目的制作
- 創(chuàng)建django項(xiàng)目
?
目錄說明:
manage.py:一個(gè)命令行工具,可以說Django項(xiàng)目就是從這個(gè)文件開始執(zhí)行的。
_init _.py:一個(gè)空文件,表示mytest應(yīng)該被看做一個(gè)python包;
settings.py:整個(gè)項(xiàng)目的配置參數(shù)文件;
urls.py:項(xiàng)目的URL聲明,一般項(xiàng)目的頂級url正則匹配放置在這里;
wsgi.py:項(xiàng)目與WSGI兼容的Web服務(wù)器入口;
2.創(chuàng)建應(yīng)用
(1)項(xiàng)目創(chuàng)建完成后需要有具體的應(yīng)用
?
(2)創(chuàng)建后生成目錄:
admin.py: 模型注冊和后臺管理相關(guān)的文件;
_init_.py: 應(yīng)用應(yīng)該被看做一個(gè)Python包;
migrations: 用來放置應(yīng)用模型的遷移腳本文件;
models.py: 定義模型;
test.py: 放置項(xiàng)目的測試文件;
viems.py: 定義視圖;
?
(3)添加應(yīng)用
打開settings.py,INSTALLED_APPS下添加:'app01'
3.2配置數(shù)據(jù)庫
在settings.py下:
DATABASES = {
??? 'default': {
??????? 'ENGINE': 'django.db.backends.mysql',
??????? 'NAME': 'BookSystem',
??????? 'USER':'root',
??????? 'PASSWORD':'root',
??????? 'HOST':'localhost',
??????? 'POST':3306,
??? }
}
另外django連接mysql需要pymysql包的支持,所以先安裝pymysql:
在終端:pip install pymysql
安裝完畢,需要導(dǎo)入到django中,打開應(yīng)用_init_.py文件,加入代碼:
import pymysql
pymysql.install_as_MySQLdb()? # 與mysql交互的函數(shù)
3.3配置模板和靜態(tài)文件
?
?
?4.相關(guān)代碼展示
4.1. urls層
#讀者
path("reader/search/", views.reader_search),
path("reader/classify/", views.reader_classify2),
path("reader/<int:nbookclass>/classify/", views.reader_classify),
path("reader/order/", views.reader_order),
path("reader/borrow/",views.reader_borrow),
path("reader/first/", views.reader_first),
path("reader/rule/", views.reader_rule),
path("popular/book/", views.popular_book),
#管理員
#圖書管理
path("book/list/",views.book_list),
path("book/add/",views.book_add),
path("book/<int:nid>/edit/",views.book_edit),
path("book/<int:nid>/delete/", views.book_delete),
#用戶管理
path("user/list/", views.user_list),
path("user/add/",views.user_add),
path("user/<int:nid>/edit/",views.user_edit),
path("user/<int:nid>/delete/", views.user_delete),
#管理管理員
path("admin/list/", views.admin_list),
path("admin/add/",views.admin_add),
path("admin/<int:nid>/edit/",views.admin_edit),
path("admin/<int:nid>/delete/", views.admin_delete),
#違規(guī)
path("rule/list/", views.rule_list),
path("rule/add/",views.rule_add),
path("rule/<int:nid>/edit/",views.rule_edit),
path("rule/<int:nid>/delete/", views.rule_delete),
#登錄
path("login/",views.login),
path("log/", views.log)
4.2.models層文章來源:http://www.zghlxwxcb.cn/news/detail-754204.html
class reader(models.Model):
""""讀者表"""
reader_id=models.IntegerField(verbose_name="學(xué)號")
password=models.CharField(verbose_name="密碼",max_length=20)
name=models.CharField(verbose_name="讀者姓名",max_length=10)
telephone=models.CharField(verbose_name="聯(lián)系電話",max_length=15)
email=models.CharField(verbose_name="郵箱地址",max_length=30)
dept=models.CharField(verbose_name="所在院系",max_length=20)
right=models.IntegerField(verbose_name="借閱權(quán)限(0或1)")
class book(models.Model):
""""圖書表"""
bookname=models.CharField(verbose_name="書籍名稱",max_length=20)
author=models.CharField(verbose_name="書籍作者",max_length=20)
pubdate=models.DateField(verbose_name="出版日期")
publish=models.CharField(verbose_name="出版社",max_length=30)
price = models.DecimalField(verbose_name="價(jià)格", max_digits=7, decimal_places=2, default=0)
ISBN=models.CharField(verbose_name="書籍ISBN碼",max_length=17)
bookclass_choices=(
(1,"哲學(xué)、宗教"),
(2,"社會科學(xué)總論"),
(3,"政治、法律"),
(4,"軍事"),
(5,"經(jīng)濟(jì)"),
)
bookclass=models.IntegerField(verbose_name="學(xué)科類型",choices=bookclass_choices)
total=models.IntegerField(verbose_name="總量")
margin=models.IntegerField(verbose_name="余量")
booktype_choices=(
(1,"圖書"),
(2,"期刊")
)
booktype=models.IntegerField(verbose_name="藏書類型",choices=booktype_choices)
class admin(models.Model):
""""管理員用戶表"""
usernum=models.CharField(verbose_name="管理員賬號",max_length=20)
password=models.CharField(verbose_name="賬號密碼",max_length=11)
username=models.CharField(verbose_name="管理員姓名",max_length=10)
class borrow(models.Model):
""""借閱表"""
readerid=models.IntegerField(verbose_name="讀者編號")
bookid=models.IntegerField(verbose_name="圖書編號")
borrowdate=models.DateField(verbose_name="出借日期")
due=models.DateField(verbose_name="應(yīng)還日期")
class preconcert(models.Model):
""""預(yù)約表"""
readerid = models.IntegerField(verbose_name="讀者編號")
bookid = models.IntegerField(verbose_name="圖書編號")
predate = models.DateField(verbose_name="預(yù)約日期")
class break_rule(models.Model):
""""違規(guī)表"""
readerid=models.IntegerField(verbose_name="讀者編號")
bookid=models.IntegerField(verbose_name="圖書編號")
overdue_choices = (
(0, "無"),
(1, "逾期")
)
overdue=models.IntegerField(verbose_name="逾期(0/1)",choices=overdue_choices)
destory_choices = (
(0, "無"),
(1, "損壞")
)
destory=models.IntegerField(verbose_name="破壞書籍(0/1)",choices=destory_choices)
4.3.views層文章來源地址http://www.zghlxwxcb.cn/news/detail-754204.html
# ###############################管理員###################################
#管理圖書
def book_list(request):
b = models.book.objects.all()
return render(request, 'book_list.html', {'b': b})
class BookAdd(forms.ModelForm):
class Meta:
model=models.book
fields=["bookname","author","pubdate","publish","ISBN","price","bookclass","total","margin","booktype"]
# widgets={
# "bookname":forms.TextInput(attrs={"class":"form-control"})
# }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循環(huán)找到所有的插件,添加class=“form——control”
for name, field in self.fields.items():
# if name=="password":
# continue
field.widget.attrs = {"class": "form-control"}
def book_add(request):
if request.method == "GET":
bookadd = BookAdd()
return render(request, 'book_add.html', {'bookadd': bookadd})
#用戶POST提交數(shù)據(jù),數(shù)據(jù)校驗(yàn)
bookadd=BookAdd(data=request.POST)
if bookadd.is_valid():
#如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
bookadd.save()
return redirect('/book/list/')
#校驗(yàn)失敗
return render(request, 'book_add.html', {'bookadd': bookadd})
def book_edit(request,nid):
""""編輯書籍"""
row_object = models.book.objects.filter(id=nid).first()
if request.method == "GET":
# 根據(jù)id去數(shù)據(jù)庫獲取要編輯的那一行數(shù)據(jù)
bookadd = BookAdd(instance=row_object)
return render(request, "book_edit.html", {'bookadd': bookadd})
bookadd=BookAdd(data=request.POST,instance=row_object)
if bookadd.is_valid():
# 如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
bookadd.save()
return redirect('/book/list/')
return render(request, "book_edit.html", {'bookadd': bookadd})
def book_delete(request,nid):
""""刪除圖書"""
models.book.objects.filter(id=nid).delete()
return redirect('/book/list/')
#管理用戶
def user_list(request):
b = models.reader.objects.all()
return render(request, 'user_list.html', {'b': b})
class User(forms.ModelForm):
class Meta:
model=models.reader
fields=["reader_id","password","name","telephone","email","dept","right"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循環(huán)找到所有的插件,添加class=“form——control”
for name, field in self.fields.items():
# if name=="password":
# continue
field.widget.attrs = {"class": "form-control"}
def user_add(request):
if request.method == "GET":
user=User()
return render(request, 'user_add.html', {'user': user})
#用戶POST提交數(shù)據(jù),數(shù)據(jù)校驗(yàn)
user=User(data=request.POST)
if user.is_valid():
#如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
user.save()
return redirect('/user/list/')
#校驗(yàn)失敗
return render(request, 'user_add.html', {'user': user})
def user_edit(request,nid):
""""編輯用戶"""
row_object = models.reader.objects.filter(id=nid).first()
if request.method == "GET":
# 根據(jù)id去數(shù)據(jù)庫獲取要編輯的那一行數(shù)據(jù)
user = User(instance=row_object)
return render(request, "user_edit.html", {'user': user})
user=User(data=request.POST,instance=row_object)
if user.is_valid():
# 如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
user.save()
return redirect('/user/list/')
return render(request, "user_edit.html", {'user': user})
def user_delete(request,nid):
""""刪除用戶"""
models.reader.objects.filter(id=nid).delete()
return redirect('/user/list/')
#管理管理員
def admin_list(request):
b = models.admin.objects.all()
return render(request, 'admin_list.html', {'b': b})
class Admin(forms.ModelForm):
class Meta:
model=models.admin
fields=["usernum","password","username"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循環(huán)找到所有的插件,添加class=“form——control”
for name, field in self.fields.items():
# if name=="password":
# continue
field.widget.attrs = {"class": "form-control"}
def admin_add(request):
if request.method == "GET":
admin=Admin()
return render(request, 'admin_add.html', {'admin': admin})
#用戶POST提交數(shù)據(jù),數(shù)據(jù)校驗(yàn)
admin=Admin(data=request.POST)
if admin.is_valid():
#如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
admin.save()
return redirect('/admin/list/')
#校驗(yàn)失敗
return render(request, 'admin_add.html', {'admin': admin})
def admin_edit(request,nid):
""""編輯管理員"""
row_object = models.admin.objects.filter(id=nid).first()
if request.method == "GET":
# 根據(jù)id去數(shù)據(jù)庫獲取要編輯的那一行數(shù)據(jù)
admin =Admin(instance=row_object)
return render(request, "admin_edit.html", {'admin': admin})
admin=Admin(data=request.POST,instance=row_object)
if admin.is_valid():
# 如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
admin.save()
return redirect('/admin/list/')
return render(request, "admin_edit.html", {'admin': admin})
def admin_delete(request,nid):
""""刪除管理員"""
models.admin.objects.filter(id=nid).delete()
return redirect('/admin/list/')
#違規(guī)
def rule_list(request):
b = models.break_rule.objects.all()
return render(request, 'rule_list.html', {'b': b})
class Rule(forms.ModelForm):
class Meta:
model=models.break_rule
fields=["readerid","bookid","overdue","destory"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循環(huán)找到所有的插件,添加class=“form——control”
for name, field in self.fields.items():
# if name=="password":
# continue
field.widget.attrs = {"class": "form-control"}
def rule_add(request):
if request.method == "GET":
rule=Rule()
return render(request, 'rule_add.html', {'rule': rule})
#用戶POST提交數(shù)據(jù),數(shù)據(jù)校驗(yàn)
rule=Rule(data=request.POST)
if rule.is_valid():
#如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
rule.save()
return redirect('/rule/list/')
#校驗(yàn)失敗
return render(request, 'rule_add.html', {'rule': rule})
def rule_edit(request,nid):
""""編輯管理員"""
row_object = models.break_rule.objects.filter(id=nid).first()
if request.method == "GET":
# 根據(jù)id去數(shù)據(jù)庫獲取要編輯的那一行數(shù)據(jù)
rule=Rule(instance=row_object)
return render(request, "rule_edit.html", {'rule': rule})
rule=Rule(data=request.POST,instance=row_object)
if rule.is_valid():
# 如果數(shù)據(jù)合法,保存到數(shù)據(jù)庫
rule.save()
return redirect('/rule/list/')
return render(request, "rule_edit.html", {'rule': rule})
def rule_delete(request,nid):
""""刪除管理員"""
models.break_rule.objects.filter(id=nid).delete()
return redirect('/rule/list/')
# ###############################登錄#############################################
""""用戶登錄"""
class LoginForm(forms.Form):
reader_id=forms.CharField(
label="學(xué)號",
widget=forms.TextInput,
required=True
)
password=forms.CharField(
label="密碼",
widget=forms.PasswordInput,
required=True
)
def clean_password(self):
password = self.cleaned_data.get("password")
return md5(password)
def login(request):
if request.method=="GET":
form = LoginForm()
return render(request, 'login.html', {'form': form})
form=LoginForm(data=request.POST)
if form.is_valid():
#去數(shù)據(jù)庫校驗(yàn)用戶名和密碼是否正確,獲取用戶對象
admin_object=models.reader.objects.filter(reader_id=request.POST.get('reader_id'),password=request.POST.get('password')).first()
if not admin_object:
form.add_error("password","用戶名或密碼錯(cuò)誤!")
return render(request,'login.html',{'form':form})
#網(wǎng)站生成隨機(jī)字符串
request.session["info"]={'reader_id':admin_object.reader_id,'password':admin_object.password}
return redirect('/reader/first/')
return render(request,'login.html',{'form':form})
"""""管理員登錄"""
class LogForm(forms.Form):
usernum=forms.CharField(
label="管理員賬號",
widget=forms.TextInput,
required=True
)
password=forms.CharField(
label="密碼",
widget=forms.PasswordInput,
required=True
)
def clean_password(self):
password = self.cleaned_data.get("password")
return md5(password)
def log(request):
if request.method=="GET":
form = LogForm()
return render(request, 'log.html', {'form': form})
form=LogForm(data=request.POST)
if form.is_valid():
#去數(shù)據(jù)庫校驗(yàn)用戶名和密碼是否正確,獲取用戶對象
admin_object=models.admin.objects.filter(usernum=request.POST.get('usernum'),password=request.POST.get('password')).first()
if not admin_object:
form.add_error("password","用戶名或密碼錯(cuò)誤!")
return render(request,'log.html',{'form':form})
#網(wǎng)站生成隨機(jī)字符串
request.session["info"]={'usernum':admin_object.usernum,'password':admin_object.password}
return redirect('/book/list/')
return render(request,'log.html',{'form':form})
到了這里,關(guān)于圖書管理系統(tǒng)(python、django)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!