学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上

news2024/11/25 14:46:14

目录

查看电影类型的电影列表

添加电影

修改电影

上机练习 13 使用三层架构完善 web 系统


查看电影类型的电影列表

DAL.py 文件
class MovieDAL(DBHelper):
def getMovieByTid(self,typeid):
sql=f"""select id,title,release_date,score,tname
from MovieType inner join Movie on MovieType.tid =Movie.typeid
where typeid={typeid}"""
return self.cha(sql)
app.py 文件
from DAL import MovieTypeDAL,MovieDAL
mtdal=MovieTypeDAL()
mdal=MovieDAL()
@app.route("/movieList/<typeid>")
def movieList(typeid):
result=mdal.select(typeid)
return render_template("movieList.html",info=result)

添加电影

#app.py
@app.route("/addMovie")
def addMovie():
result=mtdb.select()
return render_template("addMovie.html",info=result)
#addMovie.html
<select name="typeid">
{% for i in info %}
<option value="{{i[0]}}">{{i[1]}}</option>
{% endfor %}
</select>

修改电影

修改电影下拉框参考代码: app.py
@app.route("/updateMovie/<id>")
def updateMovie(id):
result=mdb.getMovieByID(id)
resultType=mtdb.select()
return
render_template("updateMovie.html",info=result,info1=resultTyp
e,tid=int(result[4]))
修改电影下拉框参考代码: updateMovie.html
<p> 电影类型:
<select name="typeid">
{% for i in info1 %}
{% if i[0]==tid %} <option value="{{i[0]}}" selected="selected">{{i[1]}}</option>
{% else %}
<option value="{{i[0]}}">{{i[1]}}</option>
{% endif %}
{% endfor %}
</select>
</p>

上机练习 13 使用三层架构完善 web 系统

查看不同电影类型的电影列表
实现电影的添加
实现电影的修改删除功能,注意刷新页面的处理
电影类型列表页添加模糊搜索电影功能,搜索后跳转到电影列表页
(新增 searchMovie.html)
App.py:( 业务逻辑 )
from flask import Flask,render_template,request
from DAL import MovieTypeDAL,DouBanMovieDAL
from Model import MovieType,DoubanMovieType
app=Flask(__name__)
mtdal=MovieTypeDAL()
mdal=DouBanMovieDAL()
tid_old=0
# 主页列表(全部)
@app.route("/")
def list():result=mdal.select()
# print(result)
return render_template("DouBanMovies.html",info=result)
# 根据电影种类筛选电影
@app.route("/DouBanMoviesSelect", methods=["POST"])
def DouBanMoviesSelect():
keyword=request.form.get("MovieType")
if keyword=="全部":
result=mdal.select()
else:
result=mdal.getMovieByType(keyword)
return render_template("DouBanMovies.html",info=result)
# 根据电影名关键字搜索电影
@app.route("/DouBanMoviesSearch", methods=["POST"])
def DouBanMoviesSearch():
keyword=request.form.get("titlekeywords")
result=mdal.getMovieBytitle(keyword)
return render_template("DouBanMovies.html",info=result)
# 进入添加电影页面
@app.route("/addDouBanMovie")
def add():
return render_template("addDouBanMovie.html")
# 添加提交
@app.route("/DouBanMovieaddSubmit", methods=["POST"])
def addSubmit():
id=request.form.get("id")
title=request.form.get("title")
release_date=request.form.get("release_date")
score=request.form.get("score")
types=request.form.get("types")
mt=DoubanMovieType(id,title,release_date,score,types)
result=mdal.insert(mt)
if result>0:
return "添加成功 <a href='/'>刷新</a>"
else:
return "添加失败 <a href='/'>刷新</a>"
# 删除
@app.route("/deleteDouBanMovie/<id>")
def delete(id):
result=mdal.delete(id)
if result>0:
return "删除成功 <a href='/'>刷新</a>"
else:return "删除失败 <a href='/'>刷新</a>"
# 修改
@app.route("/updateDouBanMovie/<id>")
def update(id):
result=mdal.selectByid(id)
return
render_template("updateDouBanMovies.html",info=result)
# 修改提交
@app.route("/updateDouBanMovieSubmit", methods=["POST"])
def updateSubmit():
# 修改数据
old_id=request.form.get("old_id")
id=request.form.get("id")
title=request.form.get("title")
release_date=request.form.get("release_date")
score=request.form.get("score")
types=request.form.get("types")
result=mdal.update(old_id,"id",id)
result1=mdal.update(old_id,"title",title)
result2=mdal.update(old_id,"release_date",release_date)
result3=mdal.update(old_id,"score",score)
result4=mdal.update(old_id,"types",types)
if result or result4 or result1 or result2 or result3:
return "修改成功 <a href='/'>刷新</a>"
else:
return "修改失败 <a href='/'>刷新</a>"
if __name__=="__main__":
app.run(host="127.0.0.1",port=5000,debug=True)

DAL.py:数据访问

import datetime
import pymysql
class DBHelper:
# 方法
# 数据库链接
def openDB(self):
global conn
conn=pymysql.connect(host="127.0.0.1",user="root",
password="root123456",database="test",charset="utf8")
global baoma
baoma=conn.cursor()# 关闭数据库
def closeDB(self):
baoma.close()
conn.close()
# 数据增删改
def edit(self,sql):
self.openDB()
result=baoma.execute(sql)
conn.commit()
self.closeDB()
return result
# 查询多条
def chaAll(self,sql):
self.openDB()
baoma.execute(sql)
result=baoma.fetchall()
self.closeDB()
return result
# 查询一条
def chaOne(self,sql):
self.openDB()
baoma.execute(sql)
result=baoma.fetchone()
self.closeDB()
return result
class MovieTypeDAL(DBHelper):
# 插入数据
def insert(self,mt):
sql=f"insert into MovieType(tname,tcontent,tdate)
values('{mt.tname}','{mt.tcontent}',now())"
return self.edit(sql)
# 查询数据
def select(self):
sql="select * from MovieType"
return self.chaAll(sql)
# 根据 id 号修改数据
def update(self,tid,UpdateColumn,EndValue):
if type(EndValue)==str:
sql=f"update MovieType set
{UpdateColumn}='{EndValue}' where tid={tid}"
elif type(EndValue)==int :sql=f"update MovieType set {UpdateColumn}={EndValue}
where tid={tid}"
elif type(EndValue)==datetime.datetime:
sql=f"update MovieType set
{UpdateColumn}='{EndValue}' where tid={tid}"
return self.edit(sql)
# 通过 id 号查询数据
def selectByTid(self,tid):
sql=f"select * from MovieType where tid={tid}"
return self.chaOne(sql)
# 通过 id 号删除数据
def delete(self,tid):
sql=f"delete from MovieType where tid={tid}"
return self.edit(sql)
class DouBanMovieDAL(DBHelper):
# 插入数据
def insert(self,dm):
sql=f"insert into
DoubanMovieType(id,title,release_date,score,types)
values('{dm.id}','{dm.title}','{dm.release_date}','{dm.score}',
'{dm.types}')"
return self.edit(sql)
# 查询数据
def select(self):
sql="select * from DoubanMovieType"
return self.chaAll(sql)
# 根据 id 号修改数据
def update(self,id,UpdateColumn,EndValue):
if type(EndValue)==str:
sql=f"update DoubanMovieType set
{UpdateColumn}='{EndValue}' where id={id}"
else :
sql=f"update DoubanMovieType set
{UpdateColumn}={EndValue} where id={id}"
return self.edit(sql)
# 通过 id 号查询数据
def selectByid(self,id):
sql=f"select * from DoubanMovieType where id={id}"
return self.chaOne(sql)
# 通过 id 号删除数据
def delete(self,id):
sql=f"delete from DoubanMovieType where id={id}"return self.edit(sql)
# 根据类型查询电影
def getMovieByType(self,type):
sql=f"""select id,title,release_date,score,types
from DoubanMovieType
where types like '%{type}%'"""
return self.chaAll(sql)
# 根据电影名称查询电影
def getMovieBytitle(self,titlekeywords):
sql=f"""select id,title,release_date,score,types
from DoubanMovieType
where title like '%{titlekeywords}%'"""
return self.chaAll(sql)
model 模型层:
import datetime
class MovieType:
tname=""
tcontent=""
tdate=datetime.datetime.now()
def __init__(self,tname1,tcontent1):
self.tname=tname1
self.tcontent=tcontent1
class DoubanMovieType:
id=""
title=""
release_date=""
score=""
types=""
def __init__(self,id1,title1,release_date1,score1,types1):
self.id=id1
self.title=title1
self.release_date=release_date1
self.score=score1
self.types=types1
addDouBanMovie.html:( 添加电影界面 )
<html>
<head>
<title>添加电影</title>
</head>
<body><h1>欢迎使用豆瓣网</h1>
<a href="/">首页</a>
<a href="">电影类型列表</a>
<a href="">添加电影类型</a>
<a href="/addDouBanMovie">添加电影</a>
<a href="">查看柱状图</a>
<a href="">查看饼状图</a>
<p></p>
<form method="post" action="/DouBanMovieaddSubmit">
<p>电影编号:<input type="text" name="id" /></p>
<p>电影名称:<input type="text" name="title" /></p>
<p>上映时间:<input type="date" name="release_date"
/></p>
<p>评分:<input type="number" name="score" /></p>
<p>电影种类:<input type="text" name="types" /></p>
<!-- 添加按键 -->
<input type="submit" value="添加">
</form>
</body>
<style>
body{ margin: 0 auto; width: 800px;
background-image:url('/static/html 封面图.png');
background-repeat:no-repeat;
background-size: cover;
}
h1{ color: #258dcd}
a{
background-color: #258dcd;
color: white;
padding: 5px 8px;
text-decoration: none;
border-radius: 5px;
/*半透明*/
/*background-color:rgba(55,55,55,0.5)*/
}
</style>
</html>
DouBanMovies.html:( 主页,总表页 )
<html>
<head>
<title>豆瓣网首页</title><meta charset="utf-8"/>
</head>
<body>
<h1>欢迎使用豆瓣网</h1>
<a href="/">首页</a>
<a href="">电影类型列表</a>
<a href="">添加电影类型</a>
<a href="/addDouBanMovie">添加电影</a>
<a href="">查看柱状图</a>
<a href="">查看饼状图</a>
<h1>输入你喜欢的电影进行搜索吧!</h1>
<form method="post" action="/DouBanMoviesSelect">
选择电影种类:
<input type="text" name="MovieType" placeholder="请
输入电影种类">
<input type="submit" value="提交">
</form>
<p></p>
<form method="post" action="/DouBanMoviesSearch">
输入电影名称关键字:
<input type="text" name="titlekeywords" placeholder="
请输入电影名称">
<input type="submit" value="提交">
</form>
<p></p>
<table>
<tr><td>电影编号</td><td>电影名称</td><td>上映时间
</td><td>评分</td><td>电影种类</td></tr>
{% for i in info %}
<tr><td>{{ i[0] }}</td><td>{{ i[1] }}</td><td>{{ i[2]
}}</td><td>{{ i[3] }}</td><td>{{ i[4] }}</td>
<td><a href="/updateDouBanMovie/{{ i[0] }}">修改</a>
<a href="/deleteDouBanMovie/{{ i[0] }}">删除</a></td></tr>
{% endfor %}
</table>
</body>
<style>
body{ margin: 0 auto; width: 800px;
background-image:url('/static/html 封面图.png');
background-repeat:no-repeat;
background-size: cover;
background-position: center;
}h1{ color: #258dcd}
a{
background-color: #258dcd;
color: white;
padding: 1px 12px;
text-decoration: 12px;
border-radius: 12px;
/*半透明*/
/*background-color:rgba(55,55,55,0.5)*/
}
table,tr,td{ border: 2px solid black; border-collapse:
collapse;}
table{ width: 100% ;}
td{ text-align: center; padding: 20px;}
.tou{
background-color: #258dcd;
color: white;
font-size: 18px;
font-weight: bold;
}
</style>
</html>
DouBanMoviesSelect.html:( 模糊筛选页 )
<html>
<head>
<title>筛选结果</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>欢迎使用豆瓣网</h1>
<a href="/">首页</a>
<a href="">电影类型列表</a>
<a href="">添加电影类型</a>
<a href="/addDouBanMovie">添加电影</a>
<a href="">查看柱状图</a>
<a href="">查看饼状图</a>
<form method="post" action="/DouBanMoviesSelect">
<select name="MovieType">
<option type="text" value="全部">全部</option>
<option type="text" value="喜剧">喜剧</option>
<option type="text" value="动作">动作</option>
<option type="text" value="动画">动画</option></select>
<input type="submit" value="提交">
</form>
<form method="post" action="/DouBanMoviesSearch">
<input type="text" name="titlekeywords" placeholder="
请输入电影名称">
<input type="submit" value="提交">
</form>
<p></p>
<table>
<tr><td>电影编号</td><td>电影名称</td><td>上映时间
</td><td>评分</td><td>电影种类</td></tr>
{% for i in info %}
<tr><td>{{ i[0] }}</td><td>{{ i[1] }}</td><td>{{ i[2]
}}</td><td>{{ i[3] }}</td><td>{{ i[4] }}</td>
<td><a href="/updateDouBanMovie/{{ i[0] }}">修改</a>
<a href="/deleteDouBanMovie/{{ i[0] }}">删除</a></td></tr>
{% endfor %}
</table>
</body>
<style>
body{ margin: 0 auto; width: 800px;
background-image:url('/static/html 封面图.png');
background-repeat:no-repeat;
background-size: cover;
background-position: center;
}
h1{ color: #258dcd}
a{
background-color: #258dcd;
color: white;
padding: 1px 12px;
text-decoration: 12px;
border-radius: 12px;
/*半透明*/
/*background-color:rgba(55,55,55,0.5)*/
}
table,tr,td{ border: 2px solid black; border-collapse:
collapse;}
table{ width: 100% ;}
td{ text-align: center; padding: 20px;}
.tou{
background-color: #258dcd;color: white;
font-size: 18px;
font-weight: bold;
}
</style>
</html>
updateDouBanMovies.html:( 修改电影信息页 )
<html>
<head>
<title>修改电影信息</title>
</head>
<body>
<h1>欢迎使用豆瓣网</h1>
<a href="/">首页</a>
<a href="">电影类型列表</a>
<a href="">添加电影类型</a>
<a href="/addDouBanMovie">添加电影</a>
<a href="">查看柱状图</a>
<a href="">查看饼状图</a>
<p></p>
<form method="post" action="/updateDouBanMovieSubmit">
<p>电影编号:<input type="text" name="id"
value="{{ info[0] }}"><input type="hidden" name="old_id"
value="{{ info[0] }}" readonly="readonly"/></p>
<p>电影名称:<input type="text" name="title"
value="{{ info[1] }}"/></p>
<p>上映时间:<input type="date" name="release_date"
value="{{ info[2] }}"/></p>
<p>评分:<input type="number" name="score"
value="{{ info[3] }}"/></p>
<p>电影种类:<input type="text" name="types"
value="{{ info[4] }}"/></p>
<!-- 修改按键 -->
<p><input type="submit" value="修改" /></p>
</form>
</body>
<style>
body{ margin: 0 auto; width: 800px;
background-image:url('/static/html 封面图.png');
background-repeat:no-repeat;
background-size: cover;}
h1{ color: #258dcd}
a{
background-color: #258dcd;
color: white;
padding: 5px 8px;
text-decoration: none;
border-radius: 5px;
/*半透明*/
/*background-color:rgba(55,55,55,0.5)*/
}
</style>
</html>
我的部分代码和老师教的有点出入,所以主界面有点不一样,不过我觉得还行。
各个功能都测试过了。从上午忙活到吃晚饭,头都发昏了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8 | 融合改进 | C2f融合可变核卷积AKConv【附代码+小白可上手】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

【JavaEE】深入理解Spring IoC与DI:从传统开发到依赖注入的转变

目录 IoC & DI ⼊⻔什么是Spring什么是容器什么是IoCIoC介绍传统程序开发问题分析解决方案IoC程序开发IoC优势 IoC & DI ⼊⻔ IoC&#xff1a;Inversion of Control (控制反转) DI&#xff1a;Dependency Injection 在前⾯我们学习了Spring Boot和Spring MVC的开发, 可…

DNS相关内容

一、dns的两种解析方式 1. 正向解析 将域名解析为 ip 地址 2. 逆向解析 将 ip 地址解析为域名 设置解析方式&#xff0c;都是在 zone 文件中 named.conf 解决权限 named.rfc1912.zone 解决解析方式 3.DNS 方向解析 把 192.168.71.145 这个 ip 地址逆向解析为 www.yuany…

Android逆向题解攻防世界-easyjava-难度6

纯Java实现&#xff0c;不涉及so, flag加密之后与指定字符串 “wigwrkaugala"比较判断&#xff0c;循环一个个字符加的&#xff0c;那可以一个个字符对应还原。 加密算法就在a,b类里面&#xff0c;代码直接复制到idea &#xff0c;枚举暴力破解。 每一位输入范围a-z , 找…

Lua脚本 快速掌握

1.Lua脚本概述 Lua是一种轻量级的编程语言&#xff0c;由巴西里约热内卢天主教大学开发。设计初衷是为了嵌入应用程序中&#xff0c;提供灵活的配置和脚本能力。Lua具有简洁的语法和强大的扩展性&#xff0c;使得它在多个领域得到了广泛应用。 Lua的特点包括动态类型、自动内…

The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动

欢迎回到我们的系列&#xff0c;我们将记录 The Sandbox Game Maker 的 “On-Equip”&#xff08;装备&#xff09;功能的多种用途。 如果你刚加入 The Sandbox&#xff0c;On-Equip 功能是 “可收集组件”&#xff08;Collectable Component&#xff09;中的一个多功能工具&a…

C++ list【常用接口、模拟实现等】

1. list的介绍及使用 1.1 list的介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2.list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前…

MyBatisPlus 第二天

常用注解 1 TableName:数据库表名和实体类名不同时,会出现以下报错 在实体类上添加 TableName("t_user") 在开发的过程中&#xff0c;我们经常遇到以上的问题&#xff0c;即实体类所对应的表都有固定的前缀&#xff0c;例如t_或tbl_此时&#xff0c;可以使用MyBa…

el-tree自定义节点内容

<el-tree :data"data" :props"defaultProps" ref"treeRef" show-checkbox check-change"handleCheckChange"><!-- 自定义节点内容 --><template #default"{ node, data, store }"><span class"tr…

无人值守人工智能智慧系统数据分析:深度洞察与未来展望

无人值守人工智能智慧系统数据分析&#xff1a;深度洞察与未来展望 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到社会经济的各个领域&#xff0c;其中无人值守人工智能智慧系统作为AI技术应用的前沿阵地&#xff0c;正引领着一场深刻的…

【数量关系】毛娃儿笔记

一、导学 1、比例的常见作用 &#xff08;1&#xff09;通过份数求数量 甲&#xff1a;乙1:2 那么甲乙的人数总和一定是3的倍数 &#xff08;2&#xff09;得到倍数关系 不同的说法都可以转化为比例&#xff0c;比如甲是乙的两倍2:1、甲是乙的4/34:3、甲比乙多25%5:4 &am…

基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展&#xff0c;4S店作…

【微前端中常见的问题及其解决办法】

随着前端技术的飞速发展&#xff0c;大型应用系统的复杂性和规模性日益增加&#xff0c;传统的单体前端架构逐渐暴露出维护成本高、升级困难、技术栈单一等问题。为了应对这些挑战&#xff0c;微前端&#xff08;Micro-Frontends&#xff09;作为一种新的架构模式应运而生。微前…

自研Vue3低代码海报制作平台第一步:基础拖拽组件开发

学习来源&#xff1a;稀土掘金 - 幽月之格大佬的技术专栏可拖拽、缩放、旋转组件 - 著作&#xff1a;可拖拽、缩放、旋转组件实现细节 非常感谢大佬&#xff01;受益匪浅&#xff01; 前面我们学习了很多vue3的知识&#xff0c;是时候把它们用起来做一个有意思的平台&#xf…

合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别

合合信息TextIn平台明星产品——国内通用票据识别&#xff0c;重磅更新&#xff01; 产品支持票据类型扩展到23大类、30小类&#xff0c;覆盖场景更全面&#xff0c;同时升级优化了多款票据识别模型&#xff0c;平均识别率较前版本提升11.5%&#xff0c;整体识别速度提升21.9%…

关于k8s的Pod控制器

目录 1.Pod控制器及其作用 2.pod控制器类型 2.1 ReplicaSet: 2.2 Deployment 2.3 DaemonSet 2.4 StatefulSet 2.5 Job 2.6 Cronjob 3.Pod与控制器之间的关系 3.1 Deployment 3.2 SatefulSet 3.3 DaemonSet 3.4 job 3.5 cronjob 1.Pod控制器及其作用 Pod控制器&am…

北京某银行成功替换F5!更多实施细节曝光→

随着国家对金融行业技术创新的持续关注&#xff0c;金融行业的诸多用户正积极开展业务系统的数字化创新。 在这一领域&#xff0c;保障业务稳定性和连续性始终是最重要的议题。今天&#xff0c;为大家介绍的最佳实践来自北京某银行&#xff0c;他们通过积极探索和评估&#xf…

Python酷库之旅-第三方库Pandas(078)

目录 一、用法精讲 321、pandas.Series.str.len方法 321-1、语法 321-2、参数 321-3、功能 321-4、返回值 321-5、说明 321-6、用法 321-6-1、数据准备 321-6-2、代码示例 321-6-3、结果输出 322、pandas.Series.str.ljust方法 322-1、语法 322-2、参数 322-3、…

HMAC算法:构建安全认证的基石

在信息安全领域&#xff0c;数据完整性和认证是至关重要的。HMAC&#xff08;Hash-based Message Authentication Code&#xff09;算法作为一种基于哈希的消息认证码&#xff0c;广泛应用于数据传输过程中的安全认证。本文将带你了解HMAC算法的原理、特点及其应用场景。 HMAC算…

全方位解析RAG技术:从概念理论到代码实操,一文助你掌握检索增强生成的精髓!

一、LLMs 已经具备了较强能力了&#xff0c;为什么还需要 RAG(检索增强生成)? 尽管 LLM 已展现出显著的能力&#xff0c;但以下几个挑战依然值得关注&#xff1a; 幻觉问题&#xff1a;LLM 采用基于统计的概率方法逐词生成文本&#xff0c;这一机制内在地导致其可能出现看似…