ASP.NET一种多商家网络商店的设计与实现

摘  要

21世纪是网络的世纪,电子商务随之将成为主流商业模式,多商家网络商店系统就是一个C2C型的电子商务系统。本文详细论述了采用ASP.NET 2005 和 SQL Server 2000等技术实现的一个多商家网络商店的过程。论文首先阐述了本设计题目的选题意义、背景,和网站的开发平台;其次根据网站需求对系统的数据库和功能模块做了详细设计,并在此基础上实现了用户管理模块、权限管理模块、购物订单模块,商家管理模块、商品管理模块、留言板和公告管理模块等功能。最后通过对网站进行的全面测试展现了网站界面简单、美观,网站功能丰富、操作方便等特点,完全符合多商家网络商店的需求,能够为用户网上购物提供一个很好的操作平台。

关键词电子商务;多商家;网络商店;网上购物;SQL Server 2000;C#

3.1  ASP.NET介绍

ASP.NET是一个已编译的、基于.NET的环境,把基于通用语言的程序在服务器上运行。将程序在服务器端首次运行时进行编译,比ASP即时解释程序速度上要快很多,而且是可以用任何与.NET兼容的语言创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NET Framework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。

3.2  C#介绍

C#是一种面向对象的编程语言,它作为Visual Studio中的一部分推出。C#(发音为“C-Sharp”)既保持了C++中熟悉的语法,并且还包含了大量的高效代码和面向对象特性。C#语言在保持C/C++灵活性的基础上为程序员带来更高效的RAD开发方式。它不仅能用于WEB服务程序的开发,并且还能开发强大的系统级程序。

3.3  SQL Server 2000介绍

Microsoft SQL Server 2000是Microsoft公司继SQL Server 6.5和SQL Server 7.0以后,在新千年推出的又一改进的新版关系型数据管理系统。它能使用户快捷地管理数据库和开发应用程序。SQL Server 2000使用了先进的数据库结构,与Windows DNA紧密集成,具有强大的Web功能,它可以利用高端硬件平台以及最新网络和存储技术,可以为最大的Web站点和企业应用提供优良的扩展性和可靠性,使用户能够在Internet领域快速建立服务系统,为占领市场赢得宝贵的时间。同时,SQL Server 2000还为用户提供了重要的安全性功能的增强,为用户的数据安全提供了可靠的保证。另外,SQL Server 2000在数据库服务器自动管理技术方面处于数据库领域的领先地位,它可以使用户免去繁琐复杂的工作量,从而有精力处理更重要的问题,使用系统在商业战略上占得先机。

4.2  系统功能分析

1.浏览功能,一般游客或注册用户都可以浏览及查询商品,商店。

2.用户注册及登录功能,用户需注册帐号后才能登录及进行其他相应操作。

3.用户修改资料、购买商品以及查询订单功能。

4.商家添加删除商品、管理商品、查询卖出商品、修改店铺资料及查看买家留言等功能。

5.管理员对用户、商家、商品的管理功能

6.管理员对商品分类的添加、删除功能。

7.管理员发布修改公告及推荐商品。

4.3  系统模块分析

4.3.1  后台管理模块分析

此模块只对系统管理员开放。管理员可以对用户、商家、商品,以及公告推荐商品进行管理。

4.3.2  前台管理模块分析

此模块对普通用户及卖家开放。又分为买家模块和买家模块:

  1. 买家模块。买家可以对注册资料进行修改对订单进行查看。
  2. 卖家模块。卖家在买家的基础上还可以对商品和商店进行管理,以及对买家下的订单和买家留言进行查看。

6.1    用户浏览及搜索商品


所有用户及游客最先进入的是网站的首页,它包括推荐商品、商店排行等内容,也包括了商品的搜索功能。首页界面如图6-1所示: 


导航栏上面关于用户登录注册部分会根据用户登录与否显示不同的信息,其代码如下:
public string gettop()
    {
        string htmlstr;
        if (Session["webusername"] == null)//跟踪用户名,判断是否登录
        { htmlstr = "<td width='200' align='center'><span class='top1'>你好,欢迎来到零点商城!</span></td>    <td width='70'><a href='user/register.aspx' class='top2'>[免费注册]</a></td>   <td width='45'><a href='user/login.aspx' class='top2'>[登录]</a></td>"; }
        else
        { htmlstr = "<td width='245' align='right'><span class='top1'>欢迎您," + Session["webusername"] + "</span></td> <td width='70'align='center'><a href='login_out.aspx' class='top2'>[退出]</a></td>"; }
        return htmlstr;//返回htmlstr的值
 }
如登录后界面如图6-2所示,未登录界面如图6-3所示。

显示最新商品代码如下:
public static string getnewgoods()
    {
        string sql = "select top 4 * from web_goods where goods_audit=1 order by goods_id desc";//查找出的结果按商品ID的降序排列,即最后添加的最先显示。
        IDataReader drnew = common.GetDataReader(sql); //从数据库读出最新添加的商品
        string ret = "";
        int i = 1;
        string goodsname = "";
        while (drnew.Read())
        {
            if (drnew ["goods_name"].ToString().Length< 8) //判断商品名称长度,若小于8则直接将值赋给proname,若不是则赋给前八个字
            {
                goodsname = drnew ["goods_name"].ToString();
             }
            else
            {
                goodsname = drnew ["goods_name"].ToString().Substring(0, 8);
             }
            if (i != 3)
                {
                    ret += "<td ><table height='150' border='0' align='center' cellpadding='0' cellspacing='0'><tr><td height='130' align='center'><a href='goods.aspx?id=" + drnew["goods_id"].ToString() + "' class='top1' target='_blank'><img src='upload/" + drnew["goods_img"].ToString() + "' width='120' height='120' border='0'></a></td></tr><tr><td height='20' align='center'><a href='goods.aspx?id=" + drnew["goods_id"].ToString() + "' class='top1' target='_blank'>" + goodsname + "</a></td>     </tr>   <tr>  <td align='center'><span class='top2'>¥" + WebCommon.common.strFormatmoney(drnew["goods_price"].ToString()) + "</span></td> </tr>  </table></td>";
                }
            else 
            {
                ret += "</tr><tr><td ><table height='150' border='0' align='center' cellpadding='0' cellspacing='0'><tr><td height='130' align='center'><a href='goods.aspx?id=" + drnew["goods_id"].ToString() + "' class='top1' target='_blank'><img src='upload/" + drnew["goods_img"].ToString() + "' width='120' height='120' border='0'></a></td></tr><tr><td height='20' align='center'><a href='goods.aspx?id=" + drnew["goods_id"].ToString() + "' class='top1' target='_blank'>" + goodsname + "</a></td>     </tr>   <tr>  <td align='center'><span class='top2'>¥" + WebCommon.common.strFormatmoney(drnew["goods_price"].ToString()) + "</span></td> </tr>  </table></td>";
            }
            i++;
        } //从数据库读出数据并显示于页面
        drnew.Close();//关闭数据库
        return ret;
}
其中:
public static string strFormatmoney(string str)
        {            
            str = str.Replace(".0000", ".00");
            return str;
        } //格式化货币

public static IDataReader GetDataReader(string sql)
    {
        Database db = DatabaseFactory.CreateDatabase();
        IDataReader dr = db.ExecuteReader(CommandType.Text, sql);
        return dr; 
 }//返回DataReader


6.2    用户管理页面


在用户管理的首页,我们可以看到用户的详细资料,界面如图6-4所示(此图为有商家权限用户的界面):


代码如下:
public string main() 
    {
        string sql = "select * from web_user where user_name='" + Session["webusername"] + "'";
        IDataReader dr = common.GetDataReader(sql);
        dr.Read();
        Label1.Text = dr["user_name"].ToString();
        Label2.Text = dr["user_email"].ToString();
        Label3.Text = dr["user_truename"].ToString();
        Label4.Text = dr["user_idcard"].ToString();
        Label5.Text = dr["user_mobile"].ToString();
        Label6.Text = dr["user_tel"].ToString();
        Label7.Text = dr["area_class1"].ToString();
        Label8.Text = dr["area_class2"].ToString();
        Label9.Text = dr["user_address"].ToString();
        Label10.Text = dr["user_postalcode"].ToString();
         Label11.Text = dr["user_date"].ToString();
        int s = int.Parse(dr["shop_id"].ToString());
        string str;
        if (s == 0)
        {
            str = "<tr><td height='30' class='top1'>您还未注册为卖家,想要卖商品请点击左边的<span class='top2'>成为卖家</span></td></tr>";
        }
        else {
            str = "<tr><td height='30' class='top1'>您已经是卖家了哦,想要卖商品请点击左边的<span class='top2'>添加商品</span></td></tr>";
        }
        return str;
        dr.Close();
}
卖家添加商品首先选择商品分类,其界面如图6-5所示:


代码如下:
protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Session["webusername"] == null) //判断Session值是否为空,如果为空则跳到登录页面
            {
                Response.Redirect("user/login.aspx");
            }
            init2();
            ListBox2.Enabled = true;// 实例化并启动一个新的工作线程,稍后将添加工作线程本身的功能
            ListBox3.Enabled = false;//终止该工作线程
            Button1.Enabled = false;
        }
    }
    protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)//通过ListBox1的动作显示ListBox2的内容
    {
        string sql = "select * from web_goods_class2 where goods_class1='" + ListBox1.SelectedValue + "'";
        ListBox2.Enabled = true;
        ListBox3.Enabled = false;
        Button1.Enabled = false;
        ListBox2.DataSource = common.GetDataReader(sql);
        ListBox2.DataTextField = "goods_class2";
        ListBox2.DataValueField = "goods_class2";
        ListBox2.DataBind();
        initlabel();//显示Label1中的内容,即所选择的添加商品的分类
    }
    public void init2()//初始化ListBox1
    {
        string sql = "select * from web_goods_class1 order by goods_class1_id";
        ListBox1.DataSource = common.GetDataReader(sql);
        ListBox1.DataTextField = "goods_class1";
        ListBox1.DataValueField = "goods_class1";
        ListBox1.DataBind();
    }
    protected void ListBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        string sql = "select * from web_goods_class3 where goods_class2='" + ListBox2.SelectedValue + "'";
        ListBox3.Enabled = true;
        Button1.Enabled = false;
        ListBox3.DataSource = common.GetDataReader(sql);
        ListBox3.DataTextField = "goods_class3";
        ListBox3.DataValueField = "goods_class3";
        ListBox3.DataBind();
        initlabel();
    }
    protected void ListBox3_SelectedIndexChanged(object sender, EventArgs e)
    {
        Button1.Enabled = true;
        initlabel();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("addgoods.aspx?type=" + ListBox3.SelectedValue);//进入商品详细资料添加页面
    }
    public void initlabel()
    {
        string strlistbox1 = "";
        string strlistbox2 = "";
        string strlistbox3 = "";
        if (ListBox2.SelectedValue != "")
        {
            strlistbox2 = " > " + ListBox2.SelectedValue;
        }
        if (ListBox3.SelectedValue != "")
        {
            strlistbox3 = " > " + ListBox3.SelectedValue;
        }
        Label1.Text = ListBox1.SelectedValue + strlistbox2 + strlistbox3;
    }
商品详细资料添加界面如图6-6所示: 


代码如下:
protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Session["webusername"] == null)
            {
                Response.Redirect("user/login.aspx");//返回错误信息
            }
            else if (Request["type"] == null) 
            {
                Response.Redirect("sell.aspx");
            }
            Init2();//初始化界面
        }
    }
    protected void BtnSave_Click(object sender, EventArgs e)
    {
        if (checkRequest() == false)
        {
            return;
        }
        try
        {
            string nam = FileUpload1.PostedFile.FileName;
            string upload3 = "img1.jpg";
            if (FileUpload1.HasFile == true)
            {
                int i = nam.LastIndexOf(".");//取得文件名(包括路径)里最后一个"."的索引
                string newext = nam.Substring(i).ToLower();//取得文件扩展名
                if (newext == ".gif" || newext == ".jpg" || newext == ".jpeg" || newext == ".bmp")
                {
                    
                    string savePath1 = Server.MapPath("~/upload/");
                    string savePathsmall = Server.MapPath("~/smallupload/");//生成缩略图
                    savePath1 += FileUpload1.PostedFile.ContentLength.ToString() + newext;
                    savePathsmall += FileUpload1.PostedFile.ContentLength.ToString() + newext;
                    FileUpload1.SaveAs(savePathsmall);
                    WebCommon.common.MakeSLT(savePathsmall, savePath1);
                    upload3 = FileUpload1.PostedFile.ContentLength.ToString() + newext;
                }
                else
                {
                    Response.Write("<script>alert('你上传的图片格式不对,正确的图片格式为gif,jpg,jpeg,bmp!');</script>");
                    return;
                }
            }
            string image = upload3;//图片
            string goodsdes = WebCommon.common.strFormat(TextBox1.Text);//产品详细信息
            string username = Session["webusername"].ToString();//商家登陆名
            string goodsdate = DateTime.Now.ToShortDateString();
            string sql = "insert into web_goods(goods_name,goods_price,goods_tranprice,goods_img,goods_description,goods_startdate,goods_enddate,goods_date,goods_class3,user_name,goods_brandtype,goods_audit,goods_vip)values('" + Txtgoodsname.Text + "','" + Txtgoodsprice.Text + "','" + Txtgoodstranprice.Text + "','" + image + "','" + goodsdes + "','" + Txtgoodsstartdate.SelectedValue + "','" + Txtgoodsenddate.SelectedValue + "','" + goodsdate + "','" + Label22.Text + "','" + username + "','" + TxtBand.Text + "','0','0')";
            if (common.ExecuteSql(sql) == "1")
            {
                Response.Write("<script>alert('你添加的信息已经成功提交。');</script>");
                TextBox1.Text = "";
                Txtgoodsname.Text = "";
                string sql2 = "update web_shop set shop_goods_number=shop_goods_number+1 where user_name=" + username;
                common.ExecuteSql(sql2);
            }
            else
            {
                Response.Write("<script>alert('抱歉,添加信息错误,请检查信息是否正确。');</script>");
            }
        }
        catch
        {
            Response.Write("<script>alert('抱歉,添加信息错误,请检查信息是否正确。');</script>");
        }
    }

    private void Init2()
    {
        //商品类型初始化      
        Label22.Text = Request["type"].ToString();
        //商品出售开始时间初始化 
        //商品出售结束时间初始化
        DateTime t = DateTime.Now;
        Txtgoodsenddate.Items.Add(t.AddDays(40).ToShortDateString());
        for (int i = 0; i < 40; i++)
        {
            Txtgoodsstartdate.Items.Add(t.AddDays(i).ToShortDateString());
            Txtgoodsenddate.Items.Add(t.AddDays(i).ToShortDateString());
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("sell.aspx");//跳转到修改商品分类页面
    }
    public bool checkRequest()
    {
        if (Txtgoodsname.Text == "")
        {
            Response.Write("<script>alert('请输入商品名称');</script>");
            return false;
        }
        else if (Txtgoodsprice.Text == "")
        {
            Response.Write("<script>alert('请输入商品价格');</script>");
            return false;
        }
        else if (Txtgoodstranprice.Text == "")
        {
            Response.Write("<script>alert('请输入商品运费');</script>");
            return false;
        }
        else if (TextBox1.Text == "")
        {
            Response.Write("<script>alert('请输入产品描述');</script>");
            return false;
        }
        else
        {
            return true;
        }
    }
订单查询页面(以下是商家部分,买家类似),界面如图6-7所示:


代码如下:
protected void DataGrid1_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
    {
        DataGrid1.CurrentPageIndex = e.NewPageIndex;
        string sql = "select * from web_list where sell='" + Session["webusername"].ToString() + "' order by list_date desc";
        DataGrid1.DataSource = common.GetDataSet(sql);
        DataGrid1.DataKeyField = "list_id";
        DataGrid1.DataBind();
    }
其中:
public static DataSet GetDataSet(string sql)
    {
        Database db = DatabaseFactory.CreateDatabase();
        DataSet ds= db.ExecuteDataSet(CommandType.Text, sql);
        return ds;
    }


6.3    购买商品


购买商品页面部分代码如下:
protected void Button1_Click(object sender, EventArgs e)
    {
            string sql="select * from web_goods where goods_id='"+Request["id"]+"'";
            IDataReader dr = common.GetDataReader(sql);
            dr.Read();
            int gnum = int.Parse(dr["goods_number"].ToString());//将字符串转换成int型数据,方便下面的比较
            int bnum=int.Parse(this.Txtgoodsnumber.Text);
            if (bnum < 0 || bnum > gnum)//判断商品购买数量是否超出范围
            {
                Response.Write("<script>alert('您输入的商品数量不正确');</script>");
            }
            else { 
                string strdate = DateTime.Now.ToShortDateString();
                string str = "等待发货";
                string sql = "insert into web_list(buy,sell,goods_id,goods_name,goods_number,list_price,list_date,list_condition)values('" + Session["webusername"].ToString + "','" + dr["user_name"].ToString + "','" + dr["goods_id"].ToString() + "','" + dr["goods_name"].ToString() + "','" + this.Txtgoodsnumber.Text + "'," + this.Txtallprice.Text + ",'" + strdate + "','" + str + "')";
                common.ExecuteSql(sql);//将数据存入数据库
                  Response.Write("<script>alert('您已订购成功,请等待卖家联系'); document.location='Default.aspx';</script>");//返回商品订购成功信息,并跳转到首页
            }
            dr.close();
    }
购买商品界面如图6-8所示:


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

其他的 框架安全:Apache Solr 远程代码漏洞.(CVE-2019-0193)

什么是 Apache Solr Apache Solr是一个开源的搜索服务&#xff0c;便用Java语言开发&#xff0c;主要基于 HTTP 和ApacheLucene 实现的。Sor是一个高性能&#xff0c;采用Java5开发&#xff0c;基于Lucene的全文搜索服务器。 目录&#xff1a; 什么是 Apache Solr 生成的漏…

Multisim 14 常见电子仪器的使用和Multisim的使用

multisim multisim&#xff0c;即电子电路仿真设计软件。Multisim是美国国家仪器&#xff08;NI&#xff09;有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0…

【Python项目】基于大数据的【电影市场预测分析】

技术简介&#xff1a;使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介&#xff1a;系统都需要简单的安全登陆检查&#xff0c;在登陆成功之后要进行在映电影的分析、票房分析、电影数据等功能相关性的数据统计&#xff0c;为了使用方便这些统计型的数据使用图表来进行表…

C++高精度算法-加法

引子 在C++的运算中,难免会出现很大很大的数,下面是各个关键字的表示范围 但是如果要表示的数超过了long long可以表示的最大值( 2 64 2^{64} 264-1) 怎么办呢? 如果强制表示,就会溢出,这里的溢出大家可以自行百度,反正就是会出一些-5665434之类的数 现在,就要切入正…

Git 的原理与使用(上)

Git是一个分布式版本控制系统&#xff0c;它被广泛用于协作开发和管理软件项目。开发人员可以通过Git来跟踪文件的变化、协调工作、并管理项目的不同版本。 Git允许用户在不同的分支上开发新功能&#xff0c;然后合并这些分支并确保团队成员之间的工作协调一致。此外&#xff…

【大模型赋能开发者】海云安入选数世咨询LLM驱动数字安全2024——AI安全系列报告

近日&#xff0c;国内知名数字产业领域第三方调研咨询机构数世咨询发布了LLM驱动数字安全2024——AI安全系列报告。报告通过调研、公开信息收集等方式对目前十余家已具备LLM相关的应用能力安全厂商对比分析出了这一领域当前的产业现状并进行了各厂商的能力展示。 海云安凭借近…

易图讯三维电子沙盘-大数据处理服务

易图讯科技10名高级大数据工程师&#xff0c;高效、快速进行POI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 免费专业提供POI、AOI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 1年更新2次POI、高清卫星影像。

Netty源码分析二NioEventLoop 剖析

剖析方向 NioEventLoop是一个重量级的类&#xff0c;其中涉及到的方法都有很复杂的继承关系&#xff0c;调用链&#xff0c;要想把源码全部过一遍工作量实在是太大了&#xff0c;于是小编就基于下面的这些常见的问题来对NioEventLoop的源码来进行剖析 1.Seletor何时创建 1.1Se…

【Linux】- Linux环境变量[8]

目录 环境变量 $符号 自行设置环境变量 环境变量 环境变量是操作系统&#xff08;Windows、Linux、Mac&#xff09;在运行的时候&#xff0c;记录的一些关键性信息&#xff0c;用以辅助系统运行。在Linux系统中执行&#xff1a;env命令即可查看当前系统中记录的环境变量。 …

三、RocketMQ应用

RocketMQ应用 一、测试环境工程准备二、消息响应1.消息发送的状态-SendStatus2.producer消息Id-msgId3.broker消息Id-offsetMsgId 三、普通消息1.消息发送分类1.1 同步发送消息1.2 异步发送消息1.3 单向发送消息 2.代码举例2.1 同步消息发送生产者2.2 异步消息发送生产者2.3 单…

Python中bisect模块

Python中bisect模块 在Python中&#xff0c;如果我们想维持一个已排序的序列&#xff0c;可以使用内置的bisect模块&#xff0c;例如&#xff1a; import bisect# 用于处理已排序的序列 inter_list [] bisect.insort(inter_list, 3) bisect.insort(inter_list, 2) bisect.in…

【博士生必看】论文润色大揭秘!

&#x1f4dd; 投稿拒稿&#xff1f;语言不过关&#xff1f;别怕&#xff0c;我来支招&#xff01;&#x1f469;‍&#x1f393; &#x1f31f; 我的论文润色经历&#xff0c;从拒稿到接收的逆袭之路&#xff01;✨ &#x1f449; 【论文润色&#xff0c;我选了它】 我选择了…

数据结构之排序(上)

片头 嗨&#xff0c;小伙伴们&#xff0c;大家好&#xff01;我们今天来学习数据结构之排序&#xff08;上&#xff09;&#xff0c;今天我们先讲一讲3个排序&#xff0c;分别是直接插入排序、冒泡排序以及希尔排序。 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a…

阿里云 物联网平台 MQTT连接、数据传输

阿里云 物联网平台 MQTT连接、数据传输 1、设备连接阿里云 2、多设备之前的通信、数据流转 3、设备数据来源的读取。 基于C# winform 开发上位机&#xff0c;读取设备、仪器、MES或者电子元器件的数据&#xff0c;MQTT传输至阿里云平台&#xff0c;可视化界面构建界面&#…

JSpdf,前端下载大量表格数据pdf文件,不创建dom

数据量太大使用dom》canvas》image》pdf.addimage方法弊端是canvas超出 浏览器承受像素会图片损害&#xff0c;只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长&#xff0c;虽然最终可以做到抽取最小dom节点转canvas拼接数据&#xff0c;但是死…

字节码基础

基本概念 java中的字节码&#xff0c;英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。 java字节码简介 1、java byteco…

指针的奥秘(四):回调函数+qsort使用+qsort模拟实现冒泡排序

指针 一.回调函数是什么&#xff1f;二.qsort函数使用1.qsort介绍2.qsort排序整型数据3.qsort排序结构体数据1.通过结构体中的整形成员排序2.通过结构体中的字符串成员排序 三.qsort模拟实现冒泡排序 一.回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 …

华为机试打卡 HJ2 计算某字符出现次数

要机试了&#xff0c;华孝子求捞&#xff0c;功德 描述 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出输入字符串中该字符的出现次数。&#xff08;不区分大小写字母&#xff09; 数据范围&#xff1a; 1≤&a…

47.乐理基础-音符的组合方式-连线

连线与延音线长得一模一样 它们的区别就是延音线的第三点&#xff0c;延音线必须连接相同的音 连线在百分之九十九的情况下&#xff0c;连接的是不同的音&#xff0c;如下图的对比&#xff0c;连线里的百分之1&#xff0c;以现在的知识无法理解&#xff0c;后续再写 在乐谱中遇…

Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)

免责声明:本文仅做技术交流与学习... 目录 定时任务 打包配合 SUID-本地 原理: 背景: 操作演示: 分析: 实战发现: 定时任务 文件权限配置不当-WEB&本地 操作演示: 定时任务 打包配合 SUID-本地 原理: 提权通过获取计划任务执行文件信息进行提权 . 1、相对路径和…