当前位置: 首页 > news >正文

基于 asp.net家庭财务管理系统设计与实现

博主介绍:专注于Java .net  php phython  小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作


☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟

我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

1 引言

1.1 项目背景

随着计算机技术的飞速发展,计算机在日常管理中应用迅速得到了普及,利用计算机进行家庭日常财务收支的管理无疑是一条行之有效且高效的办法。本系统结合当前实际的家庭收支分配状况,经过实际的需求分析,采用功能强大的Microsoft Visual Studio 2005(Asp.net,c#)作为开发工具而开发出来的网络版家庭财务管理系统。

整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成的家庭收支分类,收入支出记帐,借入借出资金,明细统计等分析过程,经过实际使用证明,本文所设计的家庭财务管理系统可以满足家庭,个人从事财务管理方面的需要。

1.2 研究意义

收支管理是一个家庭、单位和个人日常生活不可缺少一部分,也是财务管理的重要组成部分。它的内容对于财务管理者来说都至关重要,所以家庭财务管理系统应该能够为用户提供完整,正确和灵活的理财信息和快捷的分析手段。但一直以来人们使用传统人工的方式文件、纸张记帐管理模式,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 所以利用计算机实现财务信息的管理的自动化将势在必行。

随着计算机技术的飞速发展,计算机以及计算机控制的自动处理技术已融入人类社会的各个领域并发挥着越来越重要的作用。对于当今的科学信息是一次重大的飞越,为人们的生活、工作、学习带来潜移默化的影响。今天我们使用计算机对家庭财务信息进行管理,具有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高家庭财务管理的效率。面对目前的实际状况,迫切需要开发一个新系统来适应这一些工作。

1.3 本文所做的工作

家庭财务管理系统是基于B/S体系结构的网络应用系统,其中牵涉到网站设计、网络数据库的连接和基于WEB应用程序开发等相关技术。

为了开发该家庭财务管理系统,并且使系统能够真正达到“适用、好用”的标准,本人认真学习了ASP.NET程序设计(基于C#语言)、数据库搭建、软件工程等诸多相关教程以及构建网站所需技术的理论知识。对于以下网页制作工具:Dreamweaver、 Flash、 SwishMX以及图像处理工具Photoshop做了深入的学习,基本掌握其使用方法与技巧,为网上书店系统的站点设计做好技术的支持。熟练掌握SQL Server中数据库的建立、管理与维护;利用ASP.NET(Active Server Pages)技术访问后台数据库;借助IIS(Internet Information Server)在网上进行信息发布以及对系统性能进行优化等相关技术。 

2 系统解决方案

2.1 相关技术

2.1.1 Visual Studio 2005平台和C#语言介绍

Visual Studio 2005是一个功能强大、高效并且可扩展的编程环境。有许多激动人心的新功能,它提供统一的集成开发环境,支持在同样的开发环境里用Visual Basic、Visual C++、Visual C#、Visual J#和其他数十种编程语言,可以编写、调试和部署各种应用程序。它充分展现了应用程序的开发潜能、并提供了生成应用程序的所需要的工具和技术。这些应用程序给当今的企业、机构提供了强大的支持,为开发下一代以XML Web服务为中心的应用程序而设计,并推动下一代基于XML Web服务软件的发展,是有始以来功能最强大、最受欢迎的软件开发工具。

C#(发音为“C Sharp”)是一门简单、现代、优雅、面向对象、类型安全、平台独立的一门新型组件编程语言。它虽然是一种新语言,但却很难在这种语言中找到新的概念,其语法风格不仅源自C/C++家族,而且融合了Visual Basic的高效和C/C++强大,因此是微软为奠定其下一互联网霸主地位而打造的Microsoft.NET平台的主流语言。依本人看来,优点不外乎以下两方面:

其一,对于花费很多时间学会C、C++语言的程序员来说,可以不必丢弃以前的知识,就可以使用这种新的语言开发程序,尽管C#中有一些新概念、新技术和新函数,但一般而言它的语言及其语法是跟C、C++类似的,而且对于用C++编写好的代码也可被重用,主要原因是C#具有调用已有代码和系统库中的库函数的机制;

其二,组件编程已经成为当今世界软件业面向下一代程序开发的一致选择,是90年代面向对象编程的深度发展。C#生逢其时,占尽天时地利,“第一等的面向组件编程的支持”也决不是简单说说那么轻松。实际上,组件特性已经深深植入C#语言的各个层面,可为是C#锐利(Sharp)之处。

2.1.2 ASP.NET简介

ASP.NET是Microsoft.net的一部分,作为战略产品,不仅仅是 Active Server Page (ASP) 的下一个版本,它还提供了一个统一的 Web 开发模型,其中包括开发人员生成企业级 Web 应用程序所需的各种服务。ASP.NET 的语法在很大程度上与 ASP 兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。可以通过在现有 ASP 应用程序中逐渐添加 ASP.NET 功能,随时增强 ASP 应用程序的功能。

ASP.NET 可以用已编译的基于 .NET环境的可以用任何与 .NET 兼容的语言(包括 Visual Basic .NET、C# 和 JScript .NET.)创作应用程序。另外,任何 ASP.NET 应用程序都可以使用整个 .NET Framework,开发人员可以方便地获得这些技术,其中包括托管的公共语言运行库环境、类型安全、继承等等。

ASP.NET 可以无缝地与 WYSIWYG HTML 编辑器和其他编程工具(包括 Microsoft Visual Studio .NET)一起工作。这不仅使得 Web 开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到 Web 页的 GUI 和完全集成的调试支持。

因此,对于程序员来说,可以更方便地开发Web应用程序,这些是跟微软为ASP. NET设计的以下策略分不开的:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等。 

2.1.3 SQL Server 2005简介

 SQL Server 2005 是Microsoft 公司2005年推出的SQL Server 数据库管理系统,它是一个杰出的数据库平台,可用于大型联机事务处理、数据仓库以及电子商务等。 其特点有如下几点:

1.真正的客户机/服务器体系结构。

2.图形化用户界面。

3.丰富的编程接口工具。

4.SQL Server与Windows NT完全集成。

5.具有很好的伸缩性。

6.对Web技术的支持。

7.SQL Server提供数据仓库功能。

2.1.4 ADO.NET简介

ADO.NET是由.NET framework为与数据库中的数据进行交互而提供的一组对象类的名称。我们知道,面向对象编程的有关主要优点是可以把各种复杂的功能封装在一个自包含的单元中,接着要处理的就是—个定义好的接口中,它由一些方法和属性组成。

在ADO.NET中,我们将处理断开连接的数据集,在网站的访问者请求数据时,首先建立连接,传送数据,之后关闭连接;接着,访问者就可以修改数据,但这些修改不会在数据源中立即更新(如果需要对访问者所做的修改更新到数据库,必须重新打开连接)。这种断开连接进行访问数据库的最大优点是效率高、可伸缩性好。在以往的数据库访问中必须为用户一直保持连接,直到该用户的会话结束为止,而Web中可能同时处理上千个并行用户,可想而知,如果为每个用户同时保持连接在需要的系统资源是非常昂贵的。因此,使用断开式连接数据可以提高应用程序的执行效率,并能处理更多的工作负载(即它们的伸缩性更好)。

2.2 体系结构

2.2.1 B/S系统介绍

B/S(browser/server,简称B/S)模式,即浏览器/服务器模式,它是基于Intranet 的需求而出现并发展的。

2.2.2 Browser/Server模型工作步骤

B/S模型的工作步骤一般包括以下七步:

1.用户打开浏览器。

2.输入或自动启动主页的URL (Uniform Resource Locator),浏览器生成一个HTTP请求并把它发给指定的Internet服务器。

3.服务器发回主页的HTML (Hypertext Markup Language)页面。浏览器将其显示在屏幕上。

4.用户在主页面上进行操作(如:点击、键入等)。

5.浏览器生成相应的HTTP要求,发送给相应的服务器。

6.服务器收到请求后,查看本站点是否拥有这个文档。如果有,就将它放入响应信息中返回给浏览器。

7.浏览器收到响应,查看头文件的格式,判断能否直接显示。否则,调用对应的帮助应用程序或外挂程序处理显示。

2.3 技术开发方案

我们根据应用系统的有关规范标准和具体业务需求,结合软件开发技术发展状况,选择了以下相应系统软件或工具软件,以确定科学、合理的开发方案。具体如下表所述:

类别

软件名称

软件用途

数据库

SQL Server 2005

后台数据库

Web服务

IIS

后台服务器

开发工具

Visual Studio 2005

后台编码,页面设计

2.4 系统技术平台

硬件:

WEB服务器1台、客户机若干台、网卡、集线器等。

软件:

WEB服务器为Windows2000及以上版本,安装有IIS。

客户机安装Internet Explorer或Netscape Communicator。

相关软件,如:IE、SQL Server 2005、VS2005等等。

3 系统设计说明

3.1. 系统主要功能模块图

家庭财务管理系统由用户管理、基础数据管理、收支管理、存储管理、借还款管理、财务分析组成,如下图所示。

家庭财务管理系统功能模块结构图

3.2系统各功能模块分析

用户管理模块:创建系统用户,修改删除用户的基本信息。

收支管理模块:添加、修改、删除和查询用户的收入支出信息。

存储管理模块:添加、修改、删除和查询用户的银行储蓄信息。

借还款管理模块:添加、修改、删除和查询用户的借款和还款信息。

基本数据管理模块:添加、修改、删除和查询用户的收入项目和支出项目的信息。

注:财务分析模块包含在以上的模块中。

4数据库设计

该系统采用SQL Server2005作为后台数据库进行存储所有与系统相关的数据。根据系统功能需要主要包括以下数据表:用户信息表(family)、收入信息表(ininfo)、支出信息表(outinfo)、收入项目表 (initem)、支出项目表(outitem)、活期存储信息表(liveaccount)、定期存储信息表(fixaccount)、借入表(borrow)和借出表(lend)。

4.1 数据模型

数据模型是对现实世界数据的抽象表示,其主要目的是规划具体事务处理使用到的数据,建立相应的数据库,保持与应用程序开发之间的简洁性,有利于数据库的规范化、性能优化以及数据的简洁性。

4.1.1 E_R模型

ER模型是数据进行第一层抽象的表示方法。它的主要成分包括:实体、联系和属性。使用这三种成分,我们可以建立许多数据库应用系统的E_R模型。

家庭财务管理系统的E-R图如下图所示

4.2 数据表设计

Family表(用户信息表)

列名

数据类型

长度

说明

name

Varchar

10

姓名

uname

Varchar

15

用户名(主键)

pwd

Varchar

20

密码

role

Varchar

8

角色

Birthday

Smalldatetime

4

生日

inInfo表(收入表)

列名

数据类型

长度

说明

inInfoID

Varchar

4

收入编号(主键)

Indate

Smalldatetime

4

入库时间

inType

Varchar

10

资金方式

Inmoney

Int

4

数额

inItem

Varchar

10

收入项目(外键)

Infrom

Varchar

10

资金来源

role

Varchar

8

角色或称呼(外键)

Others

Varchar

30

备注

inItem表(收入项目表)

列名

数据类型

长度

说明

inID

Varchar

4

收入项目编号(主键)

inItem

Varchar

10

收入项目名称

outInfo表(支出表)

列名

数据类型

长度

说明

outInfoID

Varchar

4

支出编号(主键)

outdate

Smalldatetime

4

支出时间

outType

Varchar

10

资金方式

outmoney

Int

4

数额

outItem

Varchar

10

支出项目(外键)

outTo

Varchar

10

支出去路

role

Varchar

8

角色或称呼(外键)

Others

Varchar

30

备注

outItem表(支出项目表)

列名

数据类型

长度

说明

outID

Varchar

4

支出项目编号(主键)

outItem

Varchar

10

支出项目名称

liveAccount表(活期存储表)

列名

数据类型

长度

说明

liveID

Varchar

20

活期银行帐号(主键)

Livename

Varchar

20

活期银行名称

Liveaddress

Varchar

30

活期银行地址

liveDate

Smalldatetime

4

存储时间

Livemoney

Int

4

存储金额

role

Varchar

8

角色或称呼(外键)

State

bit

5

存储状态

fixAccount表(定期存储表)

列名

数据类型

长度

说明

fixID

Varchar

20

定期银行帐号(主键)

fixname

Varchar

20

定期银行名称

fixaddress

Varchar

30

定期银行地址

fixDate

Smalldatetime

4

存储时间

fixmoney

Int

4

存储金额

Year

float

4

存储年限

Lilv

Float

4

利率

role

Varchar

8

角色或称呼(外键)

State

bit

5

存储状态

borrow表(借入表)------家庭成员内的借款

列名

数据类型

长度

说明

borrowID

Varchar

4

借入编号(主键)

Fromname

varchar

10

借入人名称

role

Varchar

8

角色或称呼

borrowDate

Smalldatetime

4

借款日期

borrowmoney

Int

4

借款数额

borrowreason

varchar

30

借款原因

State

bit

5

借款状态

Others

varchar

30

备注

Lend表(借出表)------家庭成员借给外人

列名

数据类型

长度

说明

lendID

Varchar

4

借出编号(主键)

toname

varchar

10

借款人名称

role

Varchar

8

角色或称呼(外键)

lendDate

Smalldatetime

4

借款日期

lendmoney

Int

4

借款数额

lendreason

varchar

30

借款原因

State

bit

5

借款状态

Others

varchar

30

备注

5.数据库连接设计

5.1.实现与数据库连接及操作的方法

(1)建立一个数据库连接类(clsDB.cs),主要代码如下:

public class clsDB

{

    public SqlConnection connection;

public clsDB()

{

        connection = new SqlConnection(connectionstring());

        connection.Open();

}

    public string connectionstring()//获取连接字符串

    {

        return System.Configuration.ConfigurationManager.AppSettings["connectionstring"];

    }

    public SqlDataReader GetResultASDataReader(string strsql)//返回datareader

    {

        SqlCommand cmd = new SqlCommand(strsql, connection);

        if (connection.State == ConnectionState.Closed)

            connection.Open();

        return cmd.ExecuteReader();

    }

    public string ExecuteNoReturn(string strsql, string strtip)

    {

        string strreturn;

        SqlCommand mycommand = new SqlCommand(strsql, connection);

        try

        {

            if (connection.State == ConnectionState.Closed)

                connection.Open();

            mycommand.ExecuteNonQuery();

            strreturn = strtip + "成功";

        }

        catch

        {

            strreturn = strtip + "失败";

        }

        mycommand.Dispose();

        connection.Close();

        return strreturn;

    }

    public void killme()

    {

        connection.Dispose();

    }

    public DataTable readtable(string strsql)//返回一个数据表

    {

        DataTable dt = new DataTable();

        SqlConnection conn = new SqlConnection(connectionstring());

        conn.Open();

        SqlDataAdapter adapter = new SqlDataAdapter(strsql, conn);

        adapter.Fill(dt);

        conn.Close();

        return dt;

       

    }

    public void caozuo(string strsql)//基本的操作

    {

        SqlConnection con = new SqlConnection(connectionstring());

        SqlCommand cmd = new SqlCommand(strsql,con);

        con.Open();

        cmd.ExecuteNonQuery();

        con.Close();

    }

}

此种方法的好处是建立一个数据库连接类,每当需要连接数据库时调用(clsDB.cs)即可,方便、快捷。

(2)在Web配置文件中(Web.config)自定义一个连接字符串,该字符串作为常量被使用,主要代码如下:

<appSettings>

<add key="connectionstring" value="Data Source=.;Initial Catalog=familywealth;Integrated Security=True"/>

</appSettings>每当需要连接字符串时,从文件Web.config中读取连接字符串。主要代码如下:

  public string connectionstring()

    {

        return System.Configuration.ConfigurationManager.AppSettings["connectionstring"];

    }

使用时需要调用域名空间using System.Configuration ;

5.2用户管理模块设计

5.2.1新用户注册模块的实现

主要实现代码如下:

      protected void createuser_Click1(object sender, EventArgs e)

    {

        try

        {

           

            if ((pwd1box.Text == pwd2box.Text )&&( uidbox.Text != "" )&&( rolebox.Text != ""))

            {

                try

                {                  

                        clsDB db = new clsDB();

                        SqlConnection conn = new SqlConnection(db.connectionstring());

                        conn.Open();

                        string insertuser = "insert into family values('" + unamebox.Text.Trim() + "','" + uidbox.Text.Trim() + "','" + pwd1box.Text.Trim() + "','" + rolebox.Text.Trim() + "','" + birthbox.Text.Trim() + "')";

                        SqlCommand cmd = new SqlCommand(insertuser, conn);

                        cmd.ExecuteNonQuery();

                        Response.Write("<script language=javascript>alert('创建成功!!');location='edituser.aspx'</script>");

                        conn.Close();

                    

                }

                catch (Exception ex)

                {

                    Response.Write(ex.Message.ToString());

                }              

                

            }

            else

            {

                Response.Write("<script language=javascript>alert('密码输入不一致或用户名称呼不能为空!')</script>");

            }

           

        }

        catch(Exception ex)

        {

            Response.Write(ex.Message.ToString());

        }

        finally

        {

            unamebox.Text = "";

            uidbox.Text = "";

            rolebox.Text = "";

            birthbox.Text = "";

        }

    }

5.2.2用户登陆模块的实现

用户登陆的实现并用Session["user"]记录用户的用户名,它贯穿于应用程序的整个生命周期,以此来区分权限。主要实现代码如下:

public partial class logon : System.Web.UI.Page

{

    

    //用户身份验证

    public void OnAuthenticate(object sender,AuthenticateEventArgs e)

     {

       

        bool Authenticated = false;

        Authenticated = SiteSpecificAuthenticationMethod(Login1.UserName, Login1.Password);

        e.Authenticated = Authenticated;

    }

    //在数据库中检验

   private bool SiteSpecificAuthenticationMethod(string UserName,string Password)

    {

        string strUserName, strPWD;//用户名,密码

        strUserName = Login1.UserName;

        strPWD = Login1.Password;

        string strsql;

        SqlDataReader myreader;

        strsql = "select uname,pwd from family where uname='" + strUserName + "'";

        clsDB dbo = new clsDB();

        myreader = dbo.GetResultASDataReader(strsql);

        if (myreader.Read())

        {

            //存在用户

            string strUserPwd = myreader["pwd"].ToString();

            if (strPWD == strUserPwd)

            {//密码正确  

              Session["user"] = Login1.UserName.ToString().Trim();//记录用户的用户名

              Response.Redirect("Default.aspx");

              myreader.Close();

              myreader.Dispose();

              dbo.killme();

              return true;

            }

            else

            {

                Login1.FailureText = "密码错误!!!";

                myreader.Close();

                myreader.Dispose();

                dbo.killme();

                return false;

            }

        }

        else

        {

            //用户不存在

            Login1.FailureText = "用户不存在";

            myreader.Close();

            myreader.Dispose();

            dbo.killme();

            return false;

        }

    }

5.2.3搜索模块的实现

string sqlstr="select * from ininfo where role='"+rolebox.SelectedItem.Value.ToString()+"'";

       cha(sqlstr);

public void cha(string sqlstr)

    {

        clsDB db = new clsDB();

        SqlConnection con = new SqlConnection(db.connectionstring());

        con.Open();

        SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, con);

        DataSet myset = new DataSet();

        adapter.Fill(myset);

        if (myset.Tables[0].Rows.Count > 0)

        {

            GridView1.DataSource = new DataView(myset.Tables[0]);

            GridView1.DataBind();

            con.Close();

        }

        else

        {

            Response.Write("<script language=javascript>alert('没有该人员录入的信息!')</script>");

        }

    }

5.2.4 Gridview数据处理的实现

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)//删除数据

    {

        clsDB db = new clsDB();

        string deletestr = "delete from ininfo where ininfoid='" + GridView1.DataKeys[e.RowIndex].Value .ToString () + "'";

        db.caozuo(deletestr);

        GridView1.EditIndex = -1;

        string selectstr = "select * from ininfo order by ininfoid";

        cha(selectstr);

}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)//换页

    {

        GridView1.PageIndex = e.NewPageIndex;

        string selectstr = "select * from ininfo order by ininfoid";

        cha(selectstr);

     }

protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)//第一次载入该页

        {

            this.bind();

        }

}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

    {//绑定数据行

        if (e.Row.RowType == DataControlRowType.DataRow)

        {

            ((LinkButton)(e.Row.Cells[10].Controls[0])).Attributes.Add("onclick", "return confirm('确定删除吗?')");

            e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#22dd22';this.Style.color='buttontext';this.Style.cursor='default';");

            e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='';this.style.color='';");

        }

    }

 protected void bind()//修改数据与数据的绑定

    {

        string id = Request.QueryString["borrowid"].ToString();//数据传递

        string str = "select * from borrow where borrowid='" + id + "'";

        SqlDataReader myreader = db.GetResultASDataReader(str);

        if (myreader.Read())

        {

            idbox.Text = myreader["borrowid"].ToString();

            fromnamebox.Text = myreader["fromname"].ToString();

            rolebox.Text = myreader["role"].ToString();

            datebox.Text = myreader["borrowdate"].ToString();

            jinebox.Text = myreader["borrowmoney"].ToString();

            reasonbox.Text = myreader["borrowreason"].ToString();

            statesbox.Text = myreader["states"].ToString();

            othersbox.Text = myreader["others"].ToString();

        }

        myreader.Close();

    }

protected void alter_Click(object sender, EventArgs e)//修改数据

    {

      

        try

        {

            string id =Request.QueryString["borrowid"].ToString();

            if (statesbox.Checked)

            {

                statesbox.Text = "true";

            }

            else

            {

                statesbox.Text = "false";

            }

            string updatestr = "update borrow set fromname='" + fromnamebox.Text.Trim() + "',role='" + rolebox.SelectedValue.ToString().Trim() + "',borrowdate='" + datebox.Text.Trim() + "',borrowmoney='" + jinebox.Text.Trim() + "',borrowreason='" + reasonbox.Text.Trim() + "',states='" + statesbox.Text.Trim() + "',others='" + othersbox.Text.Trim() + "'where borrowid='"+id+"' ";

            db.caozuo(updatestr);

            Response.Write("<script language=javascript>alert('信息修改成功!');location='borrow.aspx'</script>");

           

        }

        catch (Exception ex)

        {

            Response.Write(ex.Message.ToString());

        }

    }

  

6 测试运行情况

6.1 测试运行情况

任一系统的正确运行都是建立在多次测试基础上的,只有经过多次测试才可以发现系统存在的不足或逻辑错误。本文的家庭财务管理系统在不断的调试过程中也或多或少地遇到一些问题,但最终基本一一解决,主要归纳为以下2点:

1、实时性问题,由于本系统是B/S模式的,所以系统的响应速度是很重要的,当有大量的用户同时访问时,这样系统的响应速度必然下降。本系统在设计阶段就考虑了这方面的问题,其中最主要的解决方法就是尽量减少客户端和服务器间的通信,把一些能在客户端完成的验证都放在客户端验证,尽可能多的使用本地的脚本语言,这样客户端和服务器端的通信量就会大大减少,服务器的响应效率会提高很多。在本系统中开始时把一些验证信息放在了服务器端,这样每点一个按钮就向服务器发出一次请求,从而使服务器响应速度很慢,后来把一些控件的验证都放在了客户端,这样就减少了客户端和服务器端的通信,服务器的响应速度大大提高。

2、系统的安全性问题,后台管理界面不能让一些不具有管理员身份的人登陆,在本系统中应用了Session机制来验证用户,只有登陆了系统才能对系统后台进行操作,没有登陆的用户是不能够登陆后台管理界面的。即使用户输入后台管理的网址,系统会自动跳转到提示为登陆错误的页面,且要求用户登陆。同样,即使是合法的用户登录,他也不可以进入到管理员的操作的界面,因为管理员或客户合法登录后,他们被赋予不同的Session标记,这样系统的安全性相对大大提高。在开发即将完成的时候还没有实现这个功能,后发现直接输入管理界面的链接地址就能登陆后台,最终在系统中的后台每个界面都应用了Session机制后,才解决了这个问题。

6.2 程序有待改进方面

虽然,经过1个星期的不断努力,基本搭建起一个功能较完备、符合实际运用情况的家庭财务管理系统,但是也存在着有待完善或改进的方面,主要包括:

1、在得到查询的结果,没能实现将其导入到Excel表中,没有提供打印功能。

2、没有涉及运用到数据挖掘算法为用户提供个性化推荐服务,以提高系统的服务质量;

以上都是本系统以后将要着重改进的地方。

结 论

本人从构想到功能需求分析以及数据库设计和编程实现,创建了一个家庭财务管理系统。该系统已经完成了所有的功能模块,并且经过测试,系统的正确性与健壮性都得到了巩固与增强。只要有服务器资源,本系统可以立即投入使用。

该家庭财务管理系统出于安全考虑,必须要求用户进行身份验证,方可进行数据的修改,相应的系统中提供了用户注册和登录页面,普通用户只有浏览数据的权限。

当然本系统还有很多不足之处,由于时间关系,本人对很多实际中会出现的问题还没有加以充分考虑,对整个系统的模型也做了很大的简化,还有网络安全方面的技术也没有涉及很多。

参考文献

[1]张微,刘任凭.Dream weaver 8完美网页设计[M],中国青年电子出版社,2006-7:392-396;

[2]陈伟,SQL Server 2005数据库应用与开发教程,清华大学出版社,2007-9:978-7-302-16021-2;

[3]孙家广,软件工程,高等教育出版社,2005-7:978-7-04-016308-7;

[4]网络资源。

致谢

在这为期一周的数据库课程设计中,我得到了许多人的帮助。首先我要感谢我的指导老师张巍老师在课程设计上给予我的指导、提供给我的支持和帮助,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。

其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计的难题。同时也感谢学院为我提供良好的做课程设计的环境。

最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。

免费下载地址:https://download.csdn.net/download/qq_41221322/89548227

其他的定制服务  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者
 

相关文章:

基于 asp.net家庭财务管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用感兴趣的可以先…...

allure_pytest:AttributeError: ‘str‘ object has no attribute ‘iter_parents‘

踩坑记录 问题描述&#xff1a; 接口自动化测试时出现报错&#xff0c;报错文件是allure_pytest库 问题分析&#xff1a; 自动化测试框架是比较成熟的代码&#xff0c;报错也不是自己写的文件&#xff0c;而是第三方库&#xff0c;首先推测是allure_pytest和某些库有版本不兼…...

C语言 反转链表

题目链接:https://leetcode.cn/problems/reverse-linked-list/description/?envTypestudy-plan-v2&envIdselected-coding-interview 完整代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/// 反转链表…...

MFC CRectTracker 类用法详解

CRectTracker 类并非 Microsoft Foundation Class (MFC) 库中应用很广泛的一个类&#xff0c;一般教科书中很少有提到。在编程中如果需编写选择框绘制以及选择框大小调整、移动等程序时&#xff0c;用CRectTracker 类就会做到事半而功倍。下面详细介绍MFC CRectTracker 类。 M…...

好玩的调度技术-场景编辑器

好玩的调度技术-场景编辑器 文章目录 好玩的调度技术-场景编辑器前言一、演示一、代码总结好玩系列 前言 这两天写前端写上瘾了&#xff0c;顺手做了个好玩的东西&#xff0c;好玩系列也好久没更新&#xff0c;正好作为素材写一篇文章&#xff0c;我真的觉得蛮好玩的&#xff…...

提高自动化测试脚本编写效率 5大关键注意事项

提高自动化测试脚本编写效率能加速测试周期&#xff0c;减少人工错误&#xff0c;提升软件质量&#xff0c;促进项目按时交付&#xff0c;增强团队生产力和项目成功率。而自动化测试脚本编写效率低下&#xff0c;往往会导致测试周期延长&#xff0c;增加项目成本&#xff0c;延…...

护眼落地灯哪个更护眼?2024年度最值得入手的5款护眼大路灯推荐

落地灯和台灯哪个更护眼&#xff1f;之所以我们眼睛经常酸痛&#xff0c;很大部分的原因是因为我们长时间在不良光线下&#xff0c;将注意力集中在屏幕或书本上会导致眼睛肌肉过度使用&#xff0c;引发疲劳和酸痛。但也不排除不正确的坐姿或者工作环境缺乏适当的照明引起的&…...

DP讨论——适配器、桥接、代理、装饰器模式通用理解

学而时习之&#xff0c;温故而知新。 共性 适配器、桥接、代理和装饰器模式&#xff0c;实现上基本没啥区别&#xff0c;怎么区分&#xff1f;只能从上下文理解&#xff0c;看目的是啥。 它们&#xff0c;我左看上看下看右看&#xff0c;发现理解可以这么简单:都是A类调用B/…...

Apache AGE的MATCH子句

MATCH子句允许您在数据库中指定查询将搜索的模式。这是检索数据以在查询中使用的主要方法。 通常在MATCH子句之后会跟随一个WHERE子句&#xff0c;以添加用户定义的限制条件到匹配的模式中&#xff0c;以操纵返回的数据集。谓词是模式描述的一部分&#xff0c;不应被视为仅在匹…...

Netty Websocket

一、WebSocket 协议概述 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务端主动向客户端推送数据&#xff0c;从而实现了实时通信。WebSocket 建立在 HTTP 之上&#xff0c;但与 HTTP 的轮询&#xff08;Polling&#xff09;和长轮询&#xff08;Long Pol…...

用户注册业务逻辑、接口设计和实现、前端逻辑

一、用户注册业务逻辑分析 二、用户注册接口设计和定义 2.1. 设计接口基本思路 对于接口的设计&#xff0c;我们要根据具体的业务逻辑&#xff0c;设计出适合业务逻辑的接口。设计接口的思路&#xff1a; 分析要实现的业务逻辑&#xff1a; 明确在这个业务中涉及到几个相关子…...

ubuntu搭建harbor私仓

1、环境准备 链接: https://pan.baidu.com/s/1q4XBWPd8WdyEn4l253mpUw 提取码: 7ekx --来自百度网盘超级会员v2的分享 准备一台Ubuntu 机器:192.168.124.165 将上面两个文件考入Ubuntu上面 2、安装harbor 安装Docker Harbor仓库以容器方式运行,需要先安装好docker,参考:…...

深层神经网络示例

维度说明&#xff1a; A[L]、Z[L]&#xff1a;&#xff08;本层神经元个数、样本数&#xff09; W[L]&#xff1a;&#xff08;本层神经元个数、上层神经元个数&#xff09; b[L]&#xff1a;&#xff08;本层神经元个数、1&#xff09; dZ[L]&#xff1a;dA[L] * g’A&#xf…...

vue中获取剪切板中的内容

目录 1.说明 2.示例 3.总结 1.说明 在系统中的画面或者时外部文件中进行拷贝处理后&#xff0c;在页面中可以获取剪切板的内容。 2.示例 方式①(直接获取) // 异步函数获取剪切板内容 async function getClipboardContent(ev: any) {try {ev.preventDefault()const clip…...

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…...

知识图谱和 LLM:利用Neo4j驾驭大型语言模型(探索真实用例)

这是关于 Neo4j 的 NaLLM 项目的一篇博客文章。这个项目是为了探索、开发和展示这些 LLM 与 Neo4j 结合的实际用途。 2023 年,ChatGPT 等大型语言模型 (LLM) 因其理解和生成类似人类的文本的能力而风靡全球。它们能够适应不同的对话环境、回答各种主题的问题,甚至模拟创意写…...

目标检测入门:4.目标检测中的一阶段模型和两阶段模型

在前面几章里&#xff0c;都只做了目标检测中的目标定位任务&#xff0c;并未做目标分类任务。目标检测作为计算机视觉领域的核心人物之一&#xff0c;旨在从图像中识别出所有感兴趣的目标&#xff0c;并确定它们的类别和位置。现在目标检测以一阶段模型和两阶段模型为代表的。…...

zookeeper+kafka消息队列群集部署

kafka拓扑架构 zookeeper拓扑架构...

[K8S]一、Flink on K8S

Kubernetes | Apache Flink 先编辑好这5个配置文件&#xff0c;然后再直接执行 kubectl create -f ./ kubectl get all kubectl get nodes kubectl get pods kubectl get pod -o wide kubectl get cm -- 获取所有的configmap 配置文件 kubectl logs pod_name -- 查看…...

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述 3.1.1 信息系统的定义3.1.1.1 信息系统3.1.1.2 信息化3.1.2 信息系统的发展3.1.2.1 初始阶段3.1.2.2 传播阶段3.1.2.3 控制阶段3.1.2.4 集成阶段3.1.2.5 数据管理阶段3.1.2.6 成熟阶段3.1.3 信息系统的分类3.…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...