产品故障信息管理系统.doc

上传人:仙人指路1688 文档编号:4136630 上传时间:2023-04-07 格式:DOC 页数:39 大小:836.50KB
返回 下载 相关 举报
产品故障信息管理系统.doc_第1页
第1页 / 共39页
产品故障信息管理系统.doc_第2页
第2页 / 共39页
产品故障信息管理系统.doc_第3页
第3页 / 共39页
产品故障信息管理系统.doc_第4页
第4页 / 共39页
产品故障信息管理系统.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《产品故障信息管理系统.doc》由会员分享,可在线阅读,更多相关《产品故障信息管理系统.doc(39页珍藏版)》请在三一办公上搜索。

1、产品故障信息管理系统内容摘要本文介绍了如何使用Visual C+ 6.0编程制作彩色电视机故障信息共享系统,实现信息管理共享的自动化。由此实现了信息的增加、删除、修改、查看等功能,并且进而实现信息的安全管理,使信息的管理更加人性化,规范化。从而提高故障排除效率,提高信息利用率,有助于进一步提高生产效率。关键词: 信息管理 信息共享 故障 数据库AbstractThe main work of this paper is introduce how to use Visual C+6.0programming a Color TV Malfunction-Information In-Commo

2、n System, achieve the auto-manage of the Malfunction-Information. According these, this system achieves the informations function of add,delete,edit and view, it also get the information managed safety, so the management of the information will be more humanity & normalize. Thereby, it can improve t

3、he efficiency of the malfunctions elimination, enhance the exploitation of the information, and also help improving the efficiency of the produce by a large step.Key words: Information management Information sharesADO目 录前 言 11.系统设计 11.1目标设计 11.2开发设计思想 11.3功能分析 21.4功能模块设计 22.数字库设计 22.1数据库需求分析 22.2数据库

4、概念结构设计 33.创建应用程序 34.数据库操作准备 55.功能模块的创建 75.1系统主体窗体的创建 75.1.1主菜单的创建 75.1.2右键菜单的创建 85.1.3工具栏的创建 85.1.4数据显示与表格控件的创建 95.2系统用户权限管理模块的创建 115.2.1添加用户对话框的创建 115.2.2更改密码对话框的创建 135.2.3删除用户对话框的创建 155.2.4用户登录对话框的创建 175.3信息管理模块的创建 175.3.1添加记录对话框的创建 175.3.2查询记录对话框的创建 205.3.3修改记录对话框的创建 215.3.4查看记录对话框的创建 225.4打印预览模块

5、的创建 227.接口网络编程原理 268. Windows Sockets编程原理 298.1异步选择机制 298.2异步请求函数 298.3阻塞处理方法 298.4错误处理 298.5启动和终止 299.实现远程数据的管理 309.1 设计基本思路:309.2 具体实现(为了数据传送的可靠性,采用基于TCP的流式套接字):3010.程序的编译和系统的实现 3111.结论 3112.致谢 32参 考 文 献 33前 言Visual C+是Microsoft公司开发的基于Windows操作系统的编程工具,它采用一种巧妙的方法将Windows的编程复杂性封装起来,编程者可以比较轻松地进行Windo

6、ws应用程序的设计。Visual C+ 6.0继承了以前版本的优点,为用户提供了更为友好的可视化开发环境,是当今程序员首选的开发工具。它在编程的深入性、运行的快速性等方面具有很强的功能。随着社会的飞速发展,信息管理系统已广泛地运用于各行各业。信息在企业生产经营中扮演着越来越重要的角色。企业内部和外部之间的信息变得越来越频繁,方式越来越复杂,信息量日益增大,速度越来越快,丝毫不亚于企业的物质、能量交流,信息流在企业系统中所占份额逐渐上升。这样一来,企业信息管理才应运而生,成为企业管理的重要组成部分。企业信息管理的产生是企业管理发展到一定阶段的必然产物,是企业管理发展史上的划时代的进步。故障信息管

7、理,一般是指设备或系统在使用中丧失或降低其规定的功能。故障管理,其目的是保证设备经常处于完好状态,严格控制设备的故障发生,降低故障率,减少维修费用,延长设备的使用寿命。 而信息化建设对企业来说无疑已经成为企业在现代竞争社会中立足的重要因素。而从中国大陆企业现状来看,大部分企业的信息化建设都是依靠专业化软件公司。毋庸置疑,对于大规模的管理系统,例如CRM(Client Relation Manager),ERP(Enterprise Resource Plan)等,使用专业软件公司开发的产品,功能相对齐全,安全级别也相对较高。但对于企业内部小范围内所需的一些小系统而言,如也依靠此种方式,势必会产

8、生无谓的成本流失。鉴于这种形式,借助这次毕业设计的机会,在指导老师的帮助下,经过一段时间的努力,开发出了这套彩电共享系统。本系统主要用于对已有故障信息进行更高效的管理,提高信息的利用率,改变了以往烦琐的查找,大大提高了故障的排除速度及正确率,对进一步提高生产效率具有十分重要的意义。 下面我们将按照软件工程学思想,对整个系统制作过程做个一般性阐述。1.系统设计1.1目标设计通过一个彩电故障信息共享系统,使生产工程部的故障处理工作系统化,规范化,自动化,从而达到提高故障排除效率,提高信息利用率的目的。1.2开发设计思想l 尽量采用生产工程部现有的软硬件环境及齐全的故障信息,从而达到充分利用现有资源

9、,提高系统开发水平和应用效果的目的。l 系统应符合生产工程部资料管理规范,符合普通员工操作的规范,达到操作过程中的直观、方便、实用、安全等要求。l 系统采用Visual C+环境,用ADO(ActiveX Data Objects)数据访问方式,采用Microsoft Access 2000作为数据源,使整个系统易于使用及维护。l 系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员补充、维护。l 系统应具备数据维护功能,及时根据数据变化进行添加、删除、修改、查询等操作,并加入拥护权限功能,使系统更加安全1.3功能分析本系统功能分析是在系统开发总体任务的基

10、础上完成的,本系统需要完成的功能如下:l 故障信息的输入、查询、修改、删除l 故障信息的打印l 系统用户管理,权限管理1.4功能模块设计在系统功能分析的基础上,考虑Visual C+程序编制的特点,得到图1所示的系统功能模块图。信息查询权限验证信息变动信息数据删除信息修改信息增加新信息管理员信息管理打印管理系统管理权限用户删除增加修改查询彩电故障信息共享系统 图1系统功能模块图图2数据流程图2.数字库设计数据结构的好坏将直接影响到系统的效率以及实现的效果。好的数据库结构会减少数据库的存储量、冗余度,数据的完整性和一致性比较高,系统具有较快的响应速度,简化基于数据库的应用程序的实现方法等。2.1

11、数据库需求分析在仔细研究资料管理过程的基础上,归纳出系统的数据流程图如上图2所示,所有数据均由管理员输入管理。根据图2的数据流程图,可得到所须设计的数据项和数据结构如下:l 故障信息,包括的数据项有显象管、机芯、机壳、器件、技术员、时间、其他、信息名、具体内容等。l 权限验证,包括的数据项有用户名、密码等。由上分析,为此需要有2个数据表分别用来存放故障信息的用户信息。这两个数据表均用Access 2000实现。Access中的设计视图如图3、图4所示,其中数据类型根据具体的数据字段来设置。图3 info1视图图4 login视图2.2数据库概念结构设计在分析需求的基础上,我们得到整个系统的E-

12、R图如图5所示。3.创建应用程序本彩电故障信息共享系统采用Visual C+ 6.0的ADO方法开发。工程创建具体步骤如下:打开Visual C+后,选择菜单“File/New”中的“Project”选项卡中的“MFC AppWizard exe”,设置工程名字为“CaidianGuzhang”,选择存储位置,单击“OK”。创建一个单文档应用程序,在Step1中,选择“Single Document”,然后单击“Next”按扭,进入“Step 2 of 6”。一直单击“Next”按扭,直到进入“Step 6 of 6”。因为为了能使数据更直观,我们采用列表形式,所以需要在本步骤中,选择CCai

13、dianGuzhangView类的Base Class(基类)为ClistView。然后单击“Finish”,最后将出现确认窗口,如图6所示,检查无误后,单击“确定”,即可完成工程创建。图6 确认为了使程序能支持ADO数据库对象,应该在头文件stdafx.h(预编译头文件)中加入#import c:Program FilesCommon FilesSystemadomsado15.dll rename_namespace(AdoNS) rename(EOF,adoEOF)using namespace AdoNS; 导入ADO库并在主程序入口:BOOL CCaidianGuzhangApp:I

14、nitInstance()中加入AfxOleInit();初始化COM环境。ADO (ActiveX Data Objects)是Microsoft开发数据库应用程序的面向对象的新接口,描述了软件中存取多种数据源的统一接口,并提供了实现ADO模型的COM组件,使得不同程序设计语言均可使用ADO。在NET Framework的System.Data命名空间中定义这些类-这些类表示到数据库的连接、数据库中的表,和表中所包含的数据类型。更广义地讲,ADO.NET就是Microsoft最新的数据访问策略。其主要的优点是灵活,易于使用、速度快、内存支出少和磁盘遗迹小,简化了操作。ADO类的定义是作为一种

15、资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C使用的COM vtable接口。当使用import指令时,在运行时Visual C需要从ADO DLL中读取这个类型库,并以此创建一组C头文件。ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。_CommandPtr返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可

16、以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。 _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。4.数据库操作准备由于本系统使用的是ADO方式访问数据库,因此可以使用从视表到记录集的映射。为了编程便捷,可以为数据库中的每个表映射一个记录集类(从CDaoRecordSet类继承)。映射关系如下表1所示。表1 记录集映射关系表格(视图)对应记录集Info1CDataSetloginCLoginSetCDaoRecordSet封装了ADO记录集对象,用于管理一个来自表定义(基础表

17、)或查询定义的记录集合。CDaoRecordSet对象有三种使用的原型,分别为table-type(基于单个数据表)、dynaset-type(基于组合查询)、snapshot-type(基于组合查询的静态拷贝)。对记录集的映射有两种方法:第一种是直接从CDaoRecordSet类创建记录集,并且动态绑定记录字段;第二种是使用ClassWizard创建CDaoRecordSet类的派生类,并利用DFX机制记录数据与记录集字段数据成员之间的映射。在本系统中,我首先使用第二种方法,方法是在ClassWizard中单击“New Class”,进入下一窗口,设置类名为“CDataSet”,选择Base

18、 Class(基类)为CDaoRecordSet,然后单击“OK”,进入“Database Option”窗口,选中“ADO”,按浏览按钮后,选择需要映射的文件(此处为info1.mdb),具体过程如图7所示。最后在弹 图7 选择ADO数据库文件出的Select Database Table(数据表选择对话框)中选中要映射的表名(在此为info1)。单击“OK”即可。同样的方法,建立类“CloginSet”,映射的表名为login。但是此种方法把数据库访问路径给固定了,我们可以从以下Visual C+自行建立的函数看出。CString CDataSet:GetDefaultDBName()re

19、turn _T(D:visualMSDev98MyProjectsxiahuainfo1.mdb);为了能使系统在各个环境下都可正常运行,需要修改此函数,使数据库实现动态链接,修改后的函数程序如下:CString CDataSet:GetDefaultDBName()char path50;CString m_strDatabaseName;:GetCurrentDirectory(50,path); /得到当前应用程序所在的路径strcat(path,);m_strDatabaseName=_T(path);m_strDatabaseName+=info1.mdb; /将所对应文件改成所要的

20、数据库名return m_strDatabaseName; /返回数据库所在的完整路径同样的,我们也必须修改CLoginSet:GetDefaultDBName()函数。因为其内部程序与CDataSet:GetDefaultDBName()相同,所以我们就不再此列出。5.功能模块的创建 在链接了数据库后,接下来我们就可以开始进行各功能模块的创建。5.1系统主体窗体的创建在我们按照VC+的AppWizard创建完工程后,为了使主窗口框架更适合整个系统的操作,我们有必要进行修改,重新创建。5.1.1主菜单的创建在WorkSpase中选择ResourseView,然后双击Menu文件夹,再双击IDR

21、_MAINFRAME选项,单击右边窗口中“帮助”旁边的虚线框,在双击或按回车键,就会出现“Menu Item Properties”对话框,在这个对话框中输入菜单项的内容,如图8所示。图8设置一级菜单二级菜单的设置基本上都和图8相同,只是必须设置ID。按照这种方法,最终创建出如表2所示的菜单结构。表2 菜单结构菜单名称ID文件.打印ID_FILE_PRINT.打印预览ID_FILE_PRINT_PREVIEW.打印设置ID_FILE_PRINT_SETUP.最近文件ID_FILE_MRU_FILE1.退出ID_APP_EXIT查看.工具栏ID_VIEW_TOOLBAR.状态栏ID_VIEW_S

22、TATUS_BAR信息管理.查询记录ID_RECORD_SEARCH.添加记录ID_RECORD_ADD.查看记录ID_RECORD_VIEW.删除记录ID_RECORD_DEL.更改记录ID_RECORD_EDIT权限管理.添加用户ID_USER_ADD.更改密码ID_PASSWARD_EDIT.删除用户ID_USER_DEL帮助.关于xiahua 1.0ID_APP_ABOUT5.1.2右键菜单的创建为了实现操作的方便、快捷,我们在程序中加入了右键菜单。在VC的主菜单中,按“Project”“New Project”“Components and Controls Gallery”即可进入

23、“Components and Controls Gallery”对话框,然后再打开Visual C+ Components文件,再选择“Pop-up Menu”,单击“insert”,随后在跳出的对话框中选择“CxiahuaView”,最后单击“OK”。完成后,需要对其进行编辑。单击WorkSpase中的ResourseView,在Menu文件夹中选择CG_IDR_POPUP_MAIN_FRAME,之后边可在右边窗口对其进行编辑。编辑方法与主菜单相同,其中各项的ID分别对应相应的菜单项,对应关系如表3所示。表3 右键菜单对应的菜单项ID菜单名称ID查看记录ID_RECORD_VIEW添加记录

24、ID_RECORD_ADD删除记录ID_RECORD_DEL更改记录ID_RECORD_EDIT5.1.3工具栏的创建在WorkSpase中选择ResourseView,然后双击Toolbar文件夹,再双击IDR_MAINFRAM选项,就可以利用工具条编辑器(Toolbar Editor)编辑右边的工具条。本系统创建的工具条如图9所示。其中各按钮的ID分别对应相应的菜单项,按从做到右的顺序对应的菜单项ID如表4所示。表4工具条对应的菜单项ID次序ID1ID_FILE_PRINT2ID_RECORD_ADD3ID_RECORD_DEL4ID_RECORD_SEARCH5ID_RECORD_ALL

25、6ID_APP_ABOUT(注:其中第5个是显示全部数据,实现刷新功能,在菜单中没有)5.1.4数据显示与表格控件的创建因为CxiahuaView是从ClistView继承的,所以创建完工程后,就已经有表格控件存在。而我们目的就是使控件上的显示更符合系统的使用,所以我们有必要对初试界面也就是对CXiahuaView:OnInitialUpdate()函数进行修改,修改后的函数如下:void CXiahuaView:OnInitialUpdate()CListView:OnInitialUpdate();/ TODO: You may populate your ListView with it

26、ems by directly accessingCListCtrl &ctl=GetListCtrl();ctl.ModifyStyle(0,LVS_REPORT|LVS_SINGLESEL);ctl.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);/设置窗体类型/初始化m_pSet指针,m_pSet原型为CDataSet* m_pSetm_pSet=&GetDocument()-m_dataSet;/初始化m_pLset指针,m_pLset原型为CLoginSet* m_pLsetm_pLset=&

27、GetDocument()-m_dataLset; if(m_pSet-IsOpen()m_pSet-Close();m_pSet-Open(); /打开数据库 GetDocument()-SetTitle(彩电故障信息共享系统); /设置标题CString str;/以下是设置控件按钮显示字符str.LoadString(IDS_SERIAL);ctl.InsertColumn(0,str);ctl.InsertColumn(1,显象管); ctl.InsertColumn(2,机芯);ctl.InsertColumn(3,机壳);ctl.InsertColumn(4,器件);ctl.Ins

28、ertColumn(5,技术员);ctl.InsertColumn(6,时间);ctl.InsertColumn(7,其他);ctl.InsertColumn(8,信息名);ctl.InsertColumn(9,具体内容);m_bIsAsc=TRUE;m_bIsShowAll=TRUE;ShowTableData(); /调用显示数据函数,显示数据接下来就是要编写ShowTableData()函数。程序如下:void CXiahuaView:ShowTableData() CListCtrl &ctl=GetListCtrl();ctl.DeleteAllItems(); /删除所有已显示内容

29、m_pSet-MoveFirst(); /将m_pSet指针指向首条记录int i=0;int ColWidth10=0;while(!m_pSet-IsEOF() /如果没有到达数据末尾,则显示数据 /设置各数据项的显示宽度for(int j=0;jMoveFirst(); /将m_pSet指针再指向首条记录,便于下次操作到此,我们完成了主体框架的制作,主窗口如图9所示。图9 主窗口5.2系统用户权限管理模块的创建为了数据库使用的安全,必须对数据库的各种操作实行权限管理。只有管理员允许的人员才有权力使用。允许的用户和密码都预先存在数据库中,本系统中为login表。权限管理模块主要实现如下功能

30、:l 添加用户l 更改密码l 删除用户l 用户登录(权限验证)5.2.1添加用户对话框的创建 在ResourseView中,右击Dialog,选择Insert Dialog,便可在右边窗口中编辑对话框。完成的对话框如图10所示。对话框中各种非静态文本控件的属性见表5。 图10 添加用户对话框 图11密码修改对话框表5添加用户对话框中各控件的属性设置控件ID用户名Edit BoxIDC_USER密码Edit BoxIDC_PSWD确认密码Edit BoxIDC_COMPSWD对话框编辑完成后,双击该对话框,进入New Class对话框,取此登记对话框的类名为CAddUser。然后在MFC Cla

31、ssWizard中选择Class name为CXiahuaView,Object IDs为“ID_USER_ADD”,Messages为“COMMAND”,单击Add Function按钮,取系统默认的函数名,再单击Edit Code按钮,即可进入代码编辑器对函数CXiahuaView:OnUserAdd()进行编辑。此函数代码如下:void CXiahuaView:OnUserAdd() / TODO: Add your command handler code hereCLoginSet *m_daorecordset=new CLoginSet(&pDatabase);/初始化连接数据库

32、指针 CString strSQL;if(adiministrator()=0) /管理员权限验证,失败返回return; else /成功进入增加用户窗口 CAddUser adduser;/进入增加用户窗口 if(adduser.DoModal()=IDCANCEL) return; else m_daorecordset-Close();strSQL.Format(select * from login where user=%s,adduser.m_strUser); m_daorecordset-Open(AFX_DAO_USE_DEFAULT_TYPE,strSQL); if(m_

33、daorecordset-GetRecordCount()!=0)AfxMessageBox(_T( 对不起!n+adduser.m_strUser+已经存在,请尝试用其他名字!),MB_ICONEXCLAMATION);elseif(adduser.m_strPswd.Compare(adduser.m_strCompswd)!=0) AfxMessageBox(_T(两遍新密码输入不一致!n请重输!),MB_ICONEXCLAMATION); else 5.2.2更改密码对话框的创建更改密码对话框的创建与添加用户对话框的创建基本相同,完成后的对话框如图11所示。对话框中各种非静态文本控件的

34、属性见表6。表6 修改密码对话框中各控件的属性设置控件ID用户名Edit BoxIDC_USER原密码Edit BoxIDC_FORMERPS新密码Edit BoxIDC_NEWPS确认Edit BoxIDC_CONFIRPS同样方法,取此密码对话框的类名为CModPswd。执行此对话框的函数为CXiahuaView:OnPasswardEdit(),实现密码修改功能的程序代码如下:void CXiahuaView:OnPasswardEdit() / TODO: Add your command handler code hereUpdateData(TRUE);COleVariant va

35、r;CModPswd modpswd;if(modpswd.DoModal()=IDCANCEL)return;else CLoginSet *m_daorecordset=new CLoginSet(&pDatabase);CString strSQL;CString str1;strSQL.Format(select * from login where user=%s,modpswd.m_strUser);m_daorecordset-Open(AFX_DAO_USE_DEFAULT_TYPE,strSQL);if(m_daorecordset-GetRecordCount()=0) A

36、fxMessageBox(_T(无此用户!n请向管理员咨询),MB_ICONEXCLAMATION);m_daorecordset-Close();OnPasswardEdit(); else m_daorecordset-Close();/先关闭,以便以后再次打开记录集体对象 strSQL.Format(select * from login where user=%s and passward=%s, modpswd. m_strUser,modpswd.m_strFormerps); m_daorecordset-Open(AFX_DAO_USE_DEFAULT_TYPE,strSQL)

37、; if(m_daorecordset-GetRecordCount()=0) AfxMessageBox(_T(密码错误!n请注意大小写),MB_ICONEXCLAMATION); else if(modpswd.m_strNewps.Compare(modpswd.m_strConfirps)!=0) AfxMessageBox(_T(两遍新密码输入不一致!n 请重输!), MB_ICONEX CLAMATION); modpswd.m_strNewps.Empty(); modpswd.m_strConfirps.Empty(); UpdateData(FALSE); else m_da

38、orecordset-Edit();/使记录集可编辑 m_daorecordset-m_passward=modpswd.m_strNewps; m_daorecordset-Update();/修改后刷新 AfxMessageBox(_T(密码修改成功!n请记住新密码!),MB_ICONEXCLAMATION); 5.2.3删除用户对话框的创建创建方法同上,完成后的对话框如图12所示。对话框中各种非静态文本控件的属性见表7。取此删除用户对话框的类名为CDelUser。执行此对话框功能的函数为CXiahuaView:OnUserDel(),代码如下:表7 删除用户对话框中各控件的属性设置控件I

39、DEdit BoxIDC_USER 图12删除用户对话框 图13用户登录对话框void CXiahuaView:OnUserDel() / TODO: Add your command handler code hereCLoginSet *m_daorecordset=new CLoginSet(&pDatabase); CString strSQL;CString user;user.Format(administrator);if(adiministrator()=0)/管理员权限验证,失败返回return;elseCDelUser deluser;/成功。调入删除用户窗口if(delu

40、ser.DoModal()=IDCANCEL) return; else if(deluser.m_strUser.Compare(user)=0) AfxMessageBox(_T( 对不起!n不允许删除管理员),MB_ICONEXCLAMATION);else CString str1;str1.Format(%s,deluser.m_strUser); if(AfxMessageBox(确定要删除+str1+吗?,MB_YESNO|MB_ICONEXCLAMATION)=IDYES) strSQL.Format(delete from login where user=%s,deluse

41、r.m_strUser); pDatabase.Execute(strSQL);5.2.4用户登录对话框的创建创建方法同上,完成后的对话框如图13所示。对话框中各种非静态文本控件的属性见表8。取此删除用户对话框的类名为CloginDlg。表8 修改密码对话框中各控件的属性设置控件ID用户名Edit BoxIDC_USER密码Edit BoxIDC_PASS5.3信息管理模块的创建故障信息在管理中需要进行各种不同的操作,信息管理模块主要实现如下功能:l 查看记录l 查询记录l 添加记录l 删除记录l 修改记录5.3.1添加记录对话框的创建 在ResourseView中,右击Dialog,选择Insert Dialog,便可在右边窗口中编辑对话框。完成的对话框如图14所示。对话框中各种非静态文本控件的属性见表9。表9信息登记对话框中各控件的属性设置控件ID显象管Edit BoxIDC_CRT机芯Edit BoxIDC_CLIPS机壳Edit BoxIDC_CASE器件Edit BoxIDC_DEVICE技术员Edit BoxIDC_WORKOR时间Date Time PickerIDC_DATE其他Edit

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号