vue3+uniapp起步

1.接口封装

在根目录创建request/index.js

const config = {
baseUrl: "/dev-api"
}
if (process.env.NODE\_ENV === 'development') {
//开发环境
// #ifdef H5
// 如需跨域参照以下h5跨域配置
config.baseUrl = "/dev-api"
// #endif
// #ifdef APP-PLUS ||MP
config.baseUrl = "http://192.168.1.107:8080/xxx"
// #endif
} else {
baseUrl = ""
}
const errorCode = {
401: '认证失败,无法访问系统资源',
403: '当前操作没有权限',
404: '访问资源不存在',
default: '系统未知错误,请反馈给管理员',
}
import {
encodeURIParams
} from '@/util/strUtil';
export function request(options) {
{
return new Promise((resolve, reject) => {
		let token = uni.getStorageSync('token')
		let header = {
			'Content-Type': 'application/json;charset=utf-8',
			'Authorization': 'Bearer ' + token,
		}

		if (options.method === 'get' && options.params) {
			let url = `${options.url}?${encodeURIParams(options.params)}`;
			url = url.slice(0, -1);
			options.params = {};
			options.url = url;
		}
		uni.request({
			url: config.baseUrl + options.url,
			data: options.data || {},
			method: options.method || 'POST',
			header: options.headers || header,
			success: (res) => {
				// 控制台显示数据信息

				const code = res.data.code || 200;
				const msg = errorCode[code] || res.data.msg || errorCode.default;
				//文件流
				// if (res.request.responseType === 'blob' || res.request.responseType ===
				// 	'arraybuffer') {
				// 	return res.data;
				// }
				//登录过期
				if (code === 20101) {
					uni.removeStorage({
						key: 'token'
					})
					uni.navigateTo({
						url: '/pages/login/index'
					});
					return
				}
				//40201
				if (code === 500 || code === 9999 || code == 99999 || code == 40201 || code ==
					404) {
					console.log('error')
					uni.showToast({
						title: res.data.data || res.data.msg,
						icon: "none"
					})
					// return resolve('error');
					return reject()
				}
				// if (code !== 200) {
				// 	uni.showToast({
				// 		title: msg,
				// 		icon: "none"
				// 	})
				// 	return resolve('error');
				// }
				resolve(res.data.data)
				//res.data.code
			},
			fail: (err) => {
				console.log(err)
				// 页面中弹框显示失败
				uni.showToast({
					title: '请求接口失败',
					icon: "none"
				})
				// 返回错误消息
				reject(err)
			},
			catch: (e) => {
				console.log(e);
			}
		})
	})
}
}

具体使用

//导入request.js
import {
	request
} from "@/request/index";

export const list = (query) => request({
	url: '/xxx/xxx',
	method: 'get',
	params: query,
});
export const add= (data) => request({
	url: '/xxx/xxx',
	method: 'post',
	data,
});
export const del= (data) => request({
	url: '/xxx/xxx/' + data,
	method: 'delete',

});

2 跨域

//vue3中 manifest.json配置不起作用

在根目录创建vite.config.js,配置ip重写地址

import {
	defineConfig
} from "vite"
import uni from "@dcloudio/vite-plugin-uni";

export default defineConfig({
	plugins: [
		uni()
	],
	server: {

		proxy: {
			'/dev-api': {
				"target": "http://xxx:8080",
				changeOrigin: true,
				rewrite: (p) => p.replace(/^\/dev-api/, 'xxx'),
			},

		}
	}
})

3.pc模拟器请求没问题,真假报错

request:fail abort statusCode:-1 Expected URL scheme ‘http‘ or ‘https‘ but was ‘file‘报错

注意在前面request/index.js中配置的这段,真机配置的proxy不生效,得判断下

if (process.env.NODE_ENV === 'development') {
	//开发环境
	// #ifdef H5
	// 如需跨域参照以下h5跨域配置
	config.baseUrl = "/dev-api"
	// #endif
	// #ifdef APP-PLUS ||MP
	config.baseUrl = "http://xxx:8080/xxx"
	// #endif
} else {
	baseUrl = ""
}

4.配置自定义页面顶部

<template>
	<view class="fix-top">
		<view class="navbar">
			<view v-show="showBack" @click="handleReturn" class="nav-left">
				<image src="../static/prev.png" mode=""></image>
				<text>{{ btnName }}</text>
			</view>
			<text class="nav-title line1">{{ title }}</text>
			<view class="nav-right">
				<text>{{ rightText }}</text>

				<slot name="icon"></slot>
			</view>
		</view>
		<view class="slot-view">
			<slot></slot>
		</view>
	</view>
</template>

<script setup>
	const props = defineProps({
		title: {
			type: String
		},
		btnName: {
			type: String,
			default: '返回'
		},
		icon: {
			type: String
		},
		showBack: {
			type: Boolean,
			default: true
		},
		rightText: {
			type: String,
			default: ''
		}
	});

	function handleReturn() {
		emit('return');
	}
	const emit = defineEmits(['return']);
</script>

<style lang="scss" scoped>
	.fix-top {
		position: fixed;
		left: 0;
		top: 0;
		width: 100vw;
		height: 100vh;
	}

	.slot-view {
		height: calc(100vh - 140rpx);
		// overflow-y: scroll;
	}

	.navbar {
		width: 100vw;
		height: 100rpx;
		background: white;
		text-align: center;
		padding-top: 40rpx;
		font-size: 36rpx;
		line-height: 100rpx;
		position: relative;

		.nav-left {
			position: absolute;
			display: flex;
			align-items: center;
			left: 20rpx;
			cursor: pointer;

			text {
				color: #2697eb;
				font-size: 32rpx;
			}

			image {
				width: 26rpx;
				height: 42rpx;
				margin-right: 20rpx;
			}
		}

		.nav-title {
			color: #333;
			font-size: 36rpx;
			width: 60%;
			display: inline-block;
			// overflow: hidden;
		}

		.nav-right {
			position: absolute;
			right: 20rpx;
			top: 40rpx;

		}
	}
</style>

使用

<self-title :showBack="false" :title="xxx" :rightText="finishCount + '/' + list.length">
    //内容
</self-title>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3+uni-app实现微信小程序登录流程主要分为以下步骤: 1. 在uni-app项目中安装并引入微信小程序登录插件(如wxlogin),在main.js中初始化并配置插件参数。 2. 创建一个登录页面,该页面包含点击按钮触发微信登录的操作,可以通过uni.login()方法调用微信小程序登录接口获取code。 3. 接收到微信小程序登录接口返回的code后,将code发送给后端服务器,后端服务器将code和小程序的App ID以及App Secret发送给微信服务器进行登录凭证校验,获取到session_key和openid。 4. 服务器根据openid和session_key生成一个自定义的token,返回给前端。 5. 前端将token保存在本地,使用uni.setStorage()方法进行存储,以便后续的登录状态维持和接口请求验证。 6. 在需要登录验证的页面或组件中,通过uni.getStorage()方法获取本地存储的token,并将token添加到请求头中,发送给后端服务器进行接口请求。 7. 后端服务器接收到带有token的请求,对token进行校验和解析,验证token是否有效,从而确保用户的登录状态。 总结:通过以上步骤,实现了Vue3+uni-app微信小程序的登录流程。用户通过点击按钮触发微信小程序登录接口,后端服务器校验登录凭证,生成token并返回给前端,前端保存token并在请求接口时携带token进行验证,保证了用户的登录状态和接口访问权限的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值