资源描述
软件工程详细设计说明书文档
饭店点餐管理系统的分析与设计
学院名称
信电工程学院
专业名称
计算机科学与技术
所属学期
2015-2016(一)
小组名单
班级
学号
姓名
13计卓
20130501214
陈尧
13计卓
20130501106
韩洁
13计卓
20130501323
刘蕊
13计卓
20130501339
邓辉
任课教师
王小磊
2015年12月24日
目录
F.1 引言 7
F.1.1 编写目的 7
F.1.2 背景 7
F.1.3 定义 7
F.1.4 参考资料 8
F.2 程序系统的结构 8
F.2.1 制菜统筹 9
F.2.2 推送新菜 11
F.2.3 点菜服务 11
F.2.4 会员服务 12
F.2.5 评价 12
F.2.6 账单管理 13
F.2.7 菜单管理 13
F.3 制菜统筹设计说明 14
F.3.1 程序描述 14
F.3.2 功能 14
F.3.3 性能 15
F.3.4 输入项 15
F.3.5 输出项 15
F.3.6 算法 16
F.3.7 流程逻辑 18
F.3.8 接口 19
F.3.9 存储分配 20
F.3.10 注释设计 22
F.3.11 限制条件 22
F.3.12 测试计划 22
F.3.13 尚未解决的问题 23
F.4 点菜管理模块程序 23
F.4.1 程序描述 23
F.4.2 功能 23
F.4.3 性能 25
F.4.4 输入项 25
F.4.5 输出项 25
F.4.6 算法 26
F.4.7 流程逻辑 30
F.4.8 接口 30
F.4.9 存储分配 30
F.4.10 注释设计 31
F.4.11 限制条件 32
F.4.12 测试计划 32
F.4.13 尚未解决的问题 32
F.5 评价管理模块程序 32
F.5.1 程序描述 33
F.5.2 功能 33
F.5.3 性能 34
F.5.4 输入项 34
F.5.5 输出项 34
F.5.6 算法 35
F.5.7流程逻辑 35
F.5.8接口 35
F.5.9存储分配 36
F.5.10注释设计 36
F.5.11限制条件 36
F.5.12测试计划 36
F.5.13尚未解决的问题 37
F.1 引言
F.1.1 编写目的
在前一阶段《概要设计说明书》中,已解决了实现该系统需求的程序模块设计问题。包括如何把该系统划分为若干个模块、决定各个模块之间的接口、模块之间传递的信息,以及数据结构、数据结构的设计等。在以下详细设计报告中将对本阶段中对系统所做的所有详细设计进行说明。
在本阶段中,确定应该如何具体的实现所要求的系统,从而在编码阶段可以把这个描述直接翻译成用具体的程序语言书写的程序。主要工作有:根据在《需求分析说明书》中所描述的功能、流程,并依照《概要设计说明书》所确定的处理流程、总体结构和运行模块设计,设计完成程序系统的结构,完成制菜统筹模块、点菜管理模块、评价管理模块的程序描述,其中包括各模块的设计说明、程序描述、功能、性能、输入、输出、算法、流程逻辑、接口等。本说明书的预期读者为系统设计人员、软件开发人员、软件测试人员和项目评审人员。
F.1.2 背景
为了更好的满足广大消费者的多元化消费需求和不同层次的消费水平,提高饭店的服务管理质量,提高饭店工作人员的工作效率,我开发小组在多方面考察、分析、研究现有饭店点菜管理系统的基础之上,以提高消费者的满意程度及商家的服务水平和市场竞争力为目标,致力于开发出一套可视化程度高、功能全面、集分析管理于一体的饭店点餐系统。
F.1.3 定义
SQL Server:系统服务器所使用的数据库管理系统。
SQL:一种用于访问查询数据库的语言
事务流:数据进入模块后可能有多种路径进行处理
主键:数据库表中的关键域,值互不相同
外部主键:数据库表中与其他表主键关联的域
Vs2013:Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。
C#:C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。
F.1.4 参考资料
《百度文库》
F.2 程序系统的结构
F.2.1 制菜统筹
1.菜品提示功能
厨师:下一道菜品
学徒:下一道菜所需的食材种类和分量
顾客:菜品正在制作
2.制菜的统筹功能
算法:通过客人点菜的时间可以优先做菜,有和这道菜一样的菜就可以一块做,然后再通过算法显示下一道菜,前一个桌号总比下一个桌号多一道菜。该功能实现了制菜的统筹合理安排制菜顺序。同时将正在制作的菜状态设置为不可退。还能提示下一道菜的菜名和具体信息,给厨师的下手准备食材。
3.无食材提示
当一道菜的食材不够用了会提示客户退菜或者换一道菜以及服务员,并自动从菜单中删除这道菜顾客根据提示退换菜。
F.2.2 推送新菜
1.新菜录入
厨师新研制的菜肴的食材种类和分量详细的录入系统,储存在新菜菜单中。
2.评分机制
根据一周顾客的评分,若低于所有菜品的平均分则删除这道新菜,若高于平均分则加入菜单中。
F.2.3 点菜服务
1.顾客点菜
(1)桌号的输入
顾客进入饭店之后选择座位坐下,通过扫描二维码在系统中先录入自己的桌号以方便点菜。
(2)口味的选择与菜色推荐
顾客进入系统之后,可以根据自己的偏好选择酸甜辛辣,淡咸之类的口味,从而系统自动进行推荐菜色,如以前顾客品尝过后评分较高的菜色或者该口味本饭店的招牌菜之类的菜色,同时,系统还可以自动推荐其他口味的评分较高的菜色以供顾客选择。
(3)点菜与写备注
顾客确定了自己所点的菜色之后,可以在系统上进行确认点菜,在点菜的同时,可以对自己所点的菜写入相应备注,如需要多一点辣味或者少加某样调料等等来满足自己的需求。
(4)生成菜单与提交制菜统筹系统
顾客点完菜之后,系统自动生成桌号+菜色+备注的菜单并将其提交至制菜统筹系统。
2.顾客退菜和催菜
(1)退菜
顾客在提交了菜单之后,如果想退菜,在系统中找到自己所点菜,如果厨师正在做这道菜,那么便无法进行退菜,如果厨师还没有做到这道菜,便可以从自己的菜单中删除这道菜,那么相应的制菜统筹系统中也会删除这道菜。
(2)催菜
顾客点菜之后,在等待的过程中,可以在系统中点催菜按钮,以此来催促厨师加快制作速度。
F.2.4 会员服务
1.注册会员
顾客可以通过系统中的注册会员按钮进入注册会员选项,然后填写注册会员需要写明的各项具体信息提交给系统,系统从自身数据库中判断,某些不能重复的项目如手机号码等如和数据库重复冲突了则不能通过,并且提示顾客重新确认自己所填写的信息,而填写完成并且通过之后,则进入会员缴纳相应的会员费部分,缴纳会员费之后则正式成为饭店会员,同时系统为该客户分配唯一的会员号码,并以此作为识别会员身份的凭证。
2.会员服务
会员登录系统之后,便可以在其他任何地方都可以打电话预约座位和提前点菜,到饭店之后只需在预留的座位上等待直至菜品上桌,或者到饭店在进行点菜也可以。点完菜之后,可以为会员提供相应的打折措施,消费500元以内打9折,500到1000元打8.5折,1000元以上打8折,与此同时还可以进行积分措施,消费多少则积相应的分数,到了一定程度后,每100分可以兑换5元现金券或者相应小礼品。
F.2.5 评价
1.判断顾客是否已经付款
2.如果没付款等待付款,如果付款显示评论界面
3.系统给出非常好,很好,一般,很差四个选项给顾客选择,顾客可以根据服务态度,菜色,就餐环境等进行评价,评价完成后在顾客评价界面显示
4.顾客评价完成后,系统根据算法显示饭菜的好评率,并赠送相应的奖励给客户
5.经理登录系统可以查看顾客的评论以便进行调整,然后辩论其真实性再把评论反馈给相关人员,相关人员根据评论作出相应的调整
F.2.6 账单管理
1.顾客提出付款信息
2.收银员收到消费清单后和顾客进行付款等操作,操作成功后,确定金额并打出清单
3.收银员向经理报告日收益,经理核实并确定
4.经理对厨房对外采购支出信息,饭店税收支出信息,员工信息支出统计,再根据月收益形成饭店支出表,最后算出饭店的日收益
F.2.7 菜单管理
菜单管理系统有四个终端,按身份登录不同的身份进入的界面不一样。
(1)顾客、服务员终端主要满足如下功能:
1.顾客可以在各个类别(特色菜、招牌菜、优惠菜、套餐)下选择自己中意的菜,并查看该菜的介绍,评价,所需时间,还可以选择口味(拉框),如没有,可以在备注里填写。
2.顾客可以在总价这项里查询,增添和删除菜,也可以看到自己的消费金额。
3.顾客在消费完毕后,可以留下自己的意见和建议。
4.服务员可以帮顾客点菜。
5.顾客或服务员点菜完毕后,系统会自动将菜单传送到制菜统筹子系统。
(2)配菜员终端主要满足如下功能:
1.接收制菜统筹子系统分配的需要的配菜的菜名、份数。
2.如果菜所需材料没有了,配菜员通过终端选中菜后面的红×(菜单管理系统自动通知服务员终端,服务员再去向顾客解释并询问顾客是否换菜,同时从当天菜单中删除,以免后面顾客继续点)。
(3)管理员终端主要满足如下功能:
1.根据统计系统反馈的数据,修改菜单、类别。
2.根据统计系统反馈的数据,及时跟员工协调。
3.将每天的打折信息更新。
4.反馈客户的意见及建议。
5.为员工分配相应的权限。
F.3 制菜统筹设计说明
F.3.1 程序描述
现如今大部分饭店之中厨师制菜通常需要一个传菜员来提示他该做哪道菜,提示服务员应该将菜送到哪张桌。不仅时间上和人力物力上都造成了极大的浪费,而且传菜员一旦出错,会造成顾客等待时间过长的不愉快体验,从而给饭店造成损失。所以我们的制菜统筹子系统之中将传菜员的职能转交由计算机来执行,通过算法智能的统筹。计算机不用担心出错,因而顾客的体验都会比较好。不仅如此,制菜统筹系统还充分利用了厨师的一个下手。
F.3.2 功能
制菜统筹子系统:
a. 提示厨师正在制作的菜品和下一道菜品,同时提示学徒下一道菜所需的食材种类和分量。还有提示顾客菜品正在制作。
b. 通过客人点菜的时间可以优先做菜,有和这道菜一样的菜就可以一块做,然后再通过算法显示下一道菜,前一个桌号总比下一个桌号多一道菜该功能实现了制菜的统筹合理安排制菜顺序。
c. 将正在制作的菜状态设置为不可退。
d. 提示下一道菜的菜名和具体信息。
e. 提示客户退菜或者换一道菜。
F.3.3 性能
计算时间<20s;
传送时间<3s;
F.3.4 输入项
菜单信息
菜名(Dish)----类型:String
份数(number)----类型:Int
桌号(TableNumber)----类型:Int
备注(Remarks)----类型:String
时间(Time)----类型:time;
是否完成(IsFinish)----类型:boolean ;默认:false
F.3.5 输出项
配菜名(DishesName)----类型:String
配菜份数(DishesNumber)----类型:int
即将烧的菜(SoonDish)----类型:String
备注(Remarks)----类型:String
*号桌(num)----类型:int
F.3.6 算法
每个点菜单用结构体存放,并添加时间、是否制作完成字段
N个点菜单存放在结构体中
使用for循环遍历计算出即将需要做的菜
Count()//统计需做菜的份数
{
int N=5;
int j = 10;
int i=1;
string NO = "0";
SqlDataReader dr;//用于读取数据流
while(i<=N)
{
string cmd = "Select Count(making) From [Table] Where making='1' and Table_NO='" + i + "'";//统计需做菜的份数SQL语句
dr = help.DataRead(cmd);//执行SQL语句
dr.Read();//读数据
NO = dr[0].ToString();
dr.Close();//关闭读取流
string cmd2 = " update Tabe_use Set UP ='" +NO+ "'where Table_NO='" + i + "'";//更新桌子使用情况
j = help.DataWrite(cmd2);//执行SQL语句
i++;
}
}
string cmd3 = "Select table_NO From Tabe_use where UP=(Select min(UP) From Tabe_use) and use_ing='1'";//SQL语句
SqlDataReader dr = help.DataRead(cmd3);
if (dr.Read())//判断数据流是否为空
{
string cmd = "Select * from [Table] where making='0' and making_time!='0'and table_NO='" + dr[0].ToString() + "'";//查询未做的菜
dr.Close();//关闭读取流
dr = help.DataRead(cmd);//执行SQL语句
dr.Read();
dr.Close();
cmd = "Select Count(dish_names) From [Table] where dish_names='" + label2.Text + "'";//SQL语句
SqlDataReader drNum2 = help.DataRead(cmd);
drNum2.Read();//数据流
label2.Text = label2.Text + "数量:" + drNum2[0].ToString();//将需做菜的份数传送到配菜员的显示屏上
drNum2.Close();
}
else
{
dr.Close();
string cmd2 = "select*from [Table] where making='0' and making_time!='0'";//SQL语句
SqlDataReader dr2 = help.DataRead(cmd2);
if (dr2.Read())//判断数据流中是否有数据
{
label2.Text = dr2[2].ToString();
dr2.Close();
cmd2 = "Select Count(dish_names) From [Table] where dish_names='" + label2.Text + "'";
SqlDataReader drNum2 = help.DataRead(cmd2);
drNum2.Read();
label2.Text = label2.Text + "数量:" + drNum2[0].ToString();//将数量传送到厨师显示屏上
drNum2.Close();
}
else
{
dr2.Close();
label2.Text = "没有下一道菜了";
}
F.3.7 流程逻辑
F.3.8 接口
本模块与其它相关模块间平行方式连接。
F.3.9 存储分配
Check_list数据表,作用是描述订餐的信息
Check_list表
序号
字段名
数据类型
是否主键
意义
1
Table_NO
Varchar(50)
Yes
桌号
2
Dish_names
Varchar(50)
No
菜名
3
Price
Decimal(18,0)
No
价格
Garnish数据表,作用是描述配菜的信息
Garnish表
序号
字段名
数据类型
是否主键
意义
1
Garnish_Number
Varchar(50)
Yes
配菜号
2
Dish_names
Varchar(50)
No
菜名
3
Food_Name
Varchar(50)
No
食材名
4
Garnish_Amount
float
No
数量
Menu数据表,作用是描述菜单的信息
Menu表
序号
字段名
数据类型
是否主键
意义
1
Dish_names
Varchar(50)
Yes
菜名
2
Prcie
Decimal(18,0)
No
价格
3
Making_time
Varchar(50)
No
制作时间
4
Picture
image
No
图片
MenuList数据表,作用是描述菜单类别的信息
MenuList表
序号
字段名
数据类型
是否主键
意义
1
Cid
int
Yes
菜号
2
Dish_names
Char(20)
No
菜名
3
pcid
int
No
类别
Stock数据表,作用是描述库存的信息
Stock表
序号
字段名
数据类型
是否主键
意义
1
Food_Name
Varchar(50)
Yes
食材名
2
Stock_amount
float
No
库存量
3
Stock_price
Deciamal(18,0)
No
价格
F.3.10 注释设计
a、加在模块首部的注释;
b、加在各分枝点处的注释;
c、对各变量的功能、范围、缺省条件等所加的注释;
d、对使用的逻辑所加的注释等。
F.3.11 限制条件
制菜统筹设计计算机的性能必须足够的强悍,可以在高峰期快速的计算。
F.3.12 测试计划
测试模块
测试功能
测试指标
制菜智能统筹
菜品提示功能
在数据库中存在待制作的菜品时可以给出正确的提示:厨师当前制作菜品菜名和份数、学徒下一道待制作菜品的配菜信息
制菜的统筹功能
能够将数据库中存在的待制作的菜品进行智能的安排制作顺序,取代配菜员的工作
无食材提示
厨师能够通过这个功能向客人发出当前菜品无食材的提示,同时会从菜单中暂时删去这道菜
新菜录入
能够将新的菜色信息录入到菜单中,并显示出来
评分机制
对新菜的评分并能够计算平均分
F.3.13 尚未解决的问题
无
F.4 点菜管理模块程序
F.4.1 程序描述
该模块程序主要实现为顾客展示、推荐以及介绍菜品和实现顾客对菜品的点菜、退菜和催菜操作。顾客只有在输入桌号之后才能点菜,点菜之后才能进行结账和评价
F.4.2 功能
1.开桌:
顾客输入自己的桌号。该桌号唯一不可与其他人重复,若重复则给出相应提示。桌号的位数由饭店规模决定默认为两位数,如:01、02。确认桌号后不可修改,如有添桌请求需要用另一台设备另外开桌。
2点菜:
顾客可以根据需要选择自己喜欢的口味,系统筛选对应口味的菜色同时推送本店特色菜品。界面展示菜名、菜品图片和价格,顾客选择喜欢的菜色可以查看详细介绍,并提交份数。生成点菜信息,在顾客点菜结束后展示,进行最后确认,确认后提交制菜统筹系统。
3.退菜:
顾客可以退去自己已点的,未上并且未在制作的菜。若在制作或者已上,则提示相关错误。否则从后厨数据库中删去,提示操作成功。
4.催菜:顾客可以对已点菜品进行催促,催促会提示后厨加快速度,规定同一小时内后厨只会收到两次催促。但顾客可以尽情催促,单不会传到后厨。
F.4.3 性能
检索业务响应时间<2s;
运行响应时间<1s;
付款响应时间<10s;。
F.4.4 输入项
桌号(Table_NO)——类型:String;输入方式:手动输入;输入数量:1;
口味(Flavor)——类型:String;输入方式:选择;输入数量0~3;
菜名(Dish_names)——类型:String;输入方式:选择;输入数量>0;
份数(Amount)——类型:int;输入方式:选择;输入数量>0;
F.4.5 输出项
给出对每个输出项的我,包括名称、标识、数据的类型昨格式,数据值的有效范围,输出的形式数量和频度,输出媒体,对输出图形及符号的说明,安全保密条件等。
成功提示——类型:弹窗输出;输出频率:触发输出1次;
错误提示——类型:弹窗输出;输出频率:触发输出1次
菜品信息——类型:界面输出;输出频率:一直输出,触发停止
F.4.6 算法
使用while()语句判断一小时内接受催促的次数。
使用if()判断失误操作。
使用if()判断退菜。
数据的输入输出与sql数据库链接等基本算法
通过输入桌号来记录点餐桌号
button1_Click
{
Class.tableNO = textBox1.Text;
FrmCustomer fc = new FrmCustomer();
fc.Show();
this.Hide();
}
开始点菜,这里点的菜同步更新到服务员的菜单表,也实现了退菜的功能,如果菜正在制作就无法退,若还是要求退需要叫服务员来操作
FrmCustomer_Load
{
this.Text = Class.tableNO.ToString()+"号桌";
/*显示菜单*/
string connStr = "Data Source=yao-pc;Initial Catalog=item;Integrated Security=True";
与数据建立连接
string str2 = "Select*from MenuList";//读取菜单
SqlDataAdapter da = new SqlDataAdapter(str2, conn);
DataSet ds = new DataSet();//将数据库读取到的数据放到Dataset
da.Fill(ds);//利用dataset的fill方法填充到表格中
nodes(this.treeView1.Nodes, ds, 0);
int i = 1;
string cmd = "Select*from [Table] where Table_NO='" + Class.tableNO.ToString() + "'";//sql语句
SqlDataReader dr = help.DataRead(cmd);
while (dr.Read())//循环遍历数据流
{
string ID = i.ToString();//保存Id号
string dish_names = dr["dish_names"].ToString();//保存菜名
string price = dr["price"].ToString();//保存价格
string making_time = dr["making_time"].ToString();//保存制作时间
ListViewItem lvi = new ListViewItem(); //首先创建一个ListView项item
lvi.Text = ID; //该项的文本
lvi.SubItems.AddRange(new string[] { dish_names, price, making_time }); //添加该项的子项,,也就是第2,3,4列的值
listView1.Items.Add(lvi); //最后把创建的项加到ListView控件的项中
i++;
}
dr.Close();
}
/*创立TreeView结点*/
nodes(TreeNodeCollection tnode, DataSet ds, int d)
{
DataView dview = new DataView(ds.Tables[0]);
dview.RowFilter = "pcid='" + d + "'";
//循环遍历
foreach (DataRowView row in dview)
{
TreeNode node = new TreeNode();
node.Text = row["dish_names"].ToString();
tnode.Add(node);
nodes(node.Nodes, ds, Int32.Parse(row["cid"].ToString()));
}
}
//退菜操作
button4_Click(object sender, EventArgs e)
{
/*退订一道菜与数据库同步*/
string cmd = "";
if (listView1.SelectedItems.Count > 0)
{
cmd="Select*From[Table] where Table_NO='" + Class.tableNO.ToString() + "' and dish_names='" + labName.Text + "'";
//SQL语句
SqlDataReader dr= help.DataRead(cmd);
dr.Read();
if ("1" == dr[4].ToString())//判断菜是否正在制作
{
dr.Close();
MessageBox.Show("厨师正在制作,请稍等 若依然要退菜,请叫服务员");
}
Else//菜未开始制作,执行退菜相关操作
{
dr.Close();
cmd = "Delete from [Table] where Table_NO='" + Class.tableNO.ToString() + "' and dish_names='" + labName.Text + "'";
int i = help.DataWrite(cmd);
listView1.SelectedItems[0].Remove();
}
}
}
treeView1_NodeMouseClick
{
if (e.Node.Parent == null)
{
}
else
{
string cmd = "Select * From Menu " + "Where dish_names='" + e.Node.Text + "'";//获取配菜信息
SqlDataReader dr = help.DataReadPicture(cmd);//执行SQL语句并生成包含数据对象的实例
dr.Read();
labName.Text = e.Node.Text;
labPrice.Text = dr[1].ToString();
labTime.Text = dr[2].ToString();
label1.Text = "价格:";
label3.Text = "元";
label4.Text = "制作时间约为"
}
}
F.4.7 流程逻辑
F.4.8 接口
本模块与其它相关模块间根据桌号和菜名平行方式连接。
F.4.9 存储分配
无特别存储分配的需要。
Check_list数据表,作用是描述订餐的信息
Check_list表
序号
字段名
数据类型
是否主键
意义
1
Table_NO
Varchar(50)
Yes
桌号
2
Dish_names
Varchar(50)
No
菜名
3
Price
Decimal(18,0)
No
价格
Menu数据表,作用是描述菜单的信息
Menu表
序号
字段名
数据类型
是否主键
意义
1
Dish_names
Varchar(50)
Yes
菜名
2
Prcie
Decimal(18,0)
No
价格
3
Making_time
Varchar(50)
No
制作时间
4
Picture
image
No
图片
Table数据表,作用是描述桌子的信息
Table表
序号
字段名
数据类型
是否主键
意义
1
ID
int
Yes
就餐号
2
Table_no
Varchar(50)
No
桌号
3
Dish_names
Varchar(50)
No
菜名
4
Order_time
datetime
No
订餐时间
5
making
Int
No
制作
6
price
float
No
图片
7
Making_time
Varchar(50)
No
制作时间
F.4.10 注释设计
a、在模块首部注释说明模块名称;
b、在各分枝点处注释各个分支的作用;
c、各变量的功能、范围、缺省条件等必须加上注释;
d、对使用的逻辑所加上必要的注释。
F.4.11 限制条件
顾客必须已经登陆该软件,而且在一个网速良好的环境下。
F.4.12 测试计划
测试模块
测试功能
测试指标
点菜服务
桌号录入
能够判断桌号的逻辑和重复
点菜与写备注
能够点菜并写备注生成点菜表
生成点菜表与提交制菜统筹系统
生成的点菜表能在后厨显示出来
退菜
能够判断制菜状态,若能退菜则从点表中删去这一道菜
催菜
能够发送通知至后厨,后厨能够一小时只接受三次
F.4.13 尚未解决的问题
无
F.5 评价管理模块程序
F.5.1 程序描述
对于一个饭店管理系统来说,大家可能觉得评价系统对于整个饭店管理系统并不是那么重要,但是如果想象淘宝,就觉得很重要,一个评价可以让客人得到一个很好的反馈,同时也可以让更多的用户可以对这个饭店可以有个一定的了解,比如:服务态度,饭店环境,菜色味道,以及价格等都可以进行客观的了解。这个评价系统可以对用户的好评率进行统计计算,对于进行差评的用户反馈给经理,经理可以对用户的评价进行一定的核实,然后进行相应的调整。
这个评价管理系统对于近一个月的评价进行数据库存储,并且进行界面显示,对于这些评价处理进行顺序处理,根据时间写入数据库,并且界面显示。
F.5.2 功能
展开阅读全文