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

vue3+elementPlus之后台管理系统(从0到1)(day2)

登录页面

静态页面搭建

<template>
  <div class="login-container">
    <div class="form-wrap">
      <h2 class="header">后台管理系统</h2>
      <el-input v-model="adminName" placeholder="请输入管理员账号" />
      <el-input class="psw" v-model="password" placeholder="请输入密码" />
      <el-button type="success">登录</el-button>
    </div>
    
  </div>
</template>

<script>
export default{
  name:'LoginView',
  //data是函数,每个组件有自身独立的数据
  data(){
    return{
      adminName:'',
      password:''
    }
  }
}
</script>
<style lang="scss" scoped>
.login-container{
  height: 100%;
  background-color: rgb(249, 217, 202);
}

.form-wrap{
  position: absolute;
  width: 360px;
  left:50%;
  top:50%;
  transform: translate(-50%,-50%);
  background-color: beige;
  border-radius: 15px;
  padding: 32px 32px 20px;

  .header{
    text-align: center;
    margin-bottom: 32px;
  }

  .psw{
    margin-top: 10px;
  }

  .el-button{
    width: 100%;
    margin-top: 20px;
  }
}
</style>

表单验证

安装插件 铁皮饭盒 any-role 正则表达式,在搜索框直接输入>+验证名,如>密码

if(this.adminName.length<5){
        ElMessage.error("账号长度要大于5")
        //让代码不再执行
        return
      }
      if(/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]/.test(this.password)){
        ElMessage.error("密码需要包含大写、小写字母和数字")
      }

md5加密

md5 - npm

安装md5

npm install md5

导入包使用

import md5 from 'md5';
md5(this.password)

发送网络请求

起步 | Axios中文文档 | Axios中文网

安装axios

npm install axios

导入axios使用

import axios from 'axios';
axios.get('http://121.89.205.189:3000/api/pro/list')
      .then(res=>{
        console.log(res)
      }).catch(err=>
        console.log(err)
      )

封装axios

1、配置baseURL

2、请求拦截器,就是请求之前还需要做什么配置

3、响应拦截器,就是服务器给出响应后,返回到前端前需要做什么操作,reponse.data

4、封装各种请求方法,如get,post,put等

import axios from "axios";

//封装baseURL

//开发环境   生产环境   测试环境
//获取当前环境是否为开发环境,
const isDev = process.env.NODE_ENV=='development'

const request = axios.create({
    //baseURL:isDev?开发环境:生产环境
    baseURL:isDev?'http://121.89.205.189:3000/admin':'http://121.89.205.189:3000/admin',
    timeout:60000    //1分钟

})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么,比如可以在这里配置对应的token
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

  // 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    
    //判断用户的登录状态
    //因为服务器响应的时候有两个data,所以返回reponse.data
    return response.data;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });


  //自定义各种数据请求的axios
  export default function ajax(config){
    //数据请求的时候需要什么参数

    //1、获取请求的一些必要参数
    const {url='',method='',data={},headers={}} = config;

    //2、判断请求的类型
    switch(method.toUpperCase()){
        case 'GET':
            return request.get(url,{params:data})
        case 'POST':
            //表单数据提交
            if(headers['content-type']=='application/x-www-form-url-encoded'){
                //转换参数类型,格式化数据
                const obj = new URLSearchParams();
                for(const key in data){
                    if(Object.hasOwnProperty.call(Object,key)){
                        obj.append(key,Object[key])
                    }
                }
                return request.post(url,obj,{headers});
            }
            //文件数据提交
            if(headers['content-type']=='multipart/form-data'){
                //处理文件的对象
                const obj = new FormData;
                for(const key in data){
                    obj.append(key,Object[key])
                }
                return request.post(url,obj,{headers});
            }
            //json数据提交
            return request.post(url,data);
        case 'PUT':
            //修改或更新数据
            return request.put(url,data);
        case 'DELETE':
            return request.put(url,{data});
        case 'PATCH':
            //更新局部资源
            return request.patch(url,data);
        default:
            return request.request(config);
    }
  }

登录功能的实现

创建一个api/user.js

封装请求接口loginFn

//导入封装的axios
import ajax from "@/utils/axios";

//管理系统登录接口的封装
export function loginFn(params){
    return ajax({
        method:'POST',
        url:'/admin/login',
        data:params
    })
}

在login页面中导入api/user.js,然后发送数据

loginFn({
        adminname:this.adminname,
        password:this.password
      }).then(res=>{
        if(res.code==='10005'){
          //未注册
          ElMessage.error(res.message)
          return
        }else if(res.code==='10003'){
          //密码错误
          ElMessage.error(res.message)
          return
        }else{
          //this.$router路由对象,.push() 需要进入的路由
          this.$router.push("/")
        }
      })

vuex 状态管理模式

Vuex 是什么? | Vuex

  • 状态,驱动应用的数据源;

  • 视图,以声明方式将状态映射到视图;

  • 操作,响应在视图上的用户输入导致的状态变化。

安装vuex

npm install vuex@next --save

在src中创建store/index.js

import { createStore } from 'vuex'

// 创建全局状态 store 实例
const store = createStore({
  //全局状态
    state () {
    return {
      //存放用户信息的对象
      userInfo:{
      }
    }
  },
  //唯一修改数据的方法
  mutations: {
    //保存用户登录数据
    updateUserInfo(state, value){
      state.userInfo=value
    }
  },
  //异步修改数据的方法
  actions:{

  },
  //vuex中的计算属性
  getters:{

  },
  //状态模块
  modules:{
    
  }
})

//导出实例
export default store

在main.js中挂载store实例

import store from '@/store';
//将全局状态store挂载到实例中
app.use(store)

在组件中使用

1、在模板中直接$store.state.属性即可

{{ $store.state.userInfo.adminname }}

2、通过映射 mapState

import { mapState, mapMutations } from 'vuex';

computed:{
    ...mapState(['userInfo'])
  },
  
 //组件中使用
 {{userInfo}}

组件中修改全局状态

1、在全局状态中定义方法

mutations:vuex中唯一修改状态的地方

actions:异步操作的地方

1、通过this.$store.commit('') 触发mutations;  通过this.$store.dispatch('') 触发actions
2、通过mapMutations映射

import { mapState, mapMutations } from 'vuex';
methods:{
    ...mapMutations(['updateUserInfo'])
    }
    
//第一种修改数据的方法
this.$store.commit('updateUserInfo',res.data)
//第二种修改数据的方法
this.updateUserInfo(res.data)

登录成功后

1、在全局状态定义一个用户信息和修改用户信息的方法

2、在登录成功后将数据更新到全局状态即可

vuex中的数据持久化

解决vuex中状态刷新页面后会恢复初始值

1、通过自己手动存储需要持久化的数据

//将token存储到本地
localStorage.setItem('token',res.data.token)

2、通过插件来进行自动持久化

安装插件

npm install --save vuex-plugin-persistedstate

在store/index.js中使用

import createPersistedState from "vuex-plugin-persistedstate";

// 创建全局状态 store 实例
const store = createStore({
  ...
  //vuex的配置插件
  plugins:[
    //创建持久化对象
    createPersistedState({
      //配置需要持久化的数据
      reducer: state=>{
        return {
          userInfo: state.userInfo
        }
      }
    })
  ]
})

在首页验证用户是否登录

由于添加了持久化插件,刷新页面后数据依然存在

mounted(){
    if(!this.$store.state.userInfo.adminname){
      //用户没有登录
      this.$router.push('/login')
    }
  },

退出登录

添加退出登录按钮

<button @click="logout">退出</button>

 退出登录方法

methods:{
    logout(){
      localStorage.clear();
      this.$store.commit('updateUserInfo',{})
      this.$router.push('/login')
    }
  }


http://www.kler.cn/a/510579.html

相关文章:

  • 技术洞察:C++在后端开发中的前沿趋势与社会影响
  • C++ 强化记忆
  • Linux操作命令之云计算基础命令
  • 合格的前端,使用xlsx
  • 云手机技术怎么实现的?
  • React封装倒计时按钮
  • 常用的UI自动化测试框架是哪些?有什么优缺点?如何选择?
  • 20250118 PPT画的论文插图如何导出高分辨率图片:修改电脑注册表
  • LeetCode:2266. 统计打字方案数(DP Java)
  • Swift语言的物联网
  • Unity编辑器缩放设置
  • ChatGPT Prompt 编写指南
  • MYSQL主从同步----1、基于binlog 2、基于gtid
  • 在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)
  • Excel重新踩坑6:工作实战总结之根据筛选条件求平均成绩
  • Linux(基础配置)
  • 【个人学习记录】软件开发生命周期(SDLC)是什么?
  • 基于springboot的口腔管理平台
  • 鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象
  • Oracle事务(7)
  • protobuf: 网络版通讯录
  • Ubuntu 24.04 LTS 服务器折腾集
  • Qt常用控件之输入类控件
  • 论文阅读 AutoDev: Automated AI-Driven Development
  • AT8870单通道直流电机驱动芯片
  • 算法竞赛里面的STL——堆和priority_queue