import http from "./http"; import Vue from "vue"; import CryptoJS from "./crypto-js"; /** * 登录方法 */ export const config = { state: () => ({}), mutations: { getConfig(state, params) { for (const key in params) { Vue.set(state, key, user[key]) } }, clearConfig(state) { for (const key in state) { delete state[key] } } }, actions: { agentSign({state, commit}, params) { //授权jssdk在url上使用,并获取corpId let url = window.location.href if (state.agentSignURL == url) { return Promise.resolve() } else { commit("clearConfig") commit("getConfig", {agentSignURL: url}) let action = "/app/wxcp/portal/agentSign" if (!!params?.action) { action = params.action delete params.action } return http.post(action, null, { withoutToken: true, params: {...params, url} }).then(res => { if (res?.data) { let config = { ...params, debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题 corpid: res.data.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致 agentid: res.data.agentId, // 必填,企业微信的应用id (e.g. 1000247) timestamp: Number(res.data.timestamp), // 必填,生成签名的时间戳 nonceStr: res.data.nonceStr, // 必填,生成签名的随机串 signature: res.data.signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法 ...res.data, agentSignURL: url } commit("getConfig", config) return config } }).catch(err => { console.error(err) }) } }, getCode({state, dispatch}, tryAgentSign = false) { let {corpId} = state.config, url = location.href, REDIRECT_URI = encodeURIComponent(url), scope = "snsapi_base" if (/\/AppForm\//.test(location.search)) { scope = "snsapi_userinfo" } return new Promise((resolve, reject) => { if (corpId && scope) { location.replace('https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE#wechat_redirect' .replace(/APPID/g, cid) .replace(/REDIRECT_URI/g, REDIRECT_URI) .replace(/SCOPE/g, scope)) } else if (!tryAgentSign) { dispatch("agentSign").then(() => dispatch("getCode", true)) } else reject("URL缺少必要参数(corpId)") }) }, getToken({state, commit, dispatch}, params) { const encryptByDES = password => { let isIos = uni.getSystemInfoSync().system.toUpperCase == 'ios' let key = "thanks,villcloud" let iv = CryptoJS.enc.Latin1.parse(key) let encrypted = CryptoJS.AES.encrypt(password, iv, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }) if (isIos) { return encodeURIComponent(encrypted.toString()); } else { return encrypted.toString(); } } let {module} = params return http.post("/auth/oauth/token", null, { withoutToken: true, module, params: { ...params, grant_type: 'password', password: encryptByDES(params.password) }, headers: { Authorization: "Basic d2VjaGF0OndlY2hhdA==" } }).then(res => { if (res?.access_token) { return [res?.token_type, res?.access_token].join(" ").trim() } }).catch(err => { uni.showToast({title: err, icon: 'none'}) }) } } } /** * 用户登录信息 */ export const user = { state: () => ({}), mutations: { setUser(state, user) { for (const key in user) { Vue.set(state, key, user[key]) } }, initWaterMarker(state) { const waterMarked = document.querySelector('#waterMarker') if (!waterMarked && state?.name) { const waterMarker = document.createElement('div') waterMarker.id = 'waterMarker' waterMarker.style.position = 'absolute' waterMarker.style.display = 'flex' waterMarker.style.flexWrap = 'wrap' waterMarker.style.overflow = 'hidden' waterMarker.style.justifyContent = 'space-between' waterMarker.style.alignContent = 'flex-start' waterMarker.style.zIndex = '2' waterMarker.style.top = '0' waterMarker.style.color = 'rgba(153,153,153,.2)' waterMarker.style.width = '100%' waterMarker.style.height = '100%' waterMarker.style.pointerEvents = 'none' for (let i = 0; i < 200; i++) { const markerItem = document.createElement('div') markerItem.style.fontSize = '14px' markerItem.style.padding = '30px' markerItem.style.height = '80px' markerItem.style.transform = 'rotate(-20deg)' markerItem.style.flexShrink = '0' markerItem.innerText = state?.name + state?.phone?.slice(-4) || "未授权" waterMarker.appendChild(markerItem) } document.querySelector('uni-page-body')?.appendChild(waterMarker) } // canvas 方案 // const HiDPICanvas = (w, h, ratio) => { // const PIXEL_RATIO = () => { // const c = document.createElement("canvas"), // ctx = c.getContext("2d"), // dpr = window.devicePixelRatio || 1, // bsr = ctx['webkitBackingStorePixelRatio'] || // ctx['mozBackingStorePixelRatio'] || // ctx['msBackingStorePixelRatio'] || // ctx['oBackingStorePixelRatio'] || // ctx['backingStorePixelRatio'] || 1; // // return dpr / bsr; // } // if (!ratio) { // ratio = PIXEL_RATIO(); // } // const can = document.createElement("canvas"); // can.width = w * ratio; // can.height = h * ratio; // can.style.width = w + "px"; // can.style.height = h + "px"; // can.getContext("2d").setTransform(ratio, 0, 0, ratio, 0, 0); // return can // } // if (!waterMarked && state.user?.name) { // const canvas = HiDPICanvas(100, 40) // canvas.style.display = 'none'; // let ctx = canvas.getContext("2d") // ctx.rotate(-20 * Math.PI / 180); // ctx.fillStyle = 'rgba(153,153,153,.3)'; // ctx.textAlign = 'left'; // ctx.textBaseline = 'middle'; // ctx.font = "lighter 7px 'Microsoft YaHei UI',sans-serif" // ctx.fillText(state.user?.name + state.user?.phone?.slice(-4) || "未授权", 0, 30); // const waterMarker = document.createElement('div') // if (waterMarker) { // waterMarker.id = 'waterMarker' // waterMarker.style.position = 'absolute' // waterMarker.style.zIndex = '2' // waterMarker.style.top = '0' // waterMarker.style.width = '100%' // waterMarker.style.height = '100%' // waterMarker.style.pointerEvents = 'none' // waterMarker.style.backgroundImage = "url(" + canvas.toDataURL("image/png") + ")" // document.querySelector('uni-page-body').appendChild(waterMarker) // } // } } }, actions: { getAccount({dispatch, commit}, config) { //获取企业微信后台账号信息 return http.post("/admin/user/detail-phone", null, config).then(res => { if (res?.code == 0) { commit('setUser', res.data) return Promise.all([dispatch('getGridInfo', config)]) } }) }, getGridInfo({commit}, config) { //获取登录着网格员信息 return http.post("/app/appgirdmemberinfo/checkLogOnUser", null, config).then(res => { if (res?.data) { let {girdId, girdMemberId, girdName, checkType: girdCheckType, appGirdInfo: gridInfo} = res.data return commit("setUser", {girdId, girdMemberId, girdName, girdCheckType, gridInfo}) } }) } } } /** * 企微jssdk功能 */ let apiList = [] export const wxwork = { actions: { injectJWeixin({commit, dispatch, state}, ops) { const inject = (jsApiList, config = state.config) => new Promise((resolve, reject) => { setTimeout(() => { let sdk = wx?.agentConfig ? wx : jWeixin sdk?.agentConfig({ ...config, jsApiList, success: res => resolve(res), fail: err => { console.error(err) reject(err) } }) }, 500) }) return new Promise((resolve, reject) => { dispatch("agentSign").then(config => { if (typeof ops == "object") { ops?.map(api => { if (!apiList?.includes(api)) apiList.push(api) }) } else { if (!apiList?.includes(ops)) apiList.push(ops) } inject(apiList, config).then(r => resolve(r)).catch(err => reject(err)) }) }) }, wxInvoke(state, op) { setTimeout(() => { let sdk = typeof wx?.invoke == 'function' ? wx : jWeixin sdk?.invoke(op?.[0], op?.[1], op?.[2]) }, 500) }, previewFile({dispatch}, op) { if (window.navigator.userAgent.indexOf("Windows NT") > -1) { uni.showToast({ title: "企业微信暂不支持PC端的预览文件!", icon: 'none' }) } else { dispatch("injectJWeixin", "previewFile").then(() => { setTimeout(() => { let sdk = typeof wx?.invoke == 'function' ? wx : jWeixin sdk?.invoke('previewFile', {...op}, res => { console.log(res) }) }, 500) }) } }, closeAgent({dispatch}) { dispatch("injectJWeixin", "closeWindow").then(() => { setTimeout(() => { let sdk = typeof wx?.closeWindow == 'function' ? wx : jWeixin sdk?.closeWindow() }, 500) }) }, selectEnterpriseContact({dispatch}, params) { return new Promise((resolve, reject) => { dispatch("injectJWeixin", "selectEnterpriseContact").then(() => { setTimeout(() => { let sdk = typeof wx?.invoke == 'function' ? wx : jWeixin sdk?.invoke("selectEnterpriseContact", { fromDepartmentId: -1, mode: "multi", type: ["user"], ...params }, res => { if (res.err_msg == "selectEnterpriseContact:ok") { if (typeof res.result == 'string') { res.result = JSON.parse(res.result) } resolve(res.result) } else { reject(res) } }) }, 500) }) }) }, selectPrivilegedContact({dispatch}, params) { return new Promise((resolve, reject) => { dispatch("injectJWeixin", "selectPrivilegedContact").then(() => { setTimeout(() => { let sdk = typeof wx?.invoke == 'function' ? wx : jWeixin sdk?.invoke("selectPrivilegedContact", { fromDepartmentId: -1, mode: "multi", ...params }, res => { if (res.err_msg == "selectPrivilegedContact:ok") { if (typeof res.result == 'string') { res.result = JSON.parse(res.result) } resolve(res.result) } else { reject(res) } }) }, 300) }).catch(() => { reject('error') }) }) }, } }