一个好的前端开发项目,都是一个团队负责一个部分进行通力合作的。简单的一个系统网站一般包含登录、主体、各个模块功能这三个大部分,现在我们写的登录界面,我们一般编写这样的登录界面可以说有一定的固定套路。
目录
1、我们一Windows 10为例子,安装Vue 3脚手架前,我们先要配置node js环境;
2、接下来,安装Vue,安装的过程不多说,大家可以到官网去自行下载就可以了,链接Vue.js;Vue.js - The Progressive JavaScript Framework
https://cn.vuejs.org/
或者,可以选择另一种安装方式:
打开控制台,输入一下命令行
npm install vue -g
3、等待安装Vue,还需安装Vue-cli (脚手架),输入如下命令进行安装
npm install -g vue-cli
4、对项目文件进行初始化 还可以使用webpack作为脚手架,命令如下:
vue init webpack qiubite-project
安装完毕后,这里本人使用的是vscode软件,创建一个登录模块的目录页,

接下来,我们要把vue的router路由配置给配置好,如下:
- import Vue from 'vue'
- import VueRouter from 'vue-router'
- import Login from '../components/Login.vue'
- import Home from '../components/Home.vue'
-
-
- Vue.use(VueRouter)
-
- const router = new VueRouter({
- routes: [
- { path: '/', redirect: '/login' },
- { path: '/login', component: Login },
- {
- path: '/home',
- component: Home,
- redirect: '/equipment', // 重定向功能,只要访问home地址,就会重定向到wequipment地址
- children: [
- { path: '/equipment', component: Equip },
- { path: '/deploy', component: Deploy },
- { path: '/history', component: History },
- { path: '/analysis', component: Analysis },
- { path: '/power', component: Power },
- { path: '/remote', component: Remote }]// welcome为home的子属性
- }
- ],
- mode: 'history'
- })
-
- router.beforeEach((to, from, next) => {
- if (to.path === '/login') return next()
- const tokenStr = window.sessionStorage.getItem('token')
- if (!tokenStr) return next('/login')
- next()
- })
- export default router
这里我们挂载一个路由守卫,router.beforeEach,这里面to将要访问的路径,from 代表从哪一个路径跳到哪一个去beforeEach,next 是一个函数,表示放行,next()放行 next('/login)强制跳转。用户如果访问login,可以直接跳转,获取token。
- import Vue from 'vue'
- import App from './App.vue'
- import router from './router'
- import store from './store'
- import ElementUI from 'element-ui'
- import 'element-ui/lib/theme-chalk/index.css'
- // 导入全局样式表
- import './assets/css/global.css'
-
- import axios from 'axios'
- axios.defaults.baseURL = 'http://39.101.161.112:9000'
- axios.interceptors.request.use(config => {
- console.log(config)
- config.headers.Authorization = window.sessionStorage.getItem('token')
- // 通过axios拦截器添加token验证
- return config
- // 最后必须要return出去
- })
- Vue.prototype.$http = axios
-
- Vue.config.productionTip = false
- Vue.use(ElementUI)
- Vue.use(AMap)
- Vue.use(VideoPlayer)
-
- new Vue({
- router,
- store,
- render: h => h(App)
- }).$mount('#app')
-
- <div class="login_container">
-
- <div class="login-box">
- <div class="avatar_box">
- <img src="../assets/wo.jpg" alt="">
- <h3 class="text">丘 比 特h3>
- div>
- <el-form label-width="0px" class="login_form" :model="loginForm" :rules="loginFormRules" ref="loginFormRef">
-
-
- <el-form-item prop="username">
- <el-input prefix-icon="el-icon-user-solid" v-model="loginForm.username" size="mini" >el-input>
-
- el-form-item>
-
- <el-form-item prop="password">
- <el-input prefix-icon="el-icon-lock" v-model="loginForm.password" type="password" size="mini" >el-input>
-
- el-form-item>
-
- <el-form-item class="btns">
- <el-button type="primary" @click="login" size="mini" >登录el-button>
-
- <el-button type="info" @click="resetLoginForm" size="mini">取消el-button>
-
- el-form-item>
- el-form>
- div>
- div>
- template>
-
- <script>
- import {Login} from '../network/login'
- export default {
- data () {
- return {
- loginForm: {
- username: '',
- password: ''
- },
- loginFormRules: {
- username: [
- { required: true, message: '请输入登录名称', trigger: 'blur' },
- { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
- ],
- password: [
- { required: true, message: '请输入登录密码', trigger: 'blur' },
- { min: 3, max: 15, message: '长度在 3 到 15 个字符', trigger: 'blur' }
- ]
- }
- }
- },
- methods: {
- resetLoginForm () {
- this.$refs.loginFormRef.resetFields()
- },
- login () {
- this.$refs.loginFormRef.validate( valid => {
- if (!valid) {return this.$message.error('用户名密码不正确')}
- Login(this.loginForm).then( res => {
- console.log(res);
- if (res.code !== 0)
- {return this.$message.error('登录失败')}
- this.$message.success('登陆成功')
- window.sessionStorage.setItem('token', res.token)
- this.$router.push('/home')
- }).catch( error => {
- console.log(error);
- })
- })
- }
- }
- }
- script>
-
- <style lang="less" scoped>
- .login_container {
- background-color: #0e1729;
- background-image: url(../assets/pic2.png);
- height: 100%;
- }
- .login-box {
- width: 360px;
- height: 240px;
- background-color: #fff;
- border-radius: 3px;
- position: absolute;
- left: 50%; //距离左侧50%
- top: 50%; // 距离顶部505
- transform: translate(-50%, -50%); //横轴上移动50%,纵移动50%
- }
- .avatar_box {
- height: 100px;
- width: 100px;
- border: 1px solid #eee;
- border-radius: 50%;
- padding: 10px;
- box-shadow: 0 0 10px #eee;
- position: absolute;
- left: 50%;
- top:-40%;
- transform: translate(-50%);
- background-color: rgb(32, 181, 201);
- img {
- width: 100%;
- height: 100%;
- border-radius: 50%;
- background-color: #eee;
- }
- }
-
- .login_form {
- position: absolute;
- bottom: 0;
- width: 100%;
- padding: 0 20px;
- box-sizing: border-box;
- }
- .btns {
- display: flex;
- justify-content: flex-end;
- }
- .text {
- text-align: center;
- margin-top: 10px;
- font-size: 20px;
- font-family: 宋体;
- }
- style>
1、 validate回调函数,完成登录表单前的预校验;
2、将登陆成功以后的token,保存到客户端的sessionstorage中;
3、项目中除了登陆之外的其他api接口,必须将token保存到客户端;
4、 this.$router.push('/home)是通过编程式导航跳转到后台,路由地址为/home。

用户登录首先完成账号密码输入,当用户进行账户密码登录操作,系统将验对账户密码进行查询、登录表单数据绑定验证。当用户登录成功时,用户信息将会被记录到session中,用户信息将会被记录到系统日志中,再通过重定向即可跳转到系统首页。当用户登录失败时,系统弹出“登陆失败,请重新登录”提示信息。当用户登录账户密码不合法时,系统将弹出“登录信息不合法”提示信息,用户需进行账户密码重置重新登陆。如下是用户登录界面的时序图:

哪里写得不好大家可以指正,欢迎大家一起学习!