VB.NET 三层登录系统实战:从设计到部署全流程详解
目录
前言:
什么是三层
为什么要用到三层:
饭店→软件
理解:
过程:
1.三层包图:
2.数据库
3.三层项目
4.用户界面
5.添加引用
代码实现:
Entity层
BLL层
DAL层
UI层
总结:
前言:
什么是三层
三层就是把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
简单的点来说:就是高内聚,底耦合的思想,不会牵一发而动全身。
为什么要用到三层:
生活中饭店的例子来举例,大家可能会更理解一些。

:服务员只管接待客人
:厨师只管烹炒客人要的菜系
:采购员只管按照客人的需求来采购食材
各司其职,共同协作为客人提供美食
问题:
为什么要需要这三种角色,为什么不合在一起,每个角色的功能的是分离的
举例:
服务员离职、请假→其他服务员代替
厨师离职→其他厨师代替
采购员离职→其他采购员代替
为什么能够替代,每个人的功能是一致,角色不行了替代就可以,如果合在一起就不好找人了。
饭店→软件

理解:
三层从生活到软件,不会因为谁的不在或离职,从而工作停掉,三层在软件中易是如此,每个层都有特定的职责和功能,不会因为需求改动从而需要修改整个系统,只需改其中一层的的代码,通过这种方式实现代码的模块化和维护性这就是所谓的三层
过程:
1.三层包图:
包图用于描述逻辑架构—层、子系统、包等,所以拿包图在合适不过了。

2.数据库

3.三层项目

4.用户界面

5.添加引用

代码实现:
Entity层
Public Class eUserLoginPrivate strUserNo As String '定义一个私有字段,该字段的类型为StringPrivate strPassword As String 'Public Property Password() As StringGet '获取属性值Return strPassword '返回strPassword的字符串变量的值End Get '结束方法Set(value As String) '接收一个名为"value"的字符串类型的参数strPassword = value '传递给StrPasswrod的字符串变量End Set '结束方法End PropertyPublic Property UserNo() As StringGetReturn strUserNoEnd GetSet(value As String)strUserNo = valueEnd SetEnd Property
End Class
BLL层
Imports System.Xml
Imports Login.DALPublic Class LoginBLL'UserInfo用来承载登录时输入的用户名和密码,全局实体Public Function login(ByVal UserInfo As Entity.eUserLogin) As Entity.eUserLogin'实例化D层Dim dLogin As New Login.DAL.UserInfoDAL'定义B层的返回实体Dim bUserInfo As New Entity.eUserLogin'调用D层SelectUser方法bUserInfo = dLogin.SelectUser(UserInfo) '执行一个名为SelectUser的方法,并将其返回值赋给"bUserInfo"的布尔型变量If (bUserInfo.UserNo Is Nothing Or bUserInfo.Password Is Nothing) Then '判断bUserInfo.UserNo和bUserInfo.Password是否为空Throw New Exception("用户名或密码错误,请查看") 'True返回消息ElseMsgBox("登录成功,请稍后", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")Return bUserInfo 'False 返回消息 End IfEnd Function
End Class
DAL层
'单建了一类来放数据库连接
Imports System.Data.SqlClientPublic Class LinkeDALPublic Shared Function connstring() As String'连接数据库字符串connstring = "Server= 192.168.96.71;Database=cybercafe;User ID=sa;Password=123456;"End Function
End Class
Imports System.Data.SqlClient
Imports Login
Public Class UserInfoDALPublic Function SelectUser(UserInfo As Entity.eUserLogin) As Entity.eUserLoginDim conn As New SqlConnection(LinkeDAL.connstring)'打开数据库conn.Open()'创建一个名为"reader"的SqlDataReader对象'(SqlDataReader)是一种.NET Framework中的数据读取器,用于从Microsoft SQL Server数据库中读取数据 Dim reader As SqlDataReader'D层实例化执行查询后返回实体Dim duserInfo As New Entity.eUserLogin'查询语句Dim sql As String = "Select * from User_Info where UserNo=@UserNo and Password=@Password"'创建一个名为"cmd"的SqlCommand对象,并将其初始化指定的SQL语句和数据库连接对象。 'SqlCommand是一个.NET Framework中的类,用于执行SQL语句并返回查询结果Dim cmd As New SqlCommand(sql, conn)'向SQL语句添加一个命名参数,就将"@UserNo"的参数添加一个值,这个值来自一个名为UserInfo的对象 '@符作为参数的前缀,可以让SQL语句更容易区分参数和普通参数的文本。同时,@符号可以让SQL语句更易于阅读和理解cmd.Parameters.Add(New SqlParameter("@UserNo", UserInfo.UserNo))cmd.Parameters.Add(New SqlParameter("@Password", UserInfo.Password))'执行查询语句并将结果以DataReader对象的形式返回,以供后续的数据处理和操作reader = cmd.ExecuteReader()'循环语句它会在SqlDataReader对象中有下一行数据时执行,在每次循环中,我们将使用SqlDataReader对象的一些方法(如GetString、GetInt32等)来获取当前行的数据,并将其存储在相应的变量中。While (reader.Read())'循环来逐行查询结果。每次循环中,我们使用read.GetString()来获取查询结果中第一列的字符串,并赋值给duseInfo对象的UserNo属性duserInfo.UserNo = reader.GetString(0)duserInfo.Password = reader.GetString(1)End WhileReturn duserInfoconn.Close() '关闭数据库 End Function
End Class
UI层
Imports System.XmlPublic Class Form1Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click '单击事件Try'实例化传实体的对象Dim UserInfo As New Entity.eUserLogin'将用户名和密码放入实体,文本框中的字符串去除空格并赋给实体对象UserInfo,使实体对象能够带上参数UserInfo.UserNo = txtUserName.Text.Trim()UserInfo.Password = txtPassWord.Text.Trim()'判断账号否为空If txtUserName.Text = "" ThenMsgBox("用户名不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")ReturnEnd If'判断密码是否为空If txtPassWord.Text = "" ThenMsgBox("密码不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")ReturnEnd If'定义一个最终的返回体,returnUserInfo,承接经过D层查询,B层判断的登录信息'实例化BLL层的对象Dim bLogin As New LoginBLL.LoginBLL'调用B层的方法loginbLogin.login(UserInfo)Catch ex As Exception '处理异常的代码MessageBox.Show(ex.Message.ToString) '返回一个字符串,表示异常的详细信息End Try '方法结束End SubPrivate Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.ClickEndEnd Sub
End Class
总结:
对于三层的理解还不是很透彻,还是需要多实践,理论明白了并不代表真正意义上的明白。
相关文章:
VB.NET 三层登录系统实战:从设计到部署全流程详解
目录 前言: 什么是三层 为什么要用到三层: 饭店→软件 理解: 过程: 1.三层包图: 2.数据库 3.三层项目 4.用户界面 5.添加引用 代码实现: Entity层 BLL层 DAL层 UI层 总结: 前言: 什么是三层 三层就是把各个功能模块划分为表示层&#…...
【前端性能】性能优化手段-高频面试题
持续更新.............................最近更新2023/10/24 1. 讲一下png8、png16、png32的区别,并简单讲讲 png 的压缩原理 PNG8、PNG16、PNG32 是 PNG 图像格式的不同变种,它们主要区别在于颜色深度和透明度支持的不同。 区别 PNG8: PN…...
cleanmymacX4.14免费版mac清除浏览器缓存软件
当我们使用浏览器访问网站时,浏览器会自动缓存一些数据,比如网页缓存、DNS缓存、插件缓存、SSL证书缓存和Cookie缓存等。虽然有些缓存可以提高浏览器的使用体验,但是缓存过多也会导致一些问题,比如网页更新后浏览器仍然显示旧的内…...
分享个包含各省、市、区的编码数据的在线静态资源脚本
在翻《SpringBootVue3》——十三尼克陈作者的大型前后端分离项目实战里面,在看到地址管理的部分时,发现了该作者记录有一个静态的地址资源脚本 这里做个记录,打点 一、引入js <script src"https://s.yezgea02.com/1641120061385/td…...
Elasticsearch聚合----aggregations的简单使用
文章目录 Getting started1、搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄,但不显示这些人的详情2、size0不展示命中记录,只展示聚合结果3、按照年龄聚合,并且请求这些年龄段的这些人的平均薪资4、查出所有年龄分布,…...
GOPS·2023上海站 | 提前剧透!阿里、腾讯、字节、擎创等专家齐聚上海,共话互联网运维
一、前言 2023年10月26日-27日,第二十一届 GOPS 全球运维大会 2023 上海站即将举行。作为年终前最后一场面向 IT 技术从业者的高端运维盛会。大会上,来自腾讯、阿里、字节跳动、抖音、美团、擎创科技等明星专家,将带来十大互联网行业精彩主…...
防关联浏览器推荐:MuLogin指纹浏览器安全登录多平台账号
在现今的数字时代,我们的生活离不开互联网。我们使用在线平台进行银行交易、购物、社交媒体互动和其他各种活动。为了保护个人隐私和账号安全,我们需要寻找一种安全且方便的方式来管理我们的在线账号。MuLogin指纹浏览器正是为了满足这些需求而设计的一款…...
部署SeaTunnel单节点Standalone 模式环境
1.前置准备: SeaTunnel支持运行在JDK8及以上环境。该步骤需要用户自行安装JDK环境。 2.下载安装包 本次部署使用的是2.3.1版本。如果你需要下载其它版本,可以从如下网址中查询对应的版本。 Apache SeaTunnel mkdir ~/seatunnel cd ~/seatunnelwget https://dl…...
二十三、设计模式之组合模式![
目录 二十三、设计模式之组合模式能帮我们干什么?主要解决什么问题?优缺点优点缺点: 使用的场景理解实现角色组合模式 总结 魔战已经完结。成功登顶。占领敌军最高峰。 二十三、设计模式之组合模式 “组合模式”也被称为“部分整体模式”该…...
hbase和aerospike基础概念及所对应的python包API使用
Hbase Hbase shell常用操作 1.创建表 create table name,column familytable name:表名 column family:列族名 2.查看所有表名称 list3.插入操作 put table name,row1,column family:column name,valuerow1:行键(即Row Key) column family:column name…...
监测难?误差大?北斗突破铁路监测预警难题,24小时全方位守护
受极端气象和复杂地形地质条件的影响,近年来铁路沿线地质灾害易发频发。为防范化解重大安全风险,提高自然灾害防治能力,国务院决策部署制定了《关于加强铁路自然灾害监测预警工作的指导意见》,强调了利用先进技术和手段开展各类自…...
kafka入门03——简单实战
目录 安装Java 安装Zookeeper 安装Kafka 生产与消费 主要是记录下Kafka的安装配置过程,前置条件需要安装jdk和zookeeper。 安装Java 1.Oracle官网下载对应jdk安装包 官网地址:Java Downloads | Oracle 好人分享了下载需要的oracle账号,…...
工作两年,本地git分支达到了惊人的361个,该怎么快速清理呢?
说在前面 不知道大家平时工作的时候会不会需要经常新建git分支来开发新需求呢?在我这边工作的时候,需求都是以issue的形式来进行开发,每个issue新建一个关联的分支来进行开发,这样可以通过issue看到一个需求完整的开发记录&#x…...
行业追踪,2023-10-24
自动复盘 2023-10-24 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
【成功实现】CentOS磁盘扩容
对服务器磁盘扩容操作步骤 查看磁盘信息 fdisk -l 创建新分区 fdisk /dev/sda P n p … t 回车 8e w 重启虚拟机 reboot mkfs.ext4 /dev/sda4 查看磁盘信息 fdisk -l 创建物理卷 pvcreate /dev/sda4 y 创建卷组 并绑定物理卷 vgcreate centos /dev/sda4 创建逻辑…...
为什么亚马逊卖家一定要有独立站?新手低成本快速搭建跨境电商独立站完整图文教程
效果展示 翻译助手 一、购买域名 二、购买主机托管 三、搭建独立网站 四、网站装修设计 五、网站迁移 六、补充 前言:为什么亚马逊卖家一定要有独立站? 先来谈谈为什么亚马逊卖家一定得有独立站,从我一些个人经历来看,有独…...
spring Environment上下文环境参数变量
spring通过Environment对象来存储上下文环境变量信息,即包含当前系统环境变量也包含配置文件配置变量。Environment作为一个bean被存放在容器中,可以在需要的地方进行依赖注入直接使用。 Environment的创建 以AnnotationConfigApplicationContext容器类…...
【数据库】组合查询 UNION
组合查询 概述组合查询UNIONUNION ALLINTERSECTEXCEPT 概述 组合查询允许将两个或多个查询的结果合并成一个单一的结果集。组合查询分类包括 UNION、UNION ALL、INTERSECT 和 EXCEPT 来合并查询结果。下述不同的组合查询; 下述示例中将使用的表:Illino…...
Spring Boot配置 application.yml,根据application.yml选择启动配置
在Spring Boot 中可以选择applicant.properties 作为配置文件,也可以通过在application.yml中进行配置,让Spring Boot根据你的选择进行加载启动配置文件。 这种配置方式,我们通常在实际开发中经常使用,主要为了发布版本和以及开发…...
一文了解GC垃圾回收
一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链,如果有,不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏:原本需要被回收的对象&#…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
