您的位置:首页 > 其它

商业级项目登录模块源码分析

2016-04-06 10:44 309 查看
从Git上搞到了一份13年的开源商业级项目源码,经过研究发现里面的代码可读性极高,而且编写规范、用类典雅、逻辑清晰、注释充分,是个可以用来参考学习的好项目。

因此贴出这段验证登录信息并登陆的代码,Review一下:

    private EditText etAccount;// 帐号
    private EditText etPassword;//密码
    private CheckBox cbSavedpw;//是否保存密码

//...................中间省略N行.........
/**
* 执行登录操作
*/
private void doLongin() {

name = etAccount.getText().toString().trim();
if (name.equals(userFormat)) {
name = username;
}
if (!MatchUtil.isLicitAccount(name)) {
if ("".equals(name)) {
Toast.makeText(this, R.string.null_account, 0).show();
} else if (name.length() < 3) {
Toast.makeText(this, R.string.short_account, 0).show();
} else {
Toast.makeText(this, R.string.error_account, 0).show();
}
return;
}
/*
上面这段是登录按钮的执行逻辑,使用了getText().toString().trim()方法获取了一个String字符串,
并且trim()方法自动去除了输入信息两边的空白内容
接下来把登录信息放入if{}逻辑中进行比对,检测了用户名过短或为空值等等的问题
*/

 // 验证密码
final String loginPasWord = etPassword.getText().toString().trim();
if (!MatchUtil.isLicitPassword(loginPasWord)) {
if ("".equals(loginPasWord)) {
Toast.makeText(this, R.string.null_password, 0).show();
} else if (loginPasWord.length() < 6) {
Toast.makeText(this, R.string.short_password, 0).show();
} else {
Toast.makeText(this, R.string.error_password, 0).show();
}
return;
}
//同上一段,这次是验证密码

 HttpDatas datas = new HttpDatas(Constant.USERAPI);
datas.putParam("method", "login");
datas.putParam("username", name);
datas.putParam("pwd",Md5Util.md5Diagest(loginPasWord, 16));
NetUtils.sendRequest(datas, LoginActivity.this, getString(R.string.login_now), new TaskCallBack() {
//把账号密码封装到HttpDatas中,此处使用了经典的Md5加密方法,把密码字段加密了

 @Override
public int excueHttpResponse(String strResponds) {
System.out.println(strResponds);
int code = 0;
JSONObject jsonObject = JSONUtil.instaceJsonObject(strResponds);
if (jsonObject != null) {
try {
code = jsonObject.getInt("code");
} catch (JSONException e1) {
e1.printStackTrace();
}
}
if (code == 2000) {
user = JSONUtil.jsonObject2Bean(jsonObject, UserInfo.class);
if (cbSavedpw.isChecked()) {
SharedPreferences sp = LoginActivity.getOrSharedPrefences(LoginActivity.this);
Editor editor = sp.edit();
editor.putBoolean(Constant.ISSAVEPW, true);
editor.putString(Constant.USERNAME, name);
editor.putString(Constant.PASSWORD, AESUtil.hexEncrypt(loginPasWord, Constant.ENCODEPASSWORD));
editor.commit();
editor.clear();
}
return Constant.STATAS_OK;
}
return code;

}
/*发送Json请求验证账号密码正确性,中间有一段使用了Editor把账号信息添加进了SharedPreference缓存里,
注意这里十分严谨的用到了AES加密算法,具体方法:<span style="color:#FF0000;">AESUtil.hexEncrypt</span>(参数)*/
@Override
public void beforeTask() {
}

@Override
public void afterTask(int result) {
System.out.println(result);
switch (result) {
case Constant.STATAS_OK:
Toast.makeText(getApplicationContext(), LoginActivity.this.getString(R.string.login_success), 0).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("User", user);
startActivity(intent);
break;
// case 5000:
// Toast.makeText(getApplicationContext(),
// getString(R.string.error_pw_or_user), 0).show();
// break;
case 4004:
Toast.makeText(getApplicationContext(), getString(R.string.error_pw_or_user), 0).show();
break;
default:
showResulttoast(result, LoginActivity.this);
break;
}
}
<pre name="code" class="java">                 });


/*

Task 完成时接收调用方提供的状态信息并以异步方式执行的延续任务。

所以afterTask指的就是接下来的新任务,意思就是该切换页面咯

作者先Syso了一下result,然后以result结果来建立switch/case逻辑,

我们看到,只有当全局变量是Constant.STATAS_OK时,先弹出登陆成功的Toast,然后立刻运行了转换到新页面的逻辑,在这里是转换到MainActivity;

同时我们还要注意,他在开始执行这个intent之前,用putExtra方法携带了一个数据User到下个界面,显然下个页面肯定要重新确认一下这个User值知否完备,

来确保整个登录程序的健壮性

*/

}

接下来是一段MainAcitivty文件的开头部分,我们通过这段代码来验证刚才的分析是否正确


private UserInfo user;

public UserInfo getUser() {
return user;
}

public Handler handler = new Handler();
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
Serializable serializable = intent.getSerializableExtra("User");
if (serializable != null) {
user = (UserInfo) serializable;
OrongApplication.user = user;
}
initView();

/*

果然出现了一个if逻辑,他用serializable序列化器验证了user,接下来才运行initView()方法,

也就是说如果if语句通不过,整个程序就会报错,多么神奇的排列顺序


*/

分析完毕~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: