项目名称:springboot-vue-login-template


✅ 功能一览

模块功能
后端Spring Boot + MyBatis Plus + JWT + Shiro
数据库MySQL 用户表
前端Vue3 + Element Plus + Axios
登录流程用户名/密码验证 → 返回 Token → 存储 LocalStorage
权限控制拦截器校验 Token + Shiro 角色权限
跨域配置后端支持跨域请求
接口安全所有接口需携带 Token 访问

📁 项目结构概览

springboot-vue-login-template/
├── backend/             # Spring Boot 后端模块
│   ├── src/main/java      # Java源码
│   ├── src/main/resources # 配置文件
│   └── pom.xml            # Maven依赖管理
├── frontend/            # Vue3 前端模块
│   ├── public/
│   ├── src/
│   │   ├── views/         # 页面组件
│   │   ├── utils/         # 工具类
│   │   └── main.js        # 入口文件
│   └── package.json       # 依赖管理
└── README.md              # 项目说明文档

🧱 数据库脚本(MySQL)

CREATE DATABASE springboot_login;USE springboot_login;CREATE TABLE sys_user (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,nickname VARCHAR(50),create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 示例用户(密码为123456)
INSERT INTO sys_user (username, password, nickname)
VALUES ('admin', '$2a$10$eACCYoNOHEzWZhE8Cwe6gOXEpTLExV6l', '管理员');

🚀 后端代码(Spring Boot)

1. application.yml

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/springboot_login?useSSL=false&serverTimezone=UTCusername: rootpassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:/mapper/*.xml

2. JWT 工具类 JwtUtils.java

import io.jsonwebtoken.*;
import java.util.Date;public class JwtUtils {private static final String SECRET = "your-secret-key";private static final long EXPIRATION = 86400000; // 24小时public static String generateToken(String username) {return Jwts.builder().setSubject(username).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)).signWith(SignatureAlgorithm.HS512, SECRET).compact();}public static String parseToken(String token) {return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject();}
}

3. 登录接口 AuthController.java

@RestController
@RequestMapping("/api/auth")
public class AuthController {@Autowiredprivate UserService userService;@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest request) {SysUser user = userService.findByUsername(request.getUsername());if (user == null || !user.getPassword().equals(request.getPassword())) {throw new RuntimeException("用户名或密码错误");}String token = JwtUtils.generateToken(user.getUsername());return ResponseEntity.ok().header("Authorization", "Bearer " + token).build();}
}

4. 自定义拦截器 JwtInterceptor.java

@Component
public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {token = token.substring(7);String username = JwtUtils.parseToken(token);UsernamePasswordToken shiroToken = new UsernamePasswordToken(username, "");SecurityUtils.getSubject().login(shiroToken);}return true;}
}

5. 注册拦截器 WebConfig.java

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/**").excludePathPatterns("/api/auth/login");}
}

🖥️ 前端代码(Vue3 + Element Plus)

1. 安装依赖

npm install axios element-plus

2. 登录页面组件 Login.vue

<template><div style="max-width: 400px; margin: 100px auto;"><h2>登录</h2><el-input v-model="username" placeholder="用户名"></el-input><el-input v-model="password" type="password" placeholder="密码" @keyup.enter.native="login"></el-input><el-button @click="login" type="primary">登录</el-button></div>
</template><script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import axios from 'axios';const router = useRouter();
const username = ref('');
const password = ref('');const login = async () => {try {const res = await axios.post('http://localhost:8080/api/auth/login', {username: username.value,password: password.value});const token = res.headers.authorization;localStorage.setItem('token', token);router.push('/home');} catch (error) {alert('登录失败');}
};
</script>

3. Axios 请求封装 utils/request.js

import axios from 'axios';const service = axios.create({baseURL: 'http://localhost:8080',timeout: 5000
});service.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = token;}return config;
});export default service;

📝 项目启动说明(README.md)

# Spring Boot + Vue 登录系统模板## 后端启动1. 创建数据库并导入数据
2. 修改 `application.yml` 中的数据库配置
3. 使用 IDEA 或命令行运行 Spring Boot 项目:```bash
cd backend
mvn spring-boot:run

前端启动

cd frontend
npm install
npm run serve

访问 http://localhost:8081

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914273.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914273.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914273.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)

1. Redis 简介Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;常用于缓存、消息队列、会话存储等应用场景。1.1 特征丰富…

C/C++数据结构之多维数组

概述多维数组&#xff0c;实际上就是“数组的数组”。最常见的是二维数组&#xff0c;就像一个表格&#xff0c;拥有行和列。而三维数组则可以想象为多个这样的表格堆叠起来形成的一个立方体。依此类推&#xff0c;我们可以构建四维、五维甚至更高维度的数组。多维数组主要用于…

[Rust 基础课程]选一个合适的 Rust 编辑器

市面上现在有很多编辑器都可以开发 Rust&#xff0c;很多都是以安装 Rust 插件的形式来对 Rust 做支持&#xff0c;本课程使用 RustRover&#xff0c;如果你喜欢其他的编辑器&#xff0c;可以自己捣鼓下。 RustRover https://www.jetbrains.com/rust/ jetbrains 专门对于 Ru…

【零基础学AI】第37讲:提示词工程(Prompt Engineering)

本节课你将学到 理解提示词工程的核心原理 掌握5种实用的Prompt设计模式 学会优化提示词的评估方法 实现一个智能问答系统优化案例 开始之前 环境要求 Python 3.8安装包&#xff1a;pip install openai tiktokenOpenAI API密钥&#xff08;免费注册&#xff1a;https://plat…

莫兰迪色系工作总结汇报PPT模版分享

莫兰迪色工作总结PPT模版&#xff0c;莫兰迪调色板PPT模版&#xff0c;莫兰迪色系高级简约PPT模版&#xff0c;莫兰迪色系工作汇报&#xff0c;莫兰迪总结汇报模版 莫兰迪色系工作总结汇报PPT模版分享&#xff1a;https://pan.quark.cn/s/35bcaa03c837

uniapp的app项目,某个页面长时间无操作,返回首页

最开始想做成一个公共的&#xff0c;完全提取出来的一个组件&#xff0c;组件设置背景透明&#xff0c;到时候哪个页面需要&#xff0c;直接引入组件就可以了&#xff0c;所以最开始做的是一个vue的组件&#xff0c;在组件中&#xff0c;监听页面的touchstart&#xff0c;但是这…

【实证分析】上市公司绿色战略数据集(2000-2023年)

数据简介&#xff1a;绿色战略是指企业根据其所处的外部环境&#xff08;包括“绿色浪潮”等环保趋势&#xff09;和企业自身的经营条件&#xff0c;为实现企业生存与发展质量的持续提升&#xff0c;而对企业生产经营活动进行绿色化改造的总体规划。这包括制定企业绿色可持续发…

【SpringAI】7. 基于 milvus 的向量检索

SpringAI 基于 milvus 的向量检索 向量数据库可以使用 milvus&#xff0c;redis,Elasticsearch 等&#xff0c;本文以 milvus 为例&#xff1a; 1. 启动milvus 为了尽可能快速上手springai的vectordb功能&#xff0c;我们推荐使用云上的milvus&#xff0c;注册就能创建免费的…

如何使用数字化动态水印对教育视频进行加密?

文章目录前言一、什么是数字化动态水印二、使用数字化动态水印对教育视频加密的好处&#xff1f;三、数字化动态水印的实现原理四、如何实现数字化动态水印对教育视频加密总结前言 教育资源数字化蓬勃发展的今天&#xff0c;优质视频课程已成为机构的核心知识资产。然而&#…

解决bash终端的路径名称乱码问题

解决bash终端的路径名称乱码 默认打开了zsh&#xff0c;当我输入bash后&#xff0c;就出现了乱码 (context_rag) [23fanyaohead1]~/mycode-thesis% bash (context_rag) [%n%m]%~%#乱码原因排查 我遇到了终端乱码问题&#xff0c;需要检查当前的终端环境和编码设置&#xff0c;下…

【深度学习】【入门】Sequential的使用和简单神经网络搭建

1.Sequential的概念它是一种按顺序封装神经网络层的容器&#xff0c;能让层按照添加顺序依次执行计算&#xff0c;简化网络搭建流程2.Sequential的作用1.代码简洁化对比不用 Sequential 时手动搭建层的繁琐代码&#xff08;如每层需手动定义并连接&#xff09;&#xff0c;展示…

前端开发中的资源缓存详解

资源缓存用于缓存静态资源,良好的缓存策略可以减少资源重复加载进而提高网页的整体加载速度。 通常浏览器缓存策略分为两种:强缓存和协商缓存,当然还包括 service worker。 浏览器在资源加载时,根据请求头中的 expires 和 cache-control 值来判断是否命中强缓存,命中则直…

零基础入门指南:华为数通认证体系详解

一、华为数通认证的定位与行业价值华为数通认证&#xff08;Datacom&#xff09;是ICT领域核心方向&#xff0c;覆盖路由器、交换机等网络基础设备技术&#xff0c;被誉为“网络行业的骨骼”。2020年升级为Datacom认证体系&#xff0c;新增SDN、VXLAN、网络自动化等前沿技术&am…

超低功耗CC2340R SimpleLink™ 系列 2.4GHz 无线 MCU支持BLE5.3/Zigbee/Thread/专有协议

CC2340R SimpleLink™ 系列 2.4GHz 无线 MCU支持BLE5.3/Zigbee/Thread/专有协议优势简介性能介绍应用场景优势简介 CC2340R SimpleLink™ 系列器件为 2.4GHz 无线微控制器 (MCU)&#xff0c;面向低功耗 Bluetooth5.3、Zigbee、Thread 和专有 2.4GHz 应用。这些器件针对低功耗无…

若依前后端分离Vue3版本接入阿里云OSS

一、引入依赖首先在commom 模块的pom 下面引入 阿里云OSS 的 依赖<!-- 阿里云oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></depende…

2025年微软mos备考攻略-穷鬼版

说实话&#xff0c;微软MOS认证是微软官芳推出的办公软件方面的认证&#xff0c;考试难度真的不大&#xff0c;完全没必要报班&#xff0c;自学完全OK&#xff01;一、25 年报考MOS认证详情报名时间&#xff1a;随时可以在官网或ji构报名&#xff08;ji构报名会送备考资料&…

数据库版本自动管理

FlywayDB 是一款 开源数据库版本管理工具&#xff0c;开发中将表结构的变更或数据初始化脚本维护好&#xff0c;更新到测试环境或线上发版启动服务的时候&#xff0c;会检测版本号自动执行数据库变更&#xff0c;可以减少每次发版到其他环境的人工执行操作。 工作流程初始化阶段…

解决Linux绑定失败地址已使用(端口被占用)的问题

文章目录解决 bind failed: Address already in use 问题一、问题原因1. **端口已经被其他程序占用**2. **端口处于 TIME_WAIT 状态**3. **未正确关闭套接字**二、如何排查和解决问题1. **确认端口是否被占用**2. **查找并杀掉占用端口的进程**3. **等待端口释放&#xff08;TI…

Ragas的Prompt Object

Prompt在Ragas中被用在各种指标、合成数据生成任务中。同时也为提供了替换各种自动以提示词的方式。Ragas提供了如下几种Prompt Objects。 instruction:prompt的基础组成,通过自然语言清晰的描述LLM需要完成的任务。在prompt object中用instruction变量定义。few-shot exampl…

PHP语法高级篇(一):日期时间处理和包含文件

从本篇文章开始&#xff0c;将学习PHP的高级特性内容。本篇文章将记录在PHP中如何进行日期时间处理和包含文件的学习过程。 一、日期和时间 在PHP中&#xff0c;date() 函数用于格式化日期或时间。 说明 date(string $format, ?int $timestamp null): string 使用指定整数…