Yansen 2 年之前
父節點
當前提交
b5b2dd5844
共有 9 個文件被更改,包括 249 次插入8 次删除
  1. 1
    0
      package.json
  2. 29
    0
      src/App.vue
  3. 9
    4
      src/main.js
  4. 13
    1
      src/store/index.js
  5. 97
    0
      src/utils/request.js
  6. 11
    0
      src/utils/track.js
  7. 31
    2
      src/utils/wx.js
  8. 1
    1
      vite.config.js
  9. 57
    0
      yarn.lock

+ 1
- 0
package.json 查看文件

@@ -12,6 +12,7 @@
12 12
     "@splidejs/splide": "^4.1.4",
13 13
     "@zjxpcyc/vue-tiny-store": "^1.0.1",
14 14
     "animate.css": "^4.1.1",
15
+    "axios": "^1.2.1",
15 16
     "html2canvas": "^1.4.1",
16 17
     "v-viewer": "^3.0.10",
17 18
     "viewerjs": "1.9.0",

+ 29
- 0
src/App.vue 查看文件

@@ -1,10 +1,39 @@
1 1
 <script setup>
2 2
   import { ref } from 'vue';
3 3
   import { useModel } from '@zjxpcyc/vue-tiny-store';
4
+  import wxsdk from '@/utils/wx'
5
+  import track from '@/utils/track'
4 6
   import Loading from './pages/Loading.vue';
5 7
 
6 8
   const { el } = useModel('audio');
9
+  const { setUser } = useModel('user');
7 10
   const show = ref(false);
11
+  
12
+  const { share, getCode, redirect } = wxsdk();
13
+
14
+  const initUser = () => {
15
+    const code = getCode();
16
+    if (!code) {
17
+      return redirect();
18
+    } else {
19
+      track(code).then(res => {
20
+        const { user, num } = res;
21
+        setUser({
22
+          ...(user || {}),
23
+          num: num || 0,
24
+        });
25
+      }).catch(err => {
26
+        console.error(err);
27
+
28
+        // 重来一次
29
+        redirect();
30
+      });
31
+    }
32
+  }
33
+
34
+  initUser();
35
+  
36
+  share();
8 37
 
9 38
 </script>
10 39
 

+ 9
- 4
src/main.js 查看文件

@@ -3,13 +3,10 @@ import 'animate.css'
3 3
 
4 4
 import App from './App.vue'
5 5
 import store from './store'
6
-import wxsdk from './utils/wx'
7 6
 import router from './router'
8 7
 import i18n from './i18n'
9 8
 
10
-
11 9
 import './style.less'
12
-// const { share } = wxsdk(location.href)
13 10
 
14 11
 const app = createApp(App);
15 12
 app.use(store);
@@ -17,4 +14,12 @@ app.use(router);
17 14
 app.use(i18n);
18 15
 app.mount('#app');
19 16
 
20
-// share();
17
+// 播放第一个视频
18
+document.addEventListener('WeixinJSBridgeReady', () => {
19
+  const t = setTimeout(() => {
20
+    const vid = document.querySelector('#firstVideo');
21
+    if (vid) {
22
+      vid.play();
23
+    }
24
+  }, 500);
25
+});

+ 13
- 1
src/store/index.js 查看文件

@@ -32,6 +32,18 @@ const useAudio = () => {
32 32
   }
33 33
 };
34 34
 
35
-const store = createStore({ 'audio': useAudio });
35
+
36
+const useUser = () => {
37
+  const user = ref();
38
+
39
+  const setUser = v => user.value = v;
40
+
41
+  return {
42
+    user,
43
+    setUser,
44
+  }
45
+}
46
+
47
+const store = createStore({ user: useUser, audio: useAudio });
36 48
 
37 49
 export default store;

+ 97
- 0
src/utils/request.js 查看文件

@@ -0,0 +1,97 @@
1
+import axios from "axios";
2
+
3
+const instance = axios.create({
4
+  timeout: 10000,
5
+  withCredentials: true, // 跨域
6
+});
7
+
8
+
9
+// 添加请求拦截器
10
+instance.interceptors.request.use(function (config) {
11
+  const { headers = {}, method = 'get', responseType = 'json', download = false, silent } = config;
12
+  const token = localStorage.getItem('token') || '';
13
+
14
+  // debugger
15
+  let noTip = silent;
16
+  if (noTip === undefined) {
17
+    noTip = method.toLocaleLowerCase() === 'get' ? true : false;
18
+  }
19
+
20
+  // 在发送请求之前做些什么
21
+  return {
22
+    ...config,
23
+    silent: noTip,
24
+    headers: {
25
+      ...headers,
26
+      Authorization: token,
27
+    },
28
+    responseType: download ? 'blob' : responseType,
29
+  };
30
+}, function (error) {
31
+  // 对请求错误做些什么
32
+  return Promise.reject(error);
33
+});
34
+
35
+// 添加响应拦截器
36
+instance.interceptors.response.use(function (response) {
37
+  // 2xx 范围内的状态码都会触发该函数。
38
+  // 对响应数据做点什么
39
+
40
+  const { data, config } = response;
41
+
42
+  if (config.download && !data.code) {
43
+    return downloadBlob(response, '下载文件');
44
+  }
45
+
46
+  if (data.code === 1000) {
47
+    // if (data.data.token) {
48
+    //   localStorage.setItem('token', data.data.token);
49
+    // }
50
+
51
+    // if (!config.silent) {
52
+    //   message.success('操作成功');
53
+    // }
54
+
55
+    return data.data;
56
+  } else if (data.code === 1001) {
57
+    // if (!config.silent) {
58
+    //   message.error('未登录或者超时, 请重新登录');
59
+    // }
60
+  } else {
61
+    console.log(config)
62
+    // if (!config.silent) {
63
+    //   const errMsg = data.message || '系统错误';
64
+    //   message.error(errMsg.indexOf('exception') > -1 ? '服务异常' : errMsg);
65
+    // }
66
+  }
67
+
68
+  return Promise.reject(response);
69
+}, function (error) {
70
+  // 超出 2xx 范围的状态码都会触发该函数。
71
+  // 对响应错误做点什么
72
+
73
+  console.error(error);
74
+
75
+  return Promise.reject("网络异常, 请重试...");
76
+});
77
+
78
+export default instance;
79
+
80
+function downloadBlob (response) {
81
+  let fileName = '未知文件';
82
+  const contentType = response.headers['content-type'];
83
+  const contentDisposition = response.headers['content-disposition'];
84
+  if (contentDisposition) {
85
+    const parts = contentDisposition.split(';filename=');
86
+    if (parts[1]) {
87
+      fileName = decodeURIComponent(parts[1]);
88
+    }
89
+  }
90
+
91
+  const url = window.URL.createObjectURL(new Blob([response.data], { type: contentType }));
92
+  const link = document.createElement('a');
93
+  link.href = url;
94
+  link.setAttribute('download', fileName);
95
+  link.click();
96
+  window.URL.revokeObjectURL(url);
97
+}

+ 11
- 0
src/utils/track.js 查看文件

@@ -0,0 +1,11 @@
1
+import request from './request'
2
+
3
+export default function(code) {
4
+  const data = {
5
+    code,
6
+    url: window.location.href,
7
+    ua: window.navigator.userAgent,
8
+  }
9
+
10
+  return request.post('/api/wx/taTrack', data);
11
+}

+ 31
- 2
src/utils/wx.js 查看文件

@@ -1,5 +1,5 @@
1 1
 
2
-function wxsdk(url) {
2
+function wxsdk() {
3 3
   const isDev = import.meta.env.DEV
4 4
 
5 5
   // API_BASE 来源 public/config.js
@@ -24,6 +24,9 @@ function wxsdk(url) {
24 24
   ]
25 25
 
26 26
   function init() {
27
+    if (isDev) return;
28
+    const url = window.location.href;
29
+
27 30
     // 请求后台接口
28 31
     fetch(`${apiBase}?url=${encodeURIComponent(url)}`).then(res => res.json()).then((res) => {
29 32
       if (res.code === 1000) {
@@ -62,8 +65,34 @@ function wxsdk(url) {
62 65
     });
63 66
   }
64 67
 
68
+  /**
69
+   * 获取 code
70
+   * @returns 
71
+   */
72
+  function getCode () {
73
+    if (isDev) return '123';
74
+
75
+    const matched = /[?&]*code=([^&]+)/.exec(location.search)
76
+    if (matched) {
77
+      return decodeURIComponent(matched[1])
78
+    }
79
+  }
80
+  
81
+  /**
82
+   * 跳转授权页面
83
+   */
84
+  function redirect () {
85
+    if (isDev) return;
86
+
87
+    const local = encodeURIComponent(location.origin + location.pathname)
88
+    const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd3bab568bc42d1de&redirect_uri=${local}&response_type=code&scope=snsapi_base&state=123#wechat_redirect`
89
+    window.location.href = url;
90
+  }
91
+
65 92
   return {
66
-    share
93
+    share,
94
+    getCode,
95
+    redirect,
67 96
   }
68 97
 }
69 98
 

+ 1
- 1
vite.config.js 查看文件

@@ -9,7 +9,7 @@ export default defineConfig({
9 9
     host: '0.0.0.0',
10 10
     proxy: {
11 11
       '/api': {
12
-        target: 'http://127.0.0.1:7088',
12
+        target: 'http://127.0.0.1:7937',
13 13
       }
14 14
     }
15 15
   },

+ 57
- 0
yarn.lock 查看文件

@@ -170,11 +170,32 @@ animate.css@^4.1.1:
170 170
   resolved "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz#614ec5a81131d7e4dc362a58143f7406abd68075"
171 171
   integrity sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==
172 172
 
173
+asynckit@^0.4.0:
174
+  version "0.4.0"
175
+  resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
176
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
177
+
178
+axios@^1.2.1:
179
+  version "1.2.1"
180
+  resolved "https://registry.npmmirror.com/axios/-/axios-1.2.1.tgz#44cf04a3c9f0c2252ebd85975361c026cb9f864a"
181
+  integrity sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==
182
+  dependencies:
183
+    follow-redirects "^1.15.0"
184
+    form-data "^4.0.0"
185
+    proxy-from-env "^1.1.0"
186
+
173 187
 base64-arraybuffer@^1.0.2:
174 188
   version "1.0.2"
175 189
   resolved "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
176 190
   integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
177 191
 
192
+combined-stream@^1.0.8:
193
+  version "1.0.8"
194
+  resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
195
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
196
+  dependencies:
197
+    delayed-stream "~1.0.0"
198
+
178 199
 copy-anything@^2.0.1:
179 200
   version "2.0.6"
180 201
   resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
@@ -201,6 +222,11 @@ debug@^3.2.6:
201 222
   dependencies:
202 223
     ms "^2.1.1"
203 224
 
225
+delayed-stream@~1.0.0:
226
+  version "1.0.0"
227
+  resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
228
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
229
+
204 230
 errno@^0.1.1:
205 231
   version "0.1.8"
206 232
   resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
@@ -341,6 +367,20 @@ estree-walker@^2.0.2:
341 367
   resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
342 368
   integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
343 369
 
370
+follow-redirects@^1.15.0:
371
+  version "1.15.2"
372
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
373
+  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
374
+
375
+form-data@^4.0.0:
376
+  version "4.0.0"
377
+  resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
378
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
379
+  dependencies:
380
+    asynckit "^0.4.0"
381
+    combined-stream "^1.0.8"
382
+    mime-types "^2.1.12"
383
+
344 384
 fsevents@~2.3.2:
345 385
   version "2.3.2"
346 386
   resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
@@ -432,6 +472,18 @@ make-dir@^2.1.0:
432 472
     pify "^4.0.1"
433 473
     semver "^5.6.0"
434 474
 
475
+mime-db@1.52.0:
476
+  version "1.52.0"
477
+  resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
478
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
479
+
480
+mime-types@^2.1.12:
481
+  version "2.1.35"
482
+  resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
483
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
484
+  dependencies:
485
+    mime-db "1.52.0"
486
+
435 487
 mime@^1.4.1:
436 488
   version "1.6.0"
437 489
   resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
@@ -485,6 +537,11 @@ postcss@^8.1.10, postcss@^8.4.18:
485 537
     picocolors "^1.0.0"
486 538
     source-map-js "^1.0.2"
487 539
 
540
+proxy-from-env@^1.1.0:
541
+  version "1.1.0"
542
+  resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
543
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
544
+
488 545
 prr@~1.0.1:
489 546
   version "1.0.1"
490 547
   resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"