Ver código fonte

增加welcome页面

ming 3 anos atrás
pai
commit
665e4e0a3e

+ 6 - 3
components/fs-loadmore/fs-loadmore.vue

@@ -24,6 +24,10 @@ const props = defineProps({
 		default: 20
 	},
 	pullDownRefresh: Boolean,
+	autoCall: {
+		type: Boolean,
+		default: true
+	},
 	nomore: {
 		type: String,
 		default: '没有更多了~'
@@ -57,15 +61,14 @@ const query = (loadmore) => {
 		state.loading = false
 	})
 }
+props.autoCall && query()
 
 const refresh = () => {
 	state.dataList = []
 	emits('update:modelValue', state.dataList)
-	query()
+	return query()
 }
 
-query()
-
 defineExpose({
 	query,
 	refresh,

+ 1 - 1
hooks/useLoadmore/index.js

@@ -5,7 +5,7 @@ export default loadmoreRef => {
 	let refs = {}
 	
 	const refresh = () => {
-		refs[loadmoreRef].refresh()
+		refs[loadmoreRef] && refs[loadmoreRef].refresh()
 	}
 	
 	onMounted(() => {

+ 8 - 1
pages.json

@@ -1,5 +1,12 @@
 {
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/welcome",
+			"style": {
+				"navigationBarTitleText": "欢迎页",
+				"enablePullDownRefresh": false
+			}
+		},
 		{
 			"path": "pages/index/index",
 			"style": {
@@ -16,7 +23,7 @@
 			"path": "pages/my/my",
 			"style": {
 				"navigationBarTitleText": "个人中心",
-				"enablePullDownRefresh": false,
+				"enablePullDownRefresh": false,
 				"navigationStyle": "custom"
 			}
 

+ 133 - 0
pages/index/welcome.vue

@@ -0,0 +1,133 @@
+<template>
+	<view class="wrapper">
+		<view class="circle"></view>
+		<view class="circle"></view>
+		<view class="circle"></view>
+		<view class="shadow"></view>
+		<view class="shadow"></view>
+		<view class="shadow"></view>
+		<text>加载中...</text>
+	</view>
+</template>
+
+<script setup>
+import { onLoad } from '@dcloudio/uni-app'
+import { useStore } from 'vuex'
+
+const store = useStore()
+
+onLoad(() => {
+	store.dispatch('loginByCode').finally(() => {
+		uni.switchTab({
+			url: '/pages/index/index'
+		})
+	})
+})
+</script>
+
+<style>
+	page {
+		background-color: #fff;
+	}
+</style>
+<style lang="scss" scoped>
+	.wrapper{
+		width:200px;
+		height:60px;
+		position: absolute;
+		left:50%;
+		top:50%;
+		transform: translate(-50%, -50%);
+	}
+	.circle {
+		width: 20px;
+		height: 20px;
+		position: absolute;
+		border-radius: 50%;
+		background-color: var(--primary);
+		left: 15%;
+		transform-origin: 50%;
+		animation: circle .5s alternate infinite ease;
+	}
+
+	@keyframes circle {
+		0% {
+			top: 60px;
+			height: 5px;
+			border-radius: 50px 50px 25px 25px;
+			transform: scaleX(1.7);
+		}
+
+		40% {
+			height: 20px;
+			border-radius: 50%;
+			transform: scaleX(1);
+		}
+
+		100% {
+			top: 0%;
+		}
+	}
+
+	.circle:nth-child(2) {
+		left: 45%;
+		animation-delay: .2s;
+	}
+
+	.circle:nth-child(3) {
+		left: auto;
+		right: 15%;
+		animation-delay: .3s;
+	}
+
+	.shadow {
+		width: 20px;
+		height: 4px;
+		border-radius: 50%;
+		background-color: rgba(0, 0, 0, .5);
+		position: absolute;
+		top: 62px;
+		transform-origin: 50%;
+		z-index: -1;
+		left: 15%;
+		filter: blur(1px);
+		animation: shadow .5s alternate infinite ease;
+	}
+
+	@keyframes shadow {
+		0% {
+			transform: scaleX(1.5);
+		}
+
+		40% {
+			transform: scaleX(1);
+			opacity: .7;
+		}
+
+		100% {
+			transform: scaleX(.2);
+			opacity: .4;
+		}
+	}
+
+	.shadow:nth-child(4) {
+		left: 45%;
+		animation-delay: .2s
+	}
+
+	.shadow:nth-child(5) {
+		left: auto;
+		right: 15%;
+		animation-delay: .3s;
+	}
+
+	text {
+		position: absolute;
+		top: 75px;
+		font-family: 'Lato';
+		font-size: 18px;
+		letter-spacing: 12px;
+		color: var(--primary);
+		left: 15%;
+	}
+</style>

+ 24 - 0
services/common.js

@@ -1,5 +1,29 @@
 import http from '@/utils/http'
 
+// #ifdef MP-WEIXIN
+
+// #endif
+const appId = uni.getAccountInfoSync().miniProgram.appId
+
+export function loginByCode(data) {
+	return new Promise((resolve, reject) => {
+		uni.login({
+		  provider: 'weixin',
+		  success: function (res) {
+		    http.post('wxMini/login', {
+					code: res.code,
+				}, {
+		    	isAuth: false,
+		    	showLoading: false
+		    }).then(res => {
+					resolve(res)
+				}).catch(err => {
+					reject(err)
+				})
+		  }
+		})
+	})
+}
 export function login(data) {
 	return http.post('user/login', data)
 }

+ 8 - 2
store/index.js

@@ -1,5 +1,5 @@
 import { createStore } from 'vuex'
-import { login, wxLogin, logout } from '../services/common'
+import { login, wxLogin, loginByCode, logout } from '../services/common'
 
 const store = createStore({
   state: {
@@ -29,6 +29,12 @@ const store = createStore({
 				commit('setUserInfo', res.userInfo)
 			})
 		},
+		loginByCode({ commit }) {
+			return loginByCode().then(res => {
+				commit('setToken', res.token)
+				commit('setUserInfo', res.userInfo)
+			})
+		},
 		logout({ commit }) {
 			// return http.post('auth/user/logout').then(res => {
 			// 	commit('setToken', '')
@@ -36,7 +42,7 @@ const store = createStore({
 			// })
 			return new Promise(resolve => {
 				commit('setToken', '')
-				commit('setUserInfo', {})
+				commit('setUserInfo', null)
 				resolve()
 			})
 		}

+ 2 - 1
utils/config.js

@@ -4,7 +4,8 @@ const config = {
 	baseUrl,
 	apiBaseUrl: baseUrl + '/api/',
 	httpDefaultOption: {
-		showLoading: true,
+		showLoading: true,
+		showErrorMsg: true,
 		isAuth: true,
 	},
 }

+ 3 - 2
utils/http.js

@@ -23,7 +23,8 @@ const request = (method, url, data, opt) => {
 			
 			const data = res.data
 			if (data.code === 201) {
-				store.commit('setUserInfo', {})
+				store.commit('setUserInfo', null)
+				store.commit('token', '')
 				
 				// opt.isAuth && uni.navigateTo({
 				// 	url: '/pages/login/login'
@@ -33,7 +34,7 @@ const request = (method, url, data, opt) => {
 			if (data.code === 200 || data.success) {
 				resolve(data)
 			} else {
-				uni.showToast({
+				opt.showErrorMsg && uni.showToast({
 					title: data.msg,
 					icon: 'none'
 				})