uniapp - vuex做权限管理

本文介绍了如何在手机端使用Vue.js和Vuex进行用户权限分配。首先,从后台接口获取权限菜单列表,并通过Map对象过滤出code字段。接着,搭建Vuex仓库,定义state中的power变量用于存储权限信息,并利用Vuex的mutations进行状态持久化。然后,将处理后的权限数据存入Vuex的state.power,并在onLoad中通过getter方法获取并判断用户是否有访问特定页面的权限。最后,根据权限值决定是否显示相应页面的按钮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:处理请求到的数据

手机端做用户权限分配,后台会给你接口返回给你一个菜单的列表,如下图中在个人信息接口返回数据里有个menu字段,里面存放的就是当前用户可以访问的有权限的页面。menu数组里是对象的形式,我们需要先把里面的控制权限的code字段给过滤出来。
在这里插入图片描述
过滤的方法有很多,这里我使用map对象把它存放起来

// res.data.data.menu 是我请求到将要处理的数据
let menuArr = res.data.data.menu
let map = new Map();
for (let i = 0; i < menuArr.length; i++) 
	{map.set(menuArr[i].code,menuArr[i].code);
}
// 这里我们打印一下处理好的数据如下图
console.log('map:', map);

在这里插入图片描述
ok!这里处理好后我们先放这里稍后再说怎么用,现在的当务之急是需要把它存放到vuex仓库里去,以便我们再项目中所有页面都可访问到。

第二步:搭建vuex仓库

在store文件夹下的index.js里写如下

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
    state:{
        // 定义变量 - 权限控制变量
        power: uni.getStorageSync('vuex-power') || {},  // 顺便配合本地存储做一下vuex状态持久化(第一步)
    },
    getters: {
        getPower:state=>{
            return state.power
        }
    },
    mutations: {
    // 这里的state是上面状态的state,val是参数-后面说在哪里传它
        setPower(state, val){
            state.power = val ? val : {}
            uni.setStorageSync('vuex-power',val) //(第二步,完事)
        }
    },
})

export default store

在你的uniapp项目的main.js里写如下代码

import store from './store/index.js'
const app = new Vue({
  ...App,
  store
})
app.$mount()

ok!到这里vuex仓库搭建好了,state里的power对象就是我们定义的将要存放权限数组的变量。

第三步:给vuex仓库里state下的power赋值

我们如何把第一步里打印的map对象存放到第二步里的state下的power身上用以全局使用呢?

// res.data.data.menu 是我请求到将要处理的数据
let menuArr = res.data.data.menu
let map = new Map();
for (let i = 0; i < menuArr.length; i++) 
	{map.set(menuArr[i].code,menuArr[i].code);
}
console.log('map:', map);

// 我们接着第一步的代码写
// 直接在这里使用下面语法赋值
this.$store.commit('setPower', map)
// 解释:'setPower'对应着store/index.js里的mutations字段里定义的setPower
// map这个数据会被传到val那里然后又赋值给了state.power
console.log('power被赋的值:', this.$store.getters.getPower);
// 这一句又打印,说明你已经把map数据存放到了vuex的状态power字段上了

第四步:使用vuex里的状态值判断页面是否是你有的权限

data(){
	return{
		power: false
	}
}
onLoad(){
	// 判断vuex仓库this.$store.getters.getPower有没有qyry这个字段,
	// 有的话进入if语句,把this.power 设置为 true
	if (this.$store.getters.getPower.get('qyry') != undefined) {
		this.power = true
	}
},

做判断就行了。

<view v-if="power">
	<button class="btn">去qyry页面</button>
</view>
<think>好的,我现在需要帮助用户在UniApp Admin项目中实现默认登录并跳过登录页面的功能。首先,我需要理解用户的需求。用户希望应用程序在启动时自动登录,无需经过登录页面。这可能用于测试环境,或者在某些情况下需要保持用户始终登录。 接下来,我需要回忆UniAppUniApp Admin的基本结构。UniApp是基于Vue.js的跨平台开发框架,而UniApp Admin可能是一个后台管理系统模板,通常包含用户认证、权限管理等功能。默认登录通常涉及到自动使用预设的账号信息进行登录,或者使用本地存储的token来跳过登录流程。 首先,用户可能需要修改登录逻辑。通常在UniApp中,登录流程是在登录页面发起请求,获取token后存储在本地,比如uni.setStorageSync('token', token)。然后跳转到主页。要实现自动登录,可能需要检查本地是否有有效的token,如果有,直接跳转到主页,不再显示登录页面。 但用户希望更进一步,直接跳过登录页面,也就是应用启动时就自动登录,可能使用默认账号。这需要考虑几个步骤: 1. 应用启动时检查是否有存储的token,如果有,直接进入主页。但用户可能希望即使没有token也自动登录,所以可能需要使用预设的账号信息(如固定用户名和密码)自动调用登录接口。 2. 修改App.vue的onLaunch生命周期函数,在这里执行自动登录的逻辑。因为App.vue是应用的入口文件,onLaunch会在应用启动时触发。 3. 自动登录需要调用后端的登录接口,发送预设的账号信息,获取token,并保存到本地存储。之后跳转到主页,同时需要关闭登录页面,或者确保路由直接跳转,不经过登录页面。 但是,需要注意潜在的问题,比如自动登录的安全性,以及如何处理登录失败的情况。例如,如果网络请求失败,可能需要回退到显示登录页面。 另外,用户可能已经有一些现有的登录逻辑,需要在不破坏现有功能的情况下添加自动登录的选项。比如,通过环境变量来控制是否启用自动登录,方便在测试和生产环境之间切换。 参考引用内容中的信息,比如引用[3]提到退出登录时断开websocket,重新登录时连接,这可能与token的有效性有关。因此,在自动登录时,需要确保token的有效性,并在失效时处理重新登录或跳转。 可能的实现步骤: 1. 在App.vue的onLaunch中,检查是否启用自动登录。可以通过配置文件或条件编译来设置。 2. 如果启用自动登录,使用预设的账号调用登录接口,获取token并存储。 3. 处理自动登录后的跳转,关闭所有页面并跳转到主页,使用uni.reLaunch方法。 4. 处理异常情况,比如登录失败时跳转到登录页面,或者显示错误信息。 此外,需要注意自动登录的安全风险,确保不会将敏感信息硬编码在客户端代码中。可能只在开发或测试环境使用此功能,生产环境应禁用。 最后,生成相关问题需要考虑用户可能遇到的其他问题,比如如何安全存储token、如何处理token过期、如何配置环境变量等。</think>在UniApp Admin中实现默认登录并跳过登录页面,可通过以下步骤实现: ### 一、修改应用入口逻辑 1. 在`App.vue`的`onLaunch`生命周期中添加自动登录逻辑 ```javascript onLaunch: function() { // 检查是否开启自动登录(可通过环境变量控制) if (process.env.VUE_APP_AUTO_LOGIN === 'true') { this.autoLogin() } }, methods: { async autoLogin() { try { // 使用预设账号发起登录请求 const res = await uni.request({ url: '/api/auth/login', method: 'POST', data: { username: 'defaultUser', password: 'defaultPwd' } }); // 存储登录凭证 uni.setStorageSync('token', res.data.token); uni.setStorageSync('userInfo', res.data.userInfo); // 跳转首页并关闭所有页面 uni.reLaunch({ url: '/pages/index/index' }); } catch (error) { console.error('自动登录失败', error); uni.navigateTo({ url: '/pages/login/login' }); } } } ``` ### 二、配置路由拦截(可选) 在`permission.js`中修改路由守卫逻辑: ```javascript router.beforeEach((to, from, next) => { const isLoggedIn = uni.getStorageSync('token'); if (to.path === '/pages/login/login') { // 如果已登录且尝试访问登录页,重定向到首页 isLoggedIn ? next('/pages/index/index') : next(); } else { isLoggedIn ? next() : next('/pages/login/login'); } }); ``` ### 三、环境配置 在`.env.development`中配置环境变量: ``` VUE_APP_AUTO_LOGIN = true ``` ### 四、注意事项 1. **安全警告**:生产环境应禁用此功能,避免硬编码凭证泄露[^3] 2. **失败处理**:需捕获网络异常和认证失败情况 3. **状态同步**:确保Vuex中用户状态与本地存储同步 4. **接口防护**:后端应对默认账号进行请求频率限制
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值