目录
在当今数字化时代,酒店管理系统的高效性和便捷性对于酒店行业的发展至关重要。本课题旨在设计一个功能完备、性能优越的酒店管理系统数据库,以满足酒店日常运营和管理的需求,提高酒店的服务质量和管理效率。
随着旅游业的蓬勃发展和人们生活水平的不断提高,酒店行业面临着日益激烈的竞争。传统的酒店管理方式已无法适应现代酒店的发展需求,亟需引入先进的信息技术来提升酒店管理水平。一个完善的酒店管理系统应具备房间管理、客户管理、预订管理、入住管理、营销推广管理等功能,同时还应保证数据的安全性、完整性和准确性。
本酒店管理系统的设计目标是为酒店提供一个全面、高效的信息化管理平台。系统将实现酒店房间的分类展示,包括热门推荐、豪华智能单人间、豪华双人间、主题三人间、景观间、豪华总统套房等多种房型,以满足不同客户的需求。同时,系统还将提供销量排行榜,展示双人间、三人间、单人间、总统套房、城市景观房等房间的销售情况,为酒店管理人员提供决策依据。
在营销推广管理方面,系统将上线入店须知等信息,帮助酒店更好地向客户传达相关规定和注意事项。此外,系统还将具备登录注册功能,用户可以通过注册账号登录系统,查看我的购物车、我的订单、个人信息等,并可以进行用户退出操作。对于房间列表,用户可以选择查看详情,了解房间的详细信息,如房间面积、配套设施等,并可以加入收藏,方便下次快速预订。
酒店销售系统的后台管理功能将为酒店管理人员提供便捷的管理工具。品牌分类管理功能可以帮助酒店对不同品牌的房间进行分类管理,方便进行市场定位和营销策略制定。房间展示管理功能可以让管理人员实时更新房间信息,确保客户获取到的信息准确无误。营销推广管理功能则可以帮助酒店制定和实施各种营销活动,提高酒店的知名度和销售额。销售订单管理功能可以对订单进行全面管理,包括订单的生成、修改、取消等操作,确保订单处理的高效性和准确性。用户维护管理功能可以对用户信息进行管理,包括用户的注册、登录、信息修改等操作,保证用户信息的安全和完整性。
为了实现上述功能,酒店管理系统数据库的设计至关重要。数据库应能够存储和管理酒店的各种信息,包括房间信息、客户信息、订单信息、营销信息等。同时,数据库还应具备良好的性能,能够快速响应系统的查询和更新请求,保证系统的稳定性和可靠性。
在设计数据库时,需要充分考虑数据的安全性和完整性。通过设置合理的用户权限和数据加密机制,确保只有授权用户能够访问和修改相关数据,防止数据泄露和篡改。同时,通过设置主键、外键等约束条件,保证数据的一致性和完整性,避免出现数据不一致的情况。
此外,数据库的设计还应考虑到系统的可扩展性和兼容性。随着酒店业务的不断发展,系统可能需要添加新的功能或模块,数据库应能够方便地进行扩展和升级,以满足系统的发展需求。同时,数据库还应兼容不同的操作系统和数据库管理系统,确保系统能够在不同的环境下稳定运行。
总之,本课题的研究对于提高酒店的管理效率和服务质量具有重要意义。通过设计一个完善的酒店管理系统数据库,能够为酒店提供更加便捷、高效的管理工具,帮助酒店更好地满足客户需求,提升市场竞争力。在后续的章节中,将详细介绍需求分析、数据库结构设计、物理设计、实施与测试、运行维护等方面的内容,确保系统的顺利开发和运行。
本酒店管理系统旨在提供全面的酒店运营管理功能,包括房间管理、用户管理、订单管理、购物车管理、公告管理等,以满足酒店日常运营的需求,提高管理效率和服务质量。
注册:新用户注册需要提供用户名、密码、确认密码、姓名、地址、手机等信息。
登录:用户使用用户名和密码登录系统。
个人信息管理:用户登录后可以查看和修改个人信息,如姓名、地址、手机等。
房间分类展示:系统展示酒店的房间分类,包括豪华智能单人间、豪华双人间、主题三人间、观景间、豪华总统套房等。
房间信息展示:每个房间类型包含详细信息,如房间图片、描述、价格、可住人数、床位数等。
房间状态管理:系统实时更新房间的状态,包括可预订、已预订、已入住等。
订单生成:用户在购物车中确认预订信息后,系统生成订单,记录订单号、用户ID、房型ID、预订人姓名、身份证号、手机号、入住日期、退房日期等信息。
订单状态管理:订单状态包括未处理、已处理等,酒店管理人员可以根据订单状态进行相应的操作。
订单查询:用户和酒店管理人员可以查询订单详情,包括订单状态、订单信息等。
添加到购物车:用户可以将感兴趣的房间添加到购物车。
购物车操作:用户在购物车中可以查看已添加的房间信息,包括房间类型、价格、数量等,并可以修改数量或删除不需要的房间。
公告发布:酒店管理人员可以发布公告,如入店须知、酒店销售系统上线等信息。
公告展示:系统展示公告的标题、内容、发布时间等信息。
用户登录信息(用户名、密码)进行加密存储,确保用户信息的安全。
设置用户角色和权限,限制不同用户对系统功能的访问和操作。
数据库表设置主键(如t_dingdan表的id、t_fenlei表的id、t_gonggao表的id、t_gouwuche表的id、t_product表的id、t_user表的id、t_xiadingdan表的id),确保数据的唯一性和完整性。
建立外键关联(如t_dingdan表的userid与t_user表的id关联),保证数据的一致性。
系统应能够快速响应用户的操作请求,特别是在订单处理、房间查询等关键业务场景中,保证响应时间在可接受范围内。
优化数据库索引,提高数据查询和更新的效率。
确保用户输入的数据准确无误,通过数据验证和校验机制,防止错误数据的录入。
保证订单信息、房间信息等数据的准确性和一致性。
系统应兼容主流的操作系统和浏览器,确保用户能够正常使用系统。
用户在系统界面输入用户名、密码、确认密码、姓名、地址、手机等信息进行注册,系统验证信息合法性后将用户信息存储到t_user表中。
用户登录时,输入用户名和密码,系统从t_user表中查询用户信息进行验证,验证通过后允许用户登录。
用户在房间列表中选择感兴趣的房间,查看详情后将房间添加到购物车(t_gouwuche表)。
用户在购物车中确认订单,填写预订人相关信息,系统生成订单并存储到t_dingdan表中。
酒店管理人员在后台查询订单,确认后更新订单状态和房间状态。
客人到达酒店后,酒店管理人员查询客人订单信息,为客人办理入住手续,系统记录入住信息并更新房间状态。
酒店管理人员在系统中编辑公告信息(标题、内容、发布时间等),发布后存储到t_gonggao表中。
系统将公告信息展示给用户。
字段:id、username、password、xingming、role、dianhua、dizhi。
数据类型:id(INT)、username(VARCHAR)、password(VARCHAR)、xingming(VARCHAR)、role(INT)、dianhua(VARCHAR)、dizhi(VARCHAR)。
约束条件:id为主键,自动递增;username、password、xingming非空。
字段:id、status、userid、xingming、dianhua、dizhi、xiangqing、orderid、beizhu、shijian、zongjia。
数据类型:id(INT)、status(VARCHAR)、userid(INT)、xingming(VARCHAR)、dianhua(VARCHAR)、dizhi(VARCHAR)、xiangqing(TEXT)、orderid(VARCHAR)、beizhu(TEXT)、shijian(VARCHAR)、zongjia(FLOAT)。
约束条件:id为主键,自动递增;userid外键关联t_user表的id。
字段:id、fname。
数据类型:id(INT)、fname(VARCHAR)。
约束条件:id为主键,自动递增。
字段:id、biaoti、neirong、shijian。
数据类型:id(INT)、biaoti(VARCHAR)、neirong(TEXT)、shijian(VARCHAR)。
约束条件:id为主键,自动递增。
字段:id、userid、pid、pname、jiage、shuliang。
数据类型:id(INT)、userid(INT)、pid(INT)、pname(VARCHAR)、jiage(FLOAT)、shuliang(INT)。
约束条件:id为主键,自动递增。
字段:id、pname、imgpath、createtime、fenleiid、fname、jiage、tuijian、dianjishu、xiaoliang、miaoshu。
数据类型:id(INT)、pname(VARCHAR)、imgpath(VARCHAR)、createtime(VARCHAR)、fenleiid(VARCHAR)、fname(VARCHAR)、jiage(FLOAT)、tuijian(VARCHAR)、dianjishu(INT)、xiaoliang(INT)、miaoshu(TEXT)。
约束条件:id为主键,自动递增。
字段:id、userid、pid、pname、jiage、shuliang。
数据类型:id(INT)、userid(INT)、pid(INT)、pname(VARCHAR)、jiage(FLOAT)、shuliang(INT)。
约束条件:id为主键,自动递增。
图3-1管理员
图3-2用户
图3-3全局
用户信息(User):User(id, username, password, xingming, role, dianhua, dizhi)
订单信息(Order):Order(id, status, userid, xingming, dianhua, dizhi, xiangqing, orderid, beizhu, shijian, zongjia)
房间分类(RoomCategory):RoomCategory(id, fname)
公告信息(Notice):Notice(id, biaoti, neirong, shijian)
购物车信息(ShoppingCart):ShoppingCart(id, userid, pid, pname, jiage, shuliang)
产品信息(Product):Product(id, pname, imgpath, createtime, fenleiid, fname, jiage, tuijian, dianjishu, xiaoliang, miaoshu)
User 表:主码为 id,无外码。
Order 表:主码为 id,外码为 userid,关联 User 表的 id,用于获取订单对应的用户信息。
RoomCategory 表:主码为 id,无外码。
Notice 表:主码为 id,无外码。
ShoppingCart 表:主码为 id,外码为 userid,关联 User 表的 id,以明确购物车所属的用户。
Product 表:主码为 id,外码为 fenleiid,关联 RoomCategory 表的 id,便于获取产品所属的分类信息。
Xiadingdan 表:主码为 id,外码为 userid,关联 User 表的 id,从而确定下单用户的相关信息。
上述关系模式均满足第三范式(3NF),即每个非主属性都不传递依赖于主码。
根据业务需求,目前的范式级别无需进行调整,能够确保数据的完整性和一致性,同时避免数据冗余和异常。
在数据库结构设计中,充分考虑了系统的业务需求和数据关系,通过合理的实体划分和关系建立,为系统的高效运行和数据管理提供了坚实的基础。同时,对范式级别的分析和调整确保了数据的规范性和可靠性,有助于提高数据的质量和系统的性能。
- t_dingdan表
字段名称 | 字段类型 | 字段精度 | 字段约束(主码、外码、自定义约束) | |
id | INT | 11 | 主码,自动递增 | |
status | VARCHAR | 255 | NULL | 默认值为NULL |
userid | INT | 11 | 外码,关联t_user表的id | |
xingming | VARCHAR | 255 | NULL | 默认值为NULL |
dianhua | VARCHAR | 255 | NULL | 默认值为NULL |
dizhi | VARCHAR | 255 | NULL | 默认值为NULL |
xiangqing | TEXT | NULL | NULL | 默认值为NULL |
orderid | VARCHAR | 255 | NULL | 默认值为NULL |
beizhu | TEXT | NULL | NULL | 默认值为NULL |
shijian | VARCHAR | 255 | NULL | 默认值为NULL |
zongjia | FLOAT | NULL | NULL | 默认值为NULL |
- t_fenlei表
字段名称 | 字段类型 | 字段精度 | 字段约束(主码、外码、自定义约束) | |
id | INT | 11 | 主码,自动递增 | |
fname | VARCHAR | 255 | NULL | 默认值为NULL |
- t_gonggao表
字段名称 | 字段类型 | 字段精度 | 字段约束(主码、外码、自定义约束) | |
id | INT | 11 | 主码,自动递增 | |
biaoti | VARCHAR | 255 | NULL | 默认值为NULL |
neirong | TEXT | NULL | NULL | 默认值为NULL |
shijian | VARCHAR | 255 | NULL | 默认值为NULL |
- t_gouwuche表
字段名称 | 字段类型 | 字段精度 | 字段约束(主码、外码、自定义约束) | |
id | INT | 11 | 主码,自动递增 | |
userid | INT | 11 | 外键,关联t_user表的id | |
pid | INT | 11 | NULL | 默认值为NULL |
pname | VARCHAR | 255 | NULL | 默认值为NULL |
jiage | FLOAT | NULL | NULL | 默认值为NULL |
shuliang | INT | 11 | NULL | 默认值为NULL |
- t_product表
字段名称 | 字段类型 | 字段精度 | 字段约束(主码、外码、自定义约束) | |
id | INT | 11 | 主码,自动递增 | |
pname | VARCHAR | 255 | NULL | 默认值为NULL |
imgpath | VARCHAR | 255 | NULL | 默认值为NULL |
createtime | VARCHAR | 255 | NULL | 默认值为NULL |
fenleiid | VARCHAR | 255 | NULL | 默认值为NULL |
fname | VARCHAR | 255 | NULL | 默认值为NULL |
jiage | FLOAT | NULL | NULL | 默认值为NULL |
tuijian | VARCHAR | 255 | NULL | 默认值为NULL |
dianjishu | INT | 11 | NULL | 默认值为NULL |
xiaoliang | INT | 11 | NULL | 默认值为NULL |
miaoshu | TEXT | NULL | NULL | 默认值为NULL |
- t_user表
字段名称 | 字段类型 | 字段精度 | 字段约束(主码、外键、自定义约束) | |
id | INT | 11 | 主码,自动递增 | |
username | VARCHAR | 255 | NULL | 非空 |
password | VARCHAR | 255 | NULL | 默认值为NULL |
xingming | VARCHAR | 255 | NULL | 默认值为NULL |
role | INT | 11 | NULL | 默认值为NULL |
dianhua | VARCHAR | 255 | NULL | 默认值为NULL |
dizhi | VARCHAR | 255 | NULL | 默认值为NULL |
表名 | 测试数据 | 结果输出 |
t_user | 'user1', 'password1', '张三', 0, '1234567890', '地址 1' 'user2', 'password2', '李四', 1, '0987654321', '地址 2' 'user3', 'password3', '王五', 0, '1111111111', '地址 3' | 成功插入数据,可查询到相应的用户信息 |
t_dingdan | '已处理', 1, '张三', '1234567890', '地址 1', '商品名:单人间,单价:300.0,购买数量:1,小计:300.0 ', 'order1', '无', '2024-07-10 10:00:00', 300' '未处理', 2, '李四', '0987654321', '地址 2', '商品名:双人间,单价:400.0,购买数量:1,小计:400.0 ', 'order2', '有特殊要求', '2024-07-11 11:00:00', 400' '已结算', 3, '王五', '1111111111', '地址 3', '商品名:总统套房,单价:1600.0,购买数量:1,小计:1600.0 ', 'order3', '需要发票', '2024-07-12 12:00:00', 1600 | 成功插入数据,可查询到相应的订单信息,且订单状态、用户关联等信息正确 |
其他表 | 根据实际情况填充测试数据 | 根据具体的查询和验证操作,确认数据插入和结果输出是否满足预期 |
数据加密:
对敏感数据,如用户密码等,进行加密存储。在数据传输过程中,也采用加密技术,确保数据的安全性。
选择合适的加密算法,确保加密的强度和安全性。
定期更新加密密钥,以提高数据的安全性。
备份与恢复:
制定定期的数据备份计划,包括全量备份和增量备份。备份数据应存储在安全的位置,如离线存储设备或远程服务器。
定期测试备份数据的可恢复性,确保在发生数据丢失或损坏时能够快速恢复数据。
备份方式:
采用全量备份和增量备份相结合的方式。全量备份定期进行,例如每周一次,保存数据库的完整副本。增量备份则每天进行,只备份自上一次备份以来更改的数据。
可以使用数据库管理系统提供的备份工具,如 MySQL 的 mysqldump 命令或第三方备份工具。
备份频率:
根据数据的重要性和变更频率,确定合适的备份频率。对于关键数据,可能需要每天进行多次备份;对于不太重要的数据,可以适当降低备份频率。
考虑业务的需求和资源的可用性,确保备份操作不会对系统性能产生过大影响。
备份存储:
选择可靠的存储介质,如磁带、硬盘、云存储等,确保备份数据的安全性和可靠性。
将备份数据存储在不同的物理位置,以防止单点故障。例如,可以将备份数据存储在本地服务器和远程服务器上。
备份恢复测试:
定期进行备份恢复测试,以确保备份数据的可恢复性。在测试过程中,模拟数据丢失的情况,尝试从备份中恢复数据,并验证恢复的数据是否完整和准确。
根据测试结果,及时调整备份策略和恢复流程,确保在实际发生数据丢失时能够快速有效地恢复数据。
索引优化:
合理创建索引,提高数据的查询速度。根据经常查询的字段和关联关系,创建适当的索引。
定期检查索引的使用情况,删除不必要的索引,避免索引过多导致的性能下降。
查询优化:
优化查询语句,避免使用复杂的查询和子查询,尽量减少数据的检索量。
使用合适的查询条件和连接方式,提高查询的效率。
避免全表扫描,尽量使用索引进行查询。
数据库参数调整:
根据数据库的负载和性能需求,调整数据库的参数,如缓冲区大小、连接数限制等。
定期监控数据库的性能指标,如响应时间、吞吐量等,根据实际情况调整参数,以提高数据库的性能。
存储优化:
合理规划数据库的存储结构,避免数据的过度碎片化。
对于大数据量的表,可以考虑分区存储,提高数据的管理和查询效率。
定期维护:
定期进行数据库的维护操作,如清理过期数据、优化表结构、重建索引等。
监控数据库的空间使用情况,及时扩展存储空间,避免因空间不足导致的性能问题。
监控指标:
监控数据库的关键指标,如 CPU 使用率、内存使用率、磁盘 I/O 、查询响应时间等。
建立性能基线,以便及时发现性能异常。
监控工具:
使用数据库管理系统提供的监控工具,如 MySQL 的 Performance Schema、SHOW STATUS 等命令。
也可以使用第三方监控工具,如 Nagios、Zabbix 等,对数据库进行全面的监控。
预警机制:
设置预警阈值,当监控指标超过阈值时,及时发出预警通知。
预警通知可以通过邮件、短信等方式发送给管理员,以便及时采取措施解决问题。
故障处理:
制定故障处理流程,当数据库出现故障时,能够快速定位问题并采取相应的解决措施。
定期进行故障演练,提高管理员的故障处理能力。
网络安全:
确保数据库服务器所在的网络环境安全,采取防火墙、入侵检测等安全措施,防止网络攻击。
限制数据库服务器的访问权限,只允许授权的 IP 地址或用户访问数据库。
定期安全审计:
定期进行数据库安全审计,检查数据库的配置、用户权限、数据访问记录等,发现潜在的安全隐患。
根据审计结果,及时进行整改和优化,提高数据库的安全性。
本酒店管理系统的功能实现基于前面章节所设计的数据库结构和需求分析。通过选择合适的开发技术和框架,将系统的各项功能逐步转化为可实际运行的代码。
在功能实现过程中,注重代码的规范性、可读性和可维护性,遵循良好的编程实践和设计原则。
实现用户信息的录入和验证,包括用户名、密码、姓名、地址、手机等字段的有效性检查。
采用加密技术对用户密码进行存储,确保密码的安全性。
登录时,验证用户名和密码的匹配性,成功登录后为用户创建会话,以便跟踪用户的操作权限和状态。
图7-1用户登录
图7-2用户注册
图7-3管理员登录
提供房间状态的实时更新功能,确保用户获取的房间信息准确无误。
支持酒店管理人员对房间信息的编辑和修改操作。
图7-4房间列表
图7-5房间管理
用户能够方便地进行房间预订,生成订单并填写相关预订信息。
酒店管理人员能够对订单进行处理,包括确认订单、修改订单状态、处理退订等操作。
订单模块与数据库进行交互,确保订单数据的准确存储和查询。
图7-6购物车
实现入店须知等营销信息的上线和展示。
支持酒店管理人员制定和实施各种优惠促销活动,并将相关信息及时展示给用户。
图7-9推广管理
对系统的各项功能进行逐一测试,确保每个功能都能按照预期正常工作。
编写详细的测试用例,覆盖用户注册、登录、房间预订、订单管理、营销推广等核心功能。
模拟大量用户并发访问的场景,测试系统在高负载下的响应速度和稳定性。
分析系统的性能瓶颈,并进行优化。
检测系统是否存在SQL注入、跨站脚本攻击等常见的安全漏洞。
验证用户权限管理机制的有效性,确保用户数据的保密性和完整性。
大部分功能正常运行,符合需求规格说明。但在部分边界条件下,如特殊字符输入,存在一些小的兼容性问题,已进行修复。
在一定并发量下,系统的响应时间能够满足业务需求,但随着并发量的继续增加,部分页面出现响应缓慢的情况。通过优化数据库查询和服务器配置,性能得到显著提升。
测试模块 | 测试用例 | 预期结果 | 实际结果 | 是否通过 | 问题描述 |
用户注册与登录 | 输入合法的用户名、密码、姓名、地址、手机进行注册 | 注册成功,用户信息保存到数据库 | 注册成功,信息准确保存 | 是 | 无 |
用户注册与登录 | 输入已存在的用户名进行注册 | 提示用户名已存在,注册失败 | 提示用户名已存在,注册失败 | 是 | 无 |
用户注册与登录 | 输入空的用户名或密码 | 提示用户名和密码不能为空,注册失败 | 提示用户名和密码不能为空,注册失败 | 是 | 无 |
房间管理 | 查看房间分类列表 | 展示所有房间类型及详细信息 | 展示准确完整的房间类型和信息 | 是 | 无 |
房间管理 | 修改房间信息(如价格) | 数据库中房间价格更新成功,页面展示更新后价格 | 价格更新成功,页面展示准确 | 是 | 无 |
订单管理 | 用户预订房间,填写完整预订信息 | 生成订单,订单信息准确保存 | 订单生成成功,信息无误 | 是 | 无 |
营销推广 | 查看入店须知 | 准确展示入店须知内容 | 内容展示无误 | 是 | 无 |
未发现明显的安全漏洞,但仍需持续关注和加强安全防护措施。
根据测试结果,对系统进行了以下优化和改进:
优化数据库索引,提高查询效率。
对代码进行重构,提高代码的执行效率和可维护性。
加强系统的错误处理和日志记录功能,便于及时发现和解决问题。
本酒店管理系统的开发工作已经基本完成,实现了预期的功能和目标。通过精心设计的数据库结构和功能模块,为酒店提供了一个高效、便捷的管理平台。
系统能够准确地管理用户信息、房间信息、订单信息等核心数据,支持用户注册登录、房间预订、订单处理等关键业务流程,同时具备一定的营销推广功能。
经过严格的测试和优化,系统在功能完整性、性能稳定性和数据安全性方面都达到了较高的标准,能够满足酒店日常运营和管理的需求。
在需求分析阶段,调研酒店通至关重要。确保对业务流程和需求有清晰、全面的理解,避免在后续开发过程中出现需求变更和功能缺失的情况。
数据库设计的合理性直接影响系统的性能和可扩展性。在设计过程中,充分考虑数据的关联、范式和索引,为后续的高效查询和数据操作奠定基础。
开发过程中,团队协作和代码规范的重要性不可忽视。及时的沟通、代码审查和版本控制有助于提高开发效率,减少代码冲突和错误。
测试工作应贯穿整个项目周期,包括单元测试、集成测试和系统测试。早期发现和解决问题可以降低后期的修复成本和风险。
随着酒店业务的发展和技术的不断更新,系统需要持续改进和优化。可以进一步丰富系统的功能,如增加客户关系管理、数据分析报表等模块,为酒店的决策提供更有力的支持。
关注用户体验的提升,不断优化系统的界面设计和操作流程,使系统更加简洁、易用。
随着移动互联网的普及,考虑开发移动应用版本,方便用户随时随地进行操作和管理。
加强系统的安全性和稳定性,定期进行安全漏洞扫描和性能监测,确保系统能够长期稳定运行。
总之,通过本项目的实施,我们为酒店管理提供了一个有效的解决方案,但也认识到还有不断完善和提升的空间。未来,我们将继续努力,使系统更好地服务于酒店行业,为酒店的发展和运营提供更强大的支持。
[1] 王珊,萨师煊. 数据库系统概论(第 5 版)[M]. 高等教育出版社,2014.
[2] 明日科技. MySQL 从入门到精通(第 3 版)[M]. 清华大学出版社,2017.
[3] 朱少民. 软件测试方法和技术(第 3 版)[M]. 清华大学出版社,2015.
[4] 李刚. 疯狂 Java 讲义(第 4 版)[M]. 电子工业出版社,2016.
[5] 孙卫琴. 精通 Struts:基于 MVC 的 Java Web 设计与开发(第 2 版)[M]. 电子工业出版社,2013.
[6] 林信良. Spring 技术内幕:深入解析 Spring 架构与设计原理(第 2 版)[M]. 机械工业出版社,2015.
[7] 周志明. 深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 3 版)[M]. 机械工业出版社,2019.
[8] Effective Java(第 3 版)[M]. Addison-Wesley Professional,2017.
[9] Head First 设计模式(中文版)[M]. 中国电力出版社,2007.
[10] 重构:改善既有代码的设计(第 2 版)[M]. 人民邮电出版社,2019.
完整源码
public class ShouyeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
super.destroy();
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置获取的参数的编码格式
request.setCharacterEncoding("utf-8");
//分页页数定义
int pagenum =1;//当前页
int pagesize = 10;//每页显示的数量
ProductDao ProductDao = new ProductDao();
String pname = request.getParameter("pname");
String fenleiid = request.getParameter("fenleiid");
String tuijian = request.getParameter("tuijian");
String jiage1 = request.getParameter("jiage1");
String jiage2 = request.getParameter("jiage2");
String url = "shouye";
if(request.getParameter("pagenum")!=null){
pagenum = Integer.parseInt(request.getParameter("pagenum"));
}
StringBuffer sb = new StringBuffer();
sb.append(" where ");
if(jiage1!=null&&!"".equals(jiage1)){
sb.append(" jiage >= "+jiage1+"");
sb.append(" and ");
request.setAttribute("jiage1", jiage1);
}
if(jiage2!=null&&!"".equals(jiage2)){
sb.append(" jiage <= "+jiage2+"");
sb.append(" and ");
request.setAttribute("jiage2", jiage2);
}
if(pname!=null&&!"".equals(pname)){
sb.append(" pname like '%"+pname+"%' ");
sb.append(" and ");
request.setAttribute("pname", pname);
}
if(fenleiid!=null&&!"".equals(fenleiid)){
sb.append(" fenleiid like '%"+fenleiid+"%' ");
sb.append(" and ");
request.setAttribute("fenleiid", fenleiid);
}
if(tuijian!=null&&!"".equals(tuijian)){
sb.append(" tuijian = '已推荐' ");
sb.append(" and ");
request.setAttribute("tuijian", tuijian);
}
sb.append(" 1=1 order by id desc ");
String where = sb.toString();
Map<String,List<Product>> map = ProductDao.getList(pagenum,pagesize,url,where);
String pagerinfo = map.keySet().iterator().next();
List<Product> list = map.get(pagerinfo);
request.setAttribute("pagerinfo", pagerinfo);
request.setAttribute("list", list);
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response); }
}
//后台servlet,用于处理后台的所有请求
public class ManageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
super.destroy();
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置获取的参数的编码格式
request.setCharacterEncoding("utf-8");
//获取绝对地址
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//设置响应输出的字符串格式
response.setCharacterEncoding("utf-8");response.setContentType("text/html; charset=utf-8");
//获取输出对象
PrintWriter writer = response.getWriter();
//获取页面请求地址
String uri = request.getRequestURI();
String[] s = uri.split("/");
String method = s[3];
//初始化跳转的地址
String url ="";
int pagenum = 1;//当前页
int pagesize = 15;//每页显示的数量
//初始化调用的数据库操作对象
UserDao userDao = new UserDao();
FenleiDao fenleiDao = new FenleiDao();
ProductDao productDao = new ProductDao();
GonggaoDao gonggaoDao = new GonggaoDao();
DingdanDao dingdanDao = new DingdanDao();
//用户登录
if("login".equals(method)){
//从jsp页面获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//查询用户名和密码是否匹配
User bean = userDao.selectBean(" where username='"+username+"' and password ='"+password+"' and role=1 ");
if(bean!=null){
HttpSession session = request.getSession();
session.setAttribute("manage", bean);
writer.print("<script language='javascript'>alert('登录成功');window.location.href='"+basePath+"manage/index.jsp'; </script>");
}else{
writer.print("<script language='javascript'>alert('用户名或者密码错误');window.location.href='"+basePath+"manage/login.jsp';</script>");
}
}