收藏 分销(赏)

改叶伦灼软件工程课程设计报告完成.doc

上传人:天**** 文档编号:3326869 上传时间:2024-07-02 格式:DOC 页数:41 大小:157.04KB 下载积分:12 金币
下载 相关 举报
改叶伦灼软件工程课程设计报告完成.doc_第1页
第1页 / 共41页
改叶伦灼软件工程课程设计报告完成.doc_第2页
第2页 / 共41页


点击查看更多>>
资源描述
沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:软件综合课程设计 课程设计题目:车辆调度管理软件设计 院(系):计算机学院 专 业:计算机科学与技术 班 级:84010101 学 号:5 姓 名:叶伦灼 指导教师:丛丽晖 完毕日期:2023年9月9日 目 录 第1章 需求分析 1 1.1 问题内容与规定 1 1.2 问题分析与假设 1 第2章 概要设计 2 2.1 数据库逻辑模型设计 2 2.1.1 数据库E—R图 2 2.1.2 数据库表格设计 3 2.2 系统功能模块 4 第3章 具体设计 5 3.1 客户功能模块 5 3.2 管理人员功能模块 6 3.2.1车辆信息更新 6 3.2.2车辆信息的添加与删除 7 3.2.3司机信息的添加与删除 8 第4章 调试使用 10 4.1 客户功能 10 4.2 管理员功能 11 4.2.1 车辆及司机信息的增删 11 4.2.2 车辆信息的修改 12 参考文献 14 附 录(程序清单) 15 第1章 需求分析 1.1 问题内容与规定 设计一个简朴的车辆调度管理程序,可实现对不同的车辆、不同规定、不同时间的调度算法。 1) 建立车辆信息表; 2) 实现对车辆信息的插入、修改、查询、删除功能; 3) 界面要优化,直观、大方、美观; 4) 实现针对不同任务、不同时间的调度分派算法; 5) 独立完毕系统的设计、编码和调试; 6) 按照课程设计规范书写课程设计报告。 1.2 问题分析与假设 车辆调度就是根据客户的需求,合理地派遣出相应的车辆。假设每派遣出一辆车,需要记录下该车的特有信息以及使用该车的客户信息。一辆车在被使用后,不能在重叠的时间段被其他客户使用。而客户在选择车辆时,除了可以了解车辆自身的属性外,也有权了解驾驶该车辆驾驶员的信息,比如驾驶员的性别、驾龄、年龄。而作为车辆调度员,应当做到对车辆信息的查看、增删、及时更新等操作。由于每一辆车都有一个专属司机,所以每新增一辆,都必须提供一个已存在的司机信息,假如添加了一个错误的司机,系统应当可以提供提醒现提供一个对的的司机信息。同理,假如想要注销掉某个司机的信息,一方面要取消掉他与配对车辆的关系,然后才干进行注销。 分析了客户与车辆、司机与车辆的关系,有助于我们建立合理的表格,并且在设计程序时考虑到更多切合实际的应用。 本次课设所需要的表格将在SQL 2023中建立。使用Microsoft Visual C++编写代码、进行对数据库的读写等操作。ODBC将作为搭载数据库与VC++的平台。 第2章 概要设计 2.1 数据库逻辑模型设计 2.1.1 数据库E—R图 汽车调度管理系统的E—R图如图2.1所示。 车辆 车牌号 车型 豪华限度 车辆载重 状态 最早可用时间 驾驶 司机 司机编号 司机姓名 性别 驾龄 年龄 租用 客户 客户电话 客户姓名 需求车型 需求限度 需求载重 租用车辆 租用时间 归还时间 m 1 n 1 图2.1 车辆调度管理数据库E—R图 车辆实体与司机、客户这两个实体之间,分别通过驾驶关系和租用关系联系在一起。为便于管理,一辆汽车只配备一名司机,一名司机也只能驾驶一辆汽车。所以这两个实体之间是1:n的关系。而一辆汽车可以出租给不同的客户,而一个顾客又可以租用多辆汽车,所以两个实体之间的关系是m:n的关系。 E-R图表达的关系模式为: 车辆(车牌号,车型,司机编号,载重,豪华限度,状态,最早可用时间); 司机(司机编号,司机姓名,性别,驾龄,年龄); 客户(客户电话,客户姓名,需求车型,需求限度,需求载重,租用时间,归还时间,租用车辆)。 “车辆”实体的主码是“车牌号”。属性“司机编号”是来自于实体“司机”,的外码,参照其属性“司机编号”。 “司机”实体的主码是“司机编号”。 “客户”实体的主码是“客户电话”。属性“租用车辆”是来自于实体“车辆”外码,参照其属性“车牌号”。 2.1.2 数据库表格设计 1. 车辆(Vehicles) 表2.1 车辆信息表 列名 数据类型 长度 是否可认为空 说明 Vno char 20 否 车牌号 Vtype char 10 是 车型 Vdno char 20 否 司机编号 Vload int 不定 是 车辆载重 Vgrand char 10 是 豪华限度 Vstatus char 10 是 状态 Vbacktime int 不定 是 最早可用时间 2. 司机(Drivers) 表2.2 司机信息表 列名 数据类型 长度 是否可认为空 说明 Dno char 20 否 司机编号 Dname char 10 是 司机姓名 Dsex char 10 是 性别 Ddegree int 不定 是 驾龄 Dage int 不定 是 年龄 3. 客户(Orders) 表2.3 客户信息表 列名 数据类型 长度 是否可认为空 说明 Otel char 20 否 客户电话 Oname char 10 是 客户姓名 Otype char 10 是 需求车型 Ogrand char 10 是 需求限度 Oload int 不定 是 需求载重 Ohiertime int 不定 是 租用时间 Obacktime int 不定 是 归还时间 Ovno char 20 否 租用车辆 2.2 系统功能模块 本系统重要功能和层次结构如图2.2所示。 本系统有七个重要功能。其中客户的使用到的功能更有用户下单、车辆信息查询两个功能,而管理人员使用到的功能有车辆信息更改、新增车辆、新增司机、车辆删除、司机删除五个功能。 车辆调度管理系统功能模块 客户下单 车辆信息查询 车辆信息更改 新增车辆 新增司机 删除车辆 删除司机 图2.2 系统重要功能和层次结构 第3章 具体设计 3.1 客户功能模块 顾客类模块是为了实现顾客下订单和查询车辆信息的需求。客户可以通过它,查看所有车辆或指定车辆的信息,或是根据自己的需求筛选车辆。并且,客户还可以根据指定车辆的车牌号,查看该辆车的司机信息。 客户在输入了客户电话、姓名、对车辆的需求,以及时间等相关信息后,可以先使用查询功能查看满足条件的车辆,然后选定某辆车查看其司机信息,所有信息都满意后,再通过了系统对客户的租用时间与该车最早可用时间的核对,就可以下单,已取得该车的使用权。 客户功能模块流程图如图3.1所示。 开始 输入客户数据 显示满足客户需求的车辆 输入指定车辆的车牌 查看司机信息 最早可用时间大于租用时间 成功下单 结束 N Y 图3.1 客户功能模块流程图 3.2 管理人员功能模块 该模块重要实现对车辆与司机信息的增删查改。 3.2.1车辆信息更新 通过该功能,管理人员可以改变指定车辆的配置司机,或是将已归还的汽车的订单取消,使该汽车可以投入下一轮使用。 在改变车辆的配置司机时,输入车牌号和新的司机编号,就可以将指定的车辆的司机改变。注意,输入的新司机编号只能是已存在的,并且是没有被配置到其他车辆的司机的编号,否则系统会提醒犯错。 改变车辆配置司机的流程图如图3.2所示。 开始 输入需要更改的信息 该司机编号是否合法 Y 更改信息 结束 N 图3.2 改变车辆配置司机的流程图 在取消已归还汽车的的订单时,输入车票号和归还时间,就可以将相应的订单取消,若该车辆已其他没有订单,将车辆状态由“Busy”变为“Free”,表达目前空闲,否则车辆状态保持“Busy”,直至该车辆无任何订单。 取消已归还汽车订单的流程图如图3.3所示。 开始 输入订单信息 换车时间小于该车最早可用时间 取消相应订单 车辆状态不改变 结束 取消相应订单 车辆状态变为“Free” N Y 图3.3 取消已归还汽车订单的流程图 3.2.2车辆信息的添加与删除 该功能显而易见,重要是完毕对车辆的新增或删除。 输入车牌号、车型、司机编号、车辆载重、豪华限度、初始车辆状态,而初始最早可用时间默认为0。就可以添加一辆新车。需要注意的是,输入的司机编号只能是已存在的,并且是没有被配置到其他车辆的司机的编号,否则系统会提醒犯错。 若只输入车牌号,则表达需要删除某一个已经存在的车辆信息。需要注意的是,输入的车牌号必须是存在的已有的车辆的车牌号,否则系统提醒犯错。 车辆信息的添加与删除功能的流程图如图3.4所示。 开始 输入车辆信息 是否只有车牌号信息 司机编号是否合法 初始化最早可用时间 写入新车辆信息 结束 车牌号存在 删除车辆信息 输入司机编号 Y N N N Y Y 图3.4 车辆信息的添加与删除功能的流程图 3.2.3司机信息的添加与删除 归还功能与车辆信息的添加与删除类似。 输入司机编号、司机姓名、性别、驾龄、年龄等信息,就可以添加一名新司机。需要注意的是,输入的新司机编号不能与已有的司机编号反复,否则系统提醒犯错。 若只输入司机编号,则表白需要删除某一个司机。需要注意的是,删除的这一个司机不能是配置到车辆上的,否则系统提醒犯错。 司机信息的添加与删除功能流程图如图3.5所示。 N N 开始 输入司机信息 是否只有司机信号 添加司机信息者 司机已配置 删除司机 严禁删除 结束 Y Y 图3.5 司机信息的添加与删除功能流程图 第4章 调试使用 4.1 客户功能 客户下单和查询车辆信息界面如图4.1所示。 图4.1 客户下单和查询车辆信息界面 输入合理信息后,通过鼠标点击按钮,就可以实现不同的功能。比如依次输入:“”、“Vanpersy”、“Audi”、“A+”、“3”、“1530”、“2311”后,点击“根据客户需要显示车辆”出现匹配车辆如图4.2所示。 然后选中其中的车牌为“A1256”的车型,点击“查看司机信息”,出现“0706”、“Ronaldo”、“male”、“6”、“30”字样。分别代表司机编号、司机姓名、性别、驾龄、年龄。信息如图4.3所示。 客户假如满意,点击“下单”即可成功下单。 图4.2 匹配客户Vanpersy需求的车辆 图4.3 车辆A1256的司机信息 4.2 管理员功能 4.2.1 车辆及司机信息的增删 若需要在车辆信息表Vehicles中加入一辆车型为“Lambor”、车牌号为“A1122”、驾驶司机为“0755”豪华限度为“AA+”、载重为2人的新车,需要在车辆信息更新界面输入信息。如图4.4所示。 图 4.4 新增车辆信息 但是点击添加后,会提醒“没有该司机!请先输入司机信息”。因素是编号为0755的司机信息还没有存入数据库。解决办法就是在司机信息更新界面输入编号为0755的司机的相关信息。如图4.5所示。 图4.5 新增司机信息 点击“添加”。添加了司机信息后,重新在车辆信息更新界面输入司机编号,就可以添加所需要的新车辆了。 删除车辆信息与司机信息时,只需要输入相应的车牌号或是司机编号,点击删除即可。 4.2.2 车辆信息的修改 若有车辆归还,输入归还车辆的车牌号,以及该车辆的返回时间,就可以取消相应的订单。如上面被租用的车辆A1256,车辆返回后,在车辆信息更新界面输入信息“A1256”、“2311”,点击“修改”,就完毕了订单的取消。如图4.6所示。 图4.6 取消车辆A1256的订单 若是修改车辆的的配置司机,在司机编号处输入合法的司机编号即可。 参考文献 [1] 高富平,张楚 . 电子商务法[M]. 北京:北京大学出版社,2023 [2] 沈炜,徐慧 . VC++数据库编程技术与实例 [M] . 北京:人民邮电出版社,2023 [3] 杨章伟等 . 21天学通Visual C++ [M]. . 北京:电子工业出版社,2023 [4] 王珊,萨师煊 . 数据库系统概论[M]. 北京:高等教育出版社,2023 [5] 崔莹,王华军 . VC++数据库编程100例[M]. 北京:中国铁道出版社,2023 附 录(程序清单) #include "stdafx.h" #include "ylz.h" #include "ylzSet.h" #include "ylzDoc.h" #include "ylzView.h" #include "Driverset.h" #include "Ve1set.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CYlzView::CYlzView() : CRecordView(CYlzView::IDD) { //{{AFX_DATA_INIT(CYlzView) m_pSet = NULL; m_tel = _T(""); m_name = _T(""); m_type = _T(""); m_grand = _T(""); m_load = 0; m_upvno = _T(""); m_upvdno = _T(""); m_upvgrand = _T(""); m_upvstatus = _T(""); m_upvtype = _T(""); m_upvload = 0; m_dno = _T(""); m_dname = _T(""); m_dsex = _T(""); m_ddegree = 0; m_dage = 0; m_vno = _T(""); m_htime = 0; m_btime = 0; m_upbtime = 0; //}}AFX_DATA_INIT } void CYlzView::DoDataExchange(CDataExchange* pDX) { CRecordView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CYlzView) DDX_Control(pDX, IDC_LIST3, m_listd); DDX_Control(pDX, IDC_LIST1, m_list1); DDX_Text(pDX, IDC_EDIT1, m_tel); DDX_Text(pDX, IDC_EDIT2, m_name); DDX_Text(pDX, IDC_EDIT3, m_type); DDX_Text(pDX, IDC_EDIT4, m_grand); DDX_Text(pDX, IDC_EDIT5, m_load); DDX_Text(pDX, IDC_EDIT9, m_upvno); DDX_Text(pDX, IDC_EDIT11, m_upvdno); DDX_Text(pDX, IDC_EDIT13, m_upvgrand); DDX_Text(pDX, IDC_EDIT14, m_upvstatus); DDX_Text(pDX, IDC_EDIT10, m_upvtype); DDX_Text(pDX, IDC_EDIT12, m_upvload); DDX_Text(pDX, IDC_EDIT6, m_dno); DDX_Text(pDX, IDC_EDIT8, m_dname); DDX_Text(pDX, IDC_EDIT15, m_dsex); DDX_Text(pDX, IDC_EDIT16, m_ddegree); DDX_Text(pDX, IDC_EDIT17, m_dage); DDX_Text(pDX, IDC_EDIT7, m_vno); DDX_Text(pDX, IDC_EDIT18, m_htime); DDX_Text(pDX, IDC_EDIT19, m_btime); DDX_Text(pDX, IDC_EDIT20, m_upbtime); //}}AFX_DATA_MAP } BOOL CYlzView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CRecordView::PreCreateWindow(cs); } void CYlzView::OnInitialUpdate() { m_pSet = &GetDocument()->m_ylzSet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } BOOL CYlzView::OnPreparePrinting(CPrintInfo* pInfo) { return DoPreparePrinting(pInfo); } #ifdef _DEBUG void CYlzView::AssertValid() const { CRecordView::AssertValid(); } void CYlzView::Dump(CDumpContext& dc) const { CRecordView::Dump(dc); } CYlzDoc* CYlzView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CYlzDoc))); return (CYlzDoc*)m_pDocument; } #endif //_DEBUG CRecordset* CYlzView::OnGetRecordset() { return m_pSet; } // CYlzView message handlers void CYlzView::OnButton1() { CVeset cc; CString pp(" "); //int nItem=-1; CString str0; UpdateData(TRUE); for(int j=0;j<10;j++) m_list1.DeleteString(0); if(m_pSet->IsOpen()) m_pSet->Close(); if(cc.IsOpen()) cc.Close(); cc.Open(); m_vno=m_vno+pp; m_pSet->Open(); m_pSet->AddNew(); m_pSet->m_Otel=m_tel; m_pSet->m_Oname=m_name; m_pSet->m_Otype=m_type; m_pSet->m_Ogrand=m_grand; m_pSet->m_Oload=m_load; m_pSet->m_Ovno=m_vno; m_pSet->m_Ohiretime=m_htime; m_pSet->m_Obacktime=m_btime; while(cc.IsEOF()!=1){ if(cc.m_Vno==m_vno){ UpdateData(TRUE); cc.Edit(); cc.m_Vstatus="busy"; cc.m_Vbacktime=m_btime; cc.Update(); cc.MoveNext(); cc.Requery(); UpdateData(FALSE); } else{cc.MoveNext();} } m_pSet->Update(); m_pSet->MoveLast(); m_pSet->Requery(); MessageBox("已下单!"); m_tel=m_name=m_type=m_grand=""; m_load=0; m_htime=m_btime=0; m_pSet->Close(); cc.Close(); m_vno=""; for(int i=0;i<10;i++){ m_list1.DeleteString(0); m_listd.DeleteString(0); } UpdateData(FALSE); } void CYlzView::OnButton2() { CVeset vs; CString str=""; UpdateData(TRUE); for(int i=0;i<10;i++) m_list1.DeleteString(0); if(vs.IsOpen()) vs.Close(); vs.m_strFilter.Format("Vtype='%s' and Vload>='%d' and Vgarnd='%s'",m_type,m_load,m_grand); vs.Open(); while(vs.IsEOF()!=1){ str.Format("%4s %4s %4s %d %18s %5s %7d",vs.m_Vno,vs.m_Vtype,vs.m_Vdno,vs.m_Vload,vs.m_Vgarnd,vs.m_Vstatus,vs.m_Vbacktime); m_list1.AddString(str); vs.MoveNext(); UpdateData(FALSE); } vs.Close(); } void CYlzView::OnButton3() { CVeset s1; CDriverset s2; CString str1=""; UpdateData(TRUE); for(int i=0;i<10;i++) m_listd.DeleteString(0); CString sp(" "); m_vno=m_vno+sp; if(s1.IsOpen()) s1.Close(); s1.Open(); s1.MoveFirst(); while(s1.IsEOF()!=1) { if(s1.m_Vno==m_vno) { UpdateData(TRUE); if(s2.IsOpen()) s2.Close(); s2.Open(); s2.MoveFirst(); while(s2.IsEOF()!=1){ if(s1.m_Vdno==s2.m_Dno) {str1.Format("%4s %4s %4s %4d %4d",s2.m_Dno,s2.m_Dname,s2.m_Dsex,s2.m_Ddegree,s2.m_Dage); m_listd.AddString(str1); s2.MoveNext(); UpdateData(FALSE);} else {s2.MoveNext();} } s1.MoveNext(); UpdateData(FALSE); } else {s1.MoveNext();} } m_vno=""; } void CYlzView::OnButton4() { CVeset upv; CDriverset ckd; CString sp1(" "); int a=0; UpdateData(TRUE); m_upvdno=m_upvdno+sp1; if(upv.IsOpen()) upv.Close(); if(ckd.IsOpen()) ckd.Close(); ckd.Open(); ckd.MoveFirst(); while(ckd.IsEOF()!=1){ if(ckd.m_Dno==m_upvdno) { a++; upv.Open(); upv.AddNew(); upv.m_Vno=m_upvno; upv.m_Vtype=m_upvtype; upv.m_Vdno=m_upvdno; upv.m_Vload=m_upvload; upv.m_Vgarnd=m_upvgrand; upv.m_Vstatus=m_upvstatus; upv.Update(); upv.MoveLast(); upv.Requery(); MessageBox("添加成功!"); m_upvno=m_upvtype=m_upvdno=m_upvgrand=m_upvstatus=""; m_upvload=0; ckd.MoveNext(); upv.Close(); UpdateData(FALSE);} else {ckd.MoveNext();} } if(a==0) {MessageBox("无此司机!请先输入司机信息!"); m_upvdno=""; UpdateData(FALSE);} ckd.Close(); } void CYlzView::OnButton5() { CVeset dev; UpdateData(TRUE); if(dev.IsOpen()) dev.Close(); dev.m_strFilter.Format("Vno='%s'",m_upvno); dev.Open(); if(dev.m_Vstatus=="busy"){ MessageBox("该车正在使用,无法删除信息!"); m_upvno="";} else{ CRecordsetStatus status; dev.GetStatus(status); dev.Delete(); if(status.m_lCurrentRecord==0) dev.MoveNext(); else dev.MoveFirst(); MessageBox("删除成功!"); m_upvno="";} dev.Close(); UpdateData(FALSE); } void CYlzView::OnButton6() { CDriverset upd; UpdateData(TRUE); if(upd.IsOpen()) upd.Close(); upd.Open(); upd.AddNew(); upd.m_Dno=m_dno; upd.m_Dname=m_dname; upd.m_Dsex=m_dsex; upd.m_Ddegree=m_ddegree; upd.m_Dage=m_dage; upd.Update(); upd.MoveLast(); upd.Requery(); MessageBox("添加成功!"); m_dno=m_dname=m_dsex=""; m_ddegree=m_dage=0; upd.Close(); UpdateData(FALSE); } void CYlzView::OnButton7() { CDriverset ded; UpdateData(TRUE); if(ded.IsOpen()) ded.Close(); ded.m_strFilter.Format("Dno='%s'",m_dno); ded.Open(); CRecordsetStatus status; ded.GetStatus(status); ded.Delete(); if(status.m_lCurrentRecord==0) ded.MoveNext(); else ded.MoveFirst(); MessageBox("删除成功!"); m_dno=""; ded.Close(); UpdateData(FALSE); } void CYlzView::OnButton8() { CVeset alv; CDriverset ckd1; int b=0; CString sp2(" "); UpdateData(TRUE); if(alv.IsOpen()) alv.Close(); if(ckd1.IsOpen()) ckd1.Close(); if(m_pSet->IsOpen()) m_pSet->Close(); if(m_upbtime!=0) { alv.m_strFilter.Format("Vno='%s'",m_upvno); alv.Open(); if(m_upbtime==alv.m_Vbacktime){ alv.Edit(); alv.m_Vstatus="free"; alv.m_Vbacktime=0; alv.Update(); alv.MoveNext(); alv.Requery();} m_pSet->m_strFilter.Format("Ovno='%s' and Obacktime='%d'",m_upvno,m_upbtime); m_pSet->Open(); CRecordsetStatus status; m_pSet->GetStatus(status); m_pSet->Delete(); if(status.m_lCurrentRecord==0) m_pSet->MoveNext(); else m_pSet->MoveFirst(); MessageBox("订单已删除,该车辆已返回,可以使用!"); m_upvstatus=""; m_upvno=""; m_upbtime=0; UpdateData(FALSE); } if(m_upvdno!=""){ ckd1.Open(); ckd1.MoveFirst(); UpdateData(TRUE); m_upvdno=m_upvdno+sp2; while(ckd1.IsEOF()!=1){ if(ckd1.m_Dno==m_upvdno){ b++; alv.m_strFilter.Format("Vno='%s'",m_upvno); alv.Open(); alv.Edit(); alv.m_Vdno=m_upvdno; alv.Update(); alv.MoveLast(); alv.Requery(); MessageBox("修改成功!"); m_upvdno=m_upvno=""; UpdateData(FALSE); ckd1.MoveNext();} else {ckd1.MoveNext();} } if(b==0){ alv.Open(); MessageBox("无此司机!请先输入司机信息!"); m_upvdno=""; UpdateData(FALSE);} } alv.Close(); m_pSet->Close(); } void CYlzView::OnButton9() { CVeset vs1; CString strc=""; for(int i=0;i<10;i++) m_list1.DeleteString(0); UpdateData(1); if(vs1.IsOpen()) vs1.Close(); vs1.m_strFilter.Format("Vno='%s'",m_vno); vs1.Open(); strc.Format("%4s %4s %4s %d %18s %5s %7d",vs1.m_Vno,vs1.m_Vtype,vs1.m_Vdno,vs1.m_Vload,vs1.m_Vgarnd,vs1.m_Vstatus,vs1.m_Vbacktime); m_list1.AddString(strc); vs1.MoveNext(); UpdateData(FALSE); vs1.Close(); } void CYlzView::OnShowall() { CVeset sowv; CString show; UpdateData(TRUE); for(int i=0;
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服