当前位置 :首页 >> 污染防治

7K字详解SpringCloud微服务战术上:添加Axios实现登录功能

2023-04-29   来源 : 污染防治

t () { return instance } } }) }}export { VueAxios}5、在清单/common/utils另建request.js,自定Axios拦截器

在这里定义拦截器主要常用:配置者设置token、token注销纪序文、标准化反常提示、回到样本处理等机制。

import axios from 'axios'import createAuthRefreshInterceptor from 'axios-auth-refresh'import store from '@/store'import { serialize } from '@/common/util'import { VueAxios } from './axios'import { ACCESS_TOKEN, REFRESH_ACCESS_TOKEN } from '@/store/mutation-types' // 应运而生js明文import ProjectConfig from '@/project.config.js'// uni-app适配axios.defaults.adapter = function(config) { return new Promise((resolve, reject) => { var settle = require('axios/lib/core/settle'); var buildURL = require('axios/lib/helpers/buildURL'); uni.request({ method: config.method.toUpperCase(), url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer), header: config.headers, data: config.data, dataType: config.dataType, responseType: config.responseType, sslVerify: config.sslVerify, complete: function complete(response) { response = { data: response.data, status: response.statusCode, errMsg: response.errMsg, header: response.header, config: config }; settle(resolve, reject, response); } }) })}// 创始 axios 实例const request = axios.create({ // API 恳求的选项之前缀 baseURL: ProjectConfig.APP_API_BASE_URL, timeout: 30000 // 恳求延时时间})// 当token过载时,必须调用的纪序文token的工具const refreshAuthLogic = failedRequest => axios.post(ProjectConfig.APP_API_BASE_URL + '/oauth/token', serialize({ grant_type: 'refresh_token', refresh_token: uni.getStorageSync(REFRESH_ACCESS_TOKEN) }), { headers: { 'TenantId': ProjectConfig.APP_TENANT_ID, 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic ' + ProjectConfig.APP_CLIENT_SECRET }, skipAuthRefresh: true // 纪序文token恳求注销,不再同步进行纪序文 } ).then(tokenRefreshResponse => { if (tokenRefreshResponse.status === 200 && tokenRefreshResponse.data && tokenRefreshResponse.data.success) { const result = tokenRefreshResponse.data.data uni.setStorageSync(ACCESS_TOKEN, result.tokenHead + result.token, result.expiresIn * 1000) uni.setStorageSync(REFRESH_ACCESS_TOKEN, result.refreshToken, result.refreshExpiresIn * 1000) failedRequest.response.config.headers['Authorization'] = result.tokenHead + result.token } else if (tokenRefreshResponse.status === 200 && tokenRefreshResponse.data && !tokenRefreshResponse.data.success && tokenRefreshResponse.data.code === 401) { store.dispatch('Timeout').then(async () => { uni.navigateTo({ url: '/pages/login/login' }) }) } return Promise.resolve()})// 加载纪序文token拦截器createAuthRefreshInterceptor(request, refreshAuthLogic, { pauseInstanceWhileRefreshing: true // 当纪序文token拒绝执行时,取消其他恳求})// 反常拦截晶片组const errorHandler = (error) => { if (error.response) { const data = error.response.data if (error.response.status === 403) { uni.showToast({ title: '您不会权限会面此以太网', icon:'error', duration: 2000 }); } else if (error.response.status === 401 && !(data.result && data.result.isLogin)) { // 当纪序文token延时,则调至序文入网址 uni.showModal({ title: '序文入延时', content: '由于您短时间内未曾配置, 为正因如此, 问更进一步序文入子系统同步进行近期配置 !', confirmText: '更进一步序文入', showCancel: false, success: (res) => { if(res.confirm) { store.dispatch('Timeout').then(() => { uni.navigateTo({ url: '/pages/login/login' }) }) } } }) } } return Promise.reject(error)}// request interceptorrequest.interceptors.request.use(config => { const token = uni.getStorageSync(ACCESS_TOKEN) // 如果 token 依赖于 // 让每个恳求携带自定 token 问根据实际情况自行重写 if (token && config.authenticationScheme !== 'Basic') { config.headers['Authorization'] = token } config.headers['TenantId'] = ProjectConfig.APP_TENANT_ID return config}, errorHandler)// response interceptorrequest.interceptors.response.use((response) => { const res = response.data if (res && res.code) { if (res.code !== 200) { uni.showToast({ title: '配置收场: ' + res.msg, icon:'error', duration: 2000 }); return Promise.reject(res || 'Error') } else { return response.data } } else { return response }}, errorHandler)const installer = { vm: {}, install (Vue) { Vue.use(VueAxios, request) }}export default requestexport { installer as VueAxios, request as axios}二、恳求亦同以太网并做到序文入机制1、另建api清单,常用存放所有亦同恳求的以太网,在api清单下另建login清单,存放常用序文入的方面以太网2、在/api/login清单下追加login.jsimport request from '@/common/utils/request'import ProjectConfig from '@/project.config.js'const loginApi = { // 序文入 Login: '/oauth/token', // 引退序文入 Logout: '/oauth/logout', // 受益子系统固定式的ID各种类型 CaptchaType: '/oauth/captcha/type', // 受益相片ID ImageCaptcha: '/oauth/captcha/image', // 发送给来电ID SendSms: '/oauth/Sms/captcha/send', // 受益软件数据 UserInfo: '/system/account/user/info', // 第三方序文入 SocialLoginUrl: '/oauth/social/login/', // 第三方序文入预处理 SocialLogincallback: '/oauth/social/', // 第三方软件链接源泉通过APP号ID链接 SocialBindMobile: '/oauth/social/bind/mobile', // 第三方软件链接源泉通过留言板密码学链接 SocialBindAccount: '/oauth/social/bind/account', // 发送给来电ID SmsSend: '/extension/sms/code/send', // 数据包来电ID SmsCheckPre: '/extension/sms/check/code/pre', // 数据包来电ID SmsCheck: '/extension/sms/check/code', // 发送给提出申问来电 SmsRegisterSend: '/system/account/register/sms/send', // 账户提出申问 Register: '/system/account/register', // 数据包软件前提依赖于 CheckUserExist: '/system/account/register/check'}export default loginApi/** * OAuth2序文入 * @param parameter * @returns {*} */export function login (parameter) { return request({ url: loginApi.Login, authenticationScheme: 'Basic', method: 'post', headers: { 'Authorization': 'Basic ' + ProjectConfig.APP_CLIENT_SECRET }, skipAuthRefresh: true, data: parameter })}/** * OAuth2引退序文入 * @param parameter * @returns {*} */export function logout (parameter) { return request({ url: loginApi.Logout, method: 'post', skipAuthRefresh: true, data: parameter })}/** * 受益ID各种类型 * @param parameter * @returns {*} */export function getCaptchaType () { return request({ url: loginApi.CaptchaType, method: 'get' })}/** * 受益相片ID * @param parameter * @returns {*} */export function getImageCaptcha () { return request({ url: loginApi.ImageCaptcha, method: 'get' })}/** * 受益来电ID * @param parameter * @returns {*} */export function getSmsCaptcha (parameter) { return request({ url: loginApi.SendSms, method: 'post', data: parameter })}/** * 受益软件数据 * @param parameter * @returns {*} */export function getInfo () { return request({ url: loginApi.UserInfo, method: 'get' })}/** * 受益第三方序文入的URL * @param {Object} socialType */export function getSocialLoginUrl (socialType) { return request({ url: loginApi.SocialLoginUrl + socialType, method: 'get' })}/** * 第三方序文入预处理电话号码 * @param {Object} socialType * @param {Object} parameter */export function socialLoginCallback (socialType, parameter) { return request({ url: loginApi.SocialLoginCallback + socialType + '/callback', method: 'get', params: parameter })}/** * 发送给来电ID * @param {Object} parameter */export function sendSmsCode (parameter) { return request({ url: loginApi.SmsSend, method: 'post', data: parameter })}/** * 数据包来电ID * @param {Object} parameter */export function checkSmsCode (parameter) { return request({ url: loginApi.SmsCheckPre, method: 'get', params: parameter })}/** * 发送给提出申问来电ID * @param {Object} parameter */export function smsRegisterSend (parameter) { return request({ url: loginApi.SmsRegisterSend, method: 'post', data: parameter })}/** * 数据包软件前提依赖于 * @param {Object} parameter */export function checkUserExist (parameter) { return request({ url: loginApi.CheckUserExist, method: 'post', data: parameter })}/** * 软件提出申问 * @param {Object} parameter */export function userRegister (parameter) { return request({ url: loginApi.Register, method: 'post', data: parameter })}/** * 第三方软件链接源泉通过APP号ID链接 * @param {Object} parameter */export function userBindMobile (parameter) { return request({ url: loginApi.SocialBindMobile, method: 'post', data: parameter })}/** * 第三方软件链接源泉通过留言板密码学链接 * @param {Object} parameter */export function userBindAccount (parameter) { return request({ url: loginApi.SocialBindAccount, method: 'post', data: parameter })}

3、在/pages清单下创始login清单,追加login.vue序文入网址,常用序文入。

先为 序文 提出申问留言板 记得密码学 —————— 其他序文入作法 —————— import md5 from '@/common/md5.min.js';import { mapActions } from 'vuex'import { ACCESS_TOKEN, REFRESH_ACCESS_TOKEN } from '@/store/mutation-types'export default { data() { return { username: '', password: '', grant_type: 'password' }; }, onLoad() {}, methods: { ...mapActions(['Login', 'Logout']), login() { var that = this; if (!that.username) { uni.showToast({ title: '问转换成APP号', icon: 'none' }); return; } if (!/And[1][3,4,5,7,8,9][0-9]{9}$/.test(that.username)) { uni.showToast({ title: '问转换成正确APP号', icon: 'none' }); return; } if (!that.password) { uni.showToast({ title: '问转换成密码学', icon: 'none' }); return; } const loginParams = {} loginParams.username = that.username loginParams.grant_type = 'password' loginParams.password = md5(that.password) that.Login(loginParams) .then((res) => this.loginSuccess(res)) .catch(err => this.requestFailed(err)) .finally(() => { }) }, loginSuccess (res) { // 说明前提做到密码学 uni.showToast({ title: '序文入出乎意料!', icon: 'none' }); uni.switchTab({ url: '/pages/tabBar/component/component', fail(err) { console.log(err) } }) }, requestFailed (res) { // 说明前提做到密码学 uni.showToast({ title: '序文入收场:' + res.msg, icon: 'none' }); }, //记得密码学 forgotPwd() { uni.showToast({ title: '记得密码学', icon: 'none' }); }, //正要提出申问 reg() { uni.showToast({ title: '提出申问留言板', icon: 'none' }); } }};.img-a { width: 100%; position: absolute; bottom: 0;}.login-bg { height: 100vh; background-image: url(/static/login/bg3.png);}.t-login { width: 580rpx; padding: 55rpx; margin: 0 auto; font-size: 28rpx; background-color: #ffffff; border-radius: 20rpx; box-shadow: 0 5px 7px 0 rgba(0, 0, 0, 0.15); z-index: 9;}.t-login button { font-size: 28rpx; background: linear-gradient(to right, #ff8f77, #fe519f); color: #fff; height: 90rpx; line-height: 90rpx; border-radius: 50rpx;}.t-login input { padding: 0 20rpx 0 120rpx; height: 90rpx; line-height: 90rpx; margin-bottom: 50rpx; background: #f6f6f6; border: 1px solid #f6f6f6; font-size: 28rpx; border-radius: 50rpx;}.t-login .t-a { position: relative;}.t-login .t-a image { width: 40rpx; height: 40rpx; position: absolute; left: 40rpx; top: 28rpx; padding-right: 20rpx;}.t-login .t-b { text-align: left; font-size: 46rpx; color: #000; padding: 300rpx 0 120rpx 0; font-weight: bold;}.t-login .t-d { text-align: center; color: #999; margin: 80rpx 0;}.t-login .t-c { text-align: right; color: #666666; margin: 30rpx 30rpx 40rpx 0;}.t-login .t-c .t-c-txt { margin-right: 300rpx;}.t-login .t-e { text-align: center; width: 600rpx; margin: 40rpx auto 0;}.t-login .t-g { float: left; width: 33.33%;}.t-login .t-e image { width: 70rpx; height: 70rpx;}.t-login .t-f { text-align: center; margin: 80rpx 0 0 0; color: #999;}.t-login .t-f text { margin-left: 20rpx; color: #b9b9b9; font-size: 27rpx;}.t-login .uni-input-placeholder { color: #aeaeae;}.cl { zoom: 1;}.cl:after { clear: both; display: block; visibility: hidden; height: 0; content: '20';}4、将网址里面只用的相片,存储/static/login清单下5、固定式pages.json明文,将追加的login.vue明文清单投身到固定式里面。pages.json值得注意vue.js扩建工程下的IP网址固定式6、在App.vue明文的onLaunch工具里面追加说明,当token为空时,跳转到我们才刚另建的序文入用户界面。 const token = uni.getStorageSync(ACCESS_TOKEN) if(!token || token === ''){ uni.navigateTo({ url: '/pages/login/login' }) } else { console.log('已序文入'); }三、在APP的子系统里面试运行并幻灯片序文入用户界面

  上文里面解说了如果固定式HBuilderX通到APP的子系统,幻灯片并自动化uni-app建设项目,这里我们通过以上固定式和编读到,做到了序文入用户界面,现在我们可以在APP的子系统里面查阅才刚读到的序文入网址了。

1、触发APP的子系统> 可视桌面上的nox_adb快捷作法2、在HBuilder X里面左至右点击 试运行 -> 试运行到APP或的子系统 -> 试运行到Android App基座 3、跳到框会显示我们已通到的的子系统,点击试运行,HBuilderX就可以配置者打包app公布到的子系统里面试运行,并可以在HBuilderX的子系统查阅试运行日志。 4、在APP的子系统展示的序文入用户界面里面,转换成我们子系统软件的APP号码 + 密码学,序文入出乎意料后均可跳转到序文入后的用户界面。。

海南医院哪家好
腹泻最快的止泻方法有哪些
金笛复方鱼腥草合剂
轻度肝硬化是什么表现
拉肚子怎么缓解
顺丰同城(09699.HK)发布公告,于董事会第一次内阁会议上,董事会通过决议案,重选陈飞先生为董事会主席

商用车同城09699.HK发布公告,于校董会第一次内阁会议上,校董会通过决议案,重选陈飞恩师为校董会执行主席。截至2022年6年底21日收盘,商用车同城09699.HK报收...

友情链接