Android+ThinkPHP(後臺)實現使用者登入功能
本文主要實現了Android客戶端和伺服器間的互動,客戶端採用Android Studio開發,Web伺服器採用PhpStorm開發,資料庫使用MySQL,採用ThinkPHP框架開發,目前ThinkPHP最新的版本是ThinkPHP 5.0 RC4版本,本文中採用它的穩定版ThinkPHP3.2.2完整版,官網地址為:http://www.thinkphp.cn/。
開發前準備:
Android客戶端:
服務端和客戶端主要採用json格式的資料型別,目前比較好用的Json框架有google的gson以及阿里的fastjson,本文中選用fastjson框架來解析json資料;另外由於客戶端存在網路請求,而目前okhttp是不錯的網路請求框架,所以在本文中選用okhttp作為網路框架。
伺服器端:
伺服器的環境搭建可以選擇XAMPP或者WAMPserver,基本上都是傻瓜式的一鍵安裝,即包含有windows版也有Linux版本,如果是需要部署到伺服器主機上,可以利用Xshell 5以及Xftp 5工具,具體過程也比較簡單,這裡就不再贅述。
資料庫:
在MySql中新建一個叫login的資料庫,並在該資料庫下建立一個名叫login_user的資料表,該表包含有id、username、password、sex四個欄位。建立資料表的sql語句如下:
CREATE TABLE `login`.`login_user` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT ' 使用者ID' , `username` VARCHAR(20) NOT NULL COMMENT '使用者名稱' , `password` VARCHAR(40) NOT NULL COMMENT '使用者密碼' , `sex` TINYINT NOT NULL DEFAULT '1' COMMENT '性別(1:男性,0:女性)' , PRIMARY KEY (`id`)) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT = '使用者表';
Android客戶端:
第一步 在Android studio中建立一個LoginTest的工程專案,然後通過Gradle新增前面提到的依賴庫,同時在AndroidMainefest配置檔案中新增上網路許可權。
第二步 建立一個User的類,程式碼如下:
import java.io.Serializable;
/**
* Created by Administrator on 2016/8/25.
*/
public class User implements Serializable
{
private int id;
private String username;
private String password;
private int sex;
public int getId() {
return id;
}
public void setId(String id) {
this.id = Integer.parseInt(id);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getSex()
{
return sex;
}
public void setSex(String sex) {
this.sex = Integer.parseInt(sex);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", sex=" + sex +
'}';
}
}
第三部 實現登陸頁面的佈局以及登陸Activity的程式碼編輯,由於程式碼比較簡單,也很好理解,這裡直接上程式碼了。
佈局檔案:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="#1f1100ff"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
>
<TextView
android:layout_width="60dp"
android:layout_height="wrap_content"
android:text="使用者名稱"
/>
<EditText
android:id="@+id/id_tv_username"
android:layout_width="200dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="5dp"
>
<TextView
android:layout_width="60dp"
android:layout_height="wrap_content"
android:text="密碼"
/>
<EditText
android:id="@+id/id_tv_password"
android:layout_width="200dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
<Button
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_width="260dp"
android:layout_height="30dp"
android:background="#1f00ff00"
android:text="登入"
android:layout_gravity="center_horizontal"
android:onClick="login"
/>
</LinearLayout>
</RelativeLayout>
MainActivity:
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity
{
EditText usernameTV;
EditText passwordTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usernameTV= (EditText) findViewById(R.id.id_tv_username);
passwordTV= (EditText) findViewById(R.id.id_tv_password);
}
private static int SUCCESS=0x123;
private static int ERROR=0x124;
Handler mHandler=new Handler(){ //Handler方式實現子執行緒和主執行緒間的通訊
@Override
public void handleMessage(Message msg)
{
if (SUCCESS==msg.what)
{
User user= (User) msg.obj;
showToast(user.getUsername()+",你好!");
}
else if (ERROR==msg.what)
{
String info= (String) msg.obj;
showToast(info);
}
}
};
/*
登陸按鈕點選響應觸發該方法
*/
public void login(View v)
{
String username = usernameTV.getText().toString().trim();
String password = passwordTV.getText().toString().trim();
if (username.length()>0&&password.length()>0)
{
String baseUrl="http://115.156.196.81:8088/login/index.php/Home/Index/login?";
String url=baseUrl+"username="+username+"&password="+password;
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(url).get().build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
Message msg=new Message();
msg.what=ERROR;
msg.obj="網路請求失敗";
mHandler.sendMessage(msg);
}
@Override
public void onResponse(Call call, Response response) throws IOException
{
if (response.isSuccessful())
{
String info = response.body().string();//獲取伺服器返回的json格式資料
Log.e("TAG", "onResponse: "+info );
JSONObject jsonObject = JSON.parseObject(info);//獲得一個JsonObject的物件
int code = jsonObject.getObject("code", Integer.class);
if (200==code)//如果code等於200,則說明存在該使用者,而且伺服器還返回了該使用者的資訊
{
User user = jsonObject.getObject("data", User.class);//取出使用者資訊
Message msg=new Message();
msg.what=SUCCESS;
msg.obj=user;
mHandler.sendMessage(msg);
}
else
{
Message msg=new Message();
msg.what=ERROR;
msg.obj="使用者名稱或者密碼錯誤";
mHandler.sendMessage(msg);
}
}
}
});
}
else
{
showToast("使用者名稱或者密碼為空");
}
}
/*
以Toast的方式顯示提示資訊
*/
public void showToast(String info)
{
Toast.makeText(this,info,Toast.LENGTH_SHORT).show();
}
}
接下來是服務端的開發
ThinkPHP框架的搭建可以參考官方的參考手冊,因為這裡我們只開發APP後臺的部分,只需要在Common目錄下配置好資料庫的資訊,在Home模組下的Controller目錄下預設有一個名為IndexController的控制器,我們可以自己建立一個新的控制器也可以直接在這個預設的控制器下編寫登陸驗證的後臺程式碼。另外由於需要將我們的資料封裝成json格式,所以需要對從資料庫端獲取的資料進行json的編碼,下面給出以前寫的一個json封裝的類Response的程式碼。這個類可以將資料封裝成json或者xml格式的形式。
Response.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2016/4/7
* Time: 17:17
*/
class Response
{
public static function show($code,$message='',$data=array(),$type='json')
{
if(!is_numeric($code))
{
return;
}
$type=isset($_GET['format'])?$_GET['format']:'json';
if($type=='json')
{
return self::json($code,$message,$data);
}
elseif($type=='xml')
{
return self::xml($code,$message,$data);
}
}
/*
*按Json格式輸出傳輸資料
* $code 狀態碼
* $message 提示資訊
*$data array 資料
*return json字串
* */
public static function json($code,$message='',$data=array())
{
if(!is_numeric($code))
{
return;
}
$result=array
(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
echo json_encode($result);
}
public static function xml($code,$message='',$data=array())
{
if(!is_numeric($code)) {
return '';
}
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
header('Content-Type:text/xml');
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
$xml .= "<root>";
$xml .= self::xmlToEncode($result);
$xml .= "</root>";
echo $xml;
}
public static function xmlToEncode($result)
{
$xml = $attr = '';
foreach($result as $key => $value)
{
if(is_numeric($key))
{
$attr = " id='" . $key . "'";
$key = "item";
}
$xml .= "<{$key}{$attr}>";
$xml .= is_array($value) ? self::xmlToEncode($value) : $value;
$xml .= "</{$key}>\n";
}
return $xml;
}
}
注意:將該檔案一定要放在IndexController.class.php同級目錄下。
接下來給出IndexController.class.php中的程式碼
<?php
namespace Home\Controller;
use Think\Controller;
require_once('Response.php');//引用Response類
class IndexController extends Controller
{
public function login($username,$password)
{
$userModel=M('User');
$where['username'] = array('eq', $username);
$where['password'] = array('eq',$password);//實際的專案一般密碼都會採用MD5演算法進行加密
$result= $userModel->where($where)->find();
if(empty($result))//如果找不到資料,code=400
{
\Response::show(400,'使用者名稱或者密碼錯誤',array());
}
else
{
\Response::show(200,'登入成功',$result);
}
}
}
至此,一個簡單的利用ThinkPHP框架作為APP登陸後臺的應用開發就完成了,是不是很簡單呢?本文也只是簡單的介紹了下ThinkPHP框架如何實現APP後臺開發的功能,如果將後臺部署到本地主機上,可以手機可以通過隨身wifi共享的區域網絡訪問IP地址的形式訪問後臺,但是如需像一般的應用那樣在全網上訪問的話,需要部署到伺服器主機上,目前比較好用的雲伺服器有騰訊雲和阿里雲,騰訊雲有一個校園計劃,一元錢就能享受到1M的頻寬的雲伺服器,對學生族來說是莫大的好訊息。
測試中資料庫中login_user只有一條記錄的 username:風中的歌 password:123456789
使用者名稱 密碼正確驗證時
使用者名稱 密碼驗證失敗時
網路異常時
相關推薦
Android+ThinkPHP(後臺)實現使用者登入功能
本文主要實現了Android客戶端和伺服器間的互動,客戶端採用Android Studio開發,Web伺服器採用PhpStorm開發,資料庫使用MySQL,採用ThinkPHP框架開發,目前ThinkPHP最新的版本是ThinkPHP 5.0 RC4版本,本文中
JAVA秒殺系統(五)實現登入功能--明文密碼兩次MD5處理
1.資料庫設計2.明文密碼兩次MD5處理3.JSR303引數檢驗+全域性異常處理4.分散式Session1.新建查詢2.兩次MD5:防止資料洩露 1.使用者端:pass = MD5(明文+固
Android 快速實現掃描識別二維碼(即掃碼登入功能)
IG牛逼l 零封G2!給RNG報仇了! 掃碼登入現在很流行,淘寶,京東,熊貓直播各大網站都有掃碼登入功能,其實呢對於客戶端來說掃碼登入很簡單,因為難點都集中在了前端身上,我簡單講下掃碼登入的流程: 1 客戶端掃碼然後開啟掃碼確認頁面(H5頁面,這個時候要把使用者的
cocos creator android studio 實現遊戲微信登入功能(官方接入方式)
一:cocos creator端js呼叫java程式碼實現微信登入功能:JS部分 廢話不多說直接上程式碼: wechatLogin : function(){ jsb.reflection.callStaticMethod("org/cocos2dx/javascri
vue全家桶+element-UI搭建後臺管理系統(4)“:登入攔截,登陸後才可以操作”
首先明白如何實現登入攔截,他的原理是什麼?這裡主要用到的是路由攔截,在路由表裡新增一個欄位:requireAuth,用於判斷該路由的訪問是否需要登入;定義完路由後,我們主要是利用vue-router提供的鉤子函式beforeEach()對路由進行判斷。現在 我們開始.....
【android逆向筆記】(一)簡單登入逆向
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
openfire Android學習(一)----實現使用者註冊、登入、修改密碼和登出等
以前學習過用Scoket 建立聊天,簡單的建立聊天是沒問題的,但如果要實現多人複雜的聊天,後臺伺服器程式碼就比較複雜,對於我這新手來講就比較難了。後來在網上看到用openfire做伺服器,利用強大的Smack API庫來實現IM聊天就簡單多了。 網上也有很多關於這方面
Thinkphp——(後臺欄目列表)欄目及子欄目的建立及顯示例項操作
1.欄目資料表jiu_list如下: 2.新增頂級欄目: 控制器方法如下: 4.新增子欄目; 控制器裡如下: 5.然後是顯示欄目及它的子欄目,此方法只顯示到二級目錄: 控制器裡如下所示: 取子分類,二級 6.欄目列表顯示如下: 至此,OK了 初學者如需購
Android自定義錄影(一)之錄影功能實現(附demo原始碼)
引言 最近在做一個專案,是有關用手機攝像頭做影象實時識別的。所以裡面需要自定義一個錄影功能。該demo實現了錄影和錄影後文件的儲存檢視,錄影會實時自動對焦(AutoFocus)。根據功能分兩篇講述。這第一篇講述錄影基本實現思路和需要注意的點。後面附有githu
Android 藍芽開發(九)A2DP基本功能
本文主要是Android做為Audio Source端,A2DP的基本操作:包括連線、斷開連線、設定優先順序、獲取優先順序、獲取A2DP連線狀態、獲取A2DP連線的裝置列表等功能。 1 簡介 A2DP全名是Advanced Audio Distrib
Android藍芽通訊(一)————藍芽功能的相關許可權
根據sdk中的docs的文件說明,使用Android的藍芽裝置時,只需要申請兩個許可權即可保證藍芽的正常的工作(其實在與藍芽相關的許可權一共有3個,其中BLUETOOTH_PRIVILEGED許可權只有系統應用可以使用,在這裡就不說明了),今天我們需要使用的兩個
為SSD編程(4)——高級功能和內部並行
意義 負載 express 三種 ren 緩存 ech ont 單元 原文 http://codecapsule.com/2014/02/12/coding-for-ssds-part-4-advanced-functionalities-and-internal-p
android weight(權重)的詳細分析
關註 一段 sum 比例 .net orien 2個 背景 wid 首先要明確權重分配的是那些空間? 權重是依照比例分配屏幕的剩余空間 對這句話不理解的能夠看下圖 假如我們希望剩余的空間平分給空間1 和空間2 , 我們分別在2個控件的設置and
讀《Android電視機(機頂盒)初次開發的一些經驗分享》後的筆記
方便 實現 radi 麻煩 lamp 順時針 焦點控制 href ott 原文: http://blog.csdn.net/tanghongchang123/article/details/52982818 一、基本命令: 1、adb connect [ip] 2、 a
Spring 源碼分析(八)--容器的功能擴展
use abs 提取 ext troy sha 根據 idc owb 經過前面幾篇的分析,相信大家對Spring中容器功能有了簡單的了解,在前面的章節中我們一直以BeanFactory接口以及它的默認實現類XmlBeanFactory為例進行分析。但是,Spring
Android廣播(BroacastReceiver)與服務(Service)
com 還要 activit pro service 動態註冊 let onclick nds BroadcastReceiver可以理解成是一種組件,是默默的在改後臺運行的,用於在不同軟件和不同組件之間的傳遞,無法被用戶感知,因為他在系統的內部工作,BroadcastRe
Qt與FFmpeg聯合開發指南(四)——編碼(2):完善功能和基礎封裝
v_op buffer 目前 front from 幀率 inter 博客 int 上一章我用一個demo函數演示了基於Qt的音視頻采集到編碼的完整流程,最後經過測試我們也發現了代碼中存在的問題。本章我們就先處理幾個遺留問題,再對代碼進行完善,最後把編碼功能做基礎封裝。 一
(5)DML增強功能-try catch及事務控制
code sys 之間 server recommend sel 因此 視圖 數據庫連接 一、事務控制與Try Catch結合 BEGIN TRY BEGIN TRAN; DECLARE @aaa NVARCHAR(MAX); SET @aaa =
Android MVC(一) MVC簡介
mvc tar .com 程序 tro view 用戶界面 lis 代碼 今天有朋友和我提到Android中的MVC模式,自己就在這裏總結下,如有不妥,大家盡情批評指教 MVC框架簡介 MVC全名是Model View Controller,是模型(model)-視圖(
python作業(二)實現註冊功能和登陸功能
[] nbsp del inf pen pan style NPU pytho #1、實現註冊功能 輸入:username、passowrd,cpassowrd #最多可以輸錯3次 #3個都不能為空 #用戶名長度最少6位, 最長20位