仓库管理实验报告_第1页
仓库管理实验报告_第2页
仓库管理实验报告_第3页
仓库管理实验报告_第4页
仓库管理实验报告_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

题目: 仓库管理系统 学 院 数学与计算机学院 专 业 软件工程 学 号 201135112 姓 名 钱宇坤 2013 年 5 月 30 日 数据库综合实验 -11 软工-钱宇坤-2011435112 仓库管理系统 一、实验目的 1、全面熟悉与领会本门课程所学习的内容,从实际系统开发中领会数据库 完整性的意义和数据库设计理论的意义与设计过程,掌握开发数据库应用程序 的基本能力。 2、掌握“仓库管理系统”及查询定义方法和使用方法; 3、熟悉数据库建模及 E/R 图的画法; 4、掌握 SQL Server 中数据库、及数据库的建立与管理方法; 5、掌握数据导入/导出及数据表的建立与管理方法。 二、实验要求 本系统的设计模拟一般仓库的管理内容,包括物资管理、仓库管理、入库操作、入库 查询统计、出库操作、出库查询统计、库存查询统计等处理情况。 2.1 管理模块要求: 管理设备信息 实现设备信息的添加、删除、修改、查询 仓库管理 实现仓库信息的添加、删除、修改、查询 入库信息管理 实现入库信息的添加、删除、修改、查询、打印 出库信息管理 实现出库信息的添加、删除、修改、查询、打印 库存信息查询 实现库存信息的查询 2.2 功能要求: 设备管理 包括物资类别,物资信息的维护(包括录入、删除、修 改) 仓库管理 包括从仓库信息的录入、修改、删除 入库信息管理 包括入库信息的操作,能够按照年、月、季度、设备种 类查询方式进行查询,并打印入库信息。 出库查询管理 保罗出库信息的操作,能够按照年、月、季度、设备种 类查询方式进行查询,并打印出库信息。 库存信息管理 实现按照物资种类、物资名称等方式查询库存信息 2.3 其他要求 设计设计界面友好,功能操作方面合理,并适当考虑系统在安全性、完整性、备份、 恢复等方面的功能要求。 三、实验设计 3.1 基本表设计 用户表 LogInFrm(用户名,密码,用户组权限) 设备信息表 FacilityNum(设备号 ,设备名称) 库存信息表 drivestorage(设备号 ,设备库存量) 数据库综合实验 -11 软工-钱宇坤-2011435112 1 购买信息表 buyTable (设备号,现有库存,最大库存,购买数量,供应商,价格,制 表人,备注,报表时间) 入库信息表 storage_in(设备号,入库日期,供应商,供应商电话,数量,价格,采 购员) 出库信息表 storage_out(设备号,出库日期,使用部门,数量,经办人,备注) 还库信息表 storage_ret(设备号,还库日期 ,数量,经办人,归还部门) 3.2 E/R 图 设备 仓库 入库 出库 还库 入库日期 供应商 电话 价格 数量 采购员 使用部门 出库日期 数量 经办人 备注 归还部门经办人 数量 还库日期 设备名称 设备号 3.3 数据字典 名字:设备表 描述:唯一的标识一个设备的信息集 合 定义:设备=设备号+ 设备名 位置:存储在数据库 名字:库存表 描述:唯一的标识一个仓库的信息集 合 定义:仓库=仓库号+ 库存量 位置:存储在数据库 名字:购买信息表 描述:唯一的标识一个购买记录特征 的信息集合 定义:购买信息=设备号+ 现有库存+ 最大库存+购买数量+ 供应商+ 价格+制表人+ 备注+报表时间 位置:存储在数据库 名字:用户表 别名: 描述:唯一的标识一个用户特征的信 息集合 定义:职工=用户名+ 密码+权限 位置:存储在数据库 名字:还库表 描述:还库信息的情况 定义:还库信息=设备号+ 还库日期+ 数量+经办人+ 归还部门 位置:存储在数据库 名字:入库表 描述:物资的入库信息 定义:入库表=设备号+ 入库日期+ 供 应商+供应商电话+ 数量+价格 + 采购员 位置:存储在数据库 名字:出库表 描述:物资的出库信息 定义:出库表=设备号+ 出库日期+ 使 用部门+数量+ 经办人+ 备注 位置:存储在数据库 数据库综合实验 -11 软工-钱宇坤-2011435112 3 3.4 系统需求 3.5 功能描述 仓库管理员: 入库操作:设备入库信息的操作 出库操作:设备出库信息的操作 还库操作:设备还库信息的操作 查询操作:查询设备信息、库存信息 更改操作:更改密码,仓库的增加、删除 经理: 查询操作:查询设备信息、库存信息、购买信息 普通职员: 操作购买信息:购买信息的录入、修改 仓库管理系统 仓库管理员 经理 普通职员 入 库 操 作 出 库 操 作 还 库 操 作 修 改 操 作 查 询 操 作 查 询 操 作 更 改 密 码 增 加 仓 库 删 除 仓 库 入 库 查 询 出 库 查 询 还 库 查 询 库 存 查 询 设 备 查 询 购 买 信 息 操 作 购 买 信 息 4、系统设计 4.1 总体设计 仓库管理系统是对设备的入库出库等信息进行记录并查询,包括管理员、 经理和普通职员的操作。管理员可以对仓库进行出库入库及修改仓库信息,经 理只能查看自己设备的相关情况,普通职员则只能录入购买信息。以下是对仓 库各种操作的流程图。 4.1.1 处理流程 以下是仓库管理系统中操作流程: 1、 管理员的入库操作 点击入库按钮 输入物资信息 仓库容量 是否足够 入库成功 Y 提示信息N 选择其他仓库 2、 出库操作 点击出库按钮 输入出库信息 数量足够 出库成功 Y 提示信息N 3、更改密码 数据库综合实验 -11 软工-钱宇坤-2011435112 5 点击修改密码按钮 输入旧密码并 输入两次新密码 旧密码正确 且新密码一致 N 修改正确 Y 4、查询操作 用户查询 仓库 信息 库存 信息 入库 信息 出库 信息 入库表 库存表出库表 仓库 显示查询信息 物资 物资 4.2 数据结构设计 在仓库管理系统中,对设备的管理是整个系统运作的关键,是仓库管理、 入库操作、出库操作的基础,因此对设备的管理就显得尤为重要。设备的基本 表要设计合理,能涵盖其他操作需要的各种信息,以及对各类信息的限制条件 等。设计好的设备管理表如下表所示: 表 1 设备表 列名 数据类型 长度 是否允许空 设备号 char 10 NOT NULL,主键 设备名 char 10 NOT NULL 经过分析,设计出的仓库管理的购买信息表如表 2 所示。 表 2 购买信息表 列名 数据类型 长度 是否允许空 设备号 char 10 NOT NULL,主键 最大库存量 char 10 NOT NULL 购买数量 char 10 NOT NULL 供应量 char 10 NOT NULL 价格 char 10 NOT NULL 购买信息表的设计也应该合理,设计好的购买信息表如下: 表 3 库存表 列名 数据类型 长度 是否允许空 设备号 char 10 NOT NULL, 主键 现有库存量 char 10 NOT NULL 设备的各种入库信息应该显示在入库表中,设计好的入库表如下: 表 4 入库表 列名 数据类型 长度 是否允许空 设备号 char 10 NOT NULL,主键 供应商 char 10 NOT NULL 入库日期 datetime 8 NOT NULL 供应商电话 char 10 NOT NULL 价格 char 10 NOT NULL 采购员 char 10 NOT NULL 数量 int 4 NOT NULL 物资的各种出库信息应该显示在出库表中,设计好的出库表如下: 表 5 出库表 列名 数据类型 长度 是否允许空 设备号 char 10 NOT NULL,主键 使用部门 char 10 NOT NULL 出库日期 datetime NOT NULL 数量 char 10 NOT NULL 数据库综合实验 -11 软工-钱宇坤-2011435112 7 设计好的还库表如下所示: 表 6 还库表 列名 数据类型 长度 是否允许空 设备号 char 10 NOT NULL,主键 数量 char 10 NOT NULL 还库日期 datatime NOT NULL 经办人 char 10 NOT NULL 归还部门 char 30 设计好的用户表如下所示: 表 7 用户表 列名 数据类型 长度 是否允许空 用户 char 10 NOT NULL,主键 密码 char 10 NOT NULL,主键 权限 char 10 NOT NULL 5、系统实现 5.1 开发工具和环境 操作系统:Microsoft Windows 7 数 据 库:Microsoft SQL Server 2005 编程环境:Microsoft Visual Studio 2005 5.2 系统的实现 5.2.1 管理员子系统的设计与实现 管理员可以对仓库进行各种操作,包括入库操作、出库操作、各种查询操作 及更改操作。因为是俩人合作,所以本部分实现入库操作及出库操作。 存储过程 ALTER procedure UpdateStorage i_Drive_ID CHAR(10) , i_InOutNumber INT , o_ErrMessage VARCHAR(256) OUTPUT AS DECLARE SQL_ERR_CODE INT , ERR_FLG INT BEGIN IF NOT EXISTS ( SELECT * FROM drivestorage WHERE 设备号= i_Drive_ID ) BEGIN IF i_InOutNumber 0 BEGIN print 1 INSERT INTO drivestorage (设备号,现有库存量) VALUES( i_Drive_ID ,i_InOutNumber ) print 2 SET SQL_ERR_CODE = ERROR IF SQL_ERR_CODE 0 BEGIN SET ERR_FLG = -1 GOTO ERROR_RETURN END END END NORMAL_RETURN: BEGIN RETURN 0 END ERROR_RETURN: 数据库综合实验 -11 软工-钱宇坤-2011435112 9 BEGIN IF ERR_FLG = 1 BEGIN SET o_ErrMessage = 没有入库的设备不能出库 END ELSE IF ERR_FLG = -1 BEGIN SET o_ErrMessage = 系统错误 END RETURN ERR_FLG END 数据库的连接: 数据库连接的代码: string myConn = new SqlConnection( “Data Source=.SQLEXPRESS;AttachDbFilename=C:Program Files (x86)Microsoft SQL ServerMSSQL.3MSSQLDatastorage_Data.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True“);/建立连 接 SqlConnection myConnection = new SqlConnection(connectionString); myConnection.Open(); 入库操作 执行物资操作后,物资的相关数据就已经改变,所以跟设备相关的仓库、 库存表、入库表都有相应的变化。典型代码如下: try if( MyConn.State != ConnectionState.Open) MyConn.Open(); if(this.textNum2.Enabled=true) this.textNum2.Enabled=false; ISReport = (CurrencyManager)this.BindingContextInStgInfo; if (this.textNum2.Text.Trim() = “|this.textAmount.Text.Trim()=“)/检查不能为空的字段 MessageBox.Show(“设备号,数量不能为空!“); return; ISReport.EndCurrentEdit(); if(InStgInfo.GetChanges()!=null)/信息是否被重新编辑 if(!change) if(this.oldtxtAmount=this.textAmount.Text.Trim() change=false; else change=true; InStgAdapter.UpdateCommand.Connection=MyConn;/ 更新到数据库 InStgAdapter.InsertCommand.Connection=MyConn; InStgTran=MyConn.BeginTransaction(); InStgAdapter.UpdateCommand.Transaction = InStgTran; InStgAdapter.InsertCommand.Transaction = InStgTran; this.InStgAdapter.Update(InStgInfo); if(change)/还库数量字段有新值了 string number=this.textAmount.Text.Trim(); int changeAmt=int.Parse(number)- int.Parse(oldtxtAmount); string driveID=this.textNum2.Text.Trim(); SqlCommand driveStorageUpdateCommand = new SqlCommand();/更新库存表的现有库存 driveStorageUpdateCommand.Connection = MyConn;/调用存储过程 driveStorageUpdateCommand.Transaction = InStgTran; driveStorageUpdateCommand.CommandType = CommandType.StoredProcedure; driveStorageUpdateCommand.CommandText = “UpdateStorage“; driveStorageUpdateCommand.Parameters.Add(“i_Drive_ID“,SqlDbType. 数据库综合实验 -11 软工-钱宇坤-2011435112 11 Char,10); driveStorageUpdateCommand.Parameters“i_Drive_ID“.Value =driveID; driveStorageUpdateCommand.Parameters.Add(“i_InOutNumber“,SqlDbTy pe.Int); driveStorageUpdateCommand.Parameters“i_InOutNumber“.Value = changeAmt; driveStorageUpdateCommand.Parameters.Add(“o_ErrMessage“,SqlDbTyp e.VarChar,256); driveStorageUpdateCommand.Parameters“o_ErrMessage“.Direction = ParameterDirection.Output; driveStorageUpdateCommand.ExecuteNonQuery(); InStgTran.Commit(); MessageBox.Show(“成功!“); else MessageBox.Show(“您没有修改任何信息“); return; 执行入库操作后,将显示入库表的情况,具体界面如下: 图 入库界面 出库操作 出库操作同入库操作一样要更改与物资有关的信息,比如出库表、仓库及 库存表。典型代码如下: private void OutStorage_Load(object sender, System.EventArgs e) MyConn.Open();/打开连接 OutStgAdapter.SelectCommand.CommandText = “SELECT * FROM storage_out“; OutStgAdapter.SelectCommand.Connection = MyConn; OutStgAdapter.Fill(OutStgInfo);/填充数据集 this.dataGrid1.DataSource = OutStgInfo.DefaultView; OSReport = (CurrencyManager) BindingContextOutStgInfo; DataGridTableStyle Out = new DataGridTableStyle(); this.DataBindingsFunction(); Out.AlternatingBackColor = Color.Blue;/颜色设置 Out.MappingName = OutStgInfo.TableName; this.dataGrid1.Select(0);/选定第一列 this.textNum2.Enabled=false; private void DataBindingsFunction()/绑定 this.textNum2.DataBindings.Add(“Text“,OutStgInfo,“设备号“); 数据库综合实验 -11 软工-钱宇坤-2011435112 13 this.textDate.DataBindings.Add(“Text“,OutStgInfo,“出库日期 “); this.textDep.DataBindings.Add(“Text“,OutStgInfo,“使用部门“); this.textAmount.DataBindings.Add(“Text“,OutStgInfo,“数量“); this.textMan.DataBindings.Add(“Text“,OutStgInfo,“经办人“); this.textExp.DataBindings.Add(“Text“,OutStgInfo,“备注“); private void add_button_Click(object sender, System.EventArgs e)/增加记录 try OSReport = (CurrencyManager)this.BindingContextOutStgInfo; OSReport.AddNew();/增加新记录 this.textDate.Text=DateTime.Now.ToString(); this.textNum2.Enabled=true; this.change=true;/还库数量更改 this.oldtxtAmount=“0“; this.textNum2.Focus();/焦点在第一个字段上 catch( Exception ex ) MessageBox.Show(ex.Message); private void send_button_Click(object sender, System.EventArgs e)/提交信息 try if( MyConn.State != ConnectionState.Open) MyConn.Open(); if(this.textNum2.Enabled=true) this.textNum2.Enabled=false; OSReport = (CurrencyManager)this.BindingContextOutStgInfo; if (this.textNum2.Text.Trim() = “|this.textAmount.Text.Trim()=“)/检查不能为空的字段 MessageBox.Show(“设备号,数量不能为空!“); return; OSReport.EndCurrentEdit(); if(OutStgInfo.GetChanges()!=null)/信息是否被重新编辑 if(!change) if(oldtxtAmount=this.textAmount.Text.Trim() change=false; else change=true; OutStgAdapter.UpdateCommand.Connection=MyConn;/ 更新到数据库 OutStgAdapter.InsertCommand.Connection=MyConn; OutStgTran=MyConn.BeginTransaction(); OutStgAdapter.UpdateCommand.Transaction = OutStgTran; OutStgAdapter.InsertCommand.Transaction = OutStgTran; this.OutStgAdapter.Update(OutStgInfo); int cmdresults = 0; if(change) string driveID=this.textNum2.Text.Trim(); string number=this.textAmount.Text.Trim(); int outnumber=0- (int.Parse(number)+int.Parse(this.oldtxtAmount); SqlCommand driveStorageUpdateCommand = new SqlCommand();/更新库存表的现有库存 driveStorageUpdateCommand.Connection = MyConn;/调用存储过程 driveStorageUpdateCommand.Transaction = OutStgTran; driveStorageUpdateCommand.CommandType = CommandType.StoredProcedure; driveStorageUpdateCommand.CommandText = “UpdateStorage“; driveStorageUpdateCommand.Parameters.Add(“i_Drive_ID“,SqlDbType. 数据库综合实验 -11 软工-钱宇坤-2011435112 15 Char,10); driveStorageUpdateCommand.Parameters“i_Drive_ID“.Value = driveID; driveStorageUpdateCommand.Parameters.Add(“i_InOutNumber“,SqlDbTy pe.Int); driveStorageUpdateCommand.Parameters“i_InOutNumber“.Value = outnumber; driveStorageUpdateCommand.Parameters.Add(“o_ErrMessage“,SqlDbTyp e.VarChar,256); driveStorageUpdateCommand.Parameters“o_ErrMessage“.Direction = ParameterDirection.Output; driveStorageUpdateCommand.Parameters.Add(“o_Return“,SqlDbType.In t); driveStorageUpdateCommand.Parameters“o_Return“.Direction = ParameterDirection.ReturnValue; cmdresults = driveStorageUpdateCommand.ExecuteNonQuery(); cmdresults = Convert.ToInt16(driveStorageUpdateCommand.Parameters“o_Return“.Val ue); if( cmdresults != 0) MessageBox.Show(driveStorageUpdateCommand.Parameters“o_ErrMessa ge“.Value.ToString(); OutStgTran.Rollback(); else MessageBox.Show(“成功!“); OutStgTran.Commit(); return; else MessageBox.Show(“您没有修改任何信息“); return; catch(Exception ex) MessageBox.Show(“对不起,您输入的设备号错误!具体信息: “+ex.ToString(); if( OutStgTran != null ) OutStgTran.Rollback(); if( MyConn.State != ConnectionState.Closed) MyConn.Close(); return; 出库操作的界面: 设备信息操作 设备信息的添加删除修改操作: 数据库综合实验 -11 软工-钱宇坤-2011435112 17 private void DataBindingsFunction()/绑定 this.textNum.DataBindings.Add(“Text“,FacNumInfo,“设备号“); this.textName.DataBindings.Add(“Text“,FacNumInfo,“设备名称 “); private void add_button_Click(object sender, System.EventArgs e)/增加记录 try FNReport = (CurrencyManager)this.BindingContextFacNumInfo; FNReport.AddNew();/增加新记录 this.textNum.Focus();/焦点在第一个字段上 catch( Exception ex ) MessageBox.Show(ex.Message); private void del_button_Click(object sender, System.EventArgs e)/删除操作 try if (MessageBox.Show(“您确定删除么?“,“提示 “,MessageBoxButtons.YesNo) = DialogResult.Yes)/提示 FNReport = (CurrencyManager)this.BindingContextFacNumInfo; FNReport.RemoveAt(FNReport.Position);/删除 FacNumAdapter.DeleteCommand.Connection=MyConn;/更 新到数据库中 FacNumAdapter.Update(FacNumInfo); MessageBox.Show(“已成功删除“); return; catch(Exception ex) MessageBox.Show(“不能删除正在使用的数据“, “提示“); private void send_button_Click(object sender, System.EventArgs e)/提交信息 FNReport = (CurrencyManager)this.BindingContextFacNumInfo; if (this.textNum.Text.Trim() = “)/检查不能为空的字段 MessageBox.Show(“设备号不能为空!“); return; for(int i=0;iFacNumInfo.Rows.Count;i+) this.numRow=FacNumInfo.Rowsi; if (numRow0.ToString().Trim()=this.textNum.Text.Trim() MessageBox.Show(“设备号必须唯一!“); this.FacNumInfo.RejectChanges(); return; FNReport.EndCurrentEdit(); if(FacNumInfo.GetChanges()!=null)/信息是否被重新编辑 try FacNumAdapter.UpdateCommand.Connection=MyConn;/更 新到数据库 FacNumAdapter.InsertCommand.Connection=MyConn; FacNumTran=MyConn.BeginTransaction(); FacNumAdapter.UpdateCommand.Transaction = FacNumTran; FacNumAdapter.InsertCommand.Transaction = FacNumTran; this.FacNumAdapter.Update(FacNumInfo); FacNumTran.Commit(); MessageBox.Show(“提交成功“); catch(Exception ex) MessageBox.Show(ex.Message ); 数据库综合实验 -11 软工-钱宇坤-2011435112 19 else MessageBox.Show(“您没有修改任何信息“); return; 设备信息操作界面: 还库管理 还库操作的代码如下: private void ReturnStg_Load(object sender, System.EventArgs e) MyConn.Open();/打开连接 RetnAdapter.SelectCommand.CommandText = “SELECT * FROM storage_retn“; RetnAdapter.SelectCommand.Connection = MyConn; RetnAdapter.Fill(ReturnInfo);/填充数据集 this.dataGrid1.DataSource = ReturnInfo.DefaultView; ReReport = (CurrencyManager) BindingContextReturnInfo; DataGridTableStyle Re = new DataGridTableStyle(); this.DataBindingsFunction(); Re.AlternatingBackColor = Color.Blue;/颜色设置 Re.MappingName = ReturnInfo.TableName; this.dataGrid1.Select(0);/选定第一列 this.textNum2.Enabled=false; private void DataBindingsFunction()/绑定 this.textNum2.DataBindings.Add(“Text“,ReturnInfo,“设备号“); this.textDate.DataBindings.Add(“Text“,ReturnInfo,“还库日期 “); this.textAmount.DataBindings.Add(“Text“,ReturnInfo,“数量“); this.textMan.DataBindings.Add(“Text“,ReturnInfo,“经办人“); this.textDep.DataBindings.Add(“Text“,ReturnInfo,“归还部门“); private void add_button_Click(object sender, System.EventArgs e)/增加记录 try ReReport = (CurrencyManager)this.BindingContextReturnInfo; ReReport.AddNew();/增加新记录 this.textNum2.Enabled=true; this.textDate.Text=DateTime.Now.ToString(); this.change=true;/还库数量更改 this.oldtxtAmount=“0“; this.textNum2.Focus();/焦点在第一个字段上 catch( Exception ex ) MessageBox.Show(ex.Message); private void send_button_Click(object sender, System.EventArgs e)/提交信息 try if( MyConn.State != ConnectionState.Open) MyConn.Open(); if(this.textNum2.Enabled=true) 数据库综合实验 -11 软工-钱宇坤-2011435112 21 this.textNum2.Enabled=false; ReReport = (CurrencyManager)this.BindingContextReturnInfo; if (this.textNum2.Text.Trim() = “|this.textAmount.Text.Trim()=“)/检查不能为空的字段 MessageBox.Show(“设备号,数量不能为空!“); return; ReReport.EndCurrentEdit(); if(ReturnInfo.GetChanges()!=null)/信息是否被重新编辑 if(!change) if(oldtxtAmount=this.textAmount.Text.Trim() change=false; else change=true; RetnAdapter.UpdateCommand.Connection=MyConn;/更 新到数据库 RetnAdapter.InsertCommand.Connection=MyConn; ReturnTran=MyConn.BeginTransaction(); RetnAdapter.UpdateCommand.Transaction = ReturnTran; RetnAdapter.InsertCommand.Transaction = ReturnTran; this.RetnAdapter.Update(ReturnInfo); if(change)/还库数量字段有新值了 string number=this.textAmount.Text.Trim(); string driveID=this.textNum2.Text.Trim(); int changeAmt=int.Parse(number)- int.Parse(oldtxtAmount); SqlCommand

温馨提示

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

最新文档

评论

0/150

提交评论