【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】

简介: 【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】

说明

项目基于若依管理系统进行开发,部分接口来源于若依管理系统后端项目,如本文的登录接口、获取验证码接口。

请求包创建

小程序的数据需要向后端发请求进行获取,为了简化后续的开发,需要创建一个包专门存放所有发请求的js方法。

创建文件夹

创建api的存放包

再创建工具js的存放包

请求工具request.js

注意使用该文件,请修改baseUrl对应的值,配置好你的后端的请求Ip和端口。

export default {
  common: {
    baseUrl: 'http://localhost:8085',
    // 如果需要真机调试,打开cmd使用ipconfig命令,这样手机才可以在同一局域网访问到后端
    // baseUrl: 'http://10.23.12.180:6001',
    data: {},
    header: {},
    method: "GET",
    dataTyoe: 'json'
  },
  /**
   * 请求拦截器
   */
  request(options = {}) {
    let token = uni.getStorageSync('token')
    if (token) {
      this.common.header = {
        'token': token,
        // 若依管理系统后端识别的是这个
        'Authorization': token
      }
    }
    options.url = this.common.baseUrl + options.url;
    options.data = options.data || this.common.data;
    options.header = options.header || this.common.header;
    options.method = options.method || this.common.method;
    options.dataTyoe = options.dataTyoe || this.common.dataTyoe;
    return new Promise((res, rej) => {
      uni.request({
        ...options,
        success: (result) => {
          // console.log("请求响应:" + JSON.stringify(result));
          let data = result.data;
          if (data.code != 200) {
            // 报错提示
            // uni.showToast({
            //  title: data.msg,
            //  icon: 'none',
            //  duration: 2000
            // })
            if (data.code == 401) {
              console.log("跳转到登录页")
              // 清除掉token,因为token在后端已经过期
              uni.clearStorage();
              uni.reLaunch({
                url: "/pages/login/login"
              })
            } else {
              // catch可以接收data
              return rej(data);
            }
          }
          // then可以接收data
          res(data);
        }
      })
    })
  },
}

关于下面所示的代码,需要根据你的后端来修改,例如你的响应码不一定叫code,你的信息也不一定叫做msg,请求成功的状态码不一定是200,登录的token失效的状态码不一定是401,需要改成自己的

success: (result) => {
// console.log("请求响应:" + JSON.stringify(result));
  let data = result.data;
  if (data.code != 200) {
    // 报错提示
    // uni.showToast({
    //  title: data.msg,
    //  icon: 'none',
    //  duration: 2000
    // })
    if (data.code == 401) {
      console.log("跳转到登录页")
      // 清除掉token,因为token在后端已经过期
      uni.clearStorage();
      uni.reLaunch({
        url: "/pages/login/login"
      })
    } else {
      // catch可以接收data
      return rej(data);
    }
  }
  // then可以接收data
  res(data);
}

登录功能实现

请求方法

创建login.js文件

import httpRequest from '@/utils/request'
// 登录方法
export function login(username, password, code, uuid) {
  const data = {
    username,
    password,
    code,
    uuid
  }
  return httpRequest.request({
    url: '/login',
    headers: {
      isToken: false
    },
    method: 'post',
    data: data
  })
}
// 获取验证码
export function getCodeImg() {
  return httpRequest.request({
    url: '/captchaImage',
    headers: {
      isToken: false
    },
    method: 'get',
    timeout: 20000
  })
}

页面

创建login.vue文件

<template>
  <view class="login">
    <u-toast ref="uToast"></u-toast>
    <view class="form">
      <view class="title">
        <text>易售二手平台</text>
      </view>
      <u--form labelPosition="left" :model="model" :rules="rules" ref="loginForm">
        <u-form-item prop="loginForm.username" leftIcon="account-fill" borderBottom ref="item1">
          <view class="item">
            <u--input v-model="model.loginForm.username" border="none"></u--input>
          </view>
        </u-form-item>
        <u-form-item prop="loginForm.password" leftIcon="lock-fill" borderBottom ref="item1">
          <view class="item">
            <u--input v-model="model.loginForm.password" password border="none"></u--input>
          </view>
        </u-form-item>
        <u-form-item prop="loginForm.code" leftIcon="integral-fill" borderBottom ref="item1">
          <view class="item">
            <u-input v-model="model.loginForm.code" clearable border placeholder="验证码"></u-input>
            <img :src="codeUrl" @click="getCode" class="login-code-img" />
          </view>
        </u-form-item>
      </u--form>
      <view style="margin-top: 20rpx;">
      </view>
      <u-button type="primary" class="login-button" @click="login()">登录</u-button>
    </view>
  </view>
</template>
<script>
  import {
    getCodeImg,
    login
  } from "@/api/login";
  export default {
    data() {
      return {
        model: {
          loginForm: {
            username: 'admin',
            password: 'admin123',
            uuid: '',
            code: '',
          },
        },
        // 登录表单字段校验过程
        rules: {
          'loginForm.username': {
            type: 'string',
            required: true,
            message: '请填写用户名',
            trigger: ['blur', 'change']
          },
          'loginForm.password': {
            type: 'string',
            required: true,
            message: '请填写密码',
            trigger: ['blur', 'change']
          },
          'loginForm.code': {
            type: 'number',
            required: true,
            message: '请输入数字类型的验证码',
            trigger: ['blur', 'change']
          },
        },
        codeUrl: "",
      }
    },
    onReady() {
      //onReady 为uni-app支持的生命周期之一
      this.$refs.loginForm.setRules(this.rules)
    },
    created() {
      let token = uni.getStorageSync('token')
      if (token) {
        this.toIndex();
      }
      this.getCode();
    },
    methods: {
      /**
       * 获取验证码
       */
      getCode() {
        // console.log("获取验证码")
        getCodeImg().then(res => {
          // console.log("获取验证码:" + JSON.stringify(res))
          let captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
          if (captchaEnabled) {
            this.codeUrl = "data:image/gif;base64," + res.img;
            this.model.loginForm.uuid = res.uuid;
          }
        });
      },
      login() {
        this.$refs.loginForm.validate().then(res => {
          // console.log("登录:");
          login(this.model.loginForm.username, this.model.loginForm.password, this.model.loginForm.code,
            this.model
            .loginForm.uuid).then(
            res => {
              // console.log("登录:" + JSON.stringify(res))
              // 存储token
              uni.setStorage({
                key: "token",
                data: res.token,
                success: (res) => {
                  this.toIndex();
                }
              })
            }).catch(res => {
            this.$refs.uToast.show({
              type: 'error',
              message: res.msg
            })
          })
        }).catch(errors => {
          this.$refs.uToast.show({
            type: 'error',
            message: "表单数据校验失败,请检查后再登录"
          })
        })
      },
      toIndex() {
        // 跳转到首页
        uni.reLaunch({
          url: "/pages/index/index"
        })
      }
    }
  }
</script>
<style lang="scss">
  .login {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    // background: #2b92ff;
    background-color: #0093E9;
    background-image: linear-gradient(135deg, #0093E9 0%, #80D0C7 100%);
    .title {
      width: 100%;
      font-weight: bold;
      font-size: 45rpx;
      display: flex;
      align-items: center;
      justify-content: center;
      margin-bottom: 30rpx;
    }
    .form {
      width: 600rpx;
      background: #ffffff;
      padding: 30rpx;
      border-radius: 20rpx;
      .item {
        display: flex;
        height: 80rpx;
      }
      .login-code-img {
        float: right;
        height: 80rpx;
        width: 160rpx;
        padding-left: 12rpx;
      }
      .login-button {
        margin-top: 50rpx;
        width: 80%;
      }
    }
  }
</style>

涉及知识点

错误提示

当用户登录时密码或者验证码出错时,需要提示用户登录出错的原因

this.$refs.uToast.show({
  type: 'error',
  message: res.msg
})

前端校验

现在出错是后端校验的,其实前端也可以做很多校验,在前端不让不合法的输入提交,这样可以减轻后端服务器的压力。如已经验证码为算术题,答案肯定是数字,那就限制用户不能输入字符串。

首先需要定义规则,如下面的代码

rules: {
  'loginForm.username': {
  type: 'string',
    required: true,
    message: '请填写用户名',
    trigger: ['blur', 'change']
  },
  'loginForm.password': {
    type: 'string',
    required: true,
    message: '请填写密码',
    trigger: ['blur', 'change']
  },
  'loginForm.code': {
    type: 'number',
    required: true,
    message: '请输入数字类型的验证码',
    trigger: ['blur', 'change']
  },
},

在页面初始化的时候,给表单设置规则,如下面的代码

onReady() {
  //onReady 为uni-app支持的生命周期之一
  this.$refs.loginForm.setRules(this.rules)
},

最后使用:rules="rules"给表单绑定规则,如下面的代码

<u--form labelPosition="left" :model="model" :rules="rules" ref="loginForm">

在点击登录按钮之后,一定要通过校验之后,才真正向后端发请求

this.$refs.loginForm.validate().then(res => {
   // 校验通过之后,向后端发登录请求
}).catch(errors => {
  this.$refs.uToast.show({
    type: 'error',
    message: "表单数据校验失败,请检查后再登录"
  })
})

当校验不通过时,不会发请求

设置token到客户端缓存中

当用户登录成功之后,后端给前端返回一个凭证,即token,可以理解为一把钥匙,用户后面访问其他接口的时候,就带上这把钥匙,后端判断用户有钥匙之后,就让用户访问接口。当然,钥匙是有过期时间的,当过期之后,用户就需要重新登录。下面是设置缓存的代码:

uni.setStorage({
  key: "token",
  data: res.token,
  success: (res) => {
    // 跳转到首页
  }
})

在前面的request.js文件中,有这么一段代码,作用就是在发请求之前,从缓存中取出token对应的值,然后放到请求头中,这样后端就可以去请求头中获取token的值

let token = uni.getStorageSync('token')
if (token) {
  this.common.header = {
    'token': token
  }
}

路由跳转

当登录成功之后,需要跳转到小程序首页

// 跳转到首页
uni.reLaunch({
  url: "/pages/index/index"
})

如果已经登录过,访问登录页直接跳转到首页

created() {
  let token = uni.getStorageSync('token')
  if (token) {
    this.toIndex();
  }
  this.getCode();
},


目录
相关文章
|
8天前
|
JSON 小程序 前端开发
创建一个属于自己的小程序(注册开发账号)
介绍如何创建微信小程序账号,包括注册流程、下载安装微信开发者工具、创建项目以及项目结构介绍。
创建一个属于自己的小程序(注册开发账号)
ly~
|
8天前
|
开发框架 小程序 前端开发
抖音小程序的开发难度大吗?
抖音小程序的开发难度因人而异,主要取决于开发者经验、技能及功能需求。技术上需掌握前端技术及抖音开发框架,了解平台生态与规则;设计上需符合用户审美和习惯,具备创新性和实用性。此外,严格的审核标准和激烈的市场竞争增加了开发难度,开发者需制定有效推广策略并持续优化小程序以保持竞争力。
ly~
41 4
|
8天前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
8天前
|
小程序 开发者
微信小程序之网络数据请求 wx:request的简单使用
这篇文章介绍了微信小程序中如何使用wx.request进行网络数据请求,包括请求的配置、请求的格式以及如何在开发阶段关闭请求的合法检验。
微信小程序之网络数据请求 wx:request的简单使用
|
8天前
|
小程序 PHP
微信小程序给 thinkphp后端发送请求出现错误 Wrong number of segments 问题的解决 【踩坑记录】
本文记录了微信小程序向ThinkPHP后端发送请求时出现"Wrong number of segments"错误的解决方法。问题原因是小程序请求header中的token变量名写错,导致token未正确传递至后端。作者提供了详细的检查步骤和建议,包括验证URL路径、参数规范和路由配置的匹配,以确保请求能正确发送和处理。
|
2月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
62 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
2月前
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
61 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
|
2月前
|
存储 小程序 JavaScript
|
2月前
|
小程序 前端开发 安全
|
3月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的汉服交易小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的汉服交易小程序的详细设计和实现(源码+lw+部署文档+讲解等)
44 7
下一篇
无影云桌面