版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第34页共10页课程设计说明书课程设计名称:软件综合课程设计课程设计题目:音频播放器程序的设计与实现学院名称:信息工程学院专业:电子信息工程班级:学号:姓名:评分:教师:20年2月22日电子信息工程专业课程设计任务书20XX-20XX学年第2学期第1周-2周题目内容及要求1、设计题目:MP3播放器的设计2、设计内容及要求:利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个MP3播放器。要求能够播放常用Windows音频格式的文件;实现播放控制:播放、暂停、停止等;实现音量控制:静音、声音放大减小;实现播放列表管理:加入文件、加入目录、删除文件等功能。进度安排2月17日:完成需求分析,确定程序功能,确立程序设计思想;2月18日~2月19日:进行详细设计,实现编码;2月20日:进行程序测试,完善编码;撰写设计说明书,准备验收;2月21日:验收。学生姓名:指导时间第一周:周一至周五指导地点:综合试验楼中506室任务下达20XX年2月17日任务完成20XX年2月21日考核方式1.评阅□2.答辩□3.实际操作□4.其它□指导教师系(部)主任正文: 目录引言…………………..5一、设计程序的目的与要求…6目的……………6要求…………………6二、方案实现与调试………………6总体设计………….61、实现功能………62、功能模块图…………………..7详细设计………….71、界面布局………72、各模块功能设计………………82.1处理“打开”按钮………………..92.2处理“播放”按钮……………….92.3处理“暂停”按钮………………..92.4处理“停止”按钮………………..92.5处理“音量”按钮…………………102.6处理“退出”按钮………………...103操作步骤……….10三、课程设计分析与总结……….11分析…………..11总结…………...11附录……………….13关键程序清单…………………13参考文献………20 引言MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC的基本知识而设计的。1.1MFC简介MFC是VisualC++是核心。MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFCAppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。这些函数,必须通过类定义对象才能使用[1]。1.2MCI简介MCI(MediaControlInterface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括mp3、avi、wav、mpeg等等[2]。音频技术发展较早,几年前一些技术已经成熟并产品化,音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。音频文件包括多种格式的文件,MP3就是其中的一种。MP3的全称是MovingPictureExpertsGroup,AudioLayerⅢ,它所使用的技术是在VCD(MPEG-1)的音频压缩技术上发展出的第三代,而不是MPEG-3。MP3是一种音频压缩的国际技术标准,它一般需要MP3播放器来读取。课程设计的目的与要求1、目的利用VC++开发一个支持wav、mp3、wma等不同音频格式的媒体播放器。通过课程设计掌握多媒体编程的基本原理。2、任务编程实现一个可支持多种音频格式的媒体播放器,其基本功能包括媒体播放、音量调节、播放进度选择、暂停、停止以及歌曲信息的查询与添加等;给出程序的总体设计和详细设计,要求程序总体架构图、详细设计的流程图,函数、变量说明等给出程序运行、测试的详细结果。方案实现与调试总体设计1实现功能MP3播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。2功能模块图MP3MP3播放器打开文件播放歌曲暂停播放停止播放音量控制图-1系统功能模块图详细设计1界面布局设计(1)创建一个对话框类,类名为Mp3PlayerDlg。(2)向对话框中添加GroupBox控件、StaticText控件以及按钮控件。(3)设置所添加的控件的属性。系统界面的运行结果图如图-2所示。
图-2系统界面运行结果图Mp3Player对话框中所用控件的属性描述如表-1所示。表-1对话框控件ID及其描述控件ID描述IDC_STATIC_INFO_WNDGroupBox控件,用来显示“信息窗口”IDC_STATIC_INFOStaticText控件,用来显示各种信息IDC_STATIC_OPERATIONGroupBox控件,用来显示“操作面板”IDC_BUTTON_OPEN按钮控件,单击它用来选择歌曲IDC_BUTTON_PLAY按钮控件,单击它用来播放歌曲IDC_BUTTON_PAUSE按钮控件,单击它用来暂停播放歌曲IDC_BUTTON_STOP按钮控件,单击它用来停止播放歌曲IDC_BUTTON_VOLUME按钮控件,单击它用来设定音量IDC_BUTTON_QUIT按钮控件,单击它用来退出程序2各模块功能设计2.1处理“打开”按钮单击“打开”按钮后,在OnButtonOpen()函数中,首先对文件类型进行过滤,调用DoModa()函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过GetFileName()函数获取文件名后,调用DisplayInfo()函数在StaticText控件上显示“你选择的歌曲是(文件名)”,然后利用GetDlgItem()函数设置“暂停”按钮以及“停止”按钮不可用。2.2处理“播放”按钮单击“播放”按钮后,在OnButtonPlay()函数中,通过调用MCIMP3类的MCIOpen()函数获取刚才选择的文件路径以及文件名,调用该类的MCIPlay()函数播放歌曲,此时调用DisplayInfo()函数在StaticText控件上显示“正在播放的歌曲是(文件名)”,进行歌曲的播放,然后利用GetDlgItem()函数设置“播放”按钮不可用。2.3处理“暂停”按钮单击“暂停”按钮后,在OnButtonPause()函数中,首先通过调用MCIMP3类的MCIPause()函数暂停正在播放的歌曲,然后调用DisplayInfo()函数在StaticText控件上显示“暂停播放歌曲(文件名)”,此时的歌曲处于暂停时的进度上,利用GetDlgItem()函数设置“播放”按钮可用。2.4处理“停止”按钮单击“停止”按钮后,在OnButtonStop()函数中,首先通过调用MCIMP3类的MCIPause()函数停止正在播放的歌曲,然后调用DisplayInfo()函数在StaticText控件上显示“停止播放歌曲(文件名)”,将停止正在播放歌曲,利用GetDlgItem()函数设置“暂停”按钮和“停止”按钮不可用。2.5处理“音量”按钮单击“音量”按钮后,在OnButtonVolume()函数中,首先调用WinExec()函数并且打开C:/WINDOWS/System32/sndvol32.exe,弹出“主音量”对话框,在此对话框内可以对音量进行增大或减小以及静音的设置。2.6处理“退出”按钮单击“退出”按钮后,在OnButtonQuit()函数中,调用CDialog类的OnCancel()函数将退出对话框,结束程序的运行。3操作步骤先在VS环境下建立好一个基于对话框的工程。打开资源视图,在对话框内按照布局图布局,步好后根据表-1来设置属性。添加相应的变量和函数。进行程序初始化。为各个按钮添加消息处理函数,并添加相应的代码。全部完成后进行测试和调试。课程设计分析与总结分析 按照课程设计的要求,我们用C/C++来实现功能,但由于我们在学过面向对象后,我们常用的是VisualStudio2010版本的VS编辑器。在分析所要做的播放器时,想到的最基本的功能就是可以播放音乐,其次就是对播放过程中的操作,如:快进或快退、上一曲或下一曲、播放/暂停、音量大小、选择和添加歌曲、播放界面选择……等等功能。但是,由于学识有限,我们在这一周的时间内没有去考虑这么多功能,所以对于这样一个播放器,还是存在很多的改进方案。那么只有在以后的探索中慢慢来实现了。 总结经过一周的面向对象程序课程设计,我学到了很多。在这一周的实际动手学习中,我对VC++这门课程有了更深刻的认识,掌握了用MFC创建基于对话框的应用程序,同时了解了MCI相关知识。这次课程设计我做了MP3播放器的设计,MP3播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。本次课程设计中虽然可以实现播放、暂停、停止、播放界面美化以及音量等功能,但仍然存在着放多不足,比如进度条功能没有实现、列表管理的功能以及循环播放功能始终无法实现,如果有时间一定会好好研究。课设是辛苦劳累的,但是收获同样是巨大的,在课设中每解决一个问题,那种成就感是无法言语的,课设中第一次调试程序时出现了很多错误,其中有逻辑错误,编译能通过,运行始终无法通过,后来经过思考,进行了多次修改调试之后得到了运行结果;但是还是存在兼容性问题,电脑版本和系统以及软件的版本之间存在各种兼容性问题,因为之前在程序中几乎没见到过,所以一时不知从何处检查并改进,后来在老师的帮助下,找到了问题,结果换了台电脑,经过改正调试最终达到了目的。像此类的问题还有很多,不过经过查询资料,咨询老师,与同学探讨最终得到了理想的程序。此外,我还得到了一个结论,在课程设计中,老师的作用有时是不可或缺的,可以在关键时刻给我们一些重要的提示,从而方便我们解决各种问题。这就是我对这次软件课程设计的总结。附录关键程序清单BOOLCMp3PlayerDlg::OnInitDialog()//初始化{ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon //TODO:Addextrainitializationhere DisplayInfo(0,_T("欢迎使用Mp3Player!"),_T("")); GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCMp3PlayerDlg::OnButtonOpen()//打开{ //TODO:Addyourcontrolnotificationhandlercodehere charszFileFilter[]="AllMusicFiles(*.*)|*.*||"; CFileDialogFileOpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter/*,this*/); if(FileOpenDlg.DoModal()==IDOK) { m_csPathName=FileOpenDlg.GetPathName(); m_csSongName=FileOpenDlg.GetFileName(); DisplayInfo(1,_T("你选择的歌曲是:"),m_csSongName); m_bIsOpened=TRUE; m_bIsNoSelectFile=FALSE; } else { m_bIsNoSelectFile=TRUE; } if(m_bIsOpened&&m_mcimp3.MCIIsPlaying()) { m_mcimp3.MCIClose(); m_mcimp3.MCIStop(); } if(m_bIsOpened&&m_mcimp3.MCIIsPlaying() &&m_bIsNoSelectFile) { m_mcimp3.MCIResume(); } if(m_bIsOpened&&m_bIsPressPauseBtn) { m_bIsPauseOpen=TRUE; } BOOLbIsPlayBtnEnabled=GetDlgItem(IDC_BUTTON_PLAY)->IsWindowEnabled(); if(!bIsPlayBtnEnabled) { GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE); } }voidCMp3PlayerDlg::OnButtonPlay()//播放{ //TODO:Addyourcontrolnotificationhandlercodehere if(m_bIsPauseOpen){ if(m_bIsNoSelectFile) { m_mcimp3.MCIResume(); DisplayInfo(1,_T("继续播放歌曲:"),m_csSongName); m_bIsPressPauseBtn=FALSE; } else { m_mcimp3.MCIOpen(m_csPathName); m_mcimp3.MCIPlay(); DisplayInfo(1,_T("正在播放的歌曲是:"),m_csSongName); GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE); m_bIsNoSelectFile=TRUE; } } elseif(m_bIsOpened&&m_bIsPressPauseBtn) { m_mcimp3.MCIPlay(); DisplayInfo(1,_T("继续播放歌曲:"),m_csSongName); m_bIsPressPauseBtn=FALSE; GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE); } else { if(m_bIsNoSelectFile) { DisplayInfo(0,_T("你还没有选择歌曲,点击播放没有意义!"),_T("")); return; } m_mcimp3.MCIOpen(m_csPathName); m_mcimp3.MCIGetLength(&m_dwLen); m_mcimp3.MCIPlay(); SetTimer(1,1000,NULL); DisplayInfo(1,_T("正在播放的歌曲是:"),m_csSongName); m_bIsPressStopBtn=FALSE; GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE); } BOOLbIsPauseBtnEnabled=GetDlgItem(IDC_BUTTON_PAUSE)->IsWindowEnabled(); if(!bIsPauseBtnEnabled) { GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(TRUE); }BOOLbIsStopBtnEnabled=GetDlgItem(IDC_BUTTON_STOP)->IsWindowEnabled(); if(!bIsStopBtnEnabled) { GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE); }}voidCMp3PlayerDlg::OnButtonPause()//暂停{ //TODO:Addyourcontrolnotificationhandlercodehere BOOLbIsPlaying=m_mcimp3.MCIIsPlaying(); if(bIsPlaying) { m_mcimp3.MCIPause(); DisplayInfo(1,_T("暂停播放歌曲:"),m_csSongName); m_bIsPressPauseBtn=TRUE; } BOOLbIsPlayBtnEnabled=GetDlgItem(IDC_BUTTON_PLAY)->IsWindowEnabled(); if(!bIsPlayBtnEnabled) { GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE); }}voidCMp3PlayerDlg::OnButtonStop()//停止{ //TODO:Addyourcontrolnotificationhandlercodehere if(m_mcimp3.MCIStop()==0) //停止播放 { m_bIsPressStopBtn=TRUE; m_bIsPressPauseBtn=FALSE; GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); DisplayInfo(1,_T("停止播放歌曲:"),m_csSongName); m_mcimp3.MCIClose(); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE); } BOOLbIsPlayBtnEnabled=GetDlgItem(IDC_BUTTON_PLAY)->IsWindowEnabled(); if(!bIsPlayBtnEnabled) { GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE); }}voidCMp3PlayerDlg::OnButtonQuit()//退出{ //TODO:AddyourcontrolnotificationhandlercodehereCDialog::OnCancel();}voidCMp3PlayerDlg::OnButtonVolume()//音量{ //TODO:Addyourcontrolnotificationhandlercodehere WinExec("C:\\WINDOWS\\System32\\sndvol32.exe",SW_NORMAL); }voidCMp3PlayerDlg::DisplayInfo(boolbOPInfo,CStringcsInfo,CStringcsSongName){ if(!bOPInfo) { m_csInfo=csInfo; } else { m_csInfo=csInfo; m_csInfo+=csSongName; } GetDlgItem(IDC_STATIC_INFO)->SetWindowText(m_csInfo);}voidCMp3PlayerDlg::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault if(nIDEvent==1) { if(0==m_dwLen){KillTimer(1);DisplayInfo(1,_T("已经播放完歌曲:"),m_csSongName); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); return;}m_dwLen--; } CDialog::OnTimer(nIDEvent);}参考文献[1]黄维通.VisualC++面向对象编程教程.第三版.北京:清华大学出版社,2011[2]侯俊杰.深入浅出MFC.第2版.广东:南方出版社,2007[3]严华峰等.VisualC++课程设计案例精编.北京:中国水利水电出版社,2004[4]王维玉等.VisualC++高级编程技术精粹.北京:科学出版社,2008[5]陈国建等.VisualC++范例开发大全.北京:清华大学出版社,2010淮海工学院课程设计报告书课程名称:通信电子线路课程设计题目:调频发射机设计系(院):通信工程系学期:专业班级:通信姓名:学号:评语:成绩:签名:日期:调频发射机电路设计一绪论1.1摘要调频信号的基本特点是它的瞬时频率按调制信号规律变化,因而,一种最容易的实现方法是用调制信号直接控制振荡器的振荡频率,使其不失真地反映调制信号的变化规律。通常将这种直接调变振荡器频率的方法称为直接调频法。采用这种方法时,被控的振荡器可以是产生正弦波的LC振荡器和晶体振荡器,也可以是产生非正弦的张弛振荡器。前者产生调频正弦波,后者产生调频非正弦波(例如调频方波,调频三角波),如果需要,通过滤波等方法将调频非正弦波变换为调频正弦波。本电路采用LC振荡器。1.2主要性能要求1(天线)负载电阻:RL=75欧;2发射功率:Po≥80mW;3工作中心频率:f0=6.5MHz;4最大频偏:;5总效率:。1.3概述设计一个完整的小功率直接调频发射机系统,直接调频发射系统框图主要由调频振荡器、缓冲隔离器、倍频器、高频功率放大器、调制信号发生器等电路组成。原理图如图1。图1直接调频发射机组成框图二电路原理2.1LC振荡电路工作原理电容三点式振荡电路又称考毕兹(Colpitts)电路,基本结构入图2左图所示。图中Cc为耦合电容,Cb为旁路电容,电阻Rb1,Rb2和Re构成分压式偏置,为电路提供直流偏置,Rl为输出负载电阻。电路的交流通路如图3右图所示,如果移去管子,电容C1,C2和电感L为并联谐振回路,构成电路的选频网络。对于一个振荡器,当其负载阻抗及反馈系数已经确定的情况,静态工作点的位置对振荡器的起振以及稳定平衡状态(振幅大小,波形好坏)有着直接的影响。要想起振,首先三极管应该工作在静态工作点。电路应选择合适的静态工作点的位置。图2振荡电路电容三端反馈振荡电路利用电容C1和C2作为分压器,该电路满足相位条件,选取合适时满足振幅起振条件,该电路就可振荡。可得到振荡频率近似为(2.1)式中:C是振荡回路的总电容。该电路与电感三端反馈振荡电路相比,输出波比较好,波形更接近正弦波。适当地加大电路电容,就可减弱不稳定因素对频率的影响,从而提高电路的稳定度。LC振荡电路图如下:图3LC振荡电路图仿真波形如下:图4调频仿真波形频率如下;图5振荡频率2.2变容二极管调频原理变容二极管调频电路是一种常用的直接调频电路,广泛应用于移动通信和自动频率微调系统。其优点是工作频率高,固有损耗小且线路简单,能获得较大的频偏,其缺点是中心频率稳定度较低。较之中频调制和倍频方法,这种方法的电路简单、性能良好、副波少、维修方便,是一种较先进的频率调制方案。利用二极管的特性直接产生调频波,其原理电路如图4所示。图6变容二极管调频电路变容二极管Cj通过耦合电容C1并接在LCn回路的两端,形成振荡回路总电容的一部分。因而,振荡回路的总电容C为:(2.2)振荡频率为:(2.3)加在二极管上的反向偏压为:(直流反偏)(调制电压)(高频振荡,可忽略)在微波发射机中,常用速调管振荡器作为载波振荡器,其振荡频率受控于加在管子反射极上的反射极电压。因此,只需将调制信号加至反射极即可实现调频。若载波是由多谐振荡器产生的方波,则可用调制信号控制积分电容的充放电电流,从而控制其振荡频率。调频电路如下:图7变容二极管直接调频的工作原理图仿真波形如下:图8二极管调频波形2.3缓冲隔离缓冲隔离级将调频振荡器与功放级隔离,以减小后级对振荡器频率稳定度及振荡波形的影响。是否选择该单元电路,主要根据电路对稳定性要求的高低。一般情况下,需要选择该电路。缓冲级通常采用射极跟随器电路。缓冲隔离图:图9缓冲隔离图仿真图如下:图10缓冲隔离仿真图2.4功率放大功率放大是将调频振荡器产生的信号频率加倍,以达到发射机载波频率的要求,这样可以降低振荡器的工作频率,提高电路的频率稳定度。如果振荡器的振荡频率可以满足发射机载波频率的要求,就可省去此电路。高频功放电路使负载(天线)上获得设计要求的发射功率。如果要求达到的发射功率比较大,那么在末级功放之前还要加功率推动级,以便为末级功放提供足够的激励功率。如果要求的发射功率不大,且振荡级的输出功率能够满足末级功放的输入要求,那么功放推动级也可省去。选择高频功率放大器时应考虑几个因素,如要使负载(天线)上获得令人满意的发射功率,而且整机效率较高,应选择丙类功率放大器。末级功放的功率增益不能太高,否则电路性能不稳定,容易产生自激。因此要根据发射机各部分的作用,适当地合理分配功率增益。功率推动级为末级功放提供
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 考监控证考试题目及答案
- 木工考试题及答案技师
- 职高数控考试题及答案
- 2026年秋冬季流感防治:中小学师生环境清洁消杀课件
- 2026年秋冬季节流感预防:环卫工人抗病毒药物合理使用培训课件
- 小学二年级劳动拖地过程有讲究教学设计
- 粤教版七年级音乐下册《小城故事》单元主题教学设计
- 高三英语高考写作同义替换词归纳总结与应用教学设计
- 九年级数学教学设计:配方法第2课时-一般二次方程的解法与策略选择
- 八年级语文第12课《诗经二首》教学设计
- 软件定义网络(SDN)知识试题及答案
- 病虫害自动识别与预警-洞察阐释
- 耗材买卖合同协议格式
- 地形图的判读课件-2024-2025学年七年级地理上学期(2024)人教版
- 混凝土结构工程施工工艺规程
- 12、口腔科诊疗指南及技术操作规范
- 互联网+护理服务介绍课件
- GB/T 10858-2023铝及铝合金焊丝
- 德育为先 立德树人
- 校服采购投标方案
- 医院海姆立克急救操作考核评分标准
评论
0/150
提交评论