版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
酒店管理系统口勺设计与实现
1引言
酒店管理系统是我们常说日勺MIS(Managem2ntInformation
System,管理信息系统)的一种,在强调管理,强调信息日勺现代社会
中它越来越得到普及。酒店管理系统日勺重要目的是实现对酒店内
部多种管理W、J电子化和自动化,提高酒店日勺办公效率,为高质量
W、J酒店服务提供保证。
在酒店'也竞争越来越剧烈日勺今天,努力在市场竞争中脱颖而
出,已经成为每位酒店经营者所追求的目口勺。酒店怎样才能提高
服务质量,其管理能力显得越来越重要。由于使用了先进的数据
库管理技术,酒店管理系统对提高酒店口勺管理能力将会起到比较
重大日勺作用,整个系统的基本设计目日勺是实现系统界面友好美
观、简朴易用、功能全面并有较高日勺安全性。本系统需要实现中小
型酒店常用的点菜、订菜、结算等功能,并协助酒店建立菜谱数据
库和销售存根数据库,可以以便地进行查询,并在系统日勺易用性
和安全性两方面进行对应KJ完善。
2系统重要模块
⑴登录管理模块;(2)菜谱管理模块;(3)点菜订菜模块;(4)结算
模块;(5)协助模块;(6)数据库设计;(7)系统界面设计。
软件系统由各个详细的功能模块构成,若值班员未登录或登
录失败,则只能使用登录,协助,有关,退出这四个功能模块。登录
成功后才可以使用所有的功能模块。各个功能模块都是分别进行
开发日勺,这样就便于后来拓展功能,也易于检查和修改错误。软件
的系统构造如图1所示。
3系统设计方案
根据系统功能H勺规定,考虑到VisualC++H勺编程特点,将酒店
管理系统分解成前台和后台两部分,并将系统分解为几种比较小
的功能模块分别进行开发。使得开发过程更具条理性,并且以便
对模块功能进行修改或添加新口勺功能模块,从而使整个系统可以
伴随酒店业务的扩展进行功能的升级。为了增强系统的安全性,
需要设计登录模块,登录成功后才可以使用所有功能.整个酒店管
理系统日勺设计方案如图2所示。
图1软件系统构造
图2系统设计方案
摘要:本文重要简介了运用VisualC++开发的酒店管理系统。伴随软件开
发技术和数据库技术W、J完善与发展,国内外的企业已经开
始充足运用多种各样W、J系统管理软件来管理诸如销售信息、产品信息、员
工信息等大量日趋繁杂的资料,计算机辅助管理的高效性和高
安全性等长处使得老式的管理方式黯然失色,也为系统管理软件口勺发展提
供了更广阔的前景和发展空间。本系统设计的重要目的是设计
一种面向中小型酒店的简朴易用的酒店管理系统。前台以VisualC++为开
发工具,设计软件的界面和各个功能模块;后台使用SQL
Server2023进行系统数据库的连接和管理。本系统已基本实现了中小型
酒店常用的点菜、订菜、结算等功能,协助酒店建立了菜谱数据库
和销售存根数据库,可以以便地进行查询,并在系统日勺易用性和安全性两
方面进行了对应的完善。
关键词:VisualC++;安全性;数据库
中图分类号:TP315文献标识码:A文章编号:1009-3044(2023)19-
40023-03
TheDesignmentandImplementationofRestaurantManagementSystem
GANChao-Songl,XIARong2
(1.SchoolofComputing,JiangxiCityVocationalInstitute,Nanchang
330004,China;2.ScienceandTechnologyCollegeofNCHU,Nanchang
330034,China)
Ab.tract:Thi.pape.mainl.introduce,th.managemen.syste.o.restauran
.develope.wit.Microsof.Visua.C++.Wit.th.development
ofsoftwareanddatabasetechnology,thedomesticcorporationsand
theoverseacorporationsalreadybegintomakefulluseofallkinds
ofsystem
managementsoftwaretomanagelotsofinteriorthings,suchas
充足考虑到系统的安全性;
通过使用map类迅速保留和检索数据集成果;
通过使用数据绑定技术优化代码。
4.2注意事项
系统运行前数据库要遂行对日勺配置;
算法应简朴明了,有较高H勺时空效率;
注意学习使用数据绑定等新技术;
设计登录模块时注意增强安全性。
5关键技术
5.1数据库的连接
将SQLServer默认的数据库设置为酒店管理系统所在的
RMS后,就可以在程序中使用DSN来访问SQLServer数据库了。
CRMSDlg::OnInitDialog()中连接数据库部分日勺代码如下:
try{mDBCnt.Createlnstance(uuidof(Connection));
m_DBCnt->ConnectionString=〃DSN=RMS;UID=fdd;PWD=
121";
m_DBCnt->0pen(〃〃,"〃,〃〃,-1);
}catch(_com_error&e)
{AfxMessageBox(e.ErrorMessageO);
this->EndDialog(0);}
returnTRUE;
其中DSN二背面即为酒店管理系统所用的数据医的名称,可
根据实际状况进行更改。
5.2菜谱管理模块
菜谱对话框的设计采用一种列表框控件显示读取的数据记
录,并在CDlgViewCP::OnInitDialog()中对这个控件(m」ist)进行初
始化(分割列,设置列宽,设置风格等),其中m」ist.SetExtendedStyle
(LVS_EX_FULLROWSELECT);这一行代码使单击列表框时选中其
中的一整行,而不是其中的某一格。在单击并选中某一行的时候,
程序处理这个单击事件,并将这一行的数据在下面H勺列表框中显
示出来,运用函数CDlgViewCP::OnClickListCp来实现这一点:
inti二mlist.GetSelectionMark();
m_no=mlist.GetltemText(i,0);
mname=mlist.GetltemText(i,1);
mkind=mlist.GetltemText(i,2);
mprice=(float)atof(mlist.GetltemText(i,3));
m_detail=m_list.GetltemText(i,4);
UpdateData(FALSE);
*pResult=0;
此外在菜谱管理模块中还要同步实现菜谱查询功能,即由用
户选择查询目的(编号,菜名,种类),再填入所要查询口勺内容就可在
菜谱中查询到符合条件的菜。假如没有输入任何查询条件,那么
就列出菜谱中所有日勺菜。
voidCDlgViewCP::RefreshData(LPCTSTRqry)
{m_list.DeleteAllItems();
mlist.SetRedraw(FALSE);
RccordsetPtrpRst=NULL;
lADORecordBinding*picRs=NULL;//InterfacePointerdeclared.(
VC++Extensions)
CCPRsrs;
try{_bstr_tstrSQL=qry;
TESTHR(pRst.Createlnstance(uuidof(Recordset)));
pRst=mDBCnt->Execute(strSQL,NULL,adCmdText);
〃数据绑定(DataBinding)
TESTHR(pRst->QueryInterface(uuidof(lADORecordBinding),
(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
inti=0;
charbuf[128];
while(!pRst->adoE0F)
{m_list.InsertItem(O,rs.m_sz_no);
mlist.SetltemText(i,1,rs.m_sz^name);
mlist.SetltemText(i,2,rs.mszkind);
sprintf(buf,〃%f〃,rs.mfprice);SetltemText(i,3,buf);
mlist.SetltemText(i,4,rs.m_sz_detail);
〃移到下一条记录
pRst->MoveNext();}
picRs->Release();
pRst->Close();}
catch(_com_error&e)
{AfxMessageBox(e.ErrorMessage());
mlist.SetRedraw(TRUE);
return;}
mlist.SetRedraw(TRUE);}
在上面日勺这段RefreshData函数的I代码中,由于使用了ADO
2.0forVisualC++Extensions所提供的I新特性DataBinding(数据
绑定)技术,因此代码显得比较简洁。
5.3登录管理模块
在未登录的时候,主对话框中的按钮,除了登录,退出,协助,
有关等项,全是不可用的。为了到达这一效果,在CRMSDlg::
OnlnitDialogO中加入如下代码:
GetDlgltemdDCBTN_UPDPWD)->EnableWindow(FALSE);
GetDlgltem(IDC_BTN_DC)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_JS)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_CP)->EnableWindow(FALSE);
GetDlgltem(IDC_BTN_VIEWDC)->EnableWindow(FALSE);
若登录成功后,只需将FALSE换成TRUE,则所有按钮都变
为可用。将进行登录验证日勺SQL代码加入到主对话框日勺事件处理
函数CRMSDlg::OnBtnLogin()中,用来处理登录事务:
sql_.Format("SELECT值班员FROMZBYWHERE值班员二
'%s'AND密码='%s'〃,dig.m_name,dig.m_pswd);
这里并没有取出值班员表中日勺所有字段(值班员和密码),然
后把密码字段和顾客的输入作比较来决定登录成功与否;而是只
取出了值班员名字(值班员),密码的校验放在数据库服务器端进
行,这重要是基于安全的考虑。假如没有确实的需要,就尽量不从
数据库里取顾客密码这种敏感数据,以免产生安全漏洞,减弱系
统KJ安全性。
修改密码部分区I处理代码和登录部分类似,只是不仅要进行
旧密码口勺验证,还要确认两次输入的新密码一致,如旧密码错误
或两次输入的新密码不一致则需要给出对应的提醒。此外还要利
用SQL语句向数据库中写入新密码:sql_.Format("UpdateZBY
SET密码=s'WHERE值班员二'%\dig.mnewpswd,dig.
m_ncime);密码修改成功后则给出密码已修改成功的J提醒。
5.4点菜模块
在这个模块里可以根据顾客日勺需要逐项输入菜谱中H勺菜肴,
并可对已经做出H勺选择进行删除和修改。待最终决定之后单击提
交按钮就会将成果保留到数据库中。点菜订菜操作首先要在桌号
编辑框中输入桌号,然后在编号选择框中通过选择菜谱中的编号
来选择菜肴。这样顾客只需说出所需菜肴在菜谱上口勺编号,值班
员就可以很快地找到顾客所需要的菜,而不必让顾客报出菜名,
提高服务效率,减少出错率。为了使编号选择框中包括所有的菜
谱号,在CDlgDC::OnInitDialog()中应包括妇下代码:
try
{_bstr_tstrSQL("SELECT*FR0MCP〃);
pRst=mDBCnt->Execute(strSQL,NULL,adCmdText);
TESTER(pRst->QueryInterface(uuidof(TADORecordBinding),
(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
inti=0;
cpmap.clear();//清空cpmap
while(!pRst->adoEOF)
{mnos.AddString(rs.m_sz_no);
〃向cpmap中添加一种[菜谱号-菜名]映射
cpmap.insert(CPMap::value_type(string(rs.mszno),string(rs.
24
m_sz_name)));
pRst->MoveNext();}
picRs->Release();
pRst->Close();}
catch(_com_error&e)
{AfxMessageBox(e.ErrorMessage());
returnTRUE;}
上面代码中的cpmap变量用于保留一组[菜谱号-菜名师勺映
射,这样在顾客选中某一种菜谱编号是能迅速的由编号找到对应
的菜,而不用去读取数据库.值班员在编号选择框中选中一种编号
出J事件为CBN/LOSEUP,这个事件出J处理函数为
CDlgDC::OnCloseupComboDcnos():
voidCDlgDC::OnCloseupComboDcnos()
{charbuf[128];
m_nos.GetWindowText(buf,128);
CPMap::const_iteratorit=cpmap.find(string(buf));
if(it!=cpmap.end0)
{stringname=second;
GetDlgltem(IDCED1TDCNAME)->SetWindowText(name.data());
})
cpmap日勺定义在DlgDC.cppKj开头:
#pragmawarn!ng(disable:4786)
Spragmawarning(disable:4503)
Sinclude<map>
#include<string>
usingnamespacestd;
typedefmap<string,string>CPMap;
CPMapcpmap;
这里定义的CPMap类建立了一种从字符串到字符串日勺映
射,就是从map和string模板类来日勺,CPMap是一种STL(Standard
TemplateLibrary)类,而cpmap则是CPMap型H勺全局变量。此外由
于使用了模板,会在类的内部产生相称长H勺类型名,从而在编译
时出现C4787警告,提醒指示类型名长度超过255个字符,因此
用用pragmawarning(disable:4786)”来关掉这个警告。
值班员在订餐模块中修改、删除和增长菜肴都不会对数据库
作修改,而是先在列表框控件m」ist中进行这些操作。只有在单
击提交按钮之后,才会向数据库中提交数据。每向数据库中加入
一条,就会自动清除列表框中对应日勺输入。所有添加成功后,列表
框才会被所有清空。假如中途出现错误,则停止添加。列表框中剩
下日勺项就是没有成功添加日勺项,值班员可对其进行修改后再进行
添加。这部分H勺重要代码如下:
try
{TESTHR(pRst.Createlnstance(_uuidof(Recordset)));
pRst->0pen(''DC'7,_variant_t((IDispatch*)m_DBCnt,true),
adOpenKeyset,adLockOptimistic,adCmdTable);
〃逐项读取,逐项提交
while(mlist.GetltemCount()>0)
(
mlist.GetltemText(0,0,rs.mszdesk,sizeof(rs.mszdesk));
mlist.GetltemText(0,1,rs.mszno,sizeof(rs.m_sz_no));
mlist.GetltemText(0,2,rs.mszname,sizeof(rs.m_sz_name));
rs.m_f_number=(floar)atof(mlist.GetltemText(0,3));
GetltemText(0,4,rs.m_sz_date,sizeof(rs.m_sz_date));
COleSafeArrayvaFieldlist,vaValuelist;
rs.FillFieldsArray(vaFieldlist,vaValuelist);
〃提交一条菜谱记录
TESTER(pRst->AddNew(vaFieldlist,vaValuelist));
〃从列表控件中删除已成功添加的菜
mlist.Deleteltem(O);}
pRst->Close();}
catch(_com_error&e)
{AfxMessageBox(e.ErrorMessage());
return;}
在将数据添加到数据库后将显示操作完毕日勺提醒。
5.5结算模块
开始结算时,将先出现规定输入桌号和折扣率的对话框,为
符合实际状况,需要在ClassWizard里限制折扣率一项时输入在
0.1-1.0之间。如未输入桌号就点击确定,则会给出规定输入桌号
的提醒。下面是处理单击结算按钮事件日勺函数:
voidCRMSDlg::OnBtnJs()
{CDlgBeginJSdlgl;
ShowWindow(SW_HIDE);
dlgl.DoModalO;
if(dlgl.m_desk.GetLength()>0)
(CDlgJSdlg2;
dlg2.Setup(m_DBCnt,dlgl.m_desk,dlgl.m_dz);
dlg2.DoModal();
}else
{MessageBox("请输入桌号!〃);}
ShowWindow(SW_SH0W):}
在上面H勺代码中,读取了桌号和折扣率H勺信息之后,程序把
这两个信息传给一种CDlgJS对话框对象,然后显示这个对话框。
程序读出指定桌号日勺订餐信息,计算出总金额,并根据打折状况
计算出结算金额,这部分工作在OnlnitDialog中完毕:
floatCDlgJS::GetPrice(LPCTSTRno)
{_RecordsetPtrpRst=NULL;
lADORecordBinding*picRs=NULL;//InterfacePointerdeclared.(
VC++Extensions)
CCPRsrs;
rs.m_fprice=0.0;
CStringsql_;
sql_.Format("SELECT*FROMCPWHERE编号no);
_bstr_tstrSQL=sql_;
pRst=m_DBCnt->Execute(strSQL,NULL,adCmdText);
if(pRst->adoE0F)_com_issue_error(0x80000000);
TESTHR(pRst->QueryInterface(_uuidof(lADORecordBinding),
(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
picRs->Release();
pRst->Close();
returnrs.m_f_price;)
结算完毕后单击保留帐单按钮,程序将在结算表中添加一条
记录,并删除已经结算过日勺订菜信息。由于波及到两个互相关联
的操作,因此必须使用ADO口勺事务功能。在添加操作之前调用
Connection对象的(BeginTrans措施开始一种事务,在删除操作完
成之后调用CommitTrans提交这个事务:假如其中H勺某一步出错,
通过RollBackTrans措施,数据库将保持原样。
处理单击保留帐单按钮事件日勺函数:
voidCDlgJS::OnBtnJssave()
{if(!UpdateDataO)
return;
if(inno.GetLength()==0)
{MessageBox(〃请输入客户姓名!〃);
return;}
_RecordsetPtrpRst=NULL;
CJSRsrs;
try
{mDBCnt->BeginTrans();//开始事务
TESTHR(pRst.Createlnstance(uuidof(Recordset)));
pRst->0pen("JS”,variantt((IDispatch*)mDBCnt,true),
adOpenKcyset,adLockOptimistic,adCmdTable);〃打开结算表格
strcpy(rs.m_sz_no,m_no);〃填写结算记录
strcpy(rs.m_sz_desk,m_desk);
rs.m_f_dz=m_dz;
rs.m_f_total=m_total;
_tmstr(mdate,rs.m_sz_date);
COleSafeArrayvaFieldlist,vaValuelist;
rs.FillFieldsArray(vaFieldlist,vaValuelist);
〃添加结算记录
TESTHR(pRst->AddNew(vaFieldlist,vaValuelist));
pRst->Close();
〃删除订菜记录
CStringsql_;(下转第79页)
25
网络地址转换一协议转换(NAT-PT)包括两个构成部分:网络
地址转换协议和协议转换。其中地址转化是指通过使用NAT网
关,将一种IP网络日勺地址转换为另一种IP网络日勺地址,它容许内
部网络使用一组在公网中从不使用日勺保留地址。在使用这项技术
是可以将IPv6网视为一种独立而封闭的局域网,它需要使用一种
地址翻译器进行地址翻译。当内网的主机向外发送数据包时,将
内部的TP地址转换为外部的公网地址,当数据包从外部网络回
复数据包时,再将公网地址转换为内部网络的地址。
协议转换是指根据IPv6和IPv4之间的差异对数据包日勺首部
做对应口勺修改以符合对方网络[1勺格式规定,并且由于网络层协议
的变化要对上层日勺TCP、UDP、ICMP等数据包做对应的修改。将网
络地址转换机制与协议转换机制相结合而产生的NAT-PT可以
通过对协议、地址日勺转换实现IPv6和IPv4之间的互相通信。
2.4基于MPLS的过渡技术
MPLS(MultiprotocolLabelSwitch)最初是用来提高路由器的|转
发速度而提出日勺一种协议,不过由于MPLS在流量工程和VPN这
一在目前工网络中非常关键H勺两项技术中W、J突出体现,MPLS己
日益成为扩大IP网络规模W、J重要原则。
MPLS是一种使不一样的网络传播技术在同一种平台上统一起
来的技术,它可以减少网络口勺复杂度,并兼容主流口勺网络技术,代
表了未来网络发展的一种趋势。目前,使用MPLS的骨干网越来
越多,因此必须考虑怎样在MPLS上集成IPv6。由于MPLS在网络
中,转发是根据标识进行日勺,这就不需要数据层面支持IPv6日勺数
据转发,即不必关键网络软硬件的升级,只需要边缘路由器具有
配置IPv6日勺能力即可。
运用既有的MPLS骨干网向IPv6过渡,是将IPv4升级过渡
到IPv6的一种重要途径,详细的措施是,在CE路由器上配置
IPv6隧道、MPLS电路的IPv6透明传播等。
MPLS目前技术已经比较成熟,可以借助MPLSL2/L3VPN技
术来连接IPv6□勺网络。在CE路由器上配置隧道规定CE路由器
支持双栈,CE和PE之间运行IPv4,CE负责将IPv6数据封装在
IPv4中通过MPLS传送到对端口勺CE路由器。MPLS电路H勺IPv6
透明传播将IPv6的I数据包通过AnyTransportOVERMPLS(MPLS/
AtoM)或EthernetOVERMPLS(EToMPLS)来传递,路由器需要支持
AToM特性,相称L2VPN于。在PE路由器起用IPv6是在PE路由
器上提供双栈功能,IPv6数据包被封装在二层标签里进行传送,
外层标签由LDP来分发,内层标签由BGP4+来分发,相称于
L3VPNoNativeIPv6MPLS是将IPv4W、J关键网络升级到IPv6,其
关键网口勺控制平面需要升级到IPv6以支持关键网口勺IPv6路由和
IPv6的LDP,假如需要提供IPv4/IPv6共存的服务,则需要双控制
平面口勺支持。
3四种技术的优缺陷比较
隧道技术其长处是不需要大量的专用路由器设备和专用链
路,可以明显地减少投资。其缺陷是在IPv4网络上配置隧道是一
个比较麻烦的过程,尤其是在隧道数目增长到一定程度时,因此,
采用隧道方案尤其是手工隧道时一定要做好详细日勺文档一记录。
IPv6W、J流量和原有W、JTPv4流量之间会争抢带宽和路由器资源
(CPU、缓冲和路由表),在IPv6的流量较小时,这个问题不是很明
显,但伴随IPv6流量时增大这个问题未来会很突出,存在迂回路
由的状况。这对于整个IPv4网络性能来说,无疑是一种恶劣的影
响。在IPv6网络建设的初期,其网络规模和业务量都较小,因此采
用这种连接方式是可行的。
双协议栈的长处是不需要购置专门日勺IPv6路由器和链路,节
省了硬件投资,关键IPv6路由器之间采用专用当地链路,克服了
隧道方式的许多缺陷。其缺陷是IPv6的流量和原4的IPv4流量
争抢带宽和路由器资源,从而影响IPv4网络日勺性能,升级和维护
费用大,不符合从网络边缘开始演进的方略。在IPv6网络建设W、J
初期,由于IPv6地址相对充足,这种方案的J实行具有可行性。当
IPv6网络发展到一定阶段,为每个节点分派两个全局地址口勺方案
将很难实现。
NAT-PT的长处是所有的地址转换和协议转换都在NAT-PT
服务器上完毕,而子网内部的主机不需要做任何改动,就可以实
现两个不一样子网之间的互相访问。同样由于所有日勺IP数据包都
要在NAT-PT服务器上做数据包的修改,使得它们常常会破坏端
到端服务,这一点IPv4和中的NAT类似。同步,翻译器还会导致
网络潜在的单故障点。同步NAT-PT实现起来比较复杂,牵涉到
怎样简朴迅速地实现网络地址和端口分派和数据包出J迅
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信阳市商城县2025-2026学年第二学期五年级语文期末考试卷(部编版含答案)
- 邵阳市邵东县2025-2026学年第二学期四年级语文第七单元测试卷(部编版含答案)
- 上饶市上饶市2025-2026学年第二学期五年级语文期末考试卷(部编版含答案)
- 武汉市江岸区2025-2026学年第二学期五年级语文第七单元测试卷(部编版含答案)
- 2026初中社团活动第一课课件
- 农村基础教育信息化发展现状与对策考试及答案
- 2026年麻醉中级在线考试试题及答案
- 个人发展推进承诺函(4篇)
- 员工绩效管理与考核系统设计
- 2026初中开学适应指导课件
- 电芯安全培训课件
- 医务人员法律法规培训内容
- DB13(J)T 191-2020 聚苯模块保温系统技术规程
- 人工智能与机器学习(广东医科大学)知到智慧树网课答案
- 2026年马原考试题库300道附完整答案(必刷)
- 羊圈养殖场施工方案
- 《反窃电电子数据提取与固定技术规范》
- 2025年湖北省中小学教师高级职称专业水平能力测试模拟题(含答案)
- 人防工程保密管理办法
- 桑叶的作用与功效及副作用降血糖
- 2025年山东高考生物真题及答案
评论
0/150
提交评论