这个工作在小程序上实现的比较早了,但小程序一直也没有实现根据用户权限来显示项目,而是一股脑将所有项目都列出来了。
这次花了3个晚上和周末时间彻底梳理了一下。
用到的技术有:
1.根据用户权限显示项目列表。
用户没有权限的项目就不显示了。这个在casbin里,取得用户——对应的角色——对应的资源权限(类似:项目id/一级目录id/二级目录id),取出来这个资源后,放到map里去重。因为一个项目的树状目录权限很多条。我们只需要拿到根目录这个项目id即可。
当然,还有特殊情况比如管理员会取到“/*”所有权限,需要过滤这种空的情况。
代码语言:javascript复制permissions, err := e.GetImplicitPermissionsForUser(strconv.FormatInt(uid, 10))
if err != nil {
logs.Error(err)
}
for _, v := range permissions {
logs.Info(v[1])
// 用map去重
projid = strings.Replace(v[1], "/*", "", -1)
// strMap[path.Base(projid)] = path.Base(projid)
// tempstr := strings.Split(projid, "/")
// logs.Info(tempstr[0])
// logs.Info(tempstr[1])
strMap[strings.Split(projid, "/")[1]] = strings.Split(projid, "/")[1]
}
for _, v := range strMap {
// beego.Info(projids)
projectid, err := strconv.ParseInt(v, 10, 64)
if err != nil {
logs.Error(err)
}
aa := make([]Project1, 1)
aa[0].Id = projectid
project, err := models.GetProj(projectid)
if err != nil {
logs.Error(err)
}
aa[0].Code = project.Code
aa[0].Title = project.Title
aa[0].Label = project.Label
aa[0].Principal = project.Principal
//根据项目id取得项目下所有成果数量
count, _, err := models.GetProjProducts(project.Id, 3)
if err != nil {
logs.Error(err)
}
aa[0].Number = count //len(products)
aa[0].Created = project.Created
aa[0].Updated = project.Updated
projects1 = append(projects1, aa...)
}
// logs.Info(projects1)
count = int64(len(strMap))
table := Tableserver{projects1, page1, count}
c.Data["json"] = table
c.ServeJSON()
2.web页面的localstorage存储用户选择
localstorage将用户选择的项目id存储起来,下次页面直接访问localstorage,如果有,则直接跳转,没有则用户选择。
代码语言:javascript复制// 将选择的项目id存入浏览器内存
function setlocalstorage() {
var selectRow2 = $('#Navtable2').bootstrapTable('getSelections');
if (selectRow2.length < 1) {
alert("请先勾选项目!");
return;
}
console.log(selectRow2[0].Id)
window.localStorage.setItem('projectid', selectRow2[0].Id);
$('#NavmodalTable').modal('hide');
// window.location.reload();
}
3.localstorage数据发生变化后的监听
由于localstorage自身的监听不支持当前页,所以找了一段很好的解决代码。
监听localStorage变化(当页面)
这样,用户在某个项目页,进行项目切换,当localstorage监听到projectid有变化,则进行刷新。
当用户在其他页面,比如首页, 切换项目后,存入localstorage。
当来到项目页时,项目页先查询localstorage里的值,有则跳转,没有则显示项目列表。
代码语言:javascript复制 $(function() {
var projectid = window.localStorage.getItem('projectid')
if (projectid != null) {
window.open("/project/" projectid, "_self" )
}
})
在首页进行选择项目(或切换项目)
如果localstorage里有值,则该项目处于选择状态。用到bootstrap-table的formatter 方法:
bootstrap-table 复选框/单选框设置状态
代码语言:javascript复制var projectid = window.localStorage.getItem('projectid')
columns: [{
title: '选择',
radio: 'true',
width: '10',
align: "center",
valign: "middle",
formatter: function(value, row, index) {
return {checked: row.Id==projectid}//这里
},
},
导航条“项目”自动根据localstorage有无存值来决定是跳转到具体项目页还是显示项目列表