目录
页面布局流程
注册页面七大改动
<template>
<h1>Regist</h1>
<van-form @submit="onSubmit">
<van-cell-group inset>
<van-field
v-model="username"
name="用户名"
label="用户名"
placeholder="用户名"
:rules="[
{ required: true, message: '请填写用户名' },
{validator:checkUsername,message:'用户已经被注册'}
]"
/>
<van-field
v-model="password"
type="password"
name="密码"
label="密码"
placeholder="密码"
:rules="[{ required: true, message: '请填写密码' }]"
/>
<van-field
v-model="re_password"
type="password"
name="密码"
label="密码"
placeholder="再次输入密码密码"
:rules="[
{ required: true, message: '再次输入密码密码' },
{validator:checkRePassword,message:'两次输入密码不一致'}
]"
/>
</van-cell-group>
<div style="margin: 16px;">
<van-button round block type="primary" native-type="submit">
提交
</van-button>
</div>
</van-form>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const username = ref('');
const password = ref('');
const re_password = ref('');
const onSubmit = (values) => {
console.log('submit', values);
};
// function onSubmit(values){
// console.log('submit', values);
// }
const checkRePassword = (value)=>{
console.log("检查两次密码是否一致")
if(password.value != re_password.value){
return false
}
return true
}
function checkUsername(){
console.log("检查用户是否重名")
return '${username.value}已经被注册'
}
</script>
<style>
</style>
验证用户名是都被占用
密码两次验证
api管理
serviceAxios.ts
import axios from "axios";
import serverConfig from "@/config";
// import qs from "qs";
// 创建 axios 请求实例
const serviceAxios = axios.create({
baseURL: serverConfig.baseURL, // 基础请求地址
timeout: 10000, // 请求超时设置
withCredentials: false, // 跨域请求是否需要携带cookie
});
// 创建请求拦截(发送请求的时候,携带上一些头信息)
serviceAxios.interceptors.request.use(
(config) => {
// 这里可以添加自己的业务逻辑,如请求时加token等 Authorization
console.log("请求配置", config);
return config;
},
(error) => {
Promise.reject(error);
}
);
// 创建响应拦截
serviceAxios.interceptors.response.use(
(res) => {
let data = res.data;
// 处理自己的业务逻辑,比如判断 token 是否过期等等
// 代码块
return data;
},
(error) => {
let message = "请求出错了!!状态码:"+error.response.status;
return Promise.reject(message);
}
);
export default serviceAxios;
.env.develipment
VITE_API_TARGET_URL=https://mock.presstime.cn/mock/635364243ea0490082820ad1/example/
vite.config.ts
import { defineConfig,loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue';
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
import { createStyleImportPlugin } from 'vite-plugin-style-import'
import { resolve } from 'path'
export default({command, mode}) => defineConfig({
plugins: [
vue(),
Components({
resolvers: [VantResolver()],
}),
createStyleImportPlugin({
resolves: [{
libraryName: '@nutui/nutui',
libraryNameChangeCase: 'pascalCase',
resolveStyle: (name) => {
return `@nutui/nutui/dist/packages/${name.toLowerCase()}/index.scss`
},
}]
}),
],
css: {
preprocessorOptions: {
scss: {
// 配置 nutui 全局 scss 变量
additionalData: `@import "@nutui/nutui/dist/styles/variables.scss";`
}
}
},
resolve: {
// 配置别名(方便)
alias: [
{ find: '@', replacement: resolve(__dirname, 'src') },
{ find: '_c', replacement: resolve(__dirname, 'src/components') },
{ find: '_v', replacement: resolve(__dirname, 'src/views') },
]
},
server: {
// host: true,
// hmr: true,
proxy: {
'/api': {
// 根据不同运行环境加载不同的配置文件
target: loadEnv(mode, process.cwd()).VITE_API_TARGET_URL,
// 根据配置文件加载
// target: serverConfig.server.dev,
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
});
user.ts
import serviceAxios from "@/utils/serviceAxios"
// 调用检查用户名是否重复接口
// /check/username?username=cali
export const checkUsername = (params) =>{
return serviceAxios({
url: '/check/username',
method: 'get',
params
})
};
export const createUser = (params) =>{
return serviceAxios({
url: '/user',
method: 'post',
params
})
};
Regist.vue
<template>
<h1>Rgeist</h1>
<van-form @submit="onSubmit">
<van-cell-group inset>
<van-field
v-model="username"
name="用户名"
label="用户名"
placeholder="用户名"
:rules="[
{ required: true, message: '请填写用户名' },
{ validator: checkUserRepete, message: '用户已经被注册'}
]"
/>
<van-field
v-model="password"
type="password"
name="密码"
label="密码"
placeholder="密码"
:rules="[{ required: true, message: '请填写密码' }]"
/>
<van-field
v-model="re_password"
type="password"
name="密码"
label="密码"
placeholder="密码"
:rules="[
{ required: true, message: '请确认密码' },
{ validator: checkRePassword, message: '两次密码不一致'}
]"
/>
</van-cell-group>
<div style="margin: 16px;">
<van-button round block type="primary" native-type="submit">
提交
</van-button>
</div>
</van-form>
</template>
<script setup lang="ts">
import {ref} from 'vue'
import {checkUsername} from '@/api/user'
const username = ref("")
const password = ref("")
const re_password = ref("")
function onSubmit(){
console.log("Onsubmit...")
// 调用注册接口
// 1. api/user.ts => 定义请求api函数
// 2. 在onSubmit调用请求api函数 Toast提示,成功、失败
}
function checkUserRepete(name){
console.log("检查用户名是否重名")
// return false
// return `${username.value}已经被注册`
// return `${name}已经被注册`
var parmas = {"username":name}
checkUsername(parmas)
// 上面的内容执行成功
.then(res => {
console.log("api result", res)
if(res.code != 0){
return false
}
return true
})
// 上面checkUsername+then执行出错
.catch(err => {
console.log("error")
return `出错了:${err}`
})
}
function checkRePassword(){
if(password.value != re_password.value){
return false
}
return true
}
// 请求api -> axios -> 请求 url => /check/username
// 将基础url放到配置文件中 => https://mock.presstime.cn/mock/635364243ea0490082820ad1/example/
// /api/check/username => https://xxxxxxxxx/example/check/username
// yarn dev => 开发环境development => 加载.env.development
//
</script>
<style>
</style>
index.ts
const serverConfig = {
baseURL: “/api”, // 请求基础地址,可根据环境自定义
useTokenAuthorization: true, // 是否开启 token 认证
};
export default serverConfig;
注册
登录接口
login
<template>
<!-- @submit => 绑定提交事件 => 定义onSubmit函数 -->
<van-form @submit="onSubmit">
<van-cell-group inset>
<!-- v-model=>定义username/password -->
<van-field
v-model="username"
name="username"
label="用户名"
placeholder="用户名"
:rules="[{ required: true, message: '请填写用户名' }]"
/>
<van-field
v-model="password"
type="password"
name="password"
label="密码"
placeholder="密码"
:rules="[{ required: true, message: '请填写密码' }]"
/>
</van-cell-group>
<div style="margin: 16px;">
<van-button round block type="primary" native-type="submit">
提交
</van-button>
</div>
</van-form>
</template>
<script setup lang="ts">
import {ref} from 'vue'
// import {Toast} from 'vant'
import { showSuccessToast, showFailToast } from 'vant';
import 'vant/es/toast/style';
import {login} from '@/api/user'
import router from '@/router'
var username = ref("")
var password = ref("")
function onSubmit(data){
console.log("on Submit")
// 定义接口函数
// 调用接口函数
login(data)
.then(res=>{
if(res.code != 0){
showFailToast('失败文案');
}else{
showSuccessToast('成功文案');
localStorage.setItem("username1",res.data.username)
router.push({
name:"home",
query: {date:new Date().getTime()}
})
}
})
.catch(err=>{
console.log("出错了~",err)
})
// if(username.value=="admin" && password.value=="123456"){
// console.log("成功")
// showSuccessToast('成功文案');
// // Toast.success('成功文案');
// }else{
// console.log("失败")
// showFailToast('失败文案');
// // Toast.fail('失败文案');
// }
}
</script>
<style>
</style>
Regist:
<template>
<h1>Rgeist</h1>
<van-form @submit="onSubmit">
<van-cell-group inset>
<van-field
v-model="username"
name="username"
label="用户名"
placeholder="用户名"
:rules="[
{ required: true, message: '请填写用户名' },
{ validator: checkUserRepete, message: '用户已经被注册'}
]"
/>
<van-field
v-model="password"
type="password"
name="password"
label="密码"
placeholder="密码"
:rules="[{ required: true, message: '请填写密码' }]"
/>
<van-field
v-model="re_password"
type="password"
name="re_password"
label="密码"
placeholder="密码"
:rules="[
{ required: true, message: '请确认密码' },
{ validator: checkRePassword, message: '两次密码不一致'}
]"
/>
</van-cell-group>
<div style="margin: 16px;">
<van-button round block type="primary" native-type="submit">
提交
</van-button>
</div>
</van-form>
</template>
<script setup lang="ts">
import {ref} from 'vue'
import {checkUsername, createUser} from '@/api/user'
import { showSuccessToast, showFailToast } from 'vant';
import router from '@/router'
import 'vant/es/toast/style';
const username = ref("")
const password = ref("")
const re_password = ref("")
function onSubmit(data){
console.log("Onsubmit...")
// 调用注册接口
// 1. api/user.ts => 定义请求api函数
// 2. 在onSubmit调用请求api函数 Toast提示,成功、失败
// var data = {
// "username":username.value,
// "password":password.value,
// "re_password":re_password.value
// }
createUser(data)
.then(res=>{
console.log(res)
if(res.code != 0){
showFailToast('失败文案');
}else{
showSuccessToast('成功文案');
router.push({
name:"login",
query: {date:new Date().getTime()}
})
}
})
.catch(err=>{
})
}
function checkUserRepete(name){
console.log("检查用户名是否重名")
// return false
// return `${username.value}已经被注册`
// return `${name}已经被注册`
var parmas = {"username":name}
var result = checkUsername(parmas)
// 上面的内容执行成功
.then(res => {
console.log("api result", res)
if(res.code != 0){
return false
}
return true
})
// 上面checkUsername+then执行出错
.catch(err => {
console.log("error")
return `出错了:${err}`
})
return result
}
function checkRePassword(){
if(password.value != re_password.value){
return false
}
return true
}
// 请求api -> axios -> 请求 url => /check/username
// 将基础url放到配置文件中 => https://mock.presstime.cn/mock/635364243ea0490082820ad1/example/
// /api/check/username => https://xxxxxxxxx/example/check/username
// yarn dev => 开发环境development => 加载.env.development
//
</script>
<style>
</style>