前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >engineercms多项目切换

engineercms多项目切换

作者头像
hotqin888
发布2022-10-05 16:21:50
3490
发布2022-10-05 16:21:50
举报
文章被收录于专栏:hotqin888的专栏hotqin888的专栏

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档