


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、冷比仰轮乂择题 目:车辆管理系统学生学号:2013 710 601 07学生姓名:金东海学院:计算机科学与工程学院班级:13级物联网工程指导教师:蔺想红2015 年 5 月 30 日一、设计任务与要求1、设计任务选题意义:在当前的市场经济体制下,企业要想提高市场的竞争力,取得好的经济效益, 不但要有好的产品,同时也要有好的管理方式,所以必须拥有一套完善的并且适合 自身特点的信息化管理系统,以实现企业降低成本、及时反馈市场信息、完善服务 质量、提高经济效益、分析市场需求、制定销售计划和目标等管理目的。随着信息技术的不断发展,各行各业对企业信息化的要求越来越迫切。企事业 单位车辆类型越来越多,这使
2、得单位车辆信息复杂化,关于车辆的各类信息及台账 资料越来越多,以前的管理模式主要是通过专门人员进行人工管理,信息化不足, 计算机使用率低。造成工作效率低,并且企业内部沟通不良这些问题很难克服,车 辆管理很不合理,不能及时根据需要调整所需信息,管理效率越来越差,数据不一 致现象越来越多。采用信息系统进行管理可以显著提高车辆管理的工作效率。我们将发挥计算机 的庞大的存储空间,高性能的处理能力,高度可靠的数据安全,清晰的可视化数据 等这些优势来辅助单位对车辆进行管理,实现了计算机资源的合理利用,真正实现 了减少劳动力提高劳动质量的目的。问题描述:车辆管理系统主要负责各种车辆的常规信息管理工作。系统中
3、的车辆主要有大客车、小轿车和卡车。每种车辆有车辆编号、车牌号、 车辆制造公司、车辆购买时间、车辆型号(大客车、小轿车和卡车)、总公里数、 耗油量/公里、基本维护费用、养路费、累计总费用等信息。大客车还有载客量(最 大载客数)信息,小轿车还有箱数(两厢或三厢)信息,卡车还有载重量等信息。每台车辆当月总费用=油价*耗油量/公里+基本维护费用。基本维护费用:客车:2000元/月,小轿车:1000元/月,卡车:1500元/月;功能要求:实现系统的车辆添加,删除,修改,查找,统计,显示等多个模块功能。2.实验要求数据库设计主要包括数据库及标的概述和数据库关系模式。数据库在一个管理信息系统中 占有非常重要
4、的地位,数据库结构的好坏将直接影响到应用系统的效果和数据操作 以及能否保证数据的一致性、完事性和安全性。基础要求本课程设计要求了解车辆管理系统的过程,要求对车辆的管理有一定的理解, 并进一步加深对车辆运作的实现和理解。要求用C#语言和SQL SERVER 200实现车辆相关信息记录和调度。要求建立一个数据库,然后用 C#编程序,编号后要求把数 据库与程序连接起来,组成一个大模块,进而进行各个功能的实现。问题的解决方案根据系统功能要求,可以将问题解决分为以下步骤:(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及它们之间的关系;(3)根据问题描述,设计
5、系统的类层次;(4)完成类层次中各个类的描述;(5)完成类中各个成员函数的定义;(6)完成系统的应用模块;(7)功能调试;(8)完成系统总结报告。二、需求分析1功冃匕需求5车辆管理系统统计车辆侈改车稱删除车辆显示车库按制造公司查询按类型查询按编号查询(1) 添加车辆:主要完成车辆信息的添加,要求编号唯一。当添加了重复的 编号时,则提示数据添加重复并取消添加;当车辆信息库已满,则提示不能再添加 新的数据。(2) 查询车辆:可按照三种方式来查询物品,分别为:按车辆制造公司查询:输入车辆制造公司,输出所查询的信息,若不存在该记 录,则提示“该车辆制造公司不存在! ”;按编号查询:输入编号,输出所查询
6、的信息,若不存在该记录,贝U提示“该编 号不存在! ”;按类别查询:输入类别,输出所查询的信息,若不存在记录,则提示“该类别 没有车辆! ”;(3)显示车辆信息库:输出当前车辆信息库中所有车辆信息,每条记录占据 一行。(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的 唯一性。(5)删除车辆:主要完成车辆信息的删除。如果当前车辆信息库为空,则提 示“车辆信息库为空!”,并返回操作;否则,根据编号删除该车辆的记录。(6)统计信息:输出当前车辆信息库中总物品数,以及按车辆类别,统计出当前车辆信息库中各类别的物品数并显示。2、运行需求运行环境数据库选择:SQL SERVER 200
7、5开发平台:Microsoft Visual Studio 2010开发语言:C#运行可行性分析通过调查分析,新系统设计方案有以下三个可行性:1)、技术可行性:本系统采用基于C/S系统结构,数据库开发平台选用 SQL SERVER 20Q5语言 简单,易懂,因此,在技术上是可行的。2)、经济可行性:采用车辆管理系统可取代传统信息管理的业务流程,减少人工开支,节省资金,并且可大大提高信息量的取得,缩短信息处理周期,提高信息管理的效率,具有用 户使用更简单、界面更直观、权限分配更合理等优点大大减少管理成本。3)、营运可行性:本系统操作简单,易于理解,只需通过简单培训,上手较快。技术指标:1)、信息
8、的完整性:采用值约束、缺省等多种方法确保信息的完整性。一旦使用人员录入或修改导 致数据错误,系统必须明确地给出警告信息,提示使用者。2)、系统实用性:车辆管理系统是一个面向实际应用的软件系统。它的建成将取代手工的低效率 工作,因此在进行系统建设的同时必须考虑到人员的使用习惯。3)、系统可扩展性:在开发完成后,系统必须保证在用户有新的需求时能方便地增加一些功能或模 块,及时解决用户实际问题,同时还要与系统的其他部分能够保持风格一致,使得 软件具有较好的可扩展性。三、系统设计1、总体设计本系统的设计定位于“车辆管理”,主要负责各种车辆的常规信息管理工作 以系统任务的实现和用户需求的满足为设计目标。
9、力求使系统具有充分的可操作 性,界面友好,功能完善,并且无须对用户的进行特别的要求。车辆管理系统总流程图(图3-1 )如下:奁词按去HIT查询YES歸:2、详细设计车辆管理系统表清单:表名表用途usrel nfo记录管理员的资料信息Car记录车辆的资料信息数据库表:userl nfo管理员信息表数据库字段称数据类型允许为空Namevarchar(50)N:Passvarchar(50) NCar车辆信息表数据库字段称数据类型允许为空编号nchar(6)N车牌号varchar(20)Y制造公司varchar(50)N购买时间datetimeY车辆类型nchar(10)N总公里数nchar(10)
10、Y耗油量floatN基本维护费floatY养路费floatr n累计费用floatN油价floatN载重信息nchar(10)N系统功能具体实现:系统登录功能设计:用户打开系统,首先看到登录界面,输入用户姓名,用户密码,点击登录按钮 系统比对姓名和密码。若用户姓名和密码比对成功后,系统自动跳转到主界面,否 则,重新输入姓名或密码。添加功能设计:点击添加车辆,在添加的界面,输入添加的信息,然后确认添加,其中,要求 编号唯一。当添加了重复的编号时,则提示数据添加重复并取消添加;当车辆信息 库已满,则提示不能再添加新的数据。显示功能设计:点击更多操作,在操作界面点击显示车辆,系统已有车辆信息即可显示
11、。删除功能设计:点击更多操作,在显示出车辆信息后,如果当前车辆信息库为空,则提示“车 辆信息库为空!”,并返回操作;否则,选定要删除的车辆信息,点击删除车辆, 即可直接删除该信息。修改功能设计:点击更多操作,在操作界面点击修改车辆,弹出修改信息界面,点击要修改的 信息,重新修改后点击确认修改,即可修改成功。查找功能设计:点击查找车辆,在此界面有三种查找方式:按车辆制造公司查询:输入车辆制造公司,输出所查询的信息,若不存在该记 录,则提示“该车辆制造公司不存在! ”;按编号查询:输入编号,输出所查询的信息,若不存在该记录,贝U提示“该编 号不存在! ”;按类别查询:输入类别,输出所查询的信息,若
12、不存在记录,则提示“该类别 没有车辆! ”;统计功能设计:统计车辆即统计当前在库的车点击统计车辆,即可显示各车辆的数量情况 辆的总数以及每种类型的车辆的总数,为管理员管理车辆提供了方便,并且让管理 人员很清晰地看到并分析当前的车辆数据,并制定相应的措施及作出相应的方案调 整。四、运行结果及测试1、运行界面及其效果图登录界面(图4-1 )用户登录界面I汽车骨理系统姓名:1密码,*登录I退出(图 4-1 )系统首页(图4-2 )(图 4-2)(图 4-3)删除,显示界面(图4-4)(图 4-4)修改界面(图4-5)(图 4-5)查询界面按车辆类型查询(图4-6)(图 4-6)按制造公司查询(图4-
13、7)(图 4-7)按车辆编号查询(图4-8 )(图 4-8)统计界面(图4-9)(图 4-9)2、对在编程与调试中的问题(1)问题描述:数据库正常连接后,系统找不到相关命名的库表。解决方法:原因是数据库表命名时使用了非法字段。数据库表命名规范,表 名长度不能超过30个字符,表名中含有单词全部采用单数形式,单词首写字母要 大写,多个单词间不用任何连接符号。(2)问题描述:在添加车辆输入信息时,出现错误。解决方法:因为车辆表信息要输入的数据都有数据类型,必须输入所需类型 才能满足要求,否则无法输入。五、课程设计总结与体会课程总结:本文利用C#编写程序,实现了用户对公司车辆的编号、车牌号、车辆制造公
14、司、 车辆购买时间、车辆型号(大客车、小轿车和卡车)、总公里数、耗油量 /公里、 基本维护费用、养路费、累计总费用等信息的管理。本系统主要实现了对车辆的添加,查询,显示,修改,删除,统计。主要运用了类的继承等编程方法来实现对这些车辆的管理。系统经过实际调试和运行,基本达到了预期的目标,实现了相关功能。系统特点:本系统在开发中,充分考虑了当前的市场需求,并根据实际能力进行了一些调整,使得系统具有以下特点:1)、操作方便、界面友好直观,易用性、实用性和适用性都很强。2)、系统是根据当前市场的普遍需求设计的,所以适用范围很广,最适用于 各种非运营单位的车辆管理,同时也可以作为运营单位车辆管理。所以市
15、场前景很 广。3)、系统交互性很强,即使对计算机不是很了解的人,也可以很简单很快的 学会对此系统的操作。4)、提供了强大的数据报表功能,可行手工进行报表的设计调整,也可以系统自动生成,这样可以满足不同的用户的不同需求。课程体会:通过本次试验,我对数据库有了全新的认识。自己动手设计了车辆管理系统, 通过设计程序我熟练掌握了 sql server 2005的使用方法,进一步熟练掌握创建表, 创建数据库,分离数据库,附加数据库,系统的复习了数据库。并且也熟练掌握了 c# 2010中各种控件的功能及使用方法。但是实验过程中也遇到了许多问题,但是 经过反复思考,仔细琢磨,已基本解决。通过本次试验,我们团
16、队既学到了许多知识,也总结了许多经验。我们的界面 在设计过程中对系统页面进行了拆分,每个人设计与其负责的功能模块相关联的页 面,这样可以更简便地进行设计,避免很多相容问题和把过多的工作量放在页面上 我感觉自己的知识缺乏,需要学的知识还很多,另外我还感觉干事情要反复琢磨, 仔细推敲,坚持己见,认真思考,其次就是合作的重要性。总之以后会更加努力学 习,扩展自己的知识面,不断提高自己的知识。不足及改善:1)、我们团队的界面设计目标是友好方便,使设计过程更加简洁明了,并没 有使用很多图片,而是把重点放在功能按钮的设计上。所以界面相对不是很完美。2)、由于时间和技术水平的缘故,以及在实际的用户管理中都会
17、不可避免的 出现一些新的需求,所以本系统还存在着许多方面的工作尚未能完善。3)、在功能方面,还应添加完善一些功能,如管理员权限等等。也可增加联 网管理功能,使一个系统的车辆集中管理,资源共享,可视化控制。六、程序清单数据库连接程序清单:private stringconnString = "Server=210.26.96.51;DATABASE=JinDonghai; UID=sa; PWD=95069506"登录程序清单:private void btn Log in _Click(object sen der, Even tArgs e)string sqlCheck
18、T =""int checkCo untT = 0;SqlC onnection connT;SqlComma nd cmdCheckT;sqlCheckT = "SELECT cou nt(*) FROM UserI nfo WHERE Name= '" +tbName.Text.ToString().Trim()+ "' ANDPass = '" + tbPass.Text.ToString().Trim()+ ""'checkCou ntT = 0;connT = new Sq
19、lC onnection(conn Stri ng);trycmdCheckT = new SqlComma nd(sqlCheckT, conn T);conn T.Ope n();checkCo untT = (in t)cmdCheckT.ExecuteScalar();catch (Excepti on ex)MessageBox.Show(ex.Message);fin allyconn T.Close();if (checkCou ntT > 0)MessageBox.Show(”欢迎观临,”登录成功");this.DialogResult = DialogResu
20、lt.OK;Mai n f = new Mai n();f.Show();elseMessageBox.Show(”用户或密码没有通过系统认证,请重新输入”,"登录错误");添加程序清单:private void butt on 7_Click_1(object sen der, Even tArgs e)stri ng sqlCheck = "SELECT count ( * ) FROM Car WHERE编号='"+TextNumber.Text.ToStri ng().Trim() + ""'SqlC onn
21、ectio n conn = new SqlC onnection(conn Stri ng);SqlComma nd cmdCheck = new SqlComma nd(sqlCheck, conn);int checkCo unt = 0;tryconn. Ope n();checkCo unt = (in t)cmdCheck.ExecuteScalar();catch (Excepti on ex)MessageBox.Show(ex.Message);if (checkCou nt > 0)conn. Close();MessageBox.Show(”此编号已入库”);ret
22、urn;sqlCheck = "INSERT INTO Car VALUES ('" + TextNumber.Text.ToStri ng().Trim()+ "','" + CarID.Text.ToStri ng().Trim() + "','" + comboBox1.Text.ToStri ng().Trim() +"','"+ TextMakeCom.Text.ToStri ng().Trim() + "','"
23、 + TextTime.Text.ToStri ng().Trim()+ "', '" + textS.Text.ToStri ng().Trim() + "', '" +textBasicCost.Text.ToStri ng().Trim()+ "','" + textWayCost.Text.ToStri ng().Trim()+"','"+ textOilPrice.Text.ToStri ng().Trim() + "',
24、'" +texthaoyou.Text.ToStri ng().Trim()"','"+ textl nfo.Text.ToStri ng().Trim()IIIIII+ textAIICost.Text.ToStri ng().Trim() + "')"trycmdCheck = new SqlComma nd(sqlCheck, conn);cmdCheck.ExecuteN on Query();MessageBox.Show(”添加成功!");catch (Excepti on ex)conn
25、.Close();MessageBox.Show(ex.Message); return;this.textAllCost.Text ="" boBox1.Text ="" this.textI nfo.Text ="" this.texthaoyou.Text ="" this.textOilPrice.Text ="" this.textWayCost.Text ="" this.textBasicCost.Text ="" this.TextNumb
26、er.Text ="" this.CarID.Text ="" this.TextMakeCom.Text =""this.TextTime.Text =""this.textS.Text =""查询程序清单:根据车辆编号查询private void butt on 1_Click(object sen der, Even tArgs e)string sqlCheckT =""int checkCo untT = 0;SqlC onnection connT, conn;S
27、qlComma nd cmdCheckT;if (textBox1.Text.Le ngth = 0)MessageBox.Show(”车辆编号不能为空,请输入车辆编号”);return;sqlCheckT = "SELECT coun t(*) FROM Car WHERE编号='"+textBox1.Text.ToStri ng().Trim() + "'"checkCou ntT = 0;connT = new SqlC onnection(conn Stri ng);conn = new SqlC onnection(conn S
28、tri ng);trycmdCheckT = new SqlComma nd(sqlCheckT, conn T);conn T.Ope n();checkCo untT = (in t)cmdCheckT.ExecuteScalar();catch (Excepti on ex)MessageBox.Show(ex.Message);fin allyconn T.Close();if (checkCou ntT < 0)MessageBox.Show(”无结果"," 提示”);return;string sqlCheck1 = "SELECT '编
29、号'= 编号,'车牌号'= 车牌号,'车辆类型'= 车辆类型,制造公司=制造公司,购买日期=购买日期,总公里数=总公里数,基本 维护费=基本维护费,养路费=养路费,油价=油价,耗油量=耗油量,载重信 息= 载重信息,累计费用=累计费用FROM Car WHERE编号='"+textBox1.Text.ToStri ng().Trim() + "'"trySqlDataAdapter da = new SqlDataAdapter();da.SelectComma nd = new SqlComma nd(sq
30、lCheck1, conn);dsUser = new DataSet("users");da.Fill(dsUser, "user");dataGridView1.DataSource = dsUser.Tables"user"dataGridView1.Refresh();dataGridView1.Show();catch (Excepti on ex)MessageBox.Show(ex.Message);fin allyconn. Close();this.textBox1.Text =""显示程序清单:
31、private void butt on 5_Click(object sen der, Even tArgs e)string sql = "SELECT '编号'=编号,'车牌号=车牌号,车辆类型=车辆类型,制造公司=制造公司,'购买日期=购买日期,'总公里数=总公里数,基本维护费=基 本维护费,养路费=养路费,油价'=油价,'耗油量=耗油量,载重信息=载重信 息,'累计费用= 累计费用FROM Car"SqlC onn ecti on conn = new SqlC onnection(conn Stri
32、 ng);trySqlDataAdapter da = new SqlDataAdapter();da.SelectComma nd = new SqlComma nd(sql, conn); conn. Ope n();dsUser = new DataSet("users");da.Fill(dsUser, "user");this.dataGridView2.DataSource = dsUser.Tables"user"this.dataGridView2.Refresh();this.dataGridView2.Show()
33、;catch (Excepti on ex)MessageBox.Show(ex.Message);fin allyconn. Close();selectRows = -1;删除程序清单:private void butt on 6_Click(object sen der. Even tArgs e) if (dsUser = nu II)MessageBox.Show(”请先显示车库信息,然后进行操作。”);return;stri ng sqlCheck = "SELECT cou nt ( * ) FROM Car WHERE编号='"+textBox14.
34、Text.ToStri ng().Trim() + ""'SqlC onn ecti on conn = new SqlC onnection(conn Stri ng);SqlComma nd cmdCheck = new SqlComma nd(sqlCheck, conn);int checkCo unt = 0;tryconn. Ope n();checkCo unt = (in t)cmdCheck.ExecuteScalar();catch (Excepti on ex)MessageBox.Show(ex.Message);if (checkCou n
35、t = 0 && (tmpName.ToStri ng().Trim()=textBox14.Text.ToStri ng().Trim()conn. Close();MessageBox.Show(”这个名字在后台数据库中不存在,无法进行删除操作,请重新在表格中选定要删除的项目,再进行删除操作!");return;sqlCheck = "DELETE FROMCar WHERE编号='"+ textBox14.Text.ToStri ng().Trim()+ "'"trycmdCheck = new SqlCo
36、mma nd(sqlCheck, conn);cmdCheck.ExecuteN on Query();catch (Excepti on ex)conn. Close();MessageBox.Show(ex.Message);return;sqlCheck = "SELECT ' 编号'= 编号,'车牌号'= 车牌号,车辆类型= 车辆类型,制造公司=制造公司,'购买日期=购买日期,'总公里数=总公里数,基本维护费=基 本维护费,养路费=养路费,油价'=油价,'耗油量=耗油量,载重信息=载重信 息,'累计费用=
37、 累计费用FROM Car"trySqlDataAdapter da = new SqlDataAdapter();da.SelectComma nd = new SqlComma nd(sqlCheck, conn); dsUser = new DataSet("users");da.Fill(dsUser, "user");this.dataGridView2.DataSource = dsUser.Tables"user"this.dataGridView2.Refresh();this.dataGridView2.S
38、how();catch (Exceptio n ex)MessageBox.Show(ex.Message);fin allyconn. Close();this.textBox14.Text =""selectRows = -1;MessageBox.Show(”数据删除完毕!”);修改程序清单:private void butt on 8_Click(object sen der, Even tArgs eUpdata f = new Updata();f.Show();统计程序清单:private void btpri ntH_Click(object sen der
39、. Even tArgs e)string sql = "SELECT COUNT (*) FROM Car where车辆类型 ='大客车'"SqlC onn ectio n conn = new SqlC onnection(conn Stri ng);trySqlDataAdapter da = new SqlDataAdapter();da.SelectComma nd = new SqlComma nd(sql, conn);conn. Ope n();dsUser = new DataSet("users");da.Fill(
40、dsUser, "user");this.dataGridView3.DataSource = dsUser.Tables"user"this.dataGridView3.Refresh();this.dataGridView3.Show();catch (Excepti on ex)MessageBox.Show(ex.Message);fin allyconn. Close();selectRows = -1;this.selectRows = dataGridView3.Curre ntRow .In dex;textBox3.Text = dsU
41、ser.Tables"user".RowsselectRows0.ToStri ng();string sql1 = "SELECT COUNT (*) FROM Car where车辆类型='小轿车'SqlC onnection conn1 = new SqlC onnection(conn Stri ng);trySqlDataAdapter da = new SqlDataAdapter();da.SelectComma nd = new SqlComma nd(sql1, conn 1);conn. Ope n();dsUser = new
42、 DataSet("users");da.Fill(dsUser, "user");this.dataGridView4.DataSource = dsUser.Tables"user"this.dataGridView4.Refresh();this.dataGridView4.Show();catch (Excepti on ex)MessageBox.Show(ex.Message);fin allyconn. Close();selectRows = -1;this.selectRows = dataGridView4.Curre ntRow .In dex;textBox5.Text = dsUser.Tables"user".RowsselectRows0.ToStri ng();string sql2 = "SELECT COUNT (*) FROM Car where车辆类型='卡车'"SqlC onn ectio n conn2 = new SqlC onnection(conn St
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 油务工专业理论考试题及参考答案
- 专业摄影测量与遥感习题及答案
- 呼叫中心服务员-初级工考试题及参考答案
- 2025届山西省部分学校高三4月模拟考试(省二模)生物试题(原卷版+解析版)
- 江苏省南京市五校联盟2024-2025学年高二下学期4月期中地理试题(原卷版+解析版)
- 批发业消费者行为分析与研究考核试卷
- 畜禽粪便处理与农业废弃物循环利用考卷考核试卷
- 租赁店铺的顾客满意度提升实践考核试卷
- 聚苯并噻吩改性与加工技术考核试卷
- 聚合纤维的绿色生产与可持续发展考核试卷
- 广东省深圳市龙华区2023-2024学年七年级下学期期中数学试题(含答案)
- 全国高中数学评优课大赛数学赛课教学设计(点评)一等奖作品专辑
- 沥青水稳搅拌站三方合作协议书 - 副本
- 阴道炎考试题及答案
- 月嫂行业概述与发展趋势
- 财政电子票据培训
- 2024年全国药物临床试验机构备案情况报告
- 第9课 两宋的政治和军事 教学课件(共25张) 高中历史统编版(部编版)必修 中外历史纲要(上)
- 2025年管工(技师)职业技能鉴定理论考试题(附答案)
- 中欧班列国际运输通道对我国外贸高质量发展的影响效应分析
- 人教版初中数学八年级下册全册教案(2024年春季修订)
评论
0/150
提交评论