基于Flask的问答系统的设计与实现

news2024/9/28 7:18:35

这个项目刚开始是跟着哔哩哔哩上的一个教程学习的,后面完成初步实现后,我按照自己的设计加入了新的功能。

文章目录

  • 数据表
    • mysql
    • redis
  • 项目展示
    • 注册登录
    • 首页
    • 问题详情页
    • 问题回答及回复
    • 搜索功能
    • 发布问题功能
    • 评论我的功能
    • 回复我的功能
    • 我的文章功能
    • 编辑文章功能
    • 我的评论功能
    • 我的回复功能
    • 后台管理功能
  • 源代码目录
    • requirements.txt文件
    • app.py文件
    • models.py文件

数据表

mysql

用户表(user)
在这里插入图片描述
问题表(question)
在这里插入图片描述
回答表(answer)
在这里插入图片描述
回复表(reply)
在这里插入图片描述
邮箱验证码表(email_captcha)
在这里插入图片描述

redis

问题浏览数量
在这里插入图片描述
问题评论数量
在这里插入图片描述

项目展示

注册登录

在这里插入图片描述

在这里插入图片描述

首页

最热文章列表按照文章浏览数量从高到低排列,点击文章标题,进入文章详情页,文章浏览数量+1。
在这里插入图片描述

问题详情页

发布评论及回复,问题的评论数量+1
在这里插入图片描述

问题回答及回复

可以评论问题,也可以回复别人的评论。查看回复和收起回复
在这里插入图片描述

搜索功能

在这里插入图片描述

发布问题功能

问题内容为Markdown格式,就和写博客这个格式一样,目前我没有加入上传图片的功能。
在这里插入图片描述

评论我的功能

不能删除别人的评论和回复,这个点击删除会显示错误,这里的删除按钮我后面再去除掉。点击文章标题就可以跳转到别人评论你的文章。
在这里插入图片描述

回复我的功能

同上面的“评论我的功能”
在这里插入图片描述

我的文章功能

对于自己发布的文章提供编辑和删除功能,删除后文章不复存在,对应的评论和回复一并删除。评论数量和浏览数量也同时删除。
在这里插入图片描述

编辑文章功能

编辑问题内容后,点击发布,内容会更新。
在这里插入图片描述

我的评论功能

删除自己发布的评论后,相对应的回复一并删除,同时相对应的文章减去删除的评论和回复的数量。
在这里插入图片描述

我的回复功能

删除自己发布的回复,相对应的文章减去删除的回复数量。
在这里插入图片描述

后台管理功能

在这里插入图片描述
在这里插入图片描述

源代码目录

在这里插入图片描述

requirements.txt文件

alembic==1.10.3
blinker==1.6.2
click==8.1.3
colorama==0.4.6
dnspython==2.3.0
email-validator==1.3.1
Flask==2.2.3
Flask-Admin==1.6.1
Flask-Mail==0.9.1
Flask-Migrate==4.0.4
Flask-SQLAlchemy==3.0.3
Flask-WTF==1.1.1
greenlet==2.0.2
idna==3.4
itsdangerous==2.1.2
Jinja2==3.1.2
Mako==1.2.4
MarkupSafe==2.1.2
mistune==2.0.5
PyMySQL==1.0.3
SQLAlchemy==2.0.9
typing_extensions==4.5.0
Werkzeug==2.2.3
WTForms==3.0.1

app.py文件

from flask import Flask, session, g
import config
from exts import db, mail, admin,compress
from models import UserModel
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp
from blueprints.manage import bp as manage_bp
from flask_migrate import Migrate

app = Flask(__name__)
# 绑定配置文件
app.config.from_object(config)
migrate = Migrate(app, db)
'''
迁移三部曲flask db init(初始执行一次即可);flask db migrate;flask db upgrade;
'''
compress.init_app(app)
db.init_app(app)
mail.init_app(app)
admin.init_app(app)
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)
app.register_blueprint(manage_bp)
@app.before_request
def before_request():
    user_id = session.get('user_id')
    if user_id:
        user = UserModel.query.filter_by(id=user_id).first()
        setattr(g, "user", user)
    else:
        setattr(g, "user", None)
@app.context_processor
def context_processor():
    return {"user": g.user}
if __name__ == '__main__':
    app.run(debug=True)

models.py文件

from exts import db, admin
from datetime import datetime
class UserModel(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(200), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)
class EmailCaptchaModel(db.Model):
    __tablename__ = 'email_captcha'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(100), nullable=False)
    captcha = db.Column(db.String(100), nullable=False)
class QuestionModel(db.Model):
    __tablename__ = 'question'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False, index=True)  # 添加索引
    content = db.Column(db.Text, nullable=False)
    content_html = db.Column(db.Text, nullable=False)
    create_time = db.Column(db.DateTime, default=datetime.now, index=True)  # 添加索引
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True)  # 添加索引
    author = db.relationship(UserModel, backref="question")
class AnswerModel(db.Model):
    __tablename__ = 'answer'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    content = db.Column(db.Text, nullable=False)
    create_time = db.Column(db.DateTime, default=datetime.now, index=True)  # 添加索引
    question_id = db.Column(db.Integer, db.ForeignKey("question.id"), index=True)  # 添加索引
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True)  # 添加索引
    question = db.relationship(QuestionModel, backref=db.backref('answers', order_by=create_time.desc()))
    author = db.relationship(UserModel, backref="answers")
class ReplyModel(db.Model):
    __tablename__ = 'reply'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    content = db.Column(db.Text, nullable=False)
    question_id = db.Column(db.Integer, db.ForeignKey("question.id"), index=True)  # 添加索引
    answer_id = db.Column(db.Integer, db.ForeignKey("answer.id"), index=True)  # 添加索引
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True)  # 添加索引
    create_time = db.Column(db.DateTime, default=datetime.now, index=True)  # 添加索引
    answer = db.relationship(AnswerModel, backref=db.backref('replys', order_by=create_time.desc()))
    question = db.relationship(QuestionModel, backref=db.backref('replys', order_by=create_time.desc()))
    author = db.relationship(UserModel, backref="replys")
from flask_admin.contrib.sqla import ModelView
class UserView(ModelView):
    column_list = ['id', 'username', 'email', 'join_time']
admin.add_view(UserView(UserModel, db.session))
admin.add_view(ModelView(QuestionModel, db.session))

大多数代码已经省略(这全部粘贴出来恐怕得几万字)这个项目还有很多不完善的地方,后面有时间我再完善。真是 书到用时方恨少。

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

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

相关文章

springcloud eureka增加安全认证

网上很多资料写的不全,不细致。 springcloud架构,本地运行代码是eureka地址一般为localhost:port(自己暴露的端口),例如http://localhost:9000/ ,但是如果在服务器,且使用k8s部署,一…

科大讯飞开发者大赛,有点东西~

小伙伴们大家好,我是阿秀。 如果要说 23 年上半年最火的科技圈话题是什么? 那AIGC和大模型相关的话题稳坐头把交椅,奈何由于不少服务器在海外,很多人因为没有充分条件无法体验。 后来众多国产大模型也跟上步伐,智能问答…

Spring Boot 中的任务执行器是什么,如何使用

Spring Boot 中的任务执行器是什么,如何使用 Spring Boot 是一个非常流行的 Java 开发框架,它的核心理念是通过简单的配置和约定来提高开发效率。在很多情况下,我们需要在后台执行一些任务,比如异步处理、定时任务等等。为了简化…

数据结构错题集 第八章 排序

8.1 3 B 稳定性问题: 是按关键字排序的 数值一样的两个数是两个不同的关键字 顺序可能不同 4.记住公式即可 8.2 B D与初始序列无关 选择排序:在n个中选择最小的 放在第一个 在n-1个中 选择第二小的放在第二个 快速排序 越有序 反而越复杂化 直接插入…

Spring底层核心架构

Spring底层核心架构 相关的配置类 1. user类 package com.zhouyu.service;import org.springframework.stereotype.Component;public class User { }2. AppConfig类 package com.zhouyu;import org.springframework.context.annotation.*; import org.springframework.sched…

CASS扣除中间区域面积的方法

1、打开cass软件,绘制一个矩形和圆形,圆形全部位于矩形框内,具体如下: 2、点击“地物编辑”菜单栏下的“图案填充”,如下: 3、在命令行内输入实体填充、选择范围线方式填充,选择后可得到如下结果…

基于单片机的智能路灯控制系统人体感应灯光控制系统的设计与实现

功能介绍 以51单片机作为主控系统;LCD1602液晶显示当前时间、年月日、时分秒;按键看看有设置自动手动模式;3路红外探头用来感应当前3个区域是否有人;按键可以设置当前时间、开启和关闭教室灯光时间;在手动模式下&#…

debian to go

可以使用虚拟机操作,在运行镜像到安装步骤时选择 u盘 不需要手动分 /boot 分区之类的,“Automaction”自动分区就行,全安装到根目录。boot load 安装到 /dev/sdb,也就是硬盘本身 推荐使用gpt分区表,建议拿不用的盘练…

Basic of Solidity (solidity基础)

目录 1.first contract 申明编译器版本 定义合约 合约构造函数 定义变量 定义函数 2.data type 值类型(Value Types) 引用类型(Reference Types) 映射类型(Mapping Types) Solidity是一种用于编写…

vue + element 笔记(vue2.0)

1.安装nodejs,cmd中运行 node -v 验证是否成功 2.安装cnpm,cmd中运行 npm install -g cnpm --registryhttps://registry.npm.taobao.org,cmd中 cnpm -v 验证是否成功 3.安装vue-cli,cmd中运行 cnpm install --global vue-cli&…

三、Java的运算符

三、运算符 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 3.1、算术运算符 - * / % (前) (后) (前)-- (后)-- % :取余运算 结果的符号与被模数的符号相同 开发中,经常使用%来判断能否被除尽的情况 3.2、赋值运算符 注意:s2…

Spring Boot 中的 Native SQL 是什么, 如何使用

在 Spring Boot 中,我们通常使用 ORM 框架(例如 Hibernate 或 MyBatis)来操作数据库。但是,有时候我们需要执行一些自定义的 SQL 查询或更新语句,这时候就需要使用 Spring Boot 中的 Native SQL。 在本文中&#xff0…

Matlab绘图系列教程-Matlab 34 种绘图函数示例(下)

Matlab绘图系列教程:揭秘高质量科学图表的绘制与优化 文章目录 Matlab绘图系列教程:揭秘高质量科学图表的绘制与优化第一部分:入门指南1.1 简介关于本教程的目的与范围Matlab绘图在科学研究中的重要性 1.2 准备工作安装Matlab及其工具箱 1.3 …

8、添加PolylineCollection线

本节演示添加线要素,使用第四节单击事件的例子,修改点击事件创建线要素。 1、重新修改地图默认位置 double r glm::radians(-45.0); Cesium::HeadingPitchRoll *orientation new Cesium::HeadingPitchRoll(0.0, r, 0.0); glm::dvec3 initialPosition…

map和set的封装

目录 封装逻辑 用红黑树封装set和map 红黑树的定义改变 迭代器 红黑树的迭代器 set的迭代器 map重载[]操作的实现 比较关键——得到 key的类型K 封装逻辑 用红黑树封装set和map map和set用红黑树来实现的;红黑树的前三个模板参数分别表示:得到key的…

C语言---程序环境和预处理(底层原理万字详解)

文章目录 前言🌟一、程序的翻译环境和执行环境🌟二、详解编译链接🌏2.1命令🌏2.2 板书详解🌏2.3运行环境 🌟三、预处理详解🌏3.1预定义符号🌏3.2 #define💫3.2.1 #define…

第三章 SSD存储介质:闪存

3.1 闪存物理结构 闪存芯片从小到大依此是由:cell(单元)、page(页)、block(块)、plane(平面)、die(核心)、NAND flash(闪存芯片&#…

【动手学习深度学习--逐行代码解析合集】10Dropout暂退法

【动手学习深度学习】逐行代码解析合集 10Dropout暂退法 视频链接:动手学习深度学习–Dropout暂退法 课程主页:https://courses.d2l.ai/zh-v2/ 教材:https://zh-v2.d2l.ai/ 1、暂退法原理 2、从零开始实现暂退法 import torch from torch i…

微服务网关技术选型:Zuul2、Gateway、OpenResty、Kong

1、简介 当使用单体应用程序架构时,客户端(Web 或移动端)通过向后端应用程序发起一次 REST 调用来获取数据。负载均衡器将请求路由给 N 个相同的应用程序实例中的一个。然后应用程序会查询各种数据库表,并将响应返回给客户端。微…

missing-semester————1

文章目录 shell概述echoshell如何知道去哪寻找date或echo呢?$PATHlsman流根用户 shell概述 root1test:~$ $表示身份不是root用户 ~表示当前所在位置是"home" root1test:~$ date Sat Jul 8 02:57:44 UTC 2023输入命令,会被shell解析 上述执行…