C#简单银行管理系统

一、任务描述

1.使用Asp.NET技术,完成银行管理系统
2.开发工具:VS2010
3.数据库:SQL Server 2008
功能模块:登录、开户、存款、取款、转账、挂失等功能
运行界面:

1.登录界面(Login.aspx),在后台提供筛选,如果是管理员的登录账号与密码就跳入管理员首页,如果是普通用户,就进入普通用户首页。

Login.aspx

2.管理员首页(AdministratorIndex.aspx),提供用户信息,银行卡信息(选项切换),和新增用户和查看日志的跳转。在用户管理选项里,在用户名下提供修改用户资料功能,在客户卡信息下可以查看该用户拥有的多有卡的信息。在银行卡信息管理选项中,可以查询卡信息,也可以对卡进行冻结,并记录日志。

AdministratorIndex.aspx

AdministratorIndex.aspx
进行查询

3.单个用户信息页面(UserEdit.aspx)该页面可以对该用户的基本信息进行修改。

UserEdit.aspx

4.客户卡信息(UserCardInfo.aspx)该界面提供挂失和取消挂失,并记录日志,并且在该页面提供了开户功能(突然觉得这个链接放在银行卡信息管理下或许更合适一些,哈哈)。

UserCardInfo.aspx

5.开户界面(AddCard.aspx)

AddCard.aspx

6.新增用户界面(UserEdit.aspx)与单个的用户信息界面是同一个界面

UserEdite.aspx

7.查看日志界面(Log.aspx)由于条数很多,进行了分页,添加了搜索

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;

四、界面设计与功能实现

页面间联系
站点树状图

文件配置:

<connectionStrings>
    <add name="MainConn" connectionString="server=.;database=bank;user=sa;pwd=0301;Max Pool Size = 512;"
      providerName="System.Data.SqlClient" />
    </connectionStrings>

添加引用:


这里引用的是内部的.dll,可以自行下载Maticsoft.DBUtility。此引用主要用于数据库查询。

4.1 登录界面

Login.aspx

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
         <script type="text/javascript">

             //        判断输入是否为空
             function checkUserInfo() {
                 if ($("#txtUserName").val() == "") {
                     alert("请输入用户名");
                     return false;
                 }
                 if ($("#txtPassword").val() == "") {
                     alert("请输入密码");
                     return false;
                 }
             }
    </script>
    <style type="text/css">
        body{background-color:#646464;}
        .my_login{width:300px;margin:100px auto;color:White}
        #buttonLogin{display: inline-block;outline: none;cursor: pointer;text-align: center;
                     text-decoration: none;font: 14px/100% Arial, Helvetica, sans-serif;padding: .5em 2em .5em;
                     text-shadow: 0 1px 1px rgba(0,0,0,.3);-webkit-border-radius: .5em; -moz-border-radius: .5em;
                     border-radius: 0em;-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);-moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
                     box-shadow: 0 1px 2px rgba(0,0,0,.2);margin-left:20px;}
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div class="my_login" style="text-align:center;">
            <h2>银行管理系统</h2>
            <%--登录用户名--%>
            <asp:Label ID="labelUserName" runat="server" Text="用户名:&nbsp;"></asp:Label>
            <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox><br/><br/>
            <%--登录密码--%>
            <asp:Label ID="labelPassword" runat="server" Text="密  码 :&nbsp; "></asp:Label>
            <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox><br/><br/>
            <%--登录按钮--%>
            <asp:Button ID="buttonLogin" runat="server" Text="登录" 
                onclientclick="return checkUserInfo()" onclick="buttonLogin_Click"/>
    </div>
    </form>
</body>
</html>

这里写了一段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("<script>alert('用户名或密码错误,请重新登录');</script>");
            }
        }
    }
}

此处在后台查询显示判断是否账户与密码匹配,然后根据输入的账户得到账户类型,跳转到不同用户的主页。

4.2 普通用户的主页

CustomerIndex.aspx

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script  language="javascript" type="text/javascript">
        $(function () {
            $("#btnDrawMoney").click(function () { //点击事件
                var money = $("#txtDrawMoney").val();
                var cnumber = $("#ddlCNumber").find("option:selected").text()
                $.ajax({
                    url: "DrawMoneyHandler.ashx",
                    type: "POST",
                    data: { money: money, cnumber: cnumber },
                    success: function (data) {
                        if (data != '') {
                            alert(data);
                            location.reload();
                        } else {
                            location.reload();
                        }
                    }

                }

                );
            });
            $("#btnTransMoney").click(function () { //点击转账事件
                var money = $("#txtTransMoney").val();
                var otherCard = $("#txtOtherCard").val();
                var cnumber = $("#ddlCNumber").find("option:selected").text()
                $.ajax({
                    url: "TransMoneyHandler.ashx",
                    type: "POST",
                    data: { money: money, otherCard: otherCard, cnumber: cnumber },
                    success: function (data) {
                        if (data != '') {
                            alert(data);
                            alert("转账成功");
                            location.reload();
                        } else {
                            location.reload();
                        }
                    }

                }

                );
            });
        });
        
    </script>
    <script type="text/javascript">
        //选项卡js
        //    选项卡js代码
        window.onload = function () {
            $(".draw").css("display", "none"); 
            $(".trans").css("display", "none");}
        function showSave() {
            $("#lbSave").css("background-color", "red");
            $("#lbDraw").css("background-color", "");
            $("#lbTrans").css("background-color", "");
            $(".save").css("display", "block");
            $(".draw").css("display", "none");
            $(".trans").css("display", "none");
        }
        function showDraw() {
            $("#lbSave").css("background-color", "");
            $("#lbDraw").css("background-color", "red");
            $("#lbTrans").css("background-color", "");
            $(".save").css("display", "none");
            $(".draw").css("display", "block");
            $(".trans").css("display", "none");
        }
        function showTrans() {
            $("#lbSave").css("background-color", "");
            $("#lbDraw").css("background-color", "");
            $("#lbTrans").css("background-color", "red");
            $(".save").css("display", "none");
            $(".draw").css("display", "none");
            $(".trans").css("display", "block");
        }


    </script>
     <style type="text/css">
         *{margin:5px;}
        body{background-color:#646464;}
        .my_login{width:400px;margin:100px auto;color:White}
        #btnSaveMoney,#btnDrawMoney,#btnTransMoney{display: inline-block;outline: none;cursor: pointer;text-align: center;
                     text-decoration: none;font: 14px/100% Arial, Helvetica, sans-serif;padding: .5em 2em .5em;
                     text-shadow: 0 1px 1px rgba(0,0,0,.3);-webkit-border-radius: .5em; -moz-border-radius: .5em;
                     border-radius: 0em;-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);-moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
                     box-shadow: 0 1px 2px rgba(0,0,0,.2);}
        #lbSave,#lbDraw,#lbTrans{cursor:pointer;padding:5px 5px 5px;}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div class="my_login">
        <asp:Label ID="Label1" runat="server" Text="选择自己卡号"></asp:Label>
        <asp:DropDownList ID="ddlCNumber" runat="server"></asp:DropDownList>
        <%--顶部的选项卡指示--%>
        <asp:Label ID="lbSave" runat="server" Text="存钱" onmouseover = "showSave()"></asp:Label>
        <asp:Label ID="lbDraw" runat="server" Text="取钱" onmouseover = "showDraw()"></asp:Label>
        <asp:Label ID="lbTrans" runat="server" Text="转账" onmouseover = "showTrans()"></asp:Label>
        <br/>

        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <div class="save" style="text-align:center;">
                    <asp:TextBox ID="txtSaveMoney" runat="server"></asp:TextBox><br/>
                    <asp:Button ID="btnSaveMoney" runat="server" Text="存钱" 
                    onclick="btnSaveMoney_Click" />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel ID="UpdatePanel2" runat="server">
            <ContentTemplate>
                <div class="draw" style="text-align:center;display:none;">
                    <asp:TextBox ID="txtDrawMoney" runat="server"></asp:TextBox><br/>
                    <asp:Button ID="btnDrawMoney" runat="server" Text="取钱" />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel ID="UpdatePanel3" runat="server">
            <ContentTemplate>
                <div class="trans" style="text-align:center;display:none;">
                    <asp:Label ID="Label2" runat="server" Text="对方账号"></asp:Label>
                    <asp:TextBox ID="txtOtherCard" runat="server"></asp:TextBox><br/>
                    <asp:Label ID="Label3" runat="server" Text="转入金额"></asp:Label>
                    <asp:TextBox ID="txtTransMoney" runat="server"></asp:TextBox><br/>
                    <asp:Button ID="btnTransMoney" runat="server" Text="转账" />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

此处在前端首先有一个选项卡,里面用到了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底部添加代码:

<%--添加分页--%>
            <PagerTemplate>
                当前第:
                <%--//((GridView)Container.NamingContainer)就是为了得到当前的控件--%>
                <asp:Label ID="LabelCurrentPage" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageIndex + 1 %>"></asp:Label>
                页/共:
               <%-- //得到分页页面的总数--%>
                <asp:Label ID="LabelPageCount" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageCount %>"></asp:Label>
                页
                 <%--//如果该分页是首分页,那么该连接就不会显示了.同时对应了自带识别的命令参数CommandArgument--%>
                <asp:LinkButton ID="LinkButtonFirstPage" runat="server" CommandArgument="First" CommandName="Page"
                    Visible='<%#((GridView)Container.NamingContainer).PageIndex != 0 %>'>首页</asp:LinkButton>
                <asp:LinkButton ID="LinkButtonPreviousPage" runat="server" CommandArgument="Prev"
                    CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'>上一页</asp:LinkButton>
               <%--//如果该分页是尾页,那么该连接就不会显示了--%>
                <asp:LinkButton ID="LinkButtonNextPage" runat="server" CommandArgument="Next" CommandName="Page"
                    Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>下一页</asp:LinkButton>
                <asp:LinkButton ID="LinkButtonLastPage" runat="server" CommandArgument="Last" CommandName="Page"
                    Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>尾页</asp:LinkButton>
                转到第
                <asp:TextBox ID="txtNewPageIndex" runat="server" Width="20px" Text='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 %>'/>页
                <%--//这里将CommandArgument即使点击该按钮e.newIndex 值为3--%>
                <asp:LinkButton ID="btnGo" runat="server" CausesValidation="False" CommandArgument="-2"
                    CommandName="Page" Text="Go"/>
            </PagerTemplate>

后台代码:

 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容