博主主页:一季春秋
博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。精彩专栏推荐订阅 不然下次找不到哟
SpringBoot+Vue项目《1000套》持续更新中
http://t.csdn.cn/1mgm8
文末获取联系
目录
一、项目介绍
二、项目主要技术
三、系统分析
3.1 系统用例分析
3.2 系统基本结构设计
四、系统实现
4.1 系统前台实现
4.2 后台功能实现
4.3 用户模块实现
五、实现代码
5.1 登录相关代码
5.2 上传文件代码
5.3 门票预订代码
为设计一个安全便捷,并且使用户更好获取本旅游出行信息,本文主要有安全、简洁为理念,实现用户快捷寻找旅游出行信息,从而解决旅游出行信息复杂难辨的问题。该系统以springboot架构技术为基础,采用Java语言和MySQL数据库进行开发设计,通过对旅游出行业务流程的分析,分析了其功能性和非功能性需求,设计了旅游出行指南,该系统包括个人管理员和用户两部分。同时还能为用户提供一个方便实用的旅游出行指南,使得用户能够及时地找到合适自己的旅游出行信息。个人用户在使用本系统时,可以浏览景点信息,酒店信息,餐厅信息,交通路线,旅行日记,公告信息等;管理员在使用本系统时,可以通过后台管理员界面管理用户的信息,也可以发布系统公告,让用户及时了解旅游出行信息。这样,用户就可以安全高效地找到旅游出行信息。
开发语言:Java
使用框架:spring boot
前端技术:JavaScript、Vue 、css3
开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code
数据库:MySQL 5.7/8.0
数据库管理工具:phpstudy/Navicat
JDK版本:jdk1.8
Maven: apache-maven 3.8.1-bin
该系统由个人管理员和用户两部分组成。其中:用户进入系统首页可以实现首页,景点信息,酒店信息,餐厅信息,交通路线,旅行日记,公告信息,后台管理,个人中心等;管理员则是根据不同需求设置了不同功能,可以通过后台管理接口管理用户信息。
旅游出行指南综合网络空间开发设计要求。目的是将旅游出行指南从传统管理方式转换为在网上管理,完成旅游出行信息管理的方便快捷、安全性高、交易规范做了保障,目标明确。旅游出行指南可以将功能划分为管理员功能和用户功能。
(1)、管理员关键功能包含系统首页,个人中心,用户管理,天气预报管理,景点信息管理,门票预订管理,酒店信息管理,酒店预订管理,餐厅信息管理,餐厅预订管理,交通路线管理,旅行日记管理,旅游规划管理,系统管理等进行管理。管理员用例如下:
(2)、用户关键功能包含系统首页,个人中心,门票预订管理,酒店预订管理,餐厅预订管理,旅行日记管理,旅游规划管理等进行管理。用户用例如下:
本次系统采用springboot框架集进行开发,springboot框架是一款企业界主流的软件开发框架,其简化了开发流程,大大缩减了软件开发所需的时间提高了软件的响应速度。系统总体结构图如图所示。
系统实现章节的主要内容主要是将系统分析和系统设计方案进行实现,按照各个系统角色进行功能介绍,系统实现就是一个真正开始编写的阶段,将前面的分析结果以及设计方案进行实现,最终做出一个符合用户需求的软件系统。
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图所示:
景点信息:在景点信息页面可以输入景点名称和景点地址进行查询,可以查看到景点详细信息,并根据需要进行订门票、评论或收藏操作;景点信息页面如图所示:
景点详细信息
酒店信息:在酒店信息页面的输入栏中输入酒店名称、酒店类型和选择房间类型进行查询,可以查看到酒店详细信息,并根据需要进行订酒店、评论或收藏操作;酒店信息页面如图所示:
餐厅详细信息
交通路线信息
后台登录,在登录页面选择需要登录的角色,并正确输入用户名和密码后,进入操作系统进行操作;如图所示。
管理员点击用户管理。在用户页面输入账号和姓名进行查询、新增或删除用户信息列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图所示:
管理员点击门票预订管理。在门票预订页面输入景点名称和景点地址进行查询或删除门票预订列表,并根据需要对门票预订详情信息进行详情或删除操作;如图所示:
管理员点击餐厅预订管理。在餐厅预订页面输入餐厅名称、姓名和手机进行查询或删除餐厅预订列表,并根据需要对餐厅预订详情信息进行详情或删除操作;如图所示:
管理员点击旅行日记管理。在旅行日记页面输入旅行地点和选择旅行类型进行查询或删除旅行日记列表,并根据需要对旅行日记详情信息进行详情、查看评论或删除操作;如图所示:
用户进入主页面,主要功能包括对系统首页,个人中心,门票预订管理,酒店预订管理,餐厅预订管理,旅行日记管理,旅游规划管理等进行操作。用户主页面如图所示:
用户点击门票预订管理。在门票预订页面输入景点名称和景点地址进行查询门票预订列表,并根据需要对门票预订详情信息进行详情操作;如图所示:
*/
@RequestMapping("users")
@RestController
public class UsersController{
@Autowired
private UsersService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UsersEntity user = userService.selectOne(new EntityWrapper().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
*/
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
@Autowired
private ConfigService configService;
/**
* 上传文件
*/
@RequestMapping("/upload")
@IgnoreAuth
public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
if (file.isEmpty()) {
throw new EIException("上传文件不能为空");
}
String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
File path = new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()) {
path = new File("");
}
File upload = new File(path.getAbsolutePath(),"/upload/");
if(!upload.exists()) {
upload.mkdirs();
}
String fileName = new Date().getTime()+"."+fileExt;
File dest = new File(upload.getAbsolutePath()+"/"+fileName);
file.transferTo(dest);
/**
* 如果使用idea或者eclipse重启项目,发现之前上传的图片或者文件丢失,将下面一行代码注释打开
* 请将以下的"D:\\springbootq33sd\\src\\main\\resources\\static\\upload"替换成你本地项目的upload路径,
* 并且项目路径不能存在中文、空格等特殊字符
*/
// FileUtils.copyFile(dest, new File("D:\\springbootq33sd\\src\\main\\resources\\static\\upload"+"/"+fileName)); /**修改了路径以后请将该行最前面的//注释去掉**/
if(StringUtils.isNotBlank(type) && type.equals("1")) {
ConfigEntity configEntity = configService.selectOne(new EntityWrapper().eq("name", "faceFile"));
if(configEntity==null) {
configEntity = new ConfigEntity();
configEntity.setName("faceFile");
configEntity.setValue(fileName);
} else {
configEntity.setValue(fileName);
}
configService.insertOrUpdate(configEntity);
}
return R.ok().put("file", fileName);
}
*/
@RestController
@RequestMapping("/menpiaoyuding")
public class MenpiaoyudingController {
@Autowired
private MenpiaoyudingService menpiaoyudingService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map params,MenpiaoyudingEntity menpiaoyuding,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
menpiaoyuding.setZhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper ew = new EntityWrapper();
PageUtils page = menpiaoyudingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, menpiaoyuding), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map params,MenpiaoyudingEntity menpiaoyuding,
HttpServletRequest request){
EntityWrapper ew = new EntityWrapper();
PageUtils page = menpiaoyudingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, menpiaoyuding), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( MenpiaoyudingEntity menpiaoyuding){
EntityWrapper ew = new EntityWrapper();
ew.allEq(MPUtil.allEQMapPre( menpiaoyuding, "menpiaoyuding"));
return R.ok().put("data", menpiaoyudingService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(MenpiaoyudingEntity menpiaoyuding){
EntityWrapper< MenpiaoyudingEntity> ew = new EntityWrapper< MenpiaoyudingEntity>();
ew.allEq(MPUtil.allEQMapPre( menpiaoyuding, "menpiaoyuding"));
MenpiaoyudingView menpiaoyudingView = menpiaoyudingService.selectView(ew);
return R.ok("查询门票预订成功").put("data", menpiaoyudingView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
MenpiaoyudingEntity menpiaoyuding = menpiaoyudingService.selectById(id);
return R.ok().put("data", menpiaoyuding);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
MenpiaoyudingEntity menpiaoyuding = menpiaoyudingService.selectById(id);
return R.ok().put("data", menpiaoyuding);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody MenpiaoyudingEntity menpiaoyuding, HttpServletRequest request){
menpiaoyuding.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(menpiaoyuding);
menpiaoyudingService.insert(menpiaoyuding);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody MenpiaoyudingEntity menpiaoyuding, HttpServletRequest request){
menpiaoyuding.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(menpiaoyuding);
menpiaoyudingService.insert(menpiaoyuding);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody MenpiaoyudingEntity menpiaoyuding, HttpServletRequest request){
//ValidatorUtils.validateEntity(menpiaoyuding);
menpiaoyudingService.updateById(menpiaoyuding);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
menpiaoyudingService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper wrapper = new EntityWrapper();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
wrapper.eq("zhanghao", (String)request.getSession().getAttribute("username"));
}
int count = menpiaoyudingService.selectCount(wrapper);
return R.ok().put("count", count);
}
}