深圳大学数据库实验四 基于Django框架实现

2024-01-25 23:50

本文主要是介绍深圳大学数据库实验四 基于Django框架实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

更好的阅读体验

Using mysql and php to implement the Leasing Luxury Database system

具体文档

界面效果请添加图片描述

模板源自Appseed 的 Datta Able Django

GitHub地址:https://github.com/Misaka-9982-coder/Django_db_crud
如果喜欢这个项目的话,欢迎为我的GitHub仓库点个star,你的支持是对我最大的鼓励~

如何运行

setting.py中修改默认数据库

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': '数据库名称','USER': '用户名','PASSWORD': '密码','HOST': 'localhost','PORT': '3306',}
}

在命令行中输入以下命令

# 安装 mysql 驱动
sudo pip3 install pymysql
# 安装 simpleui
sudo pip3 install django-simpleui

加载lab4.sql文件中的存储过程触发器导入数据库

配置Django环境

$ pip install virtualenv
$
$ # Virtualenv modules installation (Unix based systems)
$ virtualenv env
$ source env/bin/activate
$
$ # Virtualenv modules installation (Windows based systems)
$ # virtualenv env
$ # .\env\Scripts\activate
$
$ pip3 install -r requirements.txt
$
$ # Create tables
$ python manage.py makemigrations
$ python manage.py migrate
$
$ # Start the application (development mode)
$ python manage.py runserver # default port 8000
$
$ # Start the app - custom port 
$ # python manage.py runserver 0.0.0.0:<your_port>
$
$ # Access the web app in browser: http://127.0.0.1:8000/
数据表设计

designer ( id, name, price)

bag ( id, designer_id, type, color, already_rented )

customer ( id, phone#, address, name, email, card#, gender)

lease ( id, bag_id, customer_id, start_date, back_date, insure_or_not )

ER图 如下:

在这里插入图片描述

Navicat 模型图如下:

需求及功能 :
1. 通过设计师名字 检索出该设计师设计过多少包
2. 查询每个客户每个客户所有手袋的租赁时间。
3. 编写一个程序来计算和列出每个顾客的消费金额。放映这个包租出去的天数
4. 添加出租信息的表和包表,租用日期是当前时间
5. 包被退回的时候,显示出租的总时长和总金额,包可以再次被出租
6. 为所有异常设计并显示适当的消息
存储过程设计
 --返回所有表的表名
show_all_tables()				--传入表名,返回指定表的数据	   
show_table(tableName) 			--传入表名,返回指定表的表头字段
show_columns_from_table(tableName)--获取所有客户id
get_customers_id()	--获取所有设计师名字		  
get_designers_name()				 --传入设计师名字,获取指定设计师设计的背包
bag_by_designer(designer)			--按照客户租赁所有包包的总天数排序显示客户
best_customers()					    --传入用户id,根据用户id计算用户每个租赁交易应支付金额
report_customer_amount(customer_id)	--传入用户id,根据用户id计算用户所有租赁交易应支付总额
report_customer_totalCost(customer_id)--传入用户id,包包id,是否支付保险,租用天数,添加一笔租赁交易
add_rentals(customerId, bagId, optionalInsurance, daysOfRent)--传入包包类型,颜色,设计者,添加一个可以租赁的包包    
add_bag(bagType, bagColor, bagDesigner)--传入设计师的名字, 每个包包的价格, 添加一个设计师   
add_designer(dname, price)		--传入客户姓氏,名字, 地址,电话号码,邮箱地址,信用卡号码,性别
add_customer(lname,fname, addr, pnum ,email, cnum, gender).....
详见 lab4.sql 文件
触发器设计
returnBag 	
-- 退回包包的时候,该包包的状态应该恢复可以租借
-- 在触发器中设置 totalDays 记录总租借日期 , bill 记录总的账单金额
-- 退回包包的时候 通过调用select @totalDays, @bill 来获取这两个值
功能设计
1. 通过设计师名字 检索出该设计师设计过多少包

在数据库中设置好存储过程

/*存储过程创建显示每个设计师设计了多少包传入参数  designer  为该设计师名字
*/
delimiter //
create procedure bag_by_designer(in designer varchar(30))
beginselect btype as 'Name', color as 'Color', d.name as 'Manufacturer' from bag as bleft join designer as don b.did = d.didwhere d.name = designer;
end //
delimiter;

urls.py 文件中设置好路由

path('bag_views', views.bag_views, name="bags_views"),

views.py文件中定义好 bag_views 函数

def bag_views(request):# 记录信息, 返回前端msg = Nonesuccess = Trueif request.method == "GET":# 获取设计师 姓名name = request.GET.get('designer_name')cur = connection.cursor()# 获取所有设计师姓名cur.callproc('get_designers_name')data = cur.fetchall()# 将所有设计师姓名存进元组names = []for da in data:names.append(da[0])if name is not None:# 该姓名存在if name in names:success = Trueelse:success = Falseif success:# 执行存储过程,获取该设计师所有的包包cur2 = connection.cursor()cur2.callproc('bag_by_designer', (name,))objss = cur2.fetchall()msg = name + "'s bags are all here"else:msg = "Designer " + name + " doesn't exits"return render(request, 'home/bag_views.html', locals())

创建如下前端页面:

在这里插入图片描述

输入设计师 Coach 的名字,得如下结果:
在这里插入图片描述

异常测试:

在这里插入图片描述

输入客户 id 查询每个客户每个客户所有手袋的租赁时间。

在数据库中设置好存储过程

/*存储过程创建 按照所有交易总租赁奢侈包总天数排序 显示客户
*/
delimiter //
create procedure best_customers()
begin select last_name as 'Last Name',first_name as 'First Name',address as 'Address',phone as 'Telephone',ifnull(sum(datediff( date_returned, date_rented)), 0) as 'Total Length of Rentals' from customer as c left join rentals as r on c.cid = r.cid group by c.cid order by `Total Length of Rentals` desc;
end //
delimiter;

urls.py 文件中设置好路由

path('best_customer', views.best_customer, name="best_customer"),

views.py文件中定义好 best_customer 函数

def best_customer(request):# 调用存储过程,返回前端cur = connection.cursor()cur.callproc("best_customers")datas = cur.fetchall()return render(request, 'home/best_customer.html', locals())

创建如下前端页面

在这里插入图片描述

编写一个程序来计算和列出每个顾客的消费金额。放映这个包租出去的天数

在数据库中设置好存储过程

/*存储过程按照用户 id 计算 用户每个租赁交易应支付 账单金额 从大到小排序传入参数为用户 id
*/
delimiter //
create procedure report_customer_amount(in customer_id int(32))
beginselect c.last_name as 'Last Name',c.first_name as 'First Name',d.name as 'Manufacturer',b.btype as 'Name',datediff( r.date_returned, r.date_rented) as 'totalDays',(d.price + r.optional_insurance) * datediff( r.date_returned, r.date_rented) as 'Cost'from rentals as r left join customer as c on r.cid = c.cid left join bag as b on r.bid = b.bid left join designer as d on d.did = b.did where r.cid = customer_idorder by Cost desc;end //
delimiter;-- call report_customer_amount(17);/*存储过程按照用户 id 计算 用户所有租赁交易应支付 账单金额 传入参数为用户 id
*/
delimiter //
create procedure report_customer_totalCost(in customer_id int(32))
beginselect c.last_name as 'Last Name',c.first_name as 'First Name',sum((d.price + r.optional_insurance) * datediff( r.date_returned, r.date_rented)) as totalCostfrom rentals as r left join customer as c on r.cid = c.cid left join bag as b on r.bid = b.bid left join designer as d on d.did = b.did where r.cid = customer_id;
end //
delimiter;

urls.py 文件中设置好路由

path('customers_amount', views.customers_amount, name="customers_amount"),

views.py文件中定义好 customers_amount 函数

@login_required(login_url="/login/")
def customers_amount(request):msg = Nonesuccess = Trueif request.method == "GET":# 获取前端输入的用户 idcustomer_id = request.GET.get('customer_id')if customer_id is not None: # 输入的 id 为 str 类, 应该强制类型转换id = int(customer_id)# 执行存储过程, 获取所有的 用户 idcur = connection.cursor()cur.callproc('get_customers_id')data = cur.fetchall()cur.close()# 将所有用户 id 存进元组ids = []for da in data:ids.append(da[0])if id is not None:if id in ids:# 这个用户 id 存在success = Trueelse:success = Falseif success:cur2 = connection.cursor()cur3 = connection.cursor()# 获取该用户所有租赁信息cur2.callproc('report_customer_amount', (id,))# 获取该用户所有租赁账单总金额cur3.callproc('report_customer_totalCost', (id,))amounts = cur2.fetchall()totalCosts = cur3.fetchall()cur2.close()cur3.close()cost = totalCosts[0][2]msg = "The customer whose id is " + customer_id + "'s bill"else:msg = "The customer whose id is " + customer_id + " doesn't exits"return render(request, 'home/customers_amount.html', locals())

创建如下前端页面:

在这里插入图片描述

输入客户id,得如下结果
在这里插入图片描述

异常情况测试

在这里插入图片描述

添加包

存储过程

/*存储过程新建一个奢侈品背包传入参数为  包的类型, 包的颜色, 包的设计者
*/
delimiter //
create procedure add_bag(bagType varchar(30), bagColor varchar(10), bagDesigner varchar(30))
begininsert into bag( btype, color, did) values ( bagType, bagColor, (select did from designerwhere name = bagDesigner));
end //
delimiter;

urls.py 文件中设置好路由

path('add_bag', views.add_bag, name="add_bag"),

views.py文件中定义好 add_bag 函数

@login_required(login_url="/login/")
def add_bag(request):msg = Noneflag = Truesuccess = Trueif request.method == "POST":# 获取前端输入的包包 信息bname = request.POST.get('bag_name')bcolor = request.POST.get('bag_color')dname = request.POST.get('designer_name')bprice = request.POST.get('price_per_day')try:# 将价格转为 浮点数dprice = float(bprice)except:msg = "please enter a current number"success = Falseif success:# 获取所有设计师名字cur = connection.cursor()cur.callproc('get_designers_name')data = cur.fetchall()cur.close()d_names = []for i in data:d_names.append(i[0])cur = connection.cursor()if dname in d_names:# 该设计师 存在cur.callproc('get_designer_price', (dname,),)data = cur.fetchall()price = data[0][0]# 价格不公道if dprice != price:msg = "The price is not equal to this designer's price"flag = Falseelse:# 设计师不存在, 添加一个设计师cur.callproc('add_designer', (dname, dprice),)cur.close()if flag:# 添加包包cur = connection.cursor()cur.callproc("add_bag", (bname, bcolor, dname))cur.close()msg = 'Success - please <a href="/">return</a>.'return render(request, 'home/add_bag.html', locals())

创建如下前端页面

在这里插入图片描述

添加包包
在这里插入图片描述

添加成功

在这里插入图片描述

在包包表格中可以看到如下信息

在这里插入图片描述

添加出租信息的表,租用日期是当前时间

包被退回的时候,显示出租的总时长和总金额,包可以再次被出租

存储过程

/*存储过程创建租赁交易记录传入参数为用户 id, 奢侈品 id, 是否支付保险, 租赁天数
*/
delimiter //
create  procedure add_rentals(customerId int(32), bagId int(32), optionalInsurance tinyint(1), daysOfRent int(10))
begininsert into rentals(cid, bid, date_rented, date_returned, optional_insurance) values (customerId, bagId, curdate(), curdate() + daysOfRent, optionalInsurance);update bag set already_rented = 1 where bid = bagId;
end //
delimiter;

urls.py 文件中设置好路由

path('rent_bag', views.rent_bag, name="rent_bag"),
path('mybag', views.mybag, name="mybag"),

views.py文件中定义好 rent_bagmybag 函数

@login_required(login_url="/login/")
def rent_bag(request):msg = Nonesuccess = Trueflag = True# bag 属性名data = Bag._meta.fieldscolumns = [data[i].name for i in range(len(data))]# 获取所有包objs = Bag.objects.all()# 当前 user iduid = request.user.id# 获取 uid 对应的 customer 表信息customer = Customer.objects.filter(uid = uid).first()if customer is None: # 当前用户 没有补充个人信息flag = Falsemsg = 'Please improve your personal information - <a href="/customer_register"> Profile </a>'success = Falseif flag:# 获取 cid cid = customer.cidif request.method == "POST":# 获取前端返回的 信息bagid = request.POST.get("bag_id")days = request.POST.get("days")insurance = request.POST.get("insurance")cur = connection.cursor()try:# 添加租赁信息 cur.callproc('add_rentals', (cid, bagid, insurance, days),)msg = "Rent bag: " + bagid + " Success"except:# 存储过程执行可能会遇到些问题,为解决msg = "Please enter how many days you want to rent"success = Falsereturn render(request, 'home/rent_bag.html', locals())@login_required(login_url="/login/")
def mybag(request):msg = Nonesuccess = True# 获取 已经租出去的 包包bags = Bag.objects.filter(already_rented = 1)bids = []for bag in bags:bids.append(bag.bid)# uid uid = request.user.id# 当前 user 的 customer 信息customer = Customer.objects.filter(uid = uid).first()cid = customer.cidif customer is None:# 当前用户未补充个人信息msg = 'Please improve your personal information - <a href="/customer_register"> Profile </a>'return render(request, 'home/page-404.html', locals())else:# 获取 被租出的包的信息rentals = Rentals.objects.filter(bid__in=bids)# 按照 归还日期从大到小排序rents = list(rentals.filter(cid = cid).order_by("-date_returned"))ids = []bids = []# 对租赁账单信息去重, 只保留归还日期最新的for rent in rents:if rent.bid.bid not in bids:bids.append(rent.bid.bid)ids.append(rent.bid)if request.method == "POST":# 获取要归还的包包的 bidbid = request.POST.get("bag_id")    # 获取对应账单的信息rids = list(rentals.filter(cid = cid, bid = bid).order_by("-date_returned"))rid = rids[0].ridcur = connection.cursor()# ids 元组中存在的 归还的 bid 删去for id in ids:print(id)if id.bid == int(bid):ids.remove(id)cur.callproc("turnBack", (rid,),)# 获取触发器返回的信息            data = cur.fetchall()cur.close()days = data[0][0]bill = data[0][1]msg = datamsg = "The bag id : " + str(bid) + ", total days you rent it : " + str(days) + ", the bill you should pay : $" + str(bill)return render(request, 'home/mybag.html', locals())

触发器

/*触发器创建会话变量 totalDays,billtotalDays   记录总的租赁天数bill        记录租赁期间应付账单金额update      语句更新包的租赁状态退回包包后可以通过执行 select 语句获取会话变量的值
*/
delimiter //
create trigger returnBag after update on rentals for each row 
begin declare pricePerday double(10,2);set @totalDays = 0;set @bill = 0.00;if new.date_returned then select price into pricePerday from bag as b, designer dwhere b.bid = new.bidand b.did = d.did;select datediff(new.date_returned, new.date_rented) into @totalDays;select (pricePerday + new.optional_insurance) * @totalDays into @bill;end if;update bag set already_rented = false where bid = new.bid;
end //
delimiter;

租包

在这里插入图片描述

成功

租赁账单信息

在这里插入图片描述

个人已租包包信息

在这里插入图片描述

退回,且退回成功
在这里插入图片描述

其余功能模块不再赘述~

这篇关于深圳大学数据库实验四 基于Django框架实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/645022

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P