From 11eee1b3afab04d3be24f5fc6a102fe1df57d6de Mon Sep 17 00:00:00 2001 From: xiongwei <861739889@qq.com> Date: Tue, 15 Aug 2017 18:47:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=EF=BC=8C=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=EF=BC=8C=E5=BF=98=E8=AE=B0=E5=AF=86=E7=A0=81=EF=BC=8C=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E6=8E=A5=E5=8F=A3=E5=92=8C=E9=80=BB=E8=BE=91=E7=9A=84?= =?UTF-8?q?=E5=A4=84=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PersonalCenter/app/build.gradle | 10 + .../app/libs/android-async-http-1.4.8.jar | Bin 0 -> 106515 bytes PersonalCenter/app/src/main/AndroidManifest.xml | 15 +- .../activity/ChangePasswordActivity.java | 96 +++++- .../activity/ForgotPasswordActivity.java | 216 +++++++++++++- .../activity/RegisterInfoActivity.java | 38 ++- .../hjx/personalcenter/areapicker/AreaBean.java | 68 +++++ .../customdialog/GradeListDialog.java | 65 +++++ .../personalcenter/customdialog/ListDialog.java | 65 ----- .../customdialog/ProvinceListDialog.java | 64 ++++ .../personalcenter/exception/RemoteException.java | 34 +++ .../personalcenter/exception/ResponseError.java | 35 +++ .../hjx/personalcenter/fragment/LoginFragment.java | 31 +- .../personalcenter/fragment/RegisterFragment.java | 185 +++++++++++- .../com/hjx/personalcenter/http/HttpClient.java | 17 ++ .../java/com/hjx/personalcenter/http/HttpCode.java | 38 +++ .../java/com/hjx/personalcenter/http/HttpKey.java | 24 ++ .../com/hjx/personalcenter/http/HttpManager.java | 325 +++++++++++++++++++++ .../java/com/hjx/personalcenter/http/HttpUrl.java | 22 ++ .../com/hjx/personalcenter/parser/BaseParser.java | 55 ++++ .../hjx/personalcenter/parser/ProvinceParser.java | 56 ++++ .../com/hjx/personalcenter/util/AlertUtils.java | 11 + .../hjx/personalcenter/util/DialogPermission.java | 88 ++++++ .../java/com/hjx/personalcenter/util/Judgment.java | 233 +++++++++++++++ .../personalcenter/util/PasswordCheckUtils.java | 68 +++++ .../personalcenter/util/PhoneNumCheckUtils.java | 148 ++++++++++ .../src/main/res/layout/activity_forgetpsword.xml | 9 +- .../main/res/layout/custom_adilog_gradelist.xml | 38 +++ .../app/src/main/res/layout/custom_adilog_list.xml | 38 --- .../main/res/layout/custom_adilog_provicelist.xml | 38 +++ .../layout/fragment_loginandregister_register.xml | 9 +- .../app/src/main/res/mipmap-xhdpi/pwd_open.png | Bin 0 -> 861 bytes PersonalCenter/app/src/main/res/values/strings.xml | 2 +- PersonalCenter/pickerview/build.gradle | 1 - 34 files changed, 2021 insertions(+), 121 deletions(-) create mode 100644 PersonalCenter/app/libs/android-async-http-1.4.8.jar create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/areapicker/AreaBean.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java delete mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ListDialog.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ProvinceListDialog.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/RemoteException.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/ResponseError.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpClient.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpCode.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpKey.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/BaseParser.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/ProvinceParser.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/AlertUtils.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/DialogPermission.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/Judgment.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PasswordCheckUtils.java create mode 100644 PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PhoneNumCheckUtils.java create mode 100644 PersonalCenter/app/src/main/res/layout/custom_adilog_gradelist.xml delete mode 100644 PersonalCenter/app/src/main/res/layout/custom_adilog_list.xml create mode 100644 PersonalCenter/app/src/main/res/layout/custom_adilog_provicelist.xml create mode 100644 PersonalCenter/app/src/main/res/mipmap-xhdpi/pwd_open.png diff --git a/PersonalCenter/app/build.gradle b/PersonalCenter/app/build.gradle index dd56d66..ab09fa1 100644 --- a/PersonalCenter/app/build.gradle +++ b/PersonalCenter/app/build.gradle @@ -17,6 +17,12 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + useLibrary 'org.apache.http.legacy' + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } } dependencies { @@ -24,8 +30,12 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) + compile 'com.tencent.bugly:crashreport:latest.release' + compile 'org.apache.httpcomponents:httpcore:4.4.1' + compile 'org.apache.httpcomponents:httpclient:4.5' compile 'com.android.support:appcompat-v7:25.3.1' testCompile 'junit:junit:4.12' compile project(':circledialog') compile project(':pickerview') + compile files('libs/android-async-http-1.4.8.jar') } diff --git a/PersonalCenter/app/libs/android-async-http-1.4.8.jar b/PersonalCenter/app/libs/android-async-http-1.4.8.jar new file mode 100644 index 0000000000000000000000000000000000000000..74664cca1324e44c235e175ae53a1e156ffdab17 GIT binary patch literal 106515 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%0A;!{yF{kKDYRI6_bgI99XO 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 - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangePasswordActivity.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangePasswordActivity.java index 237ee53..78a059f 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangePasswordActivity.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangePasswordActivity.java @@ -2,17 +2,107 @@ package com.hjx.personalcenter.activity; import android.app.Activity; import android.os.Bundle; +import android.text.TextUtils; +import android.text.method.HideReturnsTransformationMethod; +import android.text.method.PasswordTransformationMethod; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; import com.hjx.personalcenter.R; +import com.hjx.personalcenter.http.HttpManager; +import com.hjx.personalcenter.util.AlertUtils; +import com.hjx.personalcenter.util.PasswordCheckUtils; +import com.hjx.personalcenter.util.SaveParam; -/** - * Created by h on 2017/8/9. +/**修改密码 + * Created by h on 2017/6/27. */ -public class ChangePasswordActivity extends Activity { +public class ChangePasswordActivity extends Activity implements View.OnClickListener { + private EditText old_pwd,newpassword,newpassword1; + private Button sub_change_pwd; + private ImageView back_change_pwd,eyes_iv_change1,eyes_iv_change2; + public static Boolean showPassword = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_changepsword); + initView(); + setLister(); + } + + private void initView() { + old_pwd = (EditText) findViewById(R.id.et_oldpassword); + newpassword = (EditText) findViewById(R.id.et_newpassword); + newpassword1 = (EditText) findViewById(R.id.et_again_newpassword); + sub_change_pwd = (Button) findViewById(R.id.btn_ok); + back_change_pwd = (ImageView) findViewById(R.id.cancel); + eyes_iv_change1 = (ImageView) findViewById(R.id.iv_pwd_change); + + + } + + private void setLister() { + sub_change_pwd.setOnClickListener(this); + back_change_pwd.setOnClickListener(this); + eyes_iv_change1.setOnClickListener(this); + eyes_iv_change2.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + String old_pwd1 = old_pwd.getText().toString().trim(); + String newpassword3 = newpassword.getText().toString().trim(); + String newpassword4 = newpassword1.getText().toString().trim(); + switch (v.getId()){ + //确认修改 + case R.id.btn_ok: + + //Log.e("test","sp保存的密码是"+sp.getLoginParam(ChangePwd.this, "password")); + if (TextUtils.isEmpty(old_pwd1)|| + TextUtils.isEmpty(newpassword3) || TextUtils.isEmpty(newpassword4)){ + AlertUtils.showToast(ChangePasswordActivity.this, "请将必填项填写完整"); + return; + }else if(newpassword3.length()<8||newpassword4.length()<8){ + AlertUtils.showToast(ChangePasswordActivity.this,"密码不能少于8位"); + }else if(!newpassword3.matches(PasswordCheckUtils.PASSWORD_CHAR_AND_NUMBER)||!newpassword4.matches(PasswordCheckUtils.PASSWORD_CHAR_AND_NUMBER)){ + AlertUtils.showToast(ChangePasswordActivity.this, "密码必须由数字和字母组成"); + } + //得到原密码并且判断是否输入的一样 + else if(!SaveParam.getInstance().getLoginParam(ChangePasswordActivity.this,"password").equals(old_pwd1)){ + + AlertUtils.showToast(ChangePasswordActivity.this, "原密码输入错误"); + + }else if (!newpassword3.equals(newpassword4)){ + AlertUtils.showToast(ChangePasswordActivity.this, "两次密码输入不一致"); + return; + }else{ + //修改密码接口 + String name = SaveParam.getInstance().getLoginParam(ChangePasswordActivity.this,"username"); + HttpManager.getInstance().changepwd(this,name,old_pwd1,newpassword3); + } + + break; + case R.id.iv_pwd_change: + if(showPassword){//显示密码 + showPassword = !showPassword; + eyes_iv_change1.setImageResource(R.mipmap.pwd_open); + newpassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); + newpassword.setSelection(newpassword.getText().toString().length()); + }else{//隐藏密码 + showPassword = !showPassword; + eyes_iv_change1.setImageResource(R.mipmap.pwd_hide); + newpassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); + newpassword.setSelection(newpassword.getText().toString().length()); + } + break; + + case R.id.cancel: + finish(); + break; + } + } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ForgotPasswordActivity.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ForgotPasswordActivity.java index fda4e4c..e104b55 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ForgotPasswordActivity.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ForgotPasswordActivity.java @@ -2,17 +2,227 @@ package com.hjx.personalcenter.activity; import android.app.Activity; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.text.method.HideReturnsTransformationMethod; +import android.text.method.PasswordTransformationMethod; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; import com.hjx.personalcenter.R; +import com.hjx.personalcenter.http.HttpCode; +import com.hjx.personalcenter.http.HttpManager; +import com.hjx.personalcenter.util.AlertUtils; +import com.hjx.personalcenter.util.Judgment; +import com.hjx.personalcenter.util.PasswordCheckUtils; +import com.hjx.personalcenter.util.PhoneNumCheckUtils; -/** - * Created by h on 2017/8/9. +import org.json.JSONException; +import org.json.JSONObject; + +/**忘记密码 + * Created by h on 2017/6/17. */ -public class ForgotPasswordActivity extends Activity { +public class ForgotPasswordActivity extends Activity implements View.OnClickListener { + private ImageView back_forgit,iv_pwd_change; + private EditText forot_pwd_phone,forot_pwd_anthcode,forot_pwd_pwd,forot_pwd_pwd2; + private Button forot_pwd_sub,forot_pwd_getanthcode; + private String forot_pwd_phone1; + private String forot_pwd_anthcode1; + private String forot_pwd_pwd3; + private String forot_pwd_pwd4; + private String typeStr = "login"; + private int i = 0; + private Thread thread; + public static Boolean showPassword = false; + + Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + try { + JSONObject jsonObject; + String status; + switch (msg.what) { + case HttpCode.PASSWORD_SUCESS: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.getString("status"); + // AlertUtils.showToast(ForgotPassword.this, jsonObject.optString("message")); + if (status.equals("100")) { + AlertUtils.showToast(ForgotPasswordActivity.this,"密码修改成功"); + } + + break; + case HttpCode.PASSWORD_FAIL: + jsonObject = (JSONObject) msg.obj; + AlertUtils.showToast(ForgotPasswordActivity.this, "密码修改失败,请检查网络是否畅通。"); + break; + case HttpCode.AUTHCODE_SUCESS1: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.optString("status"); + if (status.equals("100")) { + AlertUtils.showToast(ForgotPasswordActivity.this, "验证码发送成功"); + } + //AlertUtils.showToast(ForgotPassword.this, jsonObject.optString("message")); + break; + case HttpCode.AUTHCODE_FAIL1: + jsonObject = (JSONObject) msg.obj; + AlertUtils.showToast(ForgotPasswordActivity.this, jsonObject.optString("验证码发送失败,请检查网络")); + break; + case HttpCode.IS_REFISTER: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.getString("status"); + if (status.equals("true")) { + getauthcode(); +// i = 60; +// new Thread(new ForgotPassword.ThreadShow()).start(); + + }else { + AlertUtils.showToast(ForgotPasswordActivity.this, "该手机号没有注册"); + } + break; + case 1: + forot_pwd_getanthcode.setEnabled(false); + forot_pwd_getanthcode.setClickable(false); + forot_pwd_getanthcode.setText(Integer.toString(i--)+" s"); + if (i<=0){ + forot_pwd_getanthcode.setEnabled(true); + forot_pwd_getanthcode.setClickable(true); + forot_pwd_getanthcode.setText("获取验证码"); + + } + break; + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_forgetpsword); + initView(); + setLister(); + } + //获取验证码 + private void getauthcode() { + forot_pwd_anthcode.requestFocus(); + HttpManager.getInstance().forgetauthCode(typeStr, forot_pwd_phone1, handler, this); + i = 60; + if(thread == null){ + thread = new Thread( new ThreadShow()); + thread.start(); + } + + } + + private void initView() { + forot_pwd_phone = (EditText) findViewById(R.id.et_phonenumber); + forot_pwd_anthcode = (EditText) findViewById(R.id.et_authcode); + forot_pwd_pwd = (EditText) findViewById(R.id.et_newpassword); + forot_pwd_pwd2 = (EditText) findViewById(R.id.et_again_newpassword); + forot_pwd_sub = (Button) findViewById(R.id.btn_ok); + forot_pwd_getanthcode = (Button) findViewById(R.id.btn_authcode); + iv_pwd_change=(ImageView) findViewById(R.id.iv_pwd_change); + back_forgit= (ImageView) findViewById(R.id.cancel); + } + private void setLister() { + iv_pwd_change.setOnClickListener(this); + back_forgit.setOnClickListener(this); + forot_pwd_sub.setOnClickListener(this); + forot_pwd_getanthcode.setOnClickListener(this); + + } + + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.btn_ok: + forot_pwd_phone1 = forot_pwd_phone.getText().toString().trim(); + forot_pwd_anthcode1 = forot_pwd_anthcode.getText().toString().trim(); + forot_pwd_pwd3 = forot_pwd_pwd.getText().toString().trim(); + forot_pwd_pwd4 = forot_pwd_pwd2.getText().toString().trim(); + if (TextUtils.isEmpty(forot_pwd_phone1)|| + TextUtils.isEmpty(forot_pwd_pwd3) || TextUtils.isEmpty(forot_pwd_pwd4)){ + AlertUtils.showToast(ForgotPasswordActivity.this, "请将必填项填写完整"); + return; + }else if (Judgment.getInstance().isPhoneNum(forot_pwd_phone1)){ + AlertUtils.showToast(ForgotPasswordActivity.this, "手机号码输入有误"); + + } + else if(forot_pwd_pwd3.length()<8||forot_pwd_pwd4.length()<8){ + AlertUtils.showToast(ForgotPasswordActivity.this, "密码不能少于8位"); + }else if(!forot_pwd_pwd3.matches(PasswordCheckUtils.PASSWORD_CHAR_AND_NUMBER)||!forot_pwd_pwd4.matches(PasswordCheckUtils.PASSWORD_CHAR_AND_NUMBER)){ + AlertUtils.showToast(ForgotPasswordActivity.this, "密码必须由英文和数字组成"); + } + else if (!forot_pwd_pwd3.equals(forot_pwd_pwd4)){ + AlertUtils.showToast(ForgotPasswordActivity.this, "两次输入的密码不一致"); + return; + }else { + //忘记密码接口 + HttpManager.getInstance().forgetpassword(this,forot_pwd_phone1,forot_pwd_pwd3,forot_pwd_anthcode1,handler); + } + break; + case R.id.btn_authcode: + forot_pwd_phone1 = forot_pwd_phone.getText().toString().trim(); + if (!PhoneNumCheckUtils.isPhone(forot_pwd_phone1)){ + AlertUtils.showToast(ForgotPasswordActivity.this, "请输入正确的手机号"); + }else { + forot_pwd_anthcode.requestFocus(); + ifregister(); + + } + + break; + case R.id.iv_pwd_change: + if(showPassword){//显示密码 + showPassword = !showPassword; + iv_pwd_change.setImageResource(R.mipmap.pwd_open); + forot_pwd_pwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); + forot_pwd_pwd.setSelection(forot_pwd_pwd.getText().toString().length()); + }else{//隐藏密码 + showPassword = !showPassword; + iv_pwd_change.setImageResource(R.mipmap.pwd_hide); + forot_pwd_pwd.setTransformationMethod(PasswordTransformationMethod.getInstance()); + forot_pwd_pwd.setSelection(forot_pwd_pwd.getText().toString().length()); + } + break; + + case R.id.cancel: + finish(); + break; + } + } + //是否注册 + private void ifregister() { + forot_pwd_phone1 = forot_pwd_phone.getText().toString().trim(); + HttpManager.getInstance().isregistered(forot_pwd_phone1, handler, this); + } + // 线程类 定时器 + class ThreadShow implements Runnable { + + @Override + public void run() { + // TODO Auto-generated method stub + while (true) { + try { + Thread.sleep(1000); + Message msg = new Message(); + msg.what = 1; + handler.sendMessage(msg); + System.out.println("send..."); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + System.out.println("thread error..."); + } + } + } } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java index b8af495..d3cbc37 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java @@ -2,6 +2,8 @@ package com.hjx.personalcenter.activity; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; @@ -9,7 +11,13 @@ import android.widget.EditText; import android.widget.TextView; import com.hjx.personalcenter.R; -import com.hjx.personalcenter.customdialog.ListDialog; +import com.hjx.personalcenter.customdialog.GradeListDialog; +import com.hjx.personalcenter.customdialog.ProvinceListDialog; +import com.hjx.personalcenter.http.HttpCode; +import com.hjx.personalcenter.http.HttpManager; + +import org.json.JSONException; +import org.json.JSONObject; /**填写注册信息 熊巍 * Created by h on 2017/8/9. @@ -20,6 +28,24 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl private TextView et_region,et_grade,et_school; private Button btn_ok; String[] items; + Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + try { + JSONObject jsonObject; + String status; + switch (msg.what) { + case HttpCode.PROVICES: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.getString("status"); + + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -58,6 +84,7 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl public void onClick(View v) { switch (v.getId()){ case R.id.et_region: + choiseregion(); break; case R.id.et_grade: choisegrade(); @@ -73,9 +100,14 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl } } - +//选择地区 + private void choiseregion() { + HttpManager.getInstance().provices(RegisterInfoActivity.this,handler); + ProvinceListDialog.getInstance().show(getSupportFragmentManager(), "ProvinceListDialog"); + } +//选择年级 private void choisegrade() { - ListDialog.getInstance().show(getSupportFragmentManager(), "ListDialog"); + GradeListDialog.getInstance().show(getSupportFragmentManager(), "GradeListDialog"); } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/areapicker/AreaBean.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/areapicker/AreaBean.java new file mode 100644 index 0000000..dc3dc8e --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/areapicker/AreaBean.java @@ -0,0 +1,68 @@ +/** + * HaoJiXing Teacher Q&A + * copyright(C)2013- Acorn International + * + * packeage:com.ozing.callteacher.widget.areapicker.Province.java + * create:2013年8月8日上午11:20:30 + */ +package com.hjx.personalcenter.areapicker; + +/** + * @author jixiaolong + * @code: 015261 + */ +public class AreaBean { + public static final int PROVINCE = 0x11; + public static final int CITY = 0x12; + public static final int COUNTY = 0x13; + protected int level; + protected String id; + protected String name; + protected String fullName; + protected String parentId; + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + @Override + public String toString() { + return fullName; + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java new file mode 100644 index 0000000..a52d33b --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java @@ -0,0 +1,65 @@ +package com.hjx.personalcenter.customdialog; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.Toast; + +import com.hjx.personalcenter.R; +import com.mylhyl.circledialog.BaseCircleDialog; +import com.mylhyl.circledialog.res.values.CircleDimen; + +import java.util.ArrayList; + +/**自定义年级列表对话框 + * Created by h on 2017/8/10. + */ + +public class GradeListDialog extends BaseCircleDialog implements AdapterView.OnItemClickListener { + ArrayAdapter listadapter; + ListView listView; + ArrayList data = new ArrayList<>(); + public static GradeListDialog getInstance() { + GradeListDialog dialogFragment = new GradeListDialog(); + dialogFragment.setCanceledBack(true); + dialogFragment.setCanceledOnTouchOutside(true); + dialogFragment.setRadius(CircleDimen.RADIUS); + dialogFragment.setWidth(0.5f); + dialogFragment.setGravity(Gravity.CENTER); + dialogFragment.setBackgroundColor(Color.WHITE); + return dialogFragment; + } + @Override + public View createView(Context context, LayoutInflater inflater, ViewGroup container) { + + return inflater.inflate(R.layout.custom_adilog_gradelist, container, false); + } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + listView = (ListView) getView().findViewById(R.id.listadapter); + for (int i=0;i<=50;i++){ + data.add("sss"+i); + } + + listadapter = new ArrayAdapter(getActivity(),R.layout.custom_adilog_list_item,R.id.list_items,data); + listView.setAdapter(listadapter); + listView.setOnItemClickListener(this); + + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Toast.makeText(getActivity(),"你点击了第"+position+"个",Toast.LENGTH_LONG).show(); + + dismiss(); + + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ListDialog.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ListDialog.java deleted file mode 100644 index 210b5ce..0000000 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ListDialog.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.hjx.personalcenter.customdialog; - -import android.content.Context; -import android.graphics.Color; -import android.os.Bundle; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.Toast; - -import com.hjx.personalcenter.R; -import com.mylhyl.circledialog.BaseCircleDialog; -import com.mylhyl.circledialog.res.values.CircleDimen; - -import java.util.ArrayList; - -/**自定义列表对话框 - * Created by h on 2017/8/10. - */ - -public class ListDialog extends BaseCircleDialog implements AdapterView.OnItemClickListener { - ArrayAdapter listadapter; - ListView listView; - ArrayList data = new ArrayList<>(); - public static ListDialog getInstance() { - ListDialog dialogFragment = new ListDialog(); - dialogFragment.setCanceledBack(true); - dialogFragment.setCanceledOnTouchOutside(true); - dialogFragment.setRadius(CircleDimen.RADIUS); - dialogFragment.setWidth(0.5f); - dialogFragment.setGravity(Gravity.CENTER); - dialogFragment.setBackgroundColor(Color.WHITE); - return dialogFragment; - } - @Override - public View createView(Context context, LayoutInflater inflater, ViewGroup container) { - - return inflater.inflate(R.layout.custom_adilog_list, container, false); - } - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - listView = (ListView) getView().findViewById(R.id.listadapter); - for (int i=0;i<=50;i++){ - data.add("sss"+i); - } - - listadapter = new ArrayAdapter(getActivity(),R.layout.custom_adilog_list_item,R.id.list_items,data); - listView.setAdapter(listadapter); - listView.setOnItemClickListener(this); - - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Toast.makeText(getActivity(),"你点击了第"+position+"个",Toast.LENGTH_LONG).show(); - - dismiss(); - - } -} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ProvinceListDialog.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ProvinceListDialog.java new file mode 100644 index 0000000..4081eee --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/ProvinceListDialog.java @@ -0,0 +1,64 @@ +package com.hjx.personalcenter.customdialog; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.Toast; + +import com.hjx.personalcenter.R; +import com.mylhyl.circledialog.BaseCircleDialog; +import com.mylhyl.circledialog.res.values.CircleDimen; + +import java.util.ArrayList; + +/**自定义年级列表对话框 + * Created by h on 2017/8/10. + */ + +public class ProvinceListDialog extends BaseCircleDialog implements AdapterView.OnItemClickListener { + ArrayAdapter listadapter; + ListView listView; + ArrayList data = new ArrayList<>(); + public static ProvinceListDialog getInstance() { + ProvinceListDialog dialogFragment = new ProvinceListDialog(); + dialogFragment.setCanceledBack(true); + dialogFragment.setCanceledOnTouchOutside(true); + dialogFragment.setRadius(CircleDimen.RADIUS); + dialogFragment.setWidth(0.5f); + dialogFragment.setGravity(Gravity.CENTER); + dialogFragment.setBackgroundColor(Color.WHITE); + return dialogFragment; + } + @Override + public View createView(Context context, LayoutInflater inflater, ViewGroup container) { + return inflater.inflate(R.layout.custom_adilog_provicelist, container, false); + } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + listView = (ListView) getView().findViewById(R.id.listadapter); + for (int i=0;i<=50;i++){ + data.add("aaa"+i); + } + + listadapter = new ArrayAdapter(getActivity(),R.layout.custom_adilog_list_item,R.id.list_items,data); + listView.setAdapter(listadapter); + listView.setOnItemClickListener(this); + + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Toast.makeText(getActivity(),"你点击了第"+position+"个",Toast.LENGTH_LONG).show(); + + dismiss(); + + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/RemoteException.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/RemoteException.java new file mode 100644 index 0000000..b0acb89 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/RemoteException.java @@ -0,0 +1,34 @@ +/** + * HaoJiXing Teacher Q&A + * copyright(C)2013- Acorn International + * + * packeage:com.ozing.callteacher.parser.RemoteException.java + * create:2013年7月25日下午1:58:14 + */ +package com.hjx.personalcenter.exception; + +/** + * @author jixiaolong + * @code: 015261 + */ +public class RemoteException extends Exception { + private ResponseError error; + /** + * + */ + private static final long serialVersionUID = -9062978963856572686L; + public RemoteException(String error) { + super(error); + this.error = new ResponseError(); + this.error.setMessage(error); + this.error.setStatus(-1); + } + public RemoteException(ResponseError error) { + super(error.getMessage()); + this.error = error; + } + + public ResponseError getError() { + return error; + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/ResponseError.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/ResponseError.java new file mode 100644 index 0000000..ad2d605 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/exception/ResponseError.java @@ -0,0 +1,35 @@ +/** + * HaoJiXing Teacher Q&A + * copyright(C)2013- Acorn International + * + * packeage:com.ozing.callteacher.parser.ResponseError.java + * create:2013年9月29日下午3:30:17 + */ +package com.hjx.personalcenter.exception; + + +/** + * @author jixiaolong + * @code: 015261 + */ +public class ResponseError { + private int status = -1; + private String message; + public int getStatus() { + return status; + } + public void setStatus(int status) { + this.status = status; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + public boolean hasError(){ + return status!=0 && status!=100; + } + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/LoginFragment.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/LoginFragment.java index 8eb0baa..fdfd47f 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/LoginFragment.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/LoginFragment.java @@ -4,15 +4,20 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.EditText; import android.widget.TextView; import com.hjx.personalcenter.R; import com.hjx.personalcenter.activity.ForgotPasswordActivity; import com.hjx.personalcenter.activity.MainActivity; +import com.hjx.personalcenter.http.HttpManager; +import com.hjx.personalcenter.util.AlertUtils; +import com.hjx.personalcenter.util.PhoneNumCheckUtils; /** * 登录 @@ -24,6 +29,7 @@ public class LoginFragment extends Fragment implements View.OnClickListener { private int type; private TextView tv_forget_pwd; private Button btn_login; + private EditText phonenumber,login_pwwd; public static String TABLAYOUT_FRAGMENT = "tab_fragment"; Intent intent = new Intent(); public static LoginFragment newInstance(int type) { @@ -50,6 +56,8 @@ public class LoginFragment extends Fragment implements View.OnClickListener { //初始化 private void initView(View mView) { tv_forget_pwd = (TextView) mView.findViewById(R.id.tv_forget_pwd); + phonenumber = (EditText) mView.findViewById(R.id.et_phonenumber); + login_pwwd = (EditText) mView.findViewById(R.id.et_password); btn_login = (Button) mView.findViewById(R.id.btn_login); } @@ -70,11 +78,28 @@ public class LoginFragment extends Fragment implements View.OnClickListener { getActivity().overridePendingTransition(R.anim.rightin, R.anim.rightout); break; case R.id.btn_login: - intent.setClass(getActivity(),MainActivity.class); - startActivity(intent); - getActivity().overridePendingTransition(R.anim.rightin, R.anim.rightout); + login(); break; } } + + private void login() { + final String name = phonenumber.getText().toString().trim(); + final String pwd = login_pwwd.getText().toString().trim(); + if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)) { + AlertUtils.showToast(getActivity(), "请输入手机号和密码"); + return; + }else if (!PhoneNumCheckUtils.isPhone(name)){ + AlertUtils.showToast(getActivity(), "请输入正确的手机号"); + }else { + intent.setClass(getActivity(),MainActivity.class); + startActivity(intent); + getActivity().overridePendingTransition(R.anim.rightin, R.anim.rightout); + //登录接口 + HttpManager.getInstance().login(name,pwd, getActivity()); + } + + + } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/RegisterFragment.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/RegisterFragment.java index af5f7f3..881a953 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/RegisterFragment.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/fragment/RegisterFragment.java @@ -2,15 +2,30 @@ package com.hjx.personalcenter.fragment; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.text.TextUtils; +import android.text.method.HideReturnsTransformationMethod; +import android.text.method.PasswordTransformationMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; import com.hjx.personalcenter.R; import com.hjx.personalcenter.activity.RegisterInfoActivity; +import com.hjx.personalcenter.http.HttpCode; +import com.hjx.personalcenter.http.HttpManager; +import com.hjx.personalcenter.util.AlertUtils; +import com.hjx.personalcenter.util.PasswordCheckUtils; +import com.hjx.personalcenter.util.PhoneNumCheckUtils; + +import org.json.JSONException; +import org.json.JSONObject; /** * 注册 @@ -19,8 +34,16 @@ import com.hjx.personalcenter.activity.RegisterInfoActivity; public class RegisterFragment extends Fragment implements View.OnClickListener { private View mView; - private Button btn_register; + + private Button btn_register,get_authcode; + private EditText phonenumber,password,anth_6num;//;//密码 + private ImageView openeyes; + private String sourceStr ="android"; + private String typeStr = "register"; + private int i = 0; + private Thread thread; private int type; + public static Boolean showPassword = false; public static String TABLAYOUT_FRAGMENT = "tab_fragment"; public static RegisterFragment newInstance(int type) { @@ -31,6 +54,73 @@ public class RegisterFragment extends Fragment implements View.OnClickListener { return fragment; } + Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + try { + JSONObject jsonObject; + String status; + switch (msg.what) { + case HttpCode.REGISTERED_SUCESS: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.getString("status"); + //AlertUtils.showToast(RegisterActivity.this, jsonObject.optString("message")); + String access_token = jsonObject.getString("access_token"); + String userId = jsonObject.getString("userId"); + if (status.equals("100")) { + String usernameStr = phonenumber.getText().toString().trim(); + String passwordStr = password.getText().toString().trim(); + //HttpManager.getInstance().saveLoginInfo(usernameStr,passwordStr,access_token,"true",userId); + AlertUtils.showToast(getActivity(), "注册成功!"); + Intent intent = new Intent(); + intent.setClass(getActivity(),RegisterInfoActivity.class); + startActivity(intent); + getActivity().overridePendingTransition(R.anim.rightin, R.anim.rightout); + getActivity().finish(); + } + break; + case HttpCode.REGISTERED_FAIL: + AlertUtils.showToast(getActivity(), "注册失败"); + break; + case HttpCode.AUTHCODE_SUCESS: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.optString("status"); + if (status.equals("100")) { + AlertUtils.showToast(getActivity(), "验证码发送成功"); + } + + break; + case HttpCode.AUTHCODE_FAIL: + jsonObject = (JSONObject) msg.obj; + AlertUtils.showToast(getActivity(), "验证码发送失败"); + break; + case HttpCode.IS_REFISTER: + jsonObject = (JSONObject) msg.obj; + status = jsonObject.getString("status"); + if (!status.equals("true")) { + getauthcode(); + + }else { + AlertUtils.showToast(getActivity(), "该手机号已经注册过了"); + } + break; + case 1: + get_authcode.setEnabled(false); + get_authcode.setClickable(false); + get_authcode.setText(Integer.toString(i--)+" s"); + if (i<=0){ + get_authcode.setEnabled(true); + get_authcode.setClickable(true); + get_authcode.setText("获取验证码"); + } + break; + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (mView == null) { @@ -45,12 +135,19 @@ public class RegisterFragment extends Fragment implements View.OnClickListener { } private void initView(View mView) { + get_authcode = (Button) mView.findViewById(R.id.btn_authcode); + anth_6num = (EditText) mView.findViewById(R.id.et_authcode); + phonenumber = (EditText) mView.findViewById(R.id.et_phonenumber); + password = (EditText) mView.findViewById(R.id.et_password); + openeyes= (ImageView) mView.findViewById(R.id.iv_pwd_change); btn_register = (Button) mView.findViewById(R.id.btn_register); } private void initData() { } private void setLister() { + get_authcode.setOnClickListener(this); + openeyes.setOnClickListener(this); btn_register.setOnClickListener(this); } @@ -59,12 +156,98 @@ public class RegisterFragment extends Fragment implements View.OnClickListener { public void onClick(View v) { switch (v.getId()){ case R.id.btn_register: + //测试 Intent intent = new Intent(); intent.setClass(getActivity(),RegisterInfoActivity.class); startActivity(intent); getActivity().overridePendingTransition(R.anim.rightin, R.anim.rightout); + getActivity().finish(); + + String usernameStr = phonenumber.getText().toString().trim(); + String authcodeStr = anth_6num.getText().toString().trim(); + String passwordStr = password.getText().toString().trim(); + if (TextUtils.isEmpty(usernameStr) || TextUtils.isEmpty(authcodeStr)||TextUtils.isEmpty(passwordStr)) { + AlertUtils.showToast(getActivity(), "手机号,密码和验证码不能为空"); + return; + } else if(passwordStr.length()<8){ + AlertUtils.showToast(getActivity(), "密码不能少于8位"); + }else if (!PhoneNumCheckUtils.isPhone(usernameStr)){ + AlertUtils.showToast(getActivity(), "手机号码输入错误"); + + }else if(!passwordStr.matches(PasswordCheckUtils.PASSWORD_CHAR_AND_NUMBER)){ + AlertUtils.showToast(getActivity(), "密码由英文和数字组成"); + }else { + register(); + } + + break; + case R.id.iv_pwd_change: + if(showPassword){//显示密码 + showPassword = !showPassword; + openeyes.setImageResource(R.mipmap.pwd_open); + password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); + password.setSelection(password.getText().toString().length()); + }else{//隐藏密码 + showPassword = !showPassword; + openeyes.setImageResource(R.mipmap.pwd_hide); + password.setTransformationMethod(PasswordTransformationMethod.getInstance()); + password.setSelection(password.getText().toString().length()); + } + break; + case R.id.btn_authcode: + usernameStr = phonenumber.getText().toString().trim(); + if (!PhoneNumCheckUtils.isPhone(usernameStr)){ + AlertUtils.showToast(getActivity(), "请输入正确的手机号"); + }else { + anth_6num.requestFocus(); + ifregister(); + } + break; } } + //获取验证码 + private void getauthcode() { + String usernameStr = phonenumber.getText().toString().trim(); + HttpManager.getInstance().authCode(typeStr, usernameStr, handler, getActivity()); + i = 60; + if(thread == null){ + thread = new Thread( new ThreadShow()); + thread.start(); + } + } + + private void ifregister() { + String usernameStr = phonenumber.getText().toString().trim(); + HttpManager.getInstance().isregistered(usernameStr, handler, getActivity()); + } + + private void register() { + String usernameStr = phonenumber.getText().toString().trim(); + String authcodeStr = anth_6num.getText().toString().trim(); + String passwordStr = password.getText().toString().trim(); + HttpManager.getInstance().register(getActivity(), usernameStr, passwordStr, authcodeStr, sourceStr,handler); + } + // 线程类 定时器 + class ThreadShow implements Runnable { + + @Override + public void run() { + // TODO Auto-generated method stub + while (true) { + try { + Thread.sleep(1000); + Message msg = new Message(); + msg.what = 1; + handler.sendMessage(msg); + System.out.println("send..."); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + System.out.println("thread error..."); + } + } + } + } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpClient.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpClient.java new file mode 100644 index 0000000..38e05a6 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpClient.java @@ -0,0 +1,17 @@ +package com.hjx.personalcenter.http; + + +import com.loopj.android.http.AsyncHttpClient; + +public class HttpClient extends AsyncHttpClient { + private static HttpClient client; + + public static HttpClient getInstance() { + if(client == null) { + client = new HttpClient(); + } + return client; + } + private HttpClient() {} + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpCode.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpCode.java new file mode 100644 index 0000000..e11e6d2 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpCode.java @@ -0,0 +1,38 @@ +package com.hjx.personalcenter.http; + +/** + * Created by wei on 2017/6/21. + */ + +public class HttpCode { + //登录 + public static final int LONGIN_SUCESS = 1; + public static final int LONGIN_FAIL = 0; + //注册 + public static final int REGISTERED_SUCESS = 2; + public static final int REGISTERED_FAIL = 3; + //注册验证码 + public static final int AUTHCODE_SUCESS = 4; + public static final int AUTHCODE_FAIL = 5; + //忘记密码验证码 + public static final int AUTHCODE_SUCESS1 = 6; + public static final int AUTHCODE_FAIL1 = 7; + //是否已经注册 + public static final int IS_REFISTER = 8; + //忘记密码 + public static final int PASSWORD_SUCESS = 9; + public static final int PASSWORD_FAIL = 10; + //s省 + public static final int PROVICES = 11; + //姓名 + public static final int CHANGENAME_SUCESS = 12; + //获取个人信息 + public static final int STUDENTINFO_SUCESS = 13; + //意见反馈 + public static final int FEEDBACL_SUCESS = 14; + //私人订制查询 + public static final int PRIVATEDZ = 15; + + + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpKey.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpKey.java new file mode 100644 index 0000000..2c2c8f7 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpKey.java @@ -0,0 +1,24 @@ +package com.hjx.personalcenter.http; + +/**请求参数 + * Created by wei on 2017/6/20. + */ + +public class HttpKey { + //注册key + public static String USERNAME = "username"; + public static String PASSWORD = "password"; + public static String SMSCODE = "smscode"; + public static String SOURCE = "source"; + //忘记密码 + public static String AUTHCODE = "authCode"; + //注册验证码和忘记密码验证码 + public static String TYPE = "type"; + public static String MOBIL = "mobile"; + //修改密码 + public static String OLDPASS = "oldPass"; + public static String NEWPASS = "newPass"; + + + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java new file mode 100644 index 0000000..bb03789 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java @@ -0,0 +1,325 @@ +package com.hjx.personalcenter.http; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.widget.Toast; + +import com.hjx.personalcenter.activity.LoginAndRegisterActivity; +import com.hjx.personalcenter.util.DialogPermission; +import com.hjx.personalcenter.util.SaveParam; +import com.loopj.android.http.AsyncHttpResponseHandler; +import com.loopj.android.http.JsonHttpResponseHandler; +import com.loopj.android.http.RequestParams; + +import org.apache.http.Header; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.message.BasicHeader; +import org.apache.http.protocol.HTTP; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.UnsupportedEncodingException; + +public class HttpManager { + private static HttpManager instance; + private ProgressDialog mProgress = null; + public static HttpManager getInstance() { + if (instance == null) { + instance = new HttpManager(); + } + return instance; + } + + + //登录接口 + + public void login(final String username, final String password, final Context mContext) { + mProgress = DialogPermission.showProgress(mContext, null, "正在登录...", + false, true, null); + HttpClient.getInstance().addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + HttpClient.getInstance().get(HttpUrl.loginUrl + "?username=" + username + "&password=" + password, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int arg0, Header[] arg1, byte[] arg2) { + + String str = new String(arg2); + JSONObject jsonObject = null; + try { + jsonObject = new JSONObject(new String(arg2)); + String status = jsonObject.getString("status"); + if (status.equals("100")) { + String access_token = jsonObject.getString("access_token"); + String userId = jsonObject.getString("userId"); +// //登录成功,保存登录数据并且获取个人信息 + saveLoginInfo(mContext,username, password, access_token, "true", userId); + //HttpManager.getInstance().getuserinfo(username,mContext); + + }else if (status.equals("200")) { + closeProgress(); + Toast.makeText(mContext, "用户名不存在!", Toast.LENGTH_LONG).show(); + return; + } else if(status.equals("204")){ + closeProgress(); + Toast.makeText(mContext, "密码错误!", Toast.LENGTH_LONG).show(); + }else{ + closeProgress(); + Toast.makeText(mContext, "登录失败!请检查网络", Toast.LENGTH_LONG).show(); + + + + } + } catch (JSONException e) { + e.printStackTrace(); + } + + + } + + @Override + public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) { + closeProgress(); + Toast.makeText(mContext, "请检查网络。。"+arg3 , Toast.LENGTH_LONG).show(); + } + }); + } + + //注册接口 + public void register(final Context context, String username, String password, String smscode, String source, final Handler handler) { + mProgress = DialogPermission.showProgress(context, null, "正在注册...", + false, true, null); + JSONObject jsonObject = new JSONObject(); + ByteArrayEntity entity = null; + try { + jsonObject.put(HttpKey.USERNAME, username); + jsonObject.put(HttpKey.PASSWORD, password); + jsonObject.put(HttpKey.SMSCODE, smscode); + jsonObject.put(HttpKey.SOURCE, source); + Log.e("test", "jsonObject" + jsonObject); + entity = new ByteArrayEntity(jsonObject.toString().getBytes("UTF-8")); + entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); + } catch (JSONException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + HttpClient.getInstance().addHeader("Accept", "*/*"); + HttpClient.getInstance().post(context, HttpUrl.registeredUrl, entity, "application/json", new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + super.onSuccess(statusCode, headers, response); + closeProgress(); + Log.e("test", "onSuccess" + response); + Message msg = Message.obtain(); + msg.what = HttpCode.REGISTERED_SUCESS; + msg.obj = response; + handler.sendMessage(msg); + + } + + @Override + public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { + super.onFailure(statusCode, headers, throwable, errorResponse); + closeProgress(); + Log.e("test", "onFailure" + errorResponse); + Toast.makeText(context, "请检查网络。。", Toast.LENGTH_LONG).show(); + } + + }); + } + + //注册验证码 + public void authCode(final String type, final String mobile, final Handler handler, final Context mContext) { + RequestParams params = new RequestParams(); + params.put(HttpKey.TYPE, type); + params.put(HttpKey.MOBIL, mobile); + HttpClient.getInstance().addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + HttpClient.getInstance().post(HttpUrl.authCodedUrl, params, new JsonHttpResponseHandler() { + + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + Log.e("test", "onSuccess-----" + response); + Message msg = Message.obtain(); + msg.what = HttpCode.AUTHCODE_SUCESS; + msg.obj = response; + handler.sendMessage(msg); + } + + @Override + public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { + Toast.makeText(mContext, "请检查网络。。" + errorResponse, Toast.LENGTH_LONG).show(); + } + }); + } + + //验证码 + public void forgetauthCode(final String type, final String mobile, final Handler handler, final Context mContext) { + RequestParams params = new RequestParams(); + params.put("type", type); + params.put("mobile", mobile); + HttpClient.getInstance().addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + HttpClient.getInstance().post(HttpUrl.authCodedUrl, params, new JsonHttpResponseHandler() { + + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + Log.e("test", "onSuccess-----" + response); + Message msg = Message.obtain(); + msg.what = HttpCode.AUTHCODE_SUCESS1; + msg.obj = response; + handler.sendMessage(msg); + } + + @Override + public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { + Toast.makeText(mContext, "请检查网络。。" + errorResponse, Toast.LENGTH_LONG).show(); + } + }); + } + + //手机号是否注册 + public void isregistered(final String mobile, final Handler handler, final Context mContext) { + RequestParams params = new RequestParams(); + params.put(HttpKey.USERNAME, mobile); + HttpClient.getInstance().get(HttpUrl.isRegiterUrl + "?mobile=" + mobile, new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + Log.e("test", "isregistered" + response.toString()); + Message msg = Message.obtain(); + msg.what = HttpCode.IS_REFISTER; + msg.obj = response; + handler.sendMessage(msg); + + } + + @Override + public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { + Toast.makeText(mContext, "失敗" + errorResponse, Toast.LENGTH_LONG).show(); + + } + }); + } + + //修改密码 + public void changepwd(final Context context, String username, String old_pwd1, String newpassword3) { + RequestParams params = new RequestParams(); + params.put(HttpKey.USERNAME, username); + params.put(HttpKey.OLDPASS, old_pwd1); + params.put(HttpKey.NEWPASS, newpassword3); + HttpClient.getInstance().addHeader("Accept", "*/*"); + HttpClient.getInstance().setTimeout(10 * 1000); + HttpClient.getInstance().post(HttpUrl.changepassword, params, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int i, Header[] headers, byte[] bytes) { + try { + JSONObject jsonObject = new JSONObject(new String(bytes)); + String status = jsonObject.optString("status"); + if (status.equals("100")) { + Log.e("test", "onSuccess" + new String(bytes)); + Toast.makeText(context, "密码修改成功!", Toast.LENGTH_LONG).show(); + SaveParam.getInstance().clearData((Activity) context); + Intent intent = new Intent(); + intent.setClass(context, LoginAndRegisterActivity.class); + ((Activity) context).startActivity(intent); + ((Activity) context).finish(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { + Log.e("test", "onFailure" + new String(bytes)); + Toast.makeText(context, "密码修改失败,请检查网络!", Toast.LENGTH_LONG).show(); + onFinish(); + } + }); + + } + + //忘记密码 + public void forgetpassword(final Context context, String forot_pwd_phone1, String forot_pwd_pwd3, String forot_pwd_anthcode1, Handler handler) { + RequestParams params = new RequestParams(); + params.put(HttpKey.USERNAME, forot_pwd_phone1); + params.put(HttpKey.PASSWORD, forot_pwd_pwd3); + params.put(HttpKey.AUTHCODE, forot_pwd_anthcode1); + HttpClient.getInstance().addHeader("Accept", "*/*"); + HttpClient.getInstance().post(HttpUrl.forgetpassword, params, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int i, Header[] headers, byte[] bytes) { + try { + JSONObject jsonObject = new JSONObject(new String(bytes)); + String status = jsonObject.optString("status"); + if (status.equals("100")) { + Log.e("test", "onSuccess" + new String(bytes)); + Toast.makeText(context, "密码修改成功!", Toast.LENGTH_LONG).show(); + ((Activity) context).finish(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { + Log.e("test", "onFailure" + new String(bytes)); + Toast.makeText(context, "忘记密码修改失败,请检查网络!", Toast.LENGTH_LONG).show(); + } + }); + + } + + //保存用户登录信息 + public void saveLoginInfo(Context context,String username, String password, String access_token, String loginStatus, String userId) { + SaveParam.getInstance().saveLoginParam(context,"username", username); + SaveParam.getInstance().saveLoginParam(context,"password", password); + SaveParam.getInstance().saveLoginParam(context,"access_token", access_token); + SaveParam.getInstance().saveLoginParam(context,"login", loginStatus); + SaveParam.getInstance().saveLoginParam(context,"userId", userId); + + + } + + //保存用户个人信息 + public void savePresonInfo(Context context,String lastname, String gender, String mobilePortrait) { + SaveParam.getInstance().saveLoginParam(context,"lastname", lastname); + SaveParam.getInstance().saveLoginParam(context,"gender", gender); + SaveParam.getInstance().saveLoginParam(context,"mobilePortrait", mobilePortrait); + } + + public void provices(final Context mContext, final Handler handler) { + HttpClient.getInstance().addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + HttpClient.getInstance().get(HttpUrl.loginUrl, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int arg0, Header[] arg1, byte[] arg2) { + Log.e("test", "isregistered" + arg2.toString()); + Message msg = Message.obtain(); + msg.what = HttpCode.PROVICES; + msg.obj = arg2; + handler.sendMessage(msg); + } + + @Override + public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) { + Toast.makeText(mContext, "请检查网络。。"+arg3 , Toast.LENGTH_LONG).show(); + } + }); + } + + + + private void closeProgress() { + try { + if (mProgress != null) { + mProgress.dismiss(); + mProgress = null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java new file mode 100644 index 0000000..024c09c --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java @@ -0,0 +1,22 @@ +package com.hjx.personalcenter.http; + +/** + * Created by h on 2017/8/15. + */ + +public class HttpUrl { + private final static String Enviroment = "DEVELOPMENT"; + + public static String GetDomain(){ + return Enviroment.equals("DEVELOPMENT") ? "http://boss.test.hjx.com" : "http://boss.hjx.com"; + } + + public static String loginUrl = GetDomain()+"/user/access_token";//登录 + public static String provinceUrl = GetDomain()+"/ozing/provinces";//省 + public static String forgetpassword=GetDomain()+"/ozing/timer/user/newpassword";//忘记密码/ + public static String registeredUrl=GetDomain()+"/ozing/timer/anking/user";//注册 + public static String authCodedUrl=GetDomain()+"/ozing/timer/user/fetchAuthCode";//验证码 + public static String isRegiterUrl=GetDomain()+"/ozing/timer/user/registered";//手机号是否注册 + public static String changepassword=GetDomain()+"/ozing/timer/user/changepassword";//修改密码 + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/BaseParser.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/BaseParser.java new file mode 100644 index 0000000..a576854 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/BaseParser.java @@ -0,0 +1,55 @@ +/** + * HaoJiXing Teacher Q&A + * copyright(C)2013- Acorn International + * + * packeage:com.ozing.callteacher.parser.BaseParser.java + * create:2013年7月25日下午1:58:14 + */ +package com.hjx.personalcenter.parser; + +import android.text.TextUtils; + +import com.hjx.personalcenter.exception.RemoteException; +import com.hjx.personalcenter.exception.ResponseError; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * @author jixiaolong + * @code: 015261 + */ +public abstract class BaseParser { + public abstract T parse(String response) throws RemoteException, com.hjx.personalcenter.exception.RemoteException; + + public static ResponseError getError(String response){ + ResponseError error = new ResponseError(); + if(TextUtils.isEmpty(response)){ + error.setStatus(-1); + error.setMessage("接口空数据"); + }else{ + if(response.contains("status")){ + //{"status":100,"message":"success","access_token":"0b129fa4-cd71-4777-89d0-215bf4652146"} + //{"status":204,"message":"wrong password"} + //{"status":200,"message":"user not exist"} + try { + JSONObject object = new JSONObject(response); + int status = object.optInt("status"); + error.setStatus(status); + if(status!=0 && status!=100){ + String msg = object.optString("message"); + if(!TextUtils.isEmpty(msg)) + error.setMessage(msg); + } + } catch (JSONException e) { + error.setMessage("返回json数据错误:["+response+"]"); + } + }else if(response.contains("error")){ + error.setMessage("服务器内部错误"); + }else{ + error.setStatus(100); + } + } + return error; + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/ProvinceParser.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/ProvinceParser.java new file mode 100644 index 0000000..7599074 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/parser/ProvinceParser.java @@ -0,0 +1,56 @@ +/** + * HaoJiXing Teacher Q&A + * copyright(C)2013- Acorn International + * + * packeage:com.ozing.callteacher.parser.ProvinceParser.java + * create:2013年8月8日上午11:40:21 + */ +package com.hjx.personalcenter.parser; + + +import com.hjx.personalcenter.areapicker.AreaBean; +import com.hjx.personalcenter.exception.RemoteException; +import com.hjx.personalcenter.exception.ResponseError; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author jixiaolong + * @code: 015261 + */ +public class ProvinceParser extends BaseParser> { + + @Override + public List parse(String response) throws RemoteException { + ResponseError error = getError(response); + if(error.hasError()){ + throw new RemoteException(error); + } + + List mList = new ArrayList(); + try { + JSONObject object = new JSONObject(response); + JSONArray areaobj = object.getJSONArray("provinces"); + for(int i=0;i= 'a' && tmp <= 'z') || (tmp >= 'A' && tmp <= 'Z') || tmp == '.') { + k++; + } + } + if (i == j + k) { + return true; + } else { + return false; + } + + } + + //英文和数字 + public boolean isEnglishAndDigit(String str) { + int j = 0; + int k = 0; + int i = str.length(); + for (int idx = 0; idx < str.length(); idx++) { + if (Character.isDigit(str.charAt(idx))) { + j++; + } + } + for (int idx = 0; idx < i; idx++) { + char c = str.charAt(idx); + if ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z') { + k++; + } + } + if ((k + j) == i) { + return false; + } + + return true; + } + + public boolean isChinese(String name) { + int j = 0; + int i = name.length(); + Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]"); + Matcher m = pattern.matcher(name); + while (m.find()) { + j++; + } + if (i == j) { + return false; + } else { + return true; + } + } + + //中文和点 + public boolean isChineseandPoint(String name) { + int j = 0; + int i = name.length(); + int k = 0; + Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]"); + Matcher m = pattern.matcher(name); + while (m.find()) { + j++; + } + for (int idx = 0; idx < i; idx++) { + char c = name.charAt(idx); + if (c == '.') { + k++; + } + } + if (i == j + k) { + return true; + } else { + return false; + } + + } + + //数字和* + public boolean isJustDigitStar(String str) { + + int len = 0; + for (int idx = 0; idx < str.length(); idx++) { + if (Character.isDigit(str.charAt(idx)) || str.charAt(idx) == '*') { + len++; + } + } + + if (len == str.length()) { + return true; + } + + return false; + } + + // 所有都为数字 + public boolean isAllDigit(String str) { + int len = 0; + for (int idx = 0; idx < str.length(); idx++) { + if (Character.isDigit(str.charAt(idx))) { + len++; + } + } + if (len == str.length()) { + return true; + } + + return false; + } + + public boolean isEnglishAndBackSpace(String str) { + int len = 0; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == ' ') { + len++; + } + } + if (len == str.length()) { + return true; + } + return false; + } + + // 地址 + public boolean isAddress(String address) { + int i = 0, j = 0, k = 0; + int count = address.length(); + Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]"); + Matcher m = pattern.matcher(address); + while (m.find()) { + i++; + } + for (int idx = 0; idx < count; idx++) { + char c = address.charAt(idx); + int tmp = (int) c; + if ((tmp >= 'a' && tmp <= 'z') || (tmp >= 'A' && tmp <= 'Z')) { + j++; + } + + if (Character.isDigit(address.charAt(idx))) { + k++; + } + + } + if ((i + j + k) == count) { + return true; + } else { + return false; + } + + } + + public boolean judgeContainsIAndO(String str) { + for (int i = 1; i < str.length(); i++) { + if (str.charAt(i) == 'I' || str.charAt(i) == 'O') { + return false; + } + } + return true; + } + + + //手机号码 + public boolean isPhoneNum(String phonenum) { + + if (phonenum.length() != 11 || !phonenum.substring(0, 1).equals("1")) { + return true; + } else { + return false; + } + } + + + public boolean valibrithday(String beginTime, String brithday) { + if (brithday != null) { + String brith[] = brithday.split("-"); + int year = Integer.parseInt(brith[0]); + int month = Integer.parseInt(brith[1]); + int day = Integer.parseInt(brith[2]); + String strBegin[] = beginTime.split("-"); + + int beginYear = Integer.parseInt(strBegin[0]); + int beginMonth = Integer.parseInt(strBegin[1]); + int beginDay = Integer.parseInt(strBegin[2]); + // 杈撳叆鐨勫紑濮嬫棩鏈熶笉鑳芥棭浜庡嚭鐢熸棩璧� + if ((beginYear * 365 + beginMonth * 30 + beginDay) > (year * 365 + + month * 30 + day)) { + return true; + } else { + return false; + } + + } else { + return false; + } + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PasswordCheckUtils.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PasswordCheckUtils.java new file mode 100644 index 0000000..fb96f68 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PasswordCheckUtils.java @@ -0,0 +1,68 @@ +package com.hjx.personalcenter.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 密码格式验证 + * + * @author F + * + */ +public class PasswordCheckUtils { + + /** + * 只为字母和数字组成 + * ^ 匹配一行的开头位置 + (?![0-9]+$) 预测该位置后面不全是数字 + (?![a-zA-Z]+$) 预测该位置后面不全是字母 + [0-9A-Za-z] {8,24} 由8-24位数字或者字母组成 + $ 匹配行结尾位置 + */ + public static final String PASSWORD_CHAR_AND_NUMBER = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,24}$"; + + /** + * 可为纯数字/纯字母/数字和字母组成 + */ + public static final String PASSWORD_PATTERN = "^([a-zA-Z0-9]{3,24})$"; + + /** + * 纯数字 + * + * @param str + * @return + */ + public static boolean isNumeric(String str) { + for (int i = str.length(); --i >= 0;) { + if (!Character.isDigit(str.charAt(i))) { + return false; + } + } + return true; + } + + /** + * 纯字母 + * + * @param data + * @return + */ + public static boolean isChar(String data) { + for (int i = data.length(); --i >= 0;) { + char c = data.charAt(i); + if (((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) { + return true; + } else { + return false; + } + } + return true; + } + + public static boolean ispsd(String psd) { + Pattern p = Pattern.compile("^[a-zA-Z].*[0-9]|.*[0-9].*[a-zA-Z]"); + Matcher m = p.matcher(psd); + + return m.matches(); + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PhoneNumCheckUtils.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PhoneNumCheckUtils.java new file mode 100644 index 0000000..bf54655 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PhoneNumCheckUtils.java @@ -0,0 +1,148 @@ +package com.hjx.personalcenter.util; + +/** + * Created by l on 2017/7/18. + */ +import java.util.regex.Pattern; + +/** + * 手机号码或座机号码格式合法性验证 + * 判断手机号码是否合法(移动,联通,电信) + * + * @author F + * + */ +public class PhoneNumCheckUtils { + + private static final String PHONE_CALL_PATTERN = "^(\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(-\\d{1,4})?$"; + + /** + * 中国电信号码格式验证 手机段: 133,153,180,181,189,177,1700,173 + * **/ + private static final String CHINA_TELECOM_PATTERN = "(^1(33|53|7[37]|8[019])\\d{8}$)|(^1700\\d{7}$)"; + + /** + * 中国联通号码格式验证 手机段:130,131,132,155,156,185,186,145,176,1707,1708,1709 + * **/ + private static final String CHINA_UNICOM_PATTERN = "(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\\d{8}$)|(^170[7-9]\\d{7}$)"; + + /** + * 中国移动号码格式验证 + * 手机段:134,135,136,137,138,139,150,151,152,157,158,159,182,183,184 + * ,187,188,147,178,1705 + * + **/ + private static final String CHINA_MOBILE_PATTERN = "(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)"; + + /** + * 仅手机号格式校验 + */ + private static final String PHONE_PATTERN = new StringBuilder(300) + .append(CHINA_MOBILE_PATTERN).append("|") + .append(CHINA_TELECOM_PATTERN).append("|") + .append(CHINA_UNICOM_PATTERN).toString(); + + /** + * 手机和座机号格式校验 + */ + private static final String PHONE_TEL_PATTERN = new StringBuilder(350) + .append(PHONE_PATTERN).append("|").append("(") + .append(PHONE_CALL_PATTERN).append(")").toString(); + + /** + * 匹配多个号码以,、或空格隔开的格式,如 17750581369 + * 13306061248、(596)3370653,17750581369,13306061248 (0596)3370653 + */ + private static final String MULTI_PHONE_TEL_PATTERN = "^(?:(?:(?:(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\\d{8})|(?:170[057-9]\\d{7})|(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?)[,\\s、])+)?(?:(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\\d{8})|(?:170[057-9]\\d{7})|(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?)$"; + + /** + * 匹配多个号码以,、或空格隔开的格式,如 17750581369 + * 13306061248、(596)3370653,17750581369,13306061248 (0596)3370653 + * + * @param input + * @return + */ + public static boolean checkMultiPhone(String input) { + return match(MULTI_PHONE_TEL_PATTERN, input); + } + + /** + * 仅手机号码校验 + * + * @param input + * @return + */ + public static boolean isPhone(String input) { + return match(PHONE_PATTERN, input); + } + + /** + * 手机号或座机号校验 + * + * @param input + * @return + */ + public static boolean isPhoneOrTel(String input) { + System.out.println(PHONE_TEL_PATTERN); + return match(PHONE_TEL_PATTERN, input); + } + + /** + * 验证电话号码的格式 + * + * @author F + * @param str + * 校验电话字符串 + * @return 返回true,否则为false + */ + public static boolean isPhoneCallNum(String str) { + return match(PHONE_CALL_PATTERN, str); + } + + /** + * 验证【电信】手机号码的格式 + * + * @author F + * @param str + * 校验手机字符串 + * @return 返回true,否则为false + */ + public static boolean isChinaTelecomPhoneNum(String str) { + return match(CHINA_TELECOM_PATTERN, str); + } + + /** + * 验证【联通】手机号码的格式 + * + * @author F + * @param str + * 校验手机字符串 + * @return 返回true,否则为false + */ + public static boolean isChinaUnicomPhoneNum(String str) { + return match(CHINA_UNICOM_PATTERN, str); + } + + /** + * 验证【移动】手机号码的格式 + * + * @author F + * @param str + * 校验手机字符串 + * @return 返回true,否则为false + */ + public static boolean isChinaMobilePhoneNum(String str) { + return match(CHINA_MOBILE_PATTERN, str); + } + + /** + * 匹配函数 + * + * @param regex + * @param input + * @return + */ + private static boolean match(String regex, String input) { + return Pattern.matches(regex, input); + } +} diff --git a/PersonalCenter/app/src/main/res/layout/activity_forgetpsword.xml b/PersonalCenter/app/src/main/res/layout/activity_forgetpsword.xml index 88d1786..c2d2bbf 100644 --- a/PersonalCenter/app/src/main/res/layout/activity_forgetpsword.xml +++ b/PersonalCenter/app/src/main/res/layout/activity_forgetpsword.xml @@ -98,7 +98,14 @@ + android:padding="10dp" + android:layout_marginRight="10dp" + android:layout_marginLeft="10dp" + android:layout_width="40dp" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:src="@mipmap/pwd_hide"/> + + + + + + + + + + + + diff --git a/PersonalCenter/app/src/main/res/layout/custom_adilog_list.xml b/PersonalCenter/app/src/main/res/layout/custom_adilog_list.xml deleted file mode 100644 index f0b7715..0000000 --- a/PersonalCenter/app/src/main/res/layout/custom_adilog_list.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - diff --git a/PersonalCenter/app/src/main/res/layout/custom_adilog_provicelist.xml b/PersonalCenter/app/src/main/res/layout/custom_adilog_provicelist.xml new file mode 100644 index 0000000..4581a7c --- /dev/null +++ b/PersonalCenter/app/src/main/res/layout/custom_adilog_provicelist.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + diff --git a/PersonalCenter/app/src/main/res/layout/fragment_loginandregister_register.xml b/PersonalCenter/app/src/main/res/layout/fragment_loginandregister_register.xml index 98344d5..2c854a7 100644 --- a/PersonalCenter/app/src/main/res/layout/fragment_loginandregister_register.xml +++ b/PersonalCenter/app/src/main/res/layout/fragment_loginandregister_register.xml @@ -65,7 +65,14 @@ + android:padding="10dp" + android:layout_marginRight="10dp" + android:layout_marginLeft="10dp" + android:layout_width="40dp" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:src="@mipmap/pwd_hide" /> 2e~v;7jySR8v$^K?U}pm@h^6(uE?V zUb-03g=)0I(vl!bqXZ+7g25TgNE4zmu!pryb3E+5&pG{Jv-kei`quh?>s#OYR^Q0T zh#t^~g}5Axa1Ktzl$0OBUhKkG_!!^dNVg7-=~8bRhH*P)7s!9h_euH8!;LxiGhV`T z*x$)ft%JOdHEDEplG%gj)8Xmp$JBiKbL^(n`6=hD&hIrip~_)j#g^TGXE9TRd?TI~ z+tBS6^x;Z8h-LY|7x&_@DO}Gk|;9HS%Z;J>X+lkOL ze1bdh4;~ZAyRF3GMR*GDiwNFQLGBA&h?QykF0sI=txBy)Jv$ZVVmys+EipbQR(M<6 z___*0lE@R-f;UCfw&4nlG7+I!A~JLFBQCBWQ^V^8WSVxm!PfM#2WMlm*h)2=h!1dP zlDRY$%Wx|iC9;*GHW4RuNrj!=>1z~o@F9+`;bokcf~6R%S{m-Hke!C_@k82srh~0f zQDlF?e5|kGj}(rH+^NE3k(gEJ$62X6A18Ov-)&+?4%hGyeitX^(GHXAqL%c6$sOb? zuowsMa7{#IMG7AmcU2ko;jbRZ9L_mqI3H{C`vHtMPuY6Bh5>PcrdK%F)B~X{__IVd z9dC%@_$prE=)!n6z7rYWBv*vBx~tYl#NAbdf%GvaeGWGTt%MHZYLW3vv7v<2mw2QL zLaXp;37HM)V?2ExEFwf4!)sHaA+~R@!03}$E-uP;jEOd7Re|idwAn}>*Qd|_Pl=!p64Zl#FsAZywI|^0p$2`1;Gm^}m`Tu{=zzdim zYEAW1xIZ0EYSEvR zWA}+8zXR9d*R(ODLmOMQW$mbo0y>OS+GL0FJ*91YpXjC6iM;8EUI;ZYfXi?VE)XqC nJ!J<($MCgi+BW0wUX1?>6Xm==S%`6700000NkvXXu0mjf取 消 确 定 忘记密码 - 修改密码 + 忘记密码 填写注册信息 选择教材版本 用户名 diff --git a/PersonalCenter/pickerview/build.gradle b/PersonalCenter/pickerview/build.gradle index 8c09b9c..b9b57c4 100644 --- a/PersonalCenter/pickerview/build.gradle +++ b/PersonalCenter/pickerview/build.gradle @@ -45,5 +45,4 @@ publish { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - } \ No newline at end of file -- 1.9.0