Vue3+Element Plus+TS开发企业管理后台(二)

使用vite初始化项目

确保你的开发环境中已经安装了Node.js,而且有npm,yarn等包管理工具,然后可以按照vite官方提供的方式初始化项目:

bash 复制代码
yarn create vite

跟随提示选择即可:

或者可以直接克隆下面的仓库
https://github.com/iicoom/vat

安装项目依赖

bash 复制代码
➜  vat yarn add vue-router element-plus echarts nprogress

新增router、layouts目录

在src目录下新增router用于配制项目路由,layouts用于存放项目的布局组建。

在layouts中新增login.vue文件用来处理登录页面的样式和登录、注册校验等逻辑。

html 复制代码
<template>
  <div class="login-container">
    <div class="login-form" v-if="mode === 'login'">
      <h1>Hello!</h1>
      <h2>欢迎来到 Vue Admin TS!</h2>
      <el-form :model="form" ref="ruleFormRef" :rules="rules">
        <el-form-item label="" prop="name">
          <el-input v-model="form.name" :prefix-icon="User" size="large" placeholder="用户名" clearable />
        </el-form-item>
        <el-form-item label="" prop="password">
          <el-input v-model="form.password" :prefix-icon="Lock" size="large" placeholder="密码" show-password clearable />
        </el-form-item>
        <el-button :loading="submitting" :loading-icon="Eleme" size="large" type="primary" style="width: 50%"
          @click="confirm(ruleFormRef)">登录</el-button>
      </el-form>
      <div>
        <el-link type="primary" @click="switchMode('register')">没有账号?去注册</el-link>
      </div>
    </div>
    <div class="login-form" v-if="mode === 'register'">
      <h1>注册账号</h1>
      <h2>速度超快,注册账号后免费试用!</h2>
      <el-form :model="registerForm" ref="registerFormRef" :rules="rules">
        <el-form-item label="" prop="name">
          <el-input v-model="registerForm.name" :prefix-icon="User" size="large" placeholder="用户名" clearable />
        </el-form-item>
        <el-form-item label="" prop="password">
          <el-input v-model="registerForm.password" :prefix-icon="Lock" size="large" placeholder="密码" show-password
            clearable />
        </el-form-item>
        <el-form-item label="" prop="confirm_password">
          <el-input v-model="registerForm.confirm_password" :prefix-icon="Lock" size="large" placeholder="确认密码"
            show-password clearable />
        </el-form-item>
        <el-button size="large" type="primary" style="width: 50%" @click="submit">提交</el-button>
      </el-form>
      <div>
        <el-link type="primary" @click="switchMode('login')">去登录</el-link>
      </div>
    </div>
    <VatFooter theme="dark" />
  </div>
</template>

<script setup lang="ts">
import { reactive, ref } from 'vue'
import VatFooter from '@/components/VatFooter.vue'
import { User, Lock, Eleme } from '@element-plus/icons-vue'
import type { FormInstance, FormRules } from 'element-plus'
import { ElNotification, ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'

const ruleFormRef = ref<FormInstance>()
const form = reactive({
  name: '',
  password: ''
})

const rules = reactive<FormRules>({
  name: [{ required: true, message: '请输入' }],
  password: [{ required: true, message: '请输入' }],
  confirm_password: [
    { required: true, message: '请输入' },
    {
      validator: (rule, value, callback) => {
        if (value !== registerForm.password) {
          callback(new Error("两次输入的密码不匹配!"))
        } else {
          callback()
        }
      }
    }
  ]
})

const router = useRouter()
const submitting = ref(false)
function confirm(formEl: FormInstance | undefined) {
  if (!formEl) return
  formEl.validate(async (valid) => {
    if (valid) {
      submitting.value = true
      try {
        submitting.value = false
        router.push({ path: '/' })
        ElNotification({
          title: '欢迎登录 VAT!',
          message: '',
          type: 'success',
          showClose: false
        })
      } catch (e) {
        submitting.value = false
      }
    }
  })
}

document.onkeydown = function (event) {
  if (event.key === 'Enter') {
    confirm(ruleFormRef.value)
  }
}

const mode = ref('login')
function switchMode(val: string) {
  mode.value = val
}

const registerForm = reactive({
  name: '',
  password: '',
  confirm_password: '',
})
const registerFormRef = ref<FormInstance>()
function submit() {
  registerFormRef.value?.validate(async (valid) => {
    if (valid) {
      ElMessage.success('注册成功!')
    }
  })
}
</script>

<style scoped lang="scss">
.login-container {
  background-image: url(@/assets/login-bg.jpg);
  background-size: cover;
  background-repeat: no-repeat;
  height: 100vh;
  width: 100%;

  .login-form {
    position: fixed;
    top: 50%;
    right: 100px;
    background-color: rgb(102, 51, 153, 0.4);
    height: 70%;
    overflow-y: scroll;
    width: 28%;
    transform: translateY(-50%);
    border-radius: 20px;
    padding: 40px;
    display: flex;
    flex-direction: column;
    gap: 20px;
    color: #fff;

    h1 {
      font-size: 50px;
    }
  }

  .login-form::-webkit-scrollbar {
    display: none;
  }
}

@media (max-width: 480px) {
  .login-form {
    width: 90% !important;
    right: 5% !important;
  }
}
</style>

在router中新增index.ts管理项目路由

bash 复制代码
import { createRouter, createWebHistory } from "vue-router";
import LoginLayout from "../layouts/login.vue";
import NProgress from "nprogress";
import "nprogress/nprogress.css";

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: "/login",
      name: "Login",
      component: LoginLayout,
    },
  ],
});

NProgress.configure({
  easing: "ease",
  speed: 500,
  trickleSpeed: 200,
  showSpinner: false,
});

export default router;

现在我们启动项目访问http://localhost:5174/login,你本地的端口可能不是5174,按你自己的实际情况访问。

这样登录注册页面就完成了,并且在移动端浏览器中访问也有不错的样式。

OK,下一篇做一下首页的页面布局。

相关推荐
达子66614 小时前
第26章_HarmonyOs开发图解之 设备管理
vue.js
自然 醒14 小时前
v-tooltip自定义指令封装
前端·javascript·vue.js
万敏17 小时前
Vue3 全栈实战第四周:watch、nextTick、性能优化与 keep-alive 实战记录
vue.js·node.js·全栈
布兰妮甜18 小时前
Vue 大型页面性能优化:四个核心策略
vue.js·性能优化·虚拟滚动·组件缓存·按需加载
di24k24k18 小时前
多个 el-form 共用同一 ref 导致表单校验部分失效
前端·javascript·vue.js·elementui
执子念的飞鱼20 小时前
Vue 3 文件预览落地:鉴权 Blob、Worker/WASM 与内网子路径部署
vue.js·webassembly
无人生还21 小时前
从 Vue3 到 React · 快速上手系列第 11 篇:状态管理
前端·vue.js·react.js
paopaokaka_luck21 小时前
基于springboot3+vue3的乡村医生诊疗管理系统(AI助手、协同过滤算法、webSocket实时聊天、Echarts图形化分析)
前端·网络·人工智能·spring boot·websocket·网络协议·echarts
其美杰布-富贵-李21 小时前
Vue 3 模块导入教程:import、export 与文件组织
前端·javascript·vue.js
布兰妮甜1 天前
Vue 路由进阶:路由守卫权限控制、动态路由、懒加载、路由缓存
vue.js·懒加载·动态路由·路由守卫权限控制·路由缓存