UBD分层结构的学生信息管理系统(python+pysimplegui+mysql)

news2024/11/15 13:23:17

目录

作者的吐槽

介绍流程

UBD的结构

UBD的流程图(也称不上流程图吧)

UBD的优缺点

优点

缺点

系统

设计结构

UI

UI的一些图片

UI的代码

Business

数据库的连接(json)

Data

总结


作者的吐槽

当知道UBD分层结构之后,我的大脑一阵疯狂运转,不过只是大概了解了流程,当我尝试去修改我的上一版系统之后,我已经不想说什么了,我自己写的都是什么玩意,我真**,让我把一堆抽象个什么,然后就是倔强的尝试;最终,成功的实现了,只去复用了数据库连接的一部分代码,然后非常“高兴”的重构了几次项目,这是我第一次重构这么多次,足足有着5次,一个小小的学生信息管理系统因为一个分层结构,让我重构了这么多次,最后写出来的东西和上一版几乎是完全不一样。

介绍流程

先介绍UBD结构再介绍相关的代码

UBD的结构

“U”指的是页面层,也叫做UI层,用来写展示给用户的内容(如登录界面,菜单界面等)

“B”指的是业务逻辑层,即BLL,用来写实现登录等功能的逻辑

“D”指的是数据访问层,即DAL,用来访问数据库/数据容器中的数据

层次共同点

不同点

UI(用户界面层)都是软件系统架构的一部分,共同协作来实现整个软件系统的功能。主要负责与用户进行交互,将用户的操作转化为对系统的请求,并将系统的响应结果以合适的形式展示给用户。通常使用图形界面、命令行界面等形式呈现,关注用户体验和界面友好性。比如网页界面、桌面应用程序界面等。
BLL(业务逻辑层)处于 UI 层和 DAL 层之间,对业务逻辑进行封装和处理。包含各种业务规则、流程控制、数据验证等操作,将用户的请求进行业务层面的处理和协调,决定数据如何在系统中流动和处理,不直接涉及数据的存储和读取细节。例如订单处理中的折扣计算、库存检查等业务规则的实现。
DAL(数据访问层)专注于与数据存储进行交互,负责数据的读取、写入、更新、删除等操作。具体实现与数据库(如关系型数据库、非关系型数据库等)或其他数据存储介质的交互,提供数据访问的接口和方法供上层调用,对上层隐藏数据存储的具体细节和实现方式。比如使用 SQL 语句或者特定的数据访问框架来操作数据库。

UBD的流程图(也称不上流程图吧)

说他是流程图的话太高看了,说不是的话也走了一个流程,徒手画的,虽丑但是“我”画的

UBD的优缺点

优点

1.高内聚低耦合。很明显,在使用这种结构的时候,可以体现出来面向对象的强大之处,要用这个就直接调用就完了,耦合程度低是因为把结构划分为这三层,那代码之间互不影响,其他人来用也可以很轻松就可以用了。

2.可复用性强。我在重构的时候,重构的后面几次就可以把我的页面和数据访问层直接拿过去,不断的梳理逻辑。虽然我的主观性在这里体现的比较强,但是确实可以直接拿过去用。

3.可扩展性比较好。这个我有点体会,但是不多,就是在设计的时候,设计了注册老师的方法,虽然最后没用,但是这个时候,如果我去把校长这个类创建出来,之后我就可以直接去设计逻辑然后直接就可以去数据访问层,虽然我没有去接着写,但是我体会到了这个感觉,有机会还是会不断完善我的第一个UBD结构的管理系统。

缺点

1.很明显,它以前的两层结构,页面直接到数据访问,现在穿插了一个业务逻辑,对性能极大可能的存在更多的消耗

2.设计的明显有点过度了,很多都可以两层直接完成,UBD结构的数据访问通过用户类去访问,每次都要去get、set明显会更麻烦,但是查了查资料,知道当数据量大就出问题了。

也就是小型的项目设计很可能会有些过度了。

系统

设计结构

前前后后一共使用到了12个py文件,一个json文件(用来存储mysql环境)

UI

这一层我是这样设计的,每一个界面设计为一个py文件,这些页面的py文件就放到Userface这个包里,然后一个页面对应一个业务逻辑。

UI的一些图片

第一个图片有没有种相似的感觉,哈哈哈哈哈哈,日常....蓝、浅蓝、红

UI的代码

实现这个玩意简单的很,虽然我做的很丑,真想不明白为什么其他人就做的那么好看,可以了,代码写出来简单的很,都用不了几个控件

layout = [
            [sg.T('学号', font=('宋体', 18)),
             sg.InputText('', tooltip='请输入学号, 在增加功能的时候学号无用', font=('宋体', 18), size=(10, 8),
                          key='id'),
             sg.T('姓名', font=('宋体', 18)),
             sg.InputText('', tooltip='请输入姓名(不要输的太长)', key='name', font=('宋体', 18), size=(10, 8)),
             sg.T('年龄', font=('宋体', 18)),
             sg.InputText('', tooltip='请输入年龄', key='age', font=('宋体', 18), size=(10, 8))],
            [sg.T('性别', font=('宋体', 18)), sg.Combo(['男', '女'], key='gender', size=(10, 8)),
             sg.T('班级', font=('宋体', 18)),
             sg.Combo(['1班', '2班'], key='classroom', size=(10, 8)), sg.T('专业', font=('宋体', 18)),
             sg.Combo(['软件工程', '物联网工程', '网络工程', '大数据'], key='major', font=('宋体', 18), size=(10, 8))],
            [sg.B('增加', key='add', size=(5, 5)), sg.B('删除', key='delete', size=(5, 5)),
             sg.B('修改', key='update', size=(5, 5)), sg.B('查询', key='find', size=(5, 5)),
             sg.B('刷新', key='furnish', size=(5, 5))],
            [sg.Table(result_all,
                      list_Text,
                      def_col_width=10,
                      num_rows=20,
                      row_height=40,
                      max_col_width=200,
                      justification='c',
                      auto_size_columns=False,
                      font=('宋体', 13),
                      key='table',
                      enable_events=True
                      # enable_click_events=True
                      )]
        ]
        window = sg.Window('菜单', layout, size=(800, 800), element_justification='c')

Business

业务逻辑能说的就相对UI多了

首先要满足登录的逻辑,先连接一下数据库,然后去读取出来user表的全部数据,因为fetchall方法取出来的是元组嵌套元组,所以我直接用for循环然后遍历出来每个元组,然后因为在user表中,我只设计了username和password两个column,所以我使用了他的下标,然后判断是不是和用户输入的信息相同,相同则进入菜单,不同就显示弹窗告知它错误。

代码如下:

result = query.login_get_query()
# 取出来的值是元组嵌套元组,然后每个元组有两个数据,第一个是username第二个是password
for i in result:
    if values['username'] == i[0] and values['password'] == i[1]:
        window.close()
        menu.welcome()
        menu.menuGui()
        break
# 因为for循环else的缩进很关键就直接把它放好
else:
    menu_click.Error_message()

然后就是菜单的逻辑了,增删改查没什么好说的,比较有意思的就是回显功能了,点击表格内容会实现回显数据到输入框,通过的是pysimplgui的Table控件,然后其他的一些业务就没必要了 , 主要就是通过取出来这一行的全部数据,然后一次针对下标添加到输入框之中,虽然下标比较多,但是,这些代码摁这里就不懂了,能跑出来就行了。。

    def table(self, result_all, values, window):
        # self.furnish(window)
        if values['table']:
            select_row = values['table'][0]
            select_item = result_all[select_row][0]
            window['id'].update(select_item)
            select_row = values['table'][0]
            select_item = result_all[select_row][1]
            window['name'].update(select_item)
            select_row = values['table'][0]
            select_item = result_all[select_row][2]
            window['gender'].update(select_item)
            select_row = values['table'][0]
            select_item = result_all[select_row][3]
            window['classroom'].update(select_item)
            select_row = values['table'][0]
            select_item = result_all[select_row][4]
            window['age'].update(select_item)
            select_row = values['table'][0]
            select_item = result_all[select_row][5]
            window['major'].update(select_item)

            # 后续代码
        else:
            # 处理表格为空或者没有选中行的情况
            print('现在的表格为空')

数据库的连接(json)

设计一个json文件用来存储MySQL的环境,然后通过静态方法把他读出去,然后其他类中创建对象,然后调用连接数据库的函数去创建游标,然后写sql语句

import json
import pymysql


class DatabaseConnect:
    _json_config = None

    @classmethod
    def load(cls, json_path=r'E:\UBD_3\database_login.json'):
        if not cls._json_config:
            with open(json_path, 'r') as f:
                cls._json_config = json.load(f)
                # print(_json_config)

    def __init__(self):
        try:
            self.load()
            # self.connect_database()
        except Exception as e:
            print('初始化过程错误' + str(e))

    def connect_database(self):
        try:
            db = pymysql.connect(
                host=self._json_config['host'],
                port=self._json_config['port'],
                user=self._json_config['username'],
                password=self._json_config['password'],
                charset=self._json_config['charset'],
                database=self._json_config['database']
            )
            print('数据库连接成功')
            return db
        except pymysql.Error as e:
            print(f"数据库连接异常: {type(e).__name__}: {e}")

Data

嗯,很快就到数据访问层了,这一层的存在,用来调用数据的访问的方法,然后实现对数据库的增删改查,针对业务中的增删改等功能,使用了student类的get、set方法,然后传递参数。

想了想还是觉得该有一点代码:如下分别为定义类和调用类的方法

class Student(User):
    def __init__(self):
        self._student_classroom = None
        self._student_major = None


    def get_classroom(self):
        return self._student_classroom

    def set_classroom(self, value):
        if isinstance(value, str):
            self._student_classroom = value
            return value
        else:
            raise ValueError('异常,不是str')

总结

这一周的时间基本都是在紧迫的催着完成,但是我也知道为什么要花这么久时间在这里,我还是很幸运的呢,自己慢慢的还是把这个写出来了,如有错误,随时指教,我掌握的还不是很好,如果有错误,请您动一动尊贵的手指评个论,指点一下小弟,感激不尽。

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

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

相关文章

西安产业园排名新趋势,西安国际数字影像产业园以创新驱动发展?

近年来,随着数字经济的快速发展,西安产业园排名也在不断变化。其中,西安国际数字影像产业园凭借其卓越的创新能力和前瞻性的发展战略,迅速崭露头角,成为西安乃至全国数字影像产业的重要推动力量。那么,西安…

elementPlus中el-table的每列两行溢出隐藏怎么设置

el-table的每列两行溢出隐藏怎么设置 elementPlus中的el-table如何设置多行溢出隐藏table中的table属性中有show-overflow-tooltip属性,但是只支持单行溢出隐藏如何改成两行呢?在审查元素中我们发现.el-tooltip这个类名是溢出隐藏的样式,原本…

lvs项目

实验环境 LVS:Linux Virtual Server,负载调度器,内核集成章文嵩,阿里的四层SLB(ServerLoadBalance)是基FLVSkeepalived实现。 一、lvs-net模式 搭建环境以及网络配置 给lvs地址 修改eth1 lvs中打开内核路由功能 sysctl -a | greo ip_forwa…

【总】前端 Swagger url 自动转 JavaScript方法(避免重复工作...)

前言 随着项目增多,且多数为项目定制化接口。避免前端重复封装,从 Swagger 入手,将 url 自动转 js 方法直接用。特别节约时间和资源~ Swagger 简介 Swagger 一款 RESTFUL 接口的、基于 YAML、JSON 语言的文档在线自动生成、代码自动生成的…

Metasploit——强大的渗透测试框架

一、引言 在网络安全领域,渗透测试是评估系统安全性的重要手段。而 Metasploit 作为一款知名的渗透测试框架,为安全研究人员和测试人员提供了强大的工具和资源。本文将详细介绍 Metasploit 的特点、功能、使用方法以及在实际场景中的应用。 二、Metasp…

cad文字转arcgis注记

cad中文字转为arcgis注记,步骤如下: 1、将dwg文件下annotation文件加到图层中 2、文件点击右键,转换地理数据库注记 3、 导入默认地理数据库中,或自己新建地理数据库,起个文件名、点确定(注意&#xff1a…

Codeforces Round 916 (Div. 3) D 题 Three Activities

题目描述 Winter holidays are coming up. They are going to last for nn days. During the holidays, Monocarp wants to try all of these activities exactly once with his friends: go skiing;watch a movie in a cinema;play board games. Monocarp knows that, on …

Mysql主从脚本

注意:先执行从服务器的脚本,再执行主服务器脚本 执行脚本时,务必使用source 脚本名称执行脚本 两个脚本都运行完之后 主服务器配置 从服务器配置

Machine-Learning 机器学习

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

DatenLord前沿技术分享 No.40

达坦科技始终致力于打造高性能 Al Cloud 基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AICloud 的需求。 在本…

AI全息手术:未来医疗的奇迹,你准备好了吗?

想象一下,未来的手术室中,医生们不再依赖二维的X光片或CT扫描,而是通过空中悬浮的三维全息影像,直观地观察和操作人体内部结构。这并非科幻电影中的场景,而是正在成为现实的AI全息影像手术技术。 手术室中的三维魔法 传…

SOEM 源码解析 ecx_eeprom_waitnotbusyAP

/* 在超时时间内、设置EEprom 状态机忙位busy→idle、APRD方法* param[in] context context struct* 上下文结构体* param[in] aiadr auto increment address of slave* 从站自增地址* param[in] timeout …

Java数据结构 | 树的常见习题一(考研题、面试题)

树的常见练习题一 1、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足( )2、在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有&…

全志平台串口编号更改记录 A133 T527 T133 A523 A527串口编号更改

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3. 情况讨论 4.代码修改 5.彩蛋 1.前言 在嵌入式开发中,更改串口编号是一种常见的操作,以满足特定的硬件配置或调试需求。根据我们之前的文章 android13 串口编号修改 串口名修改-CSDN博客 在全志平台下面使…

如何成为具有竞争力的智能电表厂家

要成为具有竞争力的智能电表厂家,需要在多个方面进行深入布局和持续优化。以下是从市场定位、技术创新、产品质量、销售策略、客户服务以及合作伙伴关系等六个方面进行的详细分析: 一、明确市场定位与目标 市场细分:智能电表厂家需要明确自己…

未发先火,Smartbi AIChat频频“出圈”

近日,思迈特正式官宣,将于8月8日线上新品发布会上推出自研的全新AI应用——Smartbi AIChat,这款应用在还未正式推向市场前,已获得媒体、分析机构等多方关注,热度飙升,思迈特软件及其新品再一次成为业界内外…

RabbitMq如何确保消息不丢失

问题:在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递…

RLVF:避免过度泛化地从口头反馈中学习

人工智能咨询培训老师叶梓 转载标明出处 大模型在不同行业和个人中的广泛应用要求模型能够根据具体的用户反馈进行调整或定制,以满足细微的要求和偏好。虽然通过高层次的口头反馈来指定模型调整非常方便,例如“在给老板起草电子邮件时不要使用表情符号”…

Ubuntu 20.04 几种微信安装错误汇总,最后成功

1. wine 安装 参考 Ubuntu 20.04.2 LTS安装 最新版 微信(wine) 1.1 连网下载文件 在终端执行 winetricks riched20下载不了 W2KSP4_EN.EXE 和 InstMsiW.exe 两个文件 可以网页端下载,或者 wget https://web.archive.org/web/2000/https:…

MySQL——数据库的设计、事务、视图

文章目录 数据库的设计1.多表之间的关系2.实现关系3.数据库设计的范式 事务1.事务的基本介绍2.事务的四大特征ACID3.事务的隔离级别(了解即可) 视图1.什么是视图?2.视图创建及使用方法3.注意事项4.为什么使用视图 数据库的设计 1.多表之间的…