VB.NET 三层登录系统实战:从设计到部署全流程详解

news2024/9/27 9:03:25

目录

前言:

什么是三层

为什么要用到三层:

饭店→软件

 理解:

过程:

1.三层包图:

2.数据库

3.三层项目

4.用户界面

5.添加引用

代码实现:

Entity层

BLL层

DAL层

UI层

总结:


前言:

什么是三层

三层就是把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。

简单的点来说:就是高内聚,底耦合的思想,不会牵一发而动全身。

为什么要用到三层:

 生活中饭店的例子来举例,大家可能会更理解一些。

:服务员只管接待客人

:厨师只管烹炒客人要的菜系

:采购员只管按照客人的需求来采购食材

  各司其职,共同协作为客人提供美食

问题:
为什么要需要这三种角色,为什么不合在一起,每个角色的功能的是分离的
举例:

服务员离职、请假→其他服务员代替

厨师离职→其他厨师代替

采购员离职→其他采购员代替

为什么能够替代,每个人的功能是一致,角色不行了替代就可以,如果合在一起就不好找人了。

饭店→软件

 理解:

   三层从生活到软件,不会因为谁的不在或离职,从而工作停掉,三层在软件中易是如此,每个层都有特定的职责和功能,不会因为需求改动从而需要修改整个系统,只需改其中一层的的代码,通过这种方式实现代码的模块化和维护性这就是所谓的三层

过程:

1.三层包图:

  包图用于描述逻辑架构—层、子系统、包等,所以拿包图在合适不过了。

2.数据库

3.三层项目

 

4.用户界面

5.添加引用

代码实现:

Entity层

Public Class eUserLogin
    Private strUserNo As String '定义一个私有字段,该字段的类型为String
    Private strPassword As String '
    Public Property Password() As String
        Get '获取属性值
            Return strPassword '返回strPassword的字符串变量的值
        End Get '结束方法
        Set(value As String) '接收一个名为"value"的字符串类型的参数
            strPassword = value '传递给StrPasswrod的字符串变量
        End Set '结束方法
    End Property

    Public Property UserNo() As String
        Get
            Return strUserNo
        End Get
        Set(value As String)
            strUserNo = value
        End Set
    End Property
End Class

BLL层

Imports System.Xml
Imports Login.DAL

Public 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返回消息
        Else
            MsgBox("登录成功,请稍后", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
            Return bUserInfo 'False 返回消息  
        End If
    End Function
End Class

DAL层

'单建了一类来放数据库连接
Imports System.Data.SqlClient

Public Class LinkeDAL
    Public 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 UserInfoDAL
    Public Function SelectUser(UserInfo As Entity.eUserLogin) As Entity.eUserLogin
        Dim 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 While
        Return duserInfo
        conn.Close() '关闭数据库 
    End Function
End Class

UI层

Imports System.Xml

Public Class Form1
    Private 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 = "" Then
                MsgBox("用户名不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
                Return
            End If
            '判断密码是否为空
            If txtPassWord.Text = "" Then
                MsgBox("密码不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
                Return
            End If
            '定义一个最终的返回体,returnUserInfo,承接经过D层查询,B层判断的登录信息
            '实例化BLL层的对象
            Dim bLogin As New LoginBLL.LoginBLL
            '调用B层的方法login
            bLogin.login(UserInfo)
        Catch ex As Exception '处理异常的代码
            MessageBox.Show(ex.Message.ToString) '返回一个字符串,表示异常的详细信息
        End Try '方法结束
    End Sub
    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        End
    End Sub
End Class

总结:

对于三层的理解还不是很透彻,还是需要多实践,理论明白了并不代表真正意义上的明白。

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

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

相关文章

python访问Wikipedia

import wikipedia # doc: https://pypi.org/project/wikipedia/def searchWikiPedia(keyword, language) -> str:wikipedia.set_lang(language)result wikipedia.page(keyword)return result.contentif __name__"__main__":# 设置语言https://meta.wikimedia.org…

Leetcode刷题详解——x的平方根

1. 题目链接:69. x 的平方根 2. 题目描述: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 **注意:**不允许使用任何内置指数函数和…

网站搬家的多种方法

网站搬家,把网站从一个服务器迁移到另一个服务器,涉及到网站文件和数据库的备份、上传、导入等操作,最重要的是备份网站,避免迁移出现问题无法恢复网站。 根据不同的情景和需求,网站搬家的方法有多种,下面…

什么是Docker CLI

Docker CLI(命令行界面)是一个工具,允许用户通过命令行或终端与Docker进行交互。Docker是一个开源平台,用于开发、运送和运行应用程序。Docker使用容器化技术来打包应用程序及其依赖项,以确保在不同环境中的一致性和隔…

Axure 9 使用 font awesome 字体发布原型

我使用的版本为Font awesome 6.1.1,安装后在axure中新增3个字体 如果直接发布,在没有安装Font awesome的电脑上无法正常显示字体图标,需要在发布前进行设置。 设置方法: 点击共享 点开设置 在字体设置页,填入图中所示…

golang小游戏:飞翔的小鸟

游戏开发总体思路 首先要选取一个合适的图形化界面进行开发。该项目选取的是 ebiten 一个用于创建2D游戏和图形应用程序的游戏引擎,提供了一些简单的GUI功能。 其次明确游戏设计思路。飞翔的小鸟共分为三个场景。 第一个场景就是游戏开始前的准备阶段&#xff0c…

微信小程序:点击按钮出现右侧弹窗

效果 代码 wxml <!-- 弹窗信息 --> <view class"popup-container" wx:if"{{showPopup}}"><view class"popup-content"><!-- 弹窗内容 --><text>这是一个右侧弹窗</text></view> </view> <…

【Spring】使用aop切面编程时要给那些类加注解

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理 Spring 中使用aop切面编程时要给那些类加注解 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一…

python 之运算符

文章目录 总的介绍代码例子 总的介绍 Python中有许多不同类型的运算符&#xff0c;它们用于执行各种操作&#xff0c;包括算术运算、比较、逻辑运算等。以下是Python中常用的运算符&#xff1a; 算术运算符&#xff1a; &#xff1a;加法&#xff0c;用于将两个数相加。-&…

PhpStorm快速注释与取消注释

ctrl / 单行注释 ctrl shift / 多行注释 重复以上操作&#xff0c;取消注释。

Slax Linux 获得增强的会话管理和启动参数选项

Slax Linux 的创建者和维护者托马斯-马特吉切克&#xff08;Tomas Matejicek&#xff09;在自己生日这天&#xff08;生日快乐&#xff01;&#xff09;发布了其小巧便携的 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强功能和错误修复。 新发布的 Slax Linux 版本&…

优雅的使用String字符串处理各种类型转换

文章目录 &#x1f31f; 优雅的使用String字符串处理各种类型转换&#x1f34a; 基本类型转字符串&#x1f34a; 字符串转基本类型&#x1f34a; 字符串与字符数组的转换&#x1f34a; 字符串与字节数组的转换&#x1f34a; 其他类型转字符串&#x1f34a; 总结 &#x1f4d5;我…

AIGC实战——深度学习 (Deep Learning, DL)

AIGC实战——深度学习 0. 前言1. 深度学习基本概念1.1 基本定义1.2 非结构化数据 2. 深度神经网络2.1 神经网络2.2 学习高级特征 3. TensorFlow 和 Keras4. 多层感知器 (MLP)4.1 准备数据4.2 构建模型4.3 检查模型4.4 编译模型4.5 训练模型4.6 评估模型 小结系列链接 0. 前言 …

UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

目录 0 引言1 全局对象&#xff08;全局变量&#xff09;1.1 游戏实例 GameInstance1.1.1 介绍1.1.2 使用 GameInstance 1.2 玩家控制器 PlayerController1.3 游戏世界类 UWorld &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&…

Vue3.3指北(二)

Vue3.3指北 Vue31、组件基础1.1、全局组件1.2、局部组件1.3、组件的命名1.4、组件的数据存放1.5、组件标签化 2、父组件向子组件传递数据2.1、props2.2、动态props2.3、props传数组2.4、props传对象2.4.1、默认值和必传值 3、子组件向父组件传递数据4、父子组件互相访问4.1、父…

[SQL开发笔记]AND OR运算符复杂表达式开发实例

结合 AND & OR实例&#xff1a;通过圆括号使用and或or来组成复杂的表达式 目标数据库及表&#xff1a;使用 DRobot数据库&#xff0c;"T_Drobot" 表 假设我们需要查询"T_Drobot" 表&#xff0c;并从"T_Drobot"表中查询选取creator为 "…

腾讯云 AI 绘画:文生图、图生图、图审图 快速入门

腾讯云 AI 绘画是腾讯云推出的一款基于人工智能的图像生成和编辑产品&#xff0c;能够根据输入的图片或描述文本&#xff0c;智能生成与输入内容相关的图片&#xff0c;支持多样化的图片风格选择。 在本文中&#xff0c;我们将介绍如何使用腾讯云 AI 绘画的三项主要功能&#…

24装饰器

目录 1、一些案例导入&#xff1a;这个要求必须是&#xff0c;在发东西之前有那个登录验证 2、开始理装饰器的一些原理了 3、最后就是把代码再简洁一些了 1、一些案例导入&#xff1a;这个要求必须是&#xff0c;在发东西之前有那个登录验证 def fss():print(发说说) def ft…

Elasticsearch(十五)搜索---搜索匹配功能⑥--基于地理位置查询

一、前言 随着互联网的热门&#xff0c;越来越多的传统行业将全部或者部分业务转移到互联网上&#xff0c;其中不乏一些和地理位置强相关的行业。基于地理位置的搜索功能&#xff0c;大大提升了人们的生活和工作效率。例如&#xff0c;外出旅行时&#xff0c;只需要用手机打开…

cuda卸载

去查看你的电脑显卡对应的cuda版本&#xff0c;不然还是一整个用不到gpu的情况嘿嘿. 啊啊啊啊打开控制面板看一下&#xff0c;驱动不要乱卸载&#xff1a; 这些东西不能全部卸载了哦&#xff0c;只能卸载含有“CUDA”的那几个&#xff08;其实其他的可能也没有用 但是不懂的哇 …