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

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

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

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

前端框架使用 react

操作 localStorage 的基础代码

TypeScript 复制代码
export function getToken(){
    return localStorage.getItem("token") as string
}

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

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

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

TypeScript 复制代码
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;
    }
}

钉钉免登录插件

TypeScript 复制代码
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")
      }
    }

  }

}
相关推荐
六月的雨__1 分钟前
跑腿平台小程序的设计
java·sql·学习·小程序
u0104058369 分钟前
实现Java Web应用的高性能负载均衡方案
java·前端·负载均衡
辣香牛肉面19 分钟前
Linux下“/proc”目录的作用
java·linux·服务器
skyshandianxia33 分钟前
java面试八股之MySQL怎么优化查询语句
java·mysql·面试
kussmcx40 分钟前
开始尝试从0写一个项目--后端(一)
java·spring·maven
yogima1 小时前
在Spring Data JPA中使用@Query注解
java·数据库·spring
g32308631 小时前
springboot封装请求参数json的源码解析
spring boot·后端·json
赫萝的红苹果1 小时前
基于Redisson实现分布式锁
java·spring boot·分布式
wang_book1 小时前
redis学习(003 数据结构和通用命令)
java·数据库·redis·学习
英雄汉孑1 小时前
图片压缩代码和实际操作页面
java