import {
|
Base64
|
} from 'js-base64';
|
import {
|
wxDecryptData
|
} from '@/common/WXBizDataCrypt.js'
|
|
import {
|
|
login as loginOrg,
|
loginWeChat,
|
loginDingTalk,
|
getDingToken,
|
getWeChatToken,
|
getFileSvrInfo
|
|
} from "./org.js"
|
import {
|
httpRequest,
|
} from "./gungho/index.js"
|
import {
|
token as tokenFeishu,
|
accesstoken as accesstokenFeishu,
|
getCode as getCodeFeishu,
|
getUserInfo as getUserInfoFeishu,
|
|
} from "./request/feishu.js"
|
import {
|
getAuthCode as getDingAuthCode,
|
|
} from "./request/ding.js"
|
|
import {
|
getCode as getCodeWxQy,
|
checkSession as checkSessionWxQy,
|
getMobile as getMobileWxQy,
|
|
} from "./request/wxqy.js"
|
|
import {
|
getUploadUrl,
|
putFile,
|
uploadTask,
|
callback,
|
getDownloadUrl
|
|
} from "./request/minio.js"
|
|
|
export const getDingAutoLoginInfo = () => {
|
return new Promise(async (resolve, reject) => {
|
try {
|
const app = getApp()
|
|
const code = await getDingAuthCode() || ""
|
const tokenRes = await getDingToken()
|
const access_token = tokenRes.token || ""
|
if (!access_token) {
|
return reject("服务端没有配置钉钉应用相关信息,请联系管理员配置!")
|
}
|
app.globalData.dingding = {
|
access_token: access_token,
|
authCode: code,
|
}
|
let sUrl =
|
`https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=${access_token}`
|
let dataStr = `code=${code}`
|
|
let res = await httpRequest(sUrl, "POST", dataStr)
|
const userId = res.userid || ""
|
|
dataStr = `userid=${userId}`
|
sUrl = `https://oapi.dingtalk.com/topapi/v2/user/get?access_token=${access_token}`
|
const user = await httpRequest(sUrl, "POST", dataStr) || {}
|
if (user.mobile) {
|
let sMobile = user.mobile
|
let nFind = user.mobile.indexOf("+86");
|
if (nFind == 0) {
|
sMobile = user.mobile.substr(3)
|
}
|
resolve({
|
user_id: user.userid,
|
mobile: sMobile
|
})
|
|
} else {
|
reject("你没有获取用户ID和手机号权限,请联系管理员开通!")
|
}
|
|
} catch (ex) {
|
reject(ex)
|
}
|
})
|
}
|
|
/**
|
* 钉钉用户自动登录
|
* @returns
|
*/
|
|
export const autoLoginDing = () => {
|
return new Promise(async (resolve, reject) => {
|
try {
|
let info = await getDingAutoLoginInfo()
|
let res = await loginDingTalk(info.user_id, info.mobile)
|
res.mobile = info.mobile
|
res.user_id = info.user_id
|
resolve(res)
|
} catch (ex) {
|
reject(ex)
|
}
|
})
|
}
|
/**
|
* 飞书用户自动登录
|
* @returns
|
*/
|
export const autoLoginFeiShu = () => {
|
return new Promise(async (resolve, reject) => {
|
try {
|
const app = getApp()
|
const code = await getCodeFeishu()
|
const token = await tokenFeishu()
|
if (!token) {
|
return reject("访问飞书失败,请联系小程序开发商!")
|
}
|
const access_token = await accesstokenFeishu(code, token) || ""
|
if (!access_token) {
|
return reject("访问飞书失败,请联系小程序开发商!")
|
}
|
const user = await getUserInfoFeishu(access_token)
|
if (user.mobile) {
|
let sMobile = user.mobile
|
let nFind = user.mobile.indexOf("+86");
|
if (nFind == 0) {
|
sMobile = user.mobile.substr(3)
|
}
|
const res3 = await loginWeChat(user.user_id, sMobile)
|
res3.mobile = sMobile
|
res3.user_id = user.user_id
|
resolve(res3)
|
} else {
|
return reject("你没有获取用户ID和手机号权限,请联系管理员开通!")
|
}
|
|
} catch (ex) {
|
reject(ex)
|
}
|
})
|
}
|
|
/**
|
* 企业微信用户自动登录
|
* @returns
|
*/
|
export const loginWxQy = () => {
|
return new Promise(async (resolve, reject) => {
|
try {
|
const app = getApp()
|
const code = await getCodeWxQy()
|
const tokenRes = await getWeChatToken()
|
const token = tokenRes.token || ""
|
if (!token) {
|
return reject("服务端没有配置企业微信应用相关信息,请联系管理员配置!")
|
}
|
let sUrl =
|
'https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=' +
|
token + '&js_code=' + code + '&grant_type=authorization_code'
|
let dataStr = `code=${code}`
|
const resWx = await httpRequest(sUrl) || {}
|
app.globalData.qyWx.userid = resWx.userid
|
app.globalData.qyWx.session_key = resWx.session_key
|
resolve(resWx)
|
} catch (ex) {
|
reject(ex)
|
}
|
})
|
}
|
|
|
/**
|
* 企业微信用户自动登录
|
* @returns
|
*/
|
export const autoLoginWxQy = () => {
|
return new Promise(async (resolve, reject) => {
|
try {
|
const app = getApp()
|
const bRet = await checkSessionWxQy()
|
if (!bRet) {
|
await loginWxQy()
|
}
|
const res = await getMobileWxQy()
|
const res2 = await wxDecryptData(app.globalData.appid, app.globalData.qyWx
|
.session_key, res
|
.encryptedData, res.iv)
|
const res3 = await loginWeChat(app.globalData.qyWx.userid, res2.mobile)
|
res3.mobile = res2.mobile
|
res3.user_id = user.user_id
|
resolve(res3)
|
} catch (ex) {
|
reject(ex)
|
}
|
})
|
}
|
|
|
/**
|
* 上传文件至minio
|
* @param {*} file
|
*/
|
export const uploadFile3 = (file) => {
|
return new Promise(async (resolve, reject) => {
|
try {
|
// 准备用户信息
|
const app = getApp()
|
const userInfo = app.globalData.userdata
|
// 得到文件服务器信息
|
let fileSFlag = app.globalData.files_flag || userInfo.files_info?.flag
|
const fileSvrInfo = await getFileSvrInfo(fileSFlag)
|
// 准备文件信息
|
let md5 = file.md5
|
// 得到接口地址
|
let ip = fileSvrInfo.exter_ip || fileSvrInfo?.inter_ip
|
let port = fileSvrInfo.exter_port || fileSvrInfo?.inter_port
|
let isSSL = fileSvrInfo?.is_ssl || false
|
let svrUrl = `${isSSL?'https':'http'}://${ip}:${port}`
|
|
if (!ip) throw new Error(`文件服务器“${fileSFlag}”配置不正确,exter_ip为空`)
|
if (!port) throw new Error(`文件服务器“${fileSFlag}”配置不正确,exter_port为空`)
|
// 得到文件上传地址
|
|
|
let uploadUrlInfo = await getUploadUrl(svrUrl, Base64.encode(JSON.stringify(fileSvrInfo
|
.minio)), file
|
.name)
|
// 上传文件
|
|
await putFile(uploadUrlInfo.uldurl, file)
|
|
let res = await callback(
|
svrUrl,
|
uploadUrlInfo.savepath,
|
file.size,
|
file.name,
|
md5,
|
userInfo.user_login,
|
userInfo.user_name,
|
fileSvrInfo.minio.access,
|
fileSvrInfo.minio.secret
|
)
|
// 文件id
|
let {
|
id,
|
createtime
|
} = res
|
let downloadUrlInfo = await getDownloadUrl(svrUrl, Base64.encode(JSON
|
.stringify(fileSvrInfo.minio)),
|
id, file.name)
|
let url = downloadUrlInfo.dldurl
|
resolve({
|
id,
|
filesflag: fileSFlag,
|
name: file.name,
|
url: url,
|
size: file.size,
|
md5,
|
createtime
|
})
|
} catch (ex) {
|
let tip = typeof ex == 'string' ? ex : ex.message
|
console.log(ex)
|
throw new Error(`上传文件至minio服务器失败:${tip}`)
|
}
|
})
|
}
|
|
|
export const uploadFile = async (file, cbSuccess, cbProgress, cbFail) => {
|
try {
|
// 准备用户信息
|
const app = getApp()
|
const userInfo = app.globalData.userdata
|
|
// 得到文件服务器信息
|
let fileSFlag = app.globalData.files_flag || userInfo.files_info?.flag
|
if (!fileSFlag) {
|
return cbFail({
|
errMsg: `未设置文件服务标识`,
|
path: file.path
|
})
|
}
|
const fileSvrInfo = await getFileSvrInfo(fileSFlag)
|
|
// 准备文件信息
|
let md5 = file.md5
|
// 得到接口地址
|
let ip = fileSvrInfo.exter_ip || fileSvrInfo?.inter_ip
|
let port = fileSvrInfo.exter_port || fileSvrInfo?.inter_port
|
let isSSL = fileSvrInfo?.is_ssl || false
|
let svrUrl = `${isSSL?'https':'http'}://${ip}:${port}`
|
if (!ip) {
|
return cbFail({
|
errMsg: `文件服务器“${fileSFlag}”配置不正确,exter_ip为空`,
|
path: file.path
|
})
|
}
|
if (!port) {
|
return cbFail({
|
errMsg: `文件服务器“${fileSFlag}”配置不正确,exter_port为空`,
|
path: file.path
|
})
|
}
|
if (fileSvrInfo?.is_ssl)
|
fileSvrInfo.minio.is_ssl = true
|
// 得到文件上传地址
|
let uploadUrlInfo = await getUploadUrl(svrUrl, Base64.encode(JSON.stringify(fileSvrInfo.minio)), file
|
.name, file.public)
|
|
// 上传文件
|
const task = uploadTask(uploadUrlInfo.uldurl, file, uploadUrlInfo.formdata, async (param) => {
|
// 写数据库
|
let res = await callback(
|
svrUrl,
|
uploadUrlInfo.savepath,
|
file.size,
|
file.name,
|
md5,
|
userInfo.user_login,
|
userInfo.user_name,
|
fileSvrInfo.minio.access,
|
fileSvrInfo.minio.secret
|
)
|
|
// 文件id
|
let {
|
id,
|
createtime
|
} = res
|
|
// let downloadUrlInfo = await getDownloadUrl(svrUrl, Base64.encode(JSON.stringify(
|
// fileSvrInfo.minio)),
|
// id, file.name)
|
let url = file.path // downloadUrlInfo.dldurl
|
if (file.public) {
|
url = `/${uploadUrlInfo.bucketname}/${uploadUrlInfo.savepath}`
|
}
|
|
if (typeof cbSuccess == "function") {
|
console.log(url)
|
cbSuccess({
|
id,
|
filesflag: fileSFlag,
|
name: file.name,
|
url,
|
size: file.size,
|
md5,
|
createtime,
|
savepath: uploadUrlInfo.savepath,
|
})
|
|
}
|
|
}, (param1, param2) => {
|
if (typeof cbProgress == "function") {
|
cbProgress(param1, param2)
|
}
|
}, (param) => {
|
console.log(cbFail)
|
if (typeof cbFail == "function") {
|
cbFail(param)
|
}
|
})
|
return task
|
|
} catch (ex) {
|
let tip = typeof ex == 'string' ? ex : ex.message
|
console.log(ex)
|
cbFail({
|
errMsg: `上传文件至minio服务器失败:${tip}`,
|
path: file.path
|
})
|
}
|
}
|
/**
|
* minio public文件访问地址
|
* @returns
|
*/
|
export const publicFileUrl = async (fileSFlag, subUrl) => {
|
try {
|
|
if (!fileSFlag) return subUrl
|
// 得到文件服务器信息
|
const fileSvrInfo = await getFileSvrInfo(fileSFlag)
|
console.log("publicFileUrl",fileSvrInfo)
|
// 得到接口地址
|
let ip = fileSvrInfo?.minio?.exter_ip || fileSvrInfo?.minio?.inter_ip
|
let port = fileSvrInfo?.minio?.exter_port || fileSvrInfo?.minio?.inter_port
|
let isSSL = fileSvrInfo?.is_ssl || false
|
let svrUrl = `${isSSL?'https':'http'}://${ip}:${port}`
|
if (!ip) return subUrl
|
if (!port) return subUrl
|
let url = `${svrUrl}${subUrl}`
|
return url
|
} catch (ex) {
|
return subUrl
|
}
|
}
|
/**
|
* minio下载文件
|
* @param {*} fileId
|
* @param {*} fileName
|
* @param {*} fileServer
|
* @returns
|
*/
|
export const downloadFileUrl = async (fileId, fileName, fileSFlag) => {
|
try {
|
if (!fileSFlag) throw new Error('未指定文件服务器标识')
|
// 得到文件服务器信息
|
const fileSvrInfo = await getFileSvrInfo(fileSFlag)
|
console.log("downloadFileUrl",fileSvrInfo)
|
// 得到接口地址
|
let ip = fileSvrInfo.exter_ip || fileSvrInfo?.inter_ip
|
let port = fileSvrInfo.exter_port || fileSvrInfo?.inter_port
|
let isSSL = fileSvrInfo?.is_ssl || false
|
let svrUrl = `${isSSL?'https':'http'}://${ip}:${port}`
|
if (!ip) throw new Error(`文件服务器“${fileSFlag}”配置不正确,exter_ip为空`)
|
if (!port) throw new Error(`文件服务器“${fileSFlag}”配置不正确,exter_port为空`)
|
if (fileSvrInfo?.is_ssl)
|
fileSvrInfo.minio.is_ssl = true
|
fileId = fileId.replace("{", "").replace("}", "");
|
// 得到文件下载地址
|
let downloadUrlInfo = await getDownloadUrl(svrUrl, Base64.encode(JSON.stringify(fileSvrInfo.minio)),
|
fileId, fileName)
|
let url = downloadUrlInfo.dldurl
|
return url
|
} catch (ex) {
|
let tip = typeof ex === 'string' ? ex : ex.errMsg || ex.message
|
throw new Error(`minio下载文件失败:${tip}`)
|
}
|
}
|
|
export const downloadFileTask = (url, cbSuccess, cbProgress, cbFail) => {
|
const app = getApp()
|
const downloadTask = uni.downloadFile({
|
url,
|
success: (result) => {
|
//#ifdef MP-MP-WEIXIN || MP-LARK
|
if (result.statusCode === 200) {
|
console.log("downloadTaskFile success", result)
|
var res = {}
|
res.url = url;
|
res.path = result.tempFilePath
|
cbSuccess(res)
|
} else {
|
console.log("downloadTaskFile err", result)
|
var res = {}
|
res.errMsg = result.data || '下载未知错误!';
|
res.url = url;
|
cbFail(res);
|
}
|
return
|
// #endif
|
console.log("downloadTaskFile success", result)
|
var res = {}
|
res.url = url;
|
res.path = result.tempFilePath
|
cbSuccess(res)
|
},
|
fail: (result) => {
|
console.log("downloadTaskFile fail", result)
|
var res = {}
|
res.url = url;
|
res.errMsg = '下载文件失败!';
|
cbFail(res);
|
}
|
})
|
downloadTask.onProgressUpdate((res) => {
|
if (res.progress != null) {
|
console.log('下载进度', res.progress);
|
console.log('已经下载的数据长度', res.totalBytesWritten);
|
console.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite);
|
res.url = url;
|
cbProgress(res, downloadTask)
|
}
|
|
});
|
}
|