旅游管理系统设计图
毕业论文概述
智慧旅游在线平台的设计与实现。
下面将有六大部分来讲解:引言、需求分析、系统设计、系统实现、系统测试和研究结论
第一部分是引言
互联网的高速发展,与传统旅游行业进行碰撞,用户对于旅游管理系统的需求越来越强烈。
接下来,第二部分是需求分析
首先我讲的是系统开发工具:
这里我想重点说一下为什么选择idea2017,一方面我对idea2017版本比较熟悉,另一个方面,新版本如idea2020。可能有的时候出现bug是idea版本原因,而不是程序问题,这样排查bug的时间会大大增加。
以下我在选择版本的时候,都是基于这些因素来考虑的,比如tomcat7,MySQL5.7,mysql可视化工具,maven3.5.3,jdk1.8等等,
最后一个谷歌浏览器主要用来访问前端界面,里面可以打开无痕窗口也是非常好用的。
然后是需求分析,需求分析分为可行性分析、需求分析和业务流程分析
可行性分析,该系统是我的毕业设计项目,对于大学四年知识的总结。开发只需要一台笔记本电脑,安装各类开发软件即可。
需求分析,该系统本身是一个管理系统,分为管理员与普通用户两个角色,实现不同功能。
业务流程分析,该系统主要功能就是浏览景点,购买并下单的过程,用户在登录后就可以进入到系统主页,然后可以对景点查看,购买,查看订单,查看和修改个人信息进行一些基本操作。
第三部分,系统设计
我的旅游管理系统总共分为管理员模块、用户模块和公用模块,其中管理员模块下面有用户管理,包括增加用户、查看用户信息、添加角色、查看用户详情、编辑用户和删除用户这些功能。第二个是订单管理,包括查看所有的订单、查看订单详情和增加订单。第三个是角色管理,包括新建角色和删除角色。第四个是日志管理,有查看日志,日志这块只需要查看即可。第五个是景点管理,包括增加景点、修改景点、购买门票和删除景点。
首先看到的是左边的图普通用户流程图,普通用户在登录中,会验证角色是否普通用户,如果是则进入景点中心、我的订单和个人信息,如右图所示。最后可以安全退出,退回到登录界面。
然后看到的是左边的图管理员流程图,管理员在登录中,会验证角色是否管理员,如果是则进入用户信息管理、订单信息管理、角色信息管理、日志信息管理和景点管理,如右图所示。最后也可以安全退出,退回到登录界面。
然后第四部分,系统实现
第五部分,系统测试
系统测试是程序开发必不可少的一个过程,系统测试是输入一些条件,预期输出的结果与实际结果是否一致的过程。系统测试测试主要功能是否实现。
最后一部分是研究结论
指导老师在任务书上写的三个功能模块:用户管理模块,景点信息管理模块和订单管理模块都已经实现了,然后在完成这些功能模块的基础上我也加了一些其他功能,比如说增加了日志信息等。该项目可以先上线,后续进行迭代开发,不断完善一些功能,根据后期新需求进行迭代开发。
该项目用户友好方面可以去优化,比如点击删除按钮可以添加一个提示的友好弹框,并有操作成功和操作失败的提示弹框。以及删除的时候让用户等待2秒后再删除。
RoleDao.java
@Select(“SELECT * from Role where id in (select roleId from users_role where userId = #{userId})”)
public Role findRoleByUser(int userId);
该项目数据库和性能方面可以去优化,比如数据库加载,当系统部署在测试服数据量少的时候没有多大问题,但是部署到正式服中,数据量过多,查询的效率会显著降低,甚至宕机。未来优化方法可以先把符合条件的id查询出来,封装到set集合,再查询,体现单表封装查询的思想。
密码加密的实现?
Spring Security
提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强
哈希方法来加密密码。BCrypt强哈希方法 每次加密的结果都不一样。
管理员添加用户密码—-存储数据库:明文—》密文
登录校验:取到数据库的密文—-》明文 与输入密码进行校验,前后一致则登录成功,否则登录失败。
Pagehelp怎么实现分页?
第一步、导包(或者导入坐标)
第二步、配置到spring 和mybait 整合的配置文件中
第三步、方法调用
使用PageHelper.startPage 静态方法调用startPage :
特点:
- 静态方法,传递两个参数(当前页码,每页查询条数)
- 使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句
- 自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页
PageHelper.startPage(1,5);
第四步、在Controller中的使用是将Service层返回来的PageInfo对象放入request域中
单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
怎么实现的系统?
本系统技术选型:
Spring+SpringMVC+MyBatis+Spring-Security+BootStrap+adminLTE+IDEA+Tomcat+MySQL
使用MVC思想,经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。
从输入了哪些条件到输出预期结果
Controller—-》service—-》dao
表结构怎么设计的?
景点与订单的关系,一对多的关系。 外键
用户与角色的关系,即是多对多的关系。 中间表+外键
用户与订单的关系,一对多的关系 外键
Spring 之 AOP:
要理解切面编程,就需要先理解什么是切面。用刀把一个西瓜分成两瓣,切开的切口就是切面;炒菜,锅与炉子共同来完成炒菜,锅与炉子就是切面。web层级设计中,web层->网关层->服务层->数据层,每一层之间也是一个切面。编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。
Spring AOP 实现日志记录功能
定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
定义拦截器
1.拦截方法,判断是否有注解loginterceptor
2. 如果有判断是否执行成功,成功则记录log,失败不记录
3. 获取注解中配置的generator类,利用反射调用generateContent方法,生成个性化日志内容
4在日志中添加其他公共属性,比如用户id,创建时间等等。所有个性化定制的日志信息都是在generator类中产生。
3 Generator类
继承统一的ContentGenerator类,便于共享一些常量。根据当前操作类型,生成对应的日志内容就可以了。如果需要新增模块, 先定义自己的日志generator类,然后添加注解到对应模块就可以。
4. 注解应用
@PutMapping(value = “roles/{roleId}”)
@RequiredLogInterceptor(targetGenerator = “ContentGeneratorForRoleMgt”,operateType= OperateType.UPDATE)
@ApiOperation(value = “修改角色”, httpMethod = “PUT”, response = Response.class, notes = “修改角色”)
5. Configuration
class SpringMvcConfig extends WebMvcConfigurerAdapter 写相关配置类
事务
原子性、一致性、隔离性、持久性