当前位置: 首页 > article >正文

旅游推荐系统设计与实现 计算机毕业设计 有源码 P10090

项目说明

本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。

如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传!

项目源码获取方式放在文章末尾处

注:项目仅供学习使用,不可商用,如涉及侵权请联系我删除

项目技术

数据库:mysql5.7

开发语言:java、html

开发工具:idea、vscode

前端技术:vue

后端技术:springboot

有参考文档

功能简介

该项目是一个旅游推荐平台,有管理后台、用户前台功能,具体功能菜单如下:

管理后台

首页

个人中心

   修改密码

   个人信息

数据管理

    景点类型管理

    路线类型管理

    公告类型管理

公告信息管理

景点信息管理

    景点信息管理

    景点信息留言管理

    景点信息收藏管理

旅游路线管理

    旅游路线管理

    旅游路线留言管理

    旅游路线收藏管理

用户管理

轮播图信息

用户前台

登录

首页

公告信息

论坛

景点信息

旅游路线

个人中心

后台管理

注:如果想修改部分功能或新增删除,可以联系我做功能改动。也可以联系我定制开发,保证项目唯一性,没有代码冗余,提供讲解服务。                                            

项目截图

1.文档截图(有完整的文档参考)

2.项目部分功能截图

本号所提供的项目均来自我个人付费购得或互联网收集,不可商用,如涉及侵权,请联系删除。

代码片段

package com.interceptor;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import com.annotation.IgnoreAuth;
import com.entity.EIException;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.R;

/**
 * 权限(Token)验证
 */
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {

    public static final String LOGIN_TOKEN_KEY = "Token";

    @Autowired
    private TokenService tokenService;
    
	@Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


        String servletPath = request.getServletPath();
        if("/dictionary/page".equals(request.getServletPath())  || "/file/upload".equals(request.getServletPath()) || "/yonghu/register".equals(request.getServletPath()) ){//请求路径是字典表或者文件上传 直接放行
            return true;
        }
        //支持跨域请求
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

        IgnoreAuth annotation;
        if (handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
        } else {
            return true;
        }

        //从header中获取token
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        
        /**
         * 不需要验证权限的方法直接放过
         */
        if(annotation!=null) {
        	return true;
        }
        
        TokenEntity tokenEntity = null;
        if(StringUtils.isNotBlank(token)) {
        	tokenEntity = tokenService.getTokenEntity(token);
        }
        
        if(tokenEntity != null) {
        	request.getSession().setAttribute("userId", tokenEntity.getUserid());
        	request.getSession().setAttribute("role", tokenEntity.getRole());
        	request.getSession().setAttribute("tableName", tokenEntity.getTablename());
        	request.getSession().setAttribute("username", tokenEntity.getUsername());
        	return true;
        }
        
		PrintWriter writer = null;
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		try {
		    writer = response.getWriter();
		    writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
		} finally {
		    if(writer != null){
		        writer.close();
		    }
		}
//				throw new EIException("请先登录", 401);
		return false;
    }
}

项目源码获取方式

注:需要在手机上操作,如果遇到链接失效可以直接联系我

第一步:点击关注:程序员小嗨

第二步:对话框输入:源码,点击进入小程序。

第三步:进入小程序后在搜索界面输入标题或编号,然后点击[获取链接]


http://www.kler.cn/a/449699.html

相关文章:

  • 程控电阻箱应用中需要注意哪些安全事项?
  • C++中的模板元编程
  • ChatGPT接口测试用例生成的流程
  • ChatGPT之父:奥尔特曼
  • Datawhale AI冬令营——Chat-悟空设计
  • How to run Flutter on an Embedded Device
  • Vue3自定义hook函数
  • Calcite Web 项目常见问题解决方案
  • 逻辑回归之KS曲线
  • 基于Matlab实现无刷直流电机仿真
  • springBoot Maven 剔除无用的jar引用
  • 坑人 C# MySql.Data SDK
  • 蓝牙的世界:HarmonyOS Next中的蓝牙接入和连接
  • 【py脚本+logstash+es实现自动化检测工具】
  • 多模态去噪信息收集
  • 本机如何连接虚拟机MYSQL
  • 深入了解 Kubernetes Pod 的状态
  • StarRocks 生产部署一套集群,存储空间如何规划?
  • 【MySQL初阶】--- 库和表的操作
  • (2024.12)Ubuntu20.04安装openMVS<成功>.colmap<成功>和openMVG<失败>记录
  • gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘
  • 【国产NI替代】基于国产FPGA+兆易创新GD32F450的全国产16振动+2转速(24bits)高精度终端采集板卡
  • DeepFaceLab技术浅析(五):面部替换
  • Git(9)之创建新空白分支
  • 【爬虫开发】爬虫开发从0到1全知识教程第11篇:Mongodb数据库,介绍【附代码文档】
  • 力扣第114题:二叉树展开为链表