敏捷——登录校验/管理事项/Javaweb/后端/Springboot

勋的要求

1 登录后 后端返回一个token
2 数据库 用户表  事项表
    用户表:用户名  密码  用户标识(id)
            1 zhangsan   123456 
            2 zhangsan2   123456 
            3 zhangsan3   123456   
    事项表:事项基本信息(事项id,名称、创建时间、完成状态、完成时间),所属用户   权限?
        id name        uid   datetime  status  ...
        1  学习VUE      3         .....  
        2  学习HTML   3         .....  
        3  学习VUE      1         .....  
        4  学习VUE      2         .....  

3 添加事项:
    前端通过POST:事项的基本信息(post),token
    后端:解析token,将uid和事项信息存储数据库(INSERT)
    返回:返回操作的结果(成功、失败)
4 查询事项:
    前端:GET请求,携带token
    后端:解析token,得到uid,在数据库中查询(SELECT)Where uid=?
    返回:返回查询结果(List)【事项id,事项名称,事项状态...】

5 修改事项:
    前端:POST请求,携带token,事项id,更新后的事项的数据
    后端:解析token得到uid,更具事项id(1,2,3,4,5,6,7),更新数据库中的事项内容(UPDATE   where id = ? and uid = ?)

@RestController
@RequestMapping("/tasks")
public class TaskController {@Autowiredprivate TaskService taskService;@Autowiredprivate UserService userService;  // 确保 UserService 能够被注入@GetMapping("/mytasks")public ResponseEntity<?> getMyTasks(@RequestHeader("Authorization") String token) {try {// 从 token 中获取用户信息User user = userService.getUserInfoByToken(token);// 使用用户ID获取任务列表List<Task> tasks = taskService.getTasksByUserId(user.getId());return ResponseEntity.ok(tasks);} catch (Exception e) {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(e.getMessage());}}
}@Service
public class TaskService {@Autowiredprivate TaskMapper taskMapper;@Transactional(readOnly = true)public List<Task> getTasksByUserId(Integer userId) {return taskMapper.findByUserId(userId);}
}@Mapper
public interface TaskMapper {List<Task> findByUserId(Integer userId);
}XML文件<select id="findByUserId" resultMap="taskResultMap">SELECT * FROM tasks WHERE uid = #{userId}</select>

后端实现

配置环境

实体类代码:

import lombok.Data;
import java.util.Date;@Data
public class User {private Integer id;private String username;private String password;private String name;private String gender;private Date birthDate;
}
import lombok.Data;@Data
public class Task {private Long id;private String name;private Integer uid;private Boolean completed;}

前后端交互统一响应结果 Result

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Integer code;//响应码,1 代表成功; 0 代表失败private String msg;  //响应信息 描述字符串private Object data; //返回的数据//增删改 成功响应public static Result success(){return new Result(1,"success",null);}//查询 成功响应public static Result success(Object data){return new Result(1,"success",data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
}

数据库格式:

`tasks`(`id`, `name`, `uid`, `completed`)
`user`(`id`, `username`, `password`, `name`, `gender`, `birth_date`)

数据库建表语句:

CREATE TABLE User (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,name VARCHAR(255),gender VARCHAR(10),birth_date DATE
);
CREATE TABLE Task (id BIGINT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,uid INT,completed TINYINT(1) DEFAULT 0
);

配置文件代码:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/demo0414username: rootpassword: 123456mybatis:configuration:#配置mybatis的日志, 指定输出到控制台log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumnmap-underscore-to-camel-case: true

配置 mapper XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.minjie.mapper.UserMapper"></mapper>

JWT令牌实现登录校验 

引入依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>

JwtUtils 代码

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "itheima";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}

在 controller 进行发令牌的判断和操作

添加用户请求体内容

{"username":"郑爽","password":"111","name":"爽","gender":"女","birthdate":"1989-01-01"
}

MD5密码加密

理论学习 

对称加密:使用同一把密钥

非对称加密:公钥:加密 / 私钥:解密

摘要算法:哈希算法 / 散列算法,不可逆,MD5

代码实现

前端实现

勋的实现:

<template><div class="task-list"><el-card class="box-card"><div slot="header" class="clearfix"><span>我的任务列表</span></div><el-table :data="tasks" style="width: 100%"><el-table-column prop="name" label="任务名称" width="180"></el-table-column><el-table-column prop="completed" label="完成状态" width="100"><template slot-scope="scope"><el-tag :type="scope.row.completed ? 'success' : 'info'">{{ scope.row.completed ? '已完成' : '未完成' }}</el-tag></template></el-table-column></el-table></el-card></div>
</template><script>
import axios from 'axios';export default {data() {return {tasks: []};},created() {this.fetchTasks();},methods: {fetchTasks() {const token = localStorage.getItem('token');axios.get('/api/tasks/mytasks', {headers: {'Authorization': token}}).then(response => {this.tasks = response.data;}).catch(error => {this.$message.error('获取任务列表失败');});}}
};
</script><style scoped>
.task-list {margin: 20px;
}
.box-card {width: 500px;
}
</style>

知识点

1. MD5 和 JWT 并没有直接的关系,因为它们解决的问题和功能不同。在实际的身份验证流程中,MD5 可能用于加密用户密码,而 JWT 则可能用于生成和验证用户的身份令牌,这样用户可以在多个服务中进行身份验证而无需重复登录。

2.

如图,加了 @JsonIgnore 之后就添加也会忽略,报错 500

报错

405:post 请求写成 get 请求

500:加了 @JsonIgnore

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

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

相关文章

ccfcsp201409-3 字符串匹配

#include <bits/stdc.h> using namespace std; string s; int y, n; string o[105]; bool check(char a, char b) { // 大小写不敏感if (a b || a - a b - A || a - A b - a){return true;}return false; } int main() {cin >> s;cin >> y; // 0不敏感1敏…

挣钱新玩法,一文带你掌握流量卡推广秘诀

手机流量卡推广项目是什么&#xff1f;听名字我相信大家就已经猜出来了&#xff0c;就是三大运营商为了开发新用户&#xff0c;发起的有奖推广活动&#xff0c;也是为了长期黏贴用户。在这个活动中&#xff0c;用户通过我们的渠道&#xff0c;就能免费办理低套餐流量卡&#xf…

Linux 搭建私有yum源仓库

一、环境准备 IP系统版本作用192.168.140.155CentOS 7.9.2009yum源仓库192.168.140.153CentOS 7.9.2009测试 准备两台服务器&#xff0c;一台作为yum源仓库&#xff0c;另一台作为测试使用。 二、搭建yum源服务器 &#xff08;无法连接外网的情况&#xff0c;需要去官网下载镜…

【GoWeb框架初探————XORM篇】

1. XORM xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 1.1 特性 支持 Struct 和数据库表之间的灵活映射&#xff0c;并支持自动同步事务支持同时支持原始SQL语句和ORM操作的混合执行使用连写来简化调用支持使用ID, In, Where, Limit, Join, Havi…

记录 nginx 出现 403 forbidden 和 404 的解决经历

403 当我修改了 nginx 所展示的页面路径了以后&#xff0c;访问 nginx 所在的 8080 端口就出现了403 forbidden 的错误 首先通过以下查看进程的命令 ps -aux|grep nginx发现 worker process 对应的启动用户是 nobody 是错的 &#xff08;图中是 root&#xff0c;是改正后的样子…

【uniapp踩坑记】——微信小程序转发保存图片

关于微信小程序转发&保存图片 微信小程序图片转发保存简单说明网络图片的转发保存base64流形式图片转发保存 已经好多年没写博客了&#xff0c;最近使用在用uniapp开发一个移动版管理后台&#xff0c;记录下自己踩过的一些坑 吃相别太难看&#xff0c;搞一堆下头僵尸号来点…

vite(vue3)配置内网ip访问的方法步骤

如果没有进行配置&#xff0c;运行项目之后&#xff0c;看到的访问地址是本地访问地址&#xff0c;其他人访问不了。 如下&#xff1a; 一、配置 “ vite.config.ts ” 文件 server: {host: 0.0.0.0 }, 如图所示&#xff1a; 添加 server 配置后保存 “ vite.config.ts ” 文…

深度学习发展中的继承和创新

深度学习是一步一步发展而来的&#xff0c;新的成就也是在原有的基础上&#xff0c;逐步取得突破&#xff0c;有一些东西是一点一点变化&#xff0c;突破发展而来的&#xff0c;也就是每一次小的突破和每一次小的突破累积起来&#xff0c;构成一个明显的进步。我们可以通过观察…

C语言 ─── 操作符详解

目录 1. 算术操作符 2. 移位操作符 2.1 左移操作符 2.2 右移操作符 3. 位操作符 4. 复合赋值符 5. 单目操作符 6. 逗号表达式 7. 隐式类型转换 7.1 整型提升的意义&#xff1a; 7.2 如何进行整体提升呢&#xff1f; 8. 算术转换 ★★★数组名 1. 算术操作符 -…

实现联系人前后端界面,实现分页查询04.15

实现联系人前后端界面&#xff0c;实现分页查询项目包-CSDN博客 项目结构 数据库中建立两个表&#xff1a; 完整的后端目录 建立联系人People表&#xff0c;分组Type表&#xff0c;实现对应实体类 根据需求在mapper中写对应的sql语句 查询所有&#xff0c;删除&#xff0c;添…

js BOM模型常用方法梳理

1、Bom定义 BOM是操作浏览器的模型&#xff0c;主要是对浏览器的一些操作。 2、获取浏览器窗口的尺寸 window.innerHeight:获取窗口的高度。 window.innerWidth:湖区窗口的宽度&#xff0c;只在window浏览器下使用。 3、弹出层 alert:弹出框。 confirm:确认框。返回值有true …

数据治理实战——元数据管理

一、元数据概述 1.1 定义 描述数据的数据&#xff0c;本质还是数据。数据本身带有的技术属性与其在业务运行中的业务属性&#xff0c;称其为元数据&#xff0c;例如&#xff1a;表数据量&#xff0c;占用空间&#xff0c;字段信息&#xff0c;业务描述&#xff0c;负责人&…

计算机视觉实验五——图像分割

计算机视觉实验五——图像分割 一、实验目标二、实验内容1.了解图割操作&#xff0c;实现用户交互式分割&#xff0c;通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域&#xff0c;实现分割①图片准备②代码③运行结果④代码说明 2.采用聚类法实现…

单调队列(C/C++)

引言&#xff1a; 单调队列和单调栈都是一种数据结构&#xff0c;应用十分广泛&#xff0c;在蓝桥杯、ICPC、CCPC等著名编程赛事都是重点的算法&#xff0c;今天博主将自己对单调栈与单调队列的理解以及刷题的经验&#xff0c;用一篇博客分享给大家&#xff0c;希望对大家有所…

在线拍卖系统|基于Springboot的在线拍卖系统设计与实现(源码+数据库+文档)

在线拍卖系统目录 基于Springboot的在线拍卖系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 用户功能模块 5.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

使用脚本部署openstack平台

两台虚拟机&#xff0c;compute和controller 建议两台虚拟机都配置&#xff0c;内存4G&#xff0c;硬盘60G&#xff0c;网络要在虚拟机设置这里添加一个网络适配器&#xff0c;第一个是主机模式192.168.10.0&#xff0c;第二个是NAT模192.168.20.0&#xff0c; 可以在此处了解一…

Unity Standalone File Browser,Unity打开文件选择器

Unity Standalone File Browser&#xff0c;Unity打开文件选择器 下载地址&#xff1a;GitHub链接&#xff1a; https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…

从三大层次学习企业架构框架TOGAF

目录 前言 掌握TOGAF的三个层次 层次1&#xff1a;怎么学&#xff1f; 层次2&#xff1a;怎么用&#xff1f; 层次3&#xff1a;怎么思&#xff1f; 结束语 前言 对于一名架构师来讲&#xff0c;如果说编程语言是知识库层次中的入门石&#xff0c;那么企业架构框架则相当…

cesium加载倾斜影像数据(模拟雨、雪、雾、无人机飞行、测距、箭头标绘、电子围栏等)

实现效果如下&#xff1a; 功能菜单如下&#xff1a; 加载倾斜影像核心代码&#xff1a; var palaceTileset new Cesium.Cesium3DTileset({url: http://127.0.0.1:9002/tileset.json,//控制切片视角显示的数量&#xff0c;可调整性能maximumScreenSpaceError: 0.1,maximumNum…

python/pygame 挑战魂斗罗 笔记(三)

感觉最难的部分已经解决了&#xff0c;下面开始发射子弹。 一、建立ContraBullet.py文件&#xff0c;Bullit类&#xff1a; 1、设定子弹速度 Config.py中设定子弹移动速度为常量Constant.BULLET_SPEED 8。 2、载入子弹图片&#xff1a; 图片也是6张&#xff0c;子弹发出后…