初始化产品库

This commit is contained in:
aixianling
2021-11-15 10:29:05 +08:00
parent 8f735a4ffe
commit 5440b43b9c
306 changed files with 54508 additions and 3 deletions

338
src/store/index.js Normal file
View File

@@ -0,0 +1,338 @@
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