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

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

说明

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

请求包创建

小程序的数据需要向后端发请求进行获取,为了简化后续的开发,需要创建一个包专门存放所有发请求的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();
},


目录
相关文章
|
15天前
|
小程序 前端开发 API
小程序全栈开发中的多端适配与响应式布局
【4月更文挑战第12天】本文探讨了小程序全栈开发中的多端适配与响应式布局。多端适配涉及平台和设备适应,确保统一用户体验;响应式布局利用媒体查询和弹性布局维持不同设备的布局一致性。实践中,开发者可借助跨平台框架实现多平台开发,运用响应式布局技术适应不同设备。同时,注意兼容性、性能优化和用户体验,以提升小程序质量和用户体验。通过这些方法,开发者能更好地掌握小程序全栈开发。
|
15天前
|
小程序 前端开发 API
微信小程序全栈开发中的异常处理与日志记录
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的异常处理和日志记录,强调其对确保应用稳定性和用户体验的重要性。异常处理涵盖前端(网络、页面跳转、用户输入、逻辑异常)和后端(数据库、API、业务逻辑)方面;日志记录则关注关键操作和异常情况的追踪。实践中,前端可利用try-catch处理异常,后端借助日志框架记录异常,同时采用集中式日志管理工具提升分析效率。开发者应注意安全性、性能和团队协作,以优化异常处理与日志记录流程。
|
15天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中PWA技术的应用,PWA结合Web的开放性和原生应用的性能,提供离线访问、后台运行、桌面图标和原生体验。开发者可利用Service Worker实现离线访问,Worker处理后台运行,Web App Manifest添加桌面图标,CSS和JavaScript提升原生体验。实践中需注意兼容性、性能优化和用户体验。PWA技术能提升小程序的性能和用户体验,助力开发者打造优质小程序。
|
7天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的教师管理系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的教师管理系统的详细设计和实现
35 2
|
7天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的健身管理系统及会员微信小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的健身管理系统及会员微信小程序的详细设计和实现
29 0
|
8天前
|
小程序 开发者
体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?
体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?
14 0
|
15天前
|
小程序 安全 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的身份认证与授权机制。身份认证包括手机号验证、微信登录和第三方登录,而授权机制涉及角色权限控制、ACL和OAuth 2.0。实践中,开发者可利用微信登录获取用户信息,集成第三方登录,以及实施角色和ACL进行权限控制。注意点包括安全性、用户体验和合规性,以保障小程序的安全运行和良好体验。通过这些方法,开发者能有效掌握小程序全栈开发技术。
|
15天前
|
小程序 前端开发 安全
小程序全栈开发中的跨域问题及其解决方案
【4月更文挑战第12天】本文探讨了小程序全栈开发中的跨域问题及其解决方案。跨域问题源于浏览器安全策略,主要体现在前后端分离、第三方服务集成和数据共享上。为解决此问题,开发者可采用CORS、JSONP、代理服务器、数据交换格式和域名策略等方法。实践中需注意安全性、兼容性和性能。通过掌握这些解决方案,开发者能更好地处理小程序的跨域问题,提升用户体验。
|
15天前
|
JavaScript 前端开发 小程序
微信小程序全栈开发之性能优化策略
【4月更文挑战第12天】本文探讨了微信小程序全栈开发的性能优化策略,包括前端的资源和渲染优化,如图片压缩、虚拟DOM、代码分割;后端的数据库和API优化,如索引创建、缓存使用、RESTful API设计;以及服务器的负载均衡和CDN加速。通过这些方法,开发者可提升小程序性能,优化用户体验,增强商业价值。
|
1月前
|
小程序 API
点餐小程序实战教程09-订单功能开发
点餐小程序实战教程09-订单功能开发