前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

img

这个章节主要实现以下功能:

  1. 页面开发
  2. 账号登录
  3. 授权登录

# 页面开发

<template>
    <view>
        <view class="login-form">
            <input class="input-row js-input-numer" v-model="account" type="number" maxlength="11" placeholder="输入手机号"/>
            <input class="input-row" v-model="password" @confirm="bindLogin" type="password" maxlength="20" placeholder="输入密码" confirm-type="登录"/>
            <button type="button" class="btn login-btn" @click="bindLogin">登录</button>
            <view class="bot flex-box">
                <navigator class="sign" hover-class="none">立即注册</navigator>
                <navigator class="forget" hover-class="none">忘记密码?</navigator>
            </view>
        </view>
        <view class="auth-row" v-if="hasProvider">
            <view class="auth-image" v-for="provider in providerList" :key="provider.value">
                <!-- #ifdef APP-PLUS -->
                <image class="img" :src="provider.image" @click="authLogin(provider.value)"></image>
                <!-- #endif -->
                <!-- 小程序处理 -->
                <!-- #ifdef MP-WEIXIN -->
                <button v-if="provider.value == 'weixin'" class="log-btn" open-type="getUserInfo" @getuserinfo="getUserInfo">
                    <image class="img" :src="provider.image"></image>
                </button>
                <!-- #endif -->
            </view>
        </view>
    </view>
</template>
<script>

export default {
    data() {
        return {
            hasProvider: false, // 是否有服务商平台可登录
            providerList: [],
            account: '',
            password: ''
        };
    },
    onReady() {
        this.getProvider();
        // #ifdef H5
        this.$nextTick(() => {
            document.querySelector('.js-input-numer input').setAttribute("pattern", "[0-9]*")
        })
        // #endif
    },
    methods: {
        // 获取服务供应商
        getProvider() {
            const  providerList = ['weixin', 'qq', 'sinaweibo'];
            // 判断是否用某种登录工具登录
            uni.getProvider({
                service: 'oauth',
                success: res => {
                    if (res.provider && res.provider.length) {
                        for (let i = 0; i < res.provider.length; i++) {
                            var tempProvider = res.provider[i];
                            if (~providerList.indexOf(tempProvider)) {
                                this.providerList.push({
                                    value: tempProvider,
                                    image: '../../static/image/login/' + tempProvider + '.png'
                                });
                            }
                        }
                        this.hasProvider = true;
                    }
                },
                fail: err => {
                    console.error('获取服务供应商失败:' + JSON.stringify(err));
                }
            });
        },
        // 账号登录
        bindLogin() {
            /**
             * 客户端对账号信息进行一些必要的校验。
             * 实际开发中,根据业务需要进行处理,这里仅做示例。
             */
            const account = this.account.trim()
            const password = this.password.trim()
            if (account == '') {
                this.alert('请输入手机号')
                return;
            }
            if(!(/^1[3456789]\d{9}$/.test(account))){
                this.alert("手机号码有误,请重填");
                return false;
            }
            if (password.length < 6) {
                uni.showToast({
                    icon: 'none',
                    title: '密码最短为 6 个字符'
                });
                return;
            }

            uni.showLoading({
                title: '登录中'
            });

            const params = {
                phone: this.account,
                password: this.password
            };
            // 登录请求业务
            //
            // ...
        },
        // 授权登录
        authLogin(value) {
            uni.login({
                provider: value,
                success: res => {
                    uni.getUserInfo({
                        provider: value,
                        success: infoRes => {
                            c
fe
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏