提交 ecbdca48 编写于 作者: KK's avatar KK

服务基类

上级 0bcb0659
import axios from 'axios'; import axios from "axios";
import * as dd from 'dingtalk-jsapi'; import * as dd from "dingtalk-jsapi";
import { Util } from '@/ibiz-core/utils'; import { Util } from "@/ibiz-core/utils";
import store from '@/store'; import store from "@/store";
import { Notice } from '../../utils/notice/notice'; import { Notice } from "../../utils/notice/notice";
/** /**
* 钉钉服务 * 钉钉服务
* *
...@@ -10,7 +10,6 @@ import { Notice } from '../../utils/notice/notice'; ...@@ -10,7 +10,6 @@ import { Notice } from '../../utils/notice/notice';
* @class DingTalkService * @class DingTalkService
*/ */
export class DingTalkService { export class DingTalkService {
/** /**
* 提示工具类 * 提示工具类
* *
...@@ -52,7 +51,6 @@ export class DingTalkService { ...@@ -52,7 +51,6 @@ export class DingTalkService {
*/ */
public readonly dd = dd; public readonly dd = dd;
/** /**
* 钉钉是否已经初始化 * 钉钉是否已经初始化
* *
...@@ -89,50 +87,81 @@ export class DingTalkService { ...@@ -89,50 +87,81 @@ export class DingTalkService {
if (DingTalkService.instance) { if (DingTalkService.instance) {
return DingTalkService.instance; return DingTalkService.instance;
} }
this.init();
}
private init() {
const info: string = window.navigator.userAgent.toUpperCase(); const info: string = window.navigator.userAgent.toUpperCase();
if (info.indexOf('DINGTALK') !== -1) { if (info.indexOf("DINGTALK") !== -1) {
this.getAccess_token().then((access_token: any) => {
dd.ready(() => { dd.ready(() => {
this.$isInit = true; this.$isInit = true;
this.dd_ready(); this.dd_ready();
}); });
dd.config({
agentId: access_token.agentId, // 必填,微应用ID
corpId: access_token.corpId, //必填,企业ID
timeStamp: access_token.timeStamp, // 必填,生成签名的时间戳
nonceStr: access_token.nonceStr, // 必填,生成签名的随机串
signature: access_token.signature, // 必填,签名
type: 0, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
jsApiList: [
"device.audio.startRecord",
"device.audio.stopRecord",
"device.audio.onRecordEnd",
"device.audio.translateVoice",
], // 必填,需要使用的jsapi列表,注意:不要带dd。
});
dd.error((err: any) => { dd.error((err: any) => {
alert(`dd加载错误:${JSON.stringify(err)}`); alert(`dd加载错误:${JSON.stringify(err)}`);
}); });
});
} }
} }
/** /**
* 钉钉初始化 * 钉钉初始化
*/ */
private async dd_ready() { private dd_ready() {
// 设置导航标题
// let { issuccess } = await this.login();
this.setNavBack(); this.setNavBack();
// if(issuccess){
// }
} }
/** /**
* 获取access_token * 获取access_token
*/ */
public async getAccess_token() { public async getAccess_token(): Promise<any> {
return new Promise((resolve, reject) => {
let access_token = localStorage.getItem("access_token"); let access_token = localStorage.getItem("access_token");
if (access_token) { if (access_token) {
let reAccess_token: any = JSON.parse(access_token); let reAccess_token: any = JSON.parse(access_token);
// 鉴权信息2小时过期 设置一小时五十分钟 // 鉴权信息2小时过期 设置一小时五十分钟
if (reAccess_token.time && !(new Date().getTime() - reAccess_token.tiem > 5400000)) { if (
return reAccess_token; reAccess_token.time &&
} !(new Date().getTime() - reAccess_token.tiem > 5400000)
} ) {
const reAccess_token: any = await this.get(`/uaa/dingtalk/jsapi/sign`); resolve(reAccess_token);
if(reAccess_token.status == 200){ }
localStorage.setItem("access_token", JSON.stringify(Object.assign(reAccess_token.data, { time: new Date().getTime() }))); }
}else{ const promise: Promise<any> = this.get(`/uaa/dingtalk/jsapi/sign`);
this.notice.error('获取dd签名失败') promise
.then((response: any) => {
if (response && response.status === 200) {
localStorage.setItem(
"access_token",
JSON.stringify(
Object.assign(response.data, { time: new Date().getTime() })
)
);
resolve(response.data);
} else {
resolve(null);
} }
return reAccess_token.data; })
.catch((response: any) => {
console.error(response);
reject(null);
});
});
} }
/** /**
* 钉钉登录 * 钉钉登录
...@@ -140,15 +169,29 @@ export class DingTalkService { ...@@ -140,15 +169,29 @@ export class DingTalkService {
* @memberof DingTalkService * @memberof DingTalkService
*/ */
public async login(): Promise<any> { public async login(): Promise<any> {
const access_token :any= await this.get(`/uaa/open/dingtalk/access_token`); const access_token: any = await this.get(`/uaa/open/dingtalk/access_token`);
if (access_token.status == 200 && access_token.data && access_token.data.corp_id) { if (
localStorage.setItem("access_token", JSON.stringify(Object.assign(access_token, new Date().getTime))); access_token.status == 200 &&
access_token.data &&
access_token.data.corp_id
) {
localStorage.setItem(
"access_token",
JSON.stringify(Object.assign(access_token, new Date().getTime))
);
this.corpId = access_token.data.corp_id; this.corpId = access_token.data.corp_id;
const res: any = await dd.runtime.permission.requestAuthCode({ corpId: this.corpId }); const res: any = await dd.runtime.permission.requestAuthCode({
this.doAuthentication(); corpId: this.corpId,
});
if (res && res.code) { if (res && res.code) {
const userInfo: any = await this.get(`/uaa/open/dingtalk/auth/${res.code}`); const userInfo: any = await this.get(
if (userInfo.status == 200 && userInfo.data.token && userInfo.data.user) { `/uaa/open/dingtalk/auth/${res.code}`
);
if (
userInfo.status == 200 &&
userInfo.data.token &&
userInfo.data.user
) {
localStorage.setItem("token", userInfo.data.token); localStorage.setItem("token", userInfo.data.token);
localStorage.setItem("user", JSON.stringify(userInfo.data.user)); localStorage.setItem("user", JSON.stringify(userInfo.data.user));
return { issuccess: true, message: "" }; return { issuccess: true, message: "" };
...@@ -163,28 +206,6 @@ export class DingTalkService { ...@@ -163,28 +206,6 @@ export class DingTalkService {
} }
} }
/**
* 鉴权
*
* @memberof DingTalkService
*/
private authentication(agentId: string, corpId: string, timeStamp: any, nonceStr: string, signature: any) {
dd.config({
agentId: agentId, // 必填,微应用ID
corpId: corpId,//必填,企业ID
timeStamp: timeStamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature, // 必填,签名
type: 0, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
jsApiList: [
'device.audio.startRecord',
'device.audio.stopRecord',
'device.audio.onRecordEnd',
'device.audio.translateVoice'
] // 必填,需要使用的jsapi列表,注意:不要带dd。
});
}
/** /**
* 开始录音 * 开始录音
* *
...@@ -195,16 +216,15 @@ export class DingTalkService { ...@@ -195,16 +216,15 @@ export class DingTalkService {
onSuccess: (res: any) => { onSuccess: (res: any) => {
res.duration; // 返回音频的时长,单位:秒 res.duration; // 返回音频的时长,单位:秒
}, },
onFail: (err: any) => { onFail: (err: any) => { },
}
}); });
this.dd.device.audio.startRecord({ this.dd.device.audio.startRecord({
onSuccess: () => {//支持最长为300秒(包括)的音频录制,默认60秒(包括)。 onSuccess: () => {
//支持最长为300秒(包括)的音频录制,默认60秒(包括)。
}, },
onFail: (err: any) => { onFail: (err: any) => {
alert(JSON.stringify(err)) alert(JSON.stringify(err));
} },
}); });
} }
...@@ -222,9 +242,9 @@ export class DingTalkService { ...@@ -222,9 +242,9 @@ export class DingTalkService {
resolve(res); resolve(res);
}, },
onFail: (err: any) => { onFail: (err: any) => {
alert(JSON.stringify(err)) alert(JSON.stringify(err));
} },
});; });
}); });
} }
...@@ -244,8 +264,8 @@ export class DingTalkService { ...@@ -244,8 +264,8 @@ export class DingTalkService {
resolve(res); resolve(res);
}, },
onFail: (err: any) => { onFail: (err: any) => {
alert(JSON.stringify(err)) alert(JSON.stringify(err));
} },
}); });
}); });
} }
...@@ -279,13 +299,16 @@ export class DingTalkService { ...@@ -279,13 +299,16 @@ export class DingTalkService {
*/ */
private async get(url: string): Promise<any> { private async get(url: string): Promise<any> {
return new Promise((resolve) => { return new Promise((resolve) => {
axios.get(url).then((response: any) => { axios
.get(url)
.then((response: any) => {
resolve(response); resolve(response);
}).catch((error: any) => { })
.catch((error: any) => {
resolve(error); resolve(error);
console.log('请求异常'); console.log("请求异常");
});
}); });
})
} }
/** /**
...@@ -324,17 +347,21 @@ export class DingTalkService { ...@@ -324,17 +347,21 @@ export class DingTalkService {
*/ */
private setNavBack() { private setNavBack() {
if (Util.isAndroid()) { if (Util.isAndroid()) {
document.addEventListener('backbutton', (e: any) => { document.addEventListener(
"backbutton",
(e: any) => {
e.preventDefault(); e.preventDefault();
this.controlBackEvent(); this.controlBackEvent();
}, false) },
false
);
} else { } else {
dd.biz.navigation.setLeft({ dd.biz.navigation.setLeft({
control: true,//是否控制点击事件,true 控制,false 不控制, 默认false control: true, //是否控制点击事件,true 控制,false 不控制, 默认false
text: '返回', //控制显示文本,空字符串表示显示默认文本 text: "返回", //控制显示文本,空字符串表示显示默认文本
onSuccess: () => { onSuccess: () => {
this.controlBackEvent(); this.controlBackEvent();
} },
}); });
} }
} }
...@@ -366,42 +393,32 @@ export class DingTalkService { ...@@ -366,42 +393,32 @@ export class DingTalkService {
} }
} }
/**
* 鉴权
*/
public async doAuthentication() {
const reAccess_token = await this.getAccess_token();
alert(JSON.stringify(reAccess_token));
this.authentication(reAccess_token.agentId, this.corpId, reAccess_token.data.timeStamp, reAccess_token.data.nonceStr, reAccess_token.data.signature);
}
/** /**
* 钉钉开放事件 * 钉钉开放事件
* *
* @memberof DingTalkService * @memberof DingTalkService
*/ */
public async ddEvent(tag: string, arg: any) { public async ddEvent(tag: string, arg: any) {
if (Object.is(tag, 'startRecord')) { if (Object.is(tag, "startRecord")) {
return this.startRecord(); return this.startRecord();
} }
if (Object.is(tag, 'stopRecord')) { if (Object.is(tag, "stopRecord")) {
return this.stopRecord(); return this.stopRecord();
} }
if (Object.is(tag, 'translateVoice')) { if (Object.is(tag, "translateVoice")) {
return this.translateVoice(arg); return this.translateVoice(arg);
} }
if (Object.is(tag, 'login')) { if (Object.is(tag, "login")) {
return this.login(); return this.login();
} }
if (Object.is(tag, 'setTitle')) { if (Object.is(tag, "setTitle")) {
return this.setTitle(arg); return this.setTitle(arg);
} }
if (Object.is(tag, 'setBackEvent')) { if (Object.is(tag, "setBackEvent")) {
return this.setBackEvent(arg); return this.setBackEvent(arg);
} }
if (Object.is(tag, 'close')) { if (Object.is(tag, "close")) {
return this.close(); return this.close();
} }
} }
} }
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册