vue和springboot前后端分离通过一个登录实例,添加token

后端:
1.编写查询SQL
dao层
UserDao

@Select("select * from users where userId= #{userId} and password= #{pwd}")
    User login(String userId , String pwd);

2.Service层
token.key在application.properties自定义配置
UserService.java

import cn.hutool.jwt.JWTUtil;
import com.beimao.dao.UserDao;
import com.beimao.entity.User;
import com.beimao.model.UserLoginDto;
import com.beimao.model.UserRegisterDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Service
public class UserService {

    @Value("${token.key}")
    private String tokenKey;

    @Autowired
    private UserDao userDao;
    
    public String login(UserLoginDto userLoginInfo) throws Exception {

        User user = userDao.login(userLoginInfo.getUserId(), userLoginInfo.getPwd());

        if (user == null) {
            throw new Exception("用户不存在");
        }
        //生成token
        Map<String, Object> map = new HashMap<>();
        map.put("id", user.getId());
        map.put("userId", user.getUserId());
        map.put("expire_time", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15);
        String token = JWTUtil.createToken(map, this.tokenKey.getBytes());
        return token;
    }
    }

3.controller层
UserController.java


import cn.hutool.core.util.StrUtil;
import com.beimao.model.UserLoginDto;
import com.beimao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api")
public class UserController {

    @Autowired
    private UserService userService;
  
    @PostMapping("/login")
    public String login(@RequestBody UserLoginDto userLoginInfo) throws Exception {

        String token = userService.login(userLoginInfo);
        return token;
    }

前端:

<template>
  <div id="logindiv">
    <el-row justify="center" align="middle" style="height: 90vh">
      <el-col :span="9">
        <el-card class="box-card">
          <template #header>
            <div class="card-header">
              <span>欢迎使用北猫商城管理系统</span>
            </div>
          </template>
          <el-form :model="ruleForm" label-width="120px" ref="ruleFormRef" :rules="rules">
            <el-form-item label="账号:" prop="userId">
              <el-input v-model="ruleForm.userId" placeholder="请输入您的邮箱" />
            </el-form-item>
            <el-form-item label="密码:" prop="pwd1">
              <el-input
                v-model="ruleForm.pwd1"
                type="password"
                placeholder="请输入您的密码"
              />
            </el-form-item>
            <el-form-item label="确认密码:" prop="pwd2">
              <el-input
                v-model="ruleForm.pwd2"
                type="password"
                placeholder="再次输入密码"
              />
            </el-form-item>
            <el-form-item>
              <el-button type="primary" @click="submitForm(ruleFormRef)">登录</el-button>
              <el-button @click="resetForm(ruleFormRef)">重填</el-button>
            </el-form-item>
           <!-- 超链接 -->
            <el-form-item>
              <el-link href="/#/register" type="danger"> 还没有账号?去注册</el-link>
            </el-form-item>
          </el-form>
        </el-card>
      </el-col>
    </el-row>
  </div>
</template>

<script lang="ts" setup>
// MD5加密
import { Md5 } from 'ts-md5';
// vue参数
import { ref, reactive, onMounted } from "vue";
// 消息提示
import { ElMessage } from "element-plus";
//pinia本地储存
import { storeToRefs } from "pinia";
import appStore from "@/store/appStore";
//token
import jwtDecode from "jwt-decode";
//axios封装
import http from "@/http/index";
// 路由
import { useRoute, useRouter } from "vue-router";
// 属性校验
import type { FormInstance, FormRules } from "element-plus";
const route = useRoute();
const router = useRouter();
let { user, token } = storeToRefs(appStore());
const ruleFormRef = ref<FormInstance>();
 
 const ruleForm = reactive({
  userId: "ohftiaq3691@163.com",
  pwd1: "123456",
  pwd2: "123456",
});

const validatePass2 = (rule: any, value: any, callback: any) => {
  if (value === "") {
    callback(new Error("请再次输入密码"));
  } else if (value !== ruleForm.pwd1) {
    callback(new Error("两次密码不匹配!"));
  } else {
    callback();
  }
};

const rules = reactive<FormRules>({
  userId: [
    { required: true, message: "请输入邮箱", trigger: "blur" },
    //{ min: 3, max: 5, message: '至少 3 to 5', trigger: 'blur' },
    {
      type: "email",
      message: "请输入正确的邮箱地址",
      trigger: ["blur", "change"],
    },
  ],
  pwd1: [
    { required: true, message: "请输入密码", trigger: "blur" },
    { min: 6, message: "至少 6", trigger: "blur" },
  ],

  pwd2: [{ validator: validatePass2, trigger: "blur" }],
});

const callApi = () => {
  http
    .post("/api/login", {
      userId: ruleForm.userId,
      pwd: Md5.hashStr("ruleForm.pwd1").toUpperCase(),
    })
  //添加token
  .then((res: any) => {
      const tokenObj: any = jwtDecode(res);
      user.value.id = tokenObj.id;
      user.value.userId = tokenObj.userId;
      token.value = res;
      router.push({ name: "home" });
    })
    .catch((err: any) => {});
};
const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      //验证成功,执行下面方法
      callApi();
    } else {
      // console.log('error submit!', fields)
    }
  });
};
const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  formEl.resetFields();
};
</script>
<style scoped>
#logindiv {
  background: url("../assets/login.jpeg");
  width: 100%;
  height: 100%;
  position: fixed;
  background-size: 100% 100%;
}
.title {
  color: white;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: VueSpringBoot前后端分离的技术,Vue是一种JavaScript框架,用于构建前端用户界面,SpringBoot是一种Java框架,用于构建后端服务。在前后端分离的架构中,前端和后端通过API接口进行通信,实现了松散耦合的架构,使得前后端可以独立开发和维护,提高了开发效率和系统可维护性。 ### 回答2: Vue.jsSpring Boot一起使用,是一种常见的前后端分离方案。Vue.js是一款构建用户界面的渐进式JavaScript框架,可以轻松实现交互效果和丰富的视觉体验。而Spring Boot则是一款轻量级的Java开发框架,可以快速搭建Web应用程序。 Vue.jsSpring Boot的结合,可以将前端和后端的开发分离,各自专注于自己的领域,同时又能够良好协同。前端开发者可以使用Vue.js构建用户界面、处理前端逻辑,后端开发者则可以使用Spring Boot来搭建API和业务逻辑。这种分离可以提高团队的开发效率,减少时间和沟通成本。 在前后端分离的架构中,Vue.jsSpring Boot通常通过RESTful API进行通信。前端开发者可以使用axios等库发送HTTP请求,获取后端数据,而后端开发者则可以通过Spring MVC或Spring WebFlux提供接口,处理业务逻辑并返回数据。这种方式可以支持不同的客户端,例如Web浏览器、移动设备等。 另外,Vue.jsSpring Boot也支持使用JSON Web Token(JWT)来实现用户认证和授权。前端开发者可以使用Vue.js和其他库来生成JWT,并在HTTP请求的Authorization头中传递Token,后端开发者则可以使用Spring Security等库来验证Token,判断用户的身份和权限。 总之,Vue.jsSpring Boot的结合,可以让前后端开发者各自专注于自己的领域,实现高效的团队协作和快速的Web应用程序开发。 ### 回答3: VueSpring Boot是开发Web应用程序时的两个非常受欢迎的框架。Vue一个JavaScript框架,专注于构建用户界面。Spring Boot一个Java框架,专注于构建后端服务。 前后端分离是现代Web应用程序开发的趋势之一。在这种模式下,前端和后端是两个完全独立的代码库。前端开发人员使用Vue等框架来构建用户界面,后端开发人员使用Spring Boot等框架来构建API和业务逻辑。 VueSpring Boot前后端分离带来了许多好处。首先,前后端分离可以使开发团队更加专注于各自的领域。前端开发人员可以专注于构建良好的用户体验,而后端开发人员则可以专注于构建可靠的API和业务逻辑。这有助于提高开发效率和质量。 其次,前后端分离可以使开发人员更加灵活地选择技术栈。例如,在VueSpring Boot前后端分离模式下,前端可以使用任何JavaScript框架,而后端可以使用任何Java框架。这使得开发团队可以选择最适合他们需求的技术栈。 最后,前后端分离可以使Web应用程序更加可扩展和可维护。由于前端和后端是独立的,因此可以在不破坏现有代码的情况下对其进行扩展和修改。这使得应用程序更加灵活,更易于维护。 总而言之,VueSpring Boot前后端分离模式是开发Web应用程序的一种好方法。它可以提高开发效率和质量,使开发人员更加灵活地选择技术栈,并使应用程序更加可扩展和可维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

great-sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值