生活无趣且不易,一起找点乐子吧。欢迎评论,和文章无关也没问题。

 

 

 

上次写了小程序与java后台的简单链接,好久以前的事情了。

This time写下登录,捎带着链接mysql数据库,jdbc那块也简单介绍下。

我们先来看前端,前端,就是展示给用户的东西。既然是登录,无非就是用户名,密码之类的。

其实前端的核心点就在于怎样获得用户名和密码输入框的输入值,然后怎样传递,仅此而已。

先来看界面:

<form bindsubmit='forSubmit'>
      <view class="item">
          
        <view class="login-item">
                
          <view class="login-item-info">工号</view>
                
          <view><input name='username' bindinput='usernameInput'/></view>
          
        </view>
          
        <view class="login-item">
                
          <view class="login-item-info">密码</view>
                
          <view class="login-pwd">
                
                
            <input name='password' style="flex-grow:1" password="true"/> 
                
            <text> 忘记密码 </text>
          </view>    
                
        </view>



		<view class="login-item bottom">
            
		<button class="login-btn" form-type='submit'>登录</button>
       
		</view>

    
	</view>

  </view>

</form>

只需要关注里面的两个input标签,写好name属性,name属性其实是给输入框起个别名用于区分,稍后便于获取。核心是表单的提交获取,也就是form标签,所有的相关标签写入form中,即认为是表单内容,详细信息可以去查看开发者文档,在form中的登陆按钮,即form-type=‘submit’的按钮,会被提交到form的bindsubmit函数中去。(表单的提交会将表单中内部所有可提交数据提交)

接下来是js文件获取输入值:(接收到提交的数据,直接通过函数参数调用就可以。这个时候就需要刚刚的命名,用来区分我是获取的那个输入框的内容。)

forSubmit: function (e) {
    console.log(e.detail.value.username);
    console.log(e.detail.value.password)
}

没错,是通过参数的detial.value.名字 来获取,这时就需要你设置的name属性了。

然后是前端和后端的接口:

wx.request({
        url: 'http://localhost:8080/Amess/user',
        data: {
          username: e.detail.value.username,
          password: e.detail.value.password,
        },
        header: {
          'content-type': 'application/x-www-form-urlencoded;charset=utf-8' // 默认值
        },
        method: 'POST',
        success: function (res) {
          console.log('ok');
          }
      })

(只需关注传送数据data,返回成功函数success即可)

前一章有详细介绍,我们就不多讲,更详细的内容可以查看官方文档的API。直接来看后台服务器部分:首先创建servlet,(详细介绍看第一章)处理和上章一样。

response.setContentType("application/x-www-form-urlencoded;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		
		
		String name = request.getParameter("username");
		String password = request.getParameter("password");

设置接受相应的编码,然后通过request(doGet或doPost方法的参数)的getParameter方法获取前端传过来的值,参数是前端传递接口参数名。

 

 

接下来是新的内容,服务器与数据库的链接问题。我这里用的数据库是mysql,首先我们先创建一个DBUtil类(不建也无妨,代码多几行),这个类来分装一些jdbc链接用的方法,方便我们直接调用:(如果对jdbc相当熟悉直接跳过吧)

(服务器与数据库链接,基本上有这么几个步骤,加载驱动--建立链接-执行sql语句--得到查询结果--关闭链接并返回)

(下面的这个类就是将建立链接和关闭链接步骤封装了,每次链接数据库查询的时候不需要每次都去写,直接调用就好,也省下了每次都输入数据库用户名密码的操作。建立链接很好理解,两地之间只有先建起了桥,才能进行物资的传递。)

(注:乱码问题忽略,随便写点什么)

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

public class DButil {
	private static Connection conn;//�������Ӷ���
	
	private static final String URL = "jdbc:mysql://localhost/amess";
	private static final String USERNAME = "root";
	private static final String PASSWORD = "xxxx";
	
	static{
		try {
			Class.forName("com.mysql.jdbc.Driver");//������ݿ���
		} catch (Exception e) {
			System.out.println("������ݿ������");
		}
	}
	
	public static Connection getConn(){
		try {
			conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);//��ȡconnerctionʵ��
		} catch (Exception e) {
		}
		return conn;
	}
	
	public static void closeConn(){
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}

大家在自己运用的时候,只需要把url,username,password改成自己的就可以(url中的amess是数据库的名字)。

数据库用的是mysql,在项目中需要导入驱动包:

(这个地方就是上面提到的驱动,我们的一切操作建立在驱动之上,驱动包网上很好找到,要和你的数据库对应,比如我的是mysql,DBUtil类中的驱动也要根据你的驱动包进行修改。)

express 微信小程序登录数据 微信小程序登录案例_数据

从网页上就可以搜索下载,大家如果用的其他数据库就要根据自己的实际情况来下载导入,DBUtil的驱动也要根据实际情况修改。

我们来看链接的具体实现:新建userDao类:

(基本上就是按照前面说的,先建立链接,现在是不是体会到DBUtil类的好处了,直接调用省的一直写。)

public class userDao {
	public static boolean loginUser(String tid,String tname){
		Connection conn = DButil.getConn();//建立链接
		String sql = "select * from teacher where tid=? and tname=?";//sql语句
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);//执行sql语句
			ps.setString(1, tid);//动态设置sql语句,即字符串中?的替换
			ps.setString(2, tname);//这里的意思是变量tname替换掉sql语句的第二个?
			ResultSet rs = ps.executeQuery();//获取结果集对象
			if(rs.next()){//有查询结果
				System.out.println(rs.getString(2));
				return true;
			}else{
				return false;
			}
		} catch (SQLException e) {//异常
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}finally{
			DButil.closeConn();
		}
	}

}

数据库的sql语句不谈。

通过代码sql语句我们知道,要查询teacher表的特定用户名和密码的记录。实际上应当先建表,再来写jdbc,逻辑顺序错误,但不影响我们理清思路,我们来建表,表一定要和sql语句对应,或者说sql语句一定要和表里的数据对应(字段名称与字段类型):

express 微信小程序登录数据 微信小程序登录案例_数据库_02

我这里用的是mysql的一个视图化工具,Navicat,为了方便展示,随便写了条记录。

 

ok,现在让我们返回jdbc,userDao里我们写的loginUser方法到数据库中查到了相应数据,就返回true,如果没有就返回false。那我们就在开始创建的servlet里面来处理它,如果对servlet的作用还不太清楚,请看第一章,会帮你简单的理清请求和服务的关系。

(缩进出问题了。。。。。。)

userDao user = new userDao();

		response.setContentType("application/x-www-form-urlencoded;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		
		
		String name = request.getParameter("username");
		String password = request.getParameter("password");//等到前端的数据

        Writer out = response.getWriter();
        if(user.loginUser(password, name)){//调用我们在dao里写的方法,根据前端返回的数据到数据库中查询
				out.write("T");
				out.flush();
				out.close();
			}
			else{
				out.write("F");
			}

当我们查到数据的时候就向前端返回一个T,其他情况就返回F。

前端接口的success函数里面我们也来做出反应:

wx.request({
        url: 'http://localhost:8080/Amess/user',
        data: {
          username: e.detail.value.username,
          password: e.detail.value.password,
          method:method,
        },
        header: {
          'content-type': 'application/x-www-form-urlencoded;charset=utf-8' // 默认值
        },
        method: 'POST',
        success: function (res) {
          console.log(res.data);
          if(res.data == "T"){
            wx.switchTab({
              url: '../homepage/homepage'
            })
          }else{
            wx.showModal({
              title: 'Warning',
              content: 'The username dose not exist or password error',
              success: function (res) {
                if (res.confirm) {
                  console.log('用户点击确定')
                } else if (res.cancel) {
                  console.log('用户点击取消')
                }
              }
            })
          }
        }

      })

(别看success函数那么多,并不复杂,就是个判断,服务器返回T怎样,返回F怎样)

如果后端返回T我们就跳转页面(跳转到主页啊什么的,或者跳转个登录成功的界面),如果是F我们就弹出来个交互框告诉用户用户名或者密码错误。:

express 微信小程序登录数据 微信小程序登录案例_数据库_03

我们来在开发者工具的模拟器上来测试下,我这里故意把名字输错,我们来看下结果:

express 微信小程序登录数据 微信小程序登录案例_express 微信小程序登录数据_04

我们在控制台看到后端返回的F,界面也弹出了提示框,用户名不存在或密码错误,接下来我们改正来看看。

express 微信小程序登录数据 微信小程序登录案例_数据库_05

点击登录:

express 微信小程序登录数据 微信小程序登录案例_数据库_06

我们得到了返回T,同时跳转了主页,测试成功!!!

细心 地 小朋友可能会注意到(“地”写错了,哈,开玩笑,不是说这个),数据明明是John,而你输入的是john,为什么也对了呢。这里其实是数据库的问题,mysql数据库的数据类型中varchar,默认是不区分大小写。而恰巧我就喜欢用varcahr,这样避免了一些前端的后端的类型转化(借口),其实就是偷懒啦:

express 微信小程序登录数据 微信小程序登录案例_数据库_07

有个小知识,小程序传递的数据都是字符串,如果是数字,在传递前也会自动转换为字符串,而前端接受的也只能是字符串,这也是为什么在没有必要的情况下我直接在数据库里将类型换成varchar而不是int,也算是为懒惰找借口吧。

(如果是id之类的必须为数值型的唯一确定的字段,该怎样就怎样,取出来后转成string再用,就是多一步而已。)

ok,这次的内容就写完了。下次写下数组的遍历,网上的遍历有很多,能解决我问题的很少。

 

下次计划:

我们用icon画出来个座位表,遍历数组,让选座的icon呈红色,没有的呈绿色。如果你喜欢,记得到时来看呀。

也希望这次的文章有帮助到你。

因为只是个人的闲暇娱乐,从点击量和搜索量上来说,你很难看到这篇文章,如果我有幸让您看到,那也是种缘分吧。有些基础的东西如在本章中说到,不会做过多原理上的解释,您可以查看这个系列的其他章节内容(最好动手去查,然后你也许会查到这篇文章,之后你就会看到这句话,然后你又去查,又查到它......有什么好处呢?嗯......点击量+1+1+1+1......),应该可以帮您滤清一些思路上的东西。

 

 

 

后记:

再次看自己写的东西,像个小孩写的(虽然我真的不大),还是有很多地方讲的并不清楚,括号的内容是后面加入的,就当注释吧,只为在你阅读时引起你极大的舒适。