2021SC@SDUSC
结束了上次对用户日志的观察
今天我们来分析auth.js这一文件
文件位置:controller/admin/auth.js
这次的文件信息量还不小,因此决定分拨分析
目录
规则更新
用户分组管理首页
成员管理
管理员用户组数据写入/更新
首先进行函数构造与初始化
规则更新就需要涉及更新、删除节点的操作
需要新增的节点将位于nodes内
而需要更新和删除的节点必然需要位于rules内
新增一个节点仅仅需要判定本页面原本没有这个节点
而更新和删除节点的步骤稍稍复杂些
一要将节点的status全部取出
二要根据条件搜索并替换更新某个节点
async updaterules() { const nodes = await this.returnnodes(false); const AuthRule = this.model('auth_rule'); const map = {'module': 'admin', 'type': ['in', [1, 2]]}; const rules = await AuthRule.where(map).order('name').select();
初始化一个用来保存需要插入和更新的新节点的数据数组
然后处理nodes中的节点:
遍历获取每一个nodes的url、title,保存在临时数组中,并将临时数组得到module一项设为‘admin’
然后根据这是否是一个子节点的判断结果,对数组的type一项选择性赋值1或2
再对数组的status项全部赋值为1
此时,我们的url可以被计算出来了,就是原本的url加上title加上刚刚得到的type做一个小写转变版的合成
最后将这个url存储在临时数组中
const data = {}; nodes.forEach(value => { const temp = {}; temp.name = value.url; temp.desc = value.title; temp.module = 'admin'; if (value.pid > 0) { temp.type = 1; } else { temp.type = 2; } temp.status = 1; let url = temp.name + temp.module + temp.type; url = url.toLocaleLowerCase(); data[url] = temp; });
保存需要更新的节点,同时也要保存需要删除的节点的id
像节点方法中做的那样,遍历获取rules中的name、module、type,并小写转换合成为新的变量,命名为kye
如果数据库中的规则与配置的节点匹配,说明是需要更新的节点
此时,为需要更新的节点补充id值
在之前就准备好的update数组中,写入需要更新的节点id值
const update = []; const ids = []; const diff = {}; rules.forEach((rule, i) => { let key = rule.name + rule.module + rule.type; key = key.toLocaleLowerCase(); if (!think.isEmpty(data[key])) { data[key].id = rule.id; update.push(data[key]); delete data[key]; delete rule.condition; delete rule.pid; diff[rule.id] = rule; } else { if (rule.status == 1) { ids.push(rule.id); } }
最后,做一些接收到的错误的处理
if (!think.isEmpty(update)) { update.forEach(row => { if (!isObjectValueEqual(row, diff[row.id])) { AuthRule.where({id: row.id}).update(row); } }); } if (!think.isEmpty(ids)) { AuthRule.where({id: ['IN', ids]}).update({'status': -1}); } if (!think.isEmpty(data)) { AuthRule.addMany(obj_values(data)); } return true; }
很熟悉的操作,就和上一次分析的用户日志列表查看异曲同工
先是条件搜索得到list,再将list中的元素一个一个提取出来
最后在标题为“会员管理组”的页面中进行展示
async indexAction() { const list = await this.model('member_group').order('sort ASC').select(); for (const v of list) { v.count = await this.model('member').where({groupid: v.groupid, status: 1}).count('id'); } this.assign('list', list); this.meta_title = '会员组管理'; return this.display(); }
首先需要得到本页面使用者的ID,即条件为角色id,模型为'auth_user_role'的数据
初始化一个userdata,用于之后保存用户数据
只要获取成功使用者的ID了,就可以对成员的数据搜索,然后传输到userdata中
于是userdata中的数据可以方便操作者进行修改了
async userlistAction() { const id = this.get('id'); const userid = await this.model('auth_user_role').where({role_id: id}).getField('user_id'); let userdata; if (!think.isEmpty(userid)) { userdata = await this.model('member').where({id: ['IN', userid]}).select(); for (const v of userdata) { const role_id = await this.model('auth_user_role').where({user_id: v.id}).getField('role_id', true); v.role = await this.model('auth_role').where({id: role_id}).getField('desc', true); } } this.assign('userlist', userdata); this.meta_title = '成员管理'; this.active = 'admin/auth/index'; return this.display(); }
接上文,这里展现的是具体的修改方法
id是需要被获取的参数,用于确保修改的是同一个人的,而不会乱修改
同时,需要确保正在修改的人是管理员而不是哪个人都可以
在成功更新后,对此做出反馈
async writeroleAction() { const map = {}; map.rule_ids = this.post('rules'); if (think.isArray(map.rule_ids)) { map.rule_ids = map.rule_ids.sort(function(a, b) { return a - b }).join(','); } map.module = 'admin'; map.type = 1; const id = this.post('id'); const role = this.model('auth_role'); await role.where({id: id}).update(map); return this.success({name: '更新成功'}); }