2024.01 unaipp小程序开发问题记录

解决登录拦截,一个页面多个需要登陆的接口会重复跳转登录页面问题

async function request(url, params = {}, method, load = true) {
  if (load) {
    uni.showLoading({
      title: '请稍候',
      mask: true,
    });
  }

  //判断是post请求,需要处理token挂载信息
  var contentType = '';
  let cookieName = uni.getStorageSync('cookieName') || '';
  let token = uni.getStorageSync(cookieName) || '';
  if (method === 'post') {
    // url = url + '?hongxin=' + token
    contentType = 'application/json';
  } else {
    // params.hongxin = token
    contentType = 'application/x-www-form-urlencoded';
  }
  let [error, res] = await uni.request({
    url: url,
    data: params,
    method: method,
    header: {
      'content-type': contentType,
      Cookie: `${cookieName}=${token}`,
    },
  });
  if (load) {
    uni.hideLoading();
  }

  //不校验verifyCode接口
  if (url.indexOf('buyer/verifyCode') != -1) {
    return res.data;
  } else {
    // console.log('res.data', res.data)
    //登录失效,跳转登录页面
    if (res.data.code == 401) {
      jumpToLogin();

      return false;
    }
    if (res.data.code == 200) {
      return res.data;
    } else {
      if (res.data) {
        if (!res.data.msg) {
          res.data.msg = res.data.data;
        }
        uni.showToast({
          title: res.data.msg ? res.data.msg : '操作成功',
          icon: 'none',
        });
      }
    }
  }

  return false;
}

//跳转登录页面
function jumpToLogin() {
//uniapp可以从getCurrentPages中拿到页面历史栈信息
  const pageStack = getCurrentPages();

  const page = pageStack[pageStack.length - 1].$page;
  console.log('jumpToLogin', page.fullPath);
  //判断当前是否是登录页面,解决一个页面请求多个需要登录的接口时会重复跳转登录页面的问题,判断如果jump是true时就不再跳转到登录页面
  var jump = uni.getStorageSync('jump');
  if (jump) return;
  //存储当前页面的完整路径,登录完成后需要从本地存储中拿到登录前页面信息,登录完成后返回该页面
  store.commit('SAVE_PRE_LOGON_PATH', page);

  uni.reLaunch({
    url: `/pages/my/login/index`,
  });
}

登录页面

//生命周期函数中
mounted(){
    //解决多个页面重复登陆的问题,如果已经跳转到登陆页面了移除jump,这样第二次走jumpToLogin方法时就会被拦截
    uni.removeStorageSync('jump');
    console.log(this.$refs)
},

//登录方法完成后的操作,preLoginPath是存在store中的
login(params).then((loginRes) => {
   const { cookieValue, user, cookieName } = loginRes.data;
   that.$store.commit('SET_USER_INFO', {
        user: user,
        cookieName,
        cookieValue,
   });

//返回上一级页面
   uni.reLaunch({
       url: that.preLoginPath,
     });
   });

分享带分享人功能

解决:从分享的url中拿到全路径,从全路径中拿到参数信息,referenceId为分享人的id,保存分享人id,然后在新用户登录时将referenceId参数传入

//分享页面处理逻辑
onLoad(){
//存储当前信息
    const pageStack = getCurrentPages();
    console.log(pageStack);

    const page = pageStack[pageStack.length - 1].$page;
    console.log('page', page);
    //存储当前页面的完整路径
    this.$store.commit('SAVE_PRE_LOGON_PATH', page);
    console.log(page.fullPath);
    const path = page.fullPath;

    const urlString = path;
    const queryString = urlString && urlString.split('?')[1]; // 获取查询参数部分
    const params1 = {};

    queryString &&
      queryString.split('&').forEach((param) => {
        const [key, value] = param.split('=');
        params1[key] = value;
      });

    const referenceId = params1['referenceId'];
    this.$store.commit('SAVE_SHARE_PATH', path + `&referenceId=${referenceId}`);
    uni.setStorageSync('referenceId', referenceId);
}

//登录页面处理逻辑
//从store中获取分享路径
const urlString = this.sharePath;

console.log('sharePath', this.sharePath);
//从分享路径中拿到分享人参数
const queryString = urlString && urlString.split('?')[1]; // 获取查询参数部分
const params1 = {};

queryString &&
  queryString.split('&').forEach((param) => {
    const [key, value] = param.split('=');
    params1[key] = value;
  });

const referenceId = params1['referenceId'];
let params = {};
if (referenceId) {
  params = {
    openid,
    code: phoneCode,
    referenceId: referenceId,
  };
} else {
  params = {
    openid,
    code: phoneCode,
  };
}
login(params).then((loginRes) => {
//登录逻辑
});
});

使用vant-ui组件库

需要使用vant-ui小程序版本

下载vant-webapp压缩包,解压好后在项目跟目录新建wxcomponents/vant目录,将解压好的压缩包中的dist目录复制进wxcomponents/vant目录。

使用:

//pages.json
 "globalStyle": {
        "usingComponents": {
            "van-calendar":"wxcomponents/vant/dist/calendar/index",
        }
    },
    
//项目中使用
<van-divider />
  • 通栏时,刘海屏手机需要手动计算高度,获取标题栏、状态栏高度
export const globalPage = {
  data() {
    return {
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      globalData: {
        statusBarHeight: 0,
        navHeight: 0,
        navigationBarHeight: 0,
        menuButtonWidth: 0,
      },
    };
  },
  mounted: function () {
    //获取状态栏高度
    this.globalData.statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
    //#ifdef MP-WEIXIN
    //获取menu按钮的高度
    const custom = uni.getMenuButtonBoundingClientRect();
    console.log('custom', custom);
    this.globalData.menuButtonWidth = custom.width;
    //标题栏高度
    this.globalData.navigationBarHeight =
      custom.height + (custom.top - this.globalData.statusBarHeight) * 2;
    this.globalData.navHeight =
      this.globalData.navigationBarHeight + this.globalData.statusBarHeight;
    //#endif

    console.log('App Launch', this.globalData);
  },
};

使用单号生成二维码

网上搜了很多库发现不是cancas生成有问题就是这些库不兼容使用import方式导入的引用,这些库的底层其实都是js,所以干脆安装完uniapp-qrcode库后,在自己项目工具类目录下文件下新建qrcode工具类,将实现复制到自己项目即可

使用:

import wxbarcode from "@/utils/qrcode/index.js";

//生成二维码方法
generatorQrcode(item){
    //根据订单号生成二维码
  wxbarcode.qrcode('qrcode', item.orderNo, 480, 480);
  this.showQrcode = true;
}


    <!--展示二维码弹窗-->
    <van-overlay :show="showQrcode">
    
      <view class="qrcode-wrap">
        <text class="iconfont icon-guanbi" @click.stop="showQrcode = false"></text>
      <canvas canvas-id="qrcode"></canvas>
    </view>
    </van-overlay>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容