`

Android登录界面之用户数据保存+服务器上传(二)

阅读更多

                                                    注册事件的上传服务器

【界面改动】

根据以往app注册经验,将界面改成以下图所示:


通过app手机验证码的发送来注册,手机短信验证是企业给消费者(用户)的一个凭证,通过手机短信内容的验证码来验证身份。目前使用的最普遍的有各大银行网上银行、网上商城、团购网站、票务公司等。手机短信验证利用短信验证码来注册会员,大大降低了非法注册,烂注册的数据。

=================================================================================

在注册同时,需要检测手机号码是否为手机号格式:

/**
	 * 
	 * 判断字符串格式是否为手机号格式
	 * 
	 * 处理字符串时去掉首尾空格 判断依据
	 * 
	 * java-正则表达式判断手机号
	 * 
	 * 要更加准确的匹配手机号码只匹配11位数字是不够的,比如说就没有以144开始的号码段,
	 * 
	 * 故先要整清楚现在已经开放了多少个号码段,国家号码段分配如下:
	 * 
	 * 移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
	 * 
	 * 联通:130、131、132、152、155、156、185、186
	 * 
	 * 电信:133、153、180、189、(1349卫通)
	 * 
	 * @param phone_num
	 * @return true:是 false:不是
	 */
	public static boolean isPhoneNum(String phone_num) {
		Pattern p = Pattern
				.compile("^((13[0-9])|(15[^4,\\D])|(14[0-9])|(17[0-9])|(18[0-9]))\\d{8}$");
		Matcher m = p.matcher(phone_num);
		return m.matches();
	}

 ================================================================================

【注册类正式使用】:使用afinal框架,虽然说现在afinal框架好久没有更新了,但是习惯了使用它在没有习惯使用xutil3 时候暂时还没有抛弃打算

public class RegisterActivity extends Activity implements OnClickListener{
	private EditText phone;
	private TextView getCode;
	private EditText code;
	private EditText pwd; // 密码
	private EditText repwd;
	private Button login_ok;
	ProgressBar progressBar;
	Handler handler;


	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_register);
		init();
		//Activity管理器,负责添加到队列
		MyActivityManager.addActivity(this);
		findViewById(R.id.iv_back_of_register).setOnClickListener(this);
		findViewById(R.id.tv_login).setOnClickListener(this);
		handler=new Handler(){
			public void handleMessage(Message msg) {
				if (msg.what == 0x1122) {
					ConfigUtil.ProgressBarOff(progressBar);
					startActivity(new Intent(RegisterActivity.this,
							GuideSelect.class));
					finish();
				}
			}
		};
		login_ok.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
			if(ConfigUtil.isPhoneNum(phone.getText().toString()))
				login_Button();
			else
				Toast.makeText(getApplicationContext(), "手机号码格式不正确", 1).show();
				
			}
		});
		
		
	}
	/*
	 * 获得组件对象
	 */
	public void init(){
		progressBar=(ProgressBar)findViewById(R.id.login_progressBar);
		phone=(EditText)findViewById(R.id.register_username);
		getCode=(TextView)findViewById(R.id.getcode);
		code=(EditText)findViewById(R.id.code);
		pwd=(EditText)findViewById(R.id.register_password1);
		repwd=(EditText)findViewById(R.id.register_password2);
		login_ok=(Button)findViewById(R.id.register_ok_button);
	}
	public void login_Button(){
		if (isUserPwdRight() && isUserRight(phone.getText().toString())) {
			register(phone.getText().toString(), pwd.getText().toString(), code
					.getText().toString(), ConfigField.ServerUrl.RegisterUrl);
		}
		
	}
	/**
	 * 向服务器提交注册数据
	 * 
	 * 向服务提交前需保证 1.用户名,密码合法 2.前后输入的密码相同 3.网络连接是否正常
	 * 
	 * @param phone
	 *            :用户名
	 * @param userPwd
	 *            :密码
	 * @param code
	 *            :验证码
	 * @param url
	 *            :提交的地址
	 */
	public void register(String phone,String pwd,String code,String url){
		
		AjaxParams param=new AjaxParams();
		param.put("username", phone);
		String md5pwd=MD5Util.MD5(pwd);
		param.put("pwd", md5pwd);
		param.put("code", code);
		FinalHttp finalhttp=new FinalHttp();
		finalhttp.post(url, param, new AjaxCallBack<String>() {
			public void onSuccess(String t){
				super.onSuccess(t);
			
				try {
					JSONObject json=new JSONObject();
					JSONObject jsondata=json.getJSONObject("data");
					if(jsondata.has("user_id")){
						int user_id=Integer.parseInt(jsondata.getString("user_id"));
						System.out.println(user_id+"");
						ConfigField.Flag.setMyID(user_id);
						goToGuideActivity();
						
					}
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println("Wrong is jumping out,you can't submit you logInfo");
				}
				
			}
			
/*
 * 成功后将服务器发起请求,得到用户id,调用数据库,将用户数据存储在数据库中
 */
			private void goToGuideActivity() {
				// TODO Auto-generated method stub
				new Thread(){
					
					public void run(){
						FinalHttp finalhttp=new FinalHttp();
						int id=ConfigField.Flag.getMyID();
						finalhttp.get(ConfigField.ServerUrl.RegisterUrl,new AjaxCallBack<String>(){
							
							public void onSuccess(String t) {
								
									
									try {
										JSONObject jsonObject = new JSONObject(t);
								         User user = new User();
										JSONObject jsonUser=jsonObject.getJSONObject("data");
										user.setUser_id(jsonUser.getInt("user_id"));
										Userdb ud = new Userdb(getApplicationContext());
										ud.clear();
										ud.addOne(user);
										ConfigField.Flag.setMy(user);
										To_MainUI();//跳转主界面
									} catch (JSONException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
									
								
							}
							public void onFailure(Throwable t,
									int errorNo, String strMsg) {
								ConfigUtil.ProgressBarOff(progressBar);
								Toast.makeText(getApplicationContext(), "失败",1).show();
							};
						});
							
						
					}
					
				}.start();
				
			}
			public void onFailure(Throwable t, int errorNo, String strMsg){
				super.onFailure(t, errorNo, strMsg);
				System.out.println("------"+strMsg+"------");
				Toast.makeText(getApplicationContext(), "联网失败", 1).show();
			}
			
		});
	
		
		
	}
	
	

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.iv_back_of_register:
			finish();
			break;
		case R.id.tv_login:
			startActivity(new Intent(this,LogInActivity.class));
			finish();
			break;
			
		}
		
	}
	/**
	 * 判断用户名是否合法
	 * 
	 * @param name
	 * @return
	 */
	public boolean isUserRight(String phone) {
		if (phone.equals("")) {
			www.zhy.nomalutils.ToastUtil.show_text(getApplicationContext(), "电话或姓名不能为空");
			return false;
		} else
			return true;
	}

	public void To_MainUI() {
		startActivity(new Intent(RegisterActivity.this, GuideSelect.class));
		RegisterActivity.this.finish();
	}

	/**
	 * 判断用户密码是否合法
	 * 
	 * @param pwd
	 * @return
	 */
	public boolean isUserPwdRight() {
		if (repwd.getText().toString().equals(pwd.getText().toString())
				&& !pwd.getText().toString().equals(""))
			return true;
		else {
			if (pwd.getText().toString().equals(""))
				www.zhy.nomalutils.ToastUtil.show_text(getApplicationContext(), "密码不能为空。");
			else
				www.zhy.nomalutils.ToastUtil.show_text(getApplicationContext(), "两次密码不正确。");
			return false;
		}
	}

}

 ===============================================================================

【数据库】

以上涉及到数据库代码:

afinal框架创建数据库非常简单方便,具体可以看一下链接:https://github.com/yangfuhai/afinal

首先建立用户User类:

public class User implements DataModel {
	/*
	 * 用户信息封装类
	 */

	@Id(column = "id")
	private int id;
	private String name;
	private String tel;
	
	public String getStatusInfo() {
		return statusInfo;
	}

	private int user_id;
	private int status;

	public User() {
		name = "用户";
		
		
		
	}
	public int getUser_id() {
		return user_id;
	}

	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}

	
	
	
}

 需要注意的一点:

//这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性

刚开始学习的时候忽略掉了,所以导致创建不成功,同时权限问题的添加也需要注意。

================================================================================

【URL】:

专门建立一个静态类来调用URL例如:

public static class ServerUrl {
		// 登录
		public static final String LoginUrl = "http://kaka.ileban.com/index.php/Api/User/login";
		// 注册
		public static final String RegisterUrl = "http://kaka.ileban.com/index.php/Api/User/register/";
		// 上传图片
		
	}

 之所以使用静态类以及静态方法,静态属性,是因为可以不需要创建类对象直接调用其方法以及属性。

=================================================================================

【数据库数据操作】:

/**
 * 用户数据表操作类
 * 
 */

public class Userdb {

	private FinalDb finalDb;

	public Userdb(Context context) {
		finalDb = FinalDb.create(context, ConfigField.Db.DBNAME);
	}

	
	public boolean isLogin()
	{
		try {
			List<User>list=finalDb.findAll(User.class);
			ConfigField.Flag.setMy(list.get(0));
			if(list.size()>0)
				return true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		 return false;
	}
	

	//用户登录,将用户信息写入数据库
	public void put_in_db(int id)
	{
		try {
			List<User>list=finalDb.findAllByWhere(User.class, "user_id="+id);
			if(list.size()==0)
			{
				User user=new User();
				user.setUser_id(id);
				addOne(user);
				list.add(user);
			}
			ConfigField.Flag.setMy(list.get(0));
		} catch (Exception e) {
			Log.i("Main", e.toString());
		}
		
	}
	
	public void clear() {
		finalDb.deleteAll(User.class);
	}

	public List<User> getAll() {
		return finalDb.findAll(User.class);
	}

	/**
	 * 批量添加用户信息
	 * 
	 * @param list
	 */
	public void add(List<User> list) {
		for (int i = 0; i < list.size(); i++) {
			User user = list.get(i);
			finalDb.save(user);
		}
	}

	/**
	 * 批量更新用户信息
	 * 
	 * @param list
	 */
	public void update(List<User> list) {
		clear();
		for (int i = 0; i < list.size(); i++) {
			User user = list.get(i);
			finalDb.save(user);
		}
	}

	public void addOne(User user) {
		finalDb.save(user);

	}

	public void update(User user) {
		clear();
		finalDb.save(user);
	}
}

 =================================================================================

【总结】:

这一接比较重要的不是demo而是建立一个登录注册系统的概念,如何设置类,接口,以及上传服务器标准格式,分类也要清楚,工程下面创立几个包



 什么样的数据放在哪里,不仅自己一目了然,对于项目的二次开发,以及代码重用,小伙伴交接带来很好地作用,以前小编也是图方便全部写在一个包里,速度是快,看起来很难受,交接给小伙伴光讲述的时间就远远超过自己分类时间啦,所以这几届课也是强迫自己去学会更专业的建立工程,做作为基础的登录注册,简单的登录注册绝对不简单,很多小细节的注意判断都要很多行代码以及类,需要细心分析如何分配调用更加方便,本节课需要注意的知识点:1.afinal框架的使用  2.Ajaxcallback  回调函数的理解  3.服务器上传知识Json解析,数据库使用。

 

下节课将会讲述登录界面,相比注册而言,要简单很多,相信有了这节课的基础,下节课理解起来也会容易很多,大家跟我一起加油!!!

  • 大小: 12.1 KB
  • 大小: 3.6 KB
0
0
分享到:
评论

相关推荐

    Android涂鸦上传到服务器

    在Android开发中,实现“涂鸦上传到服务器”的功能涉及到多个技术点,包括用户界面设计、图像处理、网络通信以及服务器端的接口处理。以下是对这些知识点的详细说明: 1. **用户界面设计**:首先,我们需要创建一个...

    Android二手交易客户端+服务器端

    2. **数据存储与检索**:保存用户信息、商品信息、订单数据等,并根据客户端请求返回相关数据。 3. **业务逻辑处理**:例如处理商品的发布、删除、更新,订单的状态变更,支付处理等。 4. **通信协议**:服务器端...

    Android实现注册登录头像上传等服务器端

    服务器端接收到请求后,通常会将接收到的二进制数据保存到特定的目录或者云存储服务中,并返回一个唯一的URL,这个URL可以用于在客户端展示头像。 在服务器端,Python是一种常见的编程语言,文件处理和网络通信库...

    android 登陆、提交数据或加载数据时提示页面

    在Android应用开发中,用户界面(UI)的交互体验至关重要,尤其是涉及到登录、提交数据以及加载数据等操作。这些操作通常涉及到网络通信、数据持久化、异步处理等多个技术领域。下面将根据提供的标题和描述,详细...

    android拍摄视频并上传到PHP服务器

    在Android平台上,开发一款应用允许用户拍摄视频并将其上传到PHP服务器是一项常见的需求。这个过程涉及到多个技术点,包括Android的多媒体API、网络编程以及服务器端的文件接收处理。以下是对这些关键知识点的详细...

    app打印日志保存到手机上传服务器

    本文将详细讲解如何在Android应用中实现“app打印日志保存到手机并上传服务器”的功能,以提高调试效率和用户体验。 首先,我们需要了解Android系统中的日志系统。Android提供了Log类,它包含了一些静态方法,如`...

    Android应用源码之android拍摄视频并上传到PHP服务器.zip

    在本压缩包中,我们关注的是一个Android应用的源码示例,该示例展示了如何在Android设备上拍摄视频,并将录制的视频上传至PHP服务器。这个实例对于开发者,特别是那些正在学习Android应用开发的人来说,是非常有价值...

    Android图片上传服务器

    在Android应用开发中,图片上传至服务器是一项常见的需求,尤其在社交、电商或者任何需要用户分享内容的应用中。本文将详细讲解如何实现Android图片上传至服务器的完整过程,结合一个名为"UploadPhotoDemo"的示例...

    android文件上传(包括android端和服务器端)

    在Android平台上进行文件上传涉及到多个技术层面,包括客户端(Android端)的文件操作、网络通信以及服务器端的数据处理。下面将详细阐述这个过程中的关键知识点。 1. **Android端文件操作**: - **文件选择**:...

    Android客户端+web服务端实现图片上传到服务器

    3. **文件存储**:服务端需要将接收到的图片数据保存到服务器的文件系统,或者云存储服务如Amazon S3、Google Cloud Storage等。 4. **图片处理**:可能需要对上传的图片进行缩放、裁剪等处理,以便于展示或节省...

    Android客户端与服务器数据交互流程样本.doc

    8. **状态管理**:为了跟踪用户的登录状态和个性化信息,Android客户端可能需要保存服务器返回的Token或Session ID,并在后续请求中携带,以维持会话状态。 9. **错误处理**:网络请求可能会遇到各种问题,如网络...

    android (可发送 信息+语音+文件)实例.rar

    8. **数据持久化**:为了保存聊天记录,可以使用SQLite数据库存储每条消息的信息,包括发送时间、发送者、消息类型和内容。这样即使应用关闭,聊天记录也能被恢复。 9. **推送通知**:当收到新消息时,Android的`...

    android java 客户端和服务器的数据交互

    在Android应用开发中,Java客户端与服务器的数据交互是不可或缺的一部分,它使得应用程序能够获取服务器上的数据,更新用户界面,或者发送用户数据到服务器进行存储或处理。本篇将深入探讨这个主题,涵盖基本概念、...

    android拍摄视频并上传到PHP服务器-IT计算机-毕业设计.zip

    在Android平台上,开发一款能够拍摄视频并将其上传到PHP服务器的应用是常见的移动开发任务,尤其在毕业设计项目中。这个项目涉及到多个技术领域,包括Android SDK的使用、多媒体处理、网络编程以及服务器端的PHP开发...

    Android利用webservice上传图片至服务器_Android端

    在Android开发中,将图片上传到服务器是一项常见的需求,尤其在社交、电商或者任何需要用户分享内容的应用中。本教程将详细介绍如何在Android应用中利用Web Service(通常为SOAP协议)来实现图片上传功能。 首先,...

    android录音上传到服务器,上传使用AsyncTask异步任务.zip

    在Android应用开发中,录音和将录音文件上传到服务器是一项常见的功能。这个压缩包文件"android录音上传到服务器,上传使用AsyncTask异步任务.zip"包含了一个实现这一功能的源码示例。以下是对其中涉及的关键知识点...

    android文件上传控件

    6. 客户端接收到服务器响应,根据状态码判断上传是否成功,并更新用户界面。 总之,Android文件上传涉及到Android的文件操作、HTTP请求、服务器端交互以及UI控件的使用。通过合理利用现有的库和工具,可以高效实现...

    Android网络编程之客户端服务器端的交互之上传下载解压文件

    服务器需要解析接收到的请求,根据请求类型(GET或POST)执行相应操作,如返回数据、保存上传的文件等。 在整个过程中,需要注意的是错误处理和异常捕获,确保在网络不稳定或者服务器出现问题时,应用能够优雅地...

    android客户端向java服务器端上传文件(完整版)

    在Android客户端向Java服务器端上传文件的过程中,涉及到了多个关键的技术点和步骤,这包括了文件选择、HTTP请求、数据编码、服务器端处理等。以下将详细解释这些知识点。 1. **Android文件浏览器**:在Android应用...

    Android网盘系统(带servlet服务器)

    对于Android平台,构建一个完善的网盘系统需要结合服务器端的技术支持,如Servlet服务器,以及客户端的用户体验设计,如用户登录、文件操作和进度显示。本篇文章将详细解析如何利用Apache-Upload组件搭建服务端,并...

Global site tag (gtag.js) - Google Analytics