一、任务描述
1.使用Asp.NET技术,完成银行管理系统
2.开发工具:VS2010
3.数据库:SQL Server 2008
功能模块:登录、开户、存款、取款、转账、挂失等功能
运行界面:
1.登录界面(Login.aspx),在后台提供筛选,如果是管理员的登录账号与密码就跳入管理员首页,如果是普通用户,就进入普通用户首页。
2.管理员首页(AdministratorIndex.aspx),提供用户信息,银行卡信息(选项切换),和新增用户和查看日志的跳转。在用户管理选项里,在用户名下提供修改用户资料功能,在客户卡信息下可以查看该用户拥有的多有卡的信息。在银行卡信息管理选项中,可以查询卡信息,也可以对卡进行冻结,并记录日志。
3.单个用户信息页面(UserEdit.aspx)该页面可以对该用户的基本信息进行修改。
4.客户卡信息(UserCardInfo.aspx)该界面提供挂失和取消挂失,并记录日志,并且在该页面提供了开户功能(突然觉得这个链接放在银行卡信息管理下或许更合适一些,哈哈)。
5.开户界面(AddCard.aspx)
6.新增用户界面(UserEdit.aspx)与单个的用户信息界面是同一个界面
7.查看日志界面(Log.aspx)由于条数很多,进行了分页,添加了搜索
8.用户首页(CustomerIndex.aspx)可以进行存钱,取钱,转账,利用ajax判断金额是否足够以及转账时对方卡号是否存在。
二、任务详细要求
1.登录模块:
输入用户名和密码,进行匹配,匹配成功,根据不同用户类型,跳转到不同界面;普通用户跳转到普通用户的首页、管理员跳转到管理员首页;
2.开户模块(管理员):
用户管理模块
显示用户列表,列表中,通过点击用户名,可以链接到用户信息的编辑页面;提供链接,能够链接查看该用户的所有银行卡信息,并在该用户的银行卡列表页中,提供开户(新增银行卡)、挂失(记录日志)等功能
提供新增用户的功能
3.银行卡列表(管理员):
罗列出所有银行卡信息
包括卡号、用户名、身份证号、开卡日期、是否冻结
并能够使用身份证号、用户名、银行卡号进行检索功能;
提供挂失功能(记录日志);
4.日志列表(管理员)
5.存款模块(普通用户):
登录用户,选择本人的银行卡号(下拉框罗列未挂失账户),输入金额,将钱存入该账户中(仅模拟存款); 并记录日志;
6.取款模块(普通用户):
登录用户,选择本人的某个银行卡号(下拉框罗列未挂失账户),输入取款金额,取款前,使用ajax判断是否账户中有足够的钱;足够,则取款(并记录日志),否则作出相应提示;
7.转账模块(普通用户):
登录用户,选择本人的某个银行卡号(下拉框罗列未挂失账户),输入转账金额和对方帐号,使用ajax判断是否账户中有足够的钱并且对方帐号是否存在并未挂失;满足条件,则可以转账并记录日志,否则作出相应提示;
三、数据库设计
数据库结构:
有些日期是操作的当前日期,可在数据库中直接进行操作:
--为日志的操作日期添加当前日期
ALTER TABLE dbo.Log
ADD CONSTRAINT DFT_Log_operationdate
DEFAULT(CURRENT_TIMESTAMP) FOR operationdate;
四、界面设计与功能实现
文件配置:
添加引用:
这里引用的是内部的.dll,可以自行下载Maticsoft.DBUtility。此引用主要用于数据库查询。
4.1 登录界面
Login.aspx
这里写了一段js,在前端处理是否有为空的输入,如果有为空的输入就不再进入后台进行处理。注意return的使用。
Login.aspx.cs
namespace web
{
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void buttonLogin_Click(object sender, EventArgs e)
{
//编写sql语句,此处的top 1 就是选出查询的第一条记录,此处可避免查出内容相同的两条语句
string sql = "SELECT TOP 1 * FROM Users WHERE username = @username AND password = @password";
//设置参数
SqlParameter[] pms = {
new SqlParameter("@username",SqlDbType.NVarChar,50),
new SqlParameter("@password",SqlDbType.NVarChar,30)
};
//为参数赋值
pms[0].Value = txtUserName.Text;
pms[1].Value = txtPassword.Text;
DataSet ds = DbHelperSQL.Query(sql, pms); //执行查询,并将数据放置在一个数据集中
//判断表中是否存在数据,如果有数据则登录成功,如果没有数据,则登录失败
if (ds.Tables[0].Rows.Count > 0)
{
//根据判断选择进入哪个主页,无论进来的管理员或者是普通用户都记录下操作者的ID,方便记录日志
if (ds.Tables[0].Rows[0]["usertype"].ToString() == "管理员")
{
Session["id"] = ds.Tables[0].Rows[0]["id"].ToString();
Session["username"] = ds.Tables[0].Rows[0]["username"].ToString();
Response.Redirect("AdministratorIndex.aspx");
}
else
{
Session["id"] = ds.Tables[0].Rows[0]["id"].ToString();
Session["username"] = ds.Tables[0].Rows[0]["username"].ToString();
Response.Redirect("CustomerIndex.aspx");
}
}
//验证失败弹出提示框
else
{
Response.Write("");
}
}
}
}
此处在后台查询显示判断是否账户与密码匹配,然后根据输入的账户得到账户类型,跳转到不同用户的主页。
4.2 普通用户的主页
CustomerIndex.aspx
此处在前端首先有一个选项卡,里面用到了updatePanel局部更新功能,然后是通过ajax向后端提供输入数据,并获得返回。
在后台程序绑定下拉:
private void BindDrop()
{
int userid = Convert.ToInt32(Session["id"]);
//测试用,这样就可以不用从头开始测试
if (userid == 0)
{
userid = 2;
}
string sql = "SELECT cnumber,id FROM BankAccount WHERE islost = 'False' AND userid = @userid";
SqlParameter[] pms = {
new SqlParameter("@userid",SqlDbType.Int)
};
pms[0].Value = userid;
DataSet ds = DbHelperSQL.Query(sql,pms);
ddlCNumber.DataSource = ds;
ddlCNumber.DataTextField = "cnumber";
ddlCNumber.DataValueField = "id";
DataRow drNew = ds.Tables[0].NewRow();//方法,新建一行
drNew["id"] = 0;//为新增的一行添加两个属性
drNew["cnumber"] = "请选择";
ds.Tables[0].Rows.InsertAt(drNew, 0);//将新增的一行添加到ds中
ddlCNumber.DataBind();
}
在一般程序里面,为了使用session值:
首先
using System.Web.SessionState;
其次
public class TransMoneyHandler : IHttpHandler, IRequiresSessionState
最后
int ruserid = Convert.ToInt32(context.Session["id"]);
string username = Convert.ToString(context.Session["username"]);
4.3 管理员主页
在添加多个输入框进行查询时,注意sql语句书写方式:
StringBuilder sbsql = new StringBuilder();
sbsql.AppendLine("SELECT B.cnumber,U.username,U.userID,B.opendate,B.islost FROM ");
sbsql.AppendLine("Users AS U INNER JOIN BankAccount AS B ON U.id = B.userid");
sbsql.AppendLine("WHERE 1=1");
if (username != "")
{
sbsql.AppendLine("AND U.username LIKE @username");
}
if (userID != "")
{
sbsql.AppendLine("AND U.userID = @userID");
}
if (cnumber != "")
{
sbsql.AppendLine("AND B.cnumber LIKE @cnumber");
}
SqlParameter[] pms = {
new SqlParameter("@username",SqlDbType.NVarChar,50),
new SqlParameter("@userID",SqlDbType.NVarChar,30),
new SqlParameter("@cnumber",SqlDbType.NVarChar,30)
};
pms[0].Value = "%" + username + "%";
pms[1].Value = userID;
pms[2].Value = "%" + cnumber + "%";
DataSet ds1 = DbHelperSQL.Query(sbsql.ToString(),pms);
4.4 查看日志界面
在此详细讲下如何进行分页:
首先为gridview更改属性:
添加事件:
在gridview底部添加代码:
<%--添加分页--%>
当前第:
<%--//((GridView)Container.NamingContainer)就是为了得到当前的控件--%>
页/共:
<%-- //得到分页页面的总数--%>
页
<%--//如果该分页是首分页,那么该连接就不会显示了.同时对应了自带识别的命令参数CommandArgument--%>
首页
上一页
<%--//如果该分页是尾页,那么该连接就不会显示了--%>
下一页
尾页
转到第
页
<%--//这里将CommandArgument即使点击该按钮e.newIndex 值为3--%>
后台代码:
protected void gvLog_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
// 得到该控件
GridView theGrid = sender as GridView;
int newPageIndex = 0;
if (e.NewPageIndex == -3)
{
//点击了Go按钮
TextBox txtNewPageIndex = null;
//GridView较DataGrid提供了更多的API,获取分页块可以使用BottomPagerRow 或者TopPagerRow,当然还增加了HeaderRow和FooterRow
GridViewRow pagerRow = theGrid.BottomPagerRow;
if (pagerRow != null)
{
//得到text控件
txtNewPageIndex = pagerRow.FindControl("txtNewPageIndex") as TextBox;
}
if (txtNewPageIndex != null)
{
//得到索引
newPageIndex = int.Parse(txtNewPageIndex.Text) - 1;
}
}
else
{
//点击了其他的按钮
newPageIndex = e.NewPageIndex;
}
//防止新索引溢出
newPageIndex = newPageIndex < 0 ? 0 : newPageIndex;
newPageIndex = newPageIndex >= theGrid.PageCount ? theGrid.PageCount - 1 : newPageIndex;
//得到新的值
theGrid.PageIndex = newPageIndex;
//重新绑定
BindData();
}
分页参考网址:http://blog.csdn.net/uniqer/article/details/7756385
总结:不得不承认今天状态不佳,总结的乱七八糟……