文档章节

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

 木宛城主
发布于 2015/03/02 19:39
字数 2152
阅读 254
收藏 0
点赞 0
评论 0

开篇

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

思想和架构

在传统的三层架构思想上扩展出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:)

 

下载

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
开源进销存系统--华夏ERP

华夏ERP完整开源版J2EE代码 很多人说华夏ERP是目前唯一完整开源的进销存系统 虽然目前只有进销存+财务的功能,但后面将会推出ERP的全部功能,大家一起努力吧 系统部署初始账号:jsh,密码:1...

季圣华 ⋅ 2017/07/01 ⋅ 9

开源ERP--PSI

PSI是一款基于SaaS模式(Software as a Service软件即服务)的企业管理软件。PSI以商贸企业的核心业务:采购、销售、库存(进销存)为切入点,最终目标是行业化的ERP解决方案。 PSI是希腊字母Ψ...

PSI ⋅ 2015/02/01 ⋅ 25

欢迎广大技术爱好者参与JEECG开源项目

=========================================================================== 欢迎广大技术爱好者参与JEECG开源项目 JEECG开源项目 是一款基于代码生成器的智能开发平台。在不断的摸索中吸...

Jeecg ⋅ 2013/09/09 ⋅ 0

悟空客户关系管理(CRM)--悟空CRM

悟空软件是国内一流的CRM供应商,提供CRM开源版本、商业版本、云服务,并有Android和IOS客户端,支持在线租用和自行部署及微信企业号。产品目前累计下载量达60余万次,使用客户近万家,并赢得...

开源CRM ⋅ 2013/03/29 ⋅ 6

悟空CRM 0.4.6 Beta 版本震撼发布

1.悟空CRM系统介绍 悟空CRM是一款基于PHP/MYSQL开发的客户关系管理软件。适应Windows、Linux等多种平台,支持Apache、Nginx、IIs多种服务器软件,且开放的源代码具有良好的开放性、可扩展性、...

开源CRM ⋅ 2014/08/02 ⋅ 25

一库仓储推出进销存版本

一库仓储推出进销存版本 ekusale2.0 一库进销存是 一库仓储的进销存版本,专业针对零售类的商业企业,如淘宝商家等等。 一库进销存:第一便捷的开源进销存软件 基于 HTML5 的,便捷企业仓储管...

BatM3 ⋅ 2012/08/05 ⋅ 10

谁推荐个开源php进销存软件啊?难寻 啊啊啊啊 啊

谁推荐个开源php进销存软件啊?难寻 啊啊啊啊 啊 谁推荐个开源php进销存软件啊?难寻 啊啊啊啊 啊

zhuweiwei ⋅ 2010/11/06 ⋅ 7

悟空CRM 0.5.2 升级发布,客户关系管理系统

亲爱的小伙伴们: 为纪念中国抗战胜利70周年,悟空CRM特于9月2号推出开源版0.5.2。悟空CRM开源版用户可以使用APP客户端了!!! 只需进行域名登记,填写激活码即可免费使用。 登记流程:www...

开源CRM ⋅ 2015/09/07 ⋅ 9

web做的B/S的收银系统

业余程序员的问题,请专业给指导 想PHP做B/S结构的收银系统,实际不? 当然这个收银不像超市的收银支付量这么大,超市的系统响应速度这么快,我这个不需要这么快,一个实体店做个基本的进销存...

水人 ⋅ 2013/07/26 ⋅ 5

关于应不应该选择Flash/Flex的一点愚见

这篇文章 http://www.oschina.net/news/31896/html5-vs-flash-flex http://www.infoq.com/cn/news/2012/08/html5-vs-flash-flex 引发的思考 不提文章中的种种错误了,就谈技术选择吧,很多人...

kajhsdjkah ⋅ 2012/08/16 ⋅ 11

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 27分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 28分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 29分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 44分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 48分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 50分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 51分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 51分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 51分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 52分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部