engineercms多项目切换

2022-10-05 16:21:50 浏览数 (1)

这个工作在小程序上实现的比较早了,但小程序一直也没有实现根据用户权限来显示项目,而是一股脑将所有项目都列出来了。

这次花了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有无存值来决定是跳转到具体项目页还是显示项目列表

0 人点赞