首页 > 其他分享 >页面设计

页面设计

时间:2024-02-16 10:33:34浏览次数:33  
标签:登录 ENUM loginUser ACCESS import 设计 权限 页面

权限管理设计

布局设置

image

accessEnum.ts

const ACCESS_ENUM = {
  NOT_LOGIN: "notLogin",
  USER: "user",
  ADMIN: "admin",
};

export default ACCESS_ENUM;

checkAccess.ts
这个用于检查权限,参数是传递过来跳转路由需要的权限
然后这里面获取登录用户的权限,两个对比

例如这个需要权限

{
    path: "/image",
    name: "图片展示",
    meta: {
      hidenInMenu: true,
    },
    component: ImageView,
  },

有的跳转不需要权限

 {
    path: "/",
    name: "首页",
    component: HomeView,
  },

用这个获取需要的权限

//存在就获取,不存在就是undefined
const needAccess = (to.meta?.access as string) ?? ACCESS_ENUM.NOT_LOGIN;

const needAccess:这是声明一个常量变量 needAccess。
to.meta?.access:这是 Vue Router 中路由导航守卫的一个特性。to 是即将跳转到的目标路由对象,meta 是路由元信息对象,?. 是可选链操作符,用于判断 to.meta 是否存在,如果存在,则继续访问 access 属性。
as string:这是 TypeScript 的类型断言,将 to.meta?.access 强制转换为字符串类型。这里假设 access 属性是一个字符串,但由于可选链操作符的使用,它可能为空。
?? ACCESS_ENUM.NOT_LOGIN:这是空值合并运算符 (nullish coalescing operator),用于判断 to.meta?.access as string 是否为 null 或 undefined,如果是,则返回 ACCESS_ENUM.NOT_LOGIN。空值合并运算符用于提供默认值,即如果 to.meta?.access 为空,则将 needAccess 赋值为 ACCESS_ENUM.NOT_LOGIN。
总的来说,这行代码的含义是:如果目标路由对象 to 的元信息中存在 access 属性,则将其转换为字符串并赋值给 needAccess 变量;如果不存在或为空,则将 needAccess 赋值为 ACCESS_ENUM.NOT_LOGIN。
/*
 * 检查权限(判断当前登录用户是否具有某个权限)
 *  logingUSER 当前登录用户
 * needAccess 需要有的权限
 * boolean 有无权限
 * */
import ACCESS_ENUM from "@/access/accessEnum";

/**
 * 检查权限(判断当前登录用户是否具有某个权限)
 * @param loginUser 当前登录用户
 * @param needAccess 需要有的权限
 * @return boolean 有无权限
 */
const checkAccess = (loginUser: any, needAccess = ACCESS_ENUM.NOT_LOGIN) => {
  // 获取当前登录用户具有的权限(如果没有 loginUser,则表示未登录),和这个路由跳转权限对比
  const loginUserAccess = loginUser?.userRole ?? ACCESS_ENUM.NOT_LOGIN;
  //这个权限是不需要登录的,直接返回
  if (needAccess === ACCESS_ENUM.NOT_LOGIN) {
    return true;
  }

  // 如果用户登录才能访问,这个是登录了,需要用户权限,但是登录的用户没有用户权限
  if (needAccess === ACCESS_ENUM.USER) {
    // 如果用户没登录,那么表示无权限,查看登录用户是否已经登录了
    //这个是登录用户的权限,需要的权限是user,但是登录用户的权限显示ACCESS_ENUM.NOT_LOGIN,返回跳转到无权限页面
    if (loginUserAccess === ACCESS_ENUM.NOT_LOGIN) {
      return false;
    }
  }
  // 如果需要管理员权限
  if (needAccess === ACCESS_ENUM.ADMIN) {
    // 如果不为管理员,表示无权限
    //需要管理员权限
    if (loginUserAccess !== ACCESS_ENUM.ADMIN) {
      return false;
    }
  }
  return true;
};

export default checkAccess;

indes.ts
这个是路由守卫,跳转路由触发,然后检查权限

import store from "@/store";
import ACCESS_ENUM from "@/access/accessEnum";
import checkAccess from "@/access/checkAccess";
import router from "@/router";

router.beforeEach(async (to, from, next) => {
  // alert("xxxx13" + "45");

  console.log("登录用户信息", store.state.user.loginUser);
  console.log(to.matched);

  const loginUser = store.state.user.loginUser;
  if (!loginUser || !loginUser.userRole) {
    //用来触发action方法
    await store.dispatch("user/getLoginUser");
  }

  //不需要登录就是ACCESS_ENUM.NOT_LOGIN,这个从meta取的
  const needAccess = (to.meta?.access as string) ?? ACCESS_ENUM.NOT_LOGIN;
  //要跳转的页面必须登录,需要判断权限
  if (needAccess !== ACCESS_ENUM.NOT_LOGIN) {
    //如果没有登录,跳转到登录页面
    //如果没有登录!loginUser就是ture
    if (!loginUser) {
      next(`/user/login?redirect=${to.fullPath}`);
      return;
    }

    //如果已经登录了,但是权限不足,那么跳转到无权限界面
    if (!checkAccess(loginUser, needAccess)) {
      next("/noAuth");
      return;
    }
    //仅管理员可见,判断当前用户是否有权限
    // if (to.meta?.access === "canAdmin") {
    //   if (store.state.user.loginUser?.role === "admin") {
    //     next("/noAuth");
    //     return;
    //   }
    // }
  }

  //不需要登录直接跳转
  next();
  console.log(to);
});

设计全局对象

image

index.ts

import { createStore } from "vuex";
import user from "./user";

export default createStore({
  mutations: {},
  actions: {},
  modules: {
    user,
  },
});

user.ts

import { StoreOptions } from "vuex";
import { UserControllerService } from "../../generated";
import ACCESS_ENUM from "@/access/accessEnum";

export default {
  namespaced: true,
  state: () => ({
    //存储用户信息,这里是存储一个对象信息
    loginUser: {
      userName: "未登录",
      role: "notLogin",
    },
  }),

  actions: {
    // getLoginUser({ commit, state }, payload) {
    //   commit("updateUser", { userName: "鱼皮" });
    // },
    //payload的作用
    async getLoginUser({ commit, state }, payload) {
      const res = await UserControllerService.getLoginUserUsingGet();
      // console.log("xxxxxxxxxxxxxxxxxxxx");
      console.log(res);
      if (res.code === 0) {
        commit("updateUser", res.data);
      } else {
        commit("updateUser", {
          ...state.loginUser,
          userRole: ACCESS_ENUM.NOT_LOGIN,
        });
      }
    },
  },

  mutations: {
    updateUser(state, payload) {
      console.log("payload");
      console.log(payload);
      state.loginUser = payload;
    },
  },
} as StoreOptions<any>;

路由

image

index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import { routes } from "@/router/routes";

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes,
});

export default router;

routes.ts

import { RouteRecordRaw } from "vue-router";
import HomeView from "@/views/HomeView.vue";
import NoAuth from "@/views/NoAuth.vue";
import AdminView from "@/views/AdminView.vue";
import ImageView from "@/views/ImageView.vue";
import UserLoginView from "@/views/user/UserLoginView.vue";
import UserRegisterView from "@/views/user/UserRegisterView.vue";

import AboutView from "@/views/AboutView.vue";
import UserLayout from "@/layouts/UserLayout.vue";

export const routes: Array<RouteRecordRaw> = [
  {
    path: "/user",
    name: "用户",
    component: UserLayout,
    children: [
      {
        path: "login",
        name: "用户登录",
        component: UserLoginView,
      },
      {
        path: "register",
        name: "用户注册",
        component: UserRegisterView,
      },
    ],
  },
  {
    path: "/",
    name: "首页",
    component: HomeView,
  },
  {
    path: "/noAuth",
    name: "无权限",
    component: NoAuth,
  },
  {
    path: "/image",
    name: "图片展示",
    meta: {
      hidenInMenu: true,
    },
    component: ImageView,
  },
  {
    path: "/admin",
    name: "管理员可见",
    component: AdminView,
    meta: {
      access: "canAdmin",
    },
  },
  {
    path: "/about",
    name: "about",
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    meta: {
      hidenInMenu: true,
    },
    component: AboutView,
    // component: () =>
    //   import(/* webpackChunkName: "about" */ "../views/AboutView.vue"),
  },
];

标签:登录,ENUM,loginUser,ACCESS,import,设计,权限,页面
From: https://www.cnblogs.com/hellojianzuo/p/18016953

相关文章

  • WPF新境界:MVVM设计模式解析与实战,构建清晰可维护的用户界面
     概述:MVVM是一种在WPF开发中广泛应用的设计模式,通过将应用程序分为模型、视图、和视图模型,实现了解耦、提高可维护性的目标。典型应用示例展示了如何通过XAML、ViewModel和数据绑定创建清晰、可测试的用户界面。什么是MVVM?MVVM(Model-View-ViewModel)是一种用于构建用户界面的......
  • 大厂的供应链采购系统设计
    关注我,紧跟本系列专栏文章,咱们下篇再续!作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部专家博主,编程严选网创始人。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。负责:中央/分销预订系统性能优化活动&优惠券等营销中台建设交易平台及数据中台......
  • Chrome下载页面链接的cookie
    从chrome下载文件时,复制链接到其他软件下载,多数情况是无法下载,原因是链接的cookie没有复制过去可以从浏览器的链接地址,点击左边,可以查看网站使用的cookie,复制过去可以下载想办法用软件从外部获取chrome的cookie,过程cookie储存在本地文件,在chrome的UserDataDi......
  • 钱包的主要功能与设计
    一、创建钱包创建钱包有多种交互形式:助记词、强密码。他们的好处都是既通过多重加密保护了密钥的安全,又降低记忆密码的难度。强密码:会把用户输入强密码转成keystore文件。这步可以使用@wallet/client包实现。助记词:会把自动生成的密钥转换成12个单词。二、访问钱包连......
  • SpringBoot整合OSS中的设计模式----单例模式
    在SpringBoot项目中使用OSS存储上传的图片,需要配置OSS设置信息。避免对象的重复创建,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,于是用到了单例模式,这里复习一下单例模式。单线程----懒汉式@Data@Component@ConfigurationProperties(prefix="aliyun.oss")pu......
  • 探索性设计的广度优先和深度优先搜索问题
    从我个人的经验来看,很多时候是需要探索性编程的。也就是对多个方案进行必选,甚至开发原型进行比选。而其中很多的原型都是要丢弃的。这种活动应该是一种经常性的活动。在这种情况下,可能会要先广度,筛选出大的宏观方案,再深度解决某个方案中的具体问题。总之是要灵活机变的方式,去......
  • 设计模式之单例模式
    经过多方博客,文章参考,枚举是实现单例模式的最好方式publicenumSingleton{INSTANCE;publicvoidbusinessMethod(){System.out.println("我是一个单例!");}}publicclassMainClass{publicstaticvoidmain(String[]args){Si......
  • 微信小程序页面跳转:wx.switchTab、wx.reLaunch、wx.redirectTo、wx.navigateTo、wx.na
    引言在微信小程序开发中,页面跳转是一项基础且常用的功能。本文将介绍微信小程序中五种常见的页面跳转方式,并分析它们的使用场景和区别。1.wx.switchTab(跳转主页)wx.switchTab方法用于跳转到tabBar页面,并关闭其他所有非tabBar页面,通常用于跳转到小程序的主页。特点:关闭......
  • 单例模式(设计一个类,这个类只允许通过方法返回一个对象)
    1什么是单例模式2实现步骤3饿汉单例模式急汉子,娃娃亲,类一加载,对象就创建了。3.1为什么叫饿汉式?类被加载时,对象就被创建了。(太饿了,所以先创建?)常常创建的对象是重量级的对象,如果不用会造成资源浪费。3.2步骤3.3代码举例4懒汉单例模式调用静态方法才创建,考......
  • 设计模式--策略模式(Strategy Pattern)
    策略模式(StrategyPattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户端。策略模式主要包含以下几个角色:Strategy(策略):这是一个接口,通常用于定义所有支持的算法的公共接口。ConcreteStrategy(具体策略):这是实现了S......