• SpringBoot+Vue项目旅游信息推荐系统【源码开源】


    今天又来给大家分享项目了是一个基于SpringBoot+Vue前后端分离的旅游信息推荐系统,非常值得大家去学习,点赞、收藏、评论多多支持一下
    源码在文章末尾链接获取

    目录

    前言介绍

    数据库表结构 

    前台首页功能模块 

    首页

    旅游新闻

    新闻详情

    景区信息  ​

    美食信息 ​

    美食详情

    旅游线路

    线路详情 

    在线留言​

    管理员功能模块

    账号管理

    地区管理

    景点信息管理 

    地方美食管理 

    旅游线路管理 

    订单信息管理

    新闻管理

    ​编辑系统管理​

    用户功能模块 

    线路预定管理

    个人中心 

    部分核心代码: 

    AdminsController.java

    CommonController.java

    YouqinglianjieController.java

    源码链接

    链接:https://pan.baidu.com/s/1oklSr-y1IefhtWmvisSSoQ 提取码:cijf


    前言介绍

    本系统采用了Java技术,将所有业务模块采用以浏览器交互的模式,选择MySQL作为系统的数据库,开发工具选择IntelliJ IDEA来进行系统的设计。基本实现了旅游信息推荐系统应有的主要功能模块,本系统有管理员和用户。
    1.首页:首页,旅游新闻(行业资讯,站内新闻),景区信息(境外,境内,本地),美食信息,旅游线路,在线路,在线留言,注册。
    2.管理员:账号管理,地区管理,景点信息管理,地方美食管理,旅游线路管理,订单信息管理,新闻管理,系统管理等等功能
     

    数据库表结构 

    【收藏记录】模块,表名:shoucangjilu

    字段名

    字段类型

    名称

    id

    int

    (主键)

    username

    varchar(255)

    收藏用户

    xwid

    int

    对应模块id

    biao

    varchar(255)

    收藏得模块

    biaoti

    varchar(255)

    显示的标题

    url

    varchar(512)

    收藏URL

    ziduan

    varchar(255)

    对应模块字段

    addtime

    timestamp

    添加时间

    【收藏记录】模块,表名:shoucangjilu

    字段名

    字段类型

    名称

    id

    int

    (主键)

    username

    varchar(255)

    收藏用户

    xwid

    int

    对应模块id

    biao

    varchar(255)

    收藏得模块

    biaoti

    varchar(255)

    显示的标题

    url

    varchar(512)

    收藏URL

    ziduan

    varchar(255)

    对应模块字段

    addtime

    timestamp

    添加时间

    【管理员】模块,表名:admins

    字段名

    字段类型

    名称

    id

    int

    (主键)

    username

    varchar(50)

    帐号

    pwd

    varchar(50)

    密码

    addtime

    timestamp

    添加时间

    【用户】模块,表名:yonghu

    字段名

    字段类型

    名称

    id

    int

    (主键)

    yonghuming

    varchar(50)

    用户名

    mima

    varchar(50)

    密码

    xingming

    varchar(50)

    姓名

    xingbie

    varchar(255)

    性别

    shouji

    varchar(50)

    手机

    youxiang

    varchar(50)

    邮箱

    shenfenzheng

    varchar(50)

    身份证

    touxiang

    varchar(255)

    头像

    addtime

    timestamp

    添加时间

    【新闻分类】模块,表名:xinwenfenlei

    字段名

    字段类型

    名称

    id

    int

    (主键)

    fenleimingcheng

    varchar(50)

    分类名称

    addtime

    timestamp

    添加时间

    【景点信息】模块,表名:jingdianxinxi

    字段名

    字段类型

    名称

    id

    int

    (主键)

    jingdianbianhao

    varchar(50)

    景点编号

    jingdianmingcheng

    varchar(255)

    景点名称

    suoshudiqu

    int

    所属地区

    tupian

    text

    图片

    kaifangshijian

    varchar(255)

    开放时间

    fujinmeishi

    text

    附近美食

    dizhi

    varchar(255)

    地址

    piaojia

    decimal(18, 2)

    票价

    liulanliang

    int

    浏览量

    miaoshu

    longtext

    描述

    addtime

    timestamp

    添加时间

    设置索引, 字段:suoshudiqu , 关联表【diqu】中的id 字段

    【旅游线路】模块,表名:lvyouxianlu

    字段名

    字段类型

    名称

    id

    int

    (主键)

    xianlubianhao

    varchar(50)

    线路编号

    xianlumingcheng

    varchar(255)

    线路名称

    tupian

    text

    图片

    chufadi

    varchar(255)

    出发地

    tujingdi

    varchar(255)

    途经地

    zhongdian

    varchar(255)

    终点

    jiage

    decimal(18, 2)

    价格

    liulanliang

    int

    浏览量

    xianlutese

    longtext

    线路特色

    xianlujianjie

    longtext

    线路简介

    addtime

    timestamp

    添加时间

    【预定】模块,表名:yuding

    字段名

    字段类型

    名称

    id

    int

    (主键)

    lvyouxianluid

    int

    旅游线路id

    xianlubianhao

    varchar(50)

    线路编号

    xianlumingcheng

    varchar(255)

    线路名称

    chufadi

    varchar(255)

    出发地

    tujingdi

    varchar(255)

    途经地

    zhongdian

    varchar(255)

    终点

    jiage

    decimal(18, 2)

    价格

    dingdanhao

    varchar(50)

    订单号

    yudingshijian

    varchar(25)

    预订时间

    yudingrenxingming

    varchar(50)

    预订人姓名

    lianxifangshi

    varchar(50)

    联系方式

    zhuangtai

    varchar(50)

    状态

    beizhu

    text

    备注

    yudingren

    varchar(50)

    预订人

    addtime

    timestamp

    添加时间

    iszf

    varchar(10)

    是否支付

    设置索引, 字段:lvyouxianluid , 关联表【lvyouxianlu】中字段id

    前台首页功能模块 

    首页

     

     

    旅游新闻

    新闻详情

     

    景区信息  

    美食信息

    美食详情

    旅游线路

    线路详情 

    在线留言

    管理员功能模块

    账号管理

    地区管理

    景点信息管理 

    地方美食管理 

    旅游线路管理 

    订单信息管理

    新闻管理

    系统管理

    用户功能模块 

    线路预定管理

    个人中心 

    部分核心代码: 

    AdminsController.java

    1. /**
    2. * 管理员 */
    3. @Controller
    4. public class AdminsController extends BaseController
    5. {
    6. @Autowired
    7. private AdminsMapper dao;
    8. @Autowired
    9. private AdminsService service;
    10. /**
    11. * 后台列表页
    12. *
    13. */
    14. @RequestMapping("/admins_list")
    15. public String list()
    16. {
    17. // 检测是否有登录,没登录则跳转到登录页面
    18. if(!checkLogin()){
    19. return showError("尚未登录" , "./login.do");
    20. }
    21. String order = Request.get("order" , "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
    22. String sort = Request.get("sort" , "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
    23. int pagesize = Request.getInt("pagesize" , 12); // 获取前台一页多少行数据
    24. Example example = new Example(Admins.class); // 创建一个扩展搜索类
    25. Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
    26. String where = " 1=1 "; // 创建初始条件为:1=1
    27. where += getWhere(); // 从方法中获取url 上的参数,并写成 sql条件语句
    28. criteria.andCondition(where); // 将条件写进上面的扩展条件类中
    29. if(sort.equals("desc")){ // 判断前台提交的sort 参数是否等于 desc倒序 是则使用倒序,否则使用正序
    30. example.orderBy(order).desc(); // 把sql 语句设置成倒序
    31. }else{
    32. example.orderBy(order).asc(); // 把 sql 设置成正序
    33. }
    34. int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1
    35. page = Math.max(1 , page); // 取两个数的最大值,防止page 小于1
    36. List<Admins> list = service.selectPageExample(example , page , pagesize); // 获取当前页的行数
    37. // 将列表写给界面使用
    38. assign("totalCount" , request.getAttribute("totalCount"));
    39. assign("list" , list);
    40. assign("orderby" , order); // 把当前排序结果写进前台
    41. assign("sort" , sort); // 把当前排序结果写进前台
    42. return json(); // 将数据写给前端
    43. }
    44. public String getWhere()
    45. {
    46. _var = new LinkedHashMap(); // 重置数据
    47. String where = " ";
    48. // 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
    49. if(!Request.get("username").equals("")) {
    50. where += " AND username LIKE '%"+Request.get("username")+"%' ";
    51. }
    52. return where;
    53. }
    54. @RequestMapping("/admins_add")
    55. public String add()
    56. {
    57. _var = new LinkedHashMap(); // 重置数据
    58. return json(); // 将数据写给前端
    59. }
    60. @RequestMapping("/admins_updt")
    61. public String updt()
    62. {
    63. _var = new LinkedHashMap(); // 重置数据
    64. int id = Request.getInt("id");
    65. // 获取行数据,并赋值给前台jsp页面
    66. Admins mmm = service.find(id);
    67. assign("mmm" , mmm);
    68. assign("updtself" , 0);
    69. return json(); // 将数据写给前端
    70. }
    71. @RequestMapping("/admins_updtself")
    72. public String updtself()
    73. {
    74. _var = new LinkedHashMap(); // 重置数据
    75. // 更新个人资料
    76. int id = (int)request.getSession().getAttribute("id");
    77. Admins mmm = service.find(id);
    78. assign("mmm" , mmm);
    79. assign("updtself" , 1);
    80. return json(); // 将数据写给前端
    81. }
    82. /**
    83. * 添加内容
    84. * @return
    85. */
    86. @RequestMapping("/adminsinsert")
    87. public String insert()
    88. {
    89. _var = new LinkedHashMap(); // 重置数据
    90. String tmp="";
    91. Admins post = new Admins(); // 创建实体类
    92. // 设置前台提交上来的数据到实体类中
    93. post.setUsername(Request.get("username"));
    94. post.setPwd(Request.get("pwd"));
    95. post.setAddtime(Info.getDateStr());
    96. service.insert(post); // 插入数据
    97. int charuid = post.getId().intValue();
    98. if(isAjax()){
    99. return jsonResult(post);
    100. }
    101. return showSuccess("保存成功" , Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
    102. }
    103. /**
    104. * 更新内容
    105. * @return
    106. */
    107. @RequestMapping("/adminsupdate")
    108. public String update()
    109. {
    110. _var = new LinkedHashMap(); // 重置数据
    111. // 创建实体类
    112. Admins post = new Admins();
    113. // 将前台表单数据填充到实体类
    114. if(!Request.get("username").equals(""))
    115. post.setUsername(Request.get("username"));
    116. if(!Request.get("pwd").equals(""))
    117. post.setPwd(Request.get("pwd"));
    118. if(!Request.get("addtime").equals(""))
    119. post.setAddtime(Request.get("addtime"));
    120. post.setId(Request.getInt("id"));
    121. service.update(post); // 更新数据
    122. int charuid = post.getId().intValue();
    123. if(isAjax()){
    124. return jsonResult(post);
    125. }
    126. if(Request.getInt("updtself") == 1){
    127. return showSuccess("保存成功" , "admins_updtself.do");
    128. }
    129. return showSuccess("保存成功" , Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面
    130. }
    131. /**
    132. * 删除
    133. */
    134. @RequestMapping("/admins_delete")
    135. public String delete()
    136. {
    137. _var = new LinkedHashMap(); // 重置数据
    138. if(!checkLogin()){
    139. return showError("尚未登录");
    140. }
    141. int id = Request.getInt("id"); // 根据id 删除某行数据
    142. HashMap map = Query.make("admins").find(id);
    143. service.delete(id);// 根据id 删除某行数据
    144. return showSuccess("删除成功",request.getHeader("referer"));//弹出删除成功,并跳回上一页
    145. }
    146. }

    CommonController.java

    1. /**
    2. * 公共路由
    3. */
    4. @Controller
    5. public class CommonController extends BaseController{
    6. /**
    7. * 使用ajax 检测某表中某个字段是否已存在,已存在则无法提交
    8. * @return
    9. */
    10. @RequestMapping(value = "/checkno")
    11. @ResponseBody
    12. public String checkon()
    13. {
    14. String table = request.getParameter("table");
    15. String col = request.getParameter("col");
    16. String checktype = request.getParameter("checktype");
    17. String value = request.getParameter(col);
    18. if(checktype.equals("insert")){
    19. if(Query.make(table).where(col , value).count() > 0){
    20. return "false";
    21. }else{
    22. return "true";
    23. }
    24. }else if(checktype.equals("update")){
    25. String id = request.getParameter("id") == null ? "" : request.getParameter("id");
    26. if(Query.make(table).where(col , value).where("id" , "neq" , id).count() > 0){
    27. return "false";
    28. }else{
    29. return "true";
    30. }
    31. }
    32. return "false";
    33. }
    34. /**
    35. * 审核数据,将是否审核改为已审核状态,点击一下 是 则变否, 点击一下 否 变为是
    36. * @return
    37. */
    38. @RequestMapping("/sh")
    39. @ResponseBody
    40. public String sh()
    41. {
    42. String yuan=request.getParameter("yuan");
    43. String id=request.getParameter("id");
    44. String tablename=request.getParameter("tablename");
    45. String sql="";
    46. if(yuan.equals("是"))
    47. {
    48. sql="update "+tablename+" set issh='否' where id="+id;
    49. }
    50. else
    51. {
    52. sql="update "+tablename+" set issh='是' where id="+id;
    53. }
    54. new CommDAO().commOper(sql);
    55. if(isAjax())
    56. {
    57. jsonResult("ok");
    58. return "";
    59. }
    60. return "<script>location.href='"+request.getHeader("Referer")+"';</script>";
    61. }
    62. /**
    63. * 获取表的某行数据
    64. * @return
    65. */
    66. @RequestMapping("/tableAjax")
    67. @ResponseBody
    68. public String tableFind()
    69. {
    70. String table = request.getParameter("table");
    71. String id = request.getParameter("id");
    72. Map map = Query.make(table).where("id" , id).find();
    73. //JSONObject json = JSONObject.parse(map);
    74. return JSON.toJSONString(map);//.toString();
    75. }
    76. /**
    77. * 获取某表得某行数据
    78. *
    79. */
    80. @RequestMapping("/selectView")
    81. public String selectView()
    82. {
    83. String key = request.getParameter("key");
    84. String table = request.getParameter("table");
    85. String value = request.getParameter("value");
    86. Map data = Query.make(table).where(key,value).find();
    87. return jsonResult(data);
    88. }
    89. /**
    90. * 获取某表得所有数据
    91. *
    92. */
    93. @RequestMapping("/selectAll")
    94. public String selectAll()
    95. {
    96. String table = request.getParameter("table");
    97. Query query = Query.make(table);
    98. if(request.getParameter("where") != null){
    99. JSONObject where = JSON.parseObject(Request.get("where"));
    100. for(Map.Entry entry:where.entrySet())
    101. {
    102. String key = (String)entry.getKey();
    103. Object value = entry.getValue();
    104. if(value instanceof JSONObject)
    105. {
    106. JSONObject w = (JSONObject) value;
    107. query.where(key , w.getString("exp") , w.getString("value"));
    108. }else if(value instanceof JSONArray){
    109. JSONArray w = (JSONArray) value;
    110. query.where(key , (String) w.get(0) , w.get(1));
    111. }else{
    112. query.where(key , value);
    113. }
    114. }
    115. }
    116. if(request.getParameter("limit")!=null)
    117. {
    118. query.limit(Request.get("limit"));
    119. }
    120. if(request.getParameter("order")!=null)
    121. {
    122. query.order(Request.get("order"));
    123. }
    124. if(request.getParameter("field")!=null)
    125. {
    126. query.field(Request.get("field"));
    127. }
    128. List list = query.select();
    129. return jsonResult(list);
    130. }
    131. /**
    132. * 搜索下拉某表的数据
    133. * @return
    134. */
    135. @RequestMapping("/selectUpdateSearch")
    136. @ResponseBody
    137. public String selectUpdateSearch()
    138. {
    139. String table = Request.get("table");
    140. Query query = Query.make(table);
    141. String limit = "50";
    142. JSONObject where = JSON.parseObject(Request.get("where"));
    143. for(Map.Entry entry:where.entrySet())
    144. {
    145. String key = (String)entry.getKey();
    146. Object value = entry.getValue();
    147. if("limit".equals(key)){
    148. limit = String.valueOf(value);
    149. }else{
    150. if(value instanceof JSONObject)
    151. {
    152. JSONObject w = (JSONObject) value;
    153. query.where(key , w.getString("exp") , w.getString("value"));
    154. }else if(value instanceof JSONArray){
    155. JSONArray w = (JSONArray) value;
    156. query.where(key , (String) w.get(0) , w.get(1));
    157. }else{
    158. query.where(key , value);
    159. }
    160. }
    161. }
    162. List list = query.order("id desc").limit(limit).select();
    163. return JSON.toJSONString(list);
    164. }
    165. }

    YouqinglianjieController.java

    1. /**
    2. * 友情链接 */
    3. @Controller
    4. public class YouqinglianjieController extends BaseController
    5. {
    6. @Autowired
    7. private YouqinglianjieMapper dao;
    8. @Autowired
    9. private YouqinglianjieService service;
    10. /**
    11. * 后台列表页
    12. *
    13. */
    14. @RequestMapping("/youqinglianjie_list")
    15. public String list()
    16. {
    17. // 检测是否有登录,没登录则跳转到登录页面
    18. if(!checkLogin()){
    19. return showError("尚未登录" , "./login.do");
    20. }
    21. String order = Request.get("order" , "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
    22. String sort = Request.get("sort" , "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
    23. int pagesize = Request.getInt("pagesize" , 12); // 获取前台一页多少行数据
    24. Example example = new Example(Youqinglianjie.class); // 创建一个扩展搜索类
    25. Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
    26. String where = " 1=1 "; // 创建初始条件为:1=1
    27. where += getWhere(); // 从方法中获取url 上的参数,并写成 sql条件语句
    28. criteria.andCondition(where); // 将条件写进上面的扩展条件类中
    29. if(sort.equals("desc")){ // 判断前台提交的sort 参数是否等于 desc倒序 是则使用倒序,否则使用正序
    30. example.orderBy(order).desc(); // 把sql 语句设置成倒序
    31. }else{
    32. example.orderBy(order).asc(); // 把 sql 设置成正序
    33. }
    34. int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1
    35. page = Math.max(1 , page); // 取两个数的最大值,防止page 小于1
    36. List<Youqinglianjie> list = service.selectPageExample(example , page , pagesize); // 获取当前页的行数
    37. // 将列表写给界面使用
    38. assign("totalCount" , request.getAttribute("totalCount"));
    39. assign("list" , list);
    40. assign("orderby" , order); // 把当前排序结果写进前台
    41. assign("sort" , sort); // 把当前排序结果写进前台
    42. return json(); // 将数据写给前端
    43. }
    44. public String getWhere()
    45. {
    46. _var = new LinkedHashMap(); // 重置数据
    47. String where = " ";
    48. // 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
    49. return where;
    50. }
    51. @RequestMapping("/youqinglianjie_add")
    52. public String add()
    53. {
    54. _var = new LinkedHashMap(); // 重置数据
    55. return json(); // 将数据写给前端
    56. }
    57. @RequestMapping("/youqinglianjie_updt")
    58. public String updt()
    59. {
    60. _var = new LinkedHashMap(); // 重置数据
    61. int id = Request.getInt("id");
    62. // 获取行数据,并赋值给前台jsp页面
    63. Youqinglianjie mmm = service.find(id);
    64. assign("mmm" , mmm);
    65. assign("updtself" , 0);
    66. return json(); // 将数据写给前端
    67. }
    68. /**
    69. * 添加内容
    70. * @return
    71. */
    72. @RequestMapping("/youqinglianjieinsert")
    73. public String insert()
    74. {
    75. _var = new LinkedHashMap(); // 重置数据
    76. String tmp="";
    77. Youqinglianjie post = new Youqinglianjie(); // 创建实体类
    78. // 设置前台提交上来的数据到实体类中
    79. post.setWangzhanmingcheng(Request.get("wangzhanmingcheng"));
    80. post.setWangzhi(Request.get("wangzhi"));
    81. post.setAddtime(Info.getDateStr());
    82. service.insert(post); // 插入数据
    83. int charuid = post.getId().intValue();
    84. if(isAjax()){
    85. return jsonResult(post);
    86. }
    87. return showSuccess("保存成功" , Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
    88. }
    89. /**
    90. * 更新内容
    91. * @return
    92. */
    93. @RequestMapping("/youqinglianjieupdate")
    94. public String update()
    95. {
    96. _var = new LinkedHashMap(); // 重置数据
    97. // 创建实体类
    98. Youqinglianjie post = new Youqinglianjie();
    99. // 将前台表单数据填充到实体类
    100. if(!Request.get("wangzhanmingcheng").equals(""))
    101. post.setWangzhanmingcheng(Request.get("wangzhanmingcheng"));
    102. if(!Request.get("wangzhi").equals(""))
    103. post.setWangzhi(Request.get("wangzhi"));
    104. if(!Request.get("addtime").equals(""))
    105. post.setAddtime(Request.get("addtime"));
    106. post.setId(Request.getInt("id"));
    107. service.update(post); // 更新数据
    108. int charuid = post.getId().intValue();
    109. if(isAjax()){
    110. return jsonResult(post);
    111. }
    112. return showSuccess("保存成功" , Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面
    113. }
    114. /**
    115. * 删除
    116. */
    117. @RequestMapping("/youqinglianjie_delete")
    118. public String delete()
    119. {
    120. _var = new LinkedHashMap(); // 重置数据
    121. if(!checkLogin()){
    122. return showError("尚未登录");
    123. }
    124. int id = Request.getInt("id"); // 根据id 删除某行数据
    125. HashMap map = Query.make("youqinglianjie").find(id);
    126. service.delete(id);// 根据id 删除某行数据
    127. return showSuccess("删除成功",request.getHeader("referer"));//弹出删除成功,并跳回上一页
    128. }
    129. }

    源码链接

    链接:https://pan.baidu.com/s/1oklSr-y1IefhtWmvisSSoQ 
    提取码:cijf

     欢迎各位小伙伴们点赞,评论,收藏,关注博主以后会出更多项目分享给大家

  • 相关阅读:
    【opencv-c++】windows10系统VisualStudio2022配置opencv_contrib-4.6.0
    hive笔记八:自定义函数-自定义UDF函数/自定义UDTF函数
    《MongoDB入门教程》第11篇 数组运算符
    Linux学习笔记---编辑器Vim
    策略回测从2小时提速到1分钟,DolphinDB 助力华夏基金量化投研
    Codeforces Round #833 (Div. 2)
    【LeetCode:2698. 求一个整数的惩罚数 | 递归】
    3、在docker 容器中安装tomcat
    【C++进阶之路】第九篇:特殊类设计
    Python操作Excel常用方法汇总
  • 原文地址:https://blog.csdn.net/m0_49113107/article/details/125414731