import Vue from 'vue' import Vuex from 'vuex' import perState from 'vuex-persistedstate' import http from '../common/axios' import CryptoJS from '../utils/crypto-js' import * as modules from "../common/modules"; Vue.use(Vuex) let agentSignURL = "", apiList = [] const store = new Vuex.Store({ state: { token: "", openUser: {}, config: {}, apps: [] }, mutations: { setApps(state, apps) { state.apps = apps }, login(state, token) { state.token = token }, logout(state) { state.token = "" state.openUser = {} state.user = {} }, setOpenUser(state, user) { state.openUser = user }, getConfig(state, params) { state.config = params }, bindAccount(state, params) { //具备解决二次登录,绑定手机,token等问题 // http.post("/admin/user/cpBindByPhone", params, { http.post("/auth/wechatcp/token", {customerLogin: 1, ...params}, { headers: { Authorization: "Basic d2VjaGF0OndlY2hhdA==" }, withoutToken: true }).then(res => { if (res?.access_token) { params?.then(res) } else alert(res) }).catch(err => alert(err)) }, redirectCode(state, url = location.href) { let REDIRECT_URI = encodeURIComponent(url), corpid = state.config.corpid const redirectTo = cid => { location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base#wechat_redirect' .replace(/CORPID/g, cid) .replace(/REDIRECT_URI/g, REDIRECT_URI) } if (corpid) { redirectTo(corpid) } else { store.dispatch("agentSign").then(() => { corpid = state.config.corpid redirectTo(corpid) }) } }, }, actions: { getToken(state, 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) { state.commit("login", [res?.token_type, res?.access_token].join(" ").trim()) return module != 'AppCountryAlbum' && state.dispatch("getAccount", {module}) } }).catch(err => { uni.showToast({title: err, icon: 'none'}) }) }, getCode(store, url) { if (store.state.config?.corpid) { store.commit('redirectCode', url) } else { store.dispatch('agentSign').then(() => { store.commit('redirectCode', url) }) } }, getUserInfo(state, code) { if (code) { return http.post("/app/wxcp/portal/getUserInfo", null, { params: {code}, withoutToken: true }).then(res => { if (res?.code == 0) { state.commit("setOpenUser", res.data) } }) } else { return http.post("/app/wxcp/wxuser/getUserInfoByToken") .then(res => { if (res?.code == 0) { state.commit("setOpenUser", res.data) } }) } }, agentSign(state, params) { let url = window.location.href if (agentSignURL == url) { return Promise.resolve() } else { agentSignURL = url let action = "/app/wxcp/portal/agentSign" if (sessionStorage.getItem("prj")?.indexOf("saas") > -1) { params = {...params, corpId: "ww596787bb70f08288"} action = "/app/wxcptp/portal/agentSign" } state.commit("getConfig", {}) 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, } state.commit("getConfig", config) return config } }).catch(err => { console.error(err) }) } }, }, modules, plugins: [perState({ storage: { getItem: key => uni.getStorageSync(key), setItem: (key, value) => uni.setStorageSync(key, value), removeItem: key => uni.removeStorageSync(key) } })] }) export default store