当前位置: 首页 > 编程日记 > 正文

开源依旧:再次分享一个进销存系统

开篇

我之前发过一篇博文《两天完成一个小型工程报价系统(三层架构)》,不少朋友向我要源码学习,后来久而久之忘记回复了。今天我再分享一个进销存系统,只为学习,没有复杂的框架和设计模式,有的是我个人的理解,大家互相探讨技术才会提高。当然我的命名不是很规范,兄弟们凑合着看。:)

思想和架构

在传统的三层架构思想上扩展出N层架构,将业务逻辑层换成WCF服务。抽象工厂的引入提高了程序的扩展性,单利+缓存+反射则提升了程序的性能。数据库则换成了Oracle,所以相应的数据访问层也换成了OracleDal,当然你完全可以写SqlServerDal,因为我数据访问层接口都已定义好。

 

界面和控件的设计美化

总体思路和流程---数据库Oracle

数据库既然选择了Oracle,当然先必须安装好Oracle,然后再装Plsql,这一步也是很简单的。不清楚的话,可去查找资料。

对Oracle而言,数据库已服务形式存在,有几个数据库就对应几个服务,删除了数据库后相应的服务也没了,其次一个兼容程序监听着服务。这些都可以自行配置,我不啰嗦了,毕竟我也不熟。我把Oracle脚本导出了,大家只要复制到Commad Window里粘贴即可,但前期创建表空间和用户我还是稍微提一下:

  • 首先用你用plsql连接一个服务(数据库Orcl),用Connect as SysDBA进入。
  • 创建表空间:注意路径一定要已经存在。
create tablespace invoicing
logging
datafile 'C:\oracle\product\10.2.0\db_1\oradata\invoicing.dbf'
size 32M
autoextend on
next 32M maxsize 1024M
EXTENT MANAGEMENT LOCAL;

  • 找到左下角侧用户(Users),创建用户Invoicing,密码:Invoicing,分配权限:dba,connect
  • 用新创建的用户名和密码重新登录。
  • 找到Command Window,把我提供给你的脚本复制进去就OK了。

 

总体思路和流程---数据访问层IDAL

  • 一个通用的泛型接口:
 public interface IBaseService<T> where T :class{List<T> GetEntities(string sqlWhere);T GetOneEntityByID(int id);T AddEntity(T entity);bool UpdateEntity(T entity);bool DeleteEntity(string sqlWhere);}
  • 某个数据访问层接口实继承这个泛型接口
    public interface ICommodityService:IBaseService<Model.CommodityModel>{}

总体思路和流程---抽象工厂Abstract

  •  public abstract class DalFactory{public abstract IDAL.ICommodityService CommdityDal{get;}public abstract IDAL.IPurchaseCommodityService PurchaseCommdityDal{get;}public abstract IDAL.IPurchaseOrdersService PurchaseOrderDal{get;}public abstract IDAL.ISalesCommodityService SalesCommodityDal{get;}public abstract IDAL.ISalesOrdersService SalesOrderDal{get;}public abstract IDAL.IUserService UserDal{get;}}

    总体思路和流程---数据访问层Dal

  • 为了提高效率,可以考虑缓存
        public override IDAL.ICommodityService CommdityDal{//缓存里拿get {OracleDAL.CommodityService instance = System.Web.HttpRuntime.Cache["CommodityDal"] as OracleDAL.CommodityService;if (instance == null){instance = new OracleDAL.CommodityService();System.Web.HttpRuntime.Cache.Add("CommodityDal", instance, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);}return instance;}}

  • OracleHelper和System.Data.OracleClient来实现数据访问层
namespace Insigma.Eyes.PSS.OracleDAL
{public class CommodityService:ICommodityService{public List<Model.CommodityModel> GetEntities(string sqlWhere){string sql = string.Format("select * from commodity where 1=1 {0}",sqlWhere);List<Model.CommodityModel> listCommodities = new List<Model.CommodityModel>();//Using 限定对象使用的范围在花括号里面,出了花括号后释放资源using (OracleDataReader odr=OracleHelper.ExecuteReader(OracleHelper.ConnectionString, CommandType.Text, sql, null)){while (odr.Read()){Model.CommodityModel commodity = new Model.CommodityModel();commodity.ID = odr.GetInt32(0);commodity.Name = odr.IsDBNull(1) ? "" : odr.GetString(1);commodity.Type = odr.IsDBNull(2) ? "" : odr.GetString(2);commodity.Manufacturer = odr.IsDBNull(3) ? "" : odr.GetString(3);commodity.Inventory = odr.IsDBNull(4) ? 0 : odr.GetInt32(4);commodity.UnitPrice = odr.IsDBNull(5) ? 0 : odr.GetDecimal(5);commodity.Unit = odr.IsDBNull(6) ? "" : odr.GetString(6);listCommodities.Add(commodity);}}return listCommodities;}public Model.CommodityModel GetOneEntityByID(int id){string sqlWhere = string.Format(" and id={0}",id);List<Model.CommodityModel> list = GetEntities(sqlWhere);return list.SingleOrDefault(c => c.ID == id);
        }private int GetNewID(){string sql = "select s_commodity.nextval from dual";return int.Parse(OracleHelper.ExecuteScalar(OracleHelper.ConnectionString,CommandType.Text,sql,null).ToString());}public Model.CommodityModel AddEntity(Model.CommodityModel entity){entity.ID = GetNewID();string sql = string.Format(@"insert into Commodity(ID,Name,Type,Manufacturer,Inventory,UnitPrice,Unit) values({0},'{1}','{2}','{3}',{4},{5},'{6}')", entity.ID, entity.Name, entity.Type, entity.Manufacturer, entity.Inventory, entity.UnitPrice, entity.UnitPrice);if (OracleHelper.ExecuteNonQuery(OracleHelper.ConnectionString,CommandType.Text,sql,null)>0){return entity;}else{return null;}}public bool UpdateEntity(Model.CommodityModel entity){string sql = string.Format("update Commodity set Name='{0}',Type='{1}',Manufacturer='{2}',Inventory={3},UnitPrice={4},Unit='{5}' where ID={6}",entity.Name, entity.Type, entity.Manufacturer, entity.Inventory, entity.UnitPrice, entity.Unit, entity.ID);return OracleHelper.ExecuteNonQuery(OracleHelper.ConnectionString,CommandType.Text,sql,null)>0; }public bool DeleteEntity(string sqlWhere){string sql = string.Format("delete form Commodity where 1=1 {0}",sqlWhere);return OracleHelper.ExecuteNonQuery(OracleHelper.ConnectionString, CommandType.Text, sql, null) > 0;}}
}

总体思路和流程---业务逻辑层WCF

  • wcf是什么,最简单理解就是接口,契约,当然你可以更加深入研究。我学的也不深。
namespace Insigma.Eyes.PSS.BLLWCFService
{// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ICommodityManagerService”。
    [ServiceContract]public interface ICommodityManagerService{[OperationContract][FaultContract(typeof(Exception))]CommodityModel[] GetCommodities(string name,string type,string manufacturer,string priceLow,string priceHigh);[OperationContract]CommodityModel[] GetCommoditiesByCondition(string condition);[OperationContract]CommodityModel GetOneCommodity(int id);[OperationContract][FaultContract(typeof(Exception))]CommodityModel AddCommodity(CommodityModel oneCommodity);[OperationContract][FaultContract(typeof(Exception))]bool UpdateCommodity(Model.CommodityModel commodity);}
}
  • 实现上面定义的接口契约:
    public class PurchaseManagerService : IPurchaseManagerService{//
        private AbstractFactory.DalFactory dataFactory = null;public PurchaseManagerService(){dataFactory = DefaultProviderDal.DefaultDataProviderFactory;}public Model.PurchaseOrdersModel[] GetPurchaseOrders(string orderNumber, string orderDateStart, string orderDateEnd, string status){string sqlWhere = "";if (!string.IsNullOrWhiteSpace(orderNumber)){sqlWhere += string.Format(" and orderNumber like '%{0}%'", orderNumber);}if (!string.IsNullOrWhiteSpace(orderDateStart)){try{DateTime dt = DateTime.Parse(orderDateStart);sqlWhere += string.Format(" and orderDate>=to_date('{0}','yyyy-MM-dd')", dt.ToString("yyyy-MM-dd"));}catch{Exception oe = new Exception();throw new FaultException<Exception>(oe, "查询条件开始时间有误!");}}if (!string.IsNullOrWhiteSpace(orderDateEnd)){try{DateTime dt = DateTime.Parse(orderDateEnd);sqlWhere += string.Format(" and orderDate<=to_date('{0}','yyyy-MM-dd')", dt.ToString("yyyy-MM-dd"));}catch{Exception oe = new Exception();throw new FaultException<Exception>(oe, "查询条件截至时间有误!");}}if (!string.IsNullOrWhiteSpace(status)){sqlWhere += string.Format(" and Status='{0}'", status);}//IDAL.IPurchaseOrdersService purchaseOrdersService = new OracleDAL.PurchaseOrderService();//return purchaseOrdersService.GetEntities(sqlWhere).ToArray();return dataFactory.PurchaseOrderDal.GetEntities(sqlWhere).ToArray();}public Model.PurchaseCommodityModel[] GetPurchaseCommoditiesByID(int purchaseID){string sqlWhere = string.Format(" and PurchaseOrderID={0}",purchaseID);//看看数据库里面的字段//IDAL.IPurchaseCommodityService purchaseCommodityService =new OracleDAL.PurchaseCommodityService();//return purchaseCommodityService.GetEntities(sqlWhere).ToArray();return dataFactory.PurchaseCommdityDal.GetEntities(sqlWhere).ToArray();}public Model.PurchaseCommodityModel AddPurchaseCommodityModel(Model.PurchaseCommodityModel onePurchaseCommodity){//return new OracleDAL.PurchaseCommodityService().AddEntity(onePurchaseCommodity);return dataFactory.PurchaseCommdityDal.AddEntity(onePurchaseCommodity);}//几个ID要分清楚public bool PostPurchaseOrder(int id){Model.PurchaseOrdersModel oneOrder=GetOnePurchaseOrder(id);if (oneOrder.Status.Equals("已入库")){Exception oe = new Exception();throw new FaultException<Exception>(oe,"订单已经提交,请务重复提交");}List<Model.PurchaseCommodityModel> purchaseCommoditiesList = GetPurchaseCommoditiesByID(id).ToList();IDAL.ICommodityService commodityService = new OracleDAL.CommodityService();foreach (Model.PurchaseCommodityModel onePurchaseCommodity in purchaseCommoditiesList){Model.CommodityModel commodityModel = new Model.CommodityModel();commodityModel.ID = onePurchaseCommodity.CommodityID;commodityModel.Manufacturer = onePurchaseCommodity.CommodityManufacturer;commodityModel.Name = onePurchaseCommodity.CommodityName;commodityModel.Type = onePurchaseCommodity.CommodityType;commodityModel.Unit = onePurchaseCommodity.CommodityUnit;commodityModel.UnitPrice = onePurchaseCommodity.CommodityUnitPrice;commodityModel.Inventory = onePurchaseCommodity.CommodityInventory + onePurchaseCommodity.Count;//这儿不会出现异常了吧,否则要回滚
                commodityService.UpdateEntity(commodityModel);}oneOrder.Status = "已入库";return new OracleDAL.PurchaseOrderService().UpdateEntity(oneOrder);}public Model.PurchaseOrdersModel GetOnePurchaseOrder(int id){//return new OracleDAL.PurchaseOrderService().GetOneEntityByID(id);return dataFactory.PurchaseOrderDal.GetOneEntityByID(id);}public Model.PurchaseCommodityModel GetOnePurchaseCommoditiesByID(int purchaseCommodityID){//return new OracleDAL.PurchaseCommodityService().GetOneEntityByID(purchaseCommodityID);return dataFactory.PurchaseCommdityDal.GetOneEntityByID(purchaseCommodityID);}public bool UpdatePurchaseCommodity(Model.PurchaseCommodityModel model){//return new OracleDAL.PurchaseCommodityService().UpdateEntity(model);return dataFactory.PurchaseCommdityDal.UpdateEntity(model);}public bool DeletePurchaseCommodity(int id){string sqlWhere = " and id=" + id;//return new OracleDAL.PurchaseCommodityService().DeleteEntity(sqlWhere);return dataFactory.PurchaseCommdityDal.DeleteEntity(sqlWhere);}public Model.PurchaseOrdersModel AddPurchaseOrder(Model.PurchaseOrdersModel purchaseOrder){//return new OracleDAL.PurchaseOrderService().AddEntity(purchaseOrder);return dataFactory.PurchaseOrderDal.AddEntity(purchaseOrder);}public bool UpdatePurchaseOrder(Model.PurchaseOrdersModel onePurchaseOrder){//return new OracleDAL.PurchaseOrderService().UpdateEntity(onePurchaseOrder);return dataFactory.PurchaseOrderDal.UpdateEntity(onePurchaseOrder);}public bool DeletePurchaseCommoditiesByPurchaseOrderID(int purchaseOrderID){string sqlWhere = " and PurchaseOrderID=" + purchaseOrderID;//调用另一个模块,调用BLL比较好//return new OracleDAL.PurchaseCommodityService().DeleteEntity(sqlWhere);return dataFactory.PurchaseCommdityDal.DeleteEntity(sqlWhere);}public bool DeleteOrderID(int id){string sqlWhere = string.Format(" and id={0}", id);//return new OracleDAL.PurchaseOrderService().DeleteEntity(sqlWhere);return dataFactory.PurchaseOrderDal.DeleteEntity(sqlWhere);}}
}

  •  dataFactory = DefaultProviderDal.DefaultDataProviderFactory;其实是个单利,我只要反射出一次工厂足以。
     public class DefaultProviderDal{private static AbstractFactory.DalFactory instance = null;static DefaultProviderDal(){//string filePath = HttpContext.Current.Server.MapPath("~/DataProvider");string filePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;string dllFileName = System.Configuration.ConfigurationManager.AppSettings["DataProviderDllFile"];string dalFactoryClassName = System.Configuration.ConfigurationManager.AppSettings["DataProviderFactoryName"];System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFile(filePath + "DataProvider\\" + dllFileName);instance = dll.CreateInstance(dalFactoryClassName) as AbstractFactory.DalFactory;}public DefaultProviderDal(){}public static AbstractFactory.DalFactory DefaultDataProviderFactory{get {return instance;}}}

    总体思路和流程---UI

  • 对WCF而言,实例化对象越多(如CommodityManagerServiceClient类的实例),对服务器压力越大,所以也可以考虑单利。
    public class WCFServiceBLL{//对WCF而言,对象实例化越多,对服务器压力越大。static BLLCommodity.CommodityManagerServiceClient commodityClient;static BLLSalesOrders.SalesManagerServiceClient salesClient;static BLLUsers.UserManagerServiceClient userClient;static BLLPurchaseOrders.PurchaseManagerServiceClient purchaseClient;public static CommodityManagerServiceClient GetCommodityService(){if (commodityClient==null){commodityClient = new CommodityManagerServiceClient();}if (commodityClient.State==CommunicationState.Closed){commodityClient = new CommodityManagerServiceClient();}if (commodityClient.State==CommunicationState.Faulted){commodityClient = new CommodityManagerServiceClient();}return commodityClient;

补充

由于数据库之间的主外键关系以及多表查询,为了方便,我创建了视图,这和SqlServer里面是一样的(Oracle里面是Create Or Replace),当然你也可以建立外键对象,我上个项目就是这么干的,当然ORM我们就不讨论了。

create or replace view v_purchasecommodity as
select pc.id,pc.purchaseorderid,pc.commodityid,c.name CommodityName,
c.type commodityType,c.manufacturer CommodityManufacturer,c.inventory CommodityInventory,
c.unitprice CommodityUnitPrice,c.unit CommodityUnit,pc.count,pc.purchaseprice,pc.totalprice
from purchasecommodity pc inner join commodity c on pc.commodityid = c.id;

再补充一点:Oracle的自动增长列并不是像SqlServer那样设置一下,就会自动增长,Oracle里面需要你自己创建Sequences,图形操作也行,命令也行,我导出的Oracle脚本里面已经包含了相应的Sequences,应该可以看懂的。其余差别不大,相信你能看懂。

create sequence INVOICING.S_USERS
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;

 关于界面美化的一些心得:

Winform程序功能很重要,但能提高用户体验那是最完美的,所以我用了一些图标,设置相应的大小,当然用户控件也是很重要的一部分,用户控件嵌套在窗体里面是很简单的:

  public class LoadControls{public static void LoadInventory(Control parent){parent.Controls.Clear();Inventory inventory = new Inventory();inventory.Dock = DockStyle.Fill;parent.Controls.Add(inventory);}public static void LoadPurchase(Control parent){parent.Controls.Clear();Purchase purchase = new Purchase();purchase.Dock = DockStyle.Fill;parent.Controls.Add(purchase);}public static void LoadSales(Control parent){parent.Controls.Clear();Sales sales = new Sales();sales.Dock = DockStyle.Fill;parent.Controls.Add(sales);}

 

 

 

总结

没有什么犹豫就写完了这篇博文,我把源代码贡献出来,当然这个例子只为学习,有需要的兄弟们可以拿去参考参考,大家多交流交流,才会相互促进进步,如果您觉得满意的话,不放支持我一下,帮忙个,有动力才有精力写出更好的博客,3x:)

 

下载

转载于:https://www.cnblogs.com/OceanEyes/archive/2012/08/03/invoicing.html

相关文章:

kotlin + springboot启用elasticsearch搜索

参考自&#xff1a; http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p78908 工具版本&#xff1a; elasticsearch 6.2.2、 kibana 6.2.2&#xff0c; 下载地址&#xff1a; elasticsearch、kibana 下载demo 1、kotlin版springboot项目创建 访问https:/…

insert 语句的选择列表包含的项多于插入列表中的项_如何定义和使用Python列表(Lists)

Python中最简单的数据集合是一个列表(list)。列表是方括号内用逗号分隔的任何数据项列表。通常&#xff0c;就像使用变量一样&#xff0c;使用符号为Python列表分配名称。 如果列表中包含数字&#xff0c;则不要在其周围使用引号。 例如&#xff0c;这是测试成绩的列表&#xf…

数据结构之主席树

这里讲静态的主席树&#xff0c;关于静态区间第k小。&#xff08;有兴趣的朋友还可以去看看我写的整体二分&#xff0c;代码实现略优于主席树我觉得&#xff0c;当然静态主席树是很好写的&#xff09; 题目描述&#xff1a; 题目描述 如题&#xff0c;给定N个正整数构成的序列&…

k-d tree算法的研究

By RaySaint 2011/10/12 动机 先前写了一篇文章《SIFT算法研究》讲了讲SIFT特征具体是如何检测和描述的&#xff0c;其中也提到了SIFT常见的一个用途就是物体识别&#xff0c;物体识别的过程如下图所示&#xff1a; 如上图(a)&#xff0c;我们先对待识别的物体的图像进行SIFT特…

Unicode,UTF-32,UTF-16,UTF-8到底是啥关系?

编码的目的&#xff0c;就是给抽象的字符赋予一个数值&#xff0c;好在计算机里面表示。常见的ASCII使用8bit给字符编码&#xff0c;但是实际只使用了7bit&#xff0c;最高位没有使用&#xff0c;因此&#xff0c;只能表示128个字符&#xff1b;ISO-8859-1(也叫Latin-1&#xf…

HDU 4407 sum 容斥原理

算法: 利用数据1...N的性质&#xff0c;求与P的互质的个数&#xff0c;位运算&#xff0c;容斥定理。。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<ma…

uniapp中qrcode生成二维码后传的参数不见了_阿虚教你制作动态二维码,超详细教程!

这篇教程很早之前就答应几个粉丝要写&#xff0c;拖的有点久了。内容比较多&#xff0c;先上个目录阿虚的教程会迟到&#xff0c;但永远不会缺席。hahahahhaha...一、 先说一下今天要教的内容ʕ•̫͡•ོʔ•̫͡•ཻʕ•̫͡•ʔ•͓͡•ʔ 1.不准备教的类似这种二维码&#…

得到最后的自增长列的最后一个值

declare Table_name varchar(60) set Table_name aa; Select so.name Table_name, --表名字 sc.name Iden_Column_name, --自增字段名字 ident_current(so.name) curr_value, --自增字段当前值 ident_incr(so.name) incr_value, --自增字段增长值 ident_seed(so.name) s…

关于C语言中 字符串常量的问题

昨天晚上我编写了一段简短的C语言程序&#xff08;Linux环境下&#xff09;&#xff0c;编译能够通过&#xff0c;但是运行的时候老是报段错误。我当时非常郁闷&#xff0c;因为代码不长。其中主函数中有这样一句话&#xff1a; char *str"epmzm bpmzm qa eqtt bpmzm qa i…

WPF布局(2) 使用的DockPanel面板进行简单的布局

DockPanel 面板是根据外边缘进行控件的拉伸&#xff0c;DockPanel的LastChildFill属性设置为True 时&#xff0c;最后一个添加的控件将占满剩余空间。 <DockPanel LastChildFill"True"><Button DockPanel.Dock"Top">Top Button</Button>…

合并两个有序数组(重新开始)

在看分治算法的时候&#xff0c;想先自己写写合并的代码&#xff0c;还是不熟练啊&#xff01; 为了保持对代码的敏感度&#xff0c;要保持练习。加油&#xff01; public class JustDoIt0803 {/*** 分治算法学习前准备*/public static void main(String[] args) {int[] x new…

miui通知栏要点两下_MIUI免费主题分享,半透明通知栏很好看,另附壁纸!

最近很少分享主题&#xff0c;主要原因是没发现太好的&#xff0c;甚至主题连一处漂亮的点都没有&#xff0c;不过还是有一款状态栏很精致的主题&#xff0c;这里分享大家&#xff0c;可用作混搭使用&#xff01;主题名&#xff1a;Blur首先主题是免费的&#xff0c;也之所以免…

C#中的委托和事件(续)

引言 如果你看过了 C#中的委托和事件 一文&#xff0c;我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容&#xff0c;还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题&#xff0c;包括一些大家常问到的问题&#xff0c;以及事件访…

优先级队列实现哈夫曼树的编码和译码

//优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float…

Git,Github和Gitlab简介和使用方法

什么是Git Git是一个版本控制系统&#xff08;Version Control System&#xff0c;VCS&#xff09;。 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 多年前&#xff0c;我在法国做第一个实习时&#xff08;2011年&#xff09;&a…

Win10控制桌面图标显示

1、桌面鼠标右键&#xff0c;进入个性化 2、进入主题&#xff1a; 3、 转载于:https://www.cnblogs.com/132818Creator/p/11356237.html

如何查看笔记本电脑配置参数_教你如何查看 MacBook 配置,超简单

相信很多人都会遇到这样的情况&#xff1a;当有人问起你的 MacBook 配置时&#xff0c;你却愣了&#xff0c;因为你自己都没注意或者查看过。实际上&#xff0c;有很多人对自己的电脑配置都不是很清楚&#xff0c;本期Mac毒就来教教你如何快速查看苹果电脑的相关配置。1、首先&…

为什么以太网帧的长度最短64字节,最长1518字节?

1.碰撞槽时间 假设公共总线媒体长度为S&#xff0c;帧在媒体上的传播速度为0.7C&#xff08;光速&#xff09;&#xff0c;网络的传输率为R&#xff08;bps&#xff09;&#xff0c;帧长为L&#xff08;bps&#xff09;&#xff0c;tPHY为某站的物理层时延&#xff1b; 则有&a…

PHP 利用AJAX获取网页并输出(原创自Zjmainstay)

看点&#xff1a; 1、file_get_contents超时控制。 2、页面编码判断。 3、键盘Enter键捕捉响应。 4、键盘event兼容处理。//event event || window.event; 5、XMLHttpRequest 和 jQuery 两种实现方案。 6、页面及源码同时展示。 XMLHttpRequest版本 get_web.php <?phphead…

TCP/IP 协议栈4层结构及3次握手4次挥手

TCP/IP 协议栈是一系列网络协议的总和&#xff0c;是构成网络通信的核心骨架&#xff0c;它定义了电子设备如何连入因特网&#xff0c;以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构&#xff0c;分别是应用层、传输层、网络层和链路层&#xff0c;每一层都呼叫它的下…

简述BT下载技术及其公司发展现状

一、 BT下载技术是什么&#xff1f;谁发明的&#xff1f; 2003年&#xff0c; 软件工程师Bram Cohen发明了BitTorrent协议&#xff08;俗称“BT下载”&#xff09;&#xff0c;其采用高效的软件分发系统和P2P技术共享大体积文件&#xff08;如一部电影或电视节目&#xf…

php要怎么使用imagettftext_延长防腐木使用要怎么做呢?

木结构基层的处理&#xff1a;设计施工中应充分保持防腐木材与地面之间的空气流通&#xff0c;可以更有效延长木结构基层的寿命。制作安装防腐木时&#xff0c;防腐木之间需留0.2-1CM的缝隙(根据木材的含水率再决定缝隙大小&#xff0c;木材含水率超过30&#xff05;时不应超过…

15个新鲜的单页网站设计实例

单页网站因为结合着css3 html5和jquery技术 使得这样的网站看这些网站看起来更具吸引力和新鲜的感&#xff0c;逐渐成为互联网上一个新趋势 &#xff0c;今天介绍网站设计一些新鲜的例子 。我希望大家将欣赏这美妙的设计师做的工作。随时分享您的看法&#xff0c; 1) Pigspotte…

异常处理机制(Begin try Begin Catch)

begin try--SQL end trybegin catch --sql (处理出错动作)end catch我们将可能会出错的sql 写在begin try...end try 之间&#xff0c;若出错&#xff0c;刚程序就跳到紧接着的begin try...end try 的beign catch...end catch中&#xff0c;执行beign catch...end catch错误处理…

开源工程系列之讯飞VBOX改装蓝牙5.0(aptX HD)音箱

最近得到一个小度智能音箱&#xff0c;功能还不错&#xff0c;但是音效一般。想起了吃灰的讯飞VBOX&#xff0c;音效相当棒&#xff0c;只是APP和服务器已经不再维护&#xff0c;只能放里面自带的歌曲&#xff0c;遂决定改装VBOX为蓝牙音箱&#xff0c;使用aptX HD&#xff08;…

台式电脑键盘按键错乱_Win7系统键盘数字错乱了应该如何解决?

Win7系统键盘数字错乱怎么办&#xff1f;相信很多用户都遇过键盘数字键错乱的情况&#xff0c;明明按的是数字键&#xff0c;但是却打不出相应的数字&#xff0c;整体键盘数字都错乱了&#xff0c;这是什么回事呢&#xff1f;接下来就为大家分享win7系统键盘数字错误恢复方法。…

程序编辑SHP文件并应用更改到数据源

在上一篇Blog中峻祁连介绍了在Map 3D中通过程序删除图层及数据源的方法&#xff0c;并且卖了个关子&#xff0c;这个方法还有另外一个妙用&#xff0c;今天就简单介绍一下。对数据源的编辑估计是Map 3D开发中最常见的功能了&#xff0c;包括对添加、删除和修改要素。这里以删除…

目录树结构改变后刷新目录树

主界面中含有一个目录树&#xff08;是将一个目录下所有的文件和子文件呈现成一个可以逐级展开的树&#xff09;&#xff0c;我将树的功能单独写成一个FileTree.class&#xff0c;这样能够让目录树处理更清晰些。第一次我的做法是&#xff1a;将建立TreeViewer和Tree写在FileTr…

Docker - 在CentOS7.5中升级Docker版本

1 - 检查当前版本 [rootlocalhost ~]# uname -a Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [rootlocalhost ~]# [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.5.1804 (C…

编码的细微区别

在编程学习的深入后&#xff0c;不可避免的会遇到ANSI、GB2312、UTF8的编码问题&#xff0c;如果不彻底了解他们的区别&#xff0c;都最终会造成一个问题--乱码&#xff01;想要更好的了解编码&#xff0c;我们首先应该了解编码的历史演变。 在继续学习之前先明白一下转化关系吧…