接下来我们来写三层架构
三层架构:
1. 表现层(Presentation Layer):
技术选择:ASP.NET MVC、ASP.NET Core MVC、Blazor等。
作用:负责用户界面的呈现和用户交互。在这一层,用户可以与系统进行交互,发出请求并接收响应。表现层通常包括视图(View)和控制器(Controller),负责接收用户输入并调用适当的服务层方法。
2. 业务逻辑层(Business Logic Layer):
技术选择:通常是C#类库(Class Libraries)或者专用的服务层项目。
作用:处理业务逻辑和规则。这一层包括应用程序的业务逻辑,例如订单处理、支付逻辑、权限控制等。业务逻辑层接收来自表现层的请求,协调各种操作,并调用数据访问层来检索或保存数据。
3. 数据访问层(Data Access Layer):
技术选择:通常使用Entity Framework、ADO.NET等技术。
作用:负责与数据存储(通常是数据库)交互。数据访问层处理与数据的交互,包括从数据库中检索数据、向数据库中写入新数据或更新现有数据等操作。这一层将数据库查询和更新功能封装起来,使得业务逻辑层不需要直接处理数据库细节。
配置三层架构
4.打开vs
5.新建项目 SaleSys
6. 右键解决方案,添加,新建项目Model
7.给class1重命名为UserType
8.
/// <summary>
/// 实体类:用户类型
/// </summary>
public class UserType
{
// 类型Id
public int Id { get; set; }
// 类型
public string TypeName { get; set; }
}
9. 添加,新建项Users
10.
/// <summary>
/// 实体类:用户
/// </summary>
public class Users
{
// Id, Name, Sex, Address, Phone, Mail, CardId, NickName, Pwd, State, TypeId
// 用户Id
public int Id { get; set; }
// 用户姓名
public string Name { get; set; }
// 用户性别
public bool Sex { get; set; }
// 用户地址
public string Address { get; set; }
// 用户电话
public string Phone { get; set; }
// 用户邮箱
public string Mail { get; set; }
// CardId
public int CardId { get; set; }
// NickName
public string NickName { get; set; }
// Pwd
public string Pwd { get; set; }
// State 当前状态
public int State { get; set; }
// 外键 TypeId
public int TypeId { get; set; }
}
11.右键解决方案,添加,新建项目,新建类库SaleSysDAL
12. 给class1重命名为dbHelp
13.引包
using System.Data;
using System.Data.SqlClient;
14.
public class dbHelp
{
// 1.数据库连接字符串
public static SqlConnection GetConnection()
{
SqlConnection conn = new SqlConnection("server=.;database=SqlQuery1;uid=sa;pwd=sa;");
// 判断,数据库连接的状态,如果当前是关闭状态
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}else if (conn.State == ConnectionState.Broken) // 中断状态
{
conn.Open();
}else if (conn.State == ConnectionState.Open) // 打开状态
{
conn.Close();
}
// 返回对象
return conn;
}
// 2.执行单项数据库访问操作:insert into / update / delete
public static int ExecutSql(string sql)
{
SqlCommand cmd = new SqlCommand(sql, GetConnection());
return cmd.ExecuteNonQuery();
}
// 3.执行数据库读取操作,返回SqlDataReader容器
public static SqlDataReader GetReader(string sql)
{
SqlCommand cmd = new SqlCommand(sql, GetConnection());
return cmd.ExecuteReader();
}
// 4.执行数据读取操作,返回DataTable数据源
public static DataTable GetTable(string sql)
{
SqlDataAdapter sda = new SqlDataAdapter(sql, GetConnection());
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
// 5.执行数据查询操作
public static object GetScalar(string sql)
{
SqlConnection conn = new SqlConnection("server=.;database=SqlQuery1;uid=sa;pwd=sa;");
SqlCommand cmd = new SqlCommand(sql, GetConnection());
return cmd.ExecuteScalar();
}
}
15. 添加,新建类UsersDAL
16.右键引用,添加引用
17.在UsersDAL.cs中,引包
using Model;
using System.Data;
18.
public class UsersDAL
{
// 1.根据用户名查询用户信息
public Users GetUsersByName(string name)
{
// 查询到当前用户名,并把值赋值在sql变量中
string sql = "select * from Users where Name='"+ name +"'";
// 获取当前用户名的用户信息
DataTable dt = dbHelp.GetTable(sql);
// 判断,当前数据表不等于空,并且数据表中的行数 > 0
if (dt != null && dt.Rows.Count > 0)
{
// 获取当前用户信息的行集合(也就是有几个字段)
DataRow dr = dt.Rows[0];
// 获取当前用户的字段信息
Users users = new Users()
{
Id = Convert.ToInt32(dr["Id"]),
Name = dr["Name"].ToString(),
Sex = Convert.ToBoolean(dr["Sex"]),
Address = dr["Address"].ToString(),
Phone = dr["Phone"].ToString(),
Mail = dr["Mail"].ToString(),
CardId = Convert.ToInt32(dr["CardId"]),
NickName = dr["NickName"].ToString(),
Pwd = dr["Pwd"].ToString(),
State = Convert.ToInt32(dr["State"]),
TypeId = Convert.ToInt32(dr["TypeId"]),
};
return users;
}
return null;
}
// 2.根据Id查询用户信息
public Users GetUsersById(int id)
{
// 查询到当前Id,并把值赋值在sql变量中
string sql = "select * from Users where Id='" + id + "'";
// 获取当前Id的用户信息
DataTable dt = dbHelp.GetTable(sql);
// 判断,当前数据表不等于空,并且数据表中的行数 > 0
if (dt != null && dt.Rows.Count > 0)
{
// 获取当前用户信息的行集合(也就是有几个字段)
DataRow dr = dt.Rows[0];
// 获取当前用户的字段信息
Users users = new Users()
{
Id = Convert.ToInt32(dr["Id"]),
Name = dr["Name"].ToString(),
Sex = Convert.ToBoolean(dr["Sex"]),
Address = dr["Address"].ToString(),
Phone = dr["Phone"].ToString(),
Mail = dr["Mail"].ToString(),
CardId = Convert.ToInt32(dr["CardId"]),
NickName = dr["NickName"].ToString(),
Pwd = dr["Pwd"].ToString(),
State = Convert.ToInt32(dr["State"]),
TypeId = Convert.ToInt32(dr["TypeId"]),
};
return users;
}
return null;
}
// 3.根据Id删除用户信息
public int DeleteById(int id)
{
string sql = "delete Users where Id=" + id;
return dbHelp.ExecutSql(sql);
}
// 4.数据检索,根据用户名和密码判断用户是否存在
public bool UsersExist(string userName, string userPwd)
{
string sql = "select * from Useers where Name='" + userName + "' and Pwd ='" + userPwd + "'";
return Convert.ToInt32(dbHelp.GetScalar(sql)) > 0;
}
// ...还可以写很多
}
19.右键解决方案,添加,新建项目,SaleSysUI
20.创建web窗体,Login
<div>
<h3>欢迎来到销售管理系统,请先登录!</h3>
</div>
<div>
<table>
<%-- 第一行 --%>
<tr>
<td>用户名:</td>
<td>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</td>
</tr>
<%-- 第二行 --%>
<tr>
<td>密码:</td>
<td>
<asp:TextBox ID="txtPwd" runat="server"></asp:TextBox>
</td>
</tr>
<%-- 第三行 --%>
<tr>
<td>
<asp:Button ID="Button1" runat="server" Text="登录" OnClick="Button1_Click" />
</td>
</tr>
</table>
</div>
21.在UsersDAL里,继续写第五个方法
// 5.根据用户名和密码来查询用户信息数据
public Users GetUsers(string userName,string userPwd)
{
// 查询到当前用户名和密码,与数据库中的用户名和密码相匹配,并把匹配到的值赋值在sql变量中
string sql = "select * from Users where Name='" + userName + "' and Pwd='"+ userPwd +"'";
// 获取当前Id的用户信息
DataTable dt = dbHelp.GetTable(sql);
// 判断,当前数据表不等于空,并且数据表中的行数 > 0
if (dt != null && dt.Rows.Count > 0)
{
// 获取当前用户信息的行集合(也就是有几个字段)
DataRow dr = dt.Rows[0];
// 获取当前用户的字段信息
Users users = new Users()
{
Id = Convert.ToInt32(dr["Id"]),
Name = dr["Name"].ToString(),
Sex = Convert.ToBoolean(dr["Sex"]),
Address = dr["Address"].ToString(),
Phone = dr["Phone"].ToString(),
Mail = dr["Mail"].ToString(),
CardId = Convert.ToInt32(dr["CardId"]),
NickName = dr["NickName"].ToString(),
Pwd = dr["Pwd"].ToString(),
State = Convert.ToInt32(dr["State"]),
TypeId = Convert.ToInt32(dr["TypeId"]),
};
return users;
}
return null;
}
22.在Login页面,双击登录按钮
// 登录的点击事件
protected void Button1_Click(object sender, EventArgs e)
{
//1、获取用户名和密码控件的值
string strName = txtName.Text;
string strPwd = txtPwd.Text;
//2、判断用户名和密码是否为空
}
23.右键SaleSysUI,设置启动项目
24.
25. 右键解决方案,添加,新建项目,SaleSysBLL
26.右键BLL层里的引用,添加引用,把Model和DAL层引入进去
27.重命名class1.cs,改为UsersBLL.cs
28.在UsersBLL.cs里引包
// 引包
using SaleSysDAL;
using Model;
29.
/// <summary>
/// 处理和用户相关的业务逻辑
/// </summary>
public class UsersBLL
{
// 1.实例化SaleSysDAL类库,实例化后才可以调用里面的方法
UsersDAL dal = new UsersDAL();
/// <summary>
/// 2.处理用户登录的相关逻辑
/// </summary>
/// <param name="userName"></param>
/// <param name="usrePwd"></param>
/// <returns></returns>
public bool Login(string userName,string userPwd)
{
// 1.首先通过调用UserDAL类的GetUsersByName方法,根据用户名从数据库中检索用户信息,存储在变量中
Users users = dal.GetUsersByName(userName);
// 2.判断,检查users是否为null。如果不为空,表示找到相对应用户名的用户。
//紧接着双重判断。判断输入的密码(usrePwd)和数据库中存储的密码(Pwd)是否相等,如果不相等,直接返回false,登录失败
if(users != null)
{
if (users.Pwd != userPwd)
{
return false;
}
}
// 3.把输入的用户名和密码和UsersDAL类的GetUsers方法相匹配,存储到users当中
users = dal.GetUsers(userName, userPwd);
// 4.当前用户名和密码都为空,则返回false 登录失败
if (users == null)
{
return false;
}
// 5.假如都不为空,返回true 登录成功
return true;
}
}
30.回到Login页面,打开设计,双击登录按钮
31.右键SaleSysUI层引用,添加引用
32.然后引包
// 引包
using SaleSysBLL;
33.然后在登录的点击事件里面继续
//2、判断用户输入的用户名和密码是否正确 =》 调用ELL里面的Login方法
UsersBLL bll = new UsersBLL();
if (bll.Login(strName,strPwd))
{
// 3.验证通过,跳转到Default页面
Response.Redirect("Default.aspx");
}
else
{
// 4.验证失败,提示用户名或密码有误(弹窗)
// Page 表示当前页面对象
// ClientScript 表示客户端脚本对象,用于与客户端脚本进行交互
// RegisterStartupScript 用于在页面加载后注册客户端脚本的方法
// this.GetType() 用于获取当前类的类型,通常是页面或用户控件的类型
Page.ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('输入的用户名和密码有误,请重新输入!')</script>");
}
34.右键UI层,添加新的web窗体,Default
<body>
<form id="form1" runat="server">
<div>
<h3>登录成功!欢迎来到销售系统!</h3>
</div>
</form>
</body>
35.右键Login.aspx,设为起始页
36.打开试一下
输入错误的用户名和密码,弹窗
输入正确的用户名和密码,点击登录,跳转页面