周周清(1)

news2025/1/15 18:25:58

项目进度:

最近一直在搭建环境,都没写什么:登陆页面采用登陆注册在同一个界面,用v-if进行渲染,并且借助validation插件中的yup神器进行校验,

<script setup>
// import { ref } from 'vue'
import * as yup from 'yup'
import { Form, Field, ErrorMessage } from 'vee-validate'
import { ref, watch } from 'vue'
// import { useUserStore } from '@/stores/index'
// import { useRouter } from 'vue-router'
import { userRegisterService, userLoginService } from '@/api/user'
const isRegister = ref(true)
const isSendingCode = ref(false)
// 注册功能,整个的用于提交的form对象
// 设置预校验
// const userStore = useUserStore()
const formValidate = ref()
// const router = useRouter()
const login = async () => {
  await formValidate.value.validate()
  const res = userLoginService(loginFormModel.value)
  // userStore.setToken(res.data.token)
  ElMessage.success('登录成功')
  console.log('开始登录', res)
  // router.push('/')
}
const register = async () => {
  await formValidate.value.validate()
  await userRegisterService(formModel.value)
  ElMessage.success('注册成功')
  isRegister.value = false
}
const formModel = ref({
  email: '',
  password: '',
  repassword: '',
  confirm: ''
})
const loginFormModel = ref({
  userAccount: null,
  password: ''
})
watch(isRegister, () => {
  formModel.value = {
    email: '',
    password: '',
    repassword: ''
  }
  loginFormModel.value = {
    userAccount: '',
    password: ''
  }
})

const simpleSchema = yup.object({
  email: yup
    .string()
    .trim()
    .required('该选项不能为空')
    .matches('^[1-9]\\d{4,10}@qq\\.com$', '输入的内容不满足邮箱格式'),
  password: yup
    .string()
    .trim()
    .required('该选项不能为空')
    .min(8, '密码必须为至少8位字符')
    .test('test2', '与第一次输入的密码不匹配', function (password) {
      const repassword = this.parent.repassword
      if (password !== repassword) {
        return this.createError({ path: 'confirmPassword' })
      }
      return true
    }),
  repassword: yup
    .string()
    .trim()
    .required('该选项不能为空')
    .test('test1', '与第一次输入的密码不匹配', function (repassword) {
      const password = this.parent.password
      if (password !== repassword) {
        return false
      }
      return true
    }),
  // 要么是数字要么是字符串2选1,trim是字符串特有的,只有number不能专门提示
  userAccount: yup
    .number()
    .required('输入的必须为非空数字')
    .min(10, '账号必须是10位数字哦')
})
</script>

<template>
  <div class="layoutLogin">
    <img
      class="loginBackground"
      src="https://pic1.zhimg.com/80/v2-9140eb49073346f74f04b6628c77c3fc_1440w.webp"
      alt="背景图"
    />
    <Form
      @submit="submit"
      :validation-schema="simpleSchema"
      :model="formModel"
      class="form"
      v-if="isRegister"
      ref="formValidate"
    >
      <div class="title">注册</div>
      <div class="frame">
        <Field
          type="email"
          v-model="formModel.email"
          name="email"
          placeholder="请输入你的邮箱"
        />

        <br />
        <ErrorMessage name="email" />
      </div>

      <div class="frame">
        <Field
          name="password"
          v-model="formModel.password"
          type="password"
          placeholder="请输入你想要的密码"
        />
        <br />
        <ErrorMessage name="password" />
      </div>
      <div class="frame">
        <Field
          name="repassword"
          type="password"
          placeholder="请再次确认你输入的密码"
          v-model="formModel.repassword"
        />
        <br />
        <ErrorMessage name="repassword" />
      </div>
      <div class="frame">
        <Field
          name="repassword"
          type="password"
          placeholder="请输入验证码"
          v-model="formModel.confirm"
          class="confirmInput"
        />
        <span class="getConfirm" :disabled="isSendingCode">验证码</span>
      </div>

      <button @click="register">注册</button>
      <div class="toWhere">
        <a href="#" class="toLogin">已有帐号?去登录</a>
        <br />
        <a href="#" class="toModify">忘记密码?</a>
      </div>
    </Form>
    <!-- 切换的时候重置表单内容 -->

    <Form
      @submit="submit"
      :validation-schema="simpleSchema"
      :model="loginFormModel"
      class="form"
      ref="formValidate"
      v-else
    >
      <div class="title">登录</div>
      <div class="frame">
        <Field
          type="text"
          v-model="loginFormModel.userAccount"
          name="userAccount"
          placeholder="请输入你的账号"
        />
        <br />
        <ErrorMessage name="userAccount" />
      </div>

      <div class="frame">
        <Field
          name="password"
          v-model="loginFormModel.password"
          type="password"
          placeholder="请输入密码"
        />
        <br />
        <ErrorMessage name="password" />
      </div>

      <button @click="login">登录</button>
      <div class="toWhere">
        <a href="#" class="toLogin">新用户?去注册</a>
        <br />
        <a href="#" class="toModify">忘记密码?</a>
      </div>
    </Form>
  </div>
</template>
<style scoped>
* {
  outline: none;
  padding: none;
  margin: 0;
}
.form {
  width: 30vw;
  min-height: 40vh;
  font-family: 'YouYuan';
  box-shadow: 2px 4px 8px 4px rgba(49, 110, 64, 0.387);
  border-radius: 10px;
}
.title {
  font-size: 40px;

  font-family: 'STCaiyun';
  text-shadow: 5px 5px 3px rgba(0, 0, 0, 0.329);
  color: whitesmoke;
  margin-top: 0.5em;
  margin-bottom: 0.2em;
  margin-left: 4em;
}

.layoutLogin {
  display: flex;
  height: 100vh;
  width: 100vw;
  justify-content: center;
  align-items: center;
}
/* 对于Field,本质上是input,所以还是要改变这个 */
input {
  height: 2em;
  width: 20em;
  border: rgba(41, 202, 143, 0.089) solid 1.5px;
  box-shadow: 0px 1px 8px 2px rgba(0, 0, 0, 0.223);
  border-radius: 1em;
  background-color: rgba(240, 255, 255, 0);
}
.confirmInput {
  width: 12em;
}
.getConfirm {
  padding: 0.6em;
  border-radius: 2em;
  border: rgba(28, 172, 131, 0.295) solid 1px;
  box-shadow: 0px 1px 8px 2px rgba(0, 0, 0, 0.223);
  margin-left: 3em;
  color: white;
  cursor: pointer;
}
.getConfirm:hover {
  background-color: rgba(240, 248, 255, 0.315);
}
.frame {
  margin: 30px 5em;
}
.loginBackground {
  position: absolute;
  height: 100vh;
  width: 100vw;
  z-index: -1;
}
span {
  color: red;
  font-size: 0.8em;
}
button:hover {
  background-color: rgba(234, 236, 230, 0.421);
}
button {
  margin: 0.5em 12.5em;
  margin-top: 1em;
  border: rgba(26, 120, 121, 0.377);
  background-color: rgba(143, 212, 198, 0.216);
  width: 5em;
  height: 2.5em;
  border-radius: 1em;
  color: aliceblue;
  box-shadow: 0px 1px 8px 2px rgba(0, 0, 0, 0.223);
}
.toWhere {
  font-size: 0.5em;
  margin-left: 1.5em;
  margin-bottom: 20px;
}
.toLogin,
.toModify {
  color: aliceblue;
}
.toLogin:hover,
.toModify:hover {
  color: rgb(205, 242, 255);
}
</style>

对于请求进行封装,设置请求拦截器和响应拦截器:

import { useUserStore } from '@/stores'
import { ElMessage } from 'element-plus'
import router from '@/router'
import axios from 'axios'
const baseURL = 'https://big-event-vue-api-t.itheima.net'
const instance = axios.create({
  baseURL,
  timeout: 10000
  //   headers: { 'X-Custom-Header': 'foobar' }
})
// Add a request interceptor
axios.interceptors.request.use(
  (config) => {
    // 携带token
    // Do something before request is sent
    const useStore = useUserStore()
    if (useStore.token) {
      config.headers.Authorization = useStore.token
    }
    return config
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error)
  }
)

// Add a response interceptor
axios.interceptors.response.use(
  function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    if (response.data.code === 0) {
      return response
    }
    ElMessage.error(response.data.message || '服务异常')
    return Promise.reject(response.data)
  },
  function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    //错误的特殊情况401 权限不足或者token过期=》拦截到登录
    if (error.response?.status === 401) {
      router.push('/login')
    }
    //错误的默认情况
    ElMessage.error(error.response.data.message || '服务异常')
    return Promise.reject(error)
  }
)

export default instance
export { baseURL }

封装接口:

import request from '@/utils/request'
//注册接口
export const userRegisterService = ({ email, password, repassword }) => {
  return request.post('/api/reg', { email, password, repassword })
}

//登录接口
export const userLoginService = ({ userAccount, password }) => {
  return request.post('/api/login', { userAccount, password })
}


这周答辩过后实在是看到了很大的不足,从这周起要开始认真了;这周的话应该要写完登陆注册jwt和修改个人资料,然后如果能多写一点的话可以适当加上一个搜索分页;

然后,激励自己:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 - 导论

简单了解 机器学习关于数据集的概念 、

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而&#xff0c;长时间的文稿创作不仅费时费力&#xff0c;还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…

思维模型 搭便车效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。合理坐享其成。 1 搭便车效应的应用 1.1 搭便车效应在商业竞争中的应用 1 被搭便车的AT&T 在 20 世纪 80 年代&#xff0c;美国电信市场由美国电话电报公司&#xff08;AT&T&…

DNA模糊匹配(动态规划)

我做动态规划还是少的 只会做那些显而易见的动态规划题&#xff08;这题是看了给出来的解题思路做的&#xff09; 以后可能就会做与这类似的了 代码如下&#xff1a; #include<stdio.h> #include<string.h> int get_min(int a, int b, int c); int min_l[301][…

利用STM32内置温度传感器实现温度监测系统

STM32微控制器是一款强大的嵌入式处理器&#xff0c;具有广泛的应用领域。其中&#xff0c;一些STM32微控制器内置了温度传感器&#xff0c;可以方便地实现温度监测功能。本文将详细介绍如何利用STM32内置温度传感器实现温度监测系统&#xff0c;并提供相应的示例代码。 一、硬…

【C++】类和对象——explicit关键字,友元和内部类

这篇博客已经到了类和对象的最后一部分了&#xff0c;下面我们先看一下explicit关键字 我们还是先来引入一个例子&#xff0c;我们的代码是可以这么写的 class A { public:A(int aa 0) {_a aa;cout << "A(int aa 0)" << endl;} private:int _a; }; i…

【Vue】Vue CLI 脚手架(Vue Command Line Interface)安装教程(通过npm)

前言 Vue CLI&#xff08;Vue Command Line Interface&#xff09;是一个基于Vue.js的官方脚手架工具&#xff0c;用于快速搭建和管理Vue.js项目。它提供了一套完整的开发工具和配置&#xff0c;包括项目初始化、开发服务器、热重载、构建和打包等功能。 Vue CLI使用了Webpac…

华为手环关闭智能适时测量

问题 使用华为手环并使用华为创新研究APP后&#xff0c;会自动打开智能适时测量开关&#xff0c;此开关开启后&#xff0c;手环会在睡眠时间自动测量血氧&#xff0c;增加手环功耗从而影响续航&#xff0c;用户可根据自身需求决定是否开启&#xff0c;下文介绍如何找到此开关。…

逻辑漏洞测试靶场实验

任务一&#xff1a; 突破功能限制漏洞&#xff0c;要求突破查询按钮disabled限制&#xff0c;获取编号&#xff1a;110010的查询内容&#xff08;弹框中的flag&#xff09; 任务二&#xff1a;用户信息泄露漏洞&#xff0c;通过回显信息&#xff0c;以暴力破解法方式猜测系统中…

SpringBoot整合Kafka

SpringBoot整合Kafka 文章目录 SpringBoot整合Kafka下载与安装创建topic&#xff0c;测试生产消费程序SpringBoot整合Kafka导坐标做配置做客户端 下载与安装 下载地址&#xff1a; https://kafka.apache.org/downloads 下载2的版本&#xff0c;3.的版本会报错 解压安装&#x…

华为手环配置技巧

前言 华为手环作为生活健康辅助设备发挥不可忽视的作用&#xff0c;但每次更换手环后需要重新配置。华为手环不仅有健康监测、消息通知、天气推送、离线支付、公交卡、运动锻炼、等功能&#xff0c;还有倒计时、计时器、手电筒、闹钟、等小工具。下文介绍如何进行配置。 配置…

Apache solr XXE 漏洞(CVE-2017-12629)

任务一&#xff1a; 复现环境中的漏洞 任务二&#xff1a; 利用XXE漏洞发送HTTP请求&#xff0c;在VPS服务器端接受请求&#xff0c;或收到DNS记录 任务三&#xff1a; 利用XXE漏洞读取本地的/etc/passwd文件 1.搭建环境 2.开始看wp的时候没有看懂为什么是core&#xff0c;然…

PAD平板签约投屏软件要如何选

又是一年年底了&#xff0c;年会开始多起来了&#xff0c;许多会务公司或活动公司会接到很多平板签约投屏业务&#xff0c;如年会中的签军令状、业绩保证书等。这时就面临选购一套签约投屏软件了。 目前的签约投屏软件&#xff0c;大多以H5做的网页版的多&#xff0c;但我建议…

Leetcode1094. 拼车

Every day a Leetcode 题目来源&#xff1a;1094. 拼车 解法1&#xff1a;差分数组 对于本题&#xff0c;设 a[i] 表示车行驶到位置 i 时车上的人数。我们需要判断是否所有 a[i] 都不超过 capacity。 trips[i] 相当于把 a 中下标从 fromi 到 toi−1 的数都增加 numPassenge…

【LeetCode:1423. 可获得的最大点数 | 滑动窗口】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

WEB服务器配置与HTTP分析

目录 实验目的&#xff1a; 实验要求&#xff1a; 实验原理&#xff1a; 实验步骤&#xff1a; 步骤1&#xff1a;创建拓扑 步骤2&#xff1a;为PC、Client和Server配置IPv4地址、子网掩码和域名服务器 步骤3&#xff1a;启动设备和服务器 步骤4&#xff1a;测试PC-1、C…

Java面试题(每天10题)-------连载(41)

目录 Spring篇 1、什么是Spring框架&#xff1f;Spring框架主要有哪些模块&#xff1f; 2、使用Spring框架能带来哪些好处&#xff1f; 3、什么是控制反转&#xff08;IOC&#xff09;&#xff1f;什么是依赖注入&#xff1f; 4、解释下Spring中的IoC? 5、BeanFactory和…

springboot+java电脑硬件库存管理系统+jsp

现如今&#xff0c;信息种类变得越来越多&#xff0c;信息的容量也变得越来越大&#xff0c;这就是信息时代的标志。近些年&#xff0c;计算机科学发展得也越来越快&#xff0c;而且软件开发技术也越来越成熟&#xff0c;因此&#xff0c;在生活中的各个领域&#xff0c;只要存…

Android开发,JNI开发项目创建

文章目录 Android开发&#xff0c;JNI开发项目创建1.jni是什么 Android开发&#xff0c;JNI开发项目创建 创建工程 1.jni是什么 使得java可以访问底层c语言&#xff0c;java本地化接口&#xff0c;是桥梁。 运行下我们的项目 出现这个就是我们的JNI开发环境已经配置好了 是…

Linux --- 进程控制

目录 1. 进程创建 1.1. 内核数据结构的处理 1.2. 代码的处理 1.3. 数据的处理&#xff1a; 方案一&#xff1a;fork创建子进程的时候&#xff0c;直接对数据进行拷贝处理&#xff0c;让父子进程各自私有一份 方案二&#xff1a;写实拷贝(copy on write) 1.4. fork常规用…