两天完成一个小型工程报价系统(三层架构)-阿里云开发者社区

开发者社区> 长征6号> 正文

两天完成一个小型工程报价系统(三层架构)

简介:
+关注继续查看

花了两天,整理了一下三层架构,顺便练了一个小型三层架构——工程报价系统。

功能很简单,完成基本的增删改查

  1. 模型层:由于表设计时存在主外键关系,故把表映射成对象时添加一个外键对象来保存外键那张表的相关数据。

 

复制代码
            // 外键实体
            private Product _product;
            private Project _project;

            public Project _Project
            {
                get { return _project; }
                set { _project = value; }
            }

            public Product _Product
            {
                get { return _product; }
                set { _product = value; }
            }
复制代码

 

  2.数据访问层:把数据封装成Model对象的各层之间传递

  我个人不喜欢三层之间传递DataSet数据集,我的理解是尽量不在BLL层出现DataSet,所以我在DAL层把所有获取的数据封装成IEnumerable集合,然后返回。

复制代码
         protected IEnumerable<ProjectItem> ToModelsByFK(SqlDataReader reader)
         {
             var list = new List<ProjectItem>();
             while (reader.Read())
             {
                 list.Add(ToModelByFK(reader));
             }
             return list;
         }  

复制代码
复制代码
    public ProjectItem ToModelByFK(SqlDataReader reader)
         {
             ProjectItem projectItem = new ProjectItem();
             projectItem._Product = new Product();
             projectItem._Project = new Project();
             projectItem.ID = (int)ToModelValue(reader, "ID");
             projectItem._Product.ID = (int)ToModelValue(reader, "ProductID");
             projectItem._Project.ID = (int)ToModelValue(reader,"projectID");
             projectItem._Product.Manufacturer = ToModelValue(reader, "Manufacturer").ToString();
             projectItem._Product.Parameters = ToModelValue(reader, "Parameters").ToString();
             projectItem._Product.Price = decimal.Parse( ToModelValue(reader, "Price").ToString());
             projectItem._Product.ProductName = ToModelValue(reader, "ProductName").ToString();
             projectItem._Product.Specification = ToModelValue(reader, "Specification").ToString();
             projectItem._Product.Unit = ToModelValue(reader, "Unit").ToString();
             projectItem.Count = (int)ToModelValue(reader, "Count");
             projectItem.TotalMoney = (decimal)ToModelValue(reader, "TotalMoney");
             projectItem.UnitPrice = (decimal)ToModelValue(reader, "UnitPrice"); 
             return projectItem;
         }
复制代码
复制代码
protected object ToModelValue(SqlDataReader reader,string columnName)
        {
            if(reader.IsDBNull(reader.GetOrdinal(columnName)))
            {
                return null;
            }
            else
            {
                return reader[columnName];
            }
        }
复制代码

使用GetProjectByCondition方法返回一个封装成对象的 IEnumerable集合

复制代码
      public IEnumerable<Model.Project> GetProjectByCondition(string projectName, string customerName, string contract, string tel)
        {
            StringBuilder sqlWhere = new StringBuilder("select * from Project where 1=1");
            List<SqlParameter> listParameters = new List<SqlParameter>();
            if (!string.IsNullOrWhiteSpace(projectName))
            {
                sqlWhere.AppendLine(" and projectName like @projectName");
                listParameters.Add(new SqlParameter("projectName", "%" + projectName + "%"));
            }
            if (!string.IsNullOrWhiteSpace(contract))
            {
                sqlWhere.AppendLine(" and Contact like @Contact");
                listParameters.Add(new SqlParameter("Contact", "%" + contract + "%"));
            }
            if (!string.IsNullOrWhiteSpace(customerName))
            {
                sqlWhere.AppendLine(" and customer like @customer");
                listParameters.Add(new SqlParameter("customer", "%" + customerName + "%"));
            }
            if (!string.IsNullOrWhiteSpace(tel))
            {
                sqlWhere.AppendLine(" and tel like @tel");
                listParameters.Add(new SqlParameter("tel", "%" + tel + "%"));
            }
            using (SqlDataReader reader = SqlHelper.ExecuteDataReader(sqlWhere.ToString(), listParameters.ToArray()))
            {
                return ToModels(reader);
            }

        }
复制代码

UpdatePassChecked方法接受一个对象,通过对象的属性来获取数据

复制代码
  public int UpdatePassChecked(ProjectItem projectItem)
         {
             string sql =
                 "UPDATE Project " +
                 "SET " +
             " ProjectName = @ProjectName"
                 + ", Customer = @Customer"
                 + ", Contact = @Contact"
                 + ", Tel = @Tel"
                 + ", DeliveryPlace = @DeliveryPlace"
                 + ", DeliveryTime = @DeliveryTime"
                 + ", TransportCosts = @TransportCosts"
                 + ", PaymentTerm = @PaymentTerm"
                 + ", Bak = @Bak"

             + " WHERE ID = @ID";


             SqlParameter[] para = new SqlParameter[]
            {
                new SqlParameter("@ID", projectItem._Project.ID)
                    ,new SqlParameter("@ProjectName", ToDBValue(projectItem._Project.ProjectName))
                    ,new SqlParameter("@Customer", ToDBValue(projectItem._Project.Customer))
                    ,new SqlParameter("@Contact", ToDBValue(projectItem._Project.Contact))
                    ,new SqlParameter("@Tel", ToDBValue(projectItem._Project.Tel))
                    ,new SqlParameter("@DeliveryPlace", ToDBValue(projectItem._Project.DeliveryPlace))
                    ,new SqlParameter("@DeliveryTime", ToDBValue(projectItem._Project.DeliveryTime))
                    ,new SqlParameter("@TransportCosts", ToDBValue(projectItem._Project.TransportCosts))
                    ,new SqlParameter("@PaymentTerm", ToDBValue(projectItem._Project.PaymentTerm))
                    ,new SqlParameter("@Bak", ToDBValue(projectItem._Project.Bak))
            };

             return SqlHelper.ExecuteNonQuery(sql, para);

         }
复制代码

Add方法传入一个已经把数据封装好的对象,然后返回一个新的对象(包含新创建生成的ID)

复制代码
    public Product Add(Product product)
        {
                string sql ="INSERT INTO Product (ProductName, Specification, Manufacturer, Parameters, Price, Unit)  output inserted.ID VALUES (@ProductName, @Specification, @Manufacturer, @Parameters, @Price, @Unit)";
                SqlParameter[] para = new SqlParameter[]
                    {
                        new SqlParameter("@ProductName", ToDBValue(product.ProductName)),
                        new SqlParameter("@Specification", ToDBValue(product.Specification)),
                        new SqlParameter("@Manufacturer", ToDBValue(product.Manufacturer)),
                        new SqlParameter("@Parameters", ToDBValue(product.Parameters)),
                        new SqlParameter("@Price", ToDBValue(product.Price)),
                        new SqlParameter("@Unit", ToDBValue(product.Unit)),
                    };
                    
                int newId = (int)SqlHelper.ExecuteScalar(sql, para);
                return GetByID(newId);
        }
复制代码

 

  3.业务逻辑层:业务逻辑层是项目的核心,业务逻辑上的代码通常在这儿实现(一言难尽)。

简单数据验证:

复制代码
        public bool UpdateThroughChecked(ProjectItem projectItem)
        {
            if (string.IsNullOrEmpty(projectItem._Project.ProjectName))
            {
                throw new Exception("项目名称不能为空");
            }
            //顾客姓名可以为空,但联系人不能为空,所以数据库里就应该设计好
            if (string.IsNullOrEmpty(projectItem._Project.Contact))
            {
                throw new Exception("联系人姓名不能为空");
            }
            if (string.IsNullOrEmpty(projectItem._Project.Tel))
            {
                throw new Exception("联系电话不能为空");
            }
            if (string.IsNullOrEmpty(projectItem._Project.DeliveryPlace))
            {
                throw new Exception("交货地点不能为空");
            }
            if (string.IsNullOrEmpty(projectItem._Project.DeliveryTime))
            {
                throw new Exception("交货时间不能为空");
            }
            if (projectItem._Project.TransportCosts<00)
            {
                throw new Exception("运输费用不能为负数");
            }
            return new DAL.ProjectItemService().UpdatePassChecked(projectItem) > 0;

        }
复制代码

计算总金额:

复制代码
     public decimal GetProductTotalMoney(int projectID)
        {
            var list = new DAL.ProjectItemService().GetProductTotalMoney(projectID);
            decimal  totalMoney = 0.00M;
            foreach (var model in list)
            {
                totalMoney+=model.TotalMoney.Value;
            }
            return totalMoney;
        }
复制代码

根据查询条件获取数据集合:

复制代码
 /// <summary>
        /// 根据查询条件获取数据集合
        /// </summary>
        /// <param name="condition"></param>
        /// <returns></returns>
        public IEnumerable<Model.Product> GetProductsByCondition(string condition)
        {
           return new DAL.ProductService().GetProductsByCondition(condition);
       
        }
复制代码

根据ProjectItemID获取一条记录(封装成对象)

        public Model.ProjectItem GetOneProjectItemByID(int ProjectItemID)
        {
            return new DAL.ProjectItemService().GetOneProjectItemByID(ProjectItemID);
        }

增加一条记录:

复制代码
        /// <summary>
        /// 新增一条记录 根据条件
        /// </summary>
        /// <param name="modelProject"></param>
        /// <returns></returns>
        public Model.Project AddPassCheckd(Model.Project modelProject)
        {

            if (string.IsNullOrEmpty(modelProject.ProjectName))
            {
                throw new Exception("项目名称不能为空");
            }
            if (string.IsNullOrEmpty(modelProject.Customer))
            {
                throw new Exception("顾客名称不能为空");
            }
            if (string.IsNullOrEmpty(modelProject.Tel))
            {
                throw new Exception("联系电话不能为空");
            }
            if (modelProject.TransportCosts <= 0)
            {
                throw new Exception("运输费用不能为负数:(");
            }
            return new DAL.ProjectService().Add(modelProject);
           
        }
复制代码

删除一个项目:

复制代码
   /// <summary>
        /// 删除一个项目
        /// </summary>
        /// <param name="projectID"></param>
        /// <returns></returns>
        public bool DeleteProject(int projectID)
        {
             bool isSucceed=  new BLL.ProjectItemManager().DeleteProjectItemsByProjectID(projectID);
             isSucceed = new DAL.ProjectService().DeleteByID(projectID) > 0 && isSucceed;
             return isSucceed;
        }
复制代码

4.表现层(UI)

简单的窗体里嵌套窗体:

复制代码
        public void LoadProjectListForm()
        {
            projectListForm = null;
            if (projectListForm==null)
            {
                projectListForm = new ProjectListForm();
            }
            //去掉边框
            projectListForm.FormBorderStyle = FormBorderStyle.None;
            projectListForm.TopLevel = false;//窗体是否是顶级窗体
            projectListForm.Dock = DockStyle.Fill;//填充
            projectListForm.Show();//不写看不到
            panelContainer.Controls.Clear();//清空
            panelContainer.Controls.Add(projectListForm);
        }
复制代码

绑定数据:

我原先思路是直接在DataGridView里绑定对象的属性,和GridView一样使用,但一直无法绑上去,哪儿错了?

所以只能曲线救国了:

复制代码
 void LoadData()
        {
            var list = new BLL.ProjectItemManager().GetAllProducts(projectID);
            //dataGridViewProjectItems.DataSource = list;//当控件被绑定时无法向其添加Row
            dataGridViewProjectItems.Rows.Clear();
            foreach (var model in list)
            {
                int i = dataGridViewProjectItems.Rows.Add();
                dataGridViewProjectItems.Rows[i].Cells["idColumn"].Value = model.ID;
                dataGridViewProjectItems.Rows[i].Cells["specificationColumn"].Value = model._Product.Specification;
                dataGridViewProjectItems.Rows[i].Cells["productNameColumn"].Value = model._Product.ProductName;
                dataGridViewProjectItems.Rows[i].Cells["manufacturerColumn"].Value = model._Product.Manufacturer;
                dataGridViewProjectItems.Rows[i].Cells["parametersColumn"].Value = model._Product.Parameters;
                dataGridViewProjectItems.Rows[i].Cells["productIDColumn"].Value = model._Product.ID;
                dataGridViewProjectItems.Rows[i].Cells["totalMoneyColumn"].Value = model.TotalMoney;
                dataGridViewProjectItems.Rows[i].Cells["countColumn"].Value = model.Count;
                dataGridViewProjectItems.Rows[i].Cells["unitPriceColumn"].Value = model.UnitPrice;
                dataGridViewProjectItems.Rows[i].Cells["projectIDColumn"].Value = model._Project.ID;
            }
复制代码

5.项目总结

花了一个周末修修补补完成了这个工程报价系统,算是复习了一把三层架构。

如果有需要这个项目的朋友可以留下邮箱,我发给你,不算很专业,凑合着参考下~~

没想到这么多朋友要我的源码,我很感动。附件我就不传了,我也怕误导新人。有需要的朋友可以留下邮箱,大家一起探讨,我的代码纯当入门阶段,是我个人对三层架构的理解,不足之处,也请多多包涵,提个意见,希望与君互勉。想要更深刻探索我推介《ASP.NET 设计模式》


 源代码下载:
88x31.png
本博客为木宛城主原创,基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名木宛城主(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。

本文转自木宛城主博客园博客,原文链接:http://www.cnblogs.com/OceanEyes/archive/2012/06/18/project.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SAP系统三层架构
SAP系统三层架构:表示层,应用层,数据库层   表示层:也可以说个人用户client。由表示层提出数据请求,然后应用层对请求进行处理,再通过数据库层DBMS系统对数据进行处理。
902 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
22600 0
ebs系统架构简介2——三层结构和Environment file下篇
整理自:http://www.itpub.net/thread-1409361-1-1.html Database Tier:我们看R12的后台数据库。 Oracle Applications 充分使用 Oracle 数据库提供的各种数据类型:select...
1177 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4508 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7789 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9437 0
ebs系统架构简介1——三层结构上篇
转载自:http://www.itpub.net/thread-1409361-1-1.html 《Oracle Applications DBA 基础》3- 4 系统架构及基本系统管理知识1.
1244 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
1133 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3247 0
+关注
1224
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载