张延森 2 years ago
parent
commit
949df363e5
8 changed files with 67 additions and 6 deletions
  1. 10
    1
      src/App.vue
  2. 24
    0
      src/components/loading/index.vue
  3. 5
    0
      src/main.js
  4. 5
    4
      src/pages/login.vue
  5. 1
    1
      src/router/index.js
  6. 2
    0
      src/store/index.js
  7. 13
    0
      src/store/models/app.js
  8. 7
    0
      src/utils/request.js

+ 10
- 1
src/App.vue View File

1
 <template>
1
 <template>
2
-  <div id="app"><router-view /></div>
2
+  <div id="app">
3
+    <x-loading :show="loading" size="36px" style="position: fixed; top: 0; width: 100vw; z-index: 999" />
4
+    <router-view />
5
+  </div>
3
 </template>
6
 </template>
4
 
7
 
8
+<script setup>
9
+import { useModel } from '@zjxpcyc/vue-tiny-store'
10
+
11
+const { loading } = useModel('app')
12
+</script>
13
+
5
 <style>
14
 <style>
6
 html, body, #app {
15
 html, body, #app {
7
   height: 100%;
16
   height: 100%;

+ 24
- 0
src/components/loading/index.vue View File

1
+<template>
2
+  <div class="cmp-loading" v-if="show">
3
+    <van-loading color="#1989fa" :size="size" />
4
+  </div>
5
+</template>
6
+
7
+<script setup>
8
+const props = defineProps({
9
+  show: false,
10
+  size: {
11
+    type: String,
12
+    default: '48px',
13
+  }
14
+})
15
+
16
+</script>
17
+
18
+<style lang="less" scoped>
19
+.cmp-loading {
20
+  padding-top: 30%;
21
+  display: flex;
22
+  justify-content: center;
23
+}
24
+</style>

+ 5
- 0
src/main.js View File

1
 import { createApp } from 'vue'
1
 import { createApp } from 'vue'
2
+import Loading from '@/components/loading/index.vue'
2
 import App from './App.vue'
3
 import App from './App.vue'
3
 import vant from './vant'
4
 import vant from './vant'
4
 import router from './router'
5
 import router from './router'
5
 import store from './store'
6
 import store from './store'
6
 
7
 
7
 const app = createApp(App)
8
 const app = createApp(App)
9
+
8
 vant(app)
10
 vant(app)
9
 app.use(router)
11
 app.use(router)
10
 app.use(store)
12
 app.use(store)
13
+
14
+app.component('x-loading', Loading);
15
+
11
 app.mount('#app')
16
 app.mount('#app')

+ 5
- 4
src/pages/login.vue View File

1
 <template>
1
 <template>
2
   <div class="login-page">
2
   <div class="login-page">
3
-    <van-loading color="#1989fa" size="48px" />
3
+    <x-loading :show="true" />
4
   </div>
4
   </div>
5
 </template>
5
 </template>
6
 
6
 
9
 import { useRouter, useRoute } from 'vue-router'
9
 import { useRouter, useRoute } from 'vue-router'
10
 import { useModel } from '@zjxpcyc/vue-tiny-store'
10
 import { useModel } from '@zjxpcyc/vue-tiny-store'
11
 import { getRedirectURL } from '@/utils/wx';
11
 import { getRedirectURL } from '@/utils/wx';
12
+import { Notify } from 'vant';
12
 
13
 
13
 const { signIn } = useModel('user')
14
 const { signIn } = useModel('user')
14
 const router = useRouter();
15
 const router = useRouter();
31
       } else {
32
       } else {
32
         router.replace({ name: 'index' })
33
         router.replace({ name: 'index' })
33
       }
34
       }
35
+    }).catch((err) => {
36
+      Notify({ type: 'warning', message: err.message });
34
     })
37
     })
35
   }
38
   }
36
 })
39
 })
39
 
42
 
40
 <style lang="less" scoped>
43
 <style lang="less" scoped>
41
 .login-page {
44
 .login-page {
42
-  padding-top: 30vh;
43
-  display: flex;
44
-  justify-content: center;
45
+  height: 100%;
45
 }
46
 }
46
 </style>
47
 </style>

+ 1
- 1
src/router/index.js View File

22
   }
22
   }
23
 
23
 
24
   const { user, getCurrent } = store.getState('user');
24
   const { user, getCurrent } = store.getState('user');
25
-  if (!user && !user.personId) {
25
+  if (!user || !user.personId) {
26
     getCurrent().then(() => {
26
     getCurrent().then(() => {
27
       NProgress.done();
27
       NProgress.done();
28
       next();
28
       next();

+ 2
- 0
src/store/index.js View File

1
 import createStore from '@zjxpcyc/vue-tiny-store'
1
 import createStore from '@zjxpcyc/vue-tiny-store'
2
 
2
 
3
+import useApp from './models/app'
3
 import useUser from './models/user'
4
 import useUser from './models/user'
4
 
5
 
5
 const models = {
6
 const models = {
7
+  'app': useApp,
6
   'user': useUser,
8
   'user': useUser,
7
 }
9
 }
8
 
10
 

+ 13
- 0
src/store/models/app.js View File

1
+import { ref } from "vue";
2
+
3
+export default function useApp() {
4
+  const loading = ref(false)
5
+
6
+  const setLoading = b => loading.value = b;
7
+  window.__setloading = setLoading;
8
+
9
+  return {
10
+    loading,
11
+    setLoading,
12
+  }
13
+}

+ 7
- 0
src/utils/request.js View File

11
   const token = getToken()
11
   const token = getToken()
12
   const Authorization = token ? { Authorization: token } : {};
12
   const Authorization = token ? { Authorization: token } : {};
13
 
13
 
14
+  // 加载动画
15
+  window.__setloading(true);
16
+
14
   // 在发送请求之前做些什么
17
   // 在发送请求之前做些什么
15
   return {
18
   return {
16
     ...config,
19
     ...config,
26
 
29
 
27
 // 添加响应拦截器
30
 // 添加响应拦截器
28
 request.interceptors.response.use(function (response) {
31
 request.interceptors.response.use(function (response) {
32
+  window.__setloading(false);
33
+
29
   // 2xx 范围内的状态码都会触发该函数。
34
   // 2xx 范围内的状态码都会触发该函数。
30
   // 对响应数据做点什么
35
   // 对响应数据做点什么
31
   const { data : respData } = response;
36
   const { data : respData } = response;
37
     return Promise.reject(new Error(message));
42
     return Promise.reject(new Error(message));
38
   }
43
   }
39
 }, function (error) {
44
 }, function (error) {
45
+  window.__setloading(false);
46
+
40
   // 超出 2xx 范围的状态码都会触发该函数。
47
   // 超出 2xx 范围的状态码都会触发该函数。
41
   // 对响应错误做点什么
48
   // 对响应错误做点什么
42
   return Promise.reject(error);
49
   return Promise.reject(error);