本章节来给大家介绍一个基于java的旅游信息系统设计与实现
系统概要
旅游产业的日新月异影响着城市,村镇旅游产业的发展变化。网络、电子科技的迅猛前进同样牵动着旅游产业的快速成长。随着人们消费理念的不断发展变化,越来越多的人开始注意精神文明的追求,而不仅仅只是在意物质消费的提高。旅游信息推荐信息系统设计与实现的设计就是帮助村镇,城市发展旅游产业,达到宣传效果,带动一方经济发展。而在线消费与查询正在以高效,方便,时尚等的特点成为广大互联网用户的首选。旅游信息推荐信息系统设计与实现设计与开发以方便、快捷、费用低的优点正慢慢地进入人们的生活。人们从传统的旅游方式转变为在线预览,减轻了劳动者的工作量。使得旅游从业人员有更多时间来获取、了解、掌握信息。
旅游信息推荐信息系统设计与实现根据当地旅游风景和特色的实际情况,设计出一套适合当地旅游信息网站,通过网络,实现该网站的推广从而达到宣传的效果。
系统主要分为前台后后台,普通用户在未登录情况下前台可以展示人气景点,地方美食,旅游新闻,景区信息,旅游路线,用户可自己注册,然后登录,登录后可以添加收藏,预订,和在线留言等功能;
后台管理员可以在后台页面进行:账号管理,地区管理,景点信息管理,地方美食管理,旅游路线管理,订单信息管理,新闻信息管理,系统管理等等;
具体功能可以查看以下详细介绍。
系统使用的架构和内容获取
采用B/S的架构实现,整体遵循MVC的设计思想。
开发系统:Windows
架构模式:MVC/前后端分离
JDK版本:Java JDK1.8
开发工具:idea或者eclipse
数据库版本: mysql
数据库可视化工具: navicat
后端:java,spring,springmvc,mybatis,tomcat等
前端:html,css,javascript,jquery,vue等
# 项目实现
所有的代码文件都有详细的注释,不用担心看不懂代码的。
- `AdminsController`
```java
/**
* 管理员 */
@Controller
public class AdminsController extends BaseController {
@Autowired
private AdminsMapper dao;
@Autowired
private AdminsService service;
/**
* 后台列表页
*/
@RequestMapping("/admins_list")
public String list() {
// 检测是否有登录,没登录则跳转到登录页面
if (!checkLogin()) {
return showError("尚未登录", "./login.do");
}
String order = Request.get("order", "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
String sort = Request.get("sort", "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
int pagesize = Request.getInt("pagesize", 12); // 获取前台一页多少行数据
Example example = new Example(Admins.class); // 创建一个扩展搜索类
Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
String where = " 1=1 "; // 创建初始条件为:1=1
where += getWhere(); // 从方法中获取url 上的参数,并写成 sql条件语句
criteria.andCondition(where); // 将条件写进上面的扩展条件类中
if (sort.equals("desc")) { // 判断前台提交的sort 参数是否等于 desc倒序 是则使用倒序,否则使用正序
example.orderBy(order).desc(); // 把sql 语句设置成倒序
} else {
example.orderBy(order).asc(); // 把 sql 设置成正序
}
int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1
page = Math.max(1, page); // 取两个数的最大值,防止page 小于1
List<Admins> list = service.selectPageExample(example, page, pagesize); // 获取当前页的行数
// 将列表写给界面使用
assign("totalCount", request.getAttribute("totalCount"));
assign("list", list);
assign("orderby", order); // 把当前排序结果写进前台
assign("sort", sort); // 把当前排序结果写进前台
return json(); // 将数据写给前端
}
public String getWhere() {
_var = new LinkedHashMap(); // 重置数据
String where = " ";
// 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
if (!Request.get("username").equals("")) {
where += " AND username LIKE '%" + Request.get("username") + "%' ";
}
return where;
}
@RequestMapping("/admins_add")
public String add() {
_var = new LinkedHashMap(); // 重置数据
return json(); // 将数据写给前端
}
@RequestMapping("/admins_updt")
public String updt() {
_var = new LinkedHashMap(); // 重置数据
int id = Request.getInt("id");
// 获取行数据,并赋值给前台jsp页面
Admins mmm = service.find(id);
assign("mmm", mmm);
assign("updtself", 0);
return json(); // 将数据写给前端
}
@RequestMapping("/admins_updtself")
public String updtself() {
_var = new LinkedHashMap(); // 重置数据
// 更新个人资料
int id = (int) request.getSession().getAttribute("id");
Admins mmm = service.find(id);
assign("mmm", mmm);
assign("updtself", 1);
return json(); // 将数据写给前端
}
/**
* 添加内容
*
* @return
*/
@RequestMapping("/adminsinsert")
public String insert() {
_var = new LinkedHashMap(); // 重置数据
String tmp = "";
Admins post = new Admins(); // 创建实体类
// 设置前台提交上来的数据到实体类中
post.setUsername(Request.get("username"));
post.setPwd(Request.get("pwd"));
post.setAddtime(Info.getDateStr());
service.insert(post); // 插入数据
int charuid = post.getId().intValue();
if (isAjax()) {
return jsonResult(post);
}
return showSuccess("保存成功", Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
}
/**
* 更新内容
*
* @return
*/
@RequestMapping("/adminsupdate")
public String update() {
_var = new LinkedHashMap(); // 重置数据
// 创建实体类
Admins post = new Admins();
// 将前台表单数据填充到实体类
if (!Request.get("username").equals(""))
post.setUsername(Request.get("username"));
if (!Request.get("pwd").equals(""))
post.setPwd(Request.get("pwd"));
if (!Request.get("addtime").equals(""))
post.setAddtime(Request.get("addtime"));
post.setId(Request.getInt("id"));
service.update(post); // 更新数据
int charuid = post.getId().intValue();
if (isAjax()) {
return jsonResult(post);
}
if (Request.getInt("updtself") == 1) {
return showSuccess("保存成功", "admins_updtself.do");
}
return showSuccess("保存成功", Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面
}
/**
* 删除
*/
@RequestMapping("/admins_delete")
public String delete() {
_var = new LinkedHashMap(); // 重置数据
if (!checkLogin()) {
return showError("尚未登录");
}
int id = Request.getInt("id"); // 根据id 删除某行数据
HashMap map = Query.make("admins").find(id);
service.delete(id);// 根据id 删除某行数据
return showSuccess("删除成功", request.getHeader("referer"));//弹出删除成功,并跳回上一页
}
}
UploadController
文件上传的控制器实现
/**
* 上传控制器
*/
@Controller
public class UploadController extends BaseController {
/**
* 上传文件
*
* @param fujian
* @return
* @throws Exception
*/
@RequestMapping(value = "/upload_re")
public String Upload(MultipartFile fujian) throws Exception {
String fileName = fujian.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID() + suffixName;
String filePath = getFolder("upload");
try {
File file = new File(getPhysicalPath(filePath) + "/" + fileName);
fujian.transferTo(file);
request.setAttribute("url", filePath + "/" + fileName);
if (isAjax()) {
return jsonResult(request.getAttribute("url"));
}
return "upload";
} catch (Exception e) {
return showError(e.getMessage());
}
}
private String getFolder(String path) {
SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");
path += "/" + formater.format(new Date());
File dir = new File(this.getPhysicalPath(path));
if (!dir.exists()) {
try {
dir.mkdirs();
} catch (Exception e) {
return "";
}
}
return path;
}
/**
* 根据传入的虚拟路径获取物理路径
*
* @param path
* @return
*/
private String getPhysicalPath(String path) {
String servletPath = this.request.getServletPath();
String realPath = this.request.getSession().getServletContext()
.getRealPath(servletPath);
return new File(realPath).getParent() + "/" + path;
}
}
UserController
用户登录更新密码控制器
/**
* 用户登录更新密码控制器
*/
@Controller
public class UserController extends BaseController {
@Resource
private AdminsService adminsService;
@Resource
private YonghuService yonghuService;
/**
* 登录页面
*
* @return
*/
@RequestMapping("/login")
public String Index() {
return "login";
}
/**
* 退出
*
* @return
*/
@RequestMapping("/logout")
public String Logout() {
request.getSession().invalidate();
return showSuccess("退出成功", "./");
}
/**
* 验证登录用户
*
* @param isAdmin
* @param username
* @param pwd
* @param cx
* @return
*/
protected String authLoginUser(boolean isAdmin, String username, String pwd, String cx) {
if (username == null || "".equals(username)) {
return showError("账号不允许为空");
}
if (pwd == null || "".equals(pwd)) {
return showError("密码不允许为空");
}
if (cx == null) {
return showError("请选中登录类型");
}
String random;
// 获取 token方式的验证码值
if (isAjax() && request.getParameter("captchToken") != null) {
random = DESUtil.decrypt("CaptchControllerPassword", request.getParameter("captchToken"));
} else {
random = (String) request.getSession().getAttribute("random");
}
String pagerandom = request.getParameter("pagerandom") == null ? "" : request.getParameter("pagerandom");
if (request.getParameter("a") != null && !pagerandom.equals(random)) {
return showError("验证码不正确", 20);
}
if (cx.equals("管理员")) {
Admins user = adminsService.login(username, pwd);
if (user == null) {
return showError("用户名或密码错误");
}
session.setAttribute("id", user.getId());
session.setAttribute("username", user.getUsername());
session.setAttribute("cx", cx);
session.setAttribute("login", cx);
session.setAttribute("username", user.getUsername());
session.setAttribute("pwd", user.getPwd());
session.setAttribute("addtime", user.getAddtime());
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user));
jsonObject.put("cx", session.getAttribute("cx"));
jsonObject.put("username", session.getAttribute("username"));
jsonObject.put("login", session.getAttribute("login"));
assign("session", jsonObject);
}
if (cx.equals("用户")) {
Yonghu user = yonghuService.login(username, pwd);
if (user == null) {
return showError("用户名或密码错误");
}
session.setAttribute("id", user.getId());
session.setAttribute("username", user.getYonghuming());
session.setAttribute("cx", cx);
session.setAttribute("login", cx);
session.setAttribute("yonghuming", user.getYonghuming());
session.setAttribute("mima", user.getMima());
session.setAttribute("xingming", user.getXingming());
session.setAttribute("xingbie", user.getXingbie());
session.setAttribute("shouji", user.getShouji());
session.setAttribute("youxiang", user.getYouxiang());
session.setAttribute("shenfenzheng", user.getShenfenzheng());
session.setAttribute("touxiang", user.getTouxiang());
session.setAttribute("addtime", user.getAddtime());
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user));
jsonObject.put("cx", session.getAttribute("cx"));
jsonObject.put("username", session.getAttribute("username"));
jsonObject.put("login", session.getAttribute("login"));
assign("session", jsonObject);
}
if (session.getAttribute("username") == null) {
return showError("账号或密码错误");
}
String referer = request.getParameter("referer");
if (referer == null) {
if (isAdmin) {
referer = "./main.do";
} else {
referer = "./";
}
}
assign("token", createToken(
session.getAttribute("cx"),
session.getAttribute("login"),
session.getAttribute("username"),
_var.get("session")
)
);
if (this.isAjax()) {
return json();
} else {
return showSuccess("登录成功", referer);
}
}
public String createToken(Object cx, Object login, Object username, Object session) {
String SOURCE_STRING = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
String token = createRandomString(SOURCE_STRING, 32);
// 删除过期token
new CommDAO().commOper("DELETE FROM token WHERE token_time<'" + Info.getDateStr() + "'");
HashMap tokenMap = new HashMap();
tokenMap.put("token", token);
tokenMap.put("cx", cx);
tokenMap.put("login", login);
tokenMap.put("username", username);
tokenMap.put("valueid", this.session.getAttribute("id"));
// 10天的有效期
tokenMap.put("token_time", Info.date("yyyy-MM-dd HH:mm:ss", Info.time() + 86400 * 10));
tokenMap.put("session", JSON.toJSONString(session));
Query.make("token").add(tokenMap);
return token;
}
/**
* 使用已有token 登录
*
* @return
*/
@RequestMapping("/tokenLogin")
public String tokenLogin() {
String token = request.getParameter("token");
HashMap<String, String> tokenInfo = Query.make("token").where("token", token).where("token_time", ">", Info.getDateStr()).find();
if (tokenInfo.isEmpty()) {
return jsonError("token已失效");
}
String cx = tokenInfo.get("login");
Object user = null;
if (cx.equals("管理员")) {
user = adminsService.find(tokenInfo.get("valueid"));
}
if (cx.equals("用户")) {
user = yonghuService.find(tokenInfo.get("valueid"));
}
if (user == null) {
return jsonError("没找到token中用户");
}
tokenInfo.put("session", JSON.toJSONString(user));
session.setAttribute("cx", tokenInfo.get("cx"));
session.setAttribute("login", tokenInfo.get("login"));
session.setAttribute("username", tokenInfo.get("username"));
session.setAttribute("id", tokenInfo.get("valueid"));
JSONObject session1 = JSON.parseObject(tokenInfo.get("session"));
for (Map.Entry<String, Object> entry : session1.entrySet()) {
session.setAttribute(entry.getKey(), entry.getValue());
}
session1.put("cx", tokenInfo.get("cx"));
session1.put("login", tokenInfo.get("login"));
session1.put("username", tokenInfo.get("username"));
assign("token", token);
assign("session", session1);
// 刷新token有效期
tokenInfo.put("token_time", Info.date("yyyy-MM-dd HH:mm:ss", Info.time() + 86400 * 10));
Query.make("token").where("token", token).update(tokenInfo);
return json();
}
/**
* 获取随机串
*
* @param source 源字符串
* @param length 随机串的长度
* @return 随机串
*/
private String createRandomString(String source, int length) {
if (this.isNullOrEmpty(source)) {
return "";
}
StringBuffer result = new StringBuffer();
Random random = new Random();
for (int index = 0; index < length; index++) {
result.append(source.charAt(random.nextInt(source.length())));
}
System.out.println(result.toString());
return result.toString();
}
/**
* 判断字符串是否为空
*
* @param target
* @return true:空,false:非空
*/
private boolean isNullOrEmpty(String target) {
if (null == target || "".equals(target) || target.isEmpty()) {
return true;
}
return false;
}
/**
* 后台主页面
*
* @return
*/
@RequestMapping("/main")
public String main() {
return "main";
}
/**
* 后台初始页面
*
* @return
*/
@RequestMapping("/sy")
public String sy() {
return "sy";
}
/**
* 不一定有
*
* @return
*/
@RequestMapping("/mygo")
public String mygo() {
return "mygo";
}
/**
* 头部页面
*
* @return
*/
@RequestMapping("/top")
public String top() {
return "top";
}
/**
* 验证登录页面
*
* @return
*/
@RequestMapping("/authLogin")
public String authLogin() {
String username = Request.get("username");
String pwd = Request.get("pwd");
String cx = Request.get("cx");
return authLoginUser(false, username, pwd, cx);
}
/**
* 验证后台登录
*
* @return
*/
@RequestMapping("/authAdminLogin")
public String authAdminLogin() {
String username = Request.get("username");
String pwd = Request.get("pwd");
String cx = Request.get("cx");
return authLoginUser(true, username, pwd, cx);
}
/**
* 修改登录密码页面
*
* @return
*/
@RequestMapping("/mod")
public String mod() {
return "mod";
}
/**
* 保存修改密码
*
* @return
*/
@RequestMapping("/editPassword")
public String editPassword() {
String username = request.getSession().getAttribute("username").toString();
String cx = request.getSession().getAttribute("login").toString();
String oldPassword = Request.get("oldPassword");
String newPwd = Request.get("newPwd");
String newPwd2 = Request.get("newPwd2");
if (!newPwd.equals(newPwd2)) {
return showError("两次密码不一致");
}
if (cx.equals("管理员")) {
Admins user = adminsService.login(username, oldPassword);
if (user == null) {
return showError("原密码不正确");
}
adminsService.updatePassword(user.getId(), newPwd);
}
if (cx.equals("用户")) {
Yonghu user = yonghuService.login(username, oldPassword);
if (user == null) {
return showError("原密码不正确");
}
yonghuService.updatePassword(user.getId(), newPwd);
}
return showSuccess("修改密码成功", "./mod.do");
}
}
部分功能展示
系统前台功能
- 系统首页
系统首页上面有一个轮播图的效果,轮播图可以管理员自己在管理端页面自己增加或修改,不需要改代码即可实现,同时还有人气景点,地方美食等首页信息展示,这些内容都是可以管理员在后端自定义的:
对于未登录用户是可以点击进去查看的:
【重点】这些查看的图片和信息都是管理员可以在后台进行自定义修改的,丝毫不用担心自己看不懂代码不会改怎么办。
- 新闻信息查看
用户可以点击进去查看新闻信息,默认系统有站内新闻,和行业资讯俩个分类,这里的分类展示的只是默认的俩个,管理员可以在后台自己添加修改的,用户还可以进行搜索内容。新闻信息是管理员在后台进行动态的修改管理的。
- 景区信息查看
系统默认包含本地,境内和境外三的大分类,同理这里的分类,管理员可以在后台进行增加修改或删除的,同时里面的景点信息都是由管理员在后台进行动态录入的,用户可以点击查看景点信息内容。
对于未登录用户,如果点击收藏,会提示用户请先登录:
- 美食信息查看
用户可以查看美食信息,同理,这里的分类都是可以管理员在后台进行修改的。
-
旅游线路查看
-
在线留言
对于未登录用户,如果点击的话会提示用户进行登录,对于已经登录用户,就直接回跳转到留言的页面进行在线留言:
-
用户注册
-
用户登录
用户可以通过账号和密码登录系统中,用户可以选择对应的角色进行登录,不同的角色登录到系统看到的不同页面管理;
普通用户角色
对于普通用户角色,可以在系统上面查看到上面的功能外,还可以对查看的信息进行收藏或者预订,同时还可以查看到个人中心:
-
个人中心首页
-
查看我的预订列表
-
修改个人资料,修改密码
-
我的收藏
对于用户收藏的东西会存放到个人中心页面,进行统一管理。 -
我的留言管理
管理员角色用户
对于系统管理员,除了以上的功能外,还可以动态编辑修改增加所有页面上你可以看到的信息。
-
管理员登录:管理员登录和普通用户登录是同一个页面,但登录的时候需要选择管理员角色哦
-
管理员首页
-
账号管理
管理员可以对管理员信息账号进行管理,同时还可以增加管理员,同时还对普通用户的信息进行统一管理,管理员还可以自己手动添加用户信息:
-
管理员也可以对账号密码进行修改
-
地区管理
-
景点信息管理
前台用户看到的所有的景点信息,都是可以管理员在这里进行修改的,可以根据自己的需求编辑信息,然后用户看到的就会不同了。 -
地方美食管理:美食分类管理:管理员可以查看美食分类列表或增加修改美食类型
-
美食信息管理:对于美食信息,用户可以动态的修改对应的分类下的美食信息
-
旅游路线管理
-
用户订单信息管理
-
新闻分类管理
-
新闻信息管理:管理员可以增加修改每个分类下的新闻信息
-
系统管理
-
前台轮播图管理
对于前台的轮播图,管理员可以在后台进行动态修改,或者添加的哦 -
留言管理