目录

微信小程序前后端交互__完整的登录注册

微信小程序前后端交互__完整的登录注册

简介

微信小程序连接后端,后端的代码放的位置随便,后端运行之后,微信小程序模拟器会自动匹配

微信小程序官方文档给出的 发起 HTTPS 网络请求 的示例代码为

wx.request({
  url: 'example.php', //仅为示例,并非真实的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默认值
  },
  success (res) {
    console.log(res.data)
  }
})

url:后端运行后的网页对应的那个功能的网址

data:我们想要传到后端的数据

没有给出的method:默认为GET,header默认值就是GET对应的

method的值如果要使用POST,则header的值应该填写:

‘content-type’:‘application/x-www-form-urlencoded’

success(res){}:成功连接到后端之后的方法

没有给出的fail:function(res){}:连接后台失败之后的方法

例子:

wx.request({
      url: 'http://localhost:8080/LoginServlet',
      method: 'POST',//或GET,使用GET时header里填'content-type':'application/json'
      header: {'content-type':'application/x-www-form-urlencoded'},
      data:{
        x: '',
    	y: ''
      },
      success:function(res){
        fail:function(res){
        wx.showToast({
          title: '成功连接到后台',//弹窗弹出的文字
          icon: 'success',   //微信小程序自带的成功弹窗
          duration: 2000     //弹窗持续时间
        })
      },
      fail:function(res){
        wx.showToast({
          title: '无法连接到后台',
          icon: 'none',     //微信小程序自带的失败弹窗
          duration: 2000
        })
      }

先看一下效果图

https://i-blog.csdnimg.cn/blog_migrate/292dcd65cb4f99ccda5297dfd0c6e24c.png

https://i-blog.csdnimg.cn/blog_migrate/7b5f488baab99a9cdb677a50daa2a9f5.png

https://i-blog.csdnimg.cn/blog_migrate/75fd1cf6c213d3f721c8bfae3fc41a6e.png

数据库

/*
 Navicat Premium Data Transfer

Source Server : mysql
Source Server Type : MySQL
Source Server Version : 80016
Source Host : localhost:3306
Source Schema : assessment

Target Server Type : MySQL
Target Server Version : 80016
File Encoding : 65001

Date: 03/12/2021 15:15:51
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_info
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`name`) USING BTREE,
UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 138 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

后端

因为是自己测试学习使用,所以后端服务没有使用云服务,在本地使用 IDEA 搭建的后端

项目创建

idea 创建一个 maven 项目,名称和路径随便

https://i-blog.csdnimg.cn/blog_migrate/e6a9d754343c3dc84573bba7c711d428.png

配置 maven

点击 File > Settings

https://i-blog.csdnimg.cn/blog_migrate/ce4f6582a5ee7a21ea4d11deeca56d64.png

在搜索框搜索 maven

https://i-blog.csdnimg.cn/blog_migrate/3993b1c9712e3b7a310c37c635156345.png

勾选上这两个复选框,然后选择自己的 maven 路径,然后点击 Apply > OK

https://i-blog.csdnimg.cn/blog_migrate/c35118c029fb3a7cc6bb347b394b736e.png

创建 web 文件夹

点击 File > Project Structure

https://i-blog.csdnimg.cn/blog_migrate/d526411846cd98760690448f5da7f901.png

进入后,点击 Facets > + > Web,然后选择你的项目名称

https://i-blog.csdnimg.cn/blog_migrate/14dd96b89f661b1c75c266dc06a66fb3.png

添加完成之后点击右下角的 Create Artifact,然后点击 Apply > OK

https://i-blog.csdnimg.cn/blog_migrate/cce8fa65c49cee4ebb3d2acd3a5e8f26.png

添加配置 Tomcat

这个应该都会吧,就不教了

提一下,下图圈出来的那个可以取消选择,因为微信小程序不需要电脑前端弹出网页操作

https://i-blog.csdnimg.cn/blog_migrate/15f7c39d05e7f012af0644ce367c83b9.png

代码部分

整体的构架如下图,自行创建

https://i-blog.csdnimg.cn/blog_migrate/0476c5a3aa1f352003648b4cf47167e5.png

DBUtil,连接数据库部分

package utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DBUtil {
public static Connection getConnection(){
//数据库驱动
String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//数据库连接地址
//"assessment"为数据库名称,请更换自己的数据库名称
String URL = "jdbc:mysql://localhost/assessment?useSSL=false&serverTimezone=UTC";
//数据库用户名
String USER = "root";
//数据库密码
String PASSWORD = "123456";
//获取 JDBC 连接
Connection connection = null;
try {
Class.forName(DRIVER_NAME);
connection = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
System.out.println("数据库连接获取失败,请检查数据库配置");
e.printStackTrace();
}catch (Exception e){
System.out.println("数据库连接获取失败,请检查数据库配置");
e.printStackTrace();
}
if(connection == null){
System.out.println("数据库连接获取失败,请检查数据库配置");
}
return connection;
}

    /**
     * 关闭JDBC连接
     * @param con 连接实例
     * @param pstmt PreparedStatement实例
     */
    public static void close(Connection con, PreparedStatement pstmt){
        try {
            if(pstmt!=null) {
                pstmt.close();
            }
            if(con!=null) {
                con.close();
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

User,实体类

package domain;

public class User {
private String name;
private String password;

    public User(){}

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

}

UserDao,用户方法接口

package dao;

import domain.User;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public interface UserDao {
/**
_ 新增用户
_ @param user 传入一个用户的信息
_ @return 返回一个布尔值,判断是否添加成功
_ @throws Exception
*/
public boolean insert(User user) throws Exception;

    /**
     * 查找用户
     * @param name 传入用户的名字
     * @return 返回用户的信息
     * @throws Exception
     */
    public User select(String name) throws Exception;

    /**
     * 将查询结果转换位对象
     * @param rs 查询结果
     * @return 一个数组,装用户的所有信息
     * @throws SQLException
     * @throws Exception
     */
    public List<User> resultSetToBean(ResultSet rs) throws SQLException,Exception;

}

UserDaoImpl,用户接口实现

package dao.impl;

import dao.UserDao;
import domain.User;
import utils.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao{

    @Override
    public boolean insert(User user)throws Exception{
        Connection con = DBUtil.getConnection();
        PreparedStatement pstmt =null;
        String sql = "INSERT INTO user_info(name,password) VALUES(?,?)";
        boolean res = false;
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1,user.getName());
            pstmt.setString(2,user.getPassword());
            res = (pstmt.executeUpdate()==1);
        }catch (SQLException e) {
            if(!e.getMessage().contains("PRIMARY")){
                e.printStackTrace();
            }else {
                System.out.println("该用户名已存在");
                return false;
            }
        }finally {
            DBUtil.close(con,pstmt);
        }
        return res;

    }

    @Override
    public User select(String name)throws Exception{
        Connection con = DBUtil.getConnection();
        List<User> list = new ArrayList<User>();
        String sql = "select * from user_info where name=?";
        PreparedStatement pstmt =null;
        ResultSet rs = null;
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, name);
            rs = pstmt.executeQuery();
            list=resultSetToBean(rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(con,pstmt);
        }
        return list.isEmpty()?null:list.get(0);
    }

    @Override
    public List<User> resultSetToBean(ResultSet rs) throws SQLException,Exception{
        List<User> list = new ArrayList<User>();
        while (rs.next()){
            User user = new User();
            user.setName(rs.getString("name"));
            user.setPassword(rs.getString("password"));
            list.add(user);
        }
        return list;
    }

}

LoginServlet,登录

package servlet;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private UserDao userDao;
    public LoginServlet(){
        userDao = (UserDao) new UserDaoImpl();
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //接收信息
        String name = request.getParameter("name");
        String password = request.getParameter("password");

        User user  = null;
        try {
            user = userDao.select(name);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Writer out = response.getWriter();
        if(user!=null){
            if(user.getPassword().equals(password)){
                out.write("true");
                out.flush();
            }
            else {
                out.write("false");
                out.flush();
            }
        }else {
            out.write("false");
            out.flush();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

}

RegisterServlet,注册

package servlet;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private UserDao userDao;
    public RegisterServlet(){
        userDao = (UserDao) new UserDaoImpl();
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //设置对客户端的请求进行重新编码的编码
        request.setCharacterEncoding("utf-8");
        //设置发送到客户端的响应的内容类型
        response.setContentType("text/html;charset=utf-8");
        //获取输入的用户名,密码,重复密码
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        String rpassword = request.getParameter("rpassword");

        Writer out = response.getWriter();
        //判断输入是否为空或输入为纯空格
        if(name==null||name.trim().isEmpty()){
            out.write("namenull");
            out.flush();
            return;
        }
        if(password==null||password.trim().isEmpty()){
            out.write("pwdnull");
            out.flush();
            return;
        }
        if(!password.equals(rpassword)){
            out.write("rpwdnopwd");
            out.flush();
            return;
        }
        //创建User对象,写入姓名和密码
        User user =new User();
        user.setName(name);
        user.setPassword(password);
        try {
            //判断用户是否存在
            if(userDao.select(name)!=null){
                out.write("havename");
                out.flush();
            }else {
                //不存在则创建用户并跳转到登陆页面
                if(userDao.insert(user)){
                    out.write("ok");
                    out.flush();
                }else {
                    out.write("404");
                    out.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

}

pom.xml 里面加上依赖

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>

微信小程序

项目创建

可以参考我

项目构成

https://i-blog.csdnimg.cn/blog_migrate/e7096ef0add39ab717ca5447fc6a03b6.png

代码

app.json,只需要修改一下 pages 就行了

"pages": [
"pages/login/login",
"pages/index/index",
"pages/regist/regist"
],

login.wxml

<view class="content">
<view class="welcome">
欢迎来到 XXX
</view>
<view class="Uname">
<text>用户名:</text>
<input bindinput="accountInput" placeholder=" 请输入您的用户名" />
</view>
<view class="Upwd">
<text>密码:</text>
<input bindinput="pwdBlur" password placeholder=" 请输入您的密码" />
</view>
<button class="btn" disabled="{{disabled}}" type="{{btnstate}}" bindtap="login">登录</button>
<view class="flex-wrp" style="flex-direction:row;">
<navigator url="../regist/regist">快速注册</navigator>
<navigator url="#">找回密码</navigator>
</view>
</view>

login.wxss

/_ pages/login/login.wxss _/
.welcome{
text-align: center;
font-size: 30px;
}
.Uname{
height: 30px;
margin: 10px;
}
.Upwd{
height: 30px;
margin: 10px;
}
text{
width: 30%;
float: left;
text-align: center;
}
input{
width: 70%;
float: left;
}
button{
margin: 10px;
}
navigator{
width: 49%;
float: left;
text-align: center;
}

login.js

// pages/login/login.js
Page({
/**

- 页面的初始数据
  */
  data: {
  disabled:true,
  btnstate:"default",
  account:"",
  password:""
  },
  accountInput:function(e){
  var content = e.detail.value;
  if(content!=''){
  this.setData({disabled:false,btnstate:"primary",account:content});
  }else{
  this.setData({disabled:true,btnstate:"default"});
  }
  },
  pwdBlur:function(e){
  var password= e.detail.value;
  this.setData({password:password});
  },
  login:function(){
  //console.log(this.data.account)
  //console.log(this.data.password)
  wx.request({
  url: 'http://localhost:8080/LoginServlet',
  method: 'POST',
  header: {'content-type':'application/x-www-form-urlencoded'},
  data:{
  name:this.data.account,
  password:this.data.password
  },
  success:function(res){
  // console.log(res.data)
  if(res.data==true){
  wx.navigateTo({
  url: '../index/index',
  })
  }
  else{
  wx.showToast({
  title: '账号或密码错误',
  icon: 'none',
  duration: 2000
  })
  }
        },
        fail:function(res){
          wx.showToast({
            title: '系统错误,请稍后重试',
            icon: 'none',
            duration: 2000
          })
        }
      })
  },
  })
  

regist.wxml

<view class="content">
  <view class="Uname">
  <text>用户名:</text>
  <input bindinput="username" placeholder=" 请输入您的用户名" />
  </view>
  <view class="Upwd">
  <text>密码:</text>
  <input bindinput="userpwd" password placeholder=" 请输入您的密码" />
  </view>
  <view class="Upwd">
  <text>重复密码:</text>
  <input bindinput="ruserpwd" password placeholder=" 请重复您的密码" />
  </view>
  <button class="btn" bindtap="regist">注册</button>
  <view class="flex-wrp" style="flex-direction:row;">
  <navigator url="../login/login">返回登录</navigator>
  </view>
  </view>
  

regist.wxss

/_ pages/regist/regist.wxss _/
  .Uname{
  height: 30px;
  margin: 10px;
  }
  .Upwd{
  height: 30px;
  margin: 10px;
  }
  text{
  width: 30%;
  float: left;
  text-align: center;
  }
  input{
  width: 70%;
  float: left;
  }
  button{
  margin: 10px;
  }
  navigator{
  width: 100%;
  float: left;
  text-align: center;
  }

regist.js

// pages/regist/regist.js
Page({
/**

- 页面的初始数据
  */
  data: {
  name:"",
  password:"",
  rpassword:""
  },

username:function(e){
var name = e.detail.value;
this.setData({name:name});
},
userpwd:function(e){
var password = e.detail.value;
this.setData({password:password});
},
ruserpwd:function(e){
var rpassword = e.detail.value;
this.setData({rpassword:rpassword});
},
regist:function(){
// console.log(this.data.name);
// console.log(this.data.password);
// console.log(this.data.rpassword);
wx.request({
url: 'http://localhost:8080/RegisterServlet',
method: 'POST',
header: {'content-type':'application/x-www-form-urlencoded'},
data:{
name:this.data.name,
password:this.data.password,
rpassword:this.data.rpassword
},
success:function(res){
// console.log(res.data);
if(res.data=="namenull"){
wx.showToast({
title: '账号不能为空',
icon:'none',
duration:2000
})
}
else if(res.data=="pwdnull"){
wx.showToast({
title: '密码不能为空',
icon:'none',
duration:2000
})
}
else if(res.data=="rpwdnopwd"){
wx.showToast({
title: '两次密码不一样',
icon:'none',
duration:2000
})
}
else if(res.data=="havename"){
wx.showToast({
title: '用户名已存在',
icon:'none',
duration:2000
})
}
else if(res.data=="404"){
wx.showToast({
title: '未知错误,请稍后重试',
icon:'none',
duration:2000
})
}
else{
wx.showToast({
title: '注册成功',
icon:'success',
duration:2000
})
wx.navigateTo({
url: '../login/login',
})
}
},
fail:function(res){
wx.showToast({
title: '系统错误,请稍后重试',
icon: 'none',
duration: 2000
})
}
})
}
})