服装专卖店管理系统设计.docx_第1页
服装专卖店管理系统设计.docx_第2页
服装专卖店管理系统设计.docx_第3页
服装专卖店管理系统设计.docx_第4页
服装专卖店管理系统设计.docx_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

服装专卖店管理系统设计文档一. 系统目标本系统支持普通顾客及会员与本服装专卖店进行服装买卖交易,同时本店内管理层人员可以进行对店内各组织严密的管理工作和对普通顾客及会员简洁便利的服务。二需求分析1.业务需求该系统主要有4类用户角色:普通顾客,会员,管理层人员,管理员。他们各自的主要业务处理需求如下: .普通顾客可以依据本管理系统在本店进行服装选购(如在新服饰入库窗口根据新到货的服装款式,面料,颜色,尺寸,价格信息进行筛选;也可根据服装分类窗口预先浏览服装图片进行筛选;最后选购产品之后还可进入顾客评价窗口对本店进行综合评价)。 .本店会员可以享受本店独有的打折优惠活动(如在会员入口窗口进行登录后,在综合信息界面可以注册会员,选购服装,并进行折扣计算) 管理层人员可以对店内各组织进行管理以及完成与顾客会员的买卖交易以及售后互动活动(如在本店情况表对最近店面销售情况进行分析后可以调整本店的销售及管理战略;根据员工基本表可以对本店员工进行数字化管理;根据财务调整表可以辅助管理人员依据店内资金现状合理进行资金周转;根据销售入库表可以准确得知本店服装库存现状合理进行货物调整) 管理员可以登录本店服装管理系统管理会员注册,和店内各相关信息查看以及更新操作。2.数据处理数据处理需求系统涉及的数据源有店员,会员,普通顾客,服装。店员情况表、财务调整表、服饰入库表、服装分类表、服装价格表、员工基本表等。结合业务处理需求,系统数据一层流程图如下:三、系统总体设计1. 系统技术方案前台开发工具:面向所有服装专卖店均采用C/S应用程序。后台数据库采用Microsoft SQL Server 2005企业版。2. 系统功能结构各角色详细功能如表1所示表1 服装专卖店管理系统主要功能说明用户主要功能店员会员普通会员管理员主要操作更新查看店里的综合信息并完成会员注册等查看自己的购买记录,并获得用户优惠、评价等对店里的情况以及服装等进行评价维护修改系统服装管理入库销售打折等业务销售购买销售购买 无系统管理无无无维护信息数据库信息管理更新无无维护信息四、 数据库设计1. 数据库概念设计系统主要实体有店员工,会员顾客,系统,普通顾客,他们分别通过“查看”、“评价”、“管理”建立联系,分析各实体属性,建立实体联系模型的E-R图如图2所示 图2 :E-R图2. 数据库逻辑设计将数据库概念模式图转化为关系模式:本店情况表(店销售排名;店评价水平;店员工排名;店投入水平)财务调整表(月份;盈利情况;财务补给;顾客取向)服饰入库表(服装类型;尺码;颜色;面料;价格信息;折扣;使用人群;折扣价)服装分类表(服装类型;适合人群;主色调;面料)会员信息表(姓名;性别;年龄;联系电话;联系QQ;联系地址;)销售库存表(服饰样式;库存量;近七天卖出;近七天进货;)顾客评价表(用户名;店员服务态度;服装款式质量;店面装横情况)员工基本表(员工编号;员工姓名;目前职务;基本工资)顾客回馈表(月份;顾客满意度;顾客消费度;顾客光顾度;)数据库的关系图如图3所示3. 数据库物理设计下面给出SQL Sever下的实验室设备管理数据库物理设计的关系模型设计、完整性约束设计A本店情况表,用于查看更新店里的基本信息,如表1所示。表1 本店情况表字段名称字段说明类型定义属性定义索引店销售排名店销售排名Varchar(10)Not null店评价水平店评价水平Varchar(10)Not null店员工排名店员工排名Varchar(10)Not null店投入水平店投入水平Varchar(10)Not nullB财务调整表,用于存储财务调整基本信息,如表2所示表2 财务调整表字段名称字段说明类型定义属性定义索引月份月份Varchar(10)Not null盈利情况盈利情况Varchar(10)Not null财务补给财务补给Varchar(10)Not null顾客取向顾客取向Varchar(10)Not nullC服饰入库表,用于存储服饰的基本信息,如表3所示表3 服饰入库表字段名称字段说明类型定义属性定义索引服装类型服装类型Varchar(10)Not null尺码尺码Varchar(10)Not null颜色颜色Varchar(10)Not null面料面料Varchar(10)Not null价格信息价格信息Varchar(10)Not null折扣折扣Varchar(10)Not null使用人群使用人群Varchar(10)Not null进货价进货价Varchar(10)Not nullD服装类别表,用于服装类别的基本信息,如表4: 表4 服装分类表字段名称字段说明类型定义属性定义索引服装类别服装类别Varchar(10)Not null适合人群适合人群Varchar(10)Not null主色调主色调Varchar(10)Not null面料面料Varchar(10)Not nullE会员信息表,用于存储会员信息的基本情况,如表5所示表5 会员信息表字段名称字段说明字段类型属性定义姓名姓名Varchar(10)Not null性别性别Varchar(10)Not null年龄年龄Varchar(10)Not null联系电话联系电话Varchar(10)Not null联系QQ联系QQVarchar(10)Not null用户地址用户地址Varchar(10)Not nullF销售库存表,用于存储销售还有库存情况的基本信息,如表6所示表6 销售库存表字段名称字段说明字段类型属性定义 索引服饰样式服饰样式Varchar(10)Not null库存量库存量Varchar(10)Not null近七天卖出近七天卖出Varchar(10)Not null近七天进货近七天进货Varchar(10)Not nullG顾客评价表,用于顾客对本店情况的评价信息,如表7所示表7 l顾客评价表字段名称字段说明字段类型属性定义索引用户名用户名Varchar(10)Not null店员服务态度店员服务态度Varchar(10)Not null服装款式质量服装款式质量Varchar(10)Not null店面装横情况店面装横情况Varchar(10)Not nullH顾客回馈表,用于记录顾客回馈程度的表格,如表8所示表8 顾客回馈表字段名称字段说明类型定义属性限定索引月份月份Varchar(15)Primary key顾客满意度顾客满意度Varchar(10)Not null顾客光顾度顾客光顾度Varchar(10)Not null顾客消费度顾客消费度Varchar(10)Not null顾客评价度顾客评价度Varchar(10)Not nullI员工基本表,用于记录查看员工基本信息,如表9所示表9 员工基本表字段名称字段说明类型定义属性限定索引员工编号员工编号Varchar(15)Primary key员工姓名员工姓名Varchar(10)Not null目前职务目前职务Varchar(10)Not null基本工资基本工资Varchar(10)Not nullj.服装价格表,主要登记店里各种服装的价格情况信息,如表10所示:字段名称字段说明类型定义属性限定索引类型类型Varchar(10)Not null尺码尺码Varchar(10)Not null颜色颜色Varchar(10)Not null面料面料Varchar(10)Not null四、数据库应用对象设计 视图a) 本店情况表视图SELECT 店销售排名, 店评价水平, 店员工排名, 店投入水平FROM 本店情况表WHERE (店员工排名 = 水平适中)b) 财务调整表试图:SELECT 月份, 盈利情况, 财务补给, 顾客取向FROM 财务调整表WHERE (盈利情况 = 盈利))服饰入库表视图:SELECT 服装类型, 尺码, 颜色, 面料, 价格信息, 折扣, 使用人群, 进货价FROM 服饰入库表WHERE (服装类型 = 流行女帽)c) 服装分类表视图:SELECT 服装类型, 适合人群, 主色调, 面料, 图片路径FROM 服装分类表WHERE (适合人群 = 女士)E)会员信息表视图 SELECT 姓名, 性别, 年龄, 联系电话, 联系QQ, 用户地址FROM 会员信息表WHERE (年龄 = 20)F)销售库存表视图:SELECT 服饰样式, 库存量, 近七天卖出, 近七天进货FROM 销售库存表WHERE (服饰样式 = 外套)g)顾客评价表视图:SELECT 姓名, 店员服务态度, 服装款式质量, 店面装横情况FROM 顾客评价表WHERE (店员服务态度 = 2)H)顾客回馈表视图:SELECT 月份, 顾客满意度, 顾客光顾度, 顾客消费度, 顾客建议度FROM 顾客回馈表WHERE (顾客光顾度 = 较高)i) 员工基本表视图:SELECT 员工编号, 员工姓名, 目前职务, 基本工资FROM 员工基本表WHERE (目前职务 = 普通店员))服装价格表视图:SELECT 类型, 尺码, 颜色, 面料FROM 服装价格表WHERE (尺码 = 38)五、 VB程序源码:1、 allmassage:Dim txtsql As StringDim mrc As ADODB.RecordsetDim MsgText As StringPrivate Sub Command1_Click()store.Show 1End SubPrivate Sub Command10_Click() 确定 MsgBox 韩焕、郭士强制作, vbExclamation, 关于我们End SubPrivate Sub Command11_Click()Dim n As Integer, m As Single, X As Singlen = Text1.Textm = Text2.TextX = n * mText3.Text = XPrintEnd SubPrivate Sub Command12_Click() 增加Dim txtmsg As String txtsql = select * from 服饰入库表 Set mrc = ExecuteSQL(txtsql, txtmsg) mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text4.Text mrc.Fields(1) = Text5.Text mrc.Fields(2) = Text6.Text mrc.Fields(3) = Text7.Text mrc.Fields(4) = Text15.Text mrc.Fields(5) = Text8.Text mrc.Fields(6) = Text16.Text mrc.Fields(7) = Text17.Text mrc.Update MsgBox (提交成功)End SubPrivate Sub Command13_Click()Text4.Text = Text5.Text = Text6.Text = Text7.Text = Text8.Text = Text15.Text = Text16.Text = Text17.Text = SetFocusEnd SubPrivate Sub Command14_Click() 增加Dim txtmsg As String txtsql = select * from 会员信息表 Set mrc = ExecuteSQL(txtsql, txtmsg) mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text9.Text mrc.Fields(1) = Text10.Text mrc.Fields(2) = Text11.Text mrc.Fields(3) = Text12.Text mrc.Fields(4) = Text13.Text mrc.Fields(5) = Text14.Text mrc.Update MsgBox (会员注册成功)End SubPrivate Sub Command15_Click()Text4.Text = Text5.Text = Text6.Text = Text7.Text = Text8.Text = Text15.Text = Text16.Text = Text17.Text = SetFocusEnd SubPrivate Sub Command2_Click()finance.Show 1End SubPrivate Sub Command3_Click() clothing.Show 1End SubPrivate Sub Command4_Click()client.Show 1End SubPrivate Sub Command5_Click() 确定 menber.Show 1 MsgBox 欢迎下次登陆,谢谢您的支持End SubPrivate Sub Command6_Click()sell.Show 1End SubPrivate Sub Command7_Click() 进入 staff.Show 1End SubPrivate Sub Command8_Click()clientsay.Show 1End SubPrivate Sub Command9_Click() 确定 MsgBox 系统有问题请电话联系程序管理部门 vbExclamation, 信息提示End Sub2、 client:Dim txtsql As StringDim mrc As ADODB.RecordsetDim MsgText As StringPrivate Sub Command1_Click() MSHFlexGrid1.Clear txtsql = select * from 顾客回馈表 Set mrc = ExecuteSQL(txtsql, MsgText) MSHFlexGrid1.Rows = 1 Do While Not mrc.EOF With MSHFlexGrid1 将查询内容显示在表格控件中 .Rows = .Rows + 1 初始设定MSHFlexGrid1属性为1行2列,0固定行0固定列 .TextMatrix(.Rows - 1, 0) = mrc.Fields(0) & .TextMatrix(.Rows - 1, 1) = mrc.Fields(1) & .TextMatrix(.Rows - 1, 2) = mrc.Fields(2) & .TextMatrix(.Rows - 1, 3) = mrc.Fields(3) & .TextMatrix(.Rows - 1, 4) = mrc.Fields(4) & .TextMatrix(0, 0) = 月份 .TextMatrix(0, 1) = 顾客满意度 .TextMatrix(0, 2) = 顾客光顾度 .TextMatrix(0, 3) = 顾客消费度 .TextMatrix(0, 4) = 顾客建议度 End With mrc.MoveNext LoopEnd SubPrivate Sub Command2_Click() 删除txtsql = delete from 顾客回馈表 where 月份 = + MSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 1) + Set mrc = ExecuteSQL(txtsql, MsgText)MSHFlexGrid1.RemoveItem MSHFlexGrid1.RowSelEnd SubPrivate Sub Command3_Click() 增加With MSHFlexGrid1 增加一行并显示 .AddItem , mrc.RecordCount + 1 .TextMatrix(mrc.RecordCount + 1, 0) = Text1.Text .TextMatrix(mrc.RecordCount + 1, 1) = Text2.Text .TextMatrix(mrc.RecordCount + 1, 2) = Text3.Text .TextMatrix(mrc.RecordCount + 1, 3) = Text4.Text .TextMatrix(mrc.RecordCount + 1, 4) = Text5.TextEnd With mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text1.Text mrc.Fields(1) = Text2.Text mrc.Fields(2) = Text3.Text mrc.Fields(3) = Text4.Text mrc.Fields(4) = Text5.Text mrc.Update End SubPrivate Sub Command4_Click() 修改修改显示表MSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 0) = Text1.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 1) = Text2.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 2) = Text3.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 3) = Text4.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 4) = Text5.Text修改数据库表Text4.Text = MSHFlexGrid1.RowSelmrc.AbsolutePosition = MSHFlexGrid1.RowSelmrc.Fields(0) = Text1.Textmrc.Fields(1) = Text2.Textmrc.Fields(2) = Text3.Textmrc.Fields(3) = Text4.Textmrc.Fields(4) = Text5.Textmrc.UpdateEnd SubPrivate Sub Text1_Change()End Sub3、clientsay:Dim rs As New ADODB.RecordsetDim txtsql As StringDim txtmsg As StringDim username As StringDim opt1 As Integer 店员服务态度Dim opt2 As Integer 服装款式质量Dim opt3 As Integer 店面装横情况Private Sub Command1_Click()Select Case True Case Option1.Value opt1 = 4 Case Option2.Value opt1 = 3 Case Option3.Value opt1 = 2 Case Option4.Value opt1 = 1End SelectSelect Case True Case Option5.Value opt2 = 4 Case Option6.Value opt2 = 3 Case Option7.Value opt2 = 2 Case Option8.Value opt2 = 1End SelectSelect Case True Case Option9.Value opt3 = 4 Case Option10.Value opt3 = 3 Case Option11.Value opt3 = 2 Case Option12.Value opt3 = 1End SelectDim txtmsg As String txtsql = select * from 顾客评价表 Set mrc = ExecuteSQL(txtsql, txtmsg) mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text1.Text mrc.Fields(1) = opt1 mrc.Fields(2) = opt2 mrc.Fields(3) = opt3 mrc.Update MsgBox (您的评价已成功提交!)End SubPrivate Sub Command2_Click()Unload clientsayEnd Sub4、 clothing:Dim txtsql As StringDim mrc As ADODB.RecordsetDim MsgText As StringPrivate Sub Command1_Click() txtSQL = select * from 服装分类表 Set mrc = ExecuteSQL(txtSQL, MsgText) mrc.MoveFirst mrc.Move (3) mrc.AbsolutePosition = 4 Text1.Text = MsgText mrc.Delete mrc.UpdateEnd SubPrivate Sub Command1_Click() MSHFlexGrid1.Clear txtsql = select * from 服装分类表 Set mrc = ExecuteSQL(txtsql, MsgText) MSHFlexGrid1.Rows = 1 Do While Not mrc.EOF With MSHFlexGrid1 将查询内容显示在表格控件中 .Rows = .Rows + 1 初始设定MSHFlexGrid1属性为1行2列,0固定行0固定列 .TextMatrix(.Rows - 1, 0) = mrc.Fields(0) & .TextMatrix(.Rows - 1, 1) = mrc.Fields(1) & .TextMatrix(.Rows - 1, 2) = mrc.Fields(2) & .TextMatrix(.Rows - 1, 3) = mrc.Fields(3) & .TextMatrix(0, 0) = 服装类别 .TextMatrix(0, 1) = 适合人群 .TextMatrix(0, 2) = 主色调 .TextMatrix(0, 3) = 面料 End With mrc.MoveNext LoopEnd SubPrivate Sub Form_Load()Picture1.Picture = LoadPicture(d:服装专卖店管理系统picture夹克.jpg) With MSHFlexGrid1 .Rows = 1 .CellAlignment = 2 .ColWidth(0) = 1000 .ColWidth(1) = 1000 End WithEnd SubPrivate Sub MSHFlexGrid1_Click()If MSHFlexGrid1.RowSel 0 Thenmrc.AbsolutePosition = MSHFlexGrid1.RowSelPicture1.Picture = LoadPicture(mrc.Fields(4)End IfPicture1.Picture = LoadPicture(mrc.Fields(1)Picture1.Picture = LoadPicture(mrc.Fields(2)Picture1.Picture = LoadPicture(mrc.Fields(3)End Sub5、 finance:Private Sub Command3_Click() 增加With MSHFlexGrid1 增加一行并显示 .AddItem , mrc.RecordCount + 1 .TextMatrix(mrc.RecordCount + 1, 0) = Text1.Text .TextMatrix(mrc.RecordCount + 1, 1) = Text2.Text .TextMatrix(mrc.RecordCount + 1, 2) = Text3.Text .TextMatrix(mrc.RecordCount + 1, 3) = Text4.TextEnd With mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text1.Text mrc.Fields(1) = Text2.Text mrc.Fields(2) = Text3.Text mrc.Fields(3) = Text4.Text mrc.Update End SubPrivate Sub Command4_Click() 修改修改显示表MSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 0) = Text1.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 1) = Text2.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 2) = Text3.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 3) = Text4.Text修改数据库表Text4.Text = MSHFlexGrid1.RowSelmrc.AbsolutePosition = MSHFlexGrid1.RowSelmrc.Fields(0) = Text1.Textmrc.Fields(1) = Text2.Textmrc.Fields(2) = Text3.Textmrc.Fields(3) = Text4.Textmrc.UpdateEnd Sub6、 login:Public m As StringPublic i As StringDim txtsql As StringDim conn As New ADODB.ConnectionDim mrc As New ADODB.RecordsetPublic n As IntegerPrivate Sub Command2_Click()tbname.Text = tbpas.Text = tbname.SetFocusEnd SubPrivate Sub Command1_Click() If tbname.Text = 123 Then OK = True Me.Hide allmassage.Show 1 Else MsgBox 用户名有误, 请重新输入!, , 错误提示 tbname.SetFocus tbpas.SelStart = 123 tbpas.SelLength = Len(tbpas.Text) End IfEnd SubPrivate Sub Command3_Click()Unload loginEnd SubPrivate Sub Command4_Click() 进入allmassage.Show 1End SubPrivate Sub tbPas_Change()tbpas.PasswordChar = *End Sub7、 menber:Private Sub Command1_Click() MsgBox 数据更新中,给您带来了不便,请谅解!, vbExclamation, 信息提示End Sub8、 sell:Dim txtsql As StringDim mrc As ADODB.RecordsetDim MsgText As StringPrivate Sub Command1_Click() MSHFlexGrid1.Clear txtsql = select * from 销售库存表 Set mrc = ExecuteSQL(txtsql, MsgText) MSHFlexGrid1.Rows = 1 Do While Not mrc.EOF With MSHFlexGrid1 将查询内容显示在表格控件中 .Rows = .Rows + 1 初始设定MSHFlexGrid1属性为1行2列,0固定行0固定列 .TextMatrix(.Rows - 1, 0) = mrc.Fields(0) & .TextMatrix(.Rows - 1, 1) = mrc.Fields(1) & .TextMatrix(.Rows - 1, 2) = mrc.Fields(2) & .TextMatrix(.Rows - 1, 3) = mrc.Fields(3) & .TextMatrix(0, 0) = 服饰样式 .TextMatrix(0, 1) = 库存量 .TextMatrix(0, 2) = 近七天卖出 .TextMatrix(0, 3) = 近七天进货 End With mrc.MoveNext LoopEnd SubPrivate Sub Command3_Click() 增加With MSHFlexGrid1 增加一行并显示 .AddItem , mrc.RecordCount + 1 .TextMatrix(mrc.RecordCount + 1, 0) = Text1.Text .TextMatrix(mrc.RecordCount + 1, 1) = Text2.Text .TextMatrix(mrc.RecordCount + 1, 2) = Text3.Text .TextMatrix(mrc.RecordCount + 1, 3) = Text4.TextEnd With mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text1.Text mrc.Fields(1) = Text2.Text mrc.Fields(2) = Text3.Text mrc.Fields(3) = Text4.Text mrc.Update End SubPrivate Sub Command4_Click() 修改修改显示表MSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 0) = Text1.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 1) = Text2.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 2) = Text3.TextMSHFlexGrid1.TextMatrix(MSHFlexGrid1.RowSel, 3) = Text4.Text修改数据库表Text4.Text = MSHFlexGrid1.RowSelmrc.AbsolutePosition = MSHFlexGrid1.RowSelmrc.Fields(0) = Text1.Textmrc.Fields(1) = Text2.Textmrc.Fields(2) = Text3.Textmrc.Fields(3) = Text4.Textmrc.UpdateEnd Sub9、 staff:Private Sub Command3_Click() 增加With MSHFlexGrid1 增加一行并显示 .AddItem , mrc.RecordCount + 1 .TextMatrix(mrc.RecordCount + 1, 0) = Text1.Text .TextMatrix(mrc.RecordCount + 1, 1) = Text2.Text .TextMatrix(mrc.RecordCount + 1, 2) = Text3.Text .TextMatrix(mrc.RecordCount + 1, 3) = Text4.TextEnd With mrc.AddNew 在数据库表中添加数据行 mrc.Fields(0) = Text1.Text mrc.Fields(1) = Text2.Text mrc.Fields(2) = Text3.Text mrc.Fields(3) = Text4.Text mrc.Update E

温馨提示

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

评论

0/150

提交评论