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

从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语句通不过,整个程序就会报错,多么神奇的排列顺序微笑

*/




分析完毕~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值