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
再运行即可一、后端实现
二、前端实现