




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3 3软件设计3 3 1概要设计概要设计也称总体设计 主要任务是设计系统体系结构 明确系统由哪些模块 部件 组成 模块之间的接口 12 39 什么是软件体系结构 软件体系结构是满足各种功能需求和非功能需求 安全 可维护性 可重用性 可扩展性 可用性 可靠性 可理解性 成本 艺术等 的结构化解决方案 结构化解决方案包括软件元素的选择 结构元素之间接口的确定 结构元素之间合作行为的描述 结构元素组合子系统的界定 体系结构样式的选择等 软件元素之间的接口是元素外部可见的部分 元素的内部实现不属于体系结构的范畴 软件体系结构的目标 设计软件体系结构的目标是识别影响软件结构的需求 在系统 用户和业务需求之间取得平衡 在时间 成本 技术等条件的制约下设计出满足功能需求和非功能需求所需的体系结构 软件体系结构只涉及系统的结构 不关心元素实现细节 设计软件体系结构的指导原则 体系结构要考虑对设计有影响 未来可能改变的因素 在设计时对相关部件要引入弹性以适应这种改变 体系结构也要对需要早做决策的部件优先确定其设计 这些部件一旦需要重新设计损失很大 可以使用各种设计工具 如UML 统一建模语言 帮助体系结构的设计 但也不要完全依赖这些工具 否则会丧失体系结构的灵活性 体系结构的设计不可能一蹴而就 一定要经过不断修改不断完善的过程才能得到较为满意的设计结果 软件体系结构设计方法 体系结构基本组成部件 体系结构基本组成部件 表示层 体系结构基本组成部件 表示层 用户接口部件 UserInterfacecomponents 软件的可视化元素 用于显示信息给用户以及接受用户的输入 表示逻辑部件 PresentationLogiccomponents 负责处理用户接口非可视化部分的功能 如验证功能 用户接口部件之间的通信 用户操作的响应等 该部件并不是表示层必须的部件 只有当表示层非可视化部分的功能较多必须与UI部件的功能分离开时才需要设计该部件 表示模型部件 PresentationModelcomponents Presentationmodelcomponents该部件对来自业务层的数据进行封装 格式转换 以便UI部件和PL部件使用 比如 该部件把来自业务层的不同来源的数据集成在一起然后把这些数据转换为UI部件容易显示的形式 表示层 设计步骤 Step1 理解UI需求Step2 确定UI类型Step3 选择一种UI实现技术Step4 设计表示层部件Step5 确定数据绑定需求Step6 确定错误处理策略Step7 确定数据验证策略 表示层设计步骤一 理解UI需求 理解UI需求是完成后续表示层设计步骤的关键 UI需求由系统的功能和用户对界面的要求共同决定 设计对用户友好界面要明确以下几点 知晓用户使用该系统要完成的任务以及每个任务或操作执行的次序 考虑系统需要提供给用户和从用户那获取的信息以及数据的格式 了解用户使用系统的工作环境和用户的经验 UI是否需要多媒体支持 对于一些特殊数据类型 如货币 日期 时间等 是否支持地域特征 是否支持个性化特征 如允许实时改变界面风格与布局 较大的文本或按钮 导航控件 搜索功能 场景地图等 显示器等输出设备的限制 如屏幕大小 表示层设计步骤二 确定UI类型 基于第一步的分析结果 可以确定系统的UI类型 系统可能适合不止一种UI类型 也可能没有一种UI类型完全适合系统 可以考虑设计多种类型的UI组合 有如下几种常见的UI类型 移动应用 Mobileapplications 此类应用的UI要考虑设备资源的限制 肥客户机应用 Richclientapplications 此类应用的UI适合既要在线又可离线使用的软件 纯网络应用 RichInternetapplications 该类应用一般在一种浏览器中运行 此类应用的UI适合界面要求丰富且要在各种设备和平台运行的在线软件 Web应用 Webapplications 该类应用支持在多浏览器中运行 此类应用的UI适合需在尽可能多的设备和平台运行的在线软件 控制台应用 Console basedapplications 此类应用的UI适合系统管理和开发软件 表示层设计步骤三 选择一种UI实现技术 移动应用Microsoft NETCompactFrameworkASP NETforMobileSilverlightforMobile肥客户机应用WindowsPresentationFoundation WPF WindowsFormsWindowsFormswithWPFUserControlsWPFwithWindowsFormsUserControls纯网络应用SilverlightWeb应用ASP NETWebForms控制台应用 表示层设计步骤四 设计表示层部件 UI部件UI部件可看作系统的视图 分解系统窗口为一系列的控件 对于呈现信息的控件 可以利用控件的数据绑定特征 为了提高控件的可重用性 设计时尽量减少对控件类的继承 增加对控件类的组合使用 尽量使用开发系统提供的标准控件 当然 如果找不到能完成待开发系统任务的控件 也可以设计用户控件完成这个特殊任务 但绝大多数情况都可以找到满足需要的控件 UI部件 控件 向对话框中加入控件的方法使用对话框编辑器将系统选择的控件添加在对话框模版中 在对话框类中添加该控件的一个类成员变量 即在AddMemberVariable对话框中选择Control类型的变量添加 在对话框类的成员函数OnInitDialog为加入的控件设置初始状态值 如有必要 在对话框类中建立控件产生消息的映射函数 UI部件 控件 注 在对话框编辑器中添加如下控件会引起运行时对话框消失的错误 解决办法就是用手工添加代码的方法实现在对话框中加入控件 UI部件 控件 Animation 动画 CAnimateCtrl显示AVI视频剪辑的连续帧产生的消息 ACN START 开始放映时发出ACN STOP 放映结束时发出使用方法 在对话框类中创建该类的对象m CAnimateCtrl m CAnimateCtrl Open 装载AVI剪辑 m CAnimateCtrl Play 放映AVI剪辑 或设置控件样式为ACS AUTOPLAY m CAnimateCtrl Stop 停止放映 m CAnimateCtrl Close 释放AVI剪辑所在占内存 UI部件 控件 button 按钮 Cbutton按下按钮发出一个命令产生的消息 ON BN CLICKED 用户点击按钮时发出 UI部件 控件 combobox 组合框 CComboBox编辑框和列表框的组合体 产生的消息 很多 不一一列出 UI部件 控件 日期时间 UI部件 控件 dateandtimepicker 日期时间 CDateTimeCtrl允许用户选择设置日期与时间 产生的消息 DTN DATETIMECHANGE通知父窗口时间日期改变 其他还有很多 不一一列出 使用方法 比如修改在控件中显示日期的方式 CStringformatStr T Todayis yy MM dd m DateTimeCtrl SetFormat formatStr UI部件 控件 editbox 编辑框 CEdit编辑输入文本产生的消息 ON EN CHANGE用户修改了编辑框中的文本 其他还有很多 不一一列出 使用方法 比如设置编辑框允许接受的最大文本长度 CStringstrText T I maneditcontrol UINTnLength strText GetLength sizeof TCHAR if m myEdit GetLimitText nLength m myEdit SetLimitText nLength m myEdit SetWindowText strText UI部件 控件 extendedcombobox 扩展组合框 CComboBoxEx可以显示图像的组合框产生的消息 CBEN BEGINEDIT用户点击组合框中的编辑框 其他还有很多 不一一列出 使用方法 比如将一个图片列表和组合框关联 m ImageList Create 16 16 ILC COLOR 2 2 m ImageList Add AfxGetApp LoadIcon IDI ICON1 m ImageList Add AfxGetApp LoadIcon IDI ICON2 m ImageList Add AfxGetApp LoadIcon IDI ICON3 m Ccomboxex SetImageList UI部件 控件 Header 表头按钮 UI部件 控件 Header 表头按钮 CHeaderCtrl在一列文本的表头按钮 控制显示文本的宽度产生的消息 HDN ITEMCLICK用户点击该控件 其他还有很多 不一一列出 使用方法 比如删除表头控件所属项目 intnCount m myHeaderCtrl GetItemCount for inti 0 i nCount i m myHeaderCtrl DeleteItem 0 UI部件 控件 Hotkey 热键 CHotKeyCtrl帮助用户创建热键使用方法 比如将热键应用在 WORDwKeyAndShift static cast m HotKeyCtrl GetHotKey this SendMessage WM SETHOTKEY wKeyAndShift UI部件 控件 imagelist 相框 CImageList位图或图标图像的集合使用方法 比如在列表中增加项目 CBitmapbm bm LoadBitmap IDB BITMAP1 m myImageList Add UI部件 控件 List 列表 UI部件 控件 List 列表 CListCtrl显示带图标的文本使用方法 比如增加表属项目 CListmyList myList AddHead CString T ABC myList AddHead CString T 123 POSITIONpos myList GetHeadPosition for inti 0 i myList GetCount i TRACE T s r n LPCTSTR myList GetNext pos UI部件 控件 ListBox 列表 UI部件 控件 listbox 列表盒 CListBox字符串列表框产生的消息 LBN DBLCLK用户双击该控件项目 其他还有很多 不一一列出 使用方法 比如删除表属项目 VoidCMyODListBox DeleteItem LPDELETEITEMSTRUCTlpDeleteItemStruct ASSERT lpDeleteItemStruct CtlType ODT LISTBOX LPVOIDlpszText LPVOID lpDeleteItemStruct itemData ASSERT lpszText NULL free lpszText CListBox DeleteItem lpDeleteItemStruct UI部件 控件 monthcalendar 月历 UI部件 控件 monthcalendar 月历 CMonthCalCtrl显示日期信息产生的消息 MCN SELECT用户选择了日期 其他还有很多 不一一列出 使用方法 m calCtrl1 SetDayState nCount pDayState UI部件 控件 Progress 进展 UI部件 控件 Progress 进展 CProgressCtrl显示任务的进展使用方法 设置控件 CProgressCtrlmyCtrl myCtrl Create WS CHILD WS VISIBLE CRect 10 10 200 30 pParentWnd IDC PROGRESSCTRL myCtrl SetPos myCtrl GetPos 2 UI部件 控件 Rebar 重栏 UI部件 控件 Rebar 重栏 CRebarCtrl子栏容器产生的消息 RBN BEGINDRAG用户拖动子带 其他还有很多 不一一列出 使用方法 向控件增加子带 CReBarm wndReBar m wndReBar Create this m wndDlgBar Create this IDD DIALOGBAR CBRS ALIGN TOP IDD DIALOGBAR m wndReBar AddBar UI部件 控件 richedit 扩展文本框 CRichEditCtrl支持字符和段落格式的文本框产生的消息 EN SELCHANGE文本选择改变 其他还有很多 不一一列出 使用方法 查找 externCRichEditCtrl pmyRichEditCtrl LPCTSTRlpszmyString FINDTEXTEXft ft chrg cpMin 0 ft chrg cpMax 1 ft lpstrText LPSTR lpszmyString longn pmyRichEditCtrl FindText FR MATCHCASE FR WHOLEWORD UI部件 控件 scrollbar 滚动条 UI部件 控件 scrollbar 滚动条 CScrollBar滚动选择产生的消息 WM HSCROLL滚动 其他还有很多 不一一列出 使用方法 设置滚动条 voidCMyView OnInitialUpdate CView OnInitialUpdate m ScrollBar SetScrollRange 0 10 m ScrollBar SetScrollPos 5 UI部件 控件 static text 静态文本 CStatic显示提示信息使用方法 位图 myStatic Create T mystatic WS CHILD WS VISIBLE SS BITMAP SS CENTERIMAGE CRect 10 10 150 50 pParentWnd if myStatic GetBitmap NULL myStatic SetBitmap LoadBitmap NULL MAKEINTRESOURCE OBM CLOSE UI部件 控件 UI部件 控件 statusbar 状态栏 CStatusBarCtrl显示状态信息产生的消息 NM DBLCLK双击 其他还有很多 不一一列出 使用方法 设置背景 intCMyStatusBarCtrl OnCreate LPCREATESTRUCTlpCreateStruct if CStatusBarCtrl OnCreate lpCreateStruct 1 return 1 SetBkColor RGB 0 0 250 HICONhIcon VERIFY hIcon AfxGetApp LoadIcon IDR PANE 0 ICON VERIFY SetIcon 0 hIcon return0 UI部件 控件 Toolbar 工具栏 CToolBarCtrl命令按钮的容器 UI部件 控件 Tree 树 CTreeCtrl层级项显示 UI部件 常用对话框 ColorDialogBox 色彩对话框 UI部件 常用对话框 ColorDialogBox 色彩对话框 CColorDialog让用户选择颜色 UI部件 常用对话框 应用举例一 获取用户选择的颜色 CColorDialogdlg if dlg DoModal IDOK COLORREFcolor dlg GetColor TRACE TRACE宏 用于调试 RGBvalueoftheselectedcolor red u green u blue u n GetRValue color GetGValue color GetBValue color UI部件 常用对话框 应用举例二 获取用户选择的16个颜色 CColorDialogdlg f dlg DoModal IDOK COLORREF ccolor dlg GetSavedCustomColors for inti 0 i 16 i TRACE RGBvalueoftheselectedcolor red u green u blue u n GetRValue ccolor i GetGValue ccolor i GetBValue ccolor i UI部件 常用对话框 应用举例三 重载消息处理函数 BOOLCMyColorDialog OnColorOK if GetDlgItemInt COLOR RED 0 UI部件 常用对话框 UI部件 常用对话框 FindandReplaceDialogBox 查找替换无模式对话框 CFindReplaceDialog查找替换字符串有两种查找替换对话框 查找对话框查找并替换对话框 UI部件 查找替换无模式对话框 应用举例一 登记处理对话框消息 classCMyFrameWnd publicCFrameWnd protected afx msgLONGOnFindReplace WPARAMwParam LPARAMlParam DECLARE MESSAGE MAP staticUINTWM FINDREPLACE RegisterWindowMessage FINDMSGSTRING BEGIN MESSAGE MAP CMyFrameWnd CFrameWnd ON REGISTERED MESSAGE WM FINDREPLACE OnFindReplace END MESSAGE MAP UI部件 查找替换无模式对话框 应用举例二 处理用户输入对话框中的文本 if m pFRDlg IsTerminating 用户是否关闭对话框CStringcsFindString CStringcsReplaceString csFindString m pFRDlg GetFindString csReplaceString m pFRDlg GetReplaceString 写注册表VERIFY AfxGetApp WriteProfileString AfxGetApp m pszAppName FindString csFindString 诊断调试宏VERIFY AfxGetApp WriteProfileString AfxGetApp m pszAppName ReplaceString csReplaceString VERIFY m pFRDlg DestroyWindow UI部件 查找替换无模式对话框 应用举例三 消息处理函数的实现 LRESULTCMainFrame OnFindReplace WPARAMwparam LPARAMlparam CFindReplaceDialog pDlg CFindReplaceDialog GetNotifier lparam if NULL pDlg UI部件 常用对话框 UI部件 常用对话框 FontDialogBox 字体对话框 CFontDialog选择字体 UI部件 字体对话框 应用举例一 获取选择字体的颜色 CFontDialogdlg if dlg DoModal IDOK COLORREFcolor dlg GetColor TRACE Coloroftheselectedfont 8x n color UI部件 字体对话框 应用举例二 获取选择字体 CFontDialogdlg if dlg DoModal IDOK LOGFONTlf dlg GetCurrentFont typedefstructtagLOGFONT LONGlfHeight LONGlfWidth 字体宽高LONGlfEscapement 角度LONGlfOrientation 角度LONGlfWeight 粗细BYTElfItalic 斜体BYTElfUnderline 下划线BYTElfStrikeOut 重影BYTElfCharSet 字符集BYTElfOutPrecision 输出精确度BYTElfClipPrecision 剪切方式BYTElfQuality 匹配方式BYTElfPitchAndFamily 字体支点和家族TCHARlfFaceName LF FACESIZE 字体名 LOGFONT PLOGFONT UI部件 字体对话框 应用举例二 获取选择字体 CFontDialogdlg if dlg DoModal IDOK LOGFONTlf dlg GetCurrentFont UI部件 字体对话框 应用举例三 获取字体特征 CFontDialogdlg if dlg DoModal IDOK CStringfacename dlg GetFaceName TRACE Facenameoftheselectedfont s n facename intsize dlg GetSize TRACE Thesizeoftheselectedfont d n size CStringstylename dlg GetStyleName TRACE Stylenameoftheselectedfont s n stylename intweight dlg GetWeight TRACE Weightoftheselectedfont d n weight BOOLbold dlg IsBold TRACE Istheselectedfontbold d n bold UI部件 常用对话框 UI部件 常用对话框 UI部件 常用对话框 OpenandSaveAsDialogBox 打开保存对话框 CFileDialog打开保存文件 UI部件 文件保存对话框 应用举例一 获取文件路径 CStringFilePathName TRUE为OPEN对话框 FALSE为SAVEAS对话框CFileDialogdlg TRUE if dlg DoModal IDOK FilePathName dlg GetPathName UI部件 文件保存对话框 应用举例二 读取多个文件 CFileDialogdlg TRUE DEMFiles DEM NULL OFN HIDEREADONLY OFN OVERWRITEPROMPT OFN ALLOWMULTISELECT OFN ENABLESIZING T LayerFiles DEM TIFF BMP JPG DEM TIFF BMP JPG NULL UI部件 文件保存对话框 应用举例二 读取多个文件 dlg m ofn lpstrTitle 读取多文件示例 最多可以打开100个文件dlg m ofn nMaxFile 100 MAX PATH dlg m ofn lpstrFile newTCHAR dlg m ofn nMaxFile ZeroMemory dlg m ofn lpstrFile sizeof TCHAR dlg m ofn nMaxFile UI部件 文件保存对话框 应用举例二 读取多个文件 intretval dlg DoModal if retval IDCANCEL returnfalse POSITIONpos file pos file dlg GetStartPosition CArrayary filename while pos file NULL ary filename Add dlg GetNextPathName pos file UI部件 菜单 CMenu UI部件 菜单 Cmenu介绍 DataMembers 数据成员 Construction 构造函数 UI部件 菜单 Cmenu介绍 Initialization 初始化相关操作 UI部件 菜单 Cmenu介绍 MenuOperations 菜单操作 UI部件 菜单 Cmenu介绍 MenuItemOperations 菜单项操作 表示层设计步骤四 设计表示层部件 PL部件IftheUIrequirescomplexprocessingormustcommunicatewithotherlayers considerusingpresentationlogiccomponentstodecouplethisprocessingfromtheUIcomponents Usepresentationlogiccomponentstostorestaterelatedto butnotspecificto theUI Avoidimplementingbusinesslogicandbusinessrules otherthaninputanddatavalidation withinthepresentationlogiccomponents Also avoidimplementingrenderingorUIspecificlogicinthepresentationlogiccomponents Usepresentationlogiccomponentstohelpyourapplicationrecoverfromafailureorerrorbyusingthemtomakesureafterrecoverythattheuserinterfaceisinaconsistentstate WheretheUIrequirescomplexworkflowsupport considercreatingseparateworkflowcomponentsthatuseaworkflowsystemsuchasWindowsWorkflowFoundationoracustommechanismwithintheapplication sbusinesslayer Formoreinformation seeChapter14 DesigningWorkflowComponents PresentationModelComponentsPresentationmodelcomponentsrepresentdatafromyourbusinesslayerinaconsumableformatforyourUIandpresentationlogiccomponentsinthepresentationlayer Modelstypicallyrepresentdata andsotheyusethedataaccessandpossiblythebusinesslayercomponentstocollectthatdata Ifthemodelalsoencapsulatesbusinesslogic itisusuallycalledapresentationentity Presentationmodelcomponentsmay forexample aggregatedatafrommultiplesources transformdatafortheUItodisplaymoreeasily implementvalidationlogic andmayhelptorepresentbusinesslogicandstatewithinthepresentationlayer Theyaretypicallyusedtoimplementseparatedpresentationpatterns suchasMVPorMVC Considerthefollowingguidelineswhendesigningpresentationmodelcomponents Determineifyourequirepresentationmodelcomponents Typically youmightusepresentationlayermodelsifthedataortheformattobedisplayedisspecifictothepresentationlayer orifyouareusingaseparatedpresentationpatternsuchasMVPorMVC Ifyouareworkingwithdata boundcontrols designorchooseappropriatepresentationmodelcomponentsthatyoucaneasilybindtoUIcontrols Ifusingcustomobjects collections ordatasetsasyourpresentationmodelcomponentformat ensurethattheyimplementthecorrectinterfacesandeventstosupportdatabinding Ifyouperformdatavalidationinthepresentationlayer consideraddingthecodeforthistoyourpresentationmodelcomponents However alsoconsiderhowyoucantakeadvantageofcentralizedvalidationcodeorcodelibraries Considertheserializationrequirementsforthedatayouwillpasstoyourpresentationmodelcomponentsifthisdatawillbepassedoverthenetworkorstoredondiskontheclient Youmustalsochooseasuitabledatatypeforyourpresentationmodelcomponentsandpresentationentities Thischoiceisdrivenbytheapplicationrequirements andconstrainedbyyourinfrastructureanddevelopmentcapabilities Youmustfirstchooseadataformatforyourpresentationlayerdataanddecideifyourcomponentswillalsoencapsulatebusinesslogicandstate Next youmustdecidehowyouwillpresentthedatawithintheuserinterface Thecommondataformatsforpresentationdataarethefollowing Customclass Useacustomclassifyouwanttorepresentyourdataasacomplexobjectthatmapsdirectlytoyourbusinessentities Forexample youmightcreateacustomOrderobjecttorepresentorderdata Youcanalsouseacustomclasstoencapsulatebusinesslogicandstateandtoperformpresentationlayervalidationortoimplementcustomproperties ArrayandCollection Useanarrayoracollectionwhenyoumustbinddatatocontrolssuchaslistboxesanddrop downliststhatusesinglecolumnvalues DataSetandDataTable UseaDataSetoraDataTablewhenyouareworkingwithsimpletable baseddatawithdata boundcontrolssuchasgrids listboxes anddrop downlists TypedDataset UseaTypedDataSetwhenyouwanttightcouplingwithyourbusinessentitiestoavoiddiscrepanciesduetodatabasechanges XML ThisformatisusefulwhenworkingwithaWebclient wherethedatacanbeembeddedinaWebpageorretrievedviaaWebserviceorHTTPrequest XMLisagoodchoicewhenyouareusingcontrolssuchasatreevieworgrid XMLisalsoeasytostore serialize andpassovercommunicationchannels DataReader UseaDataReadertoretrievedatawhenfullyconnectedandthedataistobeaccessedinaread only forward onlymanner TheDataReaderprovidesanefficientwaytoprocessdatafromyourdatabasesequentially ortoretrievelargevolumesofdata However ittiesyourlogi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 柱子隔热保护施工方案(3篇)
- 汽贸园招商活动策划方案(3篇)
- 五一装修活动方案策划(3篇)
- 荷叶沟施工方案(3篇)
- 墙体围护施工方案(3篇)
- 团建打篮球活动方案策划(3篇)
- 企业活动策划实施方案(3篇)
- 安徽省宣城市绩溪县2023-2024学年高三下学期高考二模数学试卷及答案
- 写颁奖词的题目及答案
- 古代中国的农业经济特点分析:高中历史教案
- 乡镇供电所全能型员工评聘考试题库(精简600题)
- 机械设备投标书范本
- 河北安装工程消耗量定额计算规则
- 义务教育《数学课程标准》2022年版原文
- YC/T 310-2024烟草漂浮育苗基质
- 智慧公厕设备采购投标方案(技术方案技术标)
- MapInfo使用教程教学课件
- 电梯高处施工方案
- 精装房验收实测报告范本
- 安全生产风险分级管控与隐患排查治理双重体系工作
- 新能源汽车综合故障诊断技术PPT完整全套教学课件
评论
0/150
提交评论