IHM后台管理系统课程笔记.md

IHM后台管理系统课程笔记.md

入门简介

  • Vue是什么?

vue是一个框架,是由别人开源的第三方组件,能够快速的开发前端页面,一套用于构建用户界面的渐进式javascript框架。何为渐进式?就是vue有完整的生态环境,功能逐渐完善的,只需引用vue的核心文件和一些库就可以进行系统开发。vue可以自底向上逐层开发。可以开发简单应用:只需要一个轻量小巧的核心库。复杂应用:可以引入各式各样的Vue插件。

  • Vue特点?

组件化开发:一个模块就是一个组件文件,方便修改和维护,提高了复用的效率。

声明式编码:命令式编码,可以这么理解,假如你口渴了,想要喝水,你需要先站起来,然后走到喝水的地方,拿起杯子,倒入水,然后倒入嘴中。而声明式编码,只需要说明你口渴了,就有人把水拿过来给你喝。

不直接操作dom:先把数据存到虚拟dom中,然后再转到真实dom。

特殊配置

eslink的快速规范

目的:当保存代码的时候,自动按规范保存

image-20240729083352880 image-20240729083440395
{
    "workbench.colorTheme": "Default High Contrast",
    "window.commandCenter": false,
    "liveServer.settings.donotShowInfoMsg": true,
    "[vue]": {
        "editor.defaultFormatter": "Vue.volar"
    },
    "emmet.triggerExpansionOnTab": true,
    "explorer.confirmDelete": false,
    "workbench.iconTheme": "material-icon-theme",
    "eslint.codeActionsOnSave.rules": null,
    
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": "explicit"
    }
}
  • 判断对象是否是某一类型

response.data instanceof Blob

  • exsel表导出 使用到的工具包为 file-saver 安装方式npm i file- saver

  • v-model的底层原理

v-model是vue中的双向数据绑定,它包含两部分,一个是传值value,一个是监听事件input。在我们组件通信时按照,value,和input去定义。在父组件就可以使用v-model来接受,实现组件之间的双向数据绑定。

路由传参

1.在路由组件的地址里写上要传参的路径,在以后跳转的时候,地址里携带参数。在参数后面加?代表参数可有可以

登录功能实现

  • 表单校验
 <el-form ref="form" :rules="loginRules" :model="loginForm">
          <el-form-item prop="mobile">
            <el-input v-model="loginForm.mobile" placeholder="请输入手机号" />
          </el-form-item>
          <el-form-item prop="password">
            <el-input v-model="loginForm.password" show-password placeholder="请输入密码" />
          </el-form-item>
          <el-form-item prop="isAgree">
            <el-checkbox v-model="loginForm.isAgree">
              用户使用协议
            </el-checkbox>
          </el-form-item>
          <el-form-item>
            <el-button style="width: 350px" type="primary" @click="login">登录</el-button>
          </el-form-item>
  </el-form>
<script>
export default {
  name: 'Login',
  data() {
    return {
      loginForm: {
        mobile: process.env.NODE_ENV === 'development' ? '13800000002' : '',
        password: process.env.NODE_ENV === 'development' ? 'hm#qd@23!' : '',
        isAgree: process.env.NODE_ENV === 'development'
      },
      loginRules: {
        mobile: [{
          required: true,
          message: '请输入手机号',
          trigger: 'blur'
        }, {
          pattern: /^1[3-9]\d{9}$/,
          message: '手机号格式不正确',
          trigger: 'blur'
        }],
        password: [{
          required: true,
          message: '请输入密码',
          trigger: 'blur'
        }, {
          min: 6,
          max: 16,
          message: '请输入6-16位的密码',
          trigger: 'blur'
        }],
        // required只能检查 null "" undefined ,isAgree 返回的是true和false类型
        isAgree: [{
          validator: (rule, value, callback) => {
            // rule 代表校验规则
            // value代表校验的值
            // callback 回调函数
            value ? callback() : callback(new Error('请勾选用户协议'))
          }
        }
        ]
      }
    }
</script>
  • 关于跨域问题

前端向后端发送请求是需要解决跨域问题的,首先跨域问题是存在于浏览器之间的。如果前端使用node代理去向后端发请求,就相当于两个服务器之间的通信,不存在跨域问题。

在vue-cli脚手架中,需要在vue.config文件中配置代理信息,在文件中有一个devServer属性,需要在里面再添加一个proxy属性

 proxy: {
    // path: 目标服务器
      '/api': {
        target: 'https://heimahr.itheima.net'
      }
    }
  • axios封装的需求
image-20240719111539766

image-20240719153905420

import axios from 'axios' // 引入axios
import store from '@/store/index'
import { Message } from 'element-ui'
const service = axios.create({
  baseURL: '/api',
  timeout: '10000'
}) // 创建axios实例变量service,然后配置一些基础参数
// interceptors 拦截器 1成功,2 失败
// 请求拦截器
service.interceptors.request.use((config) => {
// 给请求添加token
// 1. 引入store,拿到token
// store.getters.token, token存在请求头里面
  if (store.getters.token) {
  // token存在,已经登录过,将token值添加到请求头里面
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config
}, (error) => {
  return Promise.reject(error)
})
// 响应拦截器
service.interceptors.response.use((response) => {
  // 成功执行,解构数据
  const { data, message, success } = response.data
  if (success) {
    return data
  } else {
    Message({ type: 'error', message: message })
    return Promise.reject(new Error(message))
  }
}, (error) => {
  // 提示失败消息
  Message({ type: 'error', message: error.message })
  return Promise.reject(error)
})
export default service // 将配置好的axios导出

  • axios区分环境
image-20240719154658058
baseURL: process.env.VUE_APP_BASE_API, // 基地址,区分开发和测试环境,不同的环境下 VUE_APP_BASE_API值不同
  • 路由主页权限验证
image-20240719172723963
import router from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import store from './store'
/**
 * 开启前置守卫
 **/
const WhitList = ['/login', '/404'] // 3.无token 不需要token就可以访问的路由地址
router.beforeEach((to, from, next) => {
  // 1. 开启进度条
  nprogress.start()
  // 2. 判断请求头中是否有token
  if (store.getters.token) {
    // token存在,判断去的路径是否是登录页
    if (to.path === '/login') {
      // 当next(地址) 不执行后置守卫
      next('/')
      nprogress.done()
    } else {
      next()
    }
  } else {
    // token 不存在, 判断是否在白名单里面
    if (WhitList.includes(to.path)) {
      next()
    } else {
      next('/login')
      nprogress.done()
    }
  }
})

/**
 * 开启后置守卫
 * **/
router.afterEach((to, from, next) => {
  // 1. 关闭进度条
  nprogress.done()
})

首页相关

  • 获取用户信息存储到vuex中

调用位置满足条件:1.有token,2.没有获取过用户信息;

调用位置:在路由的前置守卫中,调用vueAction,调用接口保存数据到vuex中

API 
export function getUserInfo() {
  return request({
    url: '/sys/profile',
    method: 'get'
  })
}

Vuex调用api
  mutation
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo  // 保存数据到state中
  }
  action
  async getUserInfo(context) {
    // todo调用接口,存储数据
    const data = await getUserInfo()
    context.commit('setUserInfo', data)
  }

前置守卫中调用vuexAction
 if (to.path === '/login') {
      // 当next(地址) 不执行后置守卫
      next('/')
      nprogress.done()
    } else {
      // 3. 获取用户信息,- 判断是否获取过
      if (store.getters.userId) {
        next()
      } else {
        await store.dispatch('user/getUserInfo')
        next()
      }
    }

store-getter中提供user-state中变量的快速访问
 userId: state => state.user.userInfo.userId
  • 显示头像和用户名
image-20240719211809597
  • token超时处理

image-20240719220658370

  • 实现退出功能
image-20240719221640028
  • 修改密码功能

image-20240720090949014

  • 修改密码表单校验

image-20240720100948124

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 左侧菜单渲染过程

image-20240721104522843

image-20240721104634147

  • 递归解决树形结构

image-20240723085748564

image-20240723085827295

角色管理

  • 行内编辑功能实现
  1. 定义一个标记,根据标记判断是否是编辑
  2. 给某一对象定义一个属性,通过this.$set(element, ‘isEdit’, false),对象,属性,值 这样设置的属性具有响应式
  3. 给编辑按钮设置点击事件,控制标记的值
  4. 通过插槽语法,给模板加上v-if 和v-else 判断。根据标记的值显示不同内容

员工管理

  • 获取首个节点

image-20240728205606599

  • 导出excel表

image-20240729095714891

权限应用

学习总结

1. 组件通信

  • 父组件---->子组件

子组件通过props接受,父组件通过:绑定要传递的属性名。实现单向传递

  • 子组件---->父组件

在js中this.$emit(‘事件名’,事件值)。在template中 省略this。

特殊用法,父组件使用.sync修饰符可以监听子组件传递的this.$emit(‘update:props中的属性名’,属性值)

  • 子组件<—>父组件

父组件绑定v-model,子组件通过value接受父组件的值,通过this.$emit(‘input’,value)值触发事件传递给父组件。

  • 父组件调用子组件的方法
  1. 先给子组件加ref属性,父组件通过this.$refs拿到子组件的实例,然后就可以调用其方法
父组件:
 <!-- 分配权限组件 --> v-model  ===>传递value,监听input
    <roles-permission v-model="roleId" :permission-dialog.sync="permissionDialog" />
子组件:
<script>
     props: {
    permissionDialog: {
      type: Boolean,
      default: false
    },
    // value代表角色的id  
    value: {
      type: Number,
      default: undefined
    }
</script>

2.vuex相关

一个是提交mutations中的方法是 this.$store.commit(‘方法名称’,方法值),

调用vuex 中的actions使用的是this.$store.dispush(‘方法名’,方法值)

  • Mutations 用于同步修改 Vuex 的状态,通过 commit 方法提交。
  • Actions 用于处理异步操作,可以包含任意异步逻辑,通过 dispatch 方法分发,最终通过 commit 方法提交 mutations 更新状态。

通过这种方式,Vue 组件可以很方便地与 Vuex 中的状态管理进行交互,实现组件和全局状态的有效集成和管理。

vuex有几种状态:1.state,getter,model,mutition,action…

  1. 如何修改state里面的数据,通过commit,提交mutition,里面的方法进行修改
  2. 如何调头action,this.$store.dispush 派遣,调用action里面的方法处理异步。

token持久化存储

localStorage、sessionStorage、cookie
image-20240807100018936

3.router相关

根据不同权限加载不同路由信息,实现权限控制。

思路: 1. 先拆分哪些是需要权限访问的动态路由,2,在路由的前置守卫中,获取用户信息中包含用户所拥有的权限。3.将动态路由中的信息按照用户所拥有的权限进行过滤。3。将/404页面放到最后,可以使用…拆分组合。4.在路由前置守卫中,最后需要再转发一下路由,否则,刷新前端页面一样报404错误。4.因为动态加载的路由不具备响应式,所有在加载完成后,不会显示左侧菜单,这就需要我们将路由信息手动的加载到vuex中,实现动态管理!5,退出登录情况路由信息

要想去到某一页面,this.$router.push(‘/’)

  1. 路由导航: Vue Router提供了多种方式进行路由导航,包括声明式导航(<router-link>组件)、编程式导航(router.pushrouter.replacerouter.go等方法)以及导航守卫(beforeEachbeforeResolveafterEach等)来控制路由的跳转和加载。

  2. 路由传参: 可以通过路由的params或query传递参数给目标组件。params是路由路径中的动态片段,而query则是在URL中的查询参数。例如:

    javascriptCopy Code{ path: '/user/:id', component: User },
    // 在组件中获取params参数
    this.$route.params.id
    // 使用query参数
    { path: '/user', component: User },
    ``
    

4.echarts图表应用

  • 安装echarts包
$ npm i echarts 
$ yarn add echarts
  • 放置两个图表的div,并给定高宽,代码位置(src/views/dashboard/index.vue)
 <div class="chart">
    <!-- 图表 -->
    <div ref="social" style=" width: 100%; height:100% " />
</div>
  <div class="chart">
              <!-- 图表 -->
    <div ref="provident" style=" width: 100%; height:100% " />
  </div>
  • 在mounted中初始化图表-代码位置(src/views/dashboard/index.vue)
  1. 如何在项目中使用element-ui

步骤1.安装element-ui 组件 npm install element-ui -S

步骤2.在入口main.js中引入注册

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

数组

js列举和数组操作相关的方法(常用)
在JavaScript中,数组操作是编程的常见任务之一。JavaScript提供了一系列与数组操作相关的方法,这些方法可以用来操纵数组,如添加、删除、查找、排序和遍历元素等。以下是一些常用的数组方法:

image-20240807101909763

image-20240807101938453

image-20240807102008577

Vue的生命周期

创建,挂载,渲染,销毁

css篇

文档布局类型,标准流,浮动float,定位potiation flex

w3c和http规范

当谈到W3C(World Wide Web Consortium)和HTTP(Hypertext Transfer Protocol)规范时,它们分别代表了Web技术的标准化和Web通信协议的规范化。

W3C(World Wide Web Consortium)

W3C是一个国际化的标准组织,致力于开发和推广Web标准。它由互联网的发明者、伯纳斯-李(Tim Berners-Lee)于1994年创立。W3C的主要任务包括:

  1. 制定Web技术标准:W3C负责开发和维护许多Web技术的标准,如HTML、CSS、SVG等,确保这些技术能够在不同的浏览器和设备上实现一致的行为。
  2. 推广Web互操作性:通过制定统一的标准,W3C致力于确保各种技术在不同的平台和设备上能够互操作,从而促进Web的发展和创新。
  3. 开发新技术:除了维护现有标准,W3C还致力于开发新的Web技术和规范,以应对Web应用程序日益复杂的需求。

W3C的标准通过开放的、合作的过程制定,其成员包括来自各个行业的技术专家和组织。

HTTP(Hypertext Transfer Protocol)

HTTP是一个用于传输超文本(如HTML)数据的应用层协议,它是Web的核心协议之一。HTTP的主要功能包括:

  1. 传输数据:HTTP允许客户端(例如Web浏览器)向服务器请求数据,并且从服务器接收响应数据,这些数据可以是文本、图像、视频等。
  2. 状态管理:HTTP使用状态码来表示请求的结果,例如200表示成功,404表示未找到,等等。它还支持会话管理,通过Cookie和Session来维护用户和服务器之间的状态。
  3. 无状态性:HTTP协议本身是无状态的,即每个请求都是独立的,服务器不会保存任何关于客户端请求的信息。这导致了HTTP本身在处理某些场景(如保持会话状态)时需要额外的机制(如Cookie)。

HTTP的当前版本是HTTP/2和HTTP/3,它们分别在传输效率和性能上有所改进,尤其是在处理并行请求和减少延迟方面。

总之,W3C制定了Web的各种技术标准,而HTTP是一种基本的协议,使Web上的信息交换成为可能。这两者共同推动了Web技术的发展和普及。

HTTP(Hypertext Transfer Protocol)

HTTP是一个用于传输超文本(如HTML)数据的应用层协议,它是Web的核心协议之一。HTTP的主要功能包括:

  1. 传输数据:HTTP允许客户端(例如Web浏览器)向服务器请求数据,并且从服务器接收响应数据,这些数据可以是文本、图像、视频等。
  2. 状态管理:HTTP使用状态码来表示请求的结果,例如200表示成功,404表示未找到,等等。它还支持会话管理,通过Cookie和Session来维护用户和服务器之间的状态。
  3. 无状态性:HTTP协议本身是无状态的,即每个请求都是独立的,服务器不会保存任何关于客户端请求的信息。这导致了HTTP本身在处理某些场景(如保持会话状态)时需要额外的机制(如Cookie)。

HTTP的当前版本是HTTP/2和HTTP/3,它们分别在传输效率和性能上有所改进,尤其是在处理并行请求和减少延迟方面。

总之,W3C制定了Web的各种技术标准,而HTTP是一种基本的协议,使Web上的信息交换成为可能。这两者共同推动了Web技术的发展和普及。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶落q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值