fix: 微信登录补充保存username和role
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Agent
2026-04-04 07:35:21 +00:00
parent 756444ef2b
commit d12eea7693
10597 changed files with 817047 additions and 3 deletions

View File

@@ -0,0 +1,327 @@
const EventType = {
Load: 'load',
Close: 'close',
Error: 'error'
}
export default {
props: {
options: {
type: [Object, Array],
default () {
return {}
}
},
adpid: {
type: [Number, String],
default: ''
},
preload: {
type: [Boolean, String],
default: true
},
loadnext: {
type: [Boolean, String],
default: false
}
},
watch: {
adpid (val) {
if (val) {
this._loadData(val)
}
}
},
data () {
return {
loading: false,
errorMessage: null
}
},
created () {
this._pc = {}
this._pl = []
this._loadData()
},
methods: {
load () {
this._dispatchEvent(EventType.Load, {})
},
show () {
this.errorMessage = null
const data = this._pl[0]
const providerConfig = this._pc[data.a1][data.t]
AdScript.instance.load(data.t, providerConfig.script, () => {
this._renderData(data)
}, (err) => {
this.errorMessage = err.message
this._dispatchEvent(EventType.Error, err)
})
},
_onclick () {
this.show()
},
_loadData (adpid) {
this.loading = true
const id = adpid || this.adpid
AdConfig.instance.get(id, (a, b) => {
this._pc = a
this._pl = b
this.loading = false
}, (err) => {
this.loading = false
this.errorMessage = err
this._dispatchEvent(EventType.Error, err)
})
},
_renderData (data) {
const id = this._createView()
const coral = new window.CoralAdv({
app_id: data.a2,
placement_id: data.a3,
type: data.a4,
display_type: data.a5,
container_id: id,
count: 1
})
coral.ready().then(async (res) => {
if (res.ret === 0) {
} else {
this._dispatchEvent(EventType.Error, res)
}
}).catch((err) => {
this._dispatchEvent(EventType.Error, err)
})
},
_dispatchEvent (type, data) {
this.$emit(type, {
detail: data
})
},
_createView () {
const id = this._randomId()
const adView = document.createElement('div')
adView.setAttribute('id', id)
this.$refs.container.innerHTML = ''
this.$refs.container.append(adView)
return id
},
_randomId () {
let result = ''
for (let i = 0; i < 4; i++) {
result += (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
}
return '_u' + result
}
}
}
// let IC = 0
// let IS = 0
class AdConfig {
static get instance () {
if (this._instance == null) {
this._instance = new AdConfig()
this._instance._init()
}
return this._instance
}
constructor () {
this._instance = null
this._adConfig = null
this._isLoading = false
this._lastError = null
this._callbacks = []
}
get adConfig () {
return this._adConfig
}
get isExpired () {
if (this._adConfig == null) {
return true
}
return (Math.abs(Date.now() - this._adConfig.last) > this.CACHE_TIME)
}
_init () {
var config = this._getConfig()
if (config === null || !config.last) {
return
}
if (!this.isExpired) {
this._adConfig = config.data
}
}
get (adpid, success, fail) {
// IC++
if (this._adConfig != null) {
this._doCallback(adpid, success, fail)
if (this.isExpired) {
this._loadAdConfig(adpid)
}
return
}
this._callbacks.push({
adpid: adpid,
success: success,
fail: fail
})
this._loadAdConfig(adpid)
}
_doCallback (adpid, success, fail) {
// IS++
var { a, b } = this._adConfig
if (a[adpid]) {
success(b, a[adpid])
} else {
fail(this.ERROR_INVALID_ADPID)
}
}
_loadAdConfig (adpid) {
if (this._isLoading === true) {
return
}
this._isLoading = true
uni.request({
url: this.URL,
method: 'GET',
timeout: 8000,
data: {
d: location.hostname,
a: adpid
},
dataType: 'json',
success: (res) => {
const rd = res.data
if (rd.ret === 0) {
const data = rd.data
this._adConfig = data
this._setConfig(data)
this._callbacks.forEach(({ adpid, success, fail }) => {
this._doCallback(adpid, success, fail)
})
} else {
this._callbacks.forEach((i) => {
i.fail({ errCode: rd.ret, errMsg: rd.msg })
})
}
this._callbacks = []
},
fail: (err) => {
this._callbacks.forEach((i) => {
i.fail(err)
})
this._callbacks = []
},
complete: (c) => {
this._isLoading = false
}
})
}
_getConfig () {
if (!navigator.cookieEnabled || !window.localStorage) {
return null
}
var data = localStorage.getItem(this.KEY)
return data ? JSON.parse(data) : null
}
_setConfig (data) {
if (!navigator.cookieEnabled || !window.localStorage) {
return null
}
localStorage.setItem(this.KEY, JSON.stringify({
last: Date.now(),
data: data
}))
}
}
Object.assign(AdConfig.prototype, {
URL: 'https://hac1.dcloud.net.cn/ah5',
KEY: 'uni_app_ad_config',
CACHE_TIME: 1000 * 60 * 10,
ERROR_INVALID_ADPID: {
'-5002': 'invalid adpid'
}
})
class AdScript {
static get instance () {
if (this._instance == null) {
this._instance = new AdScript()
}
return this._instance
}
constructor () {
this._instance = null
this._callback = {}
this._cache = {}
}
load (provider, script, success, fail) {
if (this._cache[provider] === undefined) {
this.loadScript(provider, script)
}
if (this._cache[provider] === 1) {
success()
} else {
if (!this._callback[provider]) {
this._callback[provider] = []
}
this._callback[provider].push({
success,
fail
})
}
}
loadScript (provider, script) {
this._cache[provider] = 0
var ads = document.createElement('script')
ads.setAttribute('id', 'uniad_provider' + provider)
for (const var1 in script) {
ads.setAttribute(var1, script[var1])
}
ads.onload = () => {
this._cache[provider] = 1
this._callback[provider].forEach(({ success }) => {
success()
})
this._callback[provider].length = 0
}
ads.onerror = (err) => {
this._cache[provider] = undefined
this._callback[provider].forEach(({ fail }) => {
fail(err)
})
this._callback[provider].length = 0
}
document.body.append(ads)
}
}

View File

@@ -0,0 +1,367 @@
const adPlugin = requirePlugin("uni-ad");
const EventType = {
Load: 'load',
Close: 'close',
Error: 'error'
}
const AdType = {
Banner: "banner",
RewardedVideo: "rewardedVideo",
Interstitial: "interstitial"
}
const ProviderType = {
WeChat: 10018,
UserWeChat: 10017,
ShanHu: 10020
}
export default {
props: {
options: {
type: [Object, Array],
default () {
return {}
}
},
adpid: {
type: [Number, String],
default: ''
},
unitId: {
type: [Number, String],
default: ''
},
preload: {
type: [Boolean, String],
default: true
},
loadnext: {
type: [Boolean, String],
default: false
},
urlCallback: {
type: Object,
default () {
return {}
}
}
},
data () {
return {
loading: false,
userwx: false,
userUnitId: "",
wxchannel: false,
errorMessage: null
}
},
created () {
this._ad = null
this._loading = false
this._wxRewardedAd = null
this._wxInterstitialAd = null
this._providerType = ProviderType.ShanHu
if (this.preload && this._canCreateAd()) {
this.load()
}
},
methods: {
load () {
if (this.loading) {
return
}
this._startLoading()
if (this._providerType == ProviderType.ShanHu) {
} else if (this._providerType == ProviderType.WeChat) {
this.selectComponent('.uniad-plugin-wx').load()
} else if (this._providerType == ProviderType.UserWeChat) {
this._loadWxAd()
}
},
show (e) {
this.errorMessage = null
if (this._providerType == ProviderType.ShanHu) {
this._showAdInPlugin(this.selectComponent('.uniad-plugin'))
} else if (this._providerType == ProviderType.WeChat) {
this._showAdInPlugin(this.selectComponent('.uniad-plugin-wx'))
} else if (this._providerType == ProviderType.UserWeChat) {
this._showWxAd(e)
}
},
_onclick () {
this.show()
},
_startLoading () {
this.loading = true
this.errorMessage = null
},
_canCreateAd () {
let result = false
if (typeof this.adpid === 'string' && this.adpid.length > 0) {
result = true
} else if (typeof this.adpid === 'number') {
result = true
}
return result
},
_hasCallback () {
return (typeof this.urlCallback === 'object' && Object.keys(this.urlCallback).length > 0)
},
_onmpload (e) {
this.loading = false
this._dispatchEvent(EventType.Load, {})
},
_onmpclose (e) {
this._dispatchEvent(EventType.Close, e.detail)
if (e.detail.adsdata) {
const adv = e.detail.adv
const adsdata = e.detail.adsdata
const version = e.detail.version
/* eslint-disable no-undef */
uniCloud.callFunction({
name: 'uniAdCallback',
data: {
adv: adv,
adsdata: adsdata,
version: version
},
secretType: 'both',
success: (res) => {
},
fail: (err) => {
this._dispatchEvent(EventType.Error, err)
}
})
delete e.detail.adv
delete e.detail.adsdata
delete e.detail.version
}
},
_onmperror (e) {
this.loading = false
this.errorMessage = JSON.stringify(e.detail)
this._dispatchEvent(EventType.Error, e.detail)
},
_onnextchannel (e) {
this.wxchannel = true
const adData = e.detail[0];
this.$nextTick(() => {
if (adData.provider == 10017) {
this._providerType = ProviderType.UserWeChat
switch(adData._nt_) {
case 4:
this.wxAdType = AdType.Banner
this.userwx = true
this.userUnitId = adData.posid
break;
case 9:
this.wxAdType = AdType.RewardedVideo
this._createRewardedAd(adData.posid)
break;
case 15:
this.wxAdType = AdType.Interstitial
this._createInterstitialAd(adData.posid)
break;
}
} else if (adData.provider == 10018) {
this._providerType = ProviderType.WeChat
this.selectComponent('.uniad-plugin-wx').setConfig(adData)
}
})
},
_onwxchannelerror(e) {
this.wxchannel = false
this.$nextTick(() => {
this._providerType = ProviderType.ShanHu
this.selectComponent('.uniad-plugin').shanhuChannel()
})
},
_dispatchEvent (type, data) {
this.$emit(type, {
detail: data
})
},
_showAdInPlugin(adComponent) {
if (this._hasCallback()) {
const userCryptoManager = wx.getUserCryptoManager()
userCryptoManager.getLatestUserKey({
success: ({
encryptKey,
iv,
version,
expireTime
}) => {
adComponent.show({
userId: this.urlCallback.userId || '',
extra: this.urlCallback.extra || '',
encryptKey,
iv,
version,
expireTime
})
},
fail: (err) => {
this._dispatchEvent(EventType.Error, err)
}
})
} else {
adComponent.show({
userId: this.urlCallback.userId || '',
extra: this.urlCallback.extra || ''
})
}
},
_loadWxAd () {
switch (this.wxAdType) {
case AdType.RewardedVideo:
if (this._wxRewardedAd) {
this._wxRewardedAd.load();
}
break;
case AdType.Interstitial:
if (this._wxInterstitialAd) {
this._wxInterstitialAd.load();
}
break;
}
},
// 加载/显示广告
_showWxAd (options) {
this._urlCallback = options || this.urlCallback;
if (this.loading == true) {
this._userInvokeShowFlag = true
return
}
switch (this.wxAdType) {
case AdType.RewardedVideo:
if (!this._wxRewardedAd) {
return;
}
this._wxRewardedAd.show().catch((err) => {
this._wxRewardedAd.load().then(() => {
this._wxRewardedAd.show();
}).catch((err) => {
this._dispatchEvent(EventType.Error, err);
});
});
break;
case AdType.Interstitial:
if (!this._wxInterstitialAd) {
return;
}
this._wxInterstitialAd.show().catch((err) => {
this._wxInterstitialAd.load().then(() => {
this._wxInterstitialAd.show();
}).catch((err) => {
this._dispatchEvent(EventType.Error, err);
});
});
break;
}
},
// 微信激励视频
_createRewardedAd(adUnitId) {
if (this._wxRewardedAd) {
return;
}
this._wxRewardedAd = wx.createRewardedVideoAd({ adUnitId: adUnitId, multiton: true });
this._wxRewardedAd.onLoad(() => {
this.loading = false
this._dispatchEvent(EventType.Load, {})
if (this._userInvokeShowFlag) {
this._userInvokeShowFlag = false;
this._wxRewardedAd.show();
}
});
this._wxRewardedAd.onError(err => {
this.loading = false
this._dispatchEvent(EventType.Error, err);
});
this._wxRewardedAd.onClose(res => {
if (res.isEnded) {
this._callServer()
} else {
this._dispatchEvent(EventType.Close, res);
}
});
this.loading = true
},
// 微信插屏
_createInterstitialAd(adUnitId) {
if (this._wxInterstitialAd) {
return;
}
this._wxInterstitialAd = wx.createInterstitialAd({ adUnitId: adUnitId });
this._wxInterstitialAd.onLoad(() => {
this.loading = false
this._dispatchEvent(EventType.Load, {})
if (this._userInvokeShowFlag) {
this._userInvokeShowFlag = false;
this._wxInterstitialAd.show();
}
});
this._wxInterstitialAd.onError(err => {
this.loading = false
this._dispatchEvent(EventType.Error, err);
});
this._wxInterstitialAd.onClose(res => {
this._dispatchEvent(EventType.Close, res);
});
this.loading = true
},
_callServer() {
const userCryptoManager = wx.getUserCryptoManager()
userCryptoManager.getLatestUserKey({
success: (encryptConfig) => {
const callbackData = adPlugin.buildCallbackData(this.adpid, this.urlCallback, {}, encryptConfig)
uniCloud.callFunction({
name: 'uniAdCallback',
data: callbackData,
secretType: 'both',
success: (res) => {
this._dispatchEvent(EventType.Close, res);
},
fail: (err) => {
this._dispatchEvent(EventType.Error, err);
}
})
},
fail: (err) => {
this._dispatchEvent(EventType.Error, err);
}
})
}
}
}

View File

@@ -0,0 +1,159 @@
const EventType = {
Load: 'load',
Close: 'close',
Error: 'error'
}
export default {
props: {
options: {
type: [Object, Array],
default () {
return {}
}
},
adpid: {
type: [Number, String],
default: ''
},
unitId: {
type: [Number, String],
default: ''
},
preload: {
type: [Boolean, String],
default: true
},
loadnext: {
type: [Boolean, String],
default: false
},
urlCallback: {
type: Object,
default () {
return {}
}
}
},
data () {
return {
loading: false,
errorMessage: null
}
},
created () {
this._ad = null
setTimeout(() => {
if (this.preload && this._canCreateAd()) {
this.load()
}
}, 100)
},
methods: {
load () {
if (this.loading) {
return
}
this._startLoading()
},
show () {
this.errorMessage = null
this._ad = this.selectComponent('.uniad-plugin')
if (this._hasCallback()) {
const userCryptoManager = wx.getUserCryptoManager()
userCryptoManager.getLatestUserKey({
success: ({
encryptKey,
iv,
version,
expireTime
}) => {
this._ad.show({
userId: this.urlCallback.userId || '',
extra: this.urlCallback.extra || '',
encryptKey,
iv,
version,
expireTime
})
},
fail: (err) => {
this._dispatchEvent(EventType.Error, err)
}
})
} else {
this._ad.show()
}
},
_onclick () {
this.show()
},
_startLoading () {
this.loading = true
this.errorMessage = null
},
_canCreateAd () {
let result = false
if (typeof this.adpid === 'string' && this.adpid.length > 0) {
result = true
} else if (typeof this.adpid === 'number') {
result = true
}
return result
},
_hasCallback () {
return (typeof this.urlCallback === 'object' && Object.keys(this.urlCallback).length > 0)
},
_onmpload (e) {
this.loading = false
this._dispatchEvent(EventType.Load, {})
},
_onmpclose (e) {
this._dispatchEvent(EventType.Close, e.detail)
if (e.detail.adsdata) {
const adv = e.detail.adv
const adsdata = e.detail.adsdata
const version = e.detail.version
/* eslint-disable no-undef */
uniCloud.callFunction({
name: 'uniAdCallback',
data: {
adv: adv,
adsdata: adsdata,
version: version
},
secretType: 'both',
success: (res) => {
},
fail: (err) => {
this._dispatchEvent(EventType.Error, err)
}
})
delete e.detail.adv
delete e.detail.adsdata
delete e.detail.version
}
},
_onmperror (e) {
this.loading = false
this.errorMessage = JSON.stringify(e.detail)
this._dispatchEvent(EventType.Error, e.detail)
},
_dispatchEvent (type, data) {
this.$emit(type, {
detail: data
})
}
}
}

View File

@@ -0,0 +1,173 @@
const AD_SERVER_URL = 'https://hac1.dcloud.net.cn/h5/gs'
const EventType = {
Load: 'load',
Close: 'close',
Error: 'error'
}
const ProviderType = 'wm'
class Process {
static Start (cmd, args) {
return new Process().openScheme(cmd)
}
constructor () {
this._a = null
}
openScheme (url) {
if (this._a == null) {
this._a = document.createElement('a')
}
this._a.href = url
this._a.click()
}
}
export default {
props: {
options: {
type: [Object, Array],
default () {
return {}
}
},
adpid: {
type: [Number, String],
default: ''
},
preload: {
type: [Boolean, String],
default: true
},
loadnext: {
type: [Boolean, String],
default: false
},
urlCallback: {
type: Object,
default () {
return {}
}
}
},
data () {
return {
adData: null,
loading: false,
showModel: false,
errorMessage: null
}
},
created () {
this._loading = false
this.adConfigData = null
},
methods: {
load () {
setTimeout(() => {
this._onmpload()
}, 200)
},
show (options) {
if (!this._isMobile()) {
this._dispatchEvent(EventType.Error, {
errCode: -1,
errMsg: '当前设备环境无效'
})
return
}
this.errorMessage = null
if (this._loading) {
return
}
this._loading = true
this._requestScheme(options)
},
getProvider () {
return ProviderType
},
_onclick () {
if (this.disabled) {
return
}
this.show()
},
_requestScheme (options = {}) {
const urlCallback = options.urlCallback || this.urlCallback
uni.request({
url: AD_SERVER_URL,
method: 'POST',
data: {
adpid: this.adpid,
userId: urlCallback.userId,
extra: urlCallback.extra
},
timeout: 5000,
dataType: 'json',
success: (res) => {
if (res.statusCode !== 200) {
this._dispatchEvent(EventType.Error, {
errCode: res.statusCode,
errMsg: res.statusCode
})
return
}
const responseData = res.data
if (responseData.ret === 0) {
Process.Start(responseData.data.openlink)
} else {
this._dispatchEvent(EventType.Error, {
errCode: responseData.ret,
errMsg: responseData.msg
})
}
},
fail: (err) => {
this.$emit(EventType.Error, {
errCode: '',
errMsg: err.errMsg
})
},
complete: () => {
this.loading = false
}
})
},
_isMobile () {
return /android|iphone/i.test(navigator.userAgent.toLowerCase())
},
_onmpload (e) {
this.loading = false
this._dispatchEvent(EventType.Load, {})
},
_onmpclose (e) {
this._dispatchEvent(EventType.Close, e.detail)
},
_onmperror (e) {
this.loading = false
this.errorMessage = JSON.stringify(e.detail)
this._dispatchEvent(EventType.Error, e.detail)
},
_dispatchEvent (type, data) {
this.$emit(type, {
detail: data
})
}
}
}