Files
dvcp_v2_wxcp_app/src/store/index.js
2021-11-15 10:29:05 +08:00

339 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import Vue from 'vue'
import Vuex from 'vuex'
import perState from 'vuex-persistedstate'
import http from '../common/axios'
Vue.use(Vuex)
let agentSignURL = "", apiList = [], agentConfig = {},
apps = [
{name: '调查走访', key: "interview", path: '/interview/interview'},
{name: '工作去向', key: "whereabouts", path: '/whereabouts/whereabouts'},
{name: '随手拍', key: "snapshot", path: '/snapshot/snapshot'},
{name: '随心问', key: "casuallyask", path: '/casuallyask/casuallyask'},
{name: '网上办事', key: "workonline", path: '/workonline/workonline'},
{name: '居民画像', key: "resident", path: '/resident/comp'},
{name: '话术库', key: "quickReply", path: '/quickReply/quickReply'},
{name: '积分超市', key: "supermarket", path: '/supermarket/supermarket'},
{name: '调查问卷', key: "askForm", path: '/askForm/askForm'},
{name: '问卷表单', key: "askFormIndex", path: '/askForm/index'},
{name: '会议通知', key: "meetingNotice", path: '/meetingNotice/meetingNotice'},
{name: '公文流转', key: "documentFlow", path: '/documentFlow/documentFlow'},
{name: '工作任务', key: "workTask", path: '/workTask/workTask'},
{name: '通知公告', key: "notification", path: '/notification/notification'},
{name: '智慧监测', key: "guardianship", path: '/guardianship/guardianship'},
{name: '广播通知', key: "broadcast", path: '/bigHorn/bigHorn'},
{name: '视频监控', key: "videoMonitor", path: '/videoSurveillance/videoSurveillance'},
]
const store = new Vuex.Store({
state: {
token: "",
corpId: "",
baseURL: "",
openUser: {},
dicts: [],
user: {},
apps,
},
mutations: {
login(state, token) {
state.apps = apps
state.token = token
},
logout(state) {
state.token = ""
state.openUser = {}
},
setUser(state, user) {
state.user = user
},
setOpenUser(state, user) {
state.openUser = user
},
getConfig(state, params) {
Object.keys(params).map(e => state[e] = params[e])
},
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))
},
setDicts(state, payload) {
if (payload) {
payload.map(p => {
if (state.dicts.some(d => d.key == p.key)) {
const index = state.dicts.findIndex(d => d.key == p.key)
state.dicts.splice(index, 1)
state.dicts.push(p)
} else {
state.dicts.push(p)
}
})
}
},
redirectCode(state, url = location.href) {
let REDIRECT_URI = encodeURIComponent(url),
corpid = state.corpId || agentConfig?.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.corpId || agentConfig?.corpid
redirectTo(corpid)
})
}
},
initWaterMarker(state) {
const waterMarked = document.querySelector('#waterMarker')
if (!waterMarked && state.user?.name) {
const waterMarker = document.createElement('div')
for (let i = 0; i < 200; i++) {
let 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.user?.name + state.user?.phone?.slice(-4) || "未授权"
waterMarker.appendChild(markerItem)
}
if (waterMarker) {
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'
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: {
getToken(state, code) {
return new Promise((resolve, reject) => {
http.post("/auth/wechatcp/token", {code}, {
withoutToken: true,
headers: {
Authorization: "Basic d2VjaGF0OndlY2hhdA=="
}
}).then(res => {
if (res?.code == 1) {
// 鉴权失败,需要重新绑定账号
} else {
state.commit("login", [res?.token_type, res?.access_token].join(" ").trim())
resolve(state.dispatch("getAccount"))
}
}).catch(() => reject())
})
},
getCode(store, url) {
if (agentConfig?.corpid) {
store.commit('redirectCode', url)
} else {
store.dispatch('agentSign').then(() => {
store.commit('redirectCode', url)
})
}
},
getAccount(state) {
//获取企业微信后台账号信息
return http.post("/admin/user/detail-phone").then(res => {
if (res?.code == 0) {
state.commit('setUser', res.data)
}
})
},
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) {
let url = window.location.href
if (agentSignURL == url) {
return Promise.resolve()
} else {
agentSignURL = url
return http.post("/app/wxcp/portal/agentSign", null, {
params: {url}
}).then(res => {
if (res?.data) {
let 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,
}
agentConfig = params
state.commit("getConfig", {corpId: params.corpid})
}
}).catch(err => {
console.error(err)
})
}
},
injectJWeixin(state, ops) {
const inject = jsApiList => new Promise((resolve, reject) => {
setTimeout(() => {
let sdk = wx?.agentConfig ? wx : jWeixin
sdk?.agentConfig({
...agentConfig, jsApiList,
success: res => resolve(res),
fail: err => {
console.error(err)
reject(err)
}
})
}, 500)
})
return new Promise((resolve, reject) => {
state.dispatch("agentSign").then(() => {
if (typeof ops == "object") {
ops?.map(api => {
if (!apiList?.includes(api)) apiList.push(api)
})
} else {
if (!apiList?.includes(ops)) apiList.push(ops)
}
inject(apiList).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(state, op) {
if (window.navigator.userAgent.indexOf("Windows NT") > -1) {
uni.showToast({
title: "企业微信暂不支持PC端的预览文件!",
icon: 'none'
})
} else {
state.dispatch("injectJWeixin", "previewFile").then(() => {
setTimeout(() => {
let sdk = typeof wx?.invoke == 'function' ? wx : jWeixin
sdk?.invoke('previewFile', {...op}, res => {
console.log(res)
})
}, 500)
})
}
},
closeAgent(state) {
state.dispatch("injectJWeixin", "closeWindow").then(() => {
setTimeout(() => {
let sdk = typeof wx?.closeWindow == 'function' ? wx : jWeixin
sdk?.closeWindow()
}, 500)
})
},
},
getters: {
getDict: state => key => {
if (key && state.dicts.length > 0) {
return state.dicts.find(e => e.key == key)
}
return null
}
},
plugins: [perState({
storage: {
getItem: key => uni.getStorageSync(key),
setItem: (key, value) => uni.setStorageSync(key, value),
removeItem: key => uni.removeStorageSync(key)
}
})]
})
export default store