最近在调试一个湖南地区的互动组件,有个事儿挺让人纳闷的:同样的前端,同样的资源文件,有些账号登录之后能看到房间右上角多一个“赚金房”按钮,有些账号就是没有。一开始我以为是版本没打好,或者资源没更新,折腾了半天才发现,原来问题出在数据库的一条字段上。
这个按钮的显示,其实是由一个叫 UserRight
的字段控制的,这玩意是个典型的位掩码。按钮的开关对应的是 2 的 29 次方,也就是十进制的 536870912。你账号登录后只要带上这个权限位,前端就会自动把按钮显示出来,不用改前端逻辑,也不用走特殊渠道。
我最开始测试的时候是用游客号,权限是 0,自然啥都没有。后来试着给账号加了一下这个权限,果然按钮就出来了。sql 很简单:
update AccountsInfo
set UserRight = UserRight | 536870912
where UserID = 2257
这个 |
是或运算,如果你不熟悉位操作,可以理解为“在原有权限基础上加一个开关”。推荐这种写法,别直接覆盖字段值,不然会把账号之前的所有权限都抹掉。
加完之后记得让账号重新登录一次,这步很重要。因为客户端登录后权限信息是缓存的,不重登你即便改了数据库也不会生效。我就因为忘了这一步,多调了十几分钟,以为改错了。
客户端那边其实判断也很简单,就一句:
if ((userInfo.UserRight & 536870912) !== 0) {
btnEarngold.active = true;
}
所以从逻辑上看,客户端按钮早就写好了,就等你服务端把权限开出来。没开就是不显示,开了就秒出现,连热更都不需要。
要是想批量给所有账号都加上,也能直接整一条:
update AccountsInfo
set UserRight = UserRight | 536870912
不过这种操作建议只在测试服干,正式环境还是走后台或者 GM 工具保险点,免得出事不好收拾。
这个事儿给我提了个醒。以后再遇到“别人那边有我这边没有”的情况,别一上来就怪前端或者问是不是少打包了,先看数据库里的权限字段。尤其是这种位掩码结构,很多功能开关其实都是一行 SQL 的事儿。
建议有条件的话,把系统里每一位权限代表什么功能都整理成文档,哪怕是写在笔记里也好。以后新功能上线的时候,直接查表加权限,不容易出错,也省了不少排查时间。
顺便提一句,像这种写死在权限位里的功能,其实前端完全可以做成动态读取,甚至拉个配置列表也比写死逻辑强。但这属于架构设计问题了,改起来麻烦,咱们就不多说了,先能用起来就行。
就这一个按钮,我从前端跟到后端,从 prefab 点到数据库字段,也算是一种经验。写下来也是给后来人提个醒,别被表面现象迷了眼,搞技术这行,有时候问题就藏在最不起眼的地方。