前言

在上完数据库课程的时候,老师布置了个课程设计,要求学生自己制作一个和数据库有关的任意平台,还给我们演示了去年一位学生制作的“怪物猎人游戏平台”,即类似于文字游戏的平台。其中的角色装备数据和怪物数据都是储存到数据库里,然后再从前端和用户进行交互展示,从而达到用户打怪升级,买装备等效果。

我感觉能把所学知识运用到感兴趣领域还是挺好玩的,就打算自己搞一个类似平台。鉴于之前有段时间爱看科幻小说,于是想搭建个小说平台,其中小说数据是我自己随机生成的(爬虫太麻烦)。因为之前没怎么接触过服务器和前端相结合的项目,所以遇到了许多坑,便记录下来,权当自己复习一下相关内容,顺便帮助一下后来者。

本文将阐述本科数据库课程设计的项目设计思路以及源码,项目较为粗糙,主题是“基于OpenGasuss数据库的简易网络小说平台”,不提供安装数据库的教程,仅供参考。

参考源码:https://github.com/Bartender-bit/Web_OpenGauss


一、课设题目要求及分析

题目要求:

  1. 熟练掌握 Visual C++、C、Qt、Java、PHP 或 Python 等访问数据库的方法设计和实现学生通讯录或学生选课或类似的一个小型管理信息系统。
  2. 要求具有数据的增加、删除、修改和查询的基本功能,并尽可能提供较多的查询功能,集成半以上实验一~实验五的功能,用户界面要友好。
  3. 可选内容(加分项): 数据库中存放 100 万条记录,测试访问时间;如效率较低,提供优化方案。

分析:

既然要从零开始搭建平台的话,那自然要用成熟的框架节省时间。

经过一番挑选,我决定使用极其简便的 Python+Flask 组合,其网上有很多相关教程,遇到问题查起来也方便,所需插件也不多。而加分项中说的存放100万条记录也好搞,直接for循环一直往数据库里添加自己生成的随机数据就可以。至于效率优化相关,由于时间有限,我就没有考虑了。

首先 Python 的作用是连接数据库,并实现增删查改等功能。
Flask 的作用是模拟一个简易的网站。我们常用的网站大家都知道,点击一个链接,就能跳转到对应页面。比如当你在浏览器上方输入 www.login.com ,我们的flask就能根据我们的设置,让你在输入 www.login.com 后自动跳转到登陆页面。

这里强烈推荐看下B站这个视频:
web版学生信息后台管理系统(Python+flask框架+Bootstrap5)期末毕设必备

视频大概一个小时多一些,简短有效,很快就能让你使用flask框架来搭建属于自己的网站。

二、小说平台实现效果

思路很重要,一开始一定要构思好平台内各个身份的功能,以及所需要的表结构。在反复摸索没问题后,再进行编程,不然后面写着写着可能发现表结构设计不合理,又要推翻重新划分。
这里还要注意一点,课设对表的要求不是很高,不需要你把表结构优化到没有冗余,只要够用就行,没必要钻牛角尖。

1.合理的角色功能划分

小说平台分为三种角色:读者、作者以及管理者。(管理者是因为能作为加分项才加的,原本平台里只有读者和作者两种身份)
在这里插入图片描述

我们根据数据库的增删改查对角色的大体功能进行划分

读者:

  1. 可以在平台浏览所有的书(查)
  2. 可以在平台搜索书名或书作者(查)
  3. 可以将喜欢的书添加到书架里(增)
  4. 可以将不喜欢的书移除出书架(删)

作者:

  1. 可以在平台浏览所有的书(查)
  2. 可以在平台搜索书名或书作者(查)
  3. 可以自己发布新小说(增)
  4. 可以在已发布的小说中添加新章节(增)
  5. 可以在已发布的小说中修改章节(改)
  6. 可以对不满意的小说章节进行删除(删)
  7. 可以对不满意的书进行删除(删)

管理者:

  1. 可以查看所有的读者和作者信息(查)
  2. 可以封号对应的读者和作者账户(删)

以上就是我的大致用户功能设计思路,现在要琢磨该思路的可行性。

首先,对于浏览所有小说以及查找对应书名和书作者等功能,实现起来很简单,用一条 select 语句即可查询到所有信息。像其他的增删改查也是如此,都有对应的sql语句进行完成,我们可以发现这些功能的实现其实很简单,可行性很高。

所以整个系统最大的难点反而在于如何将数据库的信息显示在我们的网站上?Python和数据库如何跟前后端进行交互?

2. 表结构的设计

表结构的设计很重要,你后面要新增其他功能的话,很可能要重新设计表,所以最好一开始就构思好,节省时间。

  1. 每个身份都有属于自己的用户信息表(共3张表),用于验证用户登录的账号密码是否正确。:
    在这里插入图片描述
    在这里插入图片描述

  2. 其次,我们要有一个存放所有小说信息的表,用于展示在小说平台上(1张小说信息表):
    在这里插入图片描述
    在这里插入图片描述

  3. 最后,我们每本小说都有自己的章节内容表,因为一个小说可能成百上千章节,放一起存储会很冗杂,故我们要为每本小说创造属于自己的表(N张小说章节内容表):
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
这里可能有人会问,小说内容表的数量是动态变化的,这里如何做到呢?

其实很简单,作者每新写一本书,我们就根据一个不重复的自增数字来自动新生成这本书对应的表。比如作者写了一本书“三体“,那么我们就要新生成一个表用来储存 “1_三体” 这本书的章节信息和具体内容,后续如果有其他作者写了一本书“球状闪电”,那么我们就再新生成一张 “2_球状闪电” 表。

书名前面的自增数字确保了表不会重名,这样我们就可以一直 CREATE 新的小说内容表,这是很容易实现的操作。

比如有一个作者新写了一本书,我们可以根据字符串拼接的方式创建新的表。假设原先的表是1_novel,我们新的书表就为2_novel,下一位作者新写了书的话就创建3_novel。book_id是一个自增变量,这样就能确保表不重名。

	#每次都让全局变量book_id自增,这样每次都能生成名字不重的表
     book_id = book_id +1
     
     sql1 = "CREATE TABLE"+str(book_id)+"_novel"+" (
     book_id_chapter VARCHAR(100) NOT NULL,
     chapter_id serial PRIMARY KEY,
     chapter_title VARCHAR(100) NOT NULL,
     chapter_content text NOT NULL DEFAULT ' ',
     FOREIGN KEY (book_id_chapter) REFERENCES
     novel_info(novel_id));"

3.Python如何与服务器进行连接

由于我用的数据库是部署在华为云服务器上的OpenGauss数据库(由和学校合作的华为官方免费提供),故首先是要让Python和OpenGauss数据库进行连接。

OpenGauss官方已经给出很多详细教程,即下载一个官方提供的jar包并进行配置就能进行连接。
如果你用的不是OpenGauss,而是本地的数据库,那连接起来应该更简单,按照各自网上教程进行配置即可。

以下是简单的OpenGauss数据库连接过程:
在这里插入图片描述
这里的 conn.cursor() 你可以理解为数据库返回给你的一个可操作对象,有了它你才能执行sql语句操作。

举个例子:

假设用户在 登录页面 输入了自己的用户账号(123456)和密码(abc123),那么他在点击 登录 这个按钮时,我们运行在Pycharm上的Python程序即会收到用户的 账号和密码 信息.

根据这个信息,我们连接到服务器,并让服务器中的数据库执行以下sql语句让数据库根据账号密码在user表中进行查询 :

‘SELECT * FROM user_table WHERE account= 123456 AND password= abc123;’

具体执行sql语句过程如下:

def verify(username, user_password, role):
	# 进行连接数据库操作
    url = 'jdbc:postgresql://120.XXX.XX.XXX:26000/db_project'
    user = 'project_maker'
    password = 'user@12345'
    dirver = 'org.postgresql.Driver'
    jarFile = 'E:/School2/database/postgresql.jar'
    conn = jaydebeapi.connect(dirver, url, [user, password], jarFile)
    curs = conn.cursor()
    
    #设置搜索路径,OpenGauss需要设置,其他数据库不清楚需不需要
    sqlStr = """SET search_path TO db_schema;"""
    curs.execute(sqlStr) #执行sql语句
    
    #在user_table表中查找是否有对应账号密码的用户信息,有则登陆成功
    sql = 'SELECT * FROM ' + user_table + ' WHERE account=' + username + ' AND password=' + '\'%s\'' % user_password + ';'
    curs.execute(sql) #执行sql语句
    result = curs.fetchall()	#得到返回结果
    print("Login result: ", result)	#数据库会返回查询结果,如果为空数组,则代表表中无此人

	#关闭数据库连接
    curs.close()
    conn.close()
    return result #将结果返回给前端

执行完语句后,我们利用 .fetchall() 函数可以获取执行结果,倘若 result 返回的数组为空,则代表没有该用户信息(可能是没有该用户账号,也可能是密码出错)。倘若返回的数组有一条用户记录,则代表登陆成功。

至此,我们已经学会了如何让Python跟数据库进行连接,并执行相应的sql语句。

4.flask框架的应用

现在,我们已经在数据库中创建好了表,也学会了如何利用Python连接数据库并执行简单的sql语句,那么接下来就要开始搭建自己的网站了。

这里还是先建议大家把我先前说的视频看完:
web版学生信息后台管理系统(Python+flask框架+Bootstrap5)期末毕设必备

我们后续要做的无非就是重复一个过程:

  1. 设计页面(html界面)。
  2. app.py 文件中配置好到该页面的路由。(路由意思就是指向你html页面的url链接)
  3. 设计对应的增删改查等特定功能函数,并在你设计的页面中调用这些函数,让这些函数返回结果能显示到你的界面上。

4.1 前端页面如何传递信息给后端

以登陆流程为例:

  1. 进入登录界面(login.html)
    在这里插入图片描述

  2. app.py 文件中配置好到该页面的路由。

    当用户在url上输入 /login 并回车的时候,用户会进入login.html这个界面,也就是上面那张登录界面的图。在这里插入图片描述

  3. 当用户在输入框中输入了账号和密码信息并点击提交按钮后,Pycharm中的 app.py 文件就会接收到 usernamepassword 信息。然后我们就可以连接到数据库进行SELECT操作,查询该用户是不是在数据库中。

4.2 后端如何传递信息给前端显示

1.当我们拿到上述登录账号的信息后 ,我们可以在数据库查询该账号密码是否正确,并返回result

def verify(username, user_password, role):
    url = 'jdbc:postgresql://120.xxx.168.xxx:26000/db_project'
    user = 'xxx'
    password = 'xxx'
    dirver = 'org.postgresql.Driver'
    jarFile = 'E:/School2/database/postgresql.jar'
    conn = jaydebeapi.connect(dirver, url, [user, password], jarFile)
    curs = conn.cursor()
    sqlStr = """SET search_path TO db_schema;;"""
    curs.execute(sqlStr)
    sql = 'SELECT * FROM '+ role +' WHERE ' + role + '_account=' + username +' AND '+ role + '_password=' + '\'%s\''%user_password +';
    try:
        curs.execute(sql)
        result = curs.fetchall()
        print("Login success: ", result)
        curs.close()
        conn.close()
        return result
  1. 我们拿到result后,可以传值给页面的变量user_result
    在这里插入图片描述
  2. 在home.html页面里,我们可以将user_result信息进行显示,比如将读者的书架信息进行展示:
  {% for book in user_result.books %}
    <tr>
      <th scope="row" style="color:white">{{book[2]}}</th>
      <td style="color:white">{{book[1]}}</td>
      <td><a href="/reader_to_novel/{{book[2]}}" target="_blank" style="color:white">点我跳转</a></td>
    </tr>
    {% endfor %}

在这里插入图片描述

  1. 又比如数据库给我们返回了所有的书的信息,我们可以通过上述方法如法炮制,在前端用for循环显示出所有的书籍信息:
    在这里插入图片描述
    在这里插入图片描述
    至此,我们就大致了解了Python和Flask是如何在前后端进行交互的。

总结

本篇文章主要讲思路,和部分重点实现过程。不提供代码(因为服务器已经关了,代码跑不起来了)。
如有问题,欢迎批评指正。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐