当前位置: 首页 > news >正文

Vue全栈开发旅游网项目(9)-用户登录/注册及主页页面开发

1.用户登录页面开发

1.查询vant组件 2.实现组件模板部分 3.模型层准备 4.数据上传

1.1 创建版权声明组件Copyright

新建文件:src\components\common\Copyright.vue

<template><!-- 版权声明 --><div class="copyright">copyright xxx旅游网&copy;2024</div>
</template>
<style lang="less">
.copyright{position: fixed;bottom: 0;padding: 10px;color:#999;width: 100%;text-align: center;font-size: 12px;
}
</style>

1.2 登录页面Login

新建文件:src\views\accounts\Login.vue

1.2.1 脚本script:

<script setup>
import Copyright from '@/components/common/Copyright.vue';
import { ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import TripFooter from '@/components/common/Footer.vue';const route = useRoute() //获得属性
const router = useRouter()  //获取地址const username = ref('')
const password = ref('')//用户名的验证规则
const rulename = ref([{required: true,//用户名组件中通过该属性开启必填验证message: '请填写用户名'
}, {pattern: /1\d{10}/,//用户名组件中,通过该属性开启正则表达式验证message: '请填写正确的手机号'
}])const goBack = () => {router.go(-1)
}
</script>

1.2.2 模板template 

<template><div class="page-account-login"><!-- 导航条 --><van-nav-bar title="用户登录" left-text="返回" @click-left="goBack"></van-nav-bar><!-- 表单输入 --><van-form><!-- 文本框 --><van-field v-model="username" label="用户名" placeholder="用户名" maxlength="11" :rules="rulename" clearable /><!-- 密码框 --><van-field v-model="password" type="password" label="密码" placeholder="密码" :rules="[{ required: true }]" autocomplete="off"/><div><van-button square type="primary" native-type="submit" color="green">提交</van-button></div></van-form><!-- 文字提示 --><div>登录表示同意<a href="#">用户使用协议</a>及<a href="#">隐私条款</a></div><div>没有账户?<RouterLink :to="{name:'AccountRegister'}">点击注册</RouterLink></div><!-- 版权信息 --><Copyright /><TripFooter/></div>
</template>

1.2.3 配置路由:

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

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

2.用户注册界面开发

2.1 封装短信验证组件SendSmscode

新建文件:src\components\common\SendSmsCode.vue

2.1.1 脚本script

<script setup>
//defineProps用于父子组件通信
import { ref, onMounted, computed, defineProps } from 'vue'
import { useRoute, useRouter } from 'vue-router'//用于控制页面跳转工具,传值工具
import { ajax } from '@/utils/ajax';
import { SightApis } from '@/utils/apis';
import { showToast } from 'vant';const router = useRouter()
const route = useRoute()const goBack = () => {router.go(-1)//跳转至上一页(1:跳转至下一页)
}
const props = defineProps({phoneNum: String
})
//存放验证信息(响应式数据)
const isSmsSend = ref(false)
const sendBtnText = ref('点击发送验证码')
const timer = ref(null)
const counter = ref(60)//清空验证码计时
const reset = () => {isSmsSend.value = falsesendBtnText.value = '点击发送验证码'if (timer.value) {clearInterval(timer.value)//停止回调函数counter.value = 60timer.value = null}
}
//倒计时
const countDown = () => {//回调函数,重复调用timer.value = setInterval(() => {sendBtnText.value = `(${counter.value}秒)后重新发送`counter.value--if (counter.value < 0) {reset()}}, 1000)
}
//发送验证码
const sendSmsCode = () => {//判断手机号是否输入if (!props.phoneNum) {showToast('请输入手机号码')return false}isSmsSend.value = true    //调用接口,发送短息countDown()    //开始倒计时
}
defineExpose({//向父级暴露函数reset
})
</script>

2.1.2 模板template:

<template><!-- 短信验证码发送相关逻辑 --><van-button size="small" type="primary" @click.prevent="sendSmsCode()" :disabled="isSmsSend">{{ sendBtnText }}</van-button>
</template>

2.2 注册页面Register

新建文件:src\views\accounts\Register.vue

2.2.1 脚本script:

<script setup>
import Copyright from '@/components/common/Copyright.vue'
import SendSmsCode from '@/components/common/SendSmsCode.vue'
import { ref, toRef } from 'vue';
import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter();
// 用户名的验证规则
const ruleName = ref([{required: true,message: '请填写用户名'
}, {pattern: /1\d{10}/,message: '请填写正确的手机号'
}])
// 重复密码验证
const rulePassword = ref([{required: true,message: '请重复一次密码'}, {validator: () => form.value.password === form.value.passwordRepeat,message: '两次密码输入不一致'}])
const form = ref({username: '',nickname: '',sms_code: '',password: '',passwordRepeat: ''
})
//手机号变化时,重置验证码组件状态
const refSms = ref({})
const onPhoneChange = () => {//调用验证码组件中reset函数,重置验证码refSms.value.reset()
}
const onSubmit = () => {// 提交表单
}
const goBack = () => {router.go(-1)
}
</script>

2.2.2 模板template


<template><!-- 用户注册 --><div class="page-account-register"><!-- 导航条 --><van-nav-bar title="用户注册" left-text="返回" left-arrow @click-left="goBack" /><!-- 表单输入 --><van-form @submit="onSubmit"><van-field v-model="form.username" label="手机号码" placeholder="手机号码" type="tel" maxlength="11" clearable:rules="ruleName" @input="onPhoneChange" /><van-field v-model="form.sms_code" center clearable label="短信验证码" placeholder="短信验证码":rules="[{ required: true, message: '请输入短信验证码' }]"><template #button><SendSmsCode ref="refSms" :phoneNum="form.username" /></template></van-field><van-field v-model="form.nickname" label="用户昵称" placeholder="用户昵称" maxlength="32" clearable:rules="[{ required: true, message: '请输入用户昵称' }]" /><van-field v-model="form.password" type="password" label="密码" placeholder="密码":rules="[{ required: true, message: '请填写密码' }]" autocomplete="off"/><van-field v-model="form.passwordRepeat" type="password" label="确认密码" placeholder="确认密码":rules="rulePassword" autocomplete="off" /><div style="margin: 16px;"><van-button round block type="info" native-type="submit">提交</van-button></div></van-form><!-- //表单输入 --><!-- 文字提示 --><div class="tips">注册表示同意 <a href="#">用户使用协议</a>及<a href="#">隐私条款</a></div><div class="tips">已有账号? <router-link :to="{ name: 'AccountLogin' }">点击登录>></router-link></div><!-- 版权信息 --><Copyright /></div>
</template>

2.2.3 配置路由:

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

import AccountRegister from '@/views/accounts/Register.vue'
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{//用户注册path: '/account/register',name: 'AccountRegister',component: AccountRegister}]
})

3.个人主页界面开发Mine

新建文件:src\views\Mine.vue

3.1 脚本script

import TripFooter from '@/components/common/Footer.vue'

3.2 模板template


<template><div class="page-mine"><!-- 标题栏 --><van-nav-bar title="个人中心" /><!-- 用户基本信息(头像/昵称) --><div class="user-header"><div class="avatar"><img src="/static/mine/avatar.png"></div><div><p>Welcome,Adela</p><a class="btn-link" href="#">退出登录</a></div></div><!-- 订单菜单列表 --><van-row><van-col span="6"><RouterLink to="/"><van-icon name="records" /><span>全部订单</span></RouterLink></van-col><van-col span="6"><RouterLink to="/"><van-icon name="pending-payment" /><span>待支付</span></RouterLink></van-col><van-col span="6"><RouterLink to="/"><van-icon name="tosend" /><span>已完成</span></RouterLink></van-col><van-col span="6"><RouterLink to="/"><van-icon name="logistics" /><span>已取消</span></RouterLink></van-col></van-row><!-- 底部导航 --><TripFooter /></div>
</template>

3.3 样式style(范例)

<style lang="less">
.page-mine {font-family: 'Arial', sans-serif;color: #333;background-color: #f7f7f7;.van-nav-bar {background-color: #07c; //color: #fff;.van-nav-bar__title {color: #fff;text-align: center;}}// 用户头部区域样式.user-header {background: url(/static/mine/bg.jpg) no-repeat center;background-size: cover;color: #fff;height: 200px;display: flex;flex-direction: column;justify-content: center;align-items: center;height: 200px; // 确保有足够的高度.avatar {margin-bottom: 20px;img {width: 60px;height: 60px;border-radius: 50%;}}p {font-size: 18px;}.btn-link {margin-top: 10px; // 添加顶部外边距以在垂直方向上居中margin-left: 25px; }}// 订单菜单列表样式.van-row {.van-col {a {display: flex;flex-direction: column;align-items: center;text-decoration: none;color: #333;padding: 10px;.van-icon {font-size: 24px;margin-bottom: 5px;}span {font-size: 14px;}}&:not(:last-child) {border-right: 1px solid #eee;}}}// 底部导航样式.trip-footer {background-color: #fff;box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1);position: fixed;bottom: 0;width: 100%;}
}
</style>

3.4 配置路由

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

import Mine from '@/views/Mine.vue'
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{//个人中心path: '/mine',name: 'Mine',component: Mine}]
})

3.5 图示效果:

相关文章:

Vue全栈开发旅游网项目(9)-用户登录/注册及主页页面开发

1.用户登录页面开发 1.查询vant组件 2.实现组件模板部分 3.模型层准备 4.数据上传 1.1 创建版权声明组件Copyright 新建文件&#xff1a;src\components\common\Copyright.vue <template><!-- 版权声明 --><div class"copyright">copyright xx…...

Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比

一、Flutter 的 Widget 概述 Flutter 是 Google 开发的一款开源 UI 框架&#xff0c;旨在帮助开发者快速构建高性能、高保真度的移动、Web 和桌面应用程序。在 Flutter 中&#xff0c;UI 的构建完全是通过 Widget 来实现的。Widget 是 Flutter 中所有用户界面元素的基础构建块…...

微服务day04

网关 网关路由 快速入门 创建新模块&#xff1a;hm-gateway继承hmall父项目。 引入依赖&#xff1a;引入网关依赖和nacos负载均衡的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

Spring Boot 集成JWT实现Token验证详解

文章目录 Spring Boot 集成JWT实现Token验证详解一、引言二、JWT和Token基础1、什么是Token2、什么是JWT3、JWT的结构4、JWT的工作原理 三、集成JWT1、引入JWT依赖2、创建Token工具类3、创建拦截器4、注册拦截器 四、总结 Spring Boot 集成JWT实现Token验证详解 一、引言 在现…...

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK&#xff1a;确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven&#xff1a;下载并安装Maven构建工具&#xff0c;这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器&#xff1a;这里推荐使用Inte…...

学习笔记:黑马程序员JavaWeb开发教程(2024.11.9)

9.1 Mybatis-基础操作-环境准备 这里也没做&#xff0c;到时候写案例&#xff0c;如果需要环境配置什么的&#xff0c;可以看看这个 9.2 Mybatis-基础操作-删除 删除需要动态获取需要删除的id&#xff0c;使用方法传参&#xff0c;#{}的方式实现 在编写的delete方法中&a…...

【软考】系统分析师第二版 新增章节 第20章微服务系统分析与设计

微服务系统是一类基于微服务架构风格的分布式系统&#xff0c;它将应用程序拆分成多个独立的小型服务&#xff0c;每个服务都运行在独立的进程中&#xff0c;并采用轻量级通信协议进行通信。这些服务可以由不同的团队开发、不同的编程语言编写&#xff0c;并且可以按需部署。微…...

抓包工具WireShark使用记录

目录 网卡选择&#xff1a; 抓包流程&#xff1a; 捕获过滤器 常用捕获过滤器&#xff1a; 抓包数据的显示 显示过滤器&#xff1a; 常用的显示过滤器&#xff1a; 实际工作中&#xff0c;在平台对接&#xff0c;设备对接等常常需要调试接口&#xff0c;PostMan虽然可以进…...

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…...

php伪协议介绍

PHP伪协议共有12种,具体如下: file:// — 访问本地文件系统http:// — 访问 HTTP(s) 网址ftp:// — 访问 FTP(s) URLsphp:// — 访问各个输入/输出流(I/O streams)php://stdin, php://stdout 和 php://stderrphp://inputphp://outputphp://memory 和 php://tempphp://filte…...

『事善能』MySQL基础 — 2.MySQL 5.7安装(一)

1、通过msi安装软件进行MySQL安装 &#xff08;1&#xff09;点击运行MySQL安装文件 &#xff08;2&#xff09;选择安装类型 我们选择自定义安装&#xff0c;点击Next。 说明 Develop Default&#xff1a;默认开发类型&#xff0c;安装MySQL服务器以及开发MySQL应用所需要的工…...

漫谈分布式唯一ID

文章目录 本系列前言UUIDDB自增主键Redis incr命令号段模式雪花算法 本系列 漫谈分布式唯一ID&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf分布式唯一ID生成&#xff08;三&#xff09;&#xff1a;uid-generator&#xff08;待完…...

【复旦微FM33 MCU 开发指南】ADC

前言 本系列基于复旦微FM33LC0系列单片机的DataSheet编写&#xff0c;旨在提供手册解析和开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/11/09 全文字数&#xff…...

ORB_SLAM3安装

ORB_SLAM3安装 一.前期准备1.1ubuntu查看当前版本的命令1.2 根据ubuntu版本&#xff0c;更新下载软件源1.3 先下载git1.4 vim语法高亮1.5 常见的linux命令 二.ORB-SLAM3下载2.1 ORB_SLAM3源码下载2.2 安装依赖库2.2.1 依赖库2.2.2 安装pangolin2.2.3 安装opencv2.2.4 Eigen3安装…...

GoLang协程Goroutiney原理与GMP模型详解

本文原文地址:GoLang协程Goroutiney原理与GMP模型详解 什么是goroutine Goroutine是Go语言中的一种轻量级线程&#xff0c;也成为协程&#xff0c;由Go运行时管理。它是Go语言并发编程的核心概念之一。Goroutine的设计使得在Go中实现并发编程变得非常简单和高效。 以下是一些…...

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…...

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

本文目录索引 一个指令和三种方式通过约束脚本添加Golden位流工程MultiBoot位流工程验证example1总结代码缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7MB:MicroBlaze上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我…...

文献阅读 | Nature Methods:使用 STAMP 对空间转录组进行可解释的空间感知降维

文献介绍 文献题目&#xff1a; 使用 STAMP 对空间转录组进行可解释的空间感知降维 研究团队&#xff1a; 陈金妙&#xff08;新加坡科学技术研究局&#xff09; 发表时间&#xff1a; 2024-10-15 发表期刊&#xff1a; Nature Methods 影响因子&#xff1a; 36.1&#xff0…...

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(1-3)

在前端开发中&#xff0c;模块化是一个重要的概念&#xff0c;不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module&#xff0c;因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…...

[NewStar 2024] week5完结

每次都需要用手机验证码登录&#xff0c;题作的差不多就没再进过。今天把week5解出的部分记录下。好像时间过去很久了。 Crypto 没e也能完 这题给了e,p,q,dp,dq。真不清楚还缺啥 long_to_bytes(pow(c,dp,p)) 格格你好棒 给了a,b和提示((p2*r) * 3*a q) % b < 70 其中r…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...