秦坤助贷开发文档

所需技术栈以及参考资料

  • Vue2 vuejs
  • TS TypeScript
  • 在vue2中使用TS 需要的插件 vuex-persistedstate、vuex-module-decorators、vue-property-decorator
  • uni-app
  • router 插件 uni-simple-router
  • 微信SDK
  • mockjs 模拟数据

项目流程图

image.png

smile-vue-router 插件使用

  1. 任务栏:
  2. 1、配置routes,实现路由匹配
  3. 2、实现登录拦截
  4. 3、第一次进入系统时触发vue-router

1、配置routes,实现路由匹配

  1. # vue.config.js
  2. // 在vue.config.js 文件中配置以下代码,自动获取uni-app pages.json里面路由配置
  3. const TransformPages = require('uni-read-pages')
  4. const {webpack} = new TransformPages()
  5. module.exports = {
  6. configureWebpack: {
  7. plugins: [
  8. new webpack.DefinePlugin({
  9. ROUTES: webpack.DefinePlugin.runtimeValue(() => {
  10. const tfPages = new TransformPages({
  11. // 读取pages.json 中 对应属性
  12. includes: ['path','name', 'aliasPath','meta']
  13. });
  14. return JSON.stringify(tfPages.routes)
  15. }, true )
  16. })
  17. ]
  18. },
  19. }
  20. // 如何使用--在页面中直接使用 ROUTES
  21. // 在router/index.ts 文件中使用
  22. routes: [
  23. ...ROUTES,
  24. {
  25. path: '*',
  26. redirect:(to: Router)=>{
  27. return {name:'404'}
  28. }
  29. }
  30. ]
  31. # pages.json
  32. "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
  33. {
  34. "path": "pages/index/index",
  35. "style": {
  36. "navigationBarTitleText": "首页",
  37. // meta 自定义属性,可以在这个属性里配置其他的自定义属性,在vue-router里读取出来
  38. "meta": {
  39. "pageType": "tabBar"
  40. },
  41. "navigationStyle": "custom",
  42. "app-plus" : {
  43. "bounce" : "none" // 取消APP端iOS回弹,避免与下拉刷新冲突 (可统一配在 'globalStyle')
  44. }
  45. }
  46. },
  47. ...
  48. ]

2、实现登录拦截

  1. # router/index.ts
  2. import {RouterMount,createRouter, Router, totalNextRoute, navtoRule} from 'uni-simple-router';
  3. import { STORE_USER } from '@/store/index';
  4. // 配置路由
  5. const router = createRouter({
  6. platform: process.env.VUE_APP_PLATFORM,
  7. routes: [
  8. ...ROUTES,
  9. {
  10. path: '*',
  11. redirect:(to: Router)=>{
  12. return {name:'404'}
  13. }
  14. }
  15. ]
  16. });
  17. // 路由拦截,在路由响应之前处理
  18. router.beforeEach((to, from, next) => {
  19. routerBefore(to, from);
  20. next();
  21. });
  22. // 路由拦截,在路由响应之后处理
  23. router.afterEach((to, from) => {
  24. // routerBefore(to, from, router.push);
  25. })
  26. // 自定义路由处理函数
  27. function routerBefore(to: totalNextRoute, from: totalNextRoute) {
  28. const { userAuto, merchantAuto } = to.meta as any;
  29. // 校验用户是否登录
  30. if(userAuto && !sessionStorage.getItem("token")) {
  31. STORE_USER.emitAuthLogin({type: 'user', token: STORE_USER.getToken, to: to.path, from: from.path});
  32. }
  33. // 校验资方是否登录
  34. if(merchantAuto && !sessionStorage.getItem("mc-token")) {
  35. STORE_USER.emitAuthLogin({type: 'merchant', token: STORE_USER.getMCToken, to: to.path, from: from.path});
  36. }
  37. }
  38. export {
  39. router,
  40. RouterMount,
  41. routerBefore
  42. }

3、第一次进入系统时触发 vue-router

  1. # App.vue
  2. <script lang="ts">
  3. import { Vue } from 'vue-property-decorator';
  4. export default Vue.extend({
  5. mpType: 'app',
  6. onLaunch() {
  7. // 第一次进入系统,由于Router插件不能拦截,由以下实现登录鉴权
  8. if(window.performance.navigation.type === 0) {
  9. // performance.navigation.type = 0 表示用户不是刷新操作(刷新操作 = 1)
  10. // routerBefore(this.$Route as totalNextRoute, this.$Route as totalNextRoute);
  11. this.$Router.replace({ path: this.$Route.path, query: this.$Router.query})
  12. }
  13. console.log('App Launch')
  14. },
  15. onShow() {
  16. console.log('App Show')
  17. },
  18. onHide() {
  19. console.log('App Hide')
  20. }
  21. });
  22. </script>

store vuex状态管理

  1. 参考地址
  2. https://juejin.cn/post/6844903942275465230#heading-4

关闭mock / 使用mock

  1. # main.ts
  2. // 引入mock
  3. import "./mock/index.ts";
  4. // 禁止使用mock 注释掉这一行代码即可

微信SDK使用