目录
- 1 获取工人信息
- 2 搭建工人入口
- 3 权限判断
- 总结
目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色,在访问后台的时候界面该如何呈现呢?
本篇我们就来介绍一下权限的设计。
1 获取工人信息
在用户管理的API中,我们有一个获取用户信息的方法,通过openid来去获取
作为顾客直接从用户表里获取没啥问题,作为员工就需要从工人表或者员工表来获取,先完善一下逻辑
const ErrorCode = {
SUCCESS: 0,
PARAM_ERROR: 1001,
NOT_FOUND: 1002, // 用户未找到(未注册)
SYSTEM_ERROR: 1003,
// USER_EXISTS: 1004, // 注册时用
// USER_NOT_EXISTS: 1005 // 可以用 NOT_FOUND 代替
};
// 获取用户信息及会员状态 (用于登录判断)
module.exports = async function (params, context) {
const { openid } = params;
// 1. 参数验证
if (!openid) {
return {
code: ErrorCode.PARAM_ERROR,
message: '参数错误,openid 缺失'
};
}
try {
// 2. 根据 openid 查询用户信息
const userResult = await context.callModel({
name: "jz_users", // 查询用户表
methodName: "wedaGetRecordsV2",
params: {
filter: {
where: {
$and: [
{
openid: { $eq: openid },
},
],
},
},
select: { $master: true }, // 获取主表字段
getCount: true,
pageSize: 1,
pageNumber: 1,
}
});
console.log("getUserInfo - userResult", userResult);
// 检查用户是否存在
if (userResult.total === 0) {
return {
code: ErrorCode.NOT_FOUND,
message: '用户未注册' // 返回用户未找到的特定错误码
};
}
const user = userResult.records[0]; // 获取用户信息
// 3. 查询会员信息(如果用户存在)
const memberResult = await context.callModel({
name: "jz_members", // 查询会员表
methodName: "wedaGetRecordsV2",
params: {
filter: {
where: {
$and: [
{
userId: { $eq: user._id },
},
],
},
},
select: { userId: true,level:true,status:true,points:true,balance:true }, // 获取主表字段
getCount: true,
pageSize: 1,
pageNumber: 1,
}
});
console.log("getUserInfo - memberResult", memberResult);
// 4. 组合返回结果
const isMember = memberResult.records && memberResult.records.length > 0;
const memberInfo = isMember ? memberResult.records[0] : null; // 如果是会员则返回会员信息
// 5. 查询员工信息(如果员工存在)
const workerResult = await context.callModel({
name: "jz_fwssq", // 查询会员表
methodName: "wedaGetRecordsV2",
params: {
filter: {
where: {
$and: [
{
ssyh: { $eq: user._id },
},
],
},
},
select: { ssyh: true,xm:true,zwjs:true,grzp:true,gzjy:true,fwlb:true,sjhm:true }, // 获取主表字段
getCount: true,
pageSize: 1,
pageNumber: 1,
}
});
console.log("getUserInfo - workerResult", workerResult);
// 6. 组合返回结果
const isWorker = workerResult.records && workerResult.records.length > 0;
const workerInfo = isWorker ? workerResult.records[0] : null; // 如果是工人则返回工人信息
return {
code: ErrorCode.SUCCESS,
data: {
isRegistered: true, // 明确标记用户已注册
isMember: isMember, // 标记用户是否是会员
isWorker: isWorker,//标记用户是否是工人
userInfo: user, // 返回用户信息
memberInfo: memberInfo, // 返回会员信息 (如果存在),
workerInfo: workerInfo//返回工人信息
}
};
} catch (error) {
console.error("getUserInfo error:", error);
return {
code: ErrorCode.SYSTEM_ERROR,
message: `系统错误: ${error.message}`
};
}
}
在原有的逻辑里,我们增加了工人信息的判断
2 搭建工人入口
在小程序的我的界面,添加一个工人入口的菜单
然后创建一个工作台的页面
切换到布局设计,新建一个布局
将布局名称改为工人布局
然后将第一个菜单改为工作台,页面选择我们的工作台页面
切换回页面设计,布局选择我们的工人布局
3 权限判断
在我的页面,给工人入口添加点击事件,添加一个逻辑分支,判断用户是否为工人
If($w.app.dataset.state.userData.isWorker, true, false)
如果是工人,我就打开页面,跳转到工作台
不是工人我们就提示用户,非工人角色
在工作台界面,我们添加一个普通容器里边放置一个文本组件,显示无权限访问
通过绑定条件展示,来决定是正常显示页面还是显示无权限访问
总结
本篇我们介绍了工人的工作台页面的权限控制,首先是入口就要判断身份,进入页面后再次验证权限。小程序有的会搭建一个登录页,其实那只是自己骗自己,起不到啥作用。
为啥说起不到啥作用,因为你本身就是匿名访问,而且能获取到用户的身份信息,没必要再二次增加验证。