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.mzph.cn/pingmian/10969.shtml

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

相关文章

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站&#xff0c;包括外贸企业网站、个人博客网站、中小企业官网等&#xff0c;那么作为新手不知道哪家香港虚拟主机好用的时候&#xff0c;该如何找到可以试用的香港虚拟主机呢&#xff1f; 香港虚拟主机也称作香港空间、香港虚拟空间&#xff0c;…

【Unity】Unity项目转抖音小游戏(二)云数据库和云函数

业务需求&#xff0c;开始接触一下抖音小游戏相关的内容&#xff0c;开发过程中记录一下流程。 抖音云官方文档&#xff1a;https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/cloud-function-debug 1.开通抖音云环境 抖音云地址&a…

C++string 类的常用方法

string (构造函数) (1) default 构造长度为零字符的空字符串。 (2) copy 构造 str 的副本。 (3) substring 复制从字符位置 pos 开始并跨越 len 字符的 str 部分&#xff08;如果任一 str 太短或 len 为 string&#xff1a;&#xff1a;npos&#xff0c;则复制 str 的末尾…

Leaflet.canvaslabel在Ajax异步请求时bindPopup无效的解决办法

目录 前言 一、场景重现 1、遇到问题的代码 2、问题排查 二、通过实验验证猜想 1、排查LayerGroup和FeatureGroup 2、排查Leaflet.canvaslabel.js 三、柳暗花明又一村 1、点聚类的办法 2、歪打正着 总结 前言 在上一篇博客中介绍了基于SpringBoot的全国风景区WebGIS按…

免疫优化算法(Immune Optimization Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 免疫算法是一种模拟生物免疫系统的智能优化算法。想象一下&#xff0c;当我们的身体遇到病毒或细菌侵袭时&#xff0c;免疫系统会启动…

DHCP原理

什么是DHCP DHCP (Dynamic Host Configuration Protocol,动态主机配置协议&#xff09;是由Internet工作任务小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议&#xff0c;是一个应用层协议&#xff0c;使用UDP的67和68端口。 DHCP的前身是B…

Windows下安装 Emscripten 详细过程

背景 最近研究AV1编码标准的aom编码器&#xff0c;编译的过程中发现需要依赖EMSDK&#xff0c;看解释EMSDK就是Emscripten 的相应SDK&#xff0c;所以此博客记录下EMSDK的安装过程&#xff1b;因为之前完全没接触过Emscripten 。 Emscripten Emscripten 是一个用于将 C 和 …

[hpssupfast@mailfence.com].Elbie勒索病毒如何恢复数据和预防

[hpssupfastmailfence.com].Elbie是一种新型勒索病毒,快速恢复重要数据请添加技术服务号(safe130)。以下是关于elbie勒索病毒的详细信息&#xff1a; 病毒介绍&#xff1a; elbie勒索病毒&#xff0c;也称为PHOBOS勒索软件&#xff0c;它通过加密文件并要求支付赎金以恢复对文…

涉案财物管理系统|DW-S405系统全国都有案例

涉案财物管理系统&#xff08;智财物&#xff1a;DW-S404&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对涉密载体进行统一管理、分析的信息化、智能化、规范化的系统。 涉案财物管理系统主要实现对涉案物品进…

RisingWave基本操作

什么是RisingWave RisingWave 是一款基于 Apache 2.0 协议开源的分布式流数据库。RisingWave 让用户使用操作传统数据库的方式来处理流数据。通过创建实时物化视图&#xff0c;RisingWave 可以让用户轻松编写流计算逻辑&#xff0c;并通过访问物化视图来对流计算结果进行及时、…

分享一个处理大文件效率拉满的神器

&#x1f3c3;‍♂️ 微信公众号: 朕在debugger© 版权: 本文由【朕在debugger】原创、需要转载请联系博主&#x1f4d5; 如果文章对您有所帮助&#xff0c;欢迎关注、点赞、转发和订阅专栏&#xff01; 前言 系统当天有些表的数据需要恢复成前一天的样子&#xff0c;幸好有…

Rpcx (一):详解【介绍、基础示例 demo】

一.rpcx介绍 1.1 rpc是什么 远程过程调用的通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。简单地说就是能使应用像调用本地…

【动态规划】子序列问题I|最长递增子序列|摆动序列|最长递增子序列的个数|最长数对链

一、最长递增子序列 300. 最长递增子序列 算法原理&#xff1a; &#x1f4a1;细节&#xff1a; 1.注意子序列和子数组的区别&#xff1a; (1)子序列&#xff1a;要求顺序是固定的&#xff08;要求没那么高&#xff0c;所以子序列就多一些&#xff09; (2)子数组&#xff1a;要…

2024年深圳市教师招聘报名流程(建议电脑)

2024年深圳市教师招聘报名流程&#xff08;建议电脑&#xff09; #深圳教师招聘 #深圳教招 #深圳教师招聘考试 #教师招聘报名照片处理 #深圳教师招聘笔试

(Java)心得:LeetCode——19.删除链表的倒数第 N 个节点

一、原题 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&…

1-02-02:虚拟化与容器化Docker环境搭建

1.02.02 虚拟化与容器化Docker环境搭建 一. 虚拟化与容器化技术简介1. 虚拟机环境2. docker环境 二. Docker 架构与隔离机制2.1 Docker 架构2.2 Docker 隔离机制2.3 资源限制2.4 Docker应用场景 三. 实战:Docker在Centos7安装与镜像加速 ❤❤❤3.1 docker安装3.2 设置镜像加速 …

17 SPI FLASH读写

SPI 协议简介 SPI 即 Serial Periphera linterface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;主要用于与FLASH、实时时钟、AD 转换器等外设模块的通信&#xff0c;它是一种高速的全双工同步的通信总线。 SPI 设备分为主设备和从设备&#xff0c;SPI 通信必…

crossover24中文破解版百度云免费下载 crossover永久免激活汉化包安装使用教程 crossover24激活码分享

原则上&#xff0c;我们不提倡各位使用破解版&#xff0c;这是处于对知识产权的保护&#xff0c;也是为了各位的长远利益。使用正版你可以获得更优质的服务和完善的产品功能。 但仍然有部分用户由于预算、使用习惯等原因&#xff0c;需要破解版。所以本文不讲原则&#xff0c;…

有没有适合女生或者宝妈下班后可以做的副业?

宝妈与上班族女生的新篇章&#xff1a;水牛社副业兼职之旅 在繁忙的职场和温馨的家庭之间&#xff0c;不少女性渴望找到一种既能兼顾家庭又能实现自我价值的兼职方式。对于上班族女生和宝妈们来说&#xff0c;水牛社这样的线上任务平台为她们提供了一个全新的选择。 上班族女…

【备战软考(嵌入式系统设计师)】12 - 嵌入式系统总线接口

我们嵌入式系统的总线接口可以分为两类&#xff0c;一类是并行接口&#xff0c;另一类是串行接口。 并行通信就是用多个数据线&#xff0c;每条数据线表示一个位来进行传输数据&#xff0c;串行接口就是一根数据线可以来一位一位地传递数据。 从上图也可以看出&#xff0c;并行…