周周清(1)

项目进度:

最近一直在搭建环境,都没写什么:登陆页面采用登陆注册在同一个界面,用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.repasswordif (password !== repassword) {return this.createError({ path: 'confirmPassword' })}return true}),repassword: yup.string().trim().required('该选项不能为空').test('test1', '与第一次输入的密码不匹配', function (repassword) {const password = this.parent.passwordif (password !== repassword) {return false}return true}),// 要么是数字要么是字符串2选1,trim是字符串特有的,只有number不能专门提示userAccount: yup.number().required('输入的必须为非空数字').min(10, '账号必须是10位数字哦')
})
</script><template><div class="layoutLogin"><imgclass="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"><Fieldtype="email"v-model="formModel.email"name="email"placeholder="请输入你的邮箱"/><br /><ErrorMessage name="email" /></div><div class="frame"><Fieldname="password"v-model="formModel.password"type="password"placeholder="请输入你想要的密码"/><br /><ErrorMessage name="password" /></div><div class="frame"><Fieldname="repassword"type="password"placeholder="请再次确认你输入的密码"v-model="formModel.repassword"/><br /><ErrorMessage name="repassword" /></div><div class="frame"><Fieldname="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"><Fieldtype="text"v-model="loginFormModel.userAccount"name="userAccount"placeholder="请输入你的账号"/><br /><ErrorMessage name="userAccount" /></div><div class="frame"><Fieldname="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 sentconst useStore = useUserStore()if (useStore.token) {config.headers.Authorization = useStore.token}return config},function (error) {// Do something with request errorreturn 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 dataif (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.mzph.cn/news/194594.shtml

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

相关文章

Qt配置OpenCV(MSVC编译)

目录 1.准备工具 1.1 Qt&#xff1a;5.14.2 64位 1.2 Opencv&#xff1a;4.6.0 1.3 Visual Studio 2017 2. QtMSVC开发环境搭建 3. 配置环境变量 3.1 Opencv环境变量配置 4. Qt 代码测试 1.准备工具 1.1 Qt&#xff1a;5.14.2 64位 1.2 Opencv&#xff1a;4.6.0 官…

数据库-PostgreSQL学习笔记

目录 PostgreSQL介绍与安装docker安装腾讯云免费领用1个月 数据库操作连接数据库实例创建数据库查看数据库列表使用数据库删除数据库修改数据库属性 表操作字段类型整数浮点数日期与时间类型字符串类型 DDLCREATEDROPALTER DMLINSERTUPDATEDELETE 查询查询所有数据查询部分列指…

Windows驱动中校验数字签名(使用 ci.dll)

1.背景 对于常规应用程序来说&#xff0c;校验数字签名认证在应用层可以使用 WinVerifyTrust, 在驱动层使用常规的 API无法使用&#xff0c;自己分析数据又太麻烦。 在内核中 ci.dll 包装了数据签名验证相关的功能&#xff0c;我们可以使用该 dll 来实现我们的数字签名验证。 详…

Siemens-NXUG二次开发-新建与保存prt文件[Python UF][20231204]

Siemens-NXUG二次开发-新建与保存prt文件[Python UF][20231204] 1.python uf函数1.1 NXOpen.UF.Part.New1.2 NXOpen.UF.Part.Save1.3 NXOpen.UF.Ui.OpenListingWindow1.4 NXOpen.UF.Ui.IsListingWindowOpen1.5 NXOpen.UF.Ui.WriteListingWindow1.6 NXOpen.UF.Ui.SaveListingWin…

电气间隙和爬电距离的算法

电气间隙和爬电距离 一、定义 1、电气间隙&#xff1a;不同电位的两个导电部件间最短的空间直线距离。 2、爬电距离&#xff1a;不同电位的两个导电部件之间沿绝缘材料表面的最短距离。 3、隔离距离&#xff08;机械式开关电器一个极的&#xff09;&#xff1a;满足对隔离器…

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

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

Stable Diffusion 系列教程 - 1 基础准备(针对新手)

使用SD有两种方式&#xff1a; 本地&#xff1a; 显卡要求&#xff1a;硬件环境推荐NVIDIA的具有8G显存的独立显卡&#xff0c;这个显存勉勉强强能摸到门槛。再往下的4G可能面临各种炸显存、炼丹失败、无法生成图片等各种问题。对于8G显存&#xff0c;1.0模型就不行&#xff0…

洛谷 P9516 color C++代码

目录 前言 思路点拨 AC代码 结尾 前言 今天我们来做洛谷上的一道题目。 网址&#xff1a;color - 洛谷 题目&#xff1a; 思路点拨 这题就是if-else判断输入的五个数据和不就OK了&#xff1f; 在这里我的估值是183&#xff08;截止2023.12.3&#xff09;&#xff0c;热…

【力扣】56. 合并区间

【力扣】56. 合并区间 文章目录 【力扣】56. 合并区间1. 题目介绍2. 解法2.1 方法一&#xff1a;标志位2.2 方法二&#xff1a;排序 遍历 3. Danger参考 1. 题目介绍 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合…

Linux系统配置深度学习环境之cudnn安装

前言 一个针对深度学习应用优化的 GPU 加速库。它提供了高性能、高可靠性的加速算法&#xff0c;旨在加速深度神经网络模型的训练和推理过程。 cuDNN 提供了一系列优化的基本算法和函数&#xff0c;包括卷积、池化、规范化、激活函数等&#xff0c;以及针对深度学习任务的高级功…

移动平均滤波的原理和C代码

移动平均滤波是一种简单有效的平滑信号的方法&#xff0c;它通过计算一系列数据点的平均值来减小信号中的波动。基本的移动平均滤波方法有两种&#xff1a;简单移动平均&#xff08;SMA&#xff09;和指数加权移动平均&#xff08;EWMA&#xff09;。 简单移动平均滤波&#xf…

Go读取yaml文件,struct返回,json输出

程序模块中&#xff0c;缺少不了一些配置定义&#xff0c;这时定义yaml是个很好的选择 先定义yaml文件内容&#xff0c;文件名为&#xff1a;task_status_config.yaml confs:#阅读类任务&#xff0c;即提醒任务read:name: readawait: #待开始任务status_id: 0ing: #进行中任务…

53.redis分布式缓存

目录 一、单机安装Redis。 二、Redis主从集群。 2.1.集群结构 2.2.准备实例和配置 2.3.启动 2.4.开启主从关系 2.5.测试 三、搭建哨兵集群。 3.1.集群结构 3.2.准备实例和配置 3.3.启动 3.4.测试 四、搭建分片集群。 4.1.集群结构 4.2.准备实例和配置 4.3.启动…

监控之Spring Boot Admin

目录 一、Spring Boot Admin 简介 官方网址 简介 二、Spring Boot Admin的使用 启动SBA server 微服务端配置SBA server地址 查看监控信息 一、Spring Boot Admin 简介 官方网址 GitHup网址&#xff1a;GitHub - codecentric/spring-boot-admin: Admin UI for administ…

Linux下Redis安装及配置

首先下载redis安装包&#xff1a;地址 这里我使用的是7.0版本的&#xff01; 将文件上传至linux上&#xff0c;此处不再多叙述&#xff0c;不会操作的&#xff0c;建议使用ftp&#xff01; 第一步&#xff1a;解压压缩包 tar -zxvf redis-7.0.14.tar.gz第二步&#xff1a;移…

网络安全--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统&#xff08;平台&#xff09;的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括&#xff1a;靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

使用 Kettle 完成数据 ETL

文章目录 使用 Kettle 完成数据 ETL数据清洗数据处理 使用 Kettle 完成数据 ETL 现在我们有一份网站的日志数据集&#xff0c;准备使用Kettle进行数据ETL。先将数据集加载到Hadoop集群中&#xff0c;然后对数据进行清洗&#xff0c;最后加载到Hive中。 在本地新建一个数据集文…

RocketMQ-RocketMQ集群实践

搭建RocketMQ可视化管理服务 下载可视化客户端源码下载 | RocketMQ 这里只提供了源码&#xff0c;并没有提供直接运行的jar包。将源码下载下来后&#xff0c;需要解压并进入对应的目录&#xff0c;使用maven进行编译。(需要提前安装maven客户端) mvn clean package -Dmaven.t…

RPC和REST对比

RPC和REST对比 参考学习 RPC 和 REST 之间有什么区别&#xff1f; 当我们对比RPC和REST时&#xff0c;其实是在对比RPC风格的API和REST风格的API&#xff0c;后者通常成为RESTful API。 远程过程调用&#xff08;RPC&#xff09;和 REST 是 API 设计中的两种架构风格。API …

「Swift」取消UITableView起始位置在状态栏下方开始

前言&#xff1a;在写页面UI时发现&#xff0c;当隐藏了NavigationBar时&#xff0c;即使UITableView是从(0,0)进行布局&#xff0c;也会一直在手机状态栏下方进行展示布局&#xff0c;而我的想法是希望UITableView可以从状态栏处就进行展示布局 当前页面展示&#xff1a; 问题…