feat(admin): add msh_single_admin project and harden ignore rules
Introduce the new Vue admin project into version control while tightening gitignore patterns to keep env files, logs, build artifacts, and test outputs out of commits. Made-with: Cursor
This commit is contained in:
183
msh_single_admin/src/libs/wechat.js
Executable file
183
msh_single_admin/src/libs/wechat.js
Executable file
@@ -0,0 +1,183 @@
|
||||
// +----------------------------------------------------------------------
|
||||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: CRMEB Team <admin@crmeb.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
import WechatJSSDK from 'wechat-jssdk/dist/client.umd';
|
||||
import { getWechatConfig, wechatAuth } from '@/api/wxApi';
|
||||
import { getToken, removeToken, setToken } from '@/utils/auth';
|
||||
import { parseQuery } from '@/utils';
|
||||
import Cookies from 'js-cookie';
|
||||
const STATE_KEY = 'wx_authorize_state';
|
||||
import store from '@/store';
|
||||
const WX_AUTH = 'wx_auth';
|
||||
const BACK_URL = 'login_back_url';
|
||||
const LOGINTYPE = 'loginType';
|
||||
let instance;
|
||||
let wechatObj;
|
||||
const LONGITUDE = 'user_longitude';
|
||||
const LATITUDE = 'user_latitude';
|
||||
|
||||
const WECHAT_SCRIPT_URL = '//res.wx.qq.com/open/js/jweixin-1.6.0.js';
|
||||
|
||||
/**
|
||||
* 是否是微信
|
||||
*/
|
||||
export function isWeixin() {
|
||||
return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是移动端
|
||||
*/
|
||||
export function isPhone() {
|
||||
return /(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent);
|
||||
}
|
||||
|
||||
export default function wechat() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (instance) return resolve(instance);
|
||||
getWechatConfig()
|
||||
.then((res) => {
|
||||
const _wx = WechatJSSDK(res);
|
||||
wechatObj = _wx;
|
||||
_wx
|
||||
.initialize()
|
||||
.then(() => {
|
||||
instance = _wx.wx;
|
||||
instance.initConfig = res;
|
||||
resolve(instance);
|
||||
})
|
||||
.catch(reject);
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function loginByWxCode(code) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let loginType = getToken();
|
||||
wechatAuth(code)
|
||||
.then((res) => {
|
||||
store.commit('SET_TOKEN', res.token);
|
||||
setToken(res.token);
|
||||
Cookies.set(WX_AUTH, code);
|
||||
resolve(res);
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function getWXCodeByUrl(path, step) {
|
||||
if (getToken()) return;
|
||||
generatorWxUrl(path, step);
|
||||
}
|
||||
|
||||
export function generatorWxUrl(path, step) {
|
||||
wechat()
|
||||
.then((wx) => {
|
||||
window.location.href = getAuthUrl(wx.initConfig, path, step);
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
}
|
||||
|
||||
function getAuthUrl(config, path, step) {
|
||||
const finalUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${
|
||||
config.appId
|
||||
}&redirect_uri=${encodeURIComponent(path)}&response_type=code&scope=snsapi_base&state=${step}#wechat_redirect`;
|
||||
return finalUrl;
|
||||
}
|
||||
|
||||
function getQueryString(name) {
|
||||
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
|
||||
var reg_rewrite = new RegExp('(^|/)' + name + '/([^/]*)(/|$)', 'i');
|
||||
var r = window.location.search.substr(1).match(reg);
|
||||
var q = window.location.pathname.substr(1).match(reg_rewrite);
|
||||
if (r != null) {
|
||||
return unescape(r[2]);
|
||||
} else if (q != null) {
|
||||
return unescape(q[2]);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 公众号事件
|
||||
* @param name 事件名
|
||||
* @param config 配置
|
||||
* @returns {Promise<unknown>}
|
||||
*/
|
||||
export function wechatEvevt(name, config) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let wx;
|
||||
let configDefault = {
|
||||
fail(res) {
|
||||
if (wx) return reject({ is_ready: true, wx: wx });
|
||||
getWechatConfig().then((res) => {
|
||||
wechatObj.signSignature({
|
||||
nonceStr: res.nonceStr,
|
||||
signature: res.signature,
|
||||
timestamp: res.timestamp,
|
||||
});
|
||||
wx = wechatObj.getOriginalWx();
|
||||
reject({ is_ready: true, wx: wx });
|
||||
});
|
||||
},
|
||||
success(res) {
|
||||
resolve(res);
|
||||
},
|
||||
cancel(err) {
|
||||
reject(err);
|
||||
},
|
||||
complete(err) {
|
||||
reject(err);
|
||||
},
|
||||
};
|
||||
Object.assign(configDefault, config);
|
||||
getWechatConfig().then((res) => {
|
||||
const _wx = WechatJSSDK(res);
|
||||
_wx.initialize().then(() => {
|
||||
instance = _wx.getOriginalWx();
|
||||
instance.ready(() => {
|
||||
if (typeof name === 'object') {
|
||||
name.forEach((item) => {
|
||||
instance[item] && instance[item](configDefault);
|
||||
});
|
||||
} else instance[name] && instance[name](configDefault);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function ready() {
|
||||
return new Promise((resolve) => {
|
||||
if (typeof instance !== 'undefined') {
|
||||
instance.ready(() => {
|
||||
resolve(instance);
|
||||
});
|
||||
} else {
|
||||
getWechatConfig().then((res) => {
|
||||
const _wx = WechatJSSDK(res);
|
||||
_wx.initialize().then(() => {
|
||||
instance = _wx.wx;
|
||||
instance.ready(() => {
|
||||
resolve(instance);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user