Springboot项目搭建(5)-前端注册界面

1.创建项目文件

news:为后端IDE文件

news_client:为前端VSCode文件

..\news\news_client 中启用cmd/PowerShell

查看当前 npm 配置的注册表(registry)地址是否在https://registry.npmmirror.com

如果不在,可在cd new_client后设置npm镜像源

此步骤流程:

cd new_client1126

npm config get registry  【查看镜像源地址】

npm config set registry https://registry.npmmirror.com 【更改镜像源地址】

npm install

npm run dev

2.整理创建的项目文件

2.1 安装JavaScript包

npm install element-plus --save
npm install axios
npm install -D     【D:代表开发者模式】

2.2 整理文件

删除文件:

src\views\AboutView.vue

src\views\HomeView.vue

src\components\HelloWorld.vue
src\components\TheWelcome.vue
src\components\WelcomeItem.vue

src\components\icons及其中所有文件

新建文件夹:

src\apis\...

src\utils\...

2.3 文件整理代码

文件地址:src\App.vue

<script setup></script>
<template></template>
<style scoped></style>

文件地址:src\router\index.js

import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // {
    //   path: '/',
    //   name: 'home',
    //   component: HomeView,
    // },
  ],
})
export default router

2.4 导入elementUI

文件地址:src\main.js

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'👈
import 'element-plus/dist/index.css'👈

const app = createApp(App)

app.use(router)
app.use(ElementPlus)👈
app.mount('#app')

3.配置 Axios 实例与响应拦截器

文件地址:src\utils\request.js

//axios用于向服务端发起请求的工具
import axios from 'axios'
//定义变量记录访问的目标地址
const baseURL = 'http://localhost:8080'
//获得axios对象
const instance = axios.create({baseURL})
//添加拦截器
instance.interceptors.response.use(
    //如果响应结果没有错误,则放行。
    result=>{
        return result.data;
    },
    err=>{//如果响应结果出现错误(异常),则拦截
        alert('服务异常')
        return Promise.reject(err)
        //Promise是用于JavaScript源生的异步请求工具,axios底层由Promise构建而成
    }
)
export default instance;

4.注册与登录

文件地址:src\views\Login.vue

4.1 script行为模块:

trigger:'blur'光标移开后触发校验规则

registerData是双向绑定数据,在javaScript中调用该数据,需要通过.value属性

<script setup>
import { ref, onMounted } from 'vue';
import { User, Lock } from '@element-plus/icons-vue';
//控制显示注册页面或登录页面的变量
const isRegister = ref(false)
//定义数据模型
const registerData = ref({
    username: '',
    password: '',
    rePassword: ''
})
//定义函数,注册、登录切换时,用于清空数据模型的数据
const clearRegisterData = () => {
    registerData.value = {
        username: '',
        password: '',
        rePassword: ''
    }
}
//定义表单校验规则
//自定义校验/重置密码函数
const checkRePassword = (rule,value,callback)=>{
    if(value===''){
        callback(new Error('请再次输入确认密码'))
    }else if(value !== registerData.value.password){
        callback(new Error('请确保两次密码一致'))
    }else{
        callback()
    }
}
const rules = {
    username: [
        { required: true, message: '请输入用户名', trigger: 'blur' },
        { min: 5, max: 16, message: '长度为5-16位的非空字符', trigger: 'blur' }
    ],
    password: [
        { required: true, message: '请输入密码', trigger: 'blur' },
        { min: 5, max: 16, message: '长度为5-16位的非空字符', trigger: 'blur' }
    ],
    rePassword: [
        {validator:checkRePassword,trigger:'blur'}
    ]
}
</script>

4.2 template结构模块

4.2.1 注册表单

<template>
    <el-row class="login-page">
        <el-col :span="8"></el-col>
        <el-col :span="8" class="form">
            <!-- 注册表单 -->
            <el-form size="large" autocomplete="off" v-if="isRegister" :rules="rules" :model="registerData">
                <el-form-item>
                    <h1 class="title">
                        注册
                    </h1>
                </el-form-item>
                <el-form-item prop="username">
                    <el-input placeholder="请输入用户名" :prefix-icon="User" v-model="registerData.username"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input placeholder="请输入密码" type="password" :prefix-icon="Lock"
                        v-model="registerData.password"></el-input>
                </el-form-item>
                <el-form-item prop="rePassword">
                    <el-input placeholder="请确认密码" type="password" :prefix-icon="Lock"
                        v-model="registerData.rePassword"></el-input>
                </el-form-item>
                <el-form-item>
                    <el-button class="button" type="primary" @click="register">
                        注册
                    </el-button>
                </el-form-item>
                <el-form-item class="flex">
                    <el-link type="info" @click="isRegister = false; clearRegisterData()">
                        <span>返回</span>
                    </el-link>
                </el-form-item>
            </el-form>
            <!-- 登录表单 -->
            <!-- ... -->
        </el-col>
        <el-col :span="8"></el-col>
    </el-row>
</template>

4.2.2 登录表单

<template>
    <el-row class="login-page">
        <el-col :span="8"></el-col>
        <el-col :span="8" class="form">
            <!-- 注册表单 -->
            <!-- ... -->   
            <!-- 登录表单 -->
            <el-form size="large" autocomplete="off" v-else :rules="rules" :model="registerData">
                <el-form-item>
                    <h1 class="title">
                        登录
                    </h1>
                </el-form-item>
                <el-form-item prop="username">
                    <el-input placeholder="请输入用户名" :prefix-icon="User" v-model="registerData.username"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input placeholder="请输入密码" type="password" :prefix-icon="Lock"
                        v-model="registerData.password"></el-input>
                </el-form-item>
                <el-form-item class="button">
                    <el-button type="primary" class="button">登录</el-button>
                </el-form-item>
                <el-form-item class="flex">
                    <el-link type="info" @click="isRegister = true; clearRegisterData()">
                        <span>注册</span>
                    </el-link>
                </el-form-item>
            </el-form>
        </el-col>
        <el-col :span="8"></el-col>
    </el-row>
</template>

4.3  style样式模块

<style lang="scss" scoped>
.login-page{
    height: 100vh;
    background-color: #fff;
    .form{
        display: flex;//自适应
        flex-direction: column;//列为准线
        justify-content: center;//居中
        .title{
            margin: 0 auto;//边距
        }
        .button{
            width: 100%;
        }
        .flex{
            width: 100%;
            display: flex;
            justify-content:space-between;
        }
    }
}
</style>

4.4 挂载路由

文件地址:src\App.vue

<script setup></script>
<template>
  <RouterView></RouterView>
</template>
<style scoped></style>

文件地址: src\router\index.js

import { createRouter, createWebHistory } from 'vue-router'
import Login from '@/views/Login.vue'
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'login',
      component: Login,
    },
  ],
})
export default router

5.提供注册接口

文件地址:src\apis\user.js

通过 request.post 方法封装了 HTTP POST 请求,

使得在组件或其他服务中调用注册接口变得更加简单和统一。

//导入request.js请求工具
import request from '@/utils/request';
//暴露注册接口
export const userRegisterService = (registerData)=>{
    const params = new URLSearchParams()
    for(let key in registerData){
        params.append(key,registerData[key])
    }
    return request.post('/user/register',params)
}

6.配置接口地址

文件地址:vite.config.js

import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
export default defineConfig({
  plugins: [ ... ],
  resolve: { ... },
  server:{
    proxy:{
      '/api':{
        target:'http://localhost:8080',
        changeOrigin:true,
        rewrite:(path)=>path.replace(/^\/api/,'')
      }
    }
  }
})

文件地址:src\utils\request.js 

7.增加弹窗效果

 文件地址:src\views\Login.vue

<script setup>
import { ElMessage } from 'element-plus'
//调用请求函数实现业务处理(注册)
import { userRegisterService } from '@/apis/user'
const register = async()=>{
    let result = await userRegisterService(registerData.value);
    console.log(result)
    ElMessage.success(result.msg?result.msg:'注册成功')
}
</script>

8.效果视图

9.附录:

src\views\Login.vue完整代码

<script setup>
import { ref, onMounted } from 'vue';
import { User, Lock } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus'
//控制显示注册页面或登录页面的变量
const isRegister = ref(false)
//定义数据模型
const registerData = ref({
    username: '',
    password: '',
    rePassword: ''
})
//定义函数,注册、登录切换时,用于清空数据模型的数据
const clearRegisterData = () => {
    registerData.value = {
        username: '',
        password: '',
        rePassword: ''
    }
}
//定义表单校验规则
//自定义校验/重置密码函数
const checkRePassword = (rule,value,callback)=>{
    if(value===''){
        callback(new Error('请再次输入确认密码'))
    }else if(value !== registerData.value.password){
        callback(new Error('请确保两次密码一致'))
    }else{
        callback()
    }
}
const rules = {
    username: [
        { required: true, message: '请输入用户名', trigger: 'blur' },
        { min: 5, max: 16, message: '长度为5-16位的非空字符', trigger: 'blur' }
    ],
    password: [
        { required: true, message: '请输入用户名', trigger: 'blur' },
        { min: 5, max: 16, message: '长度为5-16位的非空字符', trigger: 'blur' }
    ],
    rePassword: [
        {validator:checkRePassword,trigger:'blur'}
    ]
}
//调用请求函数实现业务处理(注册)
import { userRegisterService } from '@/apis/user'
const register = async()=>{
    let result = await userRegisterService(registerData.value);
    console.log(result)
    ElMessage.success(result.msg?result.msg:'注册成功')
}
</script>
<template>
    <el-row class="login-page">
        <el-col :span="8"></el-col>
        <el-col :span="8" class="form">
            <!-- 注册表单 -->
            <el-form size="large" autocomplete="off" v-if="isRegister" :rules="rules" :model="registerData">
                <el-form-item>
                    <h1 class="title">
                        注册
                    </h1>
                </el-form-item>
                <el-form-item prop="username">
                    <el-input placeholder="请输入用户名" :prefix-icon="User" v-model="registerData.username"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input placeholder="请输入密码" type="password" :prefix-icon="Lock"
                        v-model="registerData.password"></el-input>
                </el-form-item>
                <el-form-item prop="rePassword">
                    <el-input placeholder="请确认密码" type="password" :prefix-icon="Lock"
                        v-model="registerData.rePassword"></el-input>
                </el-form-item>
                <el-form-item>
                    <el-button class="button" type="primary" @click="register">
                        注册
                    </el-button>
                </el-form-item>
                <el-form-item class="flex">
                    <el-link type="info" @click="isRegister = false; clearRegisterData()">
                        <span>返回</span>
                    </el-link>
                </el-form-item>
            </el-form>
            <!-- 登录表单 -->
            <el-form size="large" autocomplete="off" v-else :rules="rules" :model="registerData">
                <el-form-item>
                    <h1 class="title">
                        登录
                    </h1>
                </el-form-item>
                <el-form-item prop="username">
                    <el-input placeholder="请输入用户名" :prefix-icon="User" v-model="registerData.username"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input placeholder="请输入密码" type="password" :prefix-icon="Lock"
                        v-model="registerData.password"></el-input>
                </el-form-item>
                <el-form-item class="button">
                    <el-button type="primary" class="button">登录</el-button>
                </el-form-item>
                <el-form-item class="flex">
                    <el-link type="info" @click="isRegister = true; clearRegisterData()">
                        <span>注册</span>
                    </el-link>
                </el-form-item>
            </el-form>
        </el-col>
        <el-col :span="8"></el-col>
    </el-row>
</template>
<style lang="scss" scoped>
.login-page{
    height: 100vh;
    background-color: #fff;
    .form{
        display: flex;//自适应
        flex-direction: column;//列为准线
        justify-content: center;//居中
        .title{
            margin: 0 auto;//边距
        }
        .button{
            width: 100%;
        }
        .flex{
            width: 100%;
            display: flex;
            justify-content:space-between;
        }
    }
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos 7 系统 openGauss 3.1.0 一主两备集群安装部署指南

现供职于某上市互联网公司担任DBA Oracle & PG ACE称号&#xff0c; 拥有 Oracle OCM、AWS、以及部分国产数据库等产品认证。 喜欢技术分享&#xff0c;热爱交友&#xff0c;也热爱健身。 2019年加入墨天轮&#xff0c;目前已发表了一百多篇原创文章&#xff0c;曾多次…

w~视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12538137 #SIF3D 通过两种创新的注意力机制——三元意图感知注意力&#xff08;TIA&#xff09;和场景语义一致性感知注意力&#xff08;SCA&#xff09;——来识别场景中的显著点云&#xff0c;并辅助运动轨迹和姿态的预测…

TypeScript 系统学习 开篇

想学习 TypeScript 的小伙伴看过来&#xff0c;本文将带你一步步学习 TypeScript 入门相关的十四个知识点&#xff0c;详细的内容大纲请看下图&#xff1a; 一、TypeScript 是什么 TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c…

计算机网络socket编程(5)_TCP网络编程实现echo_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交…

Stable Diffusion 3详解

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

网络安全原理与技术思考题/简答题

作业1&#xff08;第1章、第2章、第8章&#xff09; 1. 网络安全的基本属性有哪些&#xff1f;简单解释每个基本属性的含义。网络安全的扩展属性包括哪些&#xff1f; 基本属性&#xff1a; 1.机密性(Confidentiality)&#xff1a; 含义&#xff1a;确保信息不被未授权的用户…

【大数据学习 | Spark-Core】Spark的分区器(HashPartitioner和RangePartitioner)

之前学过的kv类型上面的算子 groupby groupByKey reduceBykey sortBy sortByKey join[cogroup left inner right] shuffle的 mapValues keys values flatMapValues 普通算子&#xff0c;管道形式的算子 shuffle的过程是因为数据产生了打乱重分&#xff0c;分组、排序、join等…

Java代码实现数字信封

1. 前言 本篇博客是工作经验总结&#xff0c;如果您发现此篇博客有疏漏或有待改进之处&#xff0c;欢迎评论区交流。 2. 数字信封 数字信封使用的是接收者的非对称密钥对。即&#xff1a;用接收者的公钥加密&#xff0c;且只能由接收者的私钥解密。其实现过程如下&#xff1a;…

第 4 章 Java 并发包中原子操作类原理剖析

原子变量操作类 AtomicLong 是原子性递增或者递减类&#xff0c;其内部使用 Unsafe 来实现&#xff0c;AtomicLong类也是在 rt.jar 包下面的&#xff0c;AtomicLong 类就是通过 BootStarp 类加载器进行加载的。这里的原子操作类都使用 CAS 非阻塞算法 private static final lon…

Android调起系统分享图片到其他应用

Android调起系统分享图片到其他应用 有时候分享不想接第三方的&#xff0c;其实如果你的分享要求不是很高&#xff0c;调系统的分享也是可以的。 一、思路&#xff1a; 用intent.action Intent.ACTION_SEND 二、效果图&#xff1a; 三、关键代码&#xff1a; //这个是分享…

C++中虚继承为什么可以解决菱形继承的数据冗余问题

在C中菱形继承会有数据冗余的问题发生&#xff0c;我们可以使用虚继承来解决&#xff0c;那虚继承的原理是什么&#xff0c;为什么它可以解决这个问题。 菱形继承的数据冗余问题 class A { public:int data; };class B : public A {};class C : public A {};class D : public…

LSA详情与特殊区域

LSA是构成LSDB的重要原材料&#xff0c;在OSPF中发挥很大作用。 报文 通用头部 LS age&#xff1a;LSA寿命&#xff0c;0-3600s Options&#xff1a;可选项 LS type&#xff1a;LSA类型&#xff0c;三要素之一 Link State ID&#xff1a;LSAID 三要素之一 Advertising Ro…

Kubeadm 安装 Kubernetes 高可用集群 v1.30.0

1、修改主机名&#xff08;各个节点&#xff09; hostnamectl set-hostname xxx2、hosts 文件加入主机名&#xff08;全部节点&#xff09; cat /etc/hosts 192.168.88.5 master1 192.168.88.6 master2 192.168.88.7 master3 192.168.88.8 node13、关闭防火墙&#xff08;全部…

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性

目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果&#xff0c;已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…

自由学习记录(25)

只要有修改&#xff0c;子表就不用元表的参数了&#xff0c;用自己的参数&#xff08;只不过和元表里的那个同名&#xff09; 子表用__index“继承”了父表的值&#xff0c;此时子表仍然是空表 一定是创建这样一个同名的变量在原本空空的子表里&#xff0c; 传参要传具体的变…

leetcode 3206. 交替组 I 简单

给你一个整数数组 colors &#xff0c;它表示一个由红色和蓝色瓷砖组成的环&#xff0c;第 i 块瓷砖的颜色为 colors[i] &#xff1a; colors[i] 0 表示第 i 块瓷砖的颜色是 红色 。colors[i] 1 表示第 i 块瓷砖的颜色是 蓝色 。 环中连续 3 块瓷砖的颜色如果是 交替 颜色&…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时&#xff0c;中文字符的显示常常会出现乱码问题&#xff0c;尤其在 macOS 系统上。在网上找了一大堆方法&#xff0c;花了很久&#xff0c;发现不是要安装各种字体就是要改配置&…

深度学习笔记24_天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

podman 源码 5.3.1编译

1. 构建环境 在麒麟V10服务器操作系统上构建&#xff1a;Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。由于只是编译 podman 源码&#xff0c;没必要特地在物理机或服务上安装一个这样的操作系统&#xff0c;故采用在虚拟机里验证。 2. 安装依赖 参考资料&#xf…

【K8S系列】深入解析 Kubernetes 中的 Deployment

Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在自动化应用程序的部署、扩展和管理。在 Kubernetes 中&#xff0c;Deployment 是一种用于管理无状态应用的工作负载资源&#xff0c;提供了丰富的功能&#xff0c;包括版本控制、滚动更新和回滚…