%用于一书%%离散信号和系统%conv_m-改进的线性卷积子程序(第22页)%conv_tp-用Toeplitz矩阵计算的线性卷积(第34页)%evenodd-将实信号分解为偶和奇两部分(第15页)%impseq-产生脉冲序列(第6页)%sigadd-信号相加运算(第8页)%sigfold-信号折叠运算(第10页)%sigmult-信号乘法运算(第9页)%sigshift-信号时移运算(第9页)%stepseq-产生阶跃序列(第6页)%离散时间付利叶变换(第z变换)%pfe2rfz-在z域由部分分式展开为有理函数(第四章)%rf2pfez-在z域由有理函数展开为部分分式(第四章)%离散付利叶变换%circevod-实信号分解为循环偶分量和循环奇分量(第132页)%circonvt-时域中的循环卷积(第139页)%cirshftt-时域中的循环移位(第146页)%dfs-计算离散付利叶系数(第109页)%dft-计算离散付利叶变换(第120页)%hsolpsav-采用FFT高速分段卷积的重叠保留法(第157页)%idfs-计算逆离散付利叶级数(第110页)%idft-计算逆离散付利叶变换(第121页)%mod-计算m=nmodN(第119页)%ovrlpsav-分段卷积的重叠保留法(第147页)%数字滤波器结构%cas2dir-级联到直接的形式转换(第173页)%casfiltr-IIR和FIR滤波器的级联实现(第172页)%cplxcomp-比较两个复数对(第176页)%dir2cas-直接到级联的型式转换(第171页)%dir2fs-直接形式到频率采样型的转换(第187页)%dir2ladr-IIR直接形式极__零点到格型/梯形的转换(第199页)%dir2latc-FIR直接形式到全零点格型形式的转换(第193页)%dir2par-直接到并联形式的转换(第175页)%dir2paro-直接到并联形式的转换(用于旧版信号处理工具箱)%ladr2dir-格型/梯形形式到IIR直接形式的转换(第199页)%ladrfilt-格型/梯形形式的IIR滤波器实现(第200页)%latc2dir-全零点格型形式到FIR直接形式的转换(第194页)%latcfilt-FIR滤波器的格型形式的实现(第194页)%par2dir-并联形式到直接形式的转换(第177页)%parfiltr-IIR滤波器的并联形式的实现(第177页)%FIR滤波器设计% ampl_res -由FIR滤波器脉冲响应求其幅频特性(第271页)%blackman-布莱克曼窗函数(第230页)%freqz_m-改进型的freqz子程序(第233页)%Hr_Type1-计算1型FIR低通滤波器(第215页)%Hr_Type2-计算2型FIR低通滤波器(第216页)%Hr_Type3-计算3型FIR低通滤波器(第216页)%Hr_Type4-计算4型FIR低通滤波器(第
2024/10/4 22:44:49 31KB 数字信号 matlab 算法集合
1
https://download.csdn.net/download/qq_41739364/86339152
2024/10/1 23:17:35 2.08MB python
1
172/5000Robo3T1.4带来了对MongoDB4.2的支持,从4.0到4.2的mongoshell升级,能够手动指定可见数据库的功能以及许多其他修复和改进。
2024/7/12 8:42:34 18.1MB MongoDBIDE Robo3TV1.4.0
1
PerlgolfHistoryPerlgolfHistoryEdition2007-01-09topsecret/strictlyconfidentialpage2of520Contents1.Intro..............................................................................................................................................112.OnTheGame...............................................................................................................................132.1.History.....................................................................................................................................132.2.ForNewbies............................................................................................................................132.3.Notation...................................................................................................................................132.4.GenericRules..........................................................................................................................142.4.1.PerlVersions..............................................................................................................................................................................................162.4.2.SomeAssumptions.....................................................................................................................................................................................162.5.OpenSourceTournamentEngines..........................................................................................172.5.1.PGAS..........................................................................................................................................................................................................172.5.2.JAGGS.......................................................................................................................................................................................................173
2024/7/3 1:11:53 4.73MB perlgolf history
1
非常清晰,共14章第一章绪论⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯1§1.1测绘学的任务及作用⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯1§1.2数字测图的发展概况⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3§1.3学习数字测图原理与方法的目的和要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4第二章测量的基本知识⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯6§2.1地球形状和大小⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯6§2.2测量常用坐标系和参考椭球定位⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯8§2.3地图投影和高斯平面直角坐标系⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12§2.4高程⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯19§2.5用水平面代替水准面的限度⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯20§2.6方位角⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯22§2.7地形图的基本知识⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯24§2.8地形图的分幅与编号⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯31第三章测量误差基本知识⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯42§3.1观测误差的分类⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯42§3.2衡量精度的标准⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯45§3.3算术平均值及观测值的中误差⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯48§3.4误差传播定律⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯51§3.5加权平均值及其精度评定⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯55§3.6间接平差原理⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯58第四章水准测量和水准仪⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯62§4.1水准测量原理与方法⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯62§4.2水准仪和水准尺⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯65§4.3水准测量外业施测⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯81§4.4水准测量的误差分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯88目录1§4.5水准仪的检验与校正⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯90第五章角度、距离测量与全站仪⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯103§5.1角度测量原理⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯103§5.2经纬仪⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯104§5.3角度观测方法⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯115§5.4水平角观测的误差和精度⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯123§5.5经纬仪的检验和校正⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯132§5.6距离测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯137§5.7光电测距误差分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯154§5.8光电测距仪的检验⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯158§5.9全站仪和自动全站仪⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯162§5.10三角高程测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯166第六章控制测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯172§6.1控制测量概述⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯172§6.2导线测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯181§6.3交会测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯195§6.4三角网测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯204§6.5高程控制测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯210§6.6全球定位系统(GPS)在控制测量中的应用⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯219第七章碎部测量⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯226§7.1碎部
2024/5/3 12:48:14 5.65MB 测绘
1
关于UCOSII实时操作系统第一讲初识uCOSII41、uCOSII单任务实验:42、uCOSII多任务实验:63、任务状态之间的转换:94、空闲任务和统计任务简介:95、任务的三要件:9程序代码、私有堆栈、任务控制块96、任务控制块TCB(P80)97、创建任务98、任务的栈空间109、栈的增长方向:10第二讲调度运行机制111、任务挂起和恢复112、任务挂起、恢复的状态转换133、时钟节拍ISR154、时钟节拍函数OSTimtick()165、延时系统调用16第三讲任务管理uCOSII171、任务删除172、任务请求删除实验193、在源码中增加打印信息一般步骤244、OSTaskDelReq()函数理解流程图25第四讲互斥性信号量管理261、优先级反转262、信号量SEM使用263、互斥信号量Mutux使用294、关于信号量程序分析325、关于互斥信号量分析326、OSMutexPend()函数流程图337、OSMutexPost()函数流程图33第五讲消息邮箱341、基本概念342、对于OSMboxPend()理解343、对于OSMboxPost()理解344、消息邮箱管理一般程序355、使用OSMboxQuery()386、OSMboxPend()函数Timeout等待超时程序387、OSMboxPost()函数邮箱状态为FUll程序408、关于OSTimeTickHook(void)使用41第六讲信号量集431、信号量集案例432、OSFlagPend()源码463、OSFlagPost()源码51第七讲动态内存541、内存管理基本概念542、内存管理基本概念543、内存管理案例544、案例分析695、教学案例:71
2023/10/25 17:58:17 1.46MB UCOSII
1
对jira后台管理各个菜单及界面的功能进行介绍,同时也对系统的整个方法、步骤、技巧进行说明。
2 项目管理 52.1 新建项目 62.2 问题类型 92.2.1. 新建问题类型 92.2.2. 新建问题类型方案 92.2.3. 问题类型方案关联项目 102.3 工作流 112.3.1. 新建工作流 112.3.2. 新建工作流方案 132.3.3. 工作流方案关联项目 152.4 字段 172.4.1. 创建字段 172.4.2. 创建字段配置 192.4.3. 创建字段配置方案 202.4.4. 字段配置方案关联项目 222.5 界面 232.5.1. 创建界面 232.5.2. 创建界面方案 252.5.3. 创建问题类型界面方案 272.5.4. 问题类型界面方案关联项目 293 权限方案 303.1 权限方案关联项目 344 通知方案 354.1 通知方案 354.1.1. 增加事件 354.1.2. 增加通知方案 364.1.3. 配置通知方案 374.1.4. 通知方案关联项目 384.2 工作流中引用事件触发通知 395 工作流管理 415.1 状态 415.2 工作流配置 426 字段管理 486.1 字段配置管理 486.1.1. 编辑 496.1.2. 隐藏 496.1.3. 必选项 496.1.4. 界面 496.2 字段管理 496.2.1. 字段环境配置 496.2.2. 编辑字段明细 516.2.3. 字段翻译 526.2.4. 界面 527 界面配置管理 538 安全方案 558.1 新建问题安全方案 559 系统管理 589.1 通用设置 589.2 配置应用程序链接 609.3 系统信息 609.4 监控信息 609.5 完整性检查器 619.6 日志分析 619.7 计划任务 619.8 Auditlog任务 629.9 Atlassian支持工具 629.10 角色 629.11 全局权限 629.12 密码策略 639.13 用户会话 639.14 记住我 639.15 白名单 639.16 时间追踪 639.17 问题链接 649.18 用户缺省设置 669.19 系统面板 669.20 外观 679.21 公告栏 679.22 导航栏 679.23 数据备份 679.24 数据恢复 679.25 项目导入 689.26 发件 689.27 收件 689.28 发送队列 699.29 发送邮件 699.30 共享过虑器 709.31 共享面板 709.32 索引 719.33 附件 719.34 事件 729.35 WebHooks 729.36 监听器 729.37 服务 729.38 插件数据存储 7310 插件介绍 7310.1 插件 7310.2 常用插件 7410.2.1. Scriptrunner 7410.2.2. timesheet 7510.2.3. JIRASuiteUtilities 75
2023/10/3 10:09:10 2.93MB jira
1
辣鸡网站怎么把资源都涨价到35了,改回来谷歌机翻+个人修正的usermanul,感兴趣可以看看目录Initializingthedriver62DW1000的概述132.1简介132.2连接到DW1000132.2.1SPI接口13.2.1.1SPI工作模式132.2.2中断162.2.3通用I/O172.2.4SYNC引脚172.3DW1000操作状态172.3.1状态图172.3.2主要运行状态概述172.4上电复位(POR)192.5上电时的默认配置212.5.3默认发射机配置T222.5.4默认接收器配置222.5.5应该修改的默认配置233消息传输263.1基本传输263.2传输时间戳273.3延迟传输283.4扩展长度数据帧293.5高速传输303.5.1TX缓冲区偏移索引303.5.2发送或接收TX缓冲区时写入314讯息接收334.1基本接收334.1.1前导码检测334.1.2前导码累积344.1.3SFD检测354.1.4PHR解调354.1.5数据解调354.1.6RX消息时间戳364.2延迟接收364.3双接收缓冲器374.3.1启用双缓冲操作374.3.2控制正在访问哪个缓冲区374.3.3双缓冲的操作384.3.4使用双缓冲时的TRXOFF404.3.5超限404.4低功耗侦听414.4.1配置低功率监听424.5低功耗SNIFF模式424.5低功耗SNIFF模式434.5.1SNIFF模式434.5.2低占空比SNIFF模式444.7.1估算第一条路径的信号功率454.7.2估算接收信号功率465MediaAccessControl(MAC)hardwarefeatures475.1循环冗余校验475.2帧过滤475.2.1帧过滤规则485.2.2帧过滤注意事项495.3自动确认495.3.2自动接收器重新启用515.3.3自动ACK周转时间515.3.4帧挂起位FramePendingbit515.3.5主机通知515.4发送并自动等待响应526DW1000的其他功能526.1外部同步526.1.1一次性时基复位(OSTR)模式526.1.2单发发送同步(OSTS)模式536.1.3一次接收同步(OSRS)模式536.2外部功率放大556.3使用片上OTP存储器556.3.1OTP存储器映射556.3.2将值编程到OTP存储器中576.3.3从OTP内存中读取一个值586.4测量IC温度和电压5810附录1:IEEE802.15.4UWB物理层5910.1框架结构概述5910.2数据调制方案5910.3同步头调制方案6010.4PHY头6110.5UWB信道和前导码6210.6标准的其他细节6211附录2:IEEE802.15.4MAC层6211.1一般MAC消息格式6311.2MAC报头中的帧控制字段6311.2.1帧类型字段Frametypefield6411.2.2启用安全性字段SecurityenabledField6411.2.3帧未决字段Framependingfield6411.2.4确认请求字段Acknowledgementrequestfield6511.2.5PANID压缩字段PANIDcompressionfield6511.2.6目标寻址模式字段Destinationaddressingmodefield6511.2.7帧版本字段Frameversionfield6611.2.8源寻址模式字段Sourceaddressingmodefield6611.3序号字段TheSequenceNumberfield6611.4DW1000中的MAC级处理66
2023/10/2 6:23:34 3.91MB DW1000 USER MANUL
1
2020年3月447897条,最新手机归属地数据库,号码归属地数据库,TXT、Exel两种格式。
自己买的,花了钱。
包括最新的165、166、167、173、177、195、198、199、172、178、198、175、176。
其他格式的资源,新的资源在网沾http://qq.cr/m的最下面找到链接。
2023/9/24 13:41:58 15.12MB 归属地 手机号 查询 最新
1
餐饮管理系统一、需求分析随着社会服务行业的发展,餐饮业对自身服务的质量和能力也有了更高的要求。
餐饮管理系统正是在这样的情况之下越来越受到重视。
餐厅的内部服务项目众多,既需要完成前台的服务工作,还需要完成后台的管理工作,如果没有一套可靠的餐饮管理系统,单凭手工操作,不仅效率低,而且会极大地影响到酒店的服务质量。
设计的目标:实现餐饮管理的科学化、自动化,提高各个模版的办公效率,为高质量的餐饮服务提供保证。
系统功能概述民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。
经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。
众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是计算机管理。
传统的手工操作管理存在着许多无法避免的问题,例如:人工计算机账单金额出现差错;
收银工作中跑单、漏单、偷钱现象普遍;
个别服务员作弊、改单、宰客情形时有发生;
客人消费单据难以保存和查询。
如果借助计算机来管理,就可以轻松的解决处理这些问题。
一个餐饮管理信息系统应该包括基本的餐厅的服务管理、管理人员信息的维护等,以及与之相应的操作。
所以整个餐饮管理信息系统分为两个大部分,即后台的数据管理维护和前台的操作。
后台数据库的管理能保证系统各项功能正常运行,前台操作能提供给客户尽可能方便快捷的服务。
功能模块划分1. 前台操作系统订餐管理模块:点菜(输入桌台代码和食物代码)、加菜、下单。
结账管理模块:结账(输入桌台代码)、结账方式选择(包括现金结账、信用卡结账、支票结账、签单等)。
交班管理模块:统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作作准备。
2. 后台管理维护系统用户权限设置:可以查询员工的基本资料(姓名、性别、年龄、出生年月、籍贯、家庭住址等),员工登录名称、密码、员工操作权限等,可以根据需要进行设置。
菜谱设置:新菜单录入(包括菜式名称、代码、类型、价格、成本等)、菜式修改、删除等菜式维护。
付款方式设置:分为人民币付款、信用卡、支票签单等,可以根据需要进行添加和删除。
系统流程分析系统流程图1所示。
当用户进入系统主界面以后,新用户经过注册后才能凭借其用户名和密码登录,老用户可以直接登录。
用户登录以后,系统自动判断出其操作权限。
操作权限包括普通员工和管理人员。
新用户的操作权限默认为是普通员工。
普通员工只能进行订餐、结账操作,而管理人员除此之外还可以进行系统设置与营业分析。
•图1当有顾客订餐的时候,员工输入桌台号和食物代码即可进行点菜,在结账以前,加菜是允许的。
当顾客结账的时候,员工输入桌台号,选择顾客的付款方式,即可完成结账。
在下班时间,员工可以统计当班期间的消费情况。
这样,员工注销此次登录,退出系统,一天的工作就到此结束。
管理人员可以随时进行系统设置,包括菜谱设置、用户权限设置、付款方式设置等。
功能模块调用餐饮管理系统调用了以下功能模块:用户注册模块、用户登录模块、数据显示模块。
二、概念设计图2给出了餐饮管理系统的E-R实体关系图。
收银员、餐桌、菜单三者之间的关系是订餐,其中订餐关系包括的属性有:餐桌编号、菜肴编号、菜肴名称、菜肴单价、菜肴数量、菜肴价格、菜肴折扣、是否结账、结账时间。
三、逻辑设计将E-R关系模型转化为二维表。
本系统主要需要6个表,分别为用户信息表(UserInfo)、菜谱信息表(MenuInfo)、订餐信息表(OrderInfo)、桌台信息表(DeskInfo)、付款方式表(PayModeInfo)、当班统计表(CaldayInfo),各个表中字段的类型以及说明如表1-表6所示。
表1用户信息表表2菜谱信息表表3订餐信息表表4桌台信息表表5付款方式表表6当班统计表其中,用户信息表主要存储用户的基本信息,权限项决定了用户的操作权限。
菜谱信息表存储食物的基本信息。
价格项为结账与结算提供依据。
桌台信息表存储各个桌台的消费情况,如消费金额、是否结账等。
订餐信息表存储各个桌台的点菜情况。
付款方式表存储了基本的付款方式,供结账时选择。
当班统计表存储员工当班期间的营业情况。
四、数据库设计数据库管理系统采用MicrosoftSQLServer2000作为后台数据库。
首先,在企业管理器中建立一个名为MenuManageSys的数据库,然后建立以上6个数据库表,并设定主键、长度。
这样,数据库的设计已经完成。
五、详细设计本餐饮管理系统采用VisualC+++SQLServer来开发。
利用ADO技术调用后台数据库,使用了两个ADO智能指针_ConnectionPtr和_RecordsetPtr,其中_ConnectionPtr用来连接后台SQLServer数据库,_RecordsetPtr指针用来对数据库的表中的记录集进行操作。
工程使用的是基于对话框的程序,每个对话框为一个类,父类为CDialog,实现的一些功能都封装在类的函数中,体现了面向对象编程语言C++的特性。
导入ADO接口:在工程的stdafx.h文件里直接引入符号#import引入ADO库文件,加入下面一行代码,以使编译器能正确编译:#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")用_ConnectionPtr指针连接数据库:在CmenuManageSysApp类的BOOLInitInstance()函数中加入以下代码:m_pConnection.CreateInstance("ADODB.Connection"); try { m_pConnection->ConnectionTimeout=8; m_pConnection->PutCursorLocation(adUseClient);m_pConnection->Open("driver={SQLServer};Server=172.29.130.47;DATABASE=MenuManageSys;UID=;PWD=","","",adModeUnknown); } catch(_com_errore) { AfxMessageBox("数据库连接失败!"); returnFALSE; }1.设计工程框架餐饮管理系统的框架是一个对话框类型的操作界面,用户注册、登录后,可对餐饮管理的各个功能模块进行操作。
1.1设置主界面系统主界面如图3:图3每个事件的对应代码如下:(1) 单击“注册”菜单,弹出“注册”对话框,代码如下:voidCMenuManageSysDlg::OnRegister(){ CRegisterDlgdlg(this); dlg.DoModal();}(2) 单击“登录”菜单,弹出“登录”对话框,代码如下:voidCMenuManageSysDlg::OnLogin(){ CLoginDlgdlg(this); dlg.DoModal();}(3) 单击“订餐”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdateOrderSystem(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(4) 如果用户已经登录,弹出“餐桌信息”对话框,否则提示用户登录,代码如下:voidCMenuManageSysDlg::OnOrderSystem(){ CDeskDlgdlg; dlg.DoModal();}(5) 单击“结账”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdatePayCheck(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(6) 如果用户已经登录,弹出“结账”对话框,否则提示用户先登录,代码如下:voidCMenuManageSysDlg::OnPayCheck(){ CPayDlgdlg; dlg.DoModal();}(7) 单击“下班”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdateChangeDuty(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(8) 如果用户已经登录,弹出“交接班”对话框,否则提示用户先登录,代码如下:voidCMenuManageSysDlg::OnChangeDuty(){ COffdutyDlgdlg; dlg.DoModal();}(9) 单击“用户权限设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdateSetLevel(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行用户级别设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } }(10) 如果权限是管理人员,弹出“权限设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnSetLevel(){ CLevelDlgdlg; dlg.DoModal();}(11) 单击“菜谱设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdateSetMenu(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行菜谱设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } }(12)如果权限是管理人员,弹出“菜谱设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnSetMenu(){ CMenuSetDlgdlg; dlg.DoModal();}(13)单击“付款方式设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdatePaymodeSet(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行付款方式设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(14)如果权限是管理人员,弹出“设置付款方式”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnPaymodeSet(){ CSetPaymodeDlgdlg; dlg.DoModal();}(15)单击“注销”菜单,提示用户本次登录已注销,代码如下:voidCMenuManageSysDlg::OnLogout(){ if(MessageBox("您确定要注销吗","注销询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { theApp.m_Level=-1; AfxMessageBox("本次登录已注销"); }}(16)单击“退出系统”,在确定退出后,关闭系统,代码如下:voidCMenuManageSysDlg::OnExitSystem(){ if(MessageBox("真的要退出系统吗","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { CDialog::OnOK(); }}1.2设计注册模块注册模块如图4:图4注册模块在输入了完整的信息,按下“确定”按钮后,如果没有重复用户,则注册成功,代码如下:voidCRegisterDlg::OnRegisterBtn(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);if(!m_strUserName.IsEmpty()&&!m_strUserNative.IsEmpty()&&!m_strUserAdddress.IsEmpty()&&!m_strUserPwd.IsEmpty()&& !m_strUserPwdAgain.IsEmpty()&&!m_strUserNum.IsEmpty()&&m_nUserAge!=0) { if(m_strUserPwd.CompareNoCase(m_strUserPwdAgain)!=0) { MessageBox("密码有误,请重新输入密码。
","系统注册"); } else { try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMUserInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_errore) { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->AddNew(); m_pRecordset->PutCollect("UserName",_variant_t(m_strUserName)); m_pRecordset->PutCollect("UserPwd",_variant_t(m_strUserPwd)); m_pRecordset->PutCollect("UserNative",_variant_t(m_strUserNative)); m_pRecordset->PutCollect("UserAddress",_variant_t(m_strUserAdddress)); m_pRecordset->PutCollect("UserNum",_variant_t(m_strUserNum)); CStringstr; if(m_nUserSex==0) { m_pRecordset->PutCollect("UserSex",_variant_t("男")); } elsem_pRecordset->PutCollect("UserSex",_variant_t("女")); str.Format("%d",m_nUserAge); m_pRecordset->PutCollect("UserAge",_variant_t(str)); str.Format("%d",0); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_pRecordset->Close(); m_pRecordset=NULL; MessageBox("恭喜您注册成功","系统注册"); CDialog::OnOK(); return; } } else { MessageBox("请输入完整注册信息","系统注册"); } }登录模块如图5:图5登录模块输入完整信息,并单击“确定”按钮后,如果用户名不存在,则重新输入;
如果密码错误,则重新输入,在重新输入三次密码后还不正确,则退出登录界面,登录失败。
代码如下:voidCLoginDlg::OnOK(){ UpdateData(TRUE); if(!m_strUserName.IsEmpty()&&!m_strPassword.IsEmpty()) { try { CStringsql,str; // str.Format("%d",m_nUserNum); sql="SELECT*FROMUserInfoWHEREUserName='"+m_strUserName+"'andUserNum='"+m_strUserNum+"'andUserPwd='"+m_strPassword+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { m_pRecordset->Close(); sql="SELECT*FROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { MessageBox("此用户不存在!","登录系统"); } else { if(count>=2) { MessageBox("登录次数过多,系统关闭","系统登录错误",MB_OK|MB_ICONWARNING); CDialog::OnOK(); } else { MessageBox("密码错误!","登录系统"); count++; } return; } } catch(_com_errore)///捕捉异常 { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } } else { theApp.m_Level=m_pRecordset->GetCollect("UserLevel").lVal; theApp.m_name=m_strUserName; MessageBox("登录成功!","登录系统",MB_OKCANCEL|MB_ICONQUESTION); CDialog::OnOK(); return; } } catch(_com_errore)///捕捉异常 { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->Close(); m_pRecordset=NULL; } else { MessageBox("请输入用户名和密码","登录系统"); }}到此,注册模块与登录模块就设计完成。
新用户注册以后,凭借其用户名和密码可以登陆,从而对系统进行操作。
3.功能模块设计根据功能模块划分,可以将餐饮管理系统的功能模块划分为值班员管理模块、菜谱管理模块、用户管理模块、订餐模块、结账模块,下面对工程各个功能进行介绍。
3.1订餐模块设计订餐模块的功能是员工输入桌台号码和食物代码进行点菜、根据需要加菜、下单。
订餐模块如图6所示:图6订餐模块为对话框类添加3个数据集对象:_RecordsetPtrm_pRecordset_Desk;_RecordsetPtrm_pRecordset_Order;_RecordsetPtrm_pRecordset_Menu;对话框类的各成员函数的代码如下:CDeskDlg::CDeskDlg(CWnd*pParent/*=NULL*/):CDialog(CDeskDlg::IDD,pParent){ //{{AFX_DATA_INIT(CDeskDlg) m_nOrderDeskNumber=0; m_nOrderFoodNumber=0; m_nOrderFoodRebate=100; m_nOrderFoodAcount=1; //}}AFX_DATA_INIT}BOOLCDeskDlg::OnInitDialog()//对话框初始化函数{ CDialog::OnInitDialog(); GetDlgItem(IDOK)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCDeskDlg::OnOrderBtn()//点菜消息按钮{ UpdateData(TRUE); CStringstr; CStringsql; if(m_nOrderDeskNumber==0) { AfxMessageBox("请输入餐桌编号"); return; } if(m_nOrderFoodNumber!=0) { str.Format("%d",m_nOrderFoodNumber); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset_Menu.CreateInstance("ADODB.Recordset"); m_pRecordset_Menu->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Menu->GetRecordCount()==0) { AfxMessageBox("该菜肴编号不存在,请重新输入编号"); return; } else { intm_nTempPrice; CStringm_strTempName; m_nTempPrice=m_pRecordset_Menu->GetCollect("FoodPrice").lVal;//食物价格 m_strTempName=m_pRecordset_Menu->GetCollect("FoodName").bstrVal;//食物名称 m_pRecordset_Menu->Close(); str.Format("%d",m_nOrderDeskNumber);//桌子编号 sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset_Order->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Order->PutCollect("DeskNum",_variant_t(str));//餐桌编号 str.Format("%d",m_nOrderFoodNumber); m_pRecordset_Order->PutCollect("FoodNum",_variant_t(str));//食物编号 str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodSignalPrice",_variant_t(str));//食物单价 str.Format("%d",m_nOrderFoodAcount); m_pRecordset_Order->PutCollect("FoodAcount",_variant_t(str));//食物数量 m_nTempPrice*=m_nOrderFoodAcount; str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodPrice",_variant_t(str));//食物价格 str.Format("%d",m_nOrderFoodRebate); m_pRecordset_Order->PutCollect("FoodRebate",_variant_t(str));//食物折扣 intm_nTempRePrice; m_nTempRePrice=(int)m_nTempPrice*m_nOrderFoodRebate/100; str.Format("%d",m_nTempRePrice); m_pRecordset_Order->PutCollect("FoodRePrice",_variant_t(str)); //折后价格(小计) m_pRecordset_Order->PutCollect("FoodName",_variant_t(m_strTempName));//食物名称 intm_nTempCheck; m_nTempCheck=0; str.Format("%d",m_nTempCheck); m_pRecordset_Order->PutCollect("FoodCheck",_variant_t(str));//是否结帐 CStringpaytime; CTimenow=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d%H:%M:%S")); m_pRecordset_Order->PutCollect("FoodTime",_variant_t(paytime));//点菜时间 m_pRecordset_Order->Update(); m_pRecordset_Order->Close(); str.Format("%d",m_nOrderDeskNumber); CStringstr1; str1.Format("%d",0); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"andFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2); m_dbFood.Refresh(); GetDlgItem(IDOK)->EnableWindow(TRUE); } } else { AfxMessageBox("请输入菜肴编号"); return; } }voidCDeskDlg::OnOK()//下单消息按钮{ CStringstr,sql,str1; intm_nTempRePrice; m_nTotalPrice=0; while(!m_pRecordset_Order->adoEOF) { m_nTempRePrice=m_pRecordset_Order->GetCollect("FoodRePrice").lVal; m_nTotalPrice+=m_nTempRePrice; m_pRecordset_Order->MoveNext(); } if(m_nTotalPrice>0) { inttemp=0; str1.Format("%d",temp); str.Format("%d",m_nOrderDeskNumber); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"andDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()==0) { m_pRecordset_Desk->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Desk->PutCollect("DeskNum",(_variant_t)str); str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); temp=0; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); } else { str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); } CDialog::OnOK();}voidCDeskDlg::OnUpdateOrderDeskNumber()//根据餐桌号自动将原来已点的食物信息绑定到数据列表{ UpdateData(TRUE); CStringstr,sql; str.Format("%d",m_nOrderDeskNumber); CStringstr1; inttemp=0; str1.Format("%d",temp); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"andFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2); m_dbFood.Refresh(); }3.2结账模块设计结账模块的功能是员工输入桌台代码进行结账、选择结账方式(包括现金结账、信用卡结账、支票结账、签单等)、自动找零。
结账模块如图7所示:图7结账模块为对话框类添加3个数据集对象,代码如下: _RecordsetPtrm_pRecordset_Paymode; _RecordsetPtrm_pRecordset_Order; _RecordsetPtrm_pRecordset_Desk;对话框类的各成员函数的代码如下:CPayDlg::CPayDlg(CWnd*pParent/*=NULL*/) :CDialog(CPayDlg::IDD,pParent){ //{{AFX_DATA_INIT(CPayDlg) m_strPaymode=_T(""); m_strPayUserName=_T(""); m_nPayDeskNumber=0; m_nPayTotalPrice=0; m_nPayRealPrice=0; m_nPayRePrice=0; m_timePay=COleDateTime::GetCurrentTime(); //}}AFX_DATA_INIT}BOOLCPayDlg::OnInitDialog()//对话框初始化函数{ CDialog::OnInitDialog(); m_strPayUserName=theApp.m_name; CStringsql; sql="SELECT*FROMPayModeInfo"; m_pRecordset_Paymode.CreateInstance("ADODB.Recordset"); m_pRecordset_Paymode->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Paymode->GetRecordCount()!=0) { while(!m_pRecordset_Paymode->adoEOF) { m_coPaymode.AddString((LPCTSTR)(_bstr_t)m_pRecordset_Paymode->GetCollect("NAME")); m_pRecordset_Paymode->MoveNext(); } m_pRecordset_Paymode->Close(); m_coPaymode.SetCurSel(0); } UpdateData(FALSE); returnTRUE;}voidCPayDlg::OnUpdatePayDeskNumber()//自动将对应桌号的点菜信息以及消费情况显示在桌面上{ UpdateData(TRUE); CStringsql,str,str1; inttemp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"ANDDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()!=0) { m_nPayTotalPrice=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } m_pRecordset_Desk->Close(); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"ANDFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPay.SetRefDataSource(NULL); m_dbPay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbPay.SetColumnHeaders(1); m_dbPay.Refresh(); UpdateData(FALSE);}voidCPayDlg::OnUpdatePayRealprice()//根据实收金额自动计算找零金额{ UpdateData(TRUE); m_nPayRePrice=m_nPayRealPrice-m_nPayTotalPrice; UpdateData(FALSE);}voidCPayDlg::OnOK()//确定按钮消息函数,将数据写回DESK表和ORDER表,结账完成{ UpdateData(TRUE); if(!m_strPaymode.IsEmpty()&&m_nPayRealPrice!=0) { CStringsql,str,str1; inttemp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"ANDDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount!=0) { temp=1; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); intselmode; selmode=m_coPaymode.GetCurSel(); m_coPaymode.GetLBText(selmode,m_strPaymode); m_pRecordset_Desk->PutCollect("DeskPaymode",_variant_t(m_strPaymode)); CStringpaytime; CTimenow=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d%H:%M:%S")); m_pRecordset_Desk->PutCollect("DeskDateTime",(_variant_t)paytime); m_pRecordset_Desk->PutCollect("DeskName",(_variant_t)m_strPayUserName); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); str.Format("%d",m_nPayDeskNumber); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"ANDFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Order->GetRecordCount()!=0) { temp=1; str.Format("%d",temp); while(!m_pRecordset_Order->adoEOF) { m_pRecordset_Order->PutCollect("FoodCheck",(_variant_t)str); m_pRecordset_Order->Update(); m_pRecordset_Order->MoveNext(); } } m_pRecordset_Order->Close(); str.Format("%d",m_nPayDeskNumber); str+="号桌已结账"; AfxMessageBox(str); CDialog::OnOK(); } else { AfxMessageBox("请输入完整信息"); }}到此,结账模块已经设计完成。
3.3交接班模块设计交接班模块的功能是管理员统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作做准备。
交接班模块如图8所示:图8交接班模块为对话框类添加两个数据集对象,代码如下:_RecordsetPtrm_pRecordset_Off;_RecordsetPtrm_pRecordset_Desk;对话框类的各成员函数的代码如下:COffdutyDlg::COffdutyDlg(CWnd*pParent/*=NULL*/) :CDialog(COffdutyDlg::IDD,pParent){ //{{AFX_DATA_INIT(COffdutyDlg) m_strDayName=_T(""); m_nTotalAcount=0; m_timeDay=0; //}}AFX_DATA_INIT}BOOLCOffdutyDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); m_timeDay=CTime::GetCurrentTime(); m_strDayName=theApp.m_name; UpdateData(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCOffdutyDlg::OnCalDayBtn()//统计按钮,负责当班统计{ CStringsql,str; inttemp=1; str.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskCheck="+str+"ANDDeskName='"+m_strDayName+"'"; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); intrenminbi_jine=0,qita_jine=0,total_jine=0,acount=0; if(m_pRecordset_Desk->GetRecordCount!=0) { while(!m_pRecordset_Desk->adoEOF) { str=m_pRecordset_Desk->GetCollect("DeskPaymode").bstrVal; if(str.CompareNoCase("人民币")==0) { renminbi_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } else { qita_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } acount++; m_pRecordset_Desk->MoveNext(); } } m_pRecordset_Desk->Close(); total_jine=renminbi_jine+qita_jine; m_pRecordset_Off.CreateInstance("ADODB.Recordset"); m_pRecordset_Off->Open("SELECT*FROMCalDayInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Off->GetRecordCount!=0) { while(!m_pRecordset_Off->adoEOF) { m_pRecordset_Off->Delete(adAffectCurrent); m_pRecordset_Off->Update(); m_pRecordset_Off->MoveNext(); } } m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("人民币")); str.Format("%d",renminbi_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("其他")); str.Format("%d",qita_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("合计")); str.Format("%d",total_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_dbTotalDay.SetRefDataSource(NULL); m_dbTotalDay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Off); m_dbTotalDay.SetColumnHeaders(2); m_dbTotalDay.Refresh(); m_pRecordset_Off->Update(); m_nTotalAcount=acount; UpdateData(FALSE);}3.4用户权限管理模块设计用户权限模块的功能是方便管理人员查询员工的基本资料,设置员工的操作权限。
用户权限设置模块的设计如图9:图9权限设置模块对话框类的各成员函数的代码如下:CLevelDlg::CLevelDlg(CWnd*pParent/*=NULL*/) :CDialog(CLevelDlg::IDD,pParent){ //{{AFX_DATA_INIT(CLevelDlg) m_strUserName=_T(""); m_strUserNum=_T(""); m_strLevelSelect=_T(""); //}}AFX_DATA_INIT}BOOLCLevelDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_coLevelSelect.AddString("管理员"); m_coLevelSelect.AddString("用户"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); UpdateData(FALSE); CStringsql; sql="SELECT*FROMUserInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCLevelDlg::OnChange(){ GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(TRUE); GetDlgItem(IDC_CONFIRM)->EnableWindow(TRUE); UpdateData(TRUE); CStringsql; sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh();}voidCLevelDlg::OnConfirm(){ UpdateData(TRUE); if(!m_strLevelSelect.IsEmpty()) { if(m_strLevelSelect.CompareNoCase("管理员")==0) { CStringstr,sql;inttemp=1; str.Format("%d",temp); sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } else { CStringstr,sql;inttemp=0; str.Format("%d",temp); sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } } else { AfxMessageBox("请选择权限"); }}voidCLevelDlg::OnShowAll(){ CStringsql; sql="SELECT*FROMUserInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE);}至此,权限设置模块设计完成。
3.5菜谱管理模块设计菜谱管理模块的功能是管理人员进行新菜式的录入、菜式修改、删除等菜式维护。
菜谱管理模块如图10:图10菜单管理模块对话框类的各成员函数的代码如下:CMenuSetDlg::CMenuSetDlg(CWnd*pParent/*=NULL*/) :CDialog(CMenuSetDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMenuSetDlg) m_nInputNum=0; m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); //}}AFX_DATA_INIT}BOOLCMenuSetDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCMenuSetDlg::OnUpdateEditInputNum(){ UpdateData(TRUE); if(m_nInputNum!=0) { GetDlgItem(IDC_INQUIRY)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); }}voidCMenuSetDlg::OnInquiry()//查询{ UpdateData(TRUE); CStringsql,str; str.Format("%d",m_nInputNum); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { m_nInputNum=0; m_nNum=m_pRecordset->GetCollect("FoodNum").lVal; m_strName=m_pRecordset->GetCollect("FoodName").bstrVal; m_strType=m_pRecordset->GetCollect("FoodType").bstrVal; m_nPrice=m_pRecordset->GetCollect("FoodPrice").lVal; m_nCost=m_pRecordset->GetCollect("FoodCost").lVal; m_strRemark=m_pRecordset->GetCollect("FoodRemark").bstrVal; GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(TRUE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } else { // m_nInputNum=0; AfxMessageBox("您所查找的菜肴不存在"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } UpdateData(FALSE);}voidCMenuSetDlg::OnAddNew()//新增{ m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); GetDlgItem(IDC_ADDSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); UpdateData(FALSE);}voidCMenuSetDlg::OnAddSave()//保存所增加项{ UpdateData(TRUE); if(m_nCost!=0&&m_nNum!=0&&m_nPrice!=0&&!m_strName.IsEmpty()&&!m_strRemark.IsEmpty()&&!m_strType.IsEmpty()) { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); CStringstr,sql; str.Format("%d",m_nNum); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { AfxMessageBox("菜肴号码已存在"); } else { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMMenuInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_nNum==0) { AfxMessageBox("菜肴号码不能为0"); return; } else { m_pRecordset->AddNew(); str.Format("%d",m_nNum); m_pRecordset->PutCollect("FoodNum",_variant_t(str)); m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); m_pRecordset->Close(); AfxMessageBox("已保存"); m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); UpdateData(FALSE); } } } elseAfxMessageBox("请输入完整信息");}voidCMenuSetDlg::OnModify()//修改{ GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); m_nCost=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); UpdateData(FALSE);}voidCMenuSetDlg::OnModifysave()//保存修改{ UpdateData(TRUE); if(!m_strType.IsEmpty()&&m_nPrice!=0&&m_nCost!=0&&!m_strRemark.IsEmpty()) { CStringstr,sql; str.Format("%d",m_nNum); // m_pRecordset->PutCollect("FoodNum",_variant_t(str)); // m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); AfxMessageBox("修改成功"); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } else { AfxMessageBox("请输入完整信息"); }}voidCMenuSetDlg::OnDel(){ m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Close(); AfxMessageBox("删除成功"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE);}至此,菜谱管理模块设计完成。
3.6付款方式设置模块设计付款方式设置模块如图11:图11付款方式模块对话框类的各成员函数的代码如下:CSetPaymodeDlg::CSetPaymodeDlg(CWnd*pParent/*=NULL*/) :CDialog(CSetPaymodeDlg::IDD,pParent){ //{{AFX_DATA_INIT(CSetPaymodeDlg) m_strPaymode=_T(""); //}}AFX_DATA_INIT}BOOLCSetPaymodeDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); m_bAdd=FALSE; m_bDel=FALSE; m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); CStringsql; sql="SELECT*FROMPayModeInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCSetPaymodeDlg::OnPaymodeAddBtn()//单击按钮后,开始新增{ m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=TRUE; m_bDel=FALSE;}voidCSetPaymodeDlg::OnPaymodeDelBtn()//单击按钮后,开始删除{ m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=FALSE; m_bDel=TRUE;}voidCSetPaymodeDlg::OnOK()//确定添加或者删除{ UpdateData(TRUE); if(!m_strPaymode.IsEmpty()) { if(m_bAdd==TRUE) { CStringstr; BOOLflag=0; m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { MessageBox("您输入的付款方式已存在","输入错误",MB_OK|MB_ICONWARNING); flag=1; break; } elsem_pRecordset->MoveNext(); } /* CStringsql; sql="SELECT*FROMPayModeInfoWHERENAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()==0) { MessageBox("您输入的付款方式已存在","输入错误",MB_OK|MB_ICONWARNING); flag=1; } */ if(flag==0) { m_pRecordset->MoveLast(); m_pRecordset->AddNew(); m_pRecordset->PutCollect("NAME",_variant_t(m_strPaymode)); m_pRecordset->Update(); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bAdd=FALSE; } } if(m_bDel==TRUE) { BOOLflag=0; UpdateData(TRUE); CStringstr; intnewid; /* m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); break; } else m_pRecordset->MoveNext(); } */ CStringsql; sql="SELECT*FROMPayModeInfoWHERENAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMPayModeInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bDel=FALSE; } if(flag==0) { MessageBox("您输入的付款方式不存在,请查询后确认","输入错误",MB_OK|MB_ICONWARNING); } m_dbPaymode.Refresh(); m_bDel=FALSE; } m_editPaymode.SetWindowText(""); m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); } else { AfxMessageBox("请输入付款方式"); }}至此,付款方式设置模块设计完成。
六、系统演示系统设计并编写完成后,编译运行程序,初始界面如图12所示:图121. 系统登录单击“登录”菜单,弹出登录界面,在登陆界面输入框中分别输入用户编号、用户名和密码,如图13所示。
如果用户名和密码都正确,那么就可以登陆系统,系统提示如图14所示。
图13图14如果用户名不存在或密码输入不正确,系统提示如图15和图16所示,将无法进入系统。
图15图16如果未登录就进行其他操作,系统提示如图17所示。
只有登录后才能操作其他功能。
单击“注册”菜单,弹出注册对话框如图18所示。
按要求填写完注册信息,如果注册名未被注册,并且前后两次输入的密码一致,那么系统给出如图19所示提示。
如果前后两次输入密码不一致,系统给出如图20所示提示,此时注册不成功。
图19图202.订餐操作系统登录后,单击“订餐”菜单,弹出“餐桌信息”对话框,如图21所示。
餐桌第一次订餐时,输入餐桌编号、食物编号、数量以及折扣,单击“点菜”按钮,在右侧点菜信息栏中列举了该餐桌所点的菜肴,如图22所示。
图21图22如果餐桌已经订过餐,但是还没有结账,则在餐桌编号输入框输入餐桌号,在点菜信息栏中显示该桌已点的菜。
单击“下单”按钮,即可把点菜信息记录下来。
3.结账操作单击“结账”菜单,弹出“结账单”对话框。
输入桌台号,自动显示对应的点菜信息以及消费金额。
选取付款方式和实收金额后,界面会自动显示找零金额,结果如图23所示。
图234.用户权限设置单击“管理”|“用户权限设置”,弹出“权限设置”对话框,如图24所示,所有用户的信息都显示在数据列表中。
输入要查询的用户编号和名称,单击“更改”,该用户的信息就显示在列表中,结果如图25所示。
图24图25选择权限,单击确定后,如图26所示,用户权限已被修改。
图26单击“显示全部”,结果如图27所示。
图275.菜谱管理单击“管理”|“菜谱设置”菜单,弹出“菜谱设置”对话框,如图28所示。
图28在“菜谱设置”对话框中可以对菜谱进行查找、添加、删除、修改等操作。
6.付款方式设置单击“管理”|“付款方式设置”菜单,弹出“付款方式”对话框,如图29所示。
单击“新增”或“删除”按钮,显示新增付款方式文本框和“确定”按钮,如图30所示。
图29图30在文本框中输入要增加/删除的付款方式,并单击“确定”按钮,将新增或删除所选择的付款方式。
7.注销用户单击“注销”菜单,弹出“注销询问”对话框如图31所示。
选择“确定”,注销成功,如图32所示。
图31图328.系统退出单击“退出系统”菜单,弹出“退出询问”对话框如图33所示。
选择“确定”,则系统退出。
图33至此,系统的全部功能已经演示完毕。
七、结束语经过两个多星期的时间,终于完成了本系统的设计。
虽然本系统有一些漏洞和不完善的地方,但是本系统结合餐饮管理的实际情况,基于数据库设计通用的模块,对餐饮管理的前台和后台操作进行功能模块的设计,实现了餐饮管理的基本功能。
在设计的过程中,遇到了很多的技术上的问题。
例如,第一次接触ADO数据库访问技术,对用ADO来连接数据库不是很了解,出现了很多的问题,设计受到了很大的阻碍。
经过向专业指导老师请教和参阅了有关书籍后,终于把一些问题解决了。
在本次设计中,我懂得了“书到用时方恨少”的道理,发现了自己在专业方面还有很多要提高的地方,在今后的学习中,我一定努力进步!参考文献:[1]萨师煊,王珊.数据库系统概论[M]第3版.北京:高等教育出版社,2000[2]侯其锋,李晓华,李莎.VisualC++数据库通用模块开发与系统移植.北京:清华大学出版社,2007致谢在这次课程设计中,戴小鹏老师给了我很大的帮助。
他对我的精心指导和关心,使我在设计的过程中受到了很大的启发。
特别是他的那份耐心和责任心,使我在今后的学习和工作中受益匪浅。
在此,特向戴小鹏老师表示衷心的感谢!
2023/9/21 22:43:02 1.21MB 餐厅管理系统
1
共 36 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡