注册事件的上传服务器
【界面改动】
根据以往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解析,数据库使用。
下节课将会讲述登录界面,相比注册而言,要简单很多,相信有了这节课的基础,下节课理解起来也会容易很多,大家跟我一起加油!!!