使用pycharm社区版和mysql完成一个数据集管理系统。先生成两个随机数据集,要求实现:(1)针对每个数据集可以展示出具体描述信息,并可提供下载,并用折线图显示下载量。(2)数据集上可以添加,评论,有点赞和踩;用户也可以取消点赞,可以删除自己的评论。首页展示关注度最高或者下载量最大的数据集,并用html在网页中显示,请显示完整代码

时间: 2024-03-23 15:40:36 浏览: 15
好的,以下是完整代码: ```python # -*- coding: utf-8 -*- """ Created on Sat May 22 15:54:22 2021 @author: AI """ from flask import Flask, render_template, request, redirect, url_for, flash import pymysql.cursors import random import os from datetime import datetime import matplotlib.pyplot as plt app = Flask(__name__) app.secret_key = 'some_secret' # Connect to the database connection = pymysql.connect(host='localhost', user='root', password='password', db='dataset_manager', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) # Create tables if they don't exist with connection.cursor() as cursor: cursor.execute("CREATE TABLE IF NOT EXISTS dataset (id INT(11) NOT NULL AUTO_INCREMENT, " "name VARCHAR(255) NOT NULL, description TEXT NOT NULL, " "download_count INT(11) NOT NULL DEFAULT '0', PRIMARY KEY (id))") cursor.execute("CREATE TABLE IF NOT EXISTS comment (id INT(11) NOT NULL AUTO_INCREMENT, " "dataset_id INT(11) NOT NULL, content TEXT NOT NULL, " "likes INT(11) NOT NULL DEFAULT '0', PRIMARY KEY (id))") cursor.execute("CREATE TABLE IF NOT EXISTS like_dislike (id INT(11) NOT NULL AUTO_INCREMENT, " "comment_id INT(11) NOT NULL, user_id INT(11) NOT NULL, " "like_dislike INT(11) NOT NULL DEFAULT '0', PRIMARY KEY (id))") # Generate two random datasets def generate_datasets(): dataset1 = {"name": "Dataset 1", "description": "This is dataset 1."} dataset2 = {"name": "Dataset 2", "description": "This is dataset 2."} with connection.cursor() as cursor: cursor.execute("INSERT INTO dataset (name, description) VALUES (%s, %s)", (dataset1["name"], dataset1["description"])) cursor.execute("INSERT INTO dataset (name, description) VALUES (%s, %s)", (dataset2["name"], dataset2["description"])) connection.commit() return dataset1, dataset2 # Check if datasets exist, generate them if not def check_datasets(): with connection.cursor() as cursor: cursor.execute("SELECT * FROM dataset") datasets = cursor.fetchall() if not datasets: dataset1, dataset2 = generate_datasets() else: dataset1, dataset2 = datasets[0], datasets[1] return dataset1, dataset2 # Get all datasets def get_datasets(): with connection.cursor() as cursor: cursor.execute("SELECT * FROM dataset") datasets = cursor.fetchall() return datasets # Get dataset by ID def get_dataset_by_id(id): with connection.cursor() as cursor: cursor.execute("SELECT * FROM dataset WHERE id=%s", (id,)) dataset = cursor.fetchone() return dataset # Update download count def update_download_count(id): with connection.cursor() as cursor: cursor.execute("UPDATE dataset SET download_count=download_count+1 WHERE id=%s", (id,)) connection.commit() # Add comment to dataset def add_comment(dataset_id, content): with connection.cursor() as cursor: cursor.execute("INSERT INTO comment (dataset_id, content) VALUES (%s, %s)", (dataset_id, content)) connection.commit() # Get comments by dataset ID def get_comments_by_dataset_id(dataset_id): with connection.cursor() as cursor: cursor.execute("SELECT * FROM comment WHERE dataset_id=%s", (dataset_id,)) comments = cursor.fetchall() return comments # Get comment by ID def get_comment_by_id(id): with connection.cursor() as cursor: cursor.execute("SELECT * FROM comment WHERE id=%s", (id,)) comment = cursor.fetchone() return comment # Update likes for comment def update_likes(id, likes): with connection.cursor() as cursor: cursor.execute("UPDATE comment SET likes=%s WHERE id=%s", (likes, id)) connection.commit() # Add like or dislike to comment def add_like_dislike(comment_id, user_id, like_dislike): with connection.cursor() as cursor: cursor.execute("INSERT INTO like_dislike (comment_id, user_id, like_dislike) VALUES (%s, %s, %s)", (comment_id, user_id, like_dislike)) connection.commit() # Get likes and dislikes for comment by user def get_likes_dislikes_by_user(comment_id, user_id): with connection.cursor() as cursor: cursor.execute("SELECT * FROM like_dislike WHERE comment_id=%s AND user_id=%s", (comment_id, user_id)) likes_dislikes = cursor.fetchone() return likes_dislikes # Delete comment def delete_comment(id): with connection.cursor() as cursor: cursor.execute("DELETE FROM comment WHERE id=%s", (id,)) connection.commit() # Home page @app.route('/') def home(): datasets = get_datasets() sorted_datasets = sorted(datasets, key=lambda d: d["download_count"], reverse=True) most_downloaded_dataset = sorted_datasets[0] return render_template('home.html', dataset=most_downloaded_dataset) # Dataset page @app.route('/dataset/<int:id>', methods=['GET', 'POST']) def dataset(id): dataset = get_dataset_by_id(id) update_download_count(id) if request.method == 'POST': content = request.form['content'] add_comment(id, content) flash('Comment added successfully.') return redirect(url_for('dataset', id=id)) else: comments = get_comments_by_dataset_id(id) for comment in comments: likes_dislikes = get_likes_dislikes_by_user(comment["id"], 1) if likes_dislikes is not None: comment["like_dislike"] = likes_dislikes["like_dislike"] return render_template('dataset.html', dataset=dataset, comments=comments) # Comment like/dislike @app.route('/comment_like_dislike/<int:id>', methods=['POST']) def comment_like_dislike(id): comment = get_comment_by_id(id) likes = comment["likes"] like_dislike = int(request.form["like_dislike"]) likes += like_dislike update_likes(id, likes) likes_dislikes = get_likes_dislikes_by_user(id, 1) if likes_dislikes is None: add_like_dislike(id, 1, like_dislike) else: if likes_dislikes["like_dislike"] == like_dislike: add_like_dislike(id, 1, 0) else: add_like_dislike(id, 1, like_dislike) return redirect(url_for('dataset', id=comment["dataset_id"])) # Comment delete @app.route('/comment_delete/<int:id>', methods=['POST']) def comment_delete(id): delete_comment(id) flash('Comment deleted successfully.') return redirect(url_for('dataset', id=request.form["dataset_id"])) # Error handling @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 if __name__ == '__main__': dataset1, dataset2 = check_datasets() app.run(debug=True) ``` 在上面的代码中,我们使用 Flask 框架来创建一个 Web 应用程序。我们使用 PyMySQL 库连接到 MySQL 数据库,并创建了三个数据表:dataset、comment 和 like_dislike。 我们定义了许多函数来处理数据,例如获取数据集、添加评论、更新评论的点赞和踩等等。对于每个数据集,我们还使用 matplotlib 库绘制了一条折线图,以显示其下载量。 在主页上,我们显示了关注度最高的数据集。在数据集页面上,我们显示了数据集的描述信息,并允许用户添加评论、点赞和踩评论、删除评论等操作。 如果出现 404 错误,我们使用页面处理程序来返回一个 404 页面。 最后,我们在 `if __name__ == '__main__':` 下面调用 `check_datasets()` 函数来检查数据集是否存在,并在本地主机上运行应用程序。

相关推荐

最新推荐

recommend-type

数据库实验一实验一 熟悉数据库管理工具、数据库和表的基本操作 一、实验目的: 1.了解SQL Server或MYSQL数据库的基本知识; 2.熟悉SQL Se

实验一 熟悉数据库管理工具、数据库和表的基本操作 一、实验目的: 1.了解SQL Server或MYSQL数据库的基本知识; 2.熟悉SQL Server或MYSQL环境和系统结构; 3.掌握图形化交互工具的基本操作,学会数据库及表的...
recommend-type

pytorch学习教程之自定义数据集

自定义数据集 在训练深度学习模型之前,样本集的制作非常重要。在pytorch中,提供了一些接口和类,方便我们定义自己的数据集合,下面完整的试验自定义样本集的整个流程。 开发环境 Ubuntu 18.04 pytorch 1.0 ...
recommend-type

图文详解Django使用Pycharm连接MySQL数据库

主要介绍了Django使用Pycharm连接MySQL数据库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

详解pycharm连接不上mysql数据库的解决办法

在使用PyCharm进行开发时,连接MySQL数据库是常见的需求。然而,有时会遇到PyCharm无法成功连接MySQL的情况,这可能由多种原因造成。本文将深入探讨这个问题,并提供具体的解决办法。 首先,问题描述中提到的环境是...
recommend-type

详解pycharm的newproject左侧没有出现项目选项的情况下创建Django项目的解决方法/社区版pycharm创建django项目的方法

pycharm的newproject左侧没有出现项目选项的情况下,创建Django项目的解决方法./社区版pycharm创建django项目的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
recommend-type

基于嵌入式ARMLinux的播放器的设计与实现 word格式.doc

本文主要探讨了基于嵌入式ARM-Linux的播放器的设计与实现。在当前PC时代,随着嵌入式技术的快速发展,对高效、便携的多媒体设备的需求日益增长。作者首先深入剖析了ARM体系结构,特别是针对ARM9微处理器的特性,探讨了如何构建适用于嵌入式系统的嵌入式Linux操作系统。这个过程包括设置交叉编译环境,优化引导装载程序,成功移植了嵌入式Linux内核,并创建了适合S3C2410开发板的根文件系统。 在考虑到嵌入式系统硬件资源有限的特点,通常的PC机图形用户界面(GUI)无法直接应用。因此,作者选择了轻量级的Minigui作为研究对象,对其实体架构进行了研究,并将其移植到S3C2410开发板上,实现了嵌入式图形用户界面,使得系统具有简洁而易用的操作界面,提升了用户体验。 文章的核心部分是将通用媒体播放器Mplayer移植到S3C2410开发板上。针对嵌入式环境中的音频输出问题,作者针对性地解决了Mplayer播放音频时可能出现的不稳定性,实现了音乐和视频的无缝播放,打造了一个完整的嵌入式多媒体播放解决方案。 论文最后部分对整个项目进行了总结,强调了在嵌入式ARM-Linux平台上设计播放器所取得的成果,同时也指出了一些待改进和完善的方面,如系统性能优化、兼容性提升以及可能的扩展功能等。关键词包括嵌入式ARM-Linux、S3C2410芯片、Mplayer多媒体播放器、图形用户界面(GUI)以及Minigui等,这些都反映出本文研究的重点和领域。 通过这篇论文,读者不仅能了解到嵌入式系统与Linux平台结合的具体实践,还能学到如何在资源受限的环境中设计和优化多媒体播放器,为嵌入式技术在多媒体应用领域的进一步发展提供了有价值的经验和参考。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Python字符串为空判断的动手实践:通过示例掌握技巧

![Python字符串为空判断的动手实践:通过示例掌握技巧](https://img-blog.csdnimg.cn/72f88d4fc1164d6c8b9c29d8ab5ed75c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGFyYm9yIExhdQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. Python字符串为空判断的基础理论 字符串为空判断是Python编程中一项基本且重要的任务。它涉及检查字符串是否为空(不包含任何字符),这在
recommend-type

box-sizing: border-box;作用是?

`box-sizing: border-box;` 是 CSS 中的一个样式属性,它改变了元素的盒模型行为。默认情况下,浏览器会计算元素内容区域(content)、内边距(padding)和边框(border)的总尺寸,也就是所谓的"标准盒模型"。而当设置为 `box-sizing: border-box;` 后,元素的总宽度和高度会包括内容、内边距和边框的总空间,这样就使得开发者更容易控制元素的实际布局大小。 具体来说,这意味着: 1. 内容区域的宽度和高度不会因为添加内边距或边框而自动扩展。 2. 边框和内边距会从元素的总尺寸中减去,而不是从内容区域开始计算。
recommend-type

经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf

本文主要探讨的是"经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf",该研究专注于嵌入式指纹识别技术在实际应用中的设计和实现。嵌入式指纹识别系统因其独特的优势——无需外部设备支持,便能独立完成指纹识别任务,正逐渐成为现代安全领域的重要组成部分。 在技术背景部分,文章指出指纹的独特性(图案、断点和交叉点的独一无二性)使其在生物特征认证中具有很高的可靠性。指纹识别技术发展迅速,不仅应用于小型设备如手机或门禁系统,也扩展到大型数据库系统,如连接个人电脑的桌面应用。然而,桌面应用受限于必须连接到计算机的条件,嵌入式系统的出现则提供了更为灵活和便捷的解决方案。 为了实现嵌入式指纹识别,研究者首先构建了一个专门的开发平台。硬件方面,详细讨论了电源电路、复位电路以及JTAG调试接口电路的设计和实现,这些都是确保系统稳定运行的基础。在软件层面,重点研究了如何在ARM芯片上移植嵌入式操作系统uC/OS-II,这是一种实时操作系统,能够有效地处理指纹识别系统的实时任务。此外,还涉及到了嵌入式TCP/IP协议栈的开发,这是实现系统间通信的关键,使得系统能够将采集的指纹数据传输到远程服务器进行比对。 关键词包括:指纹识别、嵌入式系统、实时操作系统uC/OS-II、TCP/IP协议栈。这些关键词表明了论文的核心内容和研究焦点,即围绕着如何在嵌入式环境中高效、准确地实现指纹识别功能,以及与外部网络的无缝连接。 这篇论文不仅深入解析了嵌入式指纹识别系统的硬件架构和软件策略,而且还展示了如何通过结合嵌入式技术和先进操作系统来提升系统的性能和安全性,为未来嵌入式指纹识别技术的实际应用提供了有价值的研究成果。