C语言课程设计---图书馆管理信息系统.doc_第1页
C语言课程设计---图书馆管理信息系统.doc_第2页
C语言课程设计---图书馆管理信息系统.doc_第3页
C语言课程设计---图书馆管理信息系统.doc_第4页
C语言课程设计---图书馆管理信息系统.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机科学与技术学院课程设计 图书馆管理信息系统班 级 学 号 姓 名 指 导 教 师 成 绩 2010年 12月 目 录1、前言 11.1项目意义11.2问题描述12、系统功能13、概念设计13.1系统分析 13.1.1数据需求23.1.2事物需求23.1.3关系模式23.1.4数据流程图23.1.5数据字典33.2概要设计 93.3逻辑设计123.4 关系图144、物理设计145、详细设计145.1数据库设计155.2数据初始化175.3数据库用户权限管理175.4建立触发器,存储过程186、系统实现187、总结26参考文献27致谢271、前言1.1项目意义数据库课程设计是为数据库原理及应用课程而独立开设的实践性课程,对于巩固数据库知识,加强学生的实际动手能力和提高学生综合素质十分必要。通过本实验达到以下目的:(1) 培养学生具有c/s和b/s/s模式的数据库应用软件系统的设计和开发能力。(2) 熟练掌握一种数据库系统(如sql server)的使用。(3) 熟练掌握一种数据库应用软件开发工具(如c#)的使用。通过设计实际的数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力。1.2问题描述1) 学校图书室有各种图书一万多册。2) 每种图书都有书名、书号(isbn)、一名或多名作者(译者)、出版社等。3) 借书证记录有借阅者的借书证编号,读者姓名,读者性别,读者种类,登记时期等。4) 凭借书证借书,学生每次最多能借5本书,借书期限最长为30天,老师每次做多能借10本,借书期限最长为60天。2、系统功能 实现新进图书的数据录入和下架图书的数据删除。1) 实现借阅者图书证信息的录入和删除。2) 实现对所有购进图书的分类查询和分类统计。3) 能够按书名、作者等分类查询现有图书的数量。4) 能够记录借阅者的个人资料和所借图书的书名、书号、借书时间等5) 能够进行借书还书处理。6) 能够进行借书逾期罚款处理。7) 能够进行用户管理。9)设计一完整的数据库。要求掌握数据库的设计的每个步骤;掌握数据设计各阶段的输入、输出、设计环境、目标和方法;熟练的使用sql语言实现数据库以及数据库重要对象的建立、应用和维护。 3概念设计3.1需求分析3.1.1数据需求图书馆管理信息系统需要完成功能主要有:读者基本信息的输入,包括借书证编号、读者姓名、读者性别等。读者基本信息的查询、修改,包括读者借书证编号、读者姓名、读者性别等。书籍类别标准的制定、类别信息的输入,包括类别编号、类别名称。书籍类别信息的查询、修改,包括类别编号、类别名称。书籍库存信息的输入,包括书籍编号、书籍名称、书籍类别、作者姓名、出版社名称、出版日期、登记日期。书籍库存信息的查询,修改,包括书籍编号、书籍名称、书籍类别、作者姓名、出版社名称、出版日期登记日期等。借书信息的输入,包括读者借书证编号、书籍编号、借书日期。借书信息的查询、修改,包括借书证编号、借书证编号、读者姓名、书籍编号、书籍名称、借书日期等。还书信息的输入,包括借书证编号、书籍编号、还书日期。 还书信息的查询和修改,包括还书读者借书证编号、读者姓名、书籍编号、书籍名称、借书日期、还书日期等。超期还书罚款输入,还书超出期限包括超出期限还书的读者借书证号,书籍编号,罚款金额。超期还书罚款查询,删除,包括读者借书证编号、读者姓名、书籍编号、书籍名称,罚款金额等管理员管理:包括创建读者用户信息、删除读者用户信息、添加图书信息、删除图书信息。超级管理员管理:包括创建管理员用户信息、删除管理员用户信息、创建读者用户信息、删除读者用户信息、添加图书信息、删除图书信息。3.1.2事物需求在读者信息管理部分,要求:a.可以查询读者信息。b.可以对读者信息进行添加及删除的操作。在书籍信息管理部分,要求:a.可以浏览书籍信息,要求:b.可以对书籍信息进行维护,包括添加及删除的操作。在借阅信息管理部分,要求:。a.可以浏览借阅信息。b.可以对借阅信息进行维护操作。在归还信息管理部分,要求:a.可以浏览归还信息b.对归还信息可修改维护操作在管理者信息管理部分,要求:a.显示当前数据库中管理者情况。b.对管理者信息维护操作。在罚款信息管理部分,要求:a.可以浏览罚款信息b.对罚款信息可以更新3.1.3关系模式(1)书籍类别(类别编号,类别名)(2)读者(借书证编号,读者姓名,读者性别,读者种类,登记时期,可借书数 , 已借书数,逾期未还书数)(3) 管理员(管理员编号,管理员姓名,管理员密码,管理员权限)(4) 超级管理员(管理员编号,管理员姓名,管理员密码,管理员权限)(5)书籍(书籍编号,书籍名称,书籍类别,书记作者,出版社名称,出版日期,登记日期)(6)借阅(借书证编号,书籍编号,读者借书时间)(7)还书(借书证编号,书籍编号,读者还书时间)(8)罚款(借书证编号,读者姓名,借书证编号,书籍编号,读者借书时间)3.1.4数据流程图(dfd)通过对系统需求的调查分析,细化软件功能,把系统划分几四个子系统,明确每个子系统所要完的主要逻辑功能,采用以图形的方式描绘数据在系统中流动和处理。数据流图是用来表示系统的逻辑模型。电子图书管理系统读者超级管理员查询信息图书信息图书信息息图书信息息图书管理员读者图1-1顶层数据流图f5p3d1d5f6借还图书管 理p4d2d3d4登 录p1图书查询p2f4f1f2f3f7图1-2一层数据流图注:d1 图书数据库d2 读者数据库 d3 管理员数据库p2.1选择查询f4.1f4p2.2直接查询d1p2.3多条件查询f7f4.2d4 图书分类数据库d5 借书记录数据库f1-f3 登录信息f4,f5图书信息f6 各种管理信息f7 图书信息图1-3二层数据流图f5d3p3.1选择p3.2借书d1p3.3还书d4f5f5图1-4三层数据流图3.1.5数据字典 为了使各数据流,数据处理过程,存储过程不能反映其中的数据成,数据项目,数据特性,所以用数据字典来对数据流图中的各成份进行具体的定义,为系统的分析,设计及以后的实现提供供有关元素一致性定义和详细的描述:数据流字典数据流名称:读者登录 标志符:f1别名:无来源:读者去向:查询处理过程(p2)数据组成:编号+姓名数据流名称:管理员登录(p3) 标志符:f2别名:无来源:管理员去向:借还处理过程数据组成:编号+姓名+密码+登录权限数据流名称:超级管理员登录 标志符:f3别名:无来源:超级管理员去向:系统管理处理过程(p4)数据组成:编号+姓名+密码+登录权限数据流名称:图书查询 标志符:f4别名:无来源:读者去向: 查询处理过程(p2)数据组成:图书编号|图书书名|图书作者|图书出版社数据流名称:直接图书查询 标志符:f4.1别名:无来源:读者去向: 直接查询处理过程(p4.2)数据组成:图书编号|图书书名|图书作者|图书出版社数据流名称:多条件图书查询 标志符:f4.2别名:无来源:读者去向: 多条件查询处理过程(p4.3) 数据组成:图书编号+图书书名+作者+出版社+图书所属大类+图书属小类数据流名称:图书借还 标志符:f5别名:无来源:管理员去向: 借还处理过程(p3)数据组成:图书编号+借书证编号+借书日期+逾期标识数据流名称:系统管理 标志符:f6别名:无来源:超级管理员去向: 查询处理过程(p4)数据组成:各种管理信息,详情见f6.1-f6.5数据流名称:书类管理 信息 标志符:f6.1别名:无来源:超级管理员去向: 书类管理处理过程(p4.2)数据组成:图书大类名+0图书类名30数据流名称:图书管理信息 标志符:f6.2别名:无来源:超级管理员去向: 图书管理处理过程(p4.3)数据组成:书编号+书名+库存数据量+作者+所属书大类+所属图书小类|出版社|价格数据流名称:逾期图书管理信息 标志符:f6.3别名:无来源:超级管理员去向: 逾期图书管理处理过程(p4.4)数据组成:借书期限数据流名称:读者管理信息 标志符:f6.4别名:无来源:超级管理员去向: 书类管理处理过程(p4.5)数据组成:借书证编号 + 读者姓名 + 可借书数 + 已借书数+ 逾期未还书数+性别+职务+工作单位+联系电话数据流名称:管理员管理信息 标志符:f6.5别名:无来源:超级管理员去向: 管理员管理处理过程(p4.6)数据组成:管理员编号+管理员姓名+登录密码+授权等级数据存储字典:数据存储名称:图书数据库 标志符:d1描述:图书的详细资料流入数据流:f6.2涉及处理:p4.2,p2.2,p2.3,p3.2,p3.3,p4.4数据组成:图书编号+图书书名+作者+出版社+图书所属大类+图书属小类数据存储名称:读者数据库 标志符:d2描述:读者的详细资料流入数据流:f6.4涉及处理:p4.4,p2.2,p2.3,p3.2,p3.3,p4.4数据组成:借书证编号 + 读者姓名 + 可借书数 + 已借书数+ 逾期未还书数+性别+读者种类+登记时间数据存储名称:管理员数据库 标志符:d3描述:管理员的详细资料流入数据流:f6.5涉及处理:p1,p4.6数据组成:管理员编号+管理员姓名+登录密码+授权等级数据存储名称:图书分类数据库 标志符:d4描述:图书分类的详细资料流入数据流:f6.3涉及处理:p4.4,p5.2,p5.3数据组成:图书大类名+0图书类名30 数据存储名称:借书记录数据库 标志符:d5描述:借书所记录的详细资料流入数据流:f6.1涉及处理:p4.2数据组成:图书编号+借书证编号+借书日期+逾期标识数据处理字典:数据处理名称:用户登录 标志符:p1处理定义:登录系统 激发条件:所输入的编号和密码正确输入:f1,f2,f3输出:f4,f5,f6数据处理名称:读者查询 标志符:p2处理定义:查询图书信息 激发条件:所输入图书信息找到输入:f4输出:f7数据处理名称:查询选择 标志符:p2.1处理定义:选择查询方式 激发条件:已选择查询方式输入:f4输出:f4.1,f42数据处理名称:多条件查询 标志符:p2.2处理定义:查询图书信息 激发条件:所输入图书信息找到输入:f4.2输出:f7数据处理名称:直接查询 标志符:p2.3处理定义:直接查询图书信息 激发条件:所输入图书信息找到输入:f4.1输出:f7数据处理名称:借还书 标志符:p3处理定义:借书和还书 激发条件:所输入图书信息找到输入:f5输出:d4数据处理名称:选择 标志符:p3.1处理定义:选择借书还是还书 激发条件:选择输入:f5输出:d1、d4数据处理名称:借书 标志符:p3.2处理定义:借书 激发条件:图书编号输入:f5输出:d1、d4数据处理名称:管理系统 标志符:p4处理定义:管理系统和各种信息 激发条件:选择管理子功能输入:f6输出:f6.1-f6.5数据处理名称:管理选择 标志符:p4.1处理定义:选择管理功能 激发条件:选择输入:f6输出:d1-d5数据处理名称:图书分类管理 标志符:p4.2处理定义:图书分类增加,修改,删除 激发条件:输入图书分类信息输入:f6.1输出:d5数据处理名称:图书管理 标志符:p4.3处理定义:图书信息增加,修改,删除激发条件:输入各种图书信息输入:f6.2输出:d1数据处理名称:图书逾期管理 标志符:p4.4处理定义:查询逾期图书的编号或读者 激发条件:选择查询方式输入:f6.3输出:d4,d2数据处理名称:读者管理 标志符:p4.5处理定义:读者信息增加,修改,删除 激发条件:输入各种读者信息输入:f6.4输出:d2数据处理名称:管理员登录管理 标志符:p4.6处理定义:管理员信息增加,修改,删除激发条件:输入各种管理员信息输入:f6.5输出:d33.2 概要设计根据1)所要实现的功能设计,可能建立它们之间的关系,进而实现逻辑结构功能。图书管理信息系统可以划分的实体有:书籍类别信息实体、读者信息实体、书籍信息实体、借阅记录信息实体,归还记录信息实体。用e-r图一一描述这些实体。书籍类别类别编号类别名称类别实体图:图2-1书籍类别实体及其属性图读者信息实体图:可借书数已借书数逾期未还书数读者读者姓名读者性别读者种类e登记时间读者借书证编号图2-2 读者实体及其属性图管理员实体图管理员管理员姓名管理员编号管理员密码管理员权限图2-3管理员实体及其属性图超级管理员管理员姓名管理员编号管理员密码管理员权限超级管理员实体图图2-4超级管理员实体及其属性图书籍书籍编号书籍名称书籍类别编号书籍作者出版时间收录时间是否被借出版社书籍实体图:图2-5书籍实体及其属性图借阅记录信息实体图:读者借书证编号书籍类别编号借阅时间隔借阅记录信息图2-6 借阅记录信息实体及其属性图归还记录信息读者借书证编号书籍类别编号归还时间隔归还记录信息实体图:图2-7记录信息实体及其属性图罚款信息实体图:书籍类别编号罚款信息实体实体罚款金额读者姓名读者借书证编号书籍名称借阅时间隔图2-8罚款信息实体及其属性图总的信息实体e-r图:11n信息登记读者书籍书类别归还借阅罚款罚款信息还书信息借阅信息实体mnmnmnn1m创建1管理nnn管理m管理员超级管理员创建1mn出具罚款单图2-9总的信息实体e-r图3.3逻辑设计表3-1 book_sytle 书籍类别信息表表中列名数据类型可否为空说明bookstylenovarcharnot null(主键)种类编号bookstylevarcharnot null种类名称表3-2system_readers读者信息表格表中列名数据类型可否为空说明readeridvarcharnot null(主键)读者借书证号readernamevarcharnot null读者姓名readersexvarcharnot null读者性别readertypevarcharnot null读者种类regdatedatetimenull登记日期booktotalintnull可借书数borrowednumintnull已借书数overduenoreturnnumintnull逾期未还书数表3-3system_book书籍信息表表中列名数据类型可否为空说明bookidvarcharnot null(主键)书籍编号booknamevarcharnot null书籍名称续表3-3bookstylevarcharnot null书籍类别bookauthorvarcharnot null书籍作者bookpubvarcharnull出版社名称bookpubdatedatetimenull出版日期bookindatedatetimenull登记日期isborrowedbitnot null是否被借出表3-4borrow_record 借阅记录信息表表中列名数据类型可否为空说明readeridvarcharnot null(外主键)读者借阅证编号bookidvarcharnot null(外主键)书籍编号borrowdatedatetimenot null读者借书时间表3-5return_record 借阅记录信息表表中列名数据类型可否为空说明readernamevarcharnot null(外主键)读者借阅证编号readeridvarcharnot null(外主键)书籍编号returndatedatetimenot null读者还书时间表3-6reader_fee 罚款记录信息表表中列名数据类型可否为空说明readeridvarcharnot null读者借书证编号readernamevarcharnot null读者姓名bookidvarcharnot null(外主键)书籍编号booknamevarcharnot null书籍名称bookfeesmallmoneynot null罚款金额borrowdatedatetimenot null借阅时间表3-7system_administrator管理员信息表表中列名数据类型可否为空说明administratoridvarcharnot null(主键)管理员编号administratornamevarcharnot null管理员姓名administratorpasswordvarcharnot null管理员密码administratorpermissionvarcharnot null管理员权限表3-8 system_super_administrator管理员信息表表中列名数据类型可否为空说明superadministratoridvarcharnot null(主键)管理员编号superadministratornamevarcharnot null管理员姓名superadministratorpasswordvarcharnot null管理员密码superadministratorpermissionvarcharnot null管理员权限3.4 关系图图-数据库存表关系图四、物理设计数据库物理设计阶段的任务是根据具体计算机系统(dbms和硬件等)的特点,为给定的数据库模型确定合理的存储结构和存取方法。所谓的“合理”主要有两个含义:一个是要使设计出的物理数据库占用较少的存储空间,另一个对数据库的操作具有尽可能高的速度。主要体现在后者。(1)建立索引:对book_style表在bookstyleno属性列上建立聚集索引,在bookstyle属性列上建立非聚集索引。对system_book表在bookid上建立聚集索引,在bookname、bookstyleno、boookauther、bookpub上建立非聚集索引。对return_record表在bookid上建立聚集索引,在readerid上建立非聚集索引对reader_fee表在bookid上建立聚集索引,在readerid上建立非聚集索引。对system_reader表在readerid列上建立聚集索引对boorow_record表在bookid上建立聚集所以,在readerid上建立非聚集索引对system_administrator表在administratorid列上建立聚集索引。对system_super_administrator表在superadministratorid 上建立聚集索引。(2)存储结构确定数据库的存储结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、日志、备份等的存储安排及存储结构,以及确定系统存储参数的配置。 将日志文件和数据库对象(表、索引等)分别放在不同的磁盘可以改进系统的性能。所以系统将日志文件和数据文件存放在不同磁盘上。五、详细设计5.1数据库设计-(1)创建数据库use mastergocreate database librarysystemon ( name = librarysystem, filename = d:librarysystem.mdf, size = 10, maxsize = 50, filegrowth = 5 )log on( name = library, filename = e:librarysystem.ldf, size = 5mb, maxsize = 25mb, filegrowth = 5mb )go-(2)书本类别表建立use librarysystemgocreate table book_style( bookstyleno varchar(30) primary key, bookstyle varchar(30)go-(3)创建书库表create table system_books( bookid varchar(20) primary key, bookname varchar(30) not null, bookstyleno varchar(30) not null, bookauthor varchar(30), bookpub varchar(30) , bookpubdate datetime, bookindate datetime , isborrowed bit,foreign key (bookstyleno) references book_style (bookstyleno),)go-(4)借书证表建立create table system_readers ( readerid varchar(9)primary key, readername varchar(9)not null , readersex varchar(2) not null, readertype varchar(10), regdate datetime,booktotal int,borrowednum int,overduenoreturnnum int )go-(5)借书记录表建立create table borrow_record( bookid varchar(20) primary key, readerid varchar(9), borrowdate datetime, foreign key (bookid) references system_books(bookid), foreign key (readerid) references system_readers(readerid),)go-(6)还书记录表建立create table return_record( bookid varchar(20) primary key, readerid varchar(9), returndate datetime, foreign key (bookid) references system_books(bookid), foreign key (readerid) references system_readers(readerid) go-(7)罚款单表建立create table reader_fee( readerid varchar(9)not null, readername varchar(9)not null , bookid varchar(20) primary key, bookname varchar(30) not null, bookfee smallmoney, borrowdate datetime, foreign key (bookid) references system_books(bookid), foreign key (readerid) references system_readers(readerid)go-(8) 管理员表建立create table system_administrator (administratorid varchar(9)primary key, administratorname varchar(9)not null , administratorpassword varchar(2) not null, administratorpermission varchar(10) )go-(9)超级管理员表建立create table system_super_administrator (superadministratorid varchar(9) primary key, superadministratorname varchar(9) not null , superadministratorpassword varchar(2) not null, superadministratorpermission varchar(10) )go (10)索引的创建use librarysystemgocreate index bookstyle_index_style on book_style(bookstyle)create index borrow_record_index_readerid on borrow_record(readerid)create index reader_fee_index_readerid on reader_fee (readerid)create index return_record_index_readerid on return_record(readerid)create index system_books_index_bookname on system_books(bookname)create index system_books_index_styleno on system_books(bookstyleno)create index system_books_index_bookauthor on system_books(bookauthor)5.2数据初始化(1)将书籍类别加入表book_style中(2)将已有的图书加入system_books表中(定义相同的作者出版社的书本编号不一样)5.3.数据库用户权限管理该系统设置四种类型的用户(1) 超级管理员(superadministrator) 即系统管理员拥有所有的权限。(2) 管理员(administrator) 可以进行借还书处理;(3) 教师(teacher) :只能浏览图书信息,可借书数为10本,借书时间长为2个月。(4) 学生(student):只能浏览图书信息,可借书5本,借书时间长为1个月。5.4.建立触发器,存储过程-建立借书记录存贮过程create procedure sp_borrowbook bookid char(20), readerid char(9) asinsert into borrow_record (bookid,readerid,borrowdate)values(bookid,readerid,getdate()go-建立还书记录存贮过程create procedure sp_returnbook bookid char(20),readerid char(9)asdelete from retun_recordwhere bookid=bookid and readerid=readeridgo-建立罚款单存贮过程create procedure sp_ readerfee readerid, borrowdate asupdate reader_feeset bookfee=0.1*(day(getdate()-day(borrowdate)where reader=readeridand borrowdate=borrowdate-建立借书记录表增加触发器create trigger tr_addlend on dbo. borrow_record for insertasupdate system_booksset isborrowed =1where bookid in (select bookid from inserted)update readerset borrowednum = borrowednum +1where readerid in (select readerid from inserted)-建立还书记录删除触发器create trigger tr_dellend on dbo. return_record for deleteasupdate system_booksset isborrowed =0where bookid in (select bookid from deleted)update system_readersset borrowednum = borrowednum -1where readerid in (select readerid from deleted)-建立删除图书触发器create trigger tr_dellendbook on dbo.system_books for deleteasdelete reader_feewhere bookid in (select bookid from deleted)delete return _recordwhere bookid in (select bookid from deleted)六系统实现系统功能模块图如图图书管理系统借还书子系统查询子系统管理子系统图书类管理图书管理读者管理逾期图书管理管理员管理直接查询多条件查询借 书还 书帮助子系统登录子系统系统功能模块图 书管理系统登录界面如图 图10-1图书管理系统登录界面图 书管理系统主界面如图图10-2图书管理系统主界面 查找界面如图 图10-3查找界面查找代码如下:dim datacommand as sqlcommanddim myreader as sqldatareaderprivate sub btnsearch_click(byval sender as system.object, byval e as system.eventargs) handles btnsearch.click if chkbookname.checked = true then findbyname() else if chckauthor.checked = true then findbybookauthor () else if chkisdn.checked = true then findbyisdn() else end if end if end if end subsub findbyname() dbset.clear() dataconnection.open() datacommand = new sqlcommand(select * from system_books where bookname like & txtcondition.text & %, dataconnection) dataadapter = new sqldataadapter(datacommand) dataadapter.fill(dbset, system_books) dgresult.readonly = true dgresult.datasource = dbset.tables(system_books) myreader = datacommand.executereader() while myreader.read end while dataconnection.close() myreader.close() datacommand.dispose() end sub sub findbybookauthor() dbset.clear() dataconnection.open() datacommand = new sqlcommand(select * from system_books where bookauthor like & txtcondition.text & %, dataconnection) dataadapter = new sqldataadapter(datacommand) dataadapter.fill(dbset, system_books) dgresult.readonly = true dgresult.datasource = dbset.tables(system_books) myreader = datacommand.executereader() while myreader.read end while dataconnection.close() myreader.close() datacommand.dispose() end sub sub findbyisdn() dbset.clear() dataconnection.open() datacommand = new sqlcommand(select * from system_books where bookid = & txtcondition.text & , dataconnection) dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论