学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上
目录
查看电影类型的电影列表
添加电影
修改电影
上机练习 13 使用三层架构完善 web 系统
查看电影类型的电影列表


添加电影

修改电影

上机练习 13 使用三层架构完善 web 系统
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)
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
<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>
<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>
<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>
<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>

相关文章:

学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上
目录 查看电影类型的电影列表 添加电影 修改电影 上机练习 13 使用三层架构完善 web 系统 查看电影类型的电影列表 DAL.py 文件 class MovieDAL(DBHelper): def getMovieByTid(self,typeid): sqlf"""select id,title,release_date,score,tname from Mo…...

【开端】通过Java 过滤器灵活配置URL访问权限,并返回403
一、绪论 在JAVA项目系统中,后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。 比如某一接口被攻击了或者某一接口存在漏洞,在系统不关闭的情况下,如何控制系统的访问权限。 二、控制接口访…...

【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)
目录 一、前言 二、项目的相关背景 ⚡什么是Boost库?⚡ ⚡什么是搜索引擎?⚡ ⚡为什么要做Boost搜索引擎?⚡ 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 &#x…...

强化阶段《660》和《880》哪本优先级高?
现在8月份了,正是考研数学复习的关键时刻,大家应该正在痛快的刷题! 如果你正在做660880,那么这篇笔记值得花五分钟看完,一定会让你刷660和880的质量和速度提高一个层次! 首先我们要知道660和880都怎么用&…...

Redis远程字典服务器(2) —— 全局命令
一,使用官方文档 学会使用文档,是一个优秀程序员的必备技能。Redis的命令非常多(上百个),因为Redis是通过键值对存储数据的,key为string类型,但是value可以是其它的数据类型(字符串…...

Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
技术背景 我们知道,Android平台不管RTMP推送、轻量级RTSP服务模块还是GB28181设备接入模块,早期,如果需要实现截图功能,又不想依赖Android系统接口,最好的办法是,在底层实现快照截图。 快照截图ÿ…...

tomcat文件上传漏洞练习
1、靶场账号注册 vulfocus 注册后邮箱中点击激活 2、首页选择并开启靶场 复制映射的ip和端口 在浏览器输入ip和端口 改成put并把1.jsp中内容复制进去 3打开哥斯拉,连接上面的网址...

项目实战_图书管理系统(简易版)
你能学到什么 一个简单的项目——图书管理系统(浏览器:谷歌)基础版我们只做两个功能(因为其它的功能涉及的会比较多,索性就放在升级版里了,基础版先入个门) 登录: ⽤⼾输⼊账号,密码完成登录功…...

Gazebo之MyRobot建立
Gazebo之MyRobot建立 1. 源由2. 示例Step 1: 新建一个简单世界Step 2: 新建一个模型(model)Step 3: 机器人组成链接(Links)Step 3.1: 新增底盘(Links/Chassis)Step 3.1.1: 惯性属性(Inertial properties)Step 3.1.2: 视觉(Visual)Step 3.1.3: 碰撞(Collision) Step 3.2: 新增左…...

WPF学习(5)- Border控件(边框布局)+GridSplitter分割窗口
严格来说,Border并不是一个布局控件,因为它并不是Panel的子类,而是Decorator装饰器的子类,而Decorator继承于FrameworkElement。我们要先看看它的父类Decorator。 public class Decorator : FrameworkElement, IAddChild {public…...
ADAS芯片及方案
一 ADAS芯片及方案 1.1 高通SA8775P Snapdragon Ride Flex(SA8775P)舱驾融合平台可通过单颗SoC同时支持数字座舱和智能驾驶功能,在CPU、GPU、NPU的处理能力方面具备强大的性能表现与领先优势,支持实现复杂的智能座舱功能&#x…...

5 mysql 查询语句
1.DML:对数据进行增删改查 提示:Execute执行 Execute and Suppress 执行并且抑制这个警告 person表的结构 /* DML:Data Manipulation Language 数据操作语言,对数据进行 增删改查操作,因为査询的操作太频繁和复杂,将…...

从网络上下载并展示图像数据
一、代码 from PIL import Image import requests from io import BytesIO import matplotlib.pyplot as pltimage_url "https://www.alleycat.org/wp-content/uploads/2019/03/FELV-cat.jpg" response requests.get(image_url) # response.content 获取 HTTP 响…...

Machine-Learning 机器学习
目录 基本概念与分类 工作原理 应用领域 发展趋势 机器学习中的深度学习是如何工作的,以及它如何影响其他机器学习算法? 在机器学习中,哪些特定的数据预处理技术最有效,特别是在处理大规模数据集时? 强化学习在…...

CSP 2023 普及组第一轮 - CSP/S 2023初试题 基础部分解析
第 1 题 在 C 中,下面哪个关键字用于声明一个变量, 其值不能被修改?(B) A. unsigned B. const C. static D. mutable 【const声明的变量不可修改】 第 2 题 八进制数 12345670(8) 和 07654321(8) 的和为(D) A. 222222…...
解锁IPython的跨平台魔法:深入探索%%script命令的神秘力量
IPython 的 %%script 魔法命令是一种强大的工具,它允许你在 IPython 环境中执行外部脚本。这个特性特别适用于需要在 IPython Notebook 中直接与 Web 技术交互的场景。下面我将为你详细介绍 %%script 命令的使用方法,并通过代码示例展示其强大功能。 一…...

如何避免项目发布后用户从浏览器WebPack中看到源码
打包前在config->index.js中设置productionSourceMap为false productionSourceMap: false,...

java学习19VUE
VUE NPM npm的全称是Node Package Manager 中文名为Node.js包管理器,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。NPM可以方便地从一个全球的代码库中获取并安装Node.js模块,这些模块可以用于构建应用程序、…...
Redis7(四)哨兵、集群
哨兵 吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为主库,继续对外服务 哨兵的作用: 监控redis运行状态,包括master和slave当master宕机了,能自动将slave转换为master 哨兵的功能…...
校园课程助手【3】-使用枚举类封装异常优雅处理全局异常
接着2中登录模块补充一个点: //可以看到这里返回给前端控制器的是一个类而不是html页面public RespBean doLogin(Valid LoginVo loginVo, HttpServletRequest request,HttpServletResponse response){return userService.doLogin(loginVo, request, response);}首先…...

Appium+python自动化(八)- 认识Appium- 下章
1、界面认识 在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的(客户端安装),一种是没有界面的(终端安装),首先我们先讲一下有界面的,以及界…...

DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进
最近,AI界迎来了一位神秘的“突袭者”——DeepSeek团队悄无声息地发布了其推理模型DeepSeek R1的重磅升级版V2(具体型号R1-0528)。这款基于MIT许可的开源模型,在原版R1的基础上进行了多项令人瞩目的改进,正以其强大的潜…...

鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
又到了高考的日子,幽蓝君在这里祝各位考生朋友冷静答题,超常发挥。 今天要分享的内容是仓颉语言商城应用的个人中心页面,先看效果图: 下面介绍下这个页面的实现过程。 我们可以先分析下整个页面的布局结构。可以看出它是纵向的布…...

aardio 简单网页自动化
WebView自动化,以前每次重复做网页登录、搜索这些操作时都觉得好麻烦,现在终于能让程序替我干活了,赶紧记录下这个超实用的技能! 一、初次接触WebView WebView自动化就像给程序装了个"网页浏览器",第一步得…...
HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命
CodeGenie:鸿蒙生态的AI编程革命 华为推出的 CodeGenie 是集成于 DevEco Studio 的 AI 辅助编程工具,专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力,显著提升开发效率,降低鸿蒙生…...

Cell-o1:强化学习训练LLM解决单细胞推理问题
细胞类型注释是分析scRNA-seq数据异质性的关键任务。尽管最近的基础模型实现了这一过程的自动化,但它们通常独立注释细胞,未考虑批次水平的细胞背景或提供解释性推理。相比之下,人类专家常基于领域知识为不同细胞簇注释不同的细胞类型。为模拟…...
ASR技术(自动语音识别)深度解析
ASR技术(自动语音识别)深度解析 自动语音识别(Automatic Speech Recognition,ASR)是将人类语音转换为文本的核心技术,以下是其全面解析: 一、技术原理架构 #mermaid-svg-QlJOWpMtlGi9LNeF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:1…...
onSaveInstanceState() 和 ViewModel 在数据保存能力差异
一、设计目标差异 维度onSaveInstanceState()ViewModel核心目的保存 瞬态 UI 状态(如用户输入、滚动位置),应对进程意外终止或配置变更。管理 业务逻辑相关数据,在配置变更时保留数据࿰…...
Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析
你可能会认为:用了跨平台框架(如 Flutter 或 React Native),开发效率提高了,发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时,现实给了我一巴掌: “没有 Mac&…...

利用qcustomplot绘制曲线图
本文详细介绍了qcustomplot绘制曲线图的流程,一段代码一段代码运行看效果。通过阅读本文,读者可以了解到每一项怎么用代码进行配置,进而实现自己想要的图表效果。(本文只针对曲线图) 1 最简单的图形(入门&…...