• 学习笔记(css穿透、vue-cookie、拦截器、vuex、导航守卫、token/Cookie、正则校验)


    目录

    一、记录

    1、CSS穿透

    2、输入框是否提示输入

    3、插槽 #slot

    4、v-deep深入改掉属性值

    二、vue-cookie

    1、官方文档

    2、使用

    三、拦截器

    1、请求拦截器

    2、响应拦截器

    四、vuex对信息存取改

    五、路由导航守卫

    1、登录思路

    2、设置白名单

    六、Token与Cookie

    1、Token

    2、Cookie

    七、正则校验

    八、跨域

    1、环境

    2、流程举例

    九、vue.config.js文件配置

    1、productionSourceMap: false,

    2、lintOnSave: process.env.NODE_ENV === 'development',

    3、devServer.proxy


    一、记录

    1、CSS穿透

    pointer-events: none; 

    2、输入框是否提示输入

    autocomplete: off;

    3、插槽 #slot

    template引用的插槽 #slot

    4、v-deep深入改掉属性值

    当有一些ElementUI原生的样式改不动的时候前面加上

    ::v-deep 选择器{}

    1、官方文档

    vue-cookies - npmA simple Vue.js plugin for handling browser cookies. Latest version: 1.8.3, last published: 7 months ago. Start using vue-cookies in your project by running `npm i vue-cookies`. There are 230 other projects in the npm registry using vue-cookies.icon-default.png?t=N7T8https://www.npmjs.com/package/vue-cookies?activeTab=readme

    2、使用

    (1)安装

    npm i vue-cookies

    (2)引入

    在main.js文件中配置

    1. import VueCookies from 'vue-cookies'
    2. Vue.use(VueCookies, { expires: '7d'})

    (3)使用

    1. this.$cookie.set('token',res.data.data)
    2. this.$cookie.get()

    (4)代码实例【代码在下面拦截器一起】

    获取用户信息,token需要在很多页面判断及使用,因此建议放在request.js文件中


    三、拦截器

    1、请求拦截器

    在request.js文件发送请求前中,先判断是否有token

    1. import axios from "axios";
    2. // cookies要单独引入
    3. import VueCookies from "vue-cookies";
    4. export function request(config) {
    5. const instance = axios.create({
    6. baseURL: "http://120.78.172.212:7789",//请求地址前缀
    7. });
    8. // 添加请求拦截器
    9. instance.interceptors.request.use(
    10. function (config) {
    11. // 在发送请求之前做些什么
    12. // 判断是否有token
    13. if (VueCookies.get("token")) {
    14. config.headers.Authorization = "Bearer " + VueCookies.get("token");
    15. }
    16. return config;
    17. },
    18. function (error) {
    19. // 对请求错误做些什么
    20. return Promise.reject(error);
    21. }
    22. );
    23. return instance(config);
    24. }

    2、响应拦截器

    1. ins.interceptors.response.use(function(response) {
    2. return response.data
    3. }, function(error) {
    4. return Promise.reject(error)
    5. })

    ①response返回请求结果
    ②404-没找到not find【路径写错了】
    ③500-服务器错误,找后端
    ④401-没权限,一般是没token【没登录】
    ⑤200-成功


    四、vuex对信息存取改

    1. export default new Vuex.Store({
    2. state: {
    3. userInfo:{},
    4. },
    5. getters: {
    6. },
    7. mutations: {
    8. setUser(state,payload){
    9. state.userInfo = payload
    10. }
    11. },
    12. actions: {
    13. getUserApi(context){
    14. getUserInfoApi().then((res)=>{
    15. console.log(res.data);
    16. context.commit('setUser',res.data.data)
    17. })
    18. }
    19. },
    20. modules: {
    21. }
    22. })

    五、路由导航守卫

    1、登录思路

    (1)重定向:先进入首页index,这时候要判断是否有token,有则正常跳转,否则跳回login页面

    (2)登录前:不允许用户通过改地址跳到其他界面【index页面】,只能停留在login页面

    (3)登录后:不允许用户通过改地址跳回登录界面

    2、设置白名单

    (1)实现登录前,不允许用户通过改地址跳到其他界面

    在src文件夹下=》router文件夹=》index.js文件

    1. const whiteList = ['Login','Register'] //在白名单中着不会被拦截
    2. router.beforeEach((to, from, next) => {//全局守卫
    3. //如果在白名单内,不做任何判断,直接return next(),跳出整个循环
    4. if(whiteList.includes(to.name)){
    5. return next()
    6. }
    7. if(VueCookies.get('token')){
    8. store.dispatch('getUserApi')
    9. next()
    10. }else{
    11. next('login')
    12. }
    13. })

    (2)组件路由守卫

    实现登录后,不允许用户通过改地址跳回登录界面

    1. const routes = [
    2. {
    3. path: "/login",
    4. name: "Login",
    5. component: () => import(/* webpackChunkName: "login" */ "@/views/login.vue"),
    6. // 组件路由守卫
    7. beforeEnter(to, from, next) {
    8. if (VueCookies.get("token")) {
    9. next("/manage");
    10. } else {
    11. next();
    12. }
    13. },
    14. },
    15. ];

    六、Token与Cookie

    1、Token

    当前用户的标识,由服务端生成。以后客户端只需带上Token请求数据即可;

    2、Cookie

    ①客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
    ②Cookie存储的数据量有限,且都是保存在客户端浏览器中。
    ③不同的浏览器有不同的存储大小,但一般不超过4KB。
    ④因此使用Cookie实际上只能存储一小段的文本信息。跟着请求发送


    七、正则校验

    登录/注册信息校验

    1. data() {
    2. //字母开头,长度5-16,允许字母数字下划线
    3. const regUsername = /^[a-zA-Z]{1}\w{4,15}$/;
    4. const regPassword = /^[a-zA-Z]{1}\w{5,17}$/;
    5. // 登录规则
    6. var validateUser = (rule, value, callback) => {
    7. if (value === "") {
    8. callback(new Error("请输入用户名"));
    9. } else {
    10. if (!regUsername.test(value)) {
    11. // this.$refs.ruleForm.validateField("checkPass");
    12. callback(new Error("字母开头,长度5-16,允许字母数字下划线"));
    13. } else {
    14. callback();
    15. }
    16. }
    17. };
    18. var validatePass = (rule, value, callback) => {
    19. if (value === "") {
    20. callback(new Error("请输入密码"));
    21. } else {
    22. if (!regPassword.test(value)) {
    23. callback(new Error("字母开头,长度6-18,允许字母数字下划线"));
    24. } else {
    25. callback();
    26. }
    27. }
    28. };
    29. var validatePassAgain = (rule, value, callback) => {
    30. if (value === "") {
    31. callback(new Error("请再次输入密码"));
    32. } else if (value !== this.registerForm.password) {
    33. callback(new Error("两次输入密码不一致!"));
    34. } else {
    35. callback();
    36. }
    37. };
    38. return {
    39. // 弹窗显示与否
    40. dialogLoginVisible: false,
    41. dialogRegisterVisible: false,
    42. // 注册框内容
    43. registerForm: {
    44. username: "",
    45. password: "",
    46. passwordAgain: "",
    47. },
    48. // 输入框规则
    49. rules: {
    50. username: [{ validator: validateUser, trigger: "blur" }],
    51. password: [{ validator: validatePass, trigger: "blur" }],
    52. passwordAgain: [{ validator: validatePassAgain, trigger: "blur" }],
    53. },
    54. // 登录/用户名 按钮
    55. loginUser: "",
    56. // 注册/退出 按钮
    57. registerExit: "注册",
    58. };
    59. },

    八、跨域

    1、环境

    (1)开发环境

    1. # 页面标题
    2. VUE_APP_TITLE = '小米商城(开发环境)'
    3. # 开发环境配置
    4. ENV = 'development'
    5. # 小米商城/开发环境
    6. # 区别会体现在路径上
    7. VUE_APP_BASE_API = '/dev-api'

    (2)生产环境【不会出现跨域问题】

    1. # 页面标题
    2. VUE_APP_TITLE = '小米商城(生产环境)'
    3. # 生产环境配置
    4. ENV = 'production'

    2、流程举例

    本地项目:http://localhost:8080/dev-api/xiaomi/v2/product/hot
    devServer=>target:http://www.codeedu.com.cn/dev-api/xiaomi/v2/product/hot
    pathRewrite改写=》后端服务器需要的:http://www.codeedu.com.cn/xiaomi/v2/product/hot


    九、vue.config.js文件配置

    1、productionSourceMap: false,

    ①加速生产环境构建【项目启动】
    ②在开发的时候,不需要精确到某一行报错,只需要告知有报错即可

    2、lintOnSave: process.env.NODE_ENV === 'development',

    ①eslint代码规范
    ②该规范设置为只针对开发环境下
    ③生产环境下不能一有格式错误,整个项目就不能运行

    3、devServer.proxy

    当前后端API服务器没有运行在同一个主机上,需要开发环境将API请求代理到API服务器

    1. // webpack-dev-server 服务器 //网络请求的转发 // /dev-api/xiaomi/v2/carousel
    2. devServer: {
    3. proxy: {
    4. // http://localhost:8080/dev-api/xiaomi/v2/carousel
    5. // 接口带了process.env.VUE_APP_BASE_API这个字段,会被拦截下来 /dev-api
    6. [process.env.VUE_APP_BASE_API]: {
    7. target: process.env.TARGET, //转发TARGET = http://www.codeedu.com.cn
    8. // http://www.codeedu.com.cn/dev-api/xiaomi/v2/carousel
    9. //设置是否跨域
    10. changeOrigin: true,
    11. //改写,正则,局限devServer
    12. pathRewrite: {
    13. ["^" + process.env.VUE_APP_BASE_API]: "", // http://www.codeedu.com.cn/xiaomi/v2/carousel
    14. },
    15. },
    16. },
    17. },
  • 相关阅读:
    问题汇总20231117
    Java教程:如何利用UDP实现群聊聊天室?
    pyqt5 学习笔记四 (布局:QBoxLayout)
    防火墙---双机热备技术
    Java中转换流&打印流&Reader类的方法&OutputStream和Writer方法
    学c还行,学Python很累,还有其他语言适合我吗?
    ASEMI-KBL410是什么元器件,kbl410整流桥参数
    【AI】PyTorch入门(一):通过Anaconda安装PyTorch,并总结张量TENSORS
    ALPHA开发板网络方案说明
    分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测
  • 原文地址:https://blog.csdn.net/qq_51478745/article/details/133687890