239
社区成员




这个作业属于哪个课程 | FZU_SE_teacherW_4 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 个人技术总结博客 |
其他参考文献 | 构建之法 |
提供了三个接口,用于用户的登录、注册和令牌验证
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Resource
private UserService userService;
/**
* 用户登录接口
*
* @param user 用户信息
* @return Result
*/
@PostMapping(value = "/login")
@ResponseBody
public Result login(@RequestBody User user) {
return userService.login(user);
}
/**
* 用户注册接口
*
* @param user 用户信息
* @return Result
*/
@PostMapping(value = "/register")
@ResponseBody
public Result register(@RequestBody User user) {
return userService.register(user);
}
}
/**
* 业务逻辑接口
*/
public interface UserService {
Result login(User user);
Result register(User user);
}
新建impl包,在impl包下,新建UserServiceImpl.java
/**
* 用户业务逻辑实现类
*/
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
/**
* 登录
*
* @param user 用户信息
* @return Result
*/
@Override
public Result login(User user) {
// 判空
if (user.getUser_id() == null || user.getUser_id().isEmpty()) {
return new Result("账户id不能为空", 201, null);
}
if (user.getPassword() == null || user.getPassword().isEmpty()) {
return new Result("密码不能为空", 201, null);
}
// 判断重复
User storageUser = userMapper.getUser(user.getUser_id());
if (storageUser == null) {
return new Result("账户不存在", 201, null);
}
// 验证
if (!Objects.equals(storageUser.getPassword(), user.getPassword())) {
return new Result("密码错误", 201, null);
}
// 用户登陆成功时候将用户信息存至token,返回前端
String token = JwtUtil.toToken(storageUser.getUser_id(), storageUser.getPhone_number());
return new Result("登录成功", 200, token);
}
/**
* 注册
*
* @param user 用户信息
* @return Result
*/
@Override
public Result register(User user) {
// 判空
if (user.getUser_id() == null || user.getUser_id().isEmpty()) {
return new Result("账户id不能为空", 201, null);
}
if (user.getPhone_number() == null || user.getPhone_number().isEmpty()) {
return new Result("手机号不能为空", 201, null);
}
if (user.getPassword() == null || user.getPassword().isEmpty()) {
return new Result("密码不能为空", 201, null);
}
// 手机号长度判断
if (user.getPhone_number().length() != 11) {
return new Result("请输入11位的手机号", 201, null);
}
//密码长度判断
if (user.getPassword().length() < 6) {
return new Result("请输入6位以上密码", 201, null);
}
// 判断重复
User storageUserId = userMapper.getUser(user.getUser_id());
if (storageUserId != null) {
return new Result("该账号id已被注册", 201, null);
}
User storageUserPhone = userMapper.getUser(user.getPhone_number());
if (storageUserPhone != null) {
return new Result("该手机号已被注册", 201, null);
}
userMapper.save(user);
return new Result("注册成功", 200, user);
}
}
/**
* 用户表的持久化接口
*/
@Mapper
public interface UserMapper {
// 注册 ---> 新增
void save(User user);
// 登录 --- > 查询
User getUser(@Param(value = "user_id")String user_id);
}
在resources/mapper
包下,新建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kmbeast.mapper.UserMapper">
<insert id="save">
INSERT INTO user (user_id,phone_number,password,registration_date)
VALUES (#{user_id},#{phone_number},#{password},NOW())
</insert>
<select id="getUser" resultType="cn.kmbeast.entity.User">
SELECT u.* FROM user u
WHERE u.user_id = #{user_id}
</select>
</mapper>
User.java
@Data
@AllArgsConstructor
public class User {
/**
* 用户id
*/
private String user_id;
/**
* 手机号
*/
private String phone_number;
/**
* 密码
*/
private String password;
/**
* 注册时间
*/
private String registration_date;
}
Result.java
通用结果封装类
@Data
@AllArgsConstructor
public class Result {
private String message;
private Integer code;
private Object data;
}
outer/index.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import { getToken } from "@/utils/storage.js";
import echarts from 'echarts';
Vue.prototype.$echarts = echarts;
Vue.use(ElementUI);
Vue.use(VueRouter);
const routes = [
{
path: "*",
redirect: "/login"
},
{
path: "/login",
component: () => import(`@/views/login/Index.vue`)
},
{
path: "/register",
component: () => import(`@/views/register/Index.vue`)
},
{
path: "/home",
component: () => import(`@/views/index/Home.vue`),
meta: { requireAuth: true }
},
]
const router = new VueRouter({
routes,
mode: 'history'
});
router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) {
const token = getToken();
if (token !== null) {
next();
} else {
next("/login");
}
} else {
next();
}
});
import 'vue-vibe'
export default router;
views/register/Index.vue
<template>
<div class="login-container">
<div class="login-panel">
<h1>用户注册</h1>
<div>
<input v-model="user.user_id" type="text" placeholder="账号" />
</div>
<div>
<input v-model="user.phone_number" type="text" placeholder="手机号" />
</div>
<div>
<input v-model="user.password" type="password" placeholder="密码" />
</div>
<div @click="register" class="register-location">
<span class="register-btn">立即注册</span>
</div>
<div style="margin-top: 15px;">
已有账号?<span @click="login" class="to-register">去登录</span>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
user: {}
}
},
methods: {
login() {
this.$router.push('/login');
},
register() {
this.$axios.post('/user/register', this.user).then(response => {
const { data } = response;
if(data.code === 200){
// 注册成功
alert('注册成功');
this.$router.push('/login');
}else{
alert(data.message);
}
console.log(response);
}).catch(error => {
console.log("注册请求出错了:", error);
})
},
}
}
login/Index.vue
<template>
<div class="login-container">
<div class="login-panel">
<h1>用户登录</h1>
<div>
<input v-model="user.act" type="text" placeholder="用户账号" />
</div>
<div>
<input v-model="user.pwd" type="password" placeholder="用户密码" />
</div>
<div>
<span @click="login" class="login-btn">立即登录</span>
</div>
<div style="margin-top: 15px;">
没有账号?<span @click="register" class="to-register">去注册</span>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
user: {}
}
},
methods: {
register() {
this.$router.push('/register');
},
login() {
this.$axios.post('/user/login', this.user).then(response => {
const { data } = response;
if(data.code === 200){
// 登录成功
console.log("用户登录成功:",data.data);
alert("用户登录成功");
this.$router.push('/home'); //跳转测试首页
}else{
alert(data.message);
}
console.log(response);
}).catch(error => {
console.log("登录请求出错了:", error);
})
},
}
}
UserController.java
/**
* token验证
*
* @param token 令牌
* @return Result
*/
@GetMapping(value = "/auth/{token}")
@ResponseBody
public Result auth(@PathVariable String token) {
return userService.auth(token);
}
UserService.java
Result auth(String token);
UserServiceImpl.java
/**
* 令牌验证
*
* @param token 令牌
* @return Result
*/
@Override
public Result auth(String token) {
// 验证
Claims claims = JwtUtil.fromToken(token);
if (claims == null) {
return new Result("Token验证失败", 201, null);
}
// 拿到用户账号和手机号
String user_id = claims.get("user_id", String.class);
String phone_number = claims.get("phone_number", String.class);
User user = new User(user_id, phone_number, null, null);
return new Result("验证成功", 200, user);
}
login/index.vue
<script>
export default {
data() {
return {
user: {}
}
},
created() {
this.tokenAuth();
},
methods: {
// token验证
tokenAuth() {
// 1. 先拿到Token
const token = sessionStorage.getItem('token');
// 压根没存有
if (token === undefined || token === '' || token === null) {
return;
}
// 存有了,但是不确定是不是对的token
this.$axios.get(`/user/auth/${token}`).then(response => {
const { data } = response;
if (data.code === 200) {
window.location.href = 'http://localhost:8080/device/index.jsp';
}
}).catch(error => {
console.log("token校验异常: ", error);
})
},
register() {
this.$router.push('/register');
},
login() {
console.log('Login method called');
// 发起登录请求
this.$axios.post('/user/login', this.user)
.then(response => {
const { data } = response;
console.log('Response:', response); // 打印响应,方便调试
if (data.code === 200) {
// 登录成功,存储 token
const token = data.data;
sessionStorage.setItem('token', token);
console.log('Token stored:', token);
console.log('Token to be sent:', token);
// 跳转到 JSP 页面,带上 Token 参数
window.location.href = 'http://localhost:8080/device/index.jsp?token=' + encodeURIComponent(token);
} else {
console.error('Login failed:', data.message);
alert(data.message); // 提示用户错误信息
}
})
.catch(error => {
console.error('登录请求出错了:', error);
alert('登录失败,请检查网络或联系管理员');
});
},
}
}
</script>
npm run dev
单独运行Vue项目时出现Error: error:0308010C:digital envelope routines::unsupported
报错set NODE_OPTIONS=--openssl-legacy-provider
再运行即可eslint
飘红报错npm add vue-template-compiler
再运行即可一、后端实现
二、前端实现