Springboot+vue后台管理系统-登陆注册功能的实现

首先说一下怎样写登陆注册功能:

请添加图片描述
请添加图片描述

我们之前是直接在Home.vue里面直接写主题代码,在APP.vue里面直接引入全部主题,但是显然这样是不符合实际情况的!所以我们需要写新的路由:

请添加图片描述

我们新的APP.vue:

请添加图片描述

<template>
  <div >
    <router-view />
  </div>
</template>


<script>
export default {
  name:"Layout",

}
</script>


然后我们新建一个框架层:也就是上面APP.vue引入的

请添加图片描述

<template>

  <div>

    <!--    头部-->
    <Header/>
    <!--    主体-->
    <div style="display: flex">
      <!--      侧边栏-->
      <Aside />
      <!--      内容区域-->
      <router-view style="flex: 1"/>
    </div>

  </div>

</template>

<script>
import Header from "@/components/Header";
import Aside from "@/components/Aside";
export default {
  name: "Layout.vue",
  components:{
    Header,
    Aside
  }
}
</script>

<style scoped>

</style>

接下来我们写登陆界面:

<template>
  <div class="homepage-hero-module">
    <div class="video-container">
      <div :style="fixStyle" class="filter">
        <div style="width: 400px; margin: 100px auto">
          <div style="font-size: 30px; text-align: center; padding: 30px 0; color: #333">欢迎登录</div>
          <el-form ref="form" :model="form" size="normal" :rules="rules">
            <el-form-item prop="username">
              <el-input  v-model="form.username" placeholder="请输入账号"></el-input>
            </el-form-item>
            <el-form-item prop="password">
              <el-icon :size="20">
                <edit />
              </el-icon>
              <el-input  v-model="form.password" show-password placeholder="请输入密码"></el-input>
            </el-form-item>
            <el-form-item>
              <div style="display: flex">
                <el-input prefix-icon="el-icon-key" v-model="form.validCode" style="width: 50%;" placeholder="请输入验证码"></el-input>
                <ValidCode @input="createValidCode" />
              </div>
            </el-form-item>
            <!--            <el-form-item>-->
            <!--              <el-radio v-model="form.role" :label="1" style="color: white">管理员</el-radio>-->
            <!--              <el-radio v-model="form.role" :label="2" style="color: white">普通用户</el-radio>-->
            <!--            </el-form-item>-->
            <el-form-item>
              <el-button style="width: 100%" type="primary" @click="login">登 录</el-button>
            </el-form-item>
            <el-form-item><el-button type="text" @click="$router.push('/register')">前往注册 >> </el-button></el-form-item>
          </el-form>
        </div>
      </div>
      <video :style="fixStyle" autoplay loop muted class="fillWidth" v-on:canplay="canplay">
        <source src="../assets/sea.mp4" type="video/mp4"/>
        浏览器不支持 video 标签,建议升级浏览器。
      </video>
    </div>
  </div>

</template>

<script>
import request from "@/utils/request";
import ValidCode from "@/components/ValidCode";
import { ArrowDown } from '@element-plus/icons-vue';
import {Share} from "@element-plus/icons";
export default {
  name: "Login",
  components: {
    Share,
    ValidCode,
    ArrowDown
  },
  data() {
    return {
      vedioCanPlay: false,
      fixStyle: '',
      form: {role: 1},
      rules: {
        username: [
          {required: true, message: '请输入用户名', trigger: 'blur'},
        ],
        password: [
          {required: true, message: '请输入密码', trigger: 'blur'},
        ],
      },
      validCode: ''
      // 加背景图片
      // bg: {
      //   backgroundImage: "url(" + require("@/assets/bg.jpg") + ")",
      //   backgroundRepeat: "no-repeat",
      //   backgroundSize: "100% 100%"
      // }
    }
  },
  mounted() {
    sessionStorage.removeItem("user")

    window.onresize = () => {
      const windowWidth = document.body.clientWidth
      const windowHeight = document.body.clientHeight
      const windowAspectRatio = windowHeight / windowWidth
      let videoWidth
      let videoHeight
      if (windowAspectRatio < 0.5625) {
        videoWidth = windowWidth
        videoHeight = videoWidth * 0.5625
        this.fixStyle = {
          height: windowWidth * 0.5625 + 'px',
          width: windowWidth + 'px',
          'margin-bottom': (windowHeight - videoHeight) / 2 + 'px',
          'margin-left': 'initial'
        }
      } else {
        videoHeight = windowHeight
        videoWidth = videoHeight / 0.5625
        this.fixStyle = {
          height: windowHeight + 'px',
          width: windowHeight / 0.5625 + 'px',
          'margin-left': (windowWidth - videoWidth) / 2 + 'px',
          'margin-bottom': 'initial'
        }
      }
    }
    window.onresize()
  },
  methods: {
    canplay() {
      this.vedioCanPlay = true
    },
    // 接收验证码组件提交的 4位验证码
    createValidCode(data) {
      this.validCode = data
    },
    login () {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          if (!this.form.validCode) {
            this.$message.error("请填写验证码")
            return
          }
          if(this.form.validCode.toLowerCase() !== this.validCode.toLowerCase()) {
            this.$message.error("验证码错误")
            return
          }
          request.post("/user/login", this.form).then(res => {
            if (res.code === '0') {
              this.$message({
                type: "success",
                message: "登录成功"
              })
              sessionStorage.setItem("user", JSON.stringify(res.data))  // 缓存用户信息

              // 登录成功的时候更新当前路由
              this.$router.push("/layout")  //登录成功之后进行页面的跳转,跳转到主页

            } else {
              this.$message({
                type: "error",
                message: res.msg
              })
            }
          })
        }
      })
    }
  }
}
</script>

<style scoped>
.homepage-hero-module,
.video-container {
  position: relative;
  height: 100vh;
  overflow: hidden;
}

.video-container .poster img{
  z-index: 0;
  position: absolute;
}

.video-container .filter {
  z-index: 1;
  position: absolute;
  /*background: rgba(0, 0, 0, 0.4);*/
  width: 100%;
}

.fillWidth {
  width: 100%;
}
</style>

注册界面:

<template>
  <div style="width: 100%;background-color: orange; height: 100vh; overflow: hidden" >
    <div style="width: 400px; margin: 100px auto">
      <div style="font-size: 30px; text-align: center; padding: 30px 0">欢迎注册</div>
      <el-form ref="form" :model="form" size="normal" :rules="rules">
        <el-form-item prop="username">
          <el-input prefix-icon="el-icon-user-solid" v-model="form.username"></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input prefix-icon="el-icon-lock" v-model="form.password" show-password></el-input>
        </el-form-item>
        <el-form-item prop="confirm">
          <el-input prefix-icon="el-icon-lock" v-model="form.confirm" show-password></el-input>
        </el-form-item>
        <el-form-item>
          <el-button style="width: 100%" type="primary" @click="register">注册</el-button>
        </el-form-item>
        <el-form-item><el-button type="text" @click="$router.push('/login')">&lt;&lt;返回登录 </el-button></el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import request from "@/utils/request";

export default {
  name: "Register",
  data() {
    return {
      form: {},
      rules: {
        username: [
          {required: true, message: '请输入用户名', trigger: 'blur'},
        ],
        password: [
          {required: true, message: '请输入密码', trigger: 'blur'},
        ],
        confirm: [
          {required: true, message: '请确认密码', trigger: 'blur'},
        ],
      }
    }
  },
  methods: {
    register() {
      if (this.form.password !== this.form.confirm) {
        this.$message({
          type: "error",
          message: '2次密码输入不一致!'
        })
        return
      }

      this.$refs['form'].validate((valid) => {
        if (valid) {
          request.post("/user/register", this.form).then(res => {
            if (res.code === '0') {
              this.$message({
                type: "success",
                message: "注册成功"
              })
              this.$router.push("/login")  //登录成功之后进行页面的跳转,跳转到主页
            } else {
              this.$message({
                type: "error",
                message: res.msg
              })
            }
          })
        }
      })
    }
  }
}
</script>

<style scoped>

</style>

后端代码:

请添加图片描述

 /**
     * 用户登录
     */
    @PostMapping("/login")
    public Result<?> login(@RequestBody User user){
        User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword()));

        if (res ==null){
            return  Result.error("-1","用户名或密码错误");
        }
        return Result.success();
    }

    /**
     * 用户注册
     */
    @PostMapping("/register")
    public Result<?> register(@RequestBody User user){
        User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()));
        if (res!=null){
            return Result.error("-1","用户名重复");
        }
        if (user.getPassword()==null){
            user.setPassword("123456");
        }
        userMapper.insert(user);
        return Result.success();
    }


前端路由:

import { createRouter, createWebHistory } from 'vue-router'
import Layout from '../layout/Layout.vue'

const routes = [

  {
    path: '/layout',
    name: 'Layout',
    component: Layout,
    //重定向实现路由自动跳转:
    redirect:"/home",
    // 嵌套路由
    children:[
        {
      path: '/home',
      name: 'Home',
      component: () => import("@/views/Home"),
    }
    ]
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import("@/views/Login")
  },
  {
    path: '/',
    redirect:"/login",
  },
  {
    path: '/register',
    name: 'Register',
    component: () => import("@/views/Register")
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

验证码插件:

<template>
  <div
      class="ValidCode disabled-select"
      :style="`width:${width}; height:${height}`"
      @click="refreshCode"
  >
    <span
        v-for="(item, index) in codeList"
        :key="index"
        :style="getStyle(item)"
    >{{ item.code }}</span>
  </div>
</template>

<script>
export default {
  name: 'ValidCode',
  model: {
    prop: 'value',
    event: 'input'
  },
  props: {
    width: {
      type: String,
      default: '100px'
    },
    height: {
      type: String,
      default: '40px'
    },
    length: {
      type: Number,
      default: 4
    },
    refresh: {
      type: Number
    }
  },
  data () {
    return {
      codeList: []
    }
  },
  watch: {
    refresh () {
      this.createdCode()
    }
  },
  mounted () {
    this.createdCode()
  },
  methods: {
    refreshCode () {
      this.createdCode()
    },
    createdCode () {
      const len = this.length
      const codeList = []
      const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789'
      const charsLen = chars.length
      // 生成
      for (let i = 0; i < len; i++) {
        const rgb = [Math.round(Math.random() * 220), Math.round(Math.random() * 240), Math.round(Math.random() * 200)]
        codeList.push({
          code: chars.charAt(Math.floor(Math.random() * charsLen)),
          color: `rgb(${rgb})`,
          fontSize: `${10 + (+[Math.floor(Math.random() * 10)] + 6)}px`,
          padding: `${[Math.floor(Math.random() * 10)]}px`,
          transform: `rotate(${Math.floor(Math.random() * 90) - Math.floor(Math.random() * 90)}deg)`
        })
      }
      // 指向
      this.codeList = codeList
      // 将当前数据派发出去
      // console.log(codeList.map(item => item.code).join(''))
      this.$emit('input', codeList.map(item => item.code).join(''))
    },
    getStyle (data) {
      return `color: ${data.color}; font-size: ${data.fontSize}; padding: ${data.padding}; transform: ${data.transform}`
    }
  }
}
</script>

<style scoped>
.ValidCode{
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
.ValidCode span{
  display: inline-block;
}
</style>

完结

  • 16
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: springboot+vue后台管理系统是一种基于Spring BootVue.js技术开发的后台管理系统。它可以快速搭建一个功能完善、易于维护的后台管理系统,具有良好的用户体验和可扩展性。该系统可以用于各种企业、机构和组织的后台管理,包括人力资源管理、财务管理、客户关系管理等。同时,该系统还具有安全性高、性能优异、易于部署等优点,是一种非常实用的后台管理系统。 ### 回答2: Spring BootVue.js是目前非常流行的两种Web开发框架,它们的结合可以用于构建高效、易维护的后台管理系统。这样的系统通常用于处理企业级的后台任务,例如管理用户、存储和查询数据、处理业务逻辑等。 在Spring Boot中,我们可以使用Spring MVC来处理与前端的交互,同时使用Spring Data JPA来操作数据库。这些技术可以极大地简化我们的开发任务,同时提供了强大的功能和稳定的性能。此外,Spring Boot配备了一些非常有用的开发工具,包括自动配置、依赖管理和日志记录等。 与此同时,Vue.js是一种快速的前端框架,使用它可以为用户提供出色的用户体验。Vue.js提供了许多功能强大的组件,例如表格、表单、图标和图表等。此外,它还支持响应式设计,这使得我们的UI可以根据用户的设备和屏幕大小动态地调整布局和样式。 结合Spring BootVue.js,我们可以构建一个完整的后台管理系统,它使用Vue来渲染UI,通过API与Spring Boot的后端进行通信。Vue.js可以使用RESTful API接口来请求Spring Boot发送的JSON数据并将其展示。在处理完用户的交互后,Vue.js会将这些操作反馈给Spring Boot的后端。 总结起来,springboot vue后台管理系统是一种现代化、高效、易维护的框架,可以帮助开发者快速构建功能强大的后台管理系统。这种框架集成了Spring BootVue.js这两种常用的技术,可以提供稳定的性能和出色的用户体验。如果你正在寻找一种现代且适用于企业级后台管理的框架,那么Spring BootVue.js的结合是一个不错的选择。 ### 回答3: Spring Boot Vue是一种基于Spring BootVue后台管理系统架构,它在Web应用的后台管理方面具有很高的可扩展性和易用性。Spring Boot作为后端框架,能够轻松地处理Java应用程序中的各种复杂问题,包括数据库操作、请求过滤、AOP处理等等。Vue作为前端框架,则能够快速地构建SPA应用程序,并提供丰富的界面交互和数据展示功能Spring Boot Vue后台管理系统架构包括两个部分:前端和后端。前端使用Vue、Element UI、Vue Router、Vuex等技术,构建出一个可配置的、快速响应的单页应用程序,实现后台管理系统的各种功能,如用户管理、权限管理、数据统计等。后端使用Spring BootSpring Security、MyBatis等技术,实现对数据库的操作、请求的拦截处理、用户身份验证等功能,同时提供RESTful API和WebSocket协议,以满足前端与后端的数据交互需求。 Spring Boot Vue采用前后端分离的架构,使得前端和后端能够独立地进行开发和部署,同时也避免了代码混杂和难以维护的情况。此外,Spring Boot Vue还提供了大量的现成组件和插件,如数据表格、折线图、饼图等,以方便开发人员在前端进行快速开发,提高产品开发效率。 总之,Spring Boot Vue后台管理系统是一种非常灵活、高效的后台管理系统框架,它能够帮助开发人员快速构建稳定、可拓展的后台管理系统,并在开发过程中提供极高的开发效率和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

water-之

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

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

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

打赏作者

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

抵扣说明:

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

余额充值