diff --git a/App.vue b/App.vue index cd98466..391986c 100644 --- a/App.vue +++ b/App.vue @@ -2,6 +2,30 @@ export default { onLaunch: function() { console.log('App Launch') + let link = window.location.href; + if (/code=/.test(link) || link.indexOf("code") > -1) { + let temp = decodeURIComponent((new RegExp('[?|&]' + 'code' + '=' + '([^&;]+?)(&|#|;|$)').exec(link) || + [, ''])[1].replace(/\+/g, '%20')) || null + let lifeData = uni.getStorageSync('lifeData') + if (!lifeData.vuex_token || !lifeData.vuex_userId) { + this.$u.api.login({ + code: temp + }).then(res => { + uni.setStorageSync('lifeData', { + vuex_token: res.token, + vuex_userId: res.user_id + }) + this.$u.vuex('vuex_token', res.token) + this.$u.vuex('vuex_userId', res.user_id) + }) + } + } else { + this.$u.api.getAppId().then(res => { + let redirect = encodeURIComponent(link.replace(/#\//, "")) + window.location.href = + `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${res.appid}&redirect_uri=${redirect}&response_type=code&scope=snsapi_base#wechat_redirect` + }) + } }, onShow: function() { console.log('App Show') diff --git a/common/config.js b/common/config.js index 9a977cf..8b8ae54 100644 --- a/common/config.js +++ b/common/config.js @@ -1,17 +1,17 @@ -const mode = 'devOnline'; //devLocal:本地测试、devOnline:线上测试、production:生产环境 +const mode = 'devLocal'; //devLocal:本地测试、devOnline:线上测试、production:生产环境 let ROOTPATH = ''; //域名 switch (mode) { case 'devLocal': - ROOTPATH = "http://192.168.2.5:61111" + ROOTPATH = "http://h5.ali251.langye.net" break; case 'devOnline': ROOTPATH = "https://xxxxx.cn" break; case 'production': - ROOTPATH = "https://xxxxx.cn" + ROOTPATH = "http://h5.ali251.langye.net" break; default: throw new Error('未配置环境'); console.log(`未配置环境`); } -export { ROOTPATH } \ No newline at end of file +export { ROOTPATH } diff --git a/common/http.api.js b/common/http.api.js index bc74f0b..cbf9f7e 100644 --- a/common/http.api.js +++ b/common/http.api.js @@ -1,23 +1,31 @@ //api集合 let apiApp = { - login: '/api/login', - getInfo: '/777/777/index', -} -let apiHome = { - hotSearchUrl: '/777/77/hot_search' + login: '/api/mobile/user/wechat-login', + getAppId: '/api/mobile/user/wechat-login-url', + sendSms: '/api/mobile/user/send-sms', + getPrize: '/api/mobile/draw/get-prize', + draw: '/api/mobile/draw/draw', + endTask: '/api/mobile/draw/end-task', + mobileCheck: '/api/mobile/draw/mobile-check', + bindMobile: '/api/mobile/user/bind-mobile' } // 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作 const install = (Vue, vm) => { //api方法 - let getSearch = (params = {}) => vm.$u.get(apiHome.hotSearchUrl, params); - let getInfo = (params={}) => vm.$u.post(apiApp.getInfo, params); - + let login = (params = {}) => vm.$u.get(apiApp.login, params); + let getPrize = (params = {}) => vm.$u.get(apiApp.getPrize, params); + let getAppId = (params = {}) => vm.$u.get(apiApp.getAppId, params); + let draw = (params = {}) => vm.$u.get(apiApp.draw, params); + let endTask = (params = {}) => vm.$u.get(apiApp.endTask, params); + let mobileCheck = (params = {}) => vm.$u.get(apiApp.mobileCheck, params); + let sendSms = (params = {}) => vm.$u.get(apiApp.sendSms, params); + let bindMobile = (params = {}) => vm.$u.get(apiApp.bindMobile, params); // 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下 - vm.$u.api = {getSearch, getInfo}; + vm.$u.api = { login, getPrize, draw, endTask, mobileCheck, getAppId, sendSms, bindMobile }; } export default { install -} \ No newline at end of file +} diff --git a/common/http.interceptor.js b/common/http.interceptor.js index 9217ae0..8fe32fb 100644 --- a/common/http.interceptor.js +++ b/common/http.interceptor.js @@ -11,7 +11,7 @@ const install = (Vue, vm) => { loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透 loadingText: '加载中', // 请求loading中的文字提示 loadingTime: 800, - originalData: false, // 是否在拦截器中返回服务端的原始数据 + originalData: true, // 是否在拦截器中返回服务端的原始数据 // 设置自定义头部content-type header: { 'content-type': 'application/json;charset=UTF-8' @@ -21,49 +21,44 @@ const install = (Vue, vm) => { // 请求拦截部分,如配置,每次请求前都会执行 Vue.prototype.$u.http.interceptor.request = (config) => { console.log('config-http', config) - // 引用token - // 方式一,存放在vuex的token,假设使用了uView封装的vuex方式 - // 见:https://uviewui.com/components/globalVariable.html - config.header.token = vm.vuex_token; + config.data.activity_tag = 'turntable_draw' - // 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取 - // config.header.token = vm.$store.state.token; - - // 方式三,如果token放在了globalData,通过getApp().globalData获取 - // config.header.token = getApp().globalData.username; - - // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的 - // 所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值 - // const token = uni.getStorageSync('token'); - // config.header.token = token; + let lifeData = uni.getStorageSync('lifeData') + let vuex_token = lifeData.vuex_token; + if (vuex_token || vm.vuex_token) { + config.header['Authorization'] = `Bearer ${vuex_token || vm.vuex_token}`; + } - // 可以对某个url进行特别处理,此url参数为this.$u.get(url)中的url值 - if (config.url == '/test/jam') config.header.noToken = true; - // 最后需要将config进行return return config; - // 如果return一个false值,则会取消本次请求 - // if(config.url == '/user/rest') return false; // 取消某次请求 } // 响应拦截,如配置,每次请求结束都会执行本方法 Vue.prototype.$u.http.interceptor.response = (res) => { - console.log('res-http',res) - if (res.code == 200) { - // res为服务端返回值,可能有code,result等字段 - // 这里对res.result进行返回,将会在this.$u.post(url).then(res => {})的then回调中的res的到 - // 如果配置了originalData为true,请留意这里的返回值 - return res.result; - } else if (res.code == 201) { - // 假设201为token失效,这里跳转登录 - // vm.$u.toast('验证失败,请重新登录'); - // setTimeout(() => { - // // 此为uView的方法,详见路由相关文档 - // vm.$u.route('/pages/user/login') - // }, 1500) - return false; + console.log('res-http', res) + if (res.statusCode === 200) { + if (res.data.hasOwnProperty("errcode")) { + uni.showToast({ + icon: "none", + title: res?.data?.errmsg + }) + if (res.data?.errcode === 40001) { + + setTimeout(() => { + let origin = window.location.origin; + let pathname = window.location.pathname; + window.location.href = origin + pathname; + }, 1500) + } + return false; + } else { + return res.data; + } } else { - // 如果返回false,则会调用Promise的reject回调, - // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中,res为服务端的返回值 + uni.showToast({ + icon: "fail", + title: res.statusCode + }) + return false; } } diff --git a/component/popover/index.vue b/component/popover/index.vue index 5209d95..007bcaf 100644 --- a/component/popover/index.vue +++ b/component/popover/index.vue @@ -28,6 +28,10 @@ + + + + @@ -69,8 +73,6 @@ export default { diff --git a/static/share.png b/static/share.png new file mode 100644 index 0000000..034b062 Binary files /dev/null and b/static/share.png differ diff --git a/store/index.js b/store/index.js index 57ea10c..f480e97 100644 --- a/store/index.js +++ b/store/index.js @@ -12,7 +12,7 @@ try{ } // 需要永久存储,且下次APP启动需要取出的,在state中的变量名 -let saveStateKeys = ['vuex_user', 'vuex_token']; +let saveStateKeys = ['vuex_user', 'vuex_token','vuex_userId']; // 保存变量到本地存储中 const saveLifeData = function(key, value){ @@ -34,8 +34,9 @@ const store = new Vuex.Store({ // 加上vuex_前缀,是防止变量名冲突,也让人一目了然 vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {}, vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '', + vuex_userId: lifeData.vuex_userId ? lifeData.vuex_userId : '', // 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式 - vuex_version: '1.0.1', + vuex_version: '1.0.0', }, mutations: { $uStore(state, payload) {