首页 > 编程语言 >基于SpringBoot+Vue的文学创作交流论坛系统设计与实现(源码+lw+部署+讲解)

基于SpringBoot+Vue的文学创作交流论坛系统设计与实现(源码+lw+部署+讲解)

时间:2024-10-11 15:19:12浏览次数:3  
标签:Vue SpringBoot Token 用户 token 源码 tokenEntity 文章 String

技术环境

jdk版本:1.8 及以上

ide工具:Eclipse或者 IDEA

数据库: mysql5.7

编程语言: Java

java框架:SpringBoot

maven: 3.6.1

详细技术:HTML+CSS+JAVA+SpringBoot+MYSQL+VUE+MAVEN

功能设计

课题主要采用java技术和MySQL数据库技术以及springboot框架进行开发。系统主要包括个人中心、用户管理、文章类型管理、文章信息管理、文章举报管理、警告信息管理、系统管理等功能,从而实现智能化的社交论坛管理方式,提高社交论坛管理的效率。

系统用例图如下图所示。

系统总体功能结构图如下所示:

本程序在设计结构选择上首选B/S,也是为了满足程序今后升级便利,以及程序低维护成本的要求。本程序的网络拓扑设计也会在下图展示,通过图形的方式来描述更容易理解。

系统实现效果

系统前台功能模块

当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图所示:

文章信息:在文章信息页面的输入栏中输入文章信息进行查询,可以查看到文章详细信息,并根据需要进行举报、评论或收藏操作;文章信息页面如图所示:

个人中心:在个人中心页面通过填写个人详细信息进行更新信息操作,还可以对我的收藏进行详细操作;如图所示:

管理员功能模块

管理员进入主页面,主要功能包括对个人中心、用户管理、文章类型管理、文章信息管理、文章举报管理、警告信息管理、系统管理等进行操作。

管理员点击用户管理。在用户页面输入用户姓名进行查询、新增或删除用户列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图所示:

管理员点击文章信息管理。在文章信息页面输入用户账号和选择是否通过进行查询或删除文章信息列表,并根据需要对文章详情信息进行详情、查看评论或删除操作;如图所示:

管理员点击文章举报管理。在文章举报页面输入文章标题、文章类型和选择是否通过进行查询列表,并根据需要对文章举报详情信息进行详情或警告操作;如图所示:

管理员点击系统管理。在系统公告页面输入标题进行查询、新增或删除系统公告列表,并根据需要对系统公告详情信息进行详情、修改或删除操作;还可以对系统简介、轮播图管理、在线客服和关于我们进行详细操作;如图所示:

用户功能模块

用户进入系统可以对个人中心、文章信息管理、文章举报管理等功能进行操作。用户主页面如图所示:

海量实战案例

所有实战项目源码均为博主收集和开发,亲测可用,质量保障,大家可以放心使用,当然也可根据需求定制开发。

代码参考

// 忽略权限验证的注解
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
   // 查询用户信息
   UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
   // 判断用户是否存在或密码是否正确
   if(user==null || !user.getPassword().equals(password)) {
      return R.error("账号或密码不正确");
   }
   // 生成token
   String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
   return R.ok().put("token", token);
}

// 生成token
@Override
public String generateToken(Long userid,String username, String tableName, String role) {
   // 查询是否存在已有token
   TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
   // 生成随机token字符串
   String token = CommonUtil.getRandomString(32);
   // 设置token过期时间为1小时后
   Calendar cal = Calendar.getInstance();   
   cal.setTime(new Date());   
   cal.add(Calendar.HOUR_OF_DAY, 1);
   if(tokenEntity!=null) {
      // 更新token信息
      tokenEntity.setToken(token);
      tokenEntity.setExpiratedtime(cal.getTime());
      this.updateById(tokenEntity);
   } else {
      // 新建token记录
      this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
   }
   return token;
}

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

    // 定义Token在请求Header中的键名
    public static final String LOGIN_TOKEN_KEY = "Token";

    @Autowired
    private TokenService tokenService;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 支持跨域请求
        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"));

        // 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态
        if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
            response.setStatus(HttpStatus.OK.value());
            return false;
        }
        
        // 获取HandlerMethod注解
        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;
        }
        
        // 根据token获取token实体
        TokenEntity tokenEntity = null;
        if(StringUtils.isNotBlank(token)) {
            tokenEntity = tokenService.getTokenEntity(token);
        }
        
        if(tokenEntity != null) {
            // 将用户信息存入session
            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;
        }
        
        // 验证失败,返回401错误和提示信息
        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();
            }
        }
        return false;
    }
}

这段Java代码主要是一个登录功能的实现,涉及到生成Token和权限验证的拦截器。

@IgnoreAuth 注解:这是一个自定义的注解,用于标识不需要进行权限验证的方法。

@PostMapping(value = “/login”):这是一个使用POST请求方式的登录接口。

login 方法:该方法接收用户名、密码和验证码作为参数,并返回一个包含生成的Token的响应对象。首先通过用户名查询用户信息,然后判断用户是否存在并验证密码是否正确。如果验证失败,则返回错误提示;如果验证成功,则调用 generateToken 方法生成Token,并将其添加到响应对象中返回。

generateToken 方法:该方法用于生成Token。首先查询是否存在已有的Token实体,然后生成一个随机的Token字符串。接下来,设置Token的过期时间为当前时间加上1小时,并根据情况进行更新或插入Token记录。最后返回生成的Token字符串。

AuthorizationInterceptor 类:这是一个权限验证拦截器实现类。它实现了 HandlerInterceptor 接口,用于在请求处理之前进行权限验证。在 preHandle 方法中,首先设置支持跨域请求的相关头信息,并处理跨域时的 OPTIONS 请求。然后,通过反射获取请求处理方法上的 @IgnoreAuth 注解,如果存在该注解,则直接放过。接着,从请求头中获取 Token,并根据 Token 获取对应的 Token 实体。如果 Token 实体存在,则将用户信息存入session,并放行请求。如果验证失败,则返回401错误和相应的提示信息。

总结,这段代码实现了一个基本的登录功能,并加入了对权限的验证拦截,确保只有拥有有效 Token 的用户才能访问受限资源。

源码及文档获取

README.md · yuanmadd/HuoQuYuanMa - Gitee.com

标签:Vue,SpringBoot,Token,用户,token,源码,tokenEntity,文章,String
From: https://blog.csdn.net/hehaimingg/article/details/142781302

相关文章

  • 基于SpringBoot+Vue的多媒体素材管理系统设计与实现(源码+lw+部署+讲解)
    技术环境jdk版本:1.8及以上ide工具:Eclipse或者IDEA数据库:mysql5.7编程语言:Javajava框架:SpringBootmaven:3.6.1详细技术:HTML+CSS+JAVA+SpringBoot+MYSQL+VUE+MAVEN功能设计该系统采用了java技术、SpringBoot框架,连接MySQL数据库,具有较高的信息传输速率与......
  • springboot企业招聘管理系统
    基于springboot+vue实现的企业招聘管理系统 (源码+L文+ppt)4-089   4.3系统结构设计  构图是系统的体系结构,体系结构是体系结构体系的重要组成部分。系统的总体结构设计如图4-2所示。   图4-2系统总体架构图4.4数据库设计  4.4.1数据库设计原则  ......
  • springboot酒店在线预订系统
    基于springboot+vue实现的酒店在线预订系统 (源码+L文+ppt)4-082                                   4.2 系统结构设计  构图是系统的体系结构,体系结构是体系结构体系的一部分,体系结构体系是体系结......
  • Freertos应用与源码分析:临界区
    目录一、概述二、应用三、源码分析1、进入临界区2、退出临界区3、中断临界区(1)应用(2)进入中断临界区(3)退出中断临界区四、注意事项一、概述        当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整......
  • 【JAVA开源】基于Vue和SpringBoot卫生健康系统
    本文项目编号T076,文末自助获取源码\color{red}{T076,文末自助获取源码}......
  • 在Vue3中如何实现四种全局状态数据的统一管理?HB
    四种全局状态数据在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端)、同步数据。同步数据又分为三种:localstorage、cookie、内存。在传统的Vue3当中,分别采用不同的机制来处理这些状态数据,而在Zova中只需要采用统一的Model机制状态数据传统的Vue3Zova异......
  • 计算机毕业设计 | vue+SpringBoot图书借阅管理系统 图书管理系统(附源码)
    1,概述1.1课题背景随着现在科学技术的进步,人类社会正逐渐走向信息化,图书馆拥有丰富的文献信息资源,是社会系统的重要组成部分,在信息社会中作用越来越重要,在我国图书馆计算机等信息技术的应用起步于20世纪70年代末期,随着改革开放的步伐的迅速发展,特别是90年代以后,我......
  • 批量生成二维码源码系统 一键生成二维码 带完整的安装代码包以及搭建部署教程
    系统概述批量生成二维码源码系统是一款功能强大的工具,它旨在为用户提供高效、便捷的二维码生成服务。该系统采用先进的技术和算法,能够快速生成大量高质量的二维码,满足不同用户的需求。该系统具有高度的可扩展性和灵活性,能够与各种应用场景和业务需求相结合。无论是在商业营销......
  • 计算机毕业设计 | SSM 旅游网站后台管理系统(附源码)
    1,概述1.1背景分析随着人们生活水平的提高和对休闲旅游的日益重视,旅游业已成为全球最大的经济产业之一。越来越多的人选择通过在线方式进行旅行预订,这种趋势为旅游网站提供了巨大的商机。用户体验是决定旅游网站成功与否的关键因素。良好的用户界面设计、快速的搜索结果、......
  • 一款Java CMS 网站管理系统,基于RuoYi-fast二次开发,网站后台采用SpringBoot + MyBati
    一款JavaCMS网站管理系统基于RuoYi-fast二次开发,网站后台采用SpringBoot+MyBatis文章目录前言一、开源地址二、环境要求三、功能亮点3.1扩展功能3.2内置功能四、安装方法4.1、拉取源码4.2、修改数据库链接配置4.3、创建数据库并导入数据4.4、配置资源上传......