首页 > 其他分享 >钉钉二次开发-企业内部系统集成官方OA审批流程(三)

钉钉二次开发-企业内部系统集成官方OA审批流程(三)

时间:2024-06-07 16:00:44浏览次数:16  
标签:code res setItem OA 系统集成 token localStorage 二次开发 data

书接上回,本文主要分享 企业内部系统集成钉钉官方OA审批流程的步骤 的第二部分。

前端代码集成钉钉免登JSAPI:

前端通过corpid 获得钉钉临时访问码code,再通过临时访问码code调用此接口返回当前用户的姓名、userid、 钉钉用户id、  系统工号、 钉钉部门id列表、 业务系统访问token 等信息,然后将 token 存储到 localStorage。

前端框架使用 react

操作 localStorage 的基础代码

export function getToken(){
    return localStorage.getItem("token") as string
}

export function setToken(token:string){
    localStorage.setItem("token",token)
}

export function removeToken(){
    localStorage.removeItem("token")
}

判断字段是否包含指定的字符串 

export function containsStr(str:string, target:string): boolean{
    str = str === null ? 'str' : str;
    target = target === null ? 'target' : target;
    if(str.indexOf(target) !== -1){
        // 字段str包含指定的字符串
        return true;
    } else {
        // 字段str不包含指定的字符串
        return false;
    }
}

钉钉免登录插件

export class checkLoginPlugin extends Middleware {
  async handler(ctx: MiddlewareContext<{}>, next: () => Promise<any>): Promise<void> {
    // 判断是否获取到了token
    var token = getToken()
    const base_url = import.meta.env.BASE_URL;
    localStorage.setItem("base_url", base_url);
    if (token) {
	  // token有值
      axios({
        method: 'get',
        baseURL: '/sale',
        url: '/api/checkToken?token=' + token,
        headers: {
          'Content-Type': 'application/json',
        },
      }).then((res: AxiosResponse) => {
        if (res.data.code == 200) {
		  // token有效,打开应用
          localStorage.setItem("dingUserId", res.data.dingUserId);
          localStorage.setItem("dingDeptIds", res.data.dingDeptId);
          // 检查当前登录人的角色中是否包含 MANAGER 可以辅助实现数据权限校验
          var role_no = localStorage.getItem("role_no") as string;
          if (containsStr(role_no, "MANAGER")) {
            localStorage.setItem("manager", "true");
          } else {
            localStorage.setItem("manager", "false");
          }
          next()
        } else {               
		  // token无效,钉钉重新获取token,不是钉钉,直接提示未登录
          if (dd.env.platform !== "notInDingTalk") {
			// 钉钉打开应用,重新获取code及token
            const corpid = import.meta.env.CORPID
            dd.ready(() => {
              dd.runtime.permission.requestAuthCode({
                corpId: corpid,
              }).then(
                (result) => {
                  const { code } = result;
                  axios({
                    method: 'get',
                    baseURL: '/sale',
                    url: '/dd/login?code=' + code,
                    headers: {
                      'Content-Type': 'application/json'
                    },
                  }).then((res: AxiosResponse) => {
                    localStorage.setItem("token", res.data.data.token);
                    localStorage.setItem("dingUserId", res.data.data.dingUserId);
                    localStorage.setItem("dingDeptIds", res.data.data.dingDeptIds);
                    localStorage.setItem("user_info", res.data.data.user_info);
                    localStorage.setItem("userno", res.data.data.user_no);
                    localStorage.setItem("user_id", res.data.data.user_id);
                    // 检查当前登录人的角列表是否包含 MANAGER 可以辅助实现数据权限校验
                    var role_no = localStorage.getItem("role_no") as string;
                    if (containsStr(role_no, "MANAGER")) {
                      localStorage.setItem("manager", "true");
                    } else {
                      localStorage.setItem("manager", "false");
                    }
                    token = res.data.data.token;
					// 可以继续访问应用资源
                    next()
                    return res.data.data
                  }).catch(err => {
                    router.navigate("/check")  //登录页
                    return Promise.reject(err)
                  })
                },
              ).catch(err => {
				// 出现异常,跳转到登录页
                router.navigate("/checkLogin")
              });
            });
          } else {
		    // 从钉钉外打开应用,跳转到登录页
            router.navigate("/checkLogin")
          }
        }
      }).catch(err => {
		// 出现异常,跳转到登录页
        router.navigate("/checkLogin")
        return Promise.reject(err)
      })
    } else {
	  // token没有值
      if (dd.env.platform !== "notInDingTalk") {
		// 钉钉打开应用,重新获取钉钉临时code及token
        const corpid = import.meta.env.CORPID
        dd.ready(() => {
          dd.runtime.permission.requestAuthCode({
            corpId: corpid,
          }).then(
            (result) => {
              const { code } = result;
              axios({
                method: 'get',
                baseURL: '/sale',
                url: '/dd/login?code=' + code,
                headers: {
                  'Content-Type': 'application/json'
                },
              }).then((res: AxiosResponse) => {
                localStorage.setItem("usertoken", res.data.data.token);
                localStorage.setItem("dingtalkUserId", res.data.data.dingtalkUserId);
                localStorage.setItem("dingtalkDeptIds", res.data.data.dingtalkDeptIds);
                localStorage.setItem("user_info", res.data.data.user_info);
                localStorage.setItem("userno", res.data.data.user_no);
                localStorage.setItem("user_id", res.data.data.user_id);
                // 检查当前登录人的角色中是否包含 MANAGER 可以辅助实现数据权限校验
                var role_no = localStorage.getItem("role_no") as string;
                if (containsStr(role_no, "MANAGER")) {
                  localStorage.setItem("manager", "true");
                } else {
                  localStorage.setItem("manager", "false");
                }
                token = res.data.data.token;
                next()
                return res.data.data
              }).catch(err => {
				// 出现异常,跳转到登录页
                router.navigate("/checkLogin")
                return Promise.reject(err)
              })
            },
          ).catch(err => {
            // 出现异常,跳转到登录页
			router.navigate("/checkLogin")
          });
        });
      } else {    
		// 从钉钉外打开应用,跳转到登录页
        router.navigate("/checkLogin")
      }
    }

  }

}

标签:code,res,setItem,OA,系统集成,token,localStorage,二次开发,data
From: https://blog.csdn.net/suiusoar/article/details/139527205

相关文章

  • 【护网必备】OA解密|木马免杀|攻击溯源|AI分析|漏洞扫描|内存马
    项目介绍本工具是一款功能强大的网络安全综合工具,旨在为安全从业者、红蓝对抗人员和网络安全爱好者提供全面的网络安全解决方案。它集成了多种实用功能,包括解密、分析、扫描、溯源等,为用户提供了便捷的操作界面和丰富的功能选择。项目优势强大全面:每个功能相较于同类型工具......
  • ChatGPT 无法登录或者提示 Unable to load site 怎么解决?
    登录后遇到这个报错:​添加图片注释,不超过140字(可选)Pleasetryagainlater.IfyouareusingaVPN,tryturningitoff.Checkthestatuspageforinformationonoutages。其他类似的登录问题:打开ChatGPT提示Unabletoloadsite的错误网页提示Oops!W......
  • SOA的发展历史
    1.SOA的发展历程     回顾SOA发展历程,我们把其大致分为了三个阶段,下面将分别介绍每个阶段的重要标准和规范。1.1.萌芽阶段    这一阶段以XML技术为标志,时间大致从20世纪90年代末到21世纪初。XML系W3C所建,源自流行的标准通用标记语言(Standard Generalized......
  • 【VMware vSphere】安装配置Update Manager Download Service(UMDS)作为 vLCM 的下载存
    VMwarevSphereUpdateManagerDownloadService(UMDS)是vSphereLifecycleManager(vLCM)的可选模块。我在之前文章中提到这个功能,当vSphere环境能够连接Internet时,我们可以使用vLCM的在线Internet下载源获取修补程序,当vSphere环境不能连接Internet时,您可以在您的......
  • SpringCloud 负载均衡 spring-cloud-starter-loadbalancer
    简述spring-cloud-starter-loadbalancer是SpringCloud中的一个组件,它提供了客户端负载均衡的功能。在SpringCloud的早期版本中,NetflixRibbon被广泛用作客户端负载均衡器,但随着时间推移和NetflixRibbon进入维护模式,SpringCloud社区开始转向更灵活、更易于维护......
  • Revit二次开发-使用Advanced Installer打包插件安装包
    插件开发属于客户端开发,当我们交付产品给客户的时候,肯定用安装包的形式交付是最佳方案。所以我摸索了一下怎么用AdvancedInstaller来打包插件安装包。AdvancedInstaller简介AdvancedInstaller是一款功能强大且用户友好的Windows安装包制作工具,专门用于创建安装包(MSI、EX......
  • Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)
    SpringBoot不能加载tcnative-2.dll库本文将介绍怎样解决SpringBoot在启动时抛出“org.apache.tomcat.jni.LibraryNotFoundError:Can'tloadlibrary:*\tcnative-2.dll”错误。在使用SpringBoot3创建项目的过程中,将日志的级别调为debug,日志打印了“org.apache.tomca......
  • flutter3-weos手机OS系统|Flutter3.22+Getx仿ios桌面管理OA应用
    原创自研flutter3.x+getx仿制ios手机桌面UI管理系统模板Flutter3-OS。flutter3-osx基于最新跨平台技术Flutter3.22+Dart3.4+GetX+fl_chart实战仿IOS风格手机os管理系统。全新自研flutter磁贴式栅格布局引擎、分屏式多页管理、自定义主题壁纸、卡片式桌面小部件、可拖拽式悬浮球菜......
  • OA-SLAM 笔记
    4.1基于ORB-SLAM2(tracking,localmapping,loopclosure),增加了针对于objects的模块。这些模块使用theellipse/ellipsoidmodelingframework,和points使用相同的策略,即在frames上跟踪objects,以3D的方式估计,插入到地图,然后不断优化。objecttrackingandob......
  • Toast自定义
    一、创建布局文件toast.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wra......