汽车租赁系统

  又到项目阶段了,总是感觉有点兴奋,每次着手到一个项目时,总是很激动,想马上把这个项目完成,终归梦想是美好的,现实是残酷的,

还是老套路,先来看看这个项目主要完成哪些功能。

一.主要功能:

1.实现租车功能。

选中一辆租车信息,输入租车者姓名,即可租车成功!在未租列表中点击刷新该车辆显示,在租车列表中会出现对应的租车信息将会消失。

2.实现还车功能。

选中一辆还车信息,输入使用天数,进行结算。点击租车列表中的刷新按钮该车辆信息会显示,在未租列表中该车辆会消失。

3.实现新车入库功能。

选择入库的汽车类型,填写对应车辆的信息,进行汽车入库,在未租列表中点击刷新按钮就会显示刚才添加的车辆信息。

2.思路:

  根据日常生活中的租车案例,咋们都知道租车是分种类的,在这里呢,轿车和卡车属于一种交通工具的,所以要在我们的程序中就要抽象出一个交通工具类(Vechile)作为父类

抽象出对应的子类就是轿车类(Car)和卡车类(Truck),到了这里,还别忘还有一个工厂类(VechileFactory),是用来示例化子类的对象,在这里需要注意的是,简单工厂类里的方法是静态的,

返回值是父类类型,也就是Vechile类,需要传入参数,在方法体中,通过switch选择结构进行选择,到底实例化哪个子类对象。

首先有这么几个类:

01.Vehicle类:

是一个交通工具类(抽象类,也是父类),在他的底层统领着两个子类,分别是Car类,和Truck类,在这个类中有一个计算价格的方法。

 

 //父类:交通工具类
   public abstract class Vehicle
    {
        public string Color { get; set; }//汽车颜色
        public int DailyRent { get; set; }//每日租金
        public string LicenseNo { get; set; }//车牌号
        public string Name { get; set; }//车名
        public int RentDate { get; set; }//还车日期
        public string Rentuser { get; set; }//还车人
        public  int  YearsOfService{ get; set; }//使用时间
       //无参构造
        public Vehicle() { }
      //带参构造用于给属性赋值
        public Vehicle(string color, int dailyrent, string licenseno, string name, int YearsOfService) 
        {
            this.Color = color;
            this.DailyRent = dailyrent;
            this.LicenseNo = licenseno;
            this.Name = name;
            this.YearsOfService = YearsOfService;
        }
       //计算价格的方法
        public abstract double CalculatePrice();
    }

 

02.Car类(轿车):Vechile的子类。

//小汽车类继承自交通工具类
    public class Car:Vehicle
    {
        //无参构造
        public Car() { }
        //带参构造
        public Car(string color, int dailyrent, string licenseno, string name, int YearsOfService) :
            base( color,dailyrent,licenseno,name,YearsOfService)
        {
          
        }
        //重写计算价格的方法
        public override double CalculatePrice()
        {
            //定义变量保存价格
            double SumPrice = this.DailyRent * RentDate;
            return SumPrice;
        }

    }

03.Truck类(卡车):Vechile的子类

   

  //卡车类继承自交通工具类
    public class Truck:Vehicle
    {
        public int weight { get; set; }//卡车的重量
        public Truck() { }
        public Truck(string color, int dailyrent, string licenseno, string name, int YearsOfService,int weight):
            base( color,dailyrent,licenseno,name,YearsOfService)
        {
            this.weight = weight;
        }
       //计算价格的方法
        public override double CalculatePrice()
        {
           //定义变量保存价格
            double SumPrice = this.DailyRent * RentDate;
            return SumPrice;
        }

04.工厂类VechileFactory

 //工厂
    public class VehicleFactory
    {
        //第一一个静态方法,返回值类型是父类类型,传入参数
        public static Vehicle CreateVehicle(string color, int dailyrent, string licenseno, string name, int YearsOfService, int weight,string type) 
        {
            //给对象赋null值
            Vehicle vehicle = null;
            switch (type)
            {
                case"轿车":
                    vehicle = new Car( color,  dailyrent,  licenseno,  name, YearsOfService);
                    break;
                case"卡车":
                    vehicle = new Truck(color, dailyrent, licenseno, name, YearsOfService, weight);
                    break;
           
            }
            return vehicle;
        
        }
    }

FrmMain窗体:

 //定义一个字典集合保存租车(还未租出的车辆)信息k:车牌号,V父类对象
        public Dictionary<string, Vehicle> dic = new Dictionary<string, Vehicle>();
        //第一一个集合保存已租车辆的信息
        public Dictionary<string, Vehicle> outdic = new Dictionary<string, Vehicle>();

        //点击退出触发的事件
        private void btnrefurbish_Click(object sender, EventArgs e)
        {
            Application.Exit();    
        }

     
        //load事件
        private void FrmMain_Load(object sender, EventArgs e)
        {
            //01.初始化泛型集合(添加数据到集合中去)
            Car car = new Car("红色", 500, "京P-34566", "奔驰", 3);
            Car car1 = new Car("白色", 1000, "京Q-XH456", "保时捷", 2);
            Truck truck = new Truck("蓝色", 200, "贵-B300挂", "变形金刚",5,100);
            dic.Add(car.LicenseNo, car);
            dic.Add(car1.LicenseNo, car1);
            dic.Add(truck.LicenseNo, truck);
            //02写一个方法显示到窗体的listview空间中
            dictolvlist(dic,lvlist);
            //03,给新车入库的颜色下拉框绑定值
            comcolor.Items.Add("红色");
            comcolor.Items.Add("蓝色");
            comcolor.Items.Add("白色");
            comcolor.Items.Add("黑色");
            comcolor.Items.Add("灰色");

        }
        public void dictolvlist(Dictionary<string,Vehicle> dic,ListView lv)
        {
            //创建一个listviewitem对象,赋值为null
            ListViewItem item = null;
            //显示数据之前,清除数据
            lv.Items.Clear();
            foreach (Vehicle itemdic in dic.Values)
            {
                if (itemdic is Car)
                {
                    //实例化对象
                    item = new ListViewItem();
                    item.Text = itemdic.LicenseNo;
                    item.SubItems.Add(itemdic.Name);
                    item.SubItems.Add(itemdic.Color);
                    item.SubItems.Add(itemdic.YearsOfService.ToString());
                    item.SubItems.Add(itemdic.DailyRent.ToString());
                }
                else 
                {

                    //实例化对象
                    item = new ListViewItem();
                    item.Text = itemdic.LicenseNo;
                    item.SubItems.Add(itemdic.Name);
                    item.SubItems.Add(itemdic.Color);
                    item.SubItems.Add(itemdic.YearsOfService.ToString());
                    item.SubItems.Add(itemdic.DailyRent.ToString());
                    //as等同于类型转换
                    item.SubItems.Add((itemdic as Truck).weight.ToString());
                }
                //让游离得Listviewitem对象和lvlsiit空间产生关系
                lv.Items.Add(item);
            }
        
        
        }
        //点击租车触发的事件
        private void btnrentcar_Click(object sender, EventArgs e)
        {
            //01确保选中了一个车俩
            if(lvlist.SelectedItems.Count==0)
            {
                MessageBox.Show("请选中你要租的车辆!");
                return;
            }
            //02确保填写了租用值名字
            if (txtrent.Text=="")
            {
                MessageBox.Show("请填写姓名!");
                return;
            }
            //03验证信息完成!开始租车过程
            //获取lvlist第一项的值车号
            string carnum = lvlist.SelectedItems[0].Text;
            //通过dic集合的key获取整个汽车对象
             Vehicle vehicle= dic[carnum];
            //在集合中删除该项记录
             dic.Remove(carnum);
            //重新绑定数据,调用方法dictolvlist即可
             dictolvlist(dic,lvlist);
            //将已租车辆放入到已租集合中
             outdic.Add(carnum, vehicle);
             MessageBox.Show("租车成功!");
            //清空文本框中的值
             txtrent.Text = "";
            

        }

        //在还车界面点击刷新触发的事件
        private void btnrefurbish11_Click(object sender, EventArgs e)
        {
            dictolvlist(outdic,lvlisttwo);
        }

        //点击选择结算触发的事件
        private void btnselectsettleaccounts_Click(object sender, EventArgs e)
        {
            if(lvlisttwo.SelectedItems.Count==0)
            {
                MessageBox.Show("请选择要退还的车辆!");
                return;
            }
             //确保用户填写了租用天数
            if (txtrentday.Text=="")
            {
                MessageBox.Show("请填写租用天数!");
                return;
            }
            //执行还车步骤
           //获取listviewtow中的选中项的车牌号
            string carnum = lvlisttwo.SelectedItems[0].Text;
            //从已租集合中通过key值找到汽车完整对象
            Vehicle vehicle=   outdic[carnum];
            //给还车日期属性赋值
            vehicle.RentDate = Convert.ToInt32(txtrentday.Text);
            //计算价格
            double summoney=vehicle.CalculatePrice();
            //添加到未租车辆中
            dic.Add(carnum, vehicle);
            //删除已租车辆的该车辆信息
            outdic.Remove(carnum);
            //重新绑定数据
            dictolvlist(outdic, lvlisttwo);
            MessageBox.Show("需支付金额"+summoney.ToString());
            //清空文本框中的值
            txtrentday.Text = "";

        }
        //点击刷新触发的事件
        private void btnrefurbish_Click_1(object sender, EventArgs e)
        {
            dictolvlist(dic, lvlist);
        }
        //点击入库触发的事件
        private void btnok_Click(object sender, EventArgs e)
        {
                try
                {


                    //01获取对应文本框中的值,
                    string carnum = txt.Text;//车号
                    string cartype = txtcartype.Text;//车型
                    string color = comcolor.Text;//颜色
                    int endtime = Convert.ToInt32(txttime.Text);//使用时间
                    int money = Convert.ToInt32(txtdaymoney.Text);//每日租金
                    int weight = 0;
                    if (rbcar.Checked == true)
                    {
                        //01写一个方法判断用户信息填写是否填写完整
                        if (isnulltwo() == true)
                        {
                            //执行到这证明信息已经验证完成
                            //调用工厂类,传入对应类型汽车,获取对应子类对象
                            //获取对应子类对象
                            Vehicle vehicle = VehicleFactory.CreateVehicle(color, money, carnum, cartype, endtime, weight, rbcar.Text);
                            //添加到集合中去
                            dic.Add(carnum, vehicle);
                            MessageBox.Show("添加成功!");
                        }
                    }
                    else if (rbtruck.Checked == true)
                    {
                        if (isnull() == true)
                        {
                            weight = Convert.ToInt32(txttruckweight.Text);//卡车载重
                            //获取对应子类对象
                            Vehicle vehicle = VehicleFactory.CreateVehicle(color, money, carnum, cartype, endtime, weight, rbtruck.Text);
                            //添加到集合中去
                            dic.Add(carnum, vehicle);
                            MessageBox.Show("添加成功!");
                        }
                    }
                    //调用清空文本框中的值的方法
                    infoclear();
                   
                }
                catch (Exception)
                {
                    MessageBox.Show("输入格式有误!");
                }
           

        }
        //判断新车入库中填写信息是否完整
        public bool isnull() 
        {

            if (rbcar.Checked==false&&rbtruck.Checked==false)
             {
            MessageBox.Show("请选择添加的车辆类型!");
            return false;
             }
            else if (txt.Text == "" || txtcartype.Text == "" || comcolor.Text == "" || txttime.Text == "" || txtdaymoney.Text == "" || txttruckweight.Text == "")
            {

                MessageBox.Show("请填写完整的信息!");
                return false;

            }
            else 
            {
                return true;
            }
        
        }
        public bool isnulltwo()
        {

            if (rbcar.Checked == false && rbtruck.Checked == false)
            {
                MessageBox.Show("请选择添加的车辆类型!");
                return false;
            }
            else if (txt.Text == "" || txtcartype.Text == "" || comcolor.Text == "" || txttime.Text == "" || txtdaymoney.Text == "")
            {

                MessageBox.Show("请填写完整的信息!");
                return false;

            }
            else
            {
                return true;
            }

        }
        //单机卡车触发的事件
        private void rbtruck_Click(object sender, EventArgs e)
        {
            if (rbtruck.Checked == true)
            {
                txttruckweight.Enabled = true;
                lbltruckweight.ForeColor = Color.Blue;
            }
 
        }
        //单机轿车触发的事件
        private void rbcar_Click(object sender, EventArgs e)
        {
            if (rbcar.Checked == true)
            {
                txttruckweight.Enabled = false;
                lbltruckweight.ForeColor = Color.Red;
               
            }
        }
        //清空文本框中的值的方法
        public void infoclear() 
        {
        txt.Text = "";
        txtcartype.Text = "";
         comcolor.Text = "" ;
         txttime.Text = "";
           txtdaymoney.Text = "";
           txttruckweight.Text = "";
        }

   如有感觉和我意见不同的可以尽情发表意见,谢谢!

 

                 

posted @ 2016-03-07 17:10  hyjj  阅读(1047)  评论(6编辑  收藏  举报