ASP.NET小型企业办公耗材库存管理软件的设计与实现

摘  要

库存管理系统是将企业的存和转等企业的经营业务有机的结合起来,达到数据共享、降低成本、提高效率。本系统前台采用.NET,后台数据库采用SQL Server 2000,语言采用C#。本系统实现的主要功能有库存查询、进货作业、领料作业、库存盘点、损坏处理等。在系统完成后对工作进行了总结,对系统功能进行了测试,并指出了系统中的问题和需要改进的地方。

关键词B/S,C#,库存管理系统,.NET

2 系统需求分析

本系统目的是让管理者能够对仓库存储进行更有效,更经济,更方便地管理而开发的。

2.1 用户身份级别要求

即根据身份的不同对系统的使用权限有所不同。从权限大小大致可以分为:系统管理员、一般注册用户、未注册用户。系统提供灵活的角色设定和权限的分配功能。

  1. 系统管理员:最高级权限的用户,拥有库存管理系统的所有权限。主要负责对库存数据的添加,修改,删除等操作,对一般注册用户下放权限,对系统进行日常的维护和管理,排除故障。
  2. 一般注册用户:权限被限制用户。只具有访问系统中某些功能的操作(如查询。
  3. 未注册用户:未具有任何权限的用户。只能通过注册才能进入库存管理系统。

2.2 系统功能模块设置

  1. 用户注册:未注册用户需注册后才能进入系统。
  • 操作对象:所有未注册用户。
  • 浏览对象:所有未注册用户。
  • 具体操作:注册用户在需填写用户名和密码才能注册。
  1. 用户管理:对注册用户和管理员的基本信息进行操作。对用户权限进行设置。
  • 操作对象:系统管理员
  • 浏览对象:系统管理员
  1. 库存查询:合法用户可以查看库存的所有信息,可以查询总库存和各分仓库的库存,用户可以根据种类名和货物名查找匹配的物品。
  • 操作对象:注册用户、管理员
  • 浏览对象:注册用户、管理员
  1. 进货作业:管理员通过记录每次进货的物品的详细信息,系统在进货表中产生一条进货记录。
  • 操作对象:管理员
  • 浏览对象:管理员
  • 具体操作:管理员需将物品的货物号,种类号,种类名,货物名,数量,进货价格,仓库号,厂家号依次填入对应的栏目中,最后点击确定即可。
  1. 领料作业:管理员输入每次出货物品的信息,系统在出货单中产生一条出货记录。
  • 操作对象:管理员
  • 浏览对象:管理员
  • 具体操作:管理员在下拉菜单中选择相应的货物种类和货物名,在对应的空白栏中输入出货货物的厂家、数量、单价、领料人的名字,最后单击确定即完成该操作。
  1. 损坏处理:由于功能与领料作业类似,所以属于领料作业的子功能模块。
  • 操作对象:管理员
  • 浏览对象:管理员
  • 具体操作:与领料作业类似。
  1. 库存转库:用于将一个仓库的商品转移到另一个仓库。内容包括编号、源部门、目的部门、数量、货物号、经手人、调货日期等。由于是小型企业,所以同种类的商品都分在同个仓库中,需要调库时需将所有同种类的货物进行转库,不再对同种类不同货物名的商品进行细分。
  • 操作对象:管理员
  • 浏览对象:管理员
  • 具体操作:管理员在下拉菜单中选择该种类货物对应的货物种类、数量和源仓库号,填入目的仓库和经手人即可。
  1. 库存盘点:用于管理企业的库存盘点工作,将实际盘存的商品数量输入计算机,计算机自动与数据库中的库存数量进行核对,并产生盘盈盘亏统计信息。
  • 操作对象:管理员
  • 浏览对象:管理员
  • 具体操作:管理员选择盘点的货物名,输入该货物的厂家和数量,点击确定后即在该页面的下放显示出盘盈盘亏的信息。
  1. 历史查询:用于查询各种转库、盘点、进货、出货的历史数据。
  • 操作对象:注册用户、管理员
  • 浏览对象:注册用户、管理员
  1. 退出登录:让所有合法用户在操作完后顺利的退出系统。
  • 操作对象:所有用户

4  库存管理系统功能模块的具体实现

4.1 系统主要功能模块的实现及部分代码

4.1.1 用户注册和登录界面

在用户注册时首先检测该用户注册的用户名是否可用,即检查数据库该用户名是否已经存在,代码如下:

ConnectionSQL sqlcon1 = new ConnectionSQL();

        string User;

        User = TextBox1.Text.Trim();

   SqlDataReader UserReader = sqlcon1.SqldataReader("select *from ADMIN_LIST where UserId='" + User + "'");

        if (UserReader.Read())

        {

            Label5.Text = "该用户名已经被使用,请重新注册";

        }

        else

        {

            Label5.Text = "该用户名可以使用";

        }

检测完后,再判断注册用户输入的密码是否为空,若为空,则弹出“密码不能为空”的对话框;若不为空,则检测注册用户输入的密码与确认密码是否吻合,代码如下:

            if (Password =="")

            {

                    HttpContext.Current.Response.Write("<script>alert('密码不能为空!');window.location.href='Registration.aspx'</script>");

              

            }

          

            else

            {

                if (Password != Surepassword)

                {

                    HttpContext.Current.Response.Write("<script>alert('确认密码与密码不匹配,请重新输入!');window.location.href='Registration.aspx'</script>");

                }

                else

                {

                    sqlcon.Sqldataset("insert ADMIN_LIST(UserId,Password,Jurisdiction)values('" + User + "','" + Password + "','1')");

                    HttpContext.Current.Response.Write("<script>alert('恭喜,用户注册成功!');window.location.href='Admin.aspx'</script>");

                    // Label4.Text = "恭喜,用户注册成功,请点击返回登录";

                    TextBox1.Text = null;

                }

             }

对于密码过长的限制,在前台使用了RegularExpressionValidator验证控件,通过输入.{0,10}表达式,将密码长度限制在10个字符以下。

在用户登录界面,除了对用户名与密码的合法性验证外,还要将管理员权限的值赋给Session["Right"]这个全局变量,目的是为了以后方便对用户权限的判断。具体代码如下:

User = TextBox1.Text.Trim();

        PassWord = TextBox2.Text.Trim();

        SqlDataReader UserReader = skycon1.SqldataReader("select * from ADMIN_LIST where UserId='" + User + "' and Password='" + PassWord + "'");

        if (UserReader.Read())

        {

            if (UserReader.GetString(2).Trim()=="2")

            {

                Session["Right"]= "2";

            }

            HttpContext.Current.Response.Write("<script>alert('登录成功!');window.location.href='Admin.aspx'</script>");

            UserReader.Close();

        }

        else

        {

            Label3.Text = "你输入的用户名和密码不正确,请重新输入";

            UserReader.Close();

        }

4.1.2 进货作业

进货作业是库存管理系统中最为重要的模块之一,上面的模块设计中已经分析了进货作业中存在的几种情况,除此之外,系统还要判断管理员是否出现输入有误现象。如输入的种类号与种类名不相符时,货物号与货物名不相符合时,系统都应该报错,但这两种出现的几率不是很大,为了减轻服务器负担,并没有把这些判断加入到系统中,只是对管理员输入时进行默认,认为输入的对应的货物种类和名称都是相符合的。当输入的仓库号与货物所属仓库不一致时(同种类的货物都存放在一个仓库中),由于此类错误出现的几率很大,所以在系统中加入了判断,如出现错误,则系统弹出“您输入的仓库号与物品仓库号不符合,请重新输入”的对话框。对与管理员输入的进货数量,进货价的合法性判断都采用了RegularExpressionValidator验证控件进行判断,以减少后台的操作。具体代码如下:

       DataSet dt1 = skycon1.Sqldataset("select *from GOODS_DETAIL where HuoWuId='" + HuoWuId + "' and BusinessId='" + BusinessId + "'");

        if (dt1.Tables[0].Rows.Count != 0)//当该物品在明细表中已经存在时:

        {         

            DataSet dt2 = skycon1.Sqldataset("select *from GOODS_LIST where TypeId='" + TypeId+"'");//GooddataRow["TypeId"].ToString()

            if (dt2.Tables[0].Rows.Count != 0)

            {

                DataRow GooddataRow1 = dt2.Tables[0].Rows[0];           

                //判断仓库号

                if (StoreHouseId != GooddataRow1["StoreHouseId"].ToString().Trim())

                {

                    HttpContext.Current.Response.Write("<script>alert('您输入的仓库号与物品仓库号不符合,请重新输入!');window.location.href='Enter.aspx'</script>");

                }

                else

                {

                    skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");

                    DataRow GooddataRow = dt1.Tables[0].Rows[0];

                    SiQtyG = (int)GooddataRow["SiQty"] + JinhuoSiQty;

                    EnterPriceG = ((decimal)GooddataRow["EnterPrice"] * (int)GooddataRow["SiQty"] + EnterTotalprice) / ((int)GooddataRow["SiQty"] + JinhuoSiQty);

                    skycon1.SqlExcute("update GOODS_DETAIL set SiQty=" + SiQtyG.ToString() +     ",EnterPrice=" + EnterPriceG.ToString() + "where HuoWuId='" + HuoWuId + "' and      BusinessId='" + BusinessId + "'");

                    //更新细表                      

                    int SiQtyG1 = (int)GooddataRow1["SiQty"] + JinhuoSiQty;

                    decimal StorePrice = (decimal)GooddataRow1["StorePrice"] + EnterTotalprice;

                    skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG1.ToString() + ",StorePrice=" + StorePrice.ToString() + "where TypeId='" + TypeId + "'");//GooddataRow["TypeId"].ToString()

                    //更新总表

                    HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");

                }

            }

            else

            {

                HttpContext.Current.Response.Write("<script>alert('您输入的货物种类和和货物不相符,请重新输入!');window.location.href='Enter.aspx'</script>");

            }

        }

        else    

        {

            //如果是同种类不同名字的或不同产家的货物则执行下列步骤;

            DataSet dt4 = skycon1.Sqldataset("select *from GOODS_LIST where TypeId='" + TypeId + "'");

            DataSet dt5 = skycon1.Sqldataset("select *from GOODS_DETAIL where HuoWuId='" + HuoWuId + "'");

            if(dt4.Tables[0].Rows.Count!=0)

            {      

               

                if (dt5.Tables[0].Rows.Count != 0)//同种类同名但没有该厂家的货物

                {

                                      

                    DataRow GooddataRow = dt4.Tables[0].Rows[0];

                    int SiQtyG2 = (int)GooddataRow["SiQty"] + JinhuoSiQty;

                    decimal StorePrice1 = (decimal)GooddataRow["StorePrice"] + EnterTotalprice;

                    if (StoreHouseId != GooddataRow["StoreHouseId"].ToString().Trim())//判断仓库号

                    {

                        HttpContext.Current.Response.Write("<script>alert('您输入的仓库号与物品仓库号不符合,请重新输入!');window.location.href='Enter.aspx'</script>");

                    }

                    else

                    {

                        skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");

                     skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")"); 

                        skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG2.ToString() + ",StorePrice=" + StorePrice1.ToString() + "where TypeId='" + TypeId + "'");

                        HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");

                    }

                }

                else//同种类没有该名字的货物

                {

                    DataRow GooddataRow = dt4.Tables[0].Rows[0];

                    int SiQtyG3 = (int)GooddataRow["SiQty"] + JinhuoSiQty;

                    decimal StorePrice1 = (decimal)GooddataRow["StorePrice"] + EnterTotalprice;

                    if (StoreHouseId != GooddataRow["StoreHouseId"].ToString().Trim())//判断仓库号

                    {

                        HttpContext.Current.Response.Write("<script>alert('您输入的仓库号与物品仓库号不符合,请重新输入!');window.location.href='Enter.aspx'</script>");

                    }

                    else

                    {

                        skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");

                        skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");

                        skycon1.SqlExcute("insert GOODSNAME_LIST(HuoWuId,HuoWuName)values('" + HuoWuId + "','" + HuoWuName + "')");

                        skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG3.ToString() + ",StorePrice=" + StorePrice1.ToString() + "where TypeId='" + TypeId + "'");

                        HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");

                   }

                }

            }

            else  //如果是新种类的货物,则执行下列步骤;

            {

                        skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");

                        skycon1.SqlExcute("insert GOODS_LIST(TypeName,TypeId,SiQty,StoreHouseId,StorePrice)values('"+TypeName+"','"+TypeId+"','"+JinhuoSiQty.ToString()+"','"+StoreHouseId+"','"+EnterTotalprice.ToString()+"')");

                         skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");

                        skycon1.SqlExcute("insert GOODS_TYPES(TypeId,TypeName)values('" + TypeId + "','" + TypeName + "')");

                        skycon1.SqlExcute("insert GOODSNAME_LIST(HuoWuId,HuoWuName)values('" + HuoWuId + "','" + HuoWuName + "')");

                        HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");

            }

          }

4.1.3 库存盘点

库存盘点是库存管理中相对较为关键的一环,由于专业知识所限,这个模块功能不是很全面,盘盈和盘亏的计算是通过将实际盘存的货物数量与数据库中的库存数量进行相减,得到正值即为盘盈,负值为盘亏。代码如下:

if (PanDianSiQty >= StoreSiQty)

            {

                PanY = OutPrice * (PanDianSiQty - (int)DataGoodDetail["SiQty"]);

                sqlcon1.SqlExcute("insert PanDian_LIST(HuoWuId,HuoWuName,BusinessId,PanDianSiQty,StoreSiQty,OutPrice,PanY,DateTime)values('" + HuoWuId +

                "','" + HuoWuName + "','" + BusinessId + "'," + PanDianSiQty.ToString() + "," + StoreSiQty.ToString() + "," + OutPrice.ToString() + "," + PanY + ",'" + Datetime + "')");

                TextBox3.Text = PanY.ToString();

                TextBox4.Text = null;

            }

            else

            {

                PanK = OutPrice * ((int)DataGoodDetail["SiQty"] - PanDianSiQty);

                sqlcon1.SqlExcute("insert PanDian_LIST(HuoWuId,HuoWuName,BusinessId,PanDianSiQty,StoreSiQty,OutPrice,PanK,DateTime)values('" + HuoWuId +

               "','" + HuoWuName + "','" + BusinessId + "'," + PanDianSiQty.ToString() + "," + StoreSiQty.ToString() + "," + OutPrice.ToString() + "," + PanK + ",'" + Datetime + "')");

                TextBox4.Text = PanK.ToString();

                TextBox3.Text = null;

            }

4.2系统实现的关键技术

4.2.1 数据库的连接技术

过去,通过ADO的数据存取采用了两层的基于连接的编程模型。随着多层应用的需求不但增加,程序员需要一个无连接的模型。ADO.NET就应运而生了。ADO.NET的Managed Provider就是一个多层结构的无连接的一致的编程模型。Managed Provider提供了DataSet和数据中心(如MS SQL)之间的联系。Managed Provider包含了存取数据中心(数据库)的一系列接口。主要有三个部件:(1)连接对象Connection、命令对象Command、参数对象Parameter提供了数据源和DataSet之间的接口。DataSetCommand接口定义了数据列和表映射,并最终取回一个DataSet。(2)数据流提供了高性能的、前向的数据存取机制。通过IdataReader,你可以轻松而高效地访问数。(3)更底层的对象允许你连接到数据库,然后执行数据库系统一级的特定命令。

过去,数据处理主要依赖于两层结构,并且是基于连接的。连接断开,数据就不能再存取。现在,数据处理被延伸到三层以上的结构,相应地,程序员需要切换到无连接的应用模型。这样,DataSetCommand就在ADO.NET中扮演了极其重要的角色。它可以取回一个DataSet,并维护一个数据源和DataSet之间的“桥”,以便于数据访问和修改、保存。DataSetCommand自动将数据的各种操作变换到数据源相关的合适的SQL语句。从图上可以看出,四个Command对象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分别代替了数据库的查询、插入、更新、删除操作。

为了方便系统调用数据库连接,减少后台代码量,提高连接效率。我们把几个常用的方法都封装在ConnectionSQL这个类里面,以下是连接数据库代码:

public class ConnectionSQL:System.IDisposable

{

    private SqlConnection sqlcon1=null;

    public ConnectionSQL()

    {

      sqlcon1=new SqlConnection("server=localhost;uid=sa;pwd=;database=KuCunManage");

        //        // TODO: 在此处添加构造函数逻辑      //

    }

    public int SqlExcute(string s1) // 返回一个BOOL值       //

    {

        try

        {

            int i;

            if(sqlcon1.State==ConnectionState.Closed)

            sqlcon1.Open();

            SqlCommand com1 = new SqlCommand(s1,sqlcon1);

            i=com1.ExecuteNonQuery();

            return i;           

        }

        finally

        {

            sqlcon1.Close();

        }

       

}

    public SqlDataReader SqldataReader(string s1)

    {

        try

        {

            if (sqlcon1.State == ConnectionState.Closed)

            sqlcon1.Open();      

            SqlDataReader read1;

            SqlCommand com1 = new SqlCommand(s1, sqlcon1);

            read1 = com1.ExecuteReader();

            return read1;

        }

        finally

        {   

        }

}

    public DataSet Sqldataset(string s1) // 返回第一张表    //

    {

        try

        {

            if (sqlcon1.State == ConnectionState.Closed)

                sqlcon1.Open();

            SqlDataAdapter Sqlada1 = new SqlDataAdapter(s1, sqlcon1);

            DataSet dt1 = new DataSet();

            Sqlada1.Fill(dt1, "table1");

            return dt1;

        }

        finally

        {

            sqlcon1.Close();

        }

    }

     //销毁对象;

    public virtual void Dispose(bool flag)

    {

        if (flag == true)

        {

            sqlcon1.Close();

        }

        sqlcon1 = null;

    }

    public void Dispose()

    {

        GC.SuppressFinalize(true);

        this.Dispose(true);

    }

 }

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

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

相关文章

【shell】shell利用随机数生成指定范围的随机数及随机获取数组中元素

shell默认内置环境变量RANDOM echo $RANDOM 生成1~9的随机数 echo $RANDOM%91 %后面是多少&#xff0c;就是最大是多少 随机获取数组中的一个元素 array"3 4 44 8" random$(($RANDOM%41)) echo random:$random j0 for i in $array dojexpr $j 1if [ "$j&…

【平台开发】MTK6833——cache操作记录

CPU Cache 用的是一种叫 SRAM&#xff08;Static Random-Access Memory&#xff0c;静态随机存储器&#xff09; 的芯片。 通常分为L1&#xff0c;L2&#xff0c;L3三层缓存。 CPU 并不会直接和每一种存储器设备直接打交道&#xff0c;而是每一种存储器设备只和它相邻的存储器…

Linux---HTTP协议

HTTP HTTP协议&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种应用层协议&#xff0c;主要用于在Web浏览器和Web服务器之间传输数据。 一、认识URL 平时我们俗称的 " 网址 " 其实就是说的 URL http请求样例 看起来是一行一…

ubuntu20文件安装和卸载cuda11.6

搜索cuda 11.6 nvidia&#xff0c;进入官网https://developer.nvidia.com/cuda-11-6-0-download-archive 选择linux --> runfile 用安装包安装 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sudo s…

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

MySQL中的批量更新实战

MySQL中的批量更新实战 表结构 mysql> desc dept; --------------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------------- | deptno | int(11) …

第二代增强-采购订单抬头子屏幕增强

文章目录 第二代增强-采购订单抬头子屏幕增强需求查找增强点创建项目增强子屏幕定义全局变量编写出口函数代码激活增强运行结果查看创建的采购订单底表数据 第二代增强-采购订单抬头子屏幕增强 需求 查找增强点 创建项目 增强子屏幕 定义全局变量 *&---------------------…

读书笔记——《高质量C++/C编程指南》(2)

目录 前言 命名规则 共性规则 简单的Windows应用程序命名规则 表达式和基本语句 运算符优先级 复合表达式 if语句 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 对if 语句的补充说明 循环语句的效率 for 语句的循环控制变量 s…

自动驾驶中常见坐标系极其转换

各个传感器坐标系 相机坐标系统 摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。 感知算法和相机相关的坐标系有图像坐…

Pandas进阶

文章目录 第1关&#xff1a;Pandas 分组聚合第2关&#xff1a;Pandas 创建透视表和交叉表 第1关&#xff1a;Pandas 分组聚合 编程要求 使用 Pandas 中的 read_csv() 函数读取 step1/drinks.csv 中的数据&#xff0c;数据的列名如下表所示&#xff0c;请根据 continent 分组并…

MySQL-ELK基础

1&#xff1a;什么是 ELK ELK是由一家elastic公司开发的三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。三个项目各有不同的功能&#xff0c;之后又增加了许多新项目, 于是 从5.X版本后改名为Elastic Stack Elastic S…

【JavaScript】内置对象 - Date 日期对象 ④ ( 制作倒计时页面 )

文章目录 一、倒计时页面实现1、需求分析2、计算秒数3、计算倒计时时间的 天 / 时 / 分 / 秒4、页面中显示倒计时时间 二、完整代码示例1、完整代码2、执行结果 Date 日期对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Da…

晨华城乡社区网格化建设实施

一、目标任务 开展社会服务网格化管理工作的目标是为了实现基层社会治理管理体系全覆盖。全面形成指挥有力、协调顺畅、运转高效的运行体系&#xff0c;普遍建立覆盖城乡、行为规范、富有活力的组织网络&#xff0c;建立健全服务民生、维护稳定、推动发展的制度机制&#xff0…

速卖通商品评论API(aliexpress.item_review)返回值全解析

在电商领域&#xff0c;用户评论对于产品的推广和销售具有极其重要的影响。速卖通&#xff08;AliExpress&#xff09;作为全球知名的跨境电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中aliexpress.item_review API允许开发者获取商品的评论信息。本文将…

品质为王:高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析

品质为王&#xff1a;高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析 在当今的健康产品市场中&#xff0c;高效溶解性鱼油胶囊以其独特的营养价值和吸收效率赢得了众多消费者的青睐。然而&#xff0c;要想在激烈的市场竞争中脱颖而出&#xff0c;产品的品质保证至关重要。其中&a…

关于Kubernetes介绍及使用

Kubernetes简介及使用 Kubernetes&#xff08;简称K8s&#xff09;&#xff0c;是Google开源的容器编排平台&#xff0c;用于管理和自动化容器化应用的部署、扩展和运行。它最初由Google工程师开发&#xff0c;并于2015年捐赠给云原生计算基金会&#xff08;CNCF&#xff09;。…

深入理解WPF的ResourceDictionary

深入理解WPF的ResourceDictionary 介绍 在WPF中&#xff0c;ResourceDictionary用于集中管理和共享资源&#xff08;如样式、模板、颜色等&#xff09;&#xff0c;从而实现资源的重用和统一管理。本文详细介绍了ResourceDictionary的定义、使用和合并方法。 定义和用法 Res…

鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行

本篇有相当的难度&#xff0c;涉及用户栈和内核栈的两轮切换&#xff0c;CPU四次换栈&#xff0c;寄存器改值&#xff0c;将围绕下图来说明. 解读 为本篇理解方便&#xff0c;把图做简化标签说明: user:用户空间kernel:内核空间source(…):源函数sighandle(…):信号处理函数&a…

【操作系统】进程与线程概念基础知识

进程与线程概念基础知识 进程进程的概念进程控制块进程状态进程三状态模型挂起进程模模型进程的上下文切换进程控制 线程为什么引入线程线程的概念线程与进程的比较线程的上下文切换线程的实现 进程 进程的概念 1. 进程的定义&#xff1a; 进程是指一个具有一定独立功能的程序…

【面试干货】http请求报文的组成与作用?

【面试干货】http请求报文的组成与作用&#xff1f; 一、http 的请求报文组成二、请求行&#xff08;Request Line&#xff09;三、请求头部&#xff08;Request Headers&#xff09;四、请求体&#xff08;Request Body&#xff09;五、响应头部 &#xff08;Response Headers…