草庐IT

小程序云开发用户登录页面

菜鸭。 2023-04-19 原文

小程序云开发登录页面

先来看一下效果图

第一:思路

  1. 获取用户输入的账号和密码
    在HTML构造页面时选择了利用表单(form)提交(将form组件绑定登录事件,将按钮的form-type属性设置为“submit”),所以在点击登录按钮后,会将数据提交到前端。
       var fromType = e.detail.value;
       var username = fromType.username;
       var password = fromType.password;
  1. 判断输入账号和密码的合法性
    判断是否为空:利用获取的长度判断
        if (username.length == 0 || password.length == 0){
            wx.showToast({
              title: '账号或密码不能为空',
              icon:'none',
              duration:1500
            })
        }

判断是否匹配数据库
也就是去数据库中查找,是否存在这样的用户。如果不使用云开发,我们需要利用wx.request将数据传给服务器,然后接受服务器的状态码来判断下一步骤,验证部分将在服务器端完成。
在云开发中,数据库的操作十分简单。我们在验证前需要建立一个‘clients’的集合,并在集合中添加相应的数据即可。但同时也要注意数据库的设计,比如这里我的‘clients’。

名称含义
_id用户账号(唯一索引)
password用户密码
facePATH头像云存储路径
nickName昵称

facePATH 和nickName 是我后面要使用的数据,提前设计好会省力一些。但就我使用感受而言,后续加入列的操作也不算麻烦,因为云开发的数据库并不是直接确定一个集合的格式,集合内记录的内容可以不同。
除开自己设置的列外,应该还有一项_openid是必须的。这个值是每个微信号特有的,不能自己写。我当时是在写好注册页面时才发现,如果利用程序添加记录,则会自动添加这一列;手动则不行。这个值在测试这个页面时无需添加,后面注册页面有需求时再说。
*这里特别说明要注意这个数据库的权限,可以自己在云开发控制台修改

在js中连接数据库只需要创建数据库实例就可以了(在此之前需要配置好自己的云环境,具体见云开发文档

const db = wx.cloud.database();
const admid = db.collection('clients');

db就是数据库实例,admid就是我们操作集合的实例,接下来就可以对集合clients进行增删查改的操作。
*手动添加的密码是明文的不要紧,只要在input组件type的值为safe-password,真机调试程序上传到数据库时是密文的形式。而且手动添加的明文密码在真机调试的时候是无法匹配的,会显示密码错误
这里验证用户只需要用到查操作,也就是get。先判断用户名是否存在,再判断密码是否正确,这里由于没有设定条件,返回了整个集合。其实可以用where直接写入用户名和密码再让get去查询,如果返回空,则登录失败。如果返回集合,就登录成功(admit.where({}).get({})。详见微信开放文档。

            admid.get({
              success:(res) => {
                let user = res.data;
                //console.log(res.data);
                for (let i = 0; i < user.length; i++){
                  if (username === user[i]._id){//判断用户名是否存在
                    if (password !== user[i].password) {  //判断密码是否正确
                      wx.showToast({
                        title: '密码错误!',
                        icon: 'error',
                        duration: 2500
                      })
                    } else {
                      console.log('登陆成功!')
                      wx.showToast({
                        title: '登陆成功!!',
                        icon: 'success',
                        duration: 2500
                      })
                      wx.switchTab({   //跳转首页
                        url: '../home/home',  //这里的URL是你登录完成后跳转的界面
                      })
                    }
                  }else{
                    wx.showToast({
                      title: '无此用户名!',
                      icon: 'error',
                      duration: 2500
                    })
                  }
                }
              },
              fail:(res) =>{
                console.log("查询失败");
              }
            })
  1. 没有账号,注册
    绑定事件跳转即可,跳转页面也要注意是不是tabbar页面,如果是,则要使用wx.switchTab.
   goToRegist: function(e){
        wx.navigateTo({
          url: '../userRegist/userRegist',
        })
    },

二、代码部分

HTML

<!--pages/userLogin/userLogin.wxml-->
<view >
    <image src="/images/yinghua.jpg" class="img"></image>    
</view>

<view>
    <form bindsubmit="doLogin">
        <!-- 账号-->
        <view class="inputView">
            <image class="imgLo" src="/images/userName.png"></image>
            <label class="labelLo">账号</label>
            <input class="inputText" type="nickname" name="username" placeholder="请输入账号"/>
        </view>
        <view class="line"></view>
        <!--密码-->
        <view class="inputView">
            <image class="imgLo" src="/images/password.png"></image>
            <label class="labelLo">密码</label>
            <input class="inputText" type="safe-password" name="password" placeholder="请输入密码" password="true"/>
        </view>
        <!--登录按钮-->
        <view>
            <button class="loginBtn" form-type="submit">登录</button>
        </view>
        <!--跳转注册按钮-->
        <view>
            <button class="goToRegist" bindtap="goToRegist">没有账号?注册</button>
        </view>
    </form>

</view>

CSS

/* pages/userLogin/userLogin.wxss */
page{
    background-color: whitesmoke;
}
.img {
    width: 100%;
}
.inputView{
    background-color: white;
    line-height: 45px;
}
.imgLo{
    margin-left: 22px;
    width: 20px;
    height: 20px;
}
.labelLo{
    margin: 15px 15px 15px 10px;
    color: gray;
    font-size: 15px;
}
.inputText{
    float: right;
    text-align: right;
    margin-right: 22px;
    margin-top: 11px;
    font-size: 15px;
}
.line{
    width: 100%;
    height: 1px;
    background-color: gainsboro;
    margin-top: 1px;
}
.loginBtn {
    width: 80%;
    margin-top: 35px;
    background-color: rgb(240,176,183);
    color: white;
    border-radius: 98rpx;
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: center;
  }
.goToRegist{
    width: 80%;
    margin-top: 15px;
    color: rgb(240,176,183);
    border-radius: 98rpx;
}

JavaScript

// pages/userLogin/userLogin.js
const app = getApp();
const db = wx.cloud.database();
const admid = db.collection('clients');
Page({

    /**
     * 页面的初始数据
     */
    data: {
        // realUrl: '',
        openid: ''
    },

    /**
     * 生命周期函数--监听页面加载
     */
    //options接受别的页面传来的数据
    onLoad: function (options) {
    },
    //登录函数
    doLogin: function(e){
        app.globalData._OPENID = wx.getStorageSync(this.data.openid);
        //获取用户输入的用户名和密码
        var me = this;
        var fromType = e.detail.value;
        var username = fromType.username;
        var password = fromType.password;
        //判断密码和账号是否为空
        if (username.length == 0 || password.length == 0){
            wx.showToast({
              title: '账号或密码不能为空',
              icon:'none',
              duration:1500
            })
        }else{
            wx.showToast({
              title: '登录中...',
            })
            //轮询数据库,查找是否匹配记录
            let that = this;
            admid.get({
              success:(res) => {
                let user = res.data;
                //console.log(res.data);
                for (let i = 0; i < user.length; i++){
                  if (username === user[i]._id){//判断用户名是否存在
                    if (password !== user[i].password) {  //判断密码是否正确
                      wx.showToast({
                        title: '密码错误!',
                        icon: 'error',
                        duration: 2500
                      })
                    } else {
                      console.log('登陆成功!')
                      wx.showToast({
                        title: '登陆成功!!',
                        icon: 'success',
                        duration: 2500
                      })
                      wx.switchTab({   //跳转首页
                        url: '../home/home',  //这里的URL是你登录完成后跳转的界面
                      })
                    }
                  }else{
                    wx.showToast({
                      title: '无此用户名!',
                      icon: 'error',
                      duration: 2500
                    })
                  }
                }
              },
              fail:(res) =>{
                console.log("查询失败");
              }
            })
            // wx.request({
            //   url: 'url',  //请求服务器的网址
            //   method: "POST",
            //   data: {//请求的参数
            //       username: username,
            //       password: password,
            //   },
            //   header: {
            //       'content-type': 'application/joson',//默认值
            //   },
            //   success: function(res){
            //       var statusNow = res.data.statusCode;
            //       var realUrl = me.data.realUrl;
            //     if (statusNow == 200){//HTTP请求成功状态码
            //         wx.showToast({
            //           title: '登录成功!',
            //           icon: 'none',
            //           //成功登录后跳转到tabbar页面,使用功能
            //           success: function(){
            //                 setTimeout(function() {
            //                     if (realUrl != null && realUrl != undefined && realUrl != ''){
            //                         wx.redirectTo({
            //                           url: 'realUrl',//如果指定跳转到其他页面
            //                         })
            //                     }else{
            //                         wx.switchTab({
            //                           url: 'url',//跳转到主页
            //                         })
            //                     }
            //                 })
            //           }
            //         },500)
            //         app.setGlobalUserInfo(res.data);//缓存到本地
            //     }else if(statusNow == 500){//服务器内部错误
            //         wx.showToast({
            //           title: res.data.msg,
            //           icon: 'none',
            //           duration: 3000,
            //         })

            //     } 
            //   }
            // })
        }
        // console.log(username);
    },
    //跳转注册页面函数
    goToRegist: function(e){
        wx.navigateTo({
          url: '../userRegist/userRegist',
        })
    }

})

有关小程序云开发用户登录页面的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  10. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

随机推荐