管理员功能模块分为用户信息管理、系统维护两个部分。(1)用户信息管理包括顾客注册、商家注册、客户以及商家订单记录查询。
该系统在性能功能上应达到如下需求:(1)操作简单、界面友好,完全控件式地页面布局,使得菜品等信息地录入工作更简便,选择菜品只需通过鼠标;(2)对常见地类似网站地管理地各个方面;(3)基本信息录入、浏览、删除、修改、搜索等方面都大体实现;(4)对客户预定餐饮信息地处理(包括录入、删除)将立即在主页地对应栏目显示出来;(5)达到“即时发布、即时见效”地功能;(6)系统运行应该快速、稳定、高效和可靠;(7)在结构上应具有很好地可扩展性,便于将来地功能扩展和维护。
图2.2系统组织结构图考虑到此模拟系统共有四大群体,分别是客户、商家、骑手、管理员,接下来是针对四大群体的系统组织结构设计。
图2.2.1客户程序设计框图
图2.2.2商家程序设计框图
图2.2.3骑手系统组织设计框图
图2.2.4管理员系统组织设计框图
图2.2.5美团外卖服务系统业务流程图
图2.3ER模型图
图2.4数据流图
表2.5.1客户数据字典图
表2.5.2管理员数据字典图
表2.5.3商家数据字典图
表2.5.4菜品数据字典图
表2.5.5订单数据字典图
表2.5.6骑手数据字典图
表2.5.7管理员操作数据字典图
图4.1客户登陆窗口运行图
针对客户的主要三大操作:订餐、查询订单、修改信息,我们借助JAVA中的JTabbedPanel面板,将一个窗口分为三个小模块,分别为buy,select,my,与美团外卖APP小程序对应的是三个界面,订餐、查询订单、我的信息。以下是CLIANET_MAIN.java程序代码:
图4.2.2客户主窗口中“我的“窗口运行图
图5.1.1.2postgresql环境变量配置步骤图2
1.使用SQLshell工具首次连接直接连接默认地址、默认端口、默认database即可,回车四次后需输入用户postgres(默认)的口令,口令即为安装时设置的密码。
图5.1.2.2使用pgAdmin4工具在浏览器中进入psql数据库
图5.2在pgAdmin5中创建数据库
图5.3在psql中创建的表
客户(客户编号,昵称,密码,联系方式,状态,地址,账号余额),对于客户的信息表为区分于商家、骑手、管理员,所以需要在ID上加一个主键约束,另外增加一个check约束,限制id的形式为c开头的字符串。其中状态1表示为在线,0表示为不在线。
CREATETABLEclient( c_idcharactervarying(9)PRIMARYKEYNOTNULLCHECK(c_idLIKE'c%'), c_namecharactervarying(20)NOTNULL, c_pwcharactervarying(20)NOTNULL, c_telcharactervarying(11)NOTNULLCHECK(c_telLIKE'1%')UNIQUE, c_stateintCHECK(c_stateIN(1,0)), c_addcharactervarying(20)NOTNULL, c_moneyfloatCHECK(c_money>=0));5.3.2创建商家信息表商家(商家编号,密码,联系方式,店铺名称,地址,信誉星级,状态,账号余额),其中状态分为三种,working——营业中,relax——休息,gone——停业
CREATETABLEadmin( a_idcharactervarying(9)PRIMARYKEYNOTNULLCHECK(a_idLIKE'a%'), a_namecharactervarying(20)NOTNULL, a_pwcharactervarying(20)NOTNULL, a_telcharactervarying(11)NOTNULLCHECK(a_telLIKE'1%')UNIQUE, a_stateintCHECK(a_stateIN(1,0)));5.3.5创建菜品信息表菜品(菜品编号,名称,价格,折扣,提供商编号,剩余量,出售量)
图5.4.3操作步骤3
图5.4.4操作步骤4
此监听事件实现的主要功能是在客户点击注册按钮后,将文本框里的内容传到PSQL_JDBC类中,在通过该check()方法判断注册信息是否符合规则,如果符合则通过insert_client方法,插入数据到client客户表中。
publicstaticintclear_client(){if(!operation_client.isOK()){return-1;}inti=operation_client._getRow("client");Stringsql="deletefromclient";PreparedStatementpstmt;try{pstmt=(PreparedStatement)operation_client.conn.prepareStatement(sql);pstmt.executeUpdate();pstmt.close();//operation_client.conn.close();}catch(SQLExceptione){e.printStackTrace();}returni;}该方法通过借助PreparedStatement类成功执行sql语句deletefromclient,并且最后会返回删除的总个数。
图5.9.1客户注册账号界面图如上图所示,当点击“确认注册”后,JAVA程序将sql语句selectcount(*)fromwherec_id=‘cycc’;传入psql数据库中,如果返回的结果中有1那么就提示注册失败,请用户重新输入。
图5.9.3实现注册+登陆功能的动态运行图
图5.10点餐测试Gif图
图5.11添加百万客户功能测试运行动态图
在整个模拟系统中,当客户进行订餐后,数据库系统将对客户的余额进行查询,同时会更新余额,此时就需要保证余额一定要大于0,这个小功能可以用sql语句来实现,sql代码如下:
CREATEFUNCTIONupdate_client_money()returnstriggeras$$beginupdateclientsetc_money=0wherec_money<0;returnold;end;$$languageplpgsql;createtriigerU_C_Mafterupdateonclientforeachrowexecuteprocedureupdate_client_money();5.12.2保证订单的id是递增的序列由于各个商家以及各个客户是m对n的关系,所以肯定会产生许多不同的订单,此时为了更好的区分不同的订单,则采取设置主键o_id为递增序列的形式,首先创建一个序列,接着创建对应的执行函数、还有触发器。sql代码如下:
createsequences_ordstartwith1incrementby1createfunctioninsert_ord()returnstriggeras$$beginselects_ord.nextvalintonew.o_idfromdual;returnnew;end;$$languageplpgsql;CREATETRIGGERI_Obeforeinsertonordforeachrowexecuteprocedureinsert_ord();5.12.3添加新订单对于新订单的产生,我们设想当客户的余额有减少的时候,就说明客户在客户端进行了点餐,与此同时可以添加一个触发器对客户表client的update操作进行触发,触发事件则插入新的订单到ord表中,代码如下:
项目文件在同一个文件夹内1.创建客户表
createtableclient(c_idcharactervarying(9)primarykeynotnullcheck(c_idlike'c%'),c_namecharactervarying(20)notnull,c_pwcharactervarying(20)notnull,c_telcharactervarying(11)notnullcheck(c_tellike'1%')unique,c_stateintcheck(c_statein(1,0)),c_addcharactervarying(20)notnull,c_moneyfloatcheck(c_money>=0));2.创建商家表
createtableprovider(p_idcharactervarying(9)primarykeynotnullcheck(p_idlike'p%'),p_pwcharactervarying(20)notnull,p_telcharactervarying(20)notnulluniquecheck(p_tellike'1%'),p_namecharactervarying(20)notnull,p_addcharactervarying(11)notnullunique,p_levint,p_statecharactervarying(15)check(p_statein('working','relax','gone')),p_moneyfloatcheck(p_money>=0));3.创建骑手表
createtablerider(r_idcharactervarying(9)primarykeynotnullcheck(r_idlike'r%'),r_pwcharactervarying(20)notnull,r_namecharactervarying(10)notnull,r_telcharactervarying(20)notnulluniquecheck(r_tellike'1%'),r_addcharactervarying(11)notnull,r_levint,r_statecharactervarying(15)check(r_statein('working','relax','gone')),r_moneyfloatcheck(r_money>=0));4.创建管理员表
createtableadmin(a_idcharactervarying(9)primarykeynotnullcheck(a_idlike'a%'),a_namecharactervarying(20)notnull,a_pwcharactervarying(20)notnull,a_telcharactervarying(11)notnullcheck(a_tellike'1%')unique,a_stateintcheck(a_statein(1,0)));5.创建菜品表
createtabledish(d_idintprimarykeynotnull,d_namecharactervarying(30)notnull,d_pricefloat(2)notnull,d_discountfloat(2),d_pidcharactervarying(9)notnull,foreignkey(d_pid)referencesprovider(p_id),d_stockintnotnullcheck(d_stock>=0),d_salesintnotnull);6.创建订单
createtableord(o_idintprimarykeynotnull,o_cidcharactervarying(9),foreignkey(o_cid)referencesclient(c_id),o_ridcharactervarying(9),foreignkey(o_rid)referencesrider(r_id),o_didint,foreignkey(o_did)referencesdish(d_id),o_pidcharactervarying(9),foreignkey(o_pid)referencesprovider(p_id),o_timedate,o_numintnotnullcheck(o_num>0),o_caddcharactervarying(50)notnull,o_statecharactervarying(15)check(o_statein('wait','accept','cancel')),);7.管理客户
createtableadmin_client(a_c_aidcharactervarying(9),foreignkey(a_c_aid)referencesadmin(a_id),a_c_cidcharactervarying(9),foreignkey(a_c_cid)referencesclient(c_id),a_c_timedate,primarykey(a_c_aid,a_c_cid,a_c_time),a_c_operationcharactervarying(15)check(a_c_operationin('update','insert','delete')));8.管理商店
createtableadmin_provider(a_p_aidcharactervarying(9),foreignkey(a_p_aid)referencesadmin(a_id),a_p_pidcharactervarying(9),foreignkey(a_p_pid)referencesprovider(p_id),a_p_timedate,primarykey(a_p_aid,a_p_pid,a_p_time),a_p_operationcharactervarying(15)check(a_p_operationin('allow','delete')));9.管理骑手
createtableadmin_rider(a_r_aidcharactervarying(9),foreignkey(a_r_aid)referencesadmin(a_id),a_r_ridcharactervarying(9),foreignkey(a_r_rid)referencesrider(r_id),a_r_timedate,primarykey(a_r_aid,a_r_rid,a_r_time),a_r_operationcharactervarying(15)check(a_r_operationin('update','insert','delete')));1.删除约束altertable{TABLENAME}dropconstraintifEXISTS{CHECKNAME};2.删除客户的money约束altertableclientdropconstraintifEXISTSclient_c_money_check3.级联删除执行函数DROPFUNCTION{NAME}()CASCADE;4.删除某个表中的触发器droptrigger{triggerName}on{tableName};5.设置序列下个的值selectsetval('{NAME}',0);