商業級項目登錄模塊源碼分析

從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語句通不過,整個程序就會報錯,多麼神奇的排列順序微笑

*/




分析完畢~

發佈了34 篇原創文章 · 獲贊 39 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章