已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西南交通大学 信息学院 软件工程系 2014年暑期软件实习报告题目:个人日程管理系统 C+语言版姓 名:_ 黄超 陈翔芳 专 业:_ 自动化 班 级:_ 2班 学 号:_20131650 20131651_ 指导老师:_ _何滨_ 成 绩:_ _ 目录第1章实现题目与要求21.1问题描述21.2要求21.3系统功能21.4项目分工3第2章系统设计与实现42.1总体设计42.1.1系统功能设计42.1.2系统函数说明42.2类图及类的层次关系52.3数据库设计52.4算法62.5程序代码设计6第3章程序调试与系统测试73.1系统运行环境73.2主要函数调试与说明73.3系统测试与说明73.3.1系统主界面运行说明73.3.2个人日记功能模块运行说明73.3.3备忘录功能模块运行说明83.3.4定期提醒功能模块运行说明8第4章实习总结94.1个人总结94.1.1黄超个人总结94.1.2陈翔芳个人总结94.2结束语9第5章源代码105.1个人日程管理系统完整源代码10第1章 实现题目与要求1.1 问题描述(1) 掌握和利用C+语言进行程序设计的能力;(2) 掌握理解VC + 编程环境;(2)理解和运用结构化程序设计的思想和方法。(3)掌握开发小型实用系统的基本方法。(4)学会调试一个较长程序的基本方法。(5)掌握书写程序设计开发文档的能力(书写课程设计报告)。(6)掌握理解运用MFC编程的基本方法。1.2 要求 (1)用C+语言实现系统。(2)可以显示现实里的时间。(3)系统具有增加、查询、修改、删除等基本功能。(4)系统的各个功能模块要求用函数的形式实现。(5)完成设计任务并书写实训报告。(6)将个人日程信息存在文件中。1.3 系统功能(1) 可以记录个人日记,包括日期,标题,天气,内容。(2) 可以记录固定节日,可以通过手动增加的方式写入。(3) 可以设置定时提醒,可设置提醒时间和提醒的音乐文件,还可输出提示内容。(4) 可以添加备忘录。(5) 可以设置开机启动及最小化的功能。(6) 可以显示现实时间。1.4 项目分工第2章 系统设计与实现将学生成绩管理系统划分为以下几个模块2.1 总体设计当我们看到平时的日记本,闹钟还有日历等普通却又重要的物品时,我们就想到是否可以通过编程将这些普通的功能融合到一起。于是我们想通过c+的MFC来实现这个构想。首先我们将单个功能通过编程加以实现,然后再通过按钮功能实现各个模块的相互跳转。最终完成一个集各大日常基础功能于一身的个人日程管理系统。2.1.1 系统功能设计要求: 1、给出系统项功能模块图2、(必须Visio画图)。个人日程管理系统如图1-1(所有的图按章编号)所示 图1-1 系统功能模块图2.1.2 系统函数说明(1)void DAOJISHI:OnTimer(UINT nIDEvent) 函数功能:定时功能函数 。(2)void Page1:SetList() 函数功能:输入日期,内容。(3)void Page1:Onshanchu() 函数功能: 删除日记、备忘录。(4)void Page1:Onchazhao() 函数功能:查找日记、备忘录。(5)void Page1:Onzengjia() 函数功能: 增加日记、备忘录。(6) void Page1:Onxiugai() 函数功能:修改日记、备忘录。2.2 类图及类的层次关系2.3数据库设计 2.4算法2.5程序代码设计1、 个人日记模块代码 可以书写日记的日期内容,可以增加,删除,修改日记void Page4:OnButton1() /增加日记的模块/ TODO: Add your control notification handler code hereUpdateData(TRUE);CString sql =insert into diary(diarydate,diarytitle,diaryweather,diaryneirong)values(+m_edit1+,+m_edit2+,+m_edit3+,+m_edit4+);m_ADOConn.ExecuteSQL(_bstr_t)sql);BOOL Page4:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herethis-m_ADOConn.OnInitADOConn();return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE/DEL void Page4:OnButton42() /DEL /DEL / TODO: Add your control notification handler code here/DEL /DEL void Page4:OnButton2() /查找的模块/ TODO: Add your control notification handler code hereUpdateData();BPage4 a(NULL,m_edit2);a.DoModal();2、 固定节假日模块 可以对节假日进行标记,并可以设置提醒功能,及那天的内容void Page3:SetList()m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);/改风格为选择一行CString sql = select * from gudingjiejiari ;m_ADOConn.GetRecordSet(_bstr_t)sql);/插入列表标题m_list.InsertColumn(0,日期,LVCFMT_LEFT,90,0);m_list.InsertColumn(1,节日,LVCFMT_LEFT,50,0);m_list.InsertColumn(2,内容,LVCFMT_LEFT,50,0);/读取数据库信息 看不懂int i = 0;while(!m_ADOConn.m_pRecordset-adoEOF)m_list.InsertItem(i,(const TCHAR*)(_bstr_t)m_ADOConn.m_pRecordset-GetCollect(riqi);m_list.SetItemText(i,1,(const TCHAR*)(_bstr_t)m_ADOConn.m_pRecordset-GetCollect(jieri);m_list.SetItemText(i,2,(const TCHAR*)(_bstr_t)m_ADOConn.m_pRecordset-GetCollect(neirong);m_ADOConn.m_pRecordset-MoveNext(); i+; m_list.EnsureVisible(0,false); m_list.SetItemState(0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);m_list;SetFocus();UpdateData(FALSE);BOOL Page3:OnInitDialog() CDialog:OnInitDialog(); SetList();/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE3、 定时提醒模块 可以定时进行提醒,可以设置指定音乐文件进行提醒 void Page2:OnTimer(UINT nIDEvent) /设置提醒时间/ TODO: Add your message handler code here and/or call defaultCTime t;t=CTime:GetCurrentTime();int h = t.GetHour();int m = t.GetMinute();int s = t.GetSecond();if(h=m_h&m=m_m&s=m_s)hMCI = MCIWndCreate(NULL,NULL,WS_POPUP|MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU,strFileName);MCIWndPlay(hMCI);if(IDOK=MessageBox(m_naozhong,提示,MB_OK)MCIWndStop(hMCI);CDialog:OnTimer(nIDEvent);void Page2:OnPaint() CPaintDC dc(this); / device context for painting/ TODO: Add your message handler code hereSetTimer(1,1000,NULL);/ Do not call CDialog:OnPaint() for painting messagesvoid Page2:OnButton1() /设置提醒模块/ TODO: Add your control notification handler code hereUpdateData(TRUE);MessageBox(设置成功,提示,MB_OK);void Page2:OnButton5() /倒计时模块DAOJISHI d;d.DoModal();void Page2:OnButton2() /打开音乐文件模块CString strFilter=所有支持文件(*.mp3,*.wav,*.wma)|*.mp3;*.wav;*.wma|*.*|;CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,strFilter);if(fdlg.DoModal()=IDOK)strFileName=fdlg.GetPathName(); /AfxMessageBox(strFileName); /文件路径/AfxMessageBox(strFile);/音乐名称m_CString_music=strFileName; UpdateData(FALSE);void Page2:OnButton3() /间隔提醒模块/ TODO: Add your control notification handler code hereJIANGE j;j.DoModal();4、 备忘录模块 可以设置备忘录的类别和日期,及增加、删除、修改备忘录void Page5:Onzengjia() /增加/ TODO: Add your control notification handler code hereUpdateData(true); CString riqi=m_riqi.Format(_T(%Y-%m-%d); CString sql=insert into beiwanglu(riqi,leibie,neirong) values(+riqi+,+ m_leibie+, +m_neirong+); m_ADOConn.ExecuteSQL(_bstr_t)sql);SetList();void Page5:Onxiugai() /修改/ TODO: Add your control notification handler code hereUpdateData(true); CString riqi=m_riqi.Format(_T(%Y-%m-%d); int i=m_list.GetSelectionMark();CString oldriqi=m_list.GetItemText(i,0); CString leibie=m_list.GetItemText(i,1); CString neirong=m_list.GetItemText(i,2); CString sql = update beiwanglu set riqi = +riqi+,leibie =+m_leibie+,neirong =+m_neirong+where riqi = + oldriqi + and leibie = +leibie+and neirong = + neirong +; m_ADOConn.ExecuteSQL(_bstr_t)sql);SetList();/UpdateData(true);/CString date=m_date.Format(_T(%Y-%m-%d);/int i=m_list.GetSelectionMark();/CString text=m_list.GetItemText(i,1);/CString olddate=m_list.GetItemText(i,0);/CString sql = update notetable set notedate = +date+,noteneirong =+m_text+ where notedate = + olddate + and noteneirong = +text+;/m_ADOConn.ExecuteSQL(_bstr_t)sql);/SetList();void Page5:Onshanchu() /删除/ TODO: Add your control notification handler code hereint i=m_list.GetSelectionMark();CString date=m_list.GetItemText(i,0); CString leibie=m_list.GetItemText(i,1); CString neirong=m_list.GetItemText(i,2); CString sql = delete from beiwanglu where riqi = + date + and leibie = + leibie + and neirong = + neirong + ; m_ADOConn.ExecuteSQL(_bstr_t)sql); /m_list.DeleteItem(i);SetList();void Page5:Onchazhao() /查找/ TODO: Add your control notification handler code hereUpdateData(TRUE);CString sql = CString(select * from beiwanglu where leibie=) + m_leibie + ;m_ADOConn.GetRecordSet(_bstr_t)sql);void Page5:OnClicklistbeiwanglu(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereint i=m_list.GetSelectionMark(); /m_neirong=日期:+m_list.GetItemText(i,0)+rn类别:+m_list.GetItemText(i,1)+rn内容:+m_list.GetItemText(i,2); / UpdateData(false); /int i=m_list.GetSelectionMark();CString str = m_list.GetItemText(i,0);m_leibie=m_list.GetItemText(i,1);m_neirong=m_list.GetItemText(i,2);COleDateTime date;date.ParseDateTime(str);m_riqi.SetDate(date.GetYear(),date.GetMonth(),date.GetDay();UpdateData(false);*pResult = 0;5、 开机启动功能 可以使软件在开机之后就运行 void CKaijiqidong:OnButton1() HKEY sub;char bufname200;:GetModuleFileName(NULL,bufname,200);CString str;str.Format(%s,bufname);CString skey= SoftwareMicrosoftWindowsCurrentVersionRun;:RegCreateKey(HKEY_LOCAL_MACHINE,skey,&sub);if(m_chset.GetCheck():RegSetValueEx(sub,StartAutoRun,NULL,REG_SZ,(const BYTE*)str.GetBuffer(0),str.GetLength();else:RegDeleteValue(sub,StartAutoRun); CDialog:OnOK();void CKaijiqidong:OnDestroy() CDialog:OnDestroy();6、 最小化功能 可以使软件最小化,双击后又恢复 void CXiangmuDlg:COnMenuitem32780()/最小化模块 NOTIFYICONDATA nid;nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);nid.hWnd=this-m_hWnd;nid.uID=IDI_ICON2;nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;nid.uCallbackMessage=WM_SHOWTASK;/自定义的消息名称nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2);strcpy(nid.szTip,计划任务提醒);/信息提示条为“计划任务提醒”Shell_NotifyIcon(NIM_ADD,&nid);/在托盘区添加图标ShowWindow(SW_HIDE);/隐藏主窗口 LRESULT CXiangmuDlg:onShowTask(WPARAM wParam,LPARAM lParam) /wParam接收的是图标的ID,而lParam接收的是鼠标的行为 if(wParam!=IDI_ICON2) return 1; switch(lParam) case WM_RBUTTONUP:/右键起来时弹出快捷菜单,这里只有一个“关闭” LPPOINT lpoint=new tagPOINT; :GetCursorPos(lpoint);/得到鼠标位置 this-SetFocus(); CMenu menu; menu.CreatePopupMenu();/声明一个弹出式菜单 /增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 /隐藏),将程序结束。 menu.AppendMenu(MF_STRING,WM_DESTROY,关闭); menu.AppendMenu(MF_STRING,WM_SHOWABOUT,关于); /确定弹出式菜单的位置 menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint-x,lpoint-y,this); /资源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; break; case WM_LBUTTONDBLCLK:/双击左键的处理 this-ShowWindow(SW_SHOW);/简单的显示主窗口完事儿 this-SetFocus(); break; return 0; 7、 显示现实时间功能 可以获取系统时间并将其显示void CXiangmuDlg:OnTimer(UINT nIDEvent) CDialog:OnTimer(nIDEvent);CTime t = CTime:GetCurrentTime(); /获取系统时间函数 str.Format(%d时%d分%d秒,t.GetHour(),t.GetMinute(),t.GetSecond();SetDlgItemText(time,str);第3章 程序调试与系统测试3.1 系统运行环境Windows8操作系统;Microsoft Visual Studio 2008. 3.2 主要函数调试与说明(1)void DAOJISHI:OnTimer(UINT nIDEvent) 定时功能函数 (2)void Page1:SetList() 输入日期,内容(3)void Page1:Onshanchu() 删除日记、备忘录(4)void Page1:Onchazhao() (5)void Page1:Onzengjia() 增加日记、备忘录(6)void Page1:Onxiugai() 修改日记、备忘录(7)void SetList() 将日期,类别,内容按一定的要求输入到列表(8) MCIWndPlay() 音乐播放功能(9) MCIWndPlay() 音乐停止功能(10)MCIWndCreate() 创建音乐文件功能3.3 系统测试与说明3.3.1 系统主界面运行说明先创建图像列表,然后关联图像列表,总共6个按钮。下来设置每个工具栏按钮的ID值和显示文字。在工具栏里每一个按钮有对应的功能系统设置,提醒设置,音乐设定,个人记事,帮助。系统设置里则有最小化和开机即启动的模块。提醒设置则连接了定时功能模块。音乐设定则是可以使音乐停止及找音乐文件。个人记事是连接个人日记与备忘录的模块。在右上角可显示系统的时间。主页面主要是由定期提醒那个对话框构成。3.3.2 个人日记功能模块运行说明 在此模块,可以书写个人日记,就就像是个人日记一般。有四个编辑框。可分别填入日期、标题、天气及内容,当这些写完之后,点击添加键即可,系统便会将这篇日记存入。当想删除时,只要按删除键即可。3.3.3 备忘录功能模块运行说明 在此模块通过函数m_list.InsertColumn()让用户输入的日期,类别与内容按要求插入到列表中。通过一些类的函数便可完成备忘录的增加,删除,修改,查找。3.3.4 定时提醒功能模块运行说明 在此模块中,通过OnTimer()函数用于实现定时控制功能,定时控制功能主要由下面三个函数共同实现:SetTimer, KillTimer()和OnTimer().其中Settimer是设置定时器的,Ontimer是响应Settimer消息的。当Settimer设置的时间到了,就会自动调动Ontimer()函数。Ontimer中有开启音乐的函数,所以当时间到了音乐便会响,并弹出提示框。第4章 实习总结4.1 个人总结4.1.1 黄超个人总结 4.1.2 陈翔芳个人总结4.2 结束语 第5章 源代码5.1 个人日程管理系统完整源代码/ About.cpp : implementation file/#include stdafx.h#include xiangmu.h#include About.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAbout dialogCAbout:CAbout(CWnd* pParent /*=NULL*/): CDialog(CAbout:IDD, pParent)/AFX_DATA_INIT(CAbout)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INITvoid CAbout:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAbout)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAbout, CDialog)/AFX_MSG_MAP(CAbout)/ NOTE: the ClassWizard will add message map macros here/AFX_MSG_MAPEND_MESSAGE_MAP()/ ADOConnect.cpp: implementation of the ADOConn class./#include stdafx.h#include ADOconnect.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/ADOConn:ADOConn()ADOConn:ADOConn()void ADOConn:OnInitADOConn()/初始化OLE/COM库环境:CoInitialize(NULL);tryCString strExePath;/创建connection对象GetModuleFileName(NULL, strExePath.GetBuffer(MAX_PATH), MAX_PATH); strExePath.ReleaseBuffer(); int place=0;place = strExePath.ReverseFind( ); /获得最后一个的位置; /AfxMessageBox(strExePath);CString db_name=strExePath.Left(place+1);/db_name.Append(strExePath.Left(place+1);/AfxMessageBox(strExePath.Left(place);/AfxMessageBox(db_name);db_name +=_T(DB.mdb); /整合出access数据库完整路径/CString connect; /连接的第一个参数/connect = Provider=Microsoft.Jet.OLEDB.4.0;Data Source= + db_name + ; /AfxMessageBox(db_name);m_pConnection.CreateInstance(ADODB.Connection);CString strConnect=_T(Provider=Microsoft.Jet.OLEDB.4.0;Data Source= + db_name + ;);/m_pConnection.CreateInstance(ADODB.Connection); /设置连接字符串/_bstr_t strConnect=uid=;pwd=;DRIVER=Microsoft Access Driver (*.mdb); /DBQ=CIOP.mdb;/UID,PWD根据实际情况来设置m_pConnection-Open(_bstr_t)strConnect,adModeUnknown);/m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb,adModeUnknown);/捕捉异常catch(_com_error e)/显示错误信息AfxMessageBox(e.Description();void ADOConn:ExitConnect()/关闭记录集和连接if(m_pRecordset!=NULL)m_pRecordset-Close();m_pConnection-Close();/释放环境:CoUninitialize();_RecordsetPtr& ADOConn:GetRecordSet(_bstr_t bstrSQL)tryif(m_pConnection=NULL)OnInitADOConn();m_pRecordset.CreateInstance(_uuidof(Recordset);m_pRecordset-Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);catch(_com_error e)AfxMessageBox(e.Description();return m_pRecordset;BOOL ADOConn:ExecuteSQL(_bstr_t bstrSQL)try/是否已连接数据库if(m_pConnection=NULL)OnInitADOConn();m_pConnection-Execute(bstrSQL,NULL,adCmdText);return true;catch(_com_error e)AfxMessageBox(e.Description();/显示错误信息return false;/ BPage1.cpp : implementation file/#include stdafx.h#include xiangmu.h#include BPage1.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ BPage1 dialogBPage1:BPage1(CWnd* pParent /*=NULL*/,CString m_neirong): CDialog(BPage1:IDD, pParent)/AFX_DATA_INIT(BPage1)m_textB1 = m_neirong;/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INITvoid BPage1:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(BPage1)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(BPage1, CDialog)/AFX_MSG_MAP(BPage1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ BPage1 message handlersBOOL BPage1:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereSetDlgItemText(IDC_STATIC11,m_textB1);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE/ BPage4.cpp : implementation file/#include stdafx.h#include xiangmu.h#include BPage4.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ BPage4 dialogBPage4:BPage4(CWnd* pParent /*=NULL*/,CString m_edit2): CDialog(BPage4:IDD, pParent)/AFX_DATA_INIT(BPage4)m_title = m_edit2;m_text = _T();/AFX_DATA_INITvoid BPage4:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(BPage4)DDX_Control(pDX, IDC_LIST1, m_list41);DDX_Text(pDX, IDC_EDIT1, m_text);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(BPage4, CDialog)/AFX_MSG_MAP(BPage4)ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)ON_BN_CLICKED(IDC_BUTTON1, OnButtonB4)/AFX_MSG_MAPEND_MESSAGE_MAP()/ BPage4 message handlersBOOL BPage4:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereCString sql = select * from diary where diarytitle= + m_title + ;m_ADOConnB4.GetRecordSet(_bstr_t)sql);int i =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46363-2025公共安全视频图像信息综合应用服务接口技术要求
- 初中心理危机干预方案
- 初中物理教研方案
- 初中生演讲稿视频
- 2024-2025 学年度成都市小学五年级数学期中全真模拟试卷(含答案)
- 2025年物理治疗技术试题及答案
- 2025年小学三年级数学上学期专项突破试卷
- 2025年护士的素质试题及答案
- 2025年职业礼仪知识试题及答案
- 2025年深部真菌培训试题及答案
- 不确定条件下跨区域应急物资调度优化研究
- 《农机电器设备使用维护》课件-项目一:农机电气系统基础
- 格兰仕微波炉G80W23YSL说明书
- 滨州医学院《人体形态学》2023-2024学年第一学期期末试卷
- 中国监控摄像机行业发展趋势及发展前景研究报告2025-2028版
- 校园餐资金管理制度
- 手术麻醉管理授权培训
- T/JSWP 01-2021政策类决策社会稳定风险评估规范
- 小学二年级家长课堂课件
- 2025年上海房屋租赁合同的范本
- 绿化工程安全专项方案
评论
0/150
提交评论