|
|
|
import Vue from 'vue'
|
|
|
|
// import MpvueRouterPatch from 'mpvue-router-patch'
|
|
|
|
// Vue.use(MpvueRouterPatch)
|
|
|
|
import {
|
|
|
|
wxappAuth,
|
|
|
|
getUser
|
|
|
|
} from "@/api/user";
|
|
|
|
import store from "../store";
|
|
|
|
import dayjs from "dayjs";
|
|
|
|
import cookie from "@/utils/store/cookie";
|
|
|
|
import stringify from "@/utils/querystring";
|
|
|
|
|
|
|
|
export function dataFormat(time, option) {
|
|
|
|
time = +time * 1000;
|
|
|
|
const d = new Date(time);
|
|
|
|
const now = new Date().getTime();
|
|
|
|
|
|
|
|
const diff = (now - d) / 1000;
|
|
|
|
if (diff < 30) {
|
|
|
|
return "刚刚";
|
|
|
|
} else if (diff < 3600) {
|
|
|
|
// less 1 hour
|
|
|
|
return Math.ceil(diff / 60) + "分钟前";
|
|
|
|
} else if (diff < 3600 * 24) {
|
|
|
|
return Math.ceil(diff / 3600) + "小时前";
|
|
|
|
} else if (diff < 3600 * 24 * 2) {
|
|
|
|
return "1天前";
|
|
|
|
}
|
|
|
|
if (option) {
|
|
|
|
// return parseTime(time, option);
|
|
|
|
} else {
|
|
|
|
let timeStr = d.getFullYear() + "年" + (d.getMonth() + 1) + "月" + d.getDate() + "日" + d.getHours() + "时" + d.getMinutes() +
|
|
|
|
"分"
|
|
|
|
return timeStr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function dataFormatT(time) {
|
|
|
|
time = +time * 1000;
|
|
|
|
const d = new Date(time);
|
|
|
|
|
|
|
|
return (
|
|
|
|
d.getFullYear() +
|
|
|
|
"/" +
|
|
|
|
(d.getMonth() + parseInt(1)) +
|
|
|
|
"/" +
|
|
|
|
d.getDate()
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export function trim(str) {
|
|
|
|
return String.prototype.trim.call(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isType(arg, type) {
|
|
|
|
return Object.prototype.toString.call(arg) === "[object " + type + "]";
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isWeixin() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
export function parseQuery() {
|
|
|
|
var pages = getCurrentPages() //获取加载的页面
|
|
|
|
var currentPage = pages[pages.length - 1] //获取当前页面的对象
|
|
|
|
var url = currentPage.route //当前页面url
|
|
|
|
var options = currentPage.options //如果要获取url中所带的参数可以查看options
|
|
|
|
return options
|
|
|
|
}
|
|
|
|
|
|
|
|
/*获取当前页url*/
|
|
|
|
export function getCurrentPageUrl() {
|
|
|
|
var pages = getCurrentPages() //获取加载的页面
|
|
|
|
var currentPage = pages[pages.length - 1] //获取当前页面的对象
|
|
|
|
var url = currentPage.route //当前页面url
|
|
|
|
return url
|
|
|
|
}
|
|
|
|
|
|
|
|
/*获取当前页带参数的url*/
|
|
|
|
export function getCurrentPageUrlWithArgs() {
|
|
|
|
var pages = getCurrentPages() //获取加载的页面
|
|
|
|
var currentPage = pages[pages.length - 1] //获取当前页面的对象
|
|
|
|
var url = currentPage.route //当前页面url
|
|
|
|
var options = currentPage.options //如果要获取url中所带的参数可以查看options
|
|
|
|
|
|
|
|
//拼接url的参数
|
|
|
|
var urlWithArgs = url + '?'
|
|
|
|
for (var key in options) {
|
|
|
|
var value = options[key]
|
|
|
|
urlWithArgs += key + '=' + value + '&'
|
|
|
|
}
|
|
|
|
urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)
|
|
|
|
|
|
|
|
return urlWithArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
// 复制到剪切板
|
|
|
|
export const copyClipboard = (data) => {
|
|
|
|
uni.setClipboardData({
|
|
|
|
data: data,
|
|
|
|
success: (res) => {
|
|
|
|
uni.showToast({
|
|
|
|
title: '复制成功',
|
|
|
|
icon: 'success',
|
|
|
|
duration: 2000
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export const replaceLogin = (msg) => {
|
|
|
|
uni.hideLoading();
|
|
|
|
uni.showToast({
|
|
|
|
title: msg,
|
|
|
|
icon: 'none',
|
|
|
|
duration: 2000
|
|
|
|
});
|
|
|
|
console.log(Vue.prototype.$deviceType)
|
|
|
|
// 这里代表已经失去登录状态以及401强制推出登录了
|
|
|
|
store.commit('LOGOUT')
|
|
|
|
|
|
|
|
if (Vue.prototype.$deviceType == 'Weixin') {
|
|
|
|
// 如果是微信小程序,跳转到授权页
|
|
|
|
replace({
|
|
|
|
path: '/pages/authorization/index',
|
|
|
|
query: {
|
|
|
|
redirect: `/${getCurrentPageUrl()}`,
|
|
|
|
...parseQuery()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
// 如果不是小程序跳转到登录页
|
|
|
|
replace({
|
|
|
|
path: '/pages/user/Login/index',
|
|
|
|
query: query || {
|
|
|
|
redirect: `/${getCurrentPageUrl()}`,
|
|
|
|
...parseQuery()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const getProvider = () => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
// 获取当前环境的服务商
|
|
|
|
uni.getProvider({
|
|
|
|
service: 'oauth',
|
|
|
|
success: function (res) {
|
|
|
|
console.log(`当前环境的服务商为 | ${res.provider}`)
|
|
|
|
// 此处可以排除h5
|
|
|
|
if (res.provider) {
|
|
|
|
resolve(res.provider[0])
|
|
|
|
}
|
|
|
|
},
|
|
|
|
fail() {
|
|
|
|
reject('获取环境服务商失败')
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}).catch(error => {
|
|
|
|
console.log(error)
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export const authorize = (authorizeStr) => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
uni.authorize({
|
|
|
|
scope: `scope.${authorizeStr}`,
|
|
|
|
success() {
|
|
|
|
resolve('获取授权成功')
|
|
|
|
},
|
|
|
|
fail() {
|
|
|
|
reject('获取授权失败')
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}).catch(error => {
|
|
|
|
console.log(error)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export const login = (option) => {
|
|
|
|
console.log('调用登录')
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
getProvider().then(provider => {
|
|
|
|
// 调用登录接口
|
|
|
|
uni.login({
|
|
|
|
provider: provider,
|
|
|
|
success: function (loginRes) {
|
|
|
|
// 微信登录
|
|
|
|
console.log(`获取code | ${loginRes.code}`)
|
|
|
|
let code = loginRes.code;
|
|
|
|
// 检查授权, 检查用户信息授权
|
|
|
|
authorize('userInfo').then(() => {
|
|
|
|
uni.getUserInfo({
|
|
|
|
provider: provider,
|
|
|
|
success: function (user) {
|
|
|
|
console.log(user)
|
|
|
|
console.log(`用户昵称为 | ${user.userInfo.nickName}`);
|
|
|
|
console.log(`当前的环境 | ${Vue.prototype.$deviceType}`)
|
|
|
|
if (Vue.prototype.$deviceType == 'Weixin') {
|
|
|
|
wxappAuth({
|
|
|
|
encryptedData: user.encryptedData,
|
|
|
|
iv: user.iv,
|
|
|
|
code: code,
|
|
|
|
spread: cookie.get("spread")
|
|
|
|
}).then(({
|
|
|
|
data
|
|
|
|
}) => {
|
|
|
|
console.log('登录成功')
|
|
|
|
console.log(data)
|
|
|
|
console.log('登录成功1')
|
|
|
|
|
|
|
|
resolve(data)
|
|
|
|
console.log('登录成功3')
|
|
|
|
|
|
|
|
uni.hideLoading();
|
|
|
|
console.log('登录成功4')
|
|
|
|
store.commit("LOGIN", data.token, dayjs(data.expires_time));
|
|
|
|
console.log('登录成功5')
|
|
|
|
|
|
|
|
getUser().then(res => {
|
|
|
|
store.dispatch('changeUserInfo', {
|
|
|
|
user: res.data
|
|
|
|
})
|
|
|
|
console.log('登录成功6')
|
|
|
|
console.log(option)
|
|
|
|
// option && option.success ? option.success() : null
|
|
|
|
var pages = getCurrentPages() //获取加载的页面
|
|
|
|
console.log('登录成功7')
|
|
|
|
|
|
|
|
var currentPage = pages[pages.length - 1] //获取当前页面的对象
|
|
|
|
let url = "/pages/home/index"
|
|
|
|
let query = {}
|
|
|
|
console.log('登录成功8')
|
|
|
|
console.log(currentPage)
|
|
|
|
|
|
|
|
if (currentPage) {
|
|
|
|
// 获取到最后一个页面
|
|
|
|
if (
|
|
|
|
currentPage.route != 'pages/Loading/index'
|
|
|
|
&&
|
|
|
|
currentPage.route != 'pages/user/Login/index'
|
|
|
|
) {
|
|
|
|
url = currentPage.route
|
|
|
|
}
|
|
|
|
if (currentPage.route == 'pages/authorization/index') {
|
|
|
|
const {
|
|
|
|
redirect,
|
|
|
|
...querys
|
|
|
|
} = currentPage.options
|
|
|
|
url = redirect
|
|
|
|
query = {
|
|
|
|
...querys
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
console.log('登录成功9')
|
|
|
|
console.log({
|
|
|
|
path: url,
|
|
|
|
query
|
|
|
|
})
|
|
|
|
switchTab({
|
|
|
|
path: `${url}`,
|
|
|
|
query
|
|
|
|
});
|
|
|
|
})
|
|
|
|
|
|
|
|
}).catch(error => {
|
|
|
|
reject()
|
|
|
|
console.log('微信登录失败')
|
|
|
|
console.log(error)
|
|
|
|
handleFail(option, '微信登录失败')
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
fail() {
|
|
|
|
// 获取用户信息失败
|
|
|
|
reject()
|
|
|
|
handleFail(option, '获取用户信息失败')
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}).catch(error => {
|
|
|
|
reject()
|
|
|
|
console.log(error)
|
|
|
|
handleFail(option, '拒绝授权')
|
|
|
|
})
|
|
|
|
},
|
|
|
|
fail() {
|
|
|
|
// 调用登录接口失败
|
|
|
|
reject()
|
|
|
|
handleFail(option, '登录失败')
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}).catch(error => {
|
|
|
|
reject()
|
|
|
|
console.log(error)
|
|
|
|
handleFail(option, '获取环境服务商失败')
|
|
|
|
})
|
|
|
|
}).catch(error => {
|
|
|
|
console.log(error)
|
|
|
|
handleFail(option, '登录失败')
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleFail = (option, msg) => {
|
|
|
|
// 此处是处理登录失效的问题的
|
|
|
|
console.log(store)
|
|
|
|
option && option.fail ? option.fail() : replaceLogin('登录失败,请重新登录')
|
|
|
|
}
|
|
|
|
|
|
|
|
export function parseUrl(location) {
|
|
|
|
if (typeof location === 'string') return location
|
|
|
|
const {
|
|
|
|
path,
|
|
|
|
query
|
|
|
|
} = location
|
|
|
|
const queryStr = stringify(query)
|
|
|
|
|
|
|
|
if (!queryStr) {
|
|
|
|
return path
|
|
|
|
}
|
|
|
|
|
|
|
|
return `${path}?${queryStr}`
|
|
|
|
}
|
|
|
|
|
|
|
|
export function parseRoute($mp) {
|
|
|
|
const _$mp = $mp || {}
|
|
|
|
const path = _$mp.page && _$mp.page.route
|
|
|
|
return {
|
|
|
|
path: `/${path}`,
|
|
|
|
params: {},
|
|
|
|
query: _$mp.query,
|
|
|
|
hash: '',
|
|
|
|
fullPath: parseUrl({
|
|
|
|
path: `/${path}`,
|
|
|
|
query: _$mp.query
|
|
|
|
}),
|
|
|
|
name: path && path.replace(/\/(\w)/g, ($0, $1) => $1.toUpperCase())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export const handleLoginStatus = (location, complete, fail, success) => {
|
|
|
|
console.log(location, '开始健全')
|
|
|
|
// 不登录可访问的页面
|
|
|
|
let page = [{
|
|
|
|
path: '/pages/Loading/index',
|
|
|
|
name: 'loading页面'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
path: '/pages/home/index',
|
|
|
|
name: '首页'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
path: '/pages/user/Login/index',
|
|
|
|
name: '登录页面'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
path: '/pages/authorization/index',
|
|
|
|
name: '授权页面'
|
|
|
|
},
|
|
|
|
]
|
|
|
|
|
|
|
|
// 是否可以访问
|
|
|
|
let isAuth = false
|
|
|
|
|
|
|
|
// 从 location 中获取当前url,location typeof string || object
|
|
|
|
let path = ''
|
|
|
|
if (typeof location === 'string') {
|
|
|
|
path = location
|
|
|
|
} else {
|
|
|
|
path = location.path
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(store.getters.userInfo, '用户信息')
|
|
|
|
if (!store.getters.userInfo.uid) {
|
|
|
|
page.map((item) => {
|
|
|
|
console.log(item.path == path)
|
|
|
|
if (item.path == path) {
|
|
|
|
isAuth = true
|
|
|
|
}
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
isAuth = true
|
|
|
|
}
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
if (isAuth) {
|
|
|
|
console.log('有权限')
|
|
|
|
// 登录了有权限
|
|
|
|
console.log({
|
|
|
|
url: parseUrl(location),
|
|
|
|
complete,
|
|
|
|
fail,
|
|
|
|
success
|
|
|
|
})
|
|
|
|
resolve({
|
|
|
|
url: parseUrl(location),
|
|
|
|
complete,
|
|
|
|
fail,
|
|
|
|
success
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
console.log('无权限')
|
|
|
|
// 未登录没有权限
|
|
|
|
replaceLogin()
|
|
|
|
reject()
|
|
|
|
}
|
|
|
|
}).catch(error => {
|
|
|
|
console.log(error)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export function push(location, complete, fail, success) {
|
|
|
|
handleLoginStatus(location, complete, fail, success).then(params => {
|
|
|
|
console.log(params)
|
|
|
|
uni.navigateTo(params)
|
|
|
|
}).catch(error => {
|
|
|
|
// 没有权限
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export function replace(location, complete, fail, success) {
|
|
|
|
handleLoginStatus(location, complete, fail, success).then(params => {
|
|
|
|
console.log(params)
|
|
|
|
uni.redirectTo(params)
|
|
|
|
}).catch(error => {
|
|
|
|
// 没有权限
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export function go(delta) {
|
|
|
|
uni.navigateBack({
|
|
|
|
delta
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export function back() {
|
|
|
|
uni.navigateBack({
|
|
|
|
delta: 1,
|
|
|
|
success: function (e) { },
|
|
|
|
fail: function (e) { }
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
export function switchTab(location, complete, fail, success) {
|
|
|
|
console.log(location)
|
|
|
|
handleLoginStatus(location, complete, fail, success).then(params => {
|
|
|
|
console.log(params)
|
|
|
|
uni.switchTab(params)
|
|
|
|
}).catch(error => {
|
|
|
|
// 没有权限
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export const _router = {
|
|
|
|
mode: 'history',
|
|
|
|
switchTab,
|
|
|
|
push,
|
|
|
|
replace,
|
|
|
|
go,
|
|
|
|
back
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function handleQrCode() {
|
|
|
|
try {
|
|
|
|
var urlSpread = parseQuery()["q"];
|
|
|
|
if (urlSpread) {
|
|
|
|
// 通过海报二维码进来
|
|
|
|
urlSpread = urlSpread
|
|
|
|
.split("%3F")[1]
|
|
|
|
.replace(/%3D/g, ":")
|
|
|
|
.replace(/%26/g, ",")
|
|
|
|
.split(",")
|
|
|
|
.map((item, index) => {
|
|
|
|
item = item.split(":");
|
|
|
|
return `"${item[0]}":"${item[1]}"`;
|
|
|
|
})
|
|
|
|
.join(",");
|
|
|
|
urlSpread = JSON.parse("{" + urlSpread + "}");
|
|
|
|
return urlSpread
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
} catch {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const getImageInfo = (images) => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
let imageAry = {}
|
|
|
|
images.map((item, index) => {
|
|
|
|
uni.getImageInfo({
|
|
|
|
src: item,
|
|
|
|
fail: function (res) {
|
|
|
|
imageAry[index] = null
|
|
|
|
console.log(res)
|
|
|
|
if (imageAry.length == images.length) {
|
|
|
|
resolve(imageAry)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
success: function (res) {
|
|
|
|
imageAry[index] = res
|
|
|
|
console.log(res)
|
|
|
|
if (Object.keys(imageAry).length == images.length) {
|
|
|
|
resolve(imageAry)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取分享海报
|
|
|
|
* @param array store 海报素材
|
|
|
|
* @param string store_name 素材文字
|
|
|
|
* @param string price 价格
|
|
|
|
* @param function successFn 回调函数
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const PosterCanvas = (store, successCallBack) => {
|
|
|
|
uni.showLoading({
|
|
|
|
title: '海报生成中',
|
|
|
|
mask: true
|
|
|
|
});
|
|
|
|
getImageInfo([store.image, store.code]).then(res => {
|
|
|
|
let contentHh = 48 * 1.3
|
|
|
|
const ctx = uni.createCanvasContext('myCanvas');
|
|
|
|
ctx.clearRect(0, 0, 0, 0);
|
|
|
|
const WIDTH = 747
|
|
|
|
const HEIGHT = 1326;
|
|
|
|
ctx.fillStyle = "#FFFFFF";
|
|
|
|
ctx.fillRect(0, 0, WIDTH, HEIGHT);
|
|
|
|
ctx.drawImage(res[1].path, 40, 1064, 200, 200);
|
|
|
|
ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH);
|
|
|
|
ctx.save();
|
|
|
|
let r = 90;
|
|
|
|
let d = r * 2;
|
|
|
|
let cx = 40;
|
|
|
|
let cy = 990;
|
|
|
|
ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI);
|
|
|
|
ctx.clip();
|
|
|
|
ctx.restore();
|
|
|
|
ctx.setTextAlign('center');
|
|
|
|
ctx.setFontSize(48);
|
|
|
|
ctx.setFillStyle('#000');
|
|
|
|
ctx.fillText(store.title, WIDTH / 2, 810 + contentHh);
|
|
|
|
ctx.setTextAlign('center')
|
|
|
|
ctx.setFontSize(32);
|
|
|
|
ctx.setFillStyle('red');
|
|
|
|
ctx.fillText('¥' + store.price, WIDTH / 2, 985);
|
|
|
|
ctx.setTextAlign('center')
|
|
|
|
ctx.setFontSize(22);
|
|
|
|
ctx.setFillStyle('#333333');
|
|
|
|
ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167);
|
|
|
|
// ctx.drawImage(store.code, 199, 1064, 200, 200);
|
|
|
|
ctx.save();
|
|
|
|
ctx.draw(true, function (oi) {
|
|
|
|
uni.canvasToTempFilePath({
|
|
|
|
canvasId: 'myCanvas',
|
|
|
|
fileType: 'png',
|
|
|
|
destWidth: WIDTH,
|
|
|
|
destHeight: HEIGHT,
|
|
|
|
success: function (res) {
|
|
|
|
uni.hideLoading();
|
|
|
|
successCallBack && successCallBack(res.tempFilePath);
|
|
|
|
},
|
|
|
|
fail: function (error) {
|
|
|
|
console.log(error)
|
|
|
|
},
|
|
|
|
|
|
|
|
})
|
|
|
|
});
|
|
|
|
})
|
|
|
|
|
|
|
|
// uni.getImageInfo({
|
|
|
|
// src: store.image,
|
|
|
|
// fail: function (res) {
|
|
|
|
// uni.showToast({
|
|
|
|
// title: '海报生成失败',
|
|
|
|
// icon: "none",
|
|
|
|
// duration: 2000
|
|
|
|
// });
|
|
|
|
// },
|
|
|
|
// success: function (res) {
|
|
|
|
|
|
|
|
// }
|
|
|
|
// })
|
|
|
|
}
|