Browse Source

用户登陆页面添加mvp

郭彪 2 years ago
parent
commit
6ff64f342f
24 changed files with 383 additions and 30 deletions
  1. 1 0
      .idea/misc.xml
  2. 6 11
      BaseLibrary/build.gradle
  3. 2 1
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseApplication.kt
  4. 1 1
      BaseLibrary/src/main/java/com/cooleshow/base/data/net/RetrofitFactory.kt
  5. 2 1
      BaseLibrary/src/main/java/com/cooleshow/base/injection/component/ActivityComponent.kt
  6. 3 3
      app/build.gradle
  7. 1 0
      build.gradle
  8. 1 1
      gradle.properties
  9. 14 0
      usercenter/build.gradle
  10. 5 2
      usercenter/src/main/debug/AndroidManifest.xml
  11. 19 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/api/UploadApi.kt
  12. 47 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/api/UserApi.kt
  13. 6 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/protocol/LoginReq.kt
  14. 6 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/protocol/RegisterReq.kt
  15. 22 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/respository/UploadRepository.kt
  16. 51 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/respository/UserRepository.kt
  17. 27 0
      usercenter/src/main/java/com/cooleshow/usercenter/injection/component/UserComponent.kt
  18. 18 0
      usercenter/src/main/java/com/cooleshow/usercenter/injection/module/UploadModule.kt
  19. 21 0
      usercenter/src/main/java/com/cooleshow/usercenter/injection/module/UserModule.kt
  20. 1 1
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/LoginPresenter.kt
  21. 8 8
      usercenter/src/main/java/com/cooleshow/usercenter/service/UserService.kt
  22. 54 0
      usercenter/src/main/java/com/cooleshow/usercenter/service/impl/UserServiceImpl.kt
  23. 24 1
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/LoginActivity.kt
  24. 43 0
      usercenter/src/main/res/layout/activity_login.xml

+ 1 - 0
.idea/misc.xml

@@ -23,6 +23,7 @@
         <entry key="app/src/main/res/layout/activity_main.xml" value="0.1175925925925926" />
         <entry key="app/src/main/res/layout/fragment_home.xml" value="0.10833333333333334" />
         <entry key="app/src/main/res/layout/fragment_me.xml" value="0.2916666666666667" />
+        <entry key="usercenter/src/main/res/layout/activity_login.xml" value="0.2916666666666667" />
       </map>
     </option>
   </component>

+ 6 - 11
BaseLibrary/build.gradle

@@ -49,7 +49,6 @@ dependencies {
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
     implementation 'androidx.core:core-ktx:1.7.0'
-//    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
 
@@ -82,10 +81,6 @@ dependencies {
 
     // BottomNavigation
     api 'com.ashokvarma.android:bottom-navigation-bar:2.2.0'
-    //Anko
-//    implementation "org.jetbrains.anko:anko-appcompat-v7-commons:$anko_version"
-//    implementation "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
-//    implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
 
     // Add Dagger dependencies
     api "com.google.dagger:dagger:$dagger_version"
@@ -97,7 +92,7 @@ dependencies {
 //    implementation 'com.github.ReactiveX:RxKotlin:3.x-SNAPSHOT'
 
 //    compile "io.reactivex:rxkotlin:$rx_kotlin_version"
-    implementation("io.reactivex.rxjava2:rxkotlin:2.0.0")
+    implementation("io.reactivex.rxjava3:rxkotlin:3.0.0")
 //    compile "io.reactivex:rxandroid:${rx_android_version}"
     implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
     // Because RxAndroid releases are few and far between, it is recommended you also
@@ -107,12 +102,12 @@ dependencies {
 
 
     //Retrofit
-    implementation("com.squareup.okhttp3:okhttp:${ok_http_version}")
-    implementation "com.squareup.okhttp3:logging-interceptor:${ok_http_version}"
+    api("com.squareup.okhttp3:okhttp:${ok_http_version}")
+    api "com.squareup.okhttp3:logging-interceptor:${ok_http_version}"
 
-    implementation "com.squareup.retrofit2:retrofit:${retrofit_version}"
-    implementation "com.squareup.retrofit2:converter-gson:${retrofit_version}"
-    implementation "com.squareup.retrofit2:adapter-rxjava:${retrofit_version}"
+    api "com.squareup.retrofit2:retrofit:${retrofit_version}"
+    api "com.squareup.retrofit2:converter-gson:${retrofit_version}"
+    api "com.squareup.retrofit2:adapter-rxjava:${retrofit_version}"
 
     //MulitStateView
     api "com.github.Kennyc1012:MultiStateView:$multi_state_view_version"

+ 2 - 1
BaseLibrary/src/main/java/com/cooleshow/base/common/BaseApplication.kt

@@ -4,6 +4,7 @@ import android.app.Application
 import android.content.Context
 import com.alibaba.android.arouter.launcher.ARouter
 import com.cooleshow.base.injection.component.AppComponent
+import com.cooleshow.base.injection.component.DaggerAppComponent
 import com.cooleshow.base.injection.module.AppModule
 
 /*
@@ -30,7 +31,7 @@ open class BaseApplication : Application() {
         Application Component初始化
      */
     private fun initAppInjection() {
-//        appComponent = DaggerAppComponent.builder().appModule(AppModule(this)).build()
+        appComponent = DaggerAppComponent.builder().appModule(AppModule(this)).build()
     }
 
     /*

+ 1 - 1
BaseLibrary/src/main/java/com/cooleshow/base/data/net/RetrofitFactory.kt

@@ -28,7 +28,7 @@ class RetrofitFactory private constructor(){
 
     //初始化
     init {
-//        //通用拦截
+        //通用拦截
 //        interceptor = Interceptor {
 //            chain -> val request = chain.request()
 //                .newBuilder()

+ 2 - 1
BaseLibrary/src/main/java/com/cooleshow/base/injection/component/ActivityComponent.kt

@@ -12,7 +12,8 @@ import dagger.Component
     Activity级别Component
  */
 @ActivityScope
-@Component(dependencies = arrayOf(AppComponent::class),modules = arrayOf(ActivityModule::class,LifecycleProviderModule::class))
+@Component(dependencies = arrayOf(AppComponent::class),
+    modules = arrayOf(ActivityModule::class,LifecycleProviderModule::class))
 interface ActivityComponent {
     fun activity():Activity
     fun context(): Context

+ 3 - 3
app/build.gradle

@@ -58,7 +58,7 @@ dependencies {
     implementation project(':Provider')
     implementation project(path: ':BaseLibrary')
 
-//    if (isUserModule.toBoolean()){
-//        implementation project(':usercenter')
-//    }
+    if (isUserModule.toBoolean()){
+        implementation project(':usercenter')
+    }
 }

+ 1 - 0
build.gradle

@@ -36,6 +36,7 @@ buildscript {
     dependencies {
         classpath 'com.android.tools.build:gradle:4.2.0'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+        classpath "com.alibaba:arouter-register:1.0.2"
     }
 }
 

+ 1 - 1
gradle.properties

@@ -25,4 +25,4 @@ android.enableJetifier=true
 kapt.use.worker.api=false
 kapt.incremental.apt=false
 
-isUserModule = true
+isUserModule = false

+ 14 - 0
usercenter/build.gradle

@@ -27,6 +27,16 @@ android {
         versionCode 1
         versionName "1.0"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+
+        kapt {
+            arguments {
+                //根据模块名来命名路由根节点
+                arg("AROUTER_MODULE_NAME", project.getName())
+                //生成Json文件
+                arg("AROUTER_GENERATE_DOC", "enable")
+            }
+        }
+
     }
 
     buildTypes {
@@ -53,6 +63,10 @@ android {
     kotlinOptions {
         jvmTarget = '1.8'
     }
+
+    packagingOptions {
+        resources.excludes.add("META-INF/*")
+    }
 }
 
 dependencies {

+ 5 - 2
usercenter/src/main/debug/AndroidManifest.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.cooleshow.usercenter">
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.cooleshow.usercenter">
 
     <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
@@ -10,9 +11,11 @@
             android:allowBackup="true"
             android:label="@string/app_name"
             android:supportsRtl="true"
+            tools:replace="android:theme"
             android:theme="@style/AppTheme">
 
-        <activity android:name=".ui.activity.LoginActivity">
+        <activity android:name=".ui.activity.LoginActivity"
+            android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
 

+ 19 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/api/UploadApi.kt

@@ -0,0 +1,19 @@
+package com.kotlin.user.data.api
+
+import com.cooleshow.base.data.protocol.BaseResp
+
+import io.reactivex.rxjava3.core.Observable
+import retrofit2.http.POST
+
+
+/*
+    上传相关 接口
+ */
+interface UploadApi {
+
+    /*
+        获取七牛云上传凭证
+     */
+    @POST("common/getUploadToken")
+    fun getUploadToken(): Observable<BaseResp<String>>
+}

+ 47 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/api/UserApi.kt

@@ -0,0 +1,47 @@
+package com.cooleshow.usercenter.data.api
+
+
+import com.cooleshow.base.data.protocol.BaseResp
+import com.cooleshow.usercenter.data.protocol.LoginReq
+import com.cooleshow.usercenter.data.protocol.RegisterReq
+import com.cooleshow.usercenter.data.protocol.UserInfo
+import io.reactivex.rxjava3.core.Observable
+import retrofit2.http.Body
+import retrofit2.http.POST
+
+
+/*
+    用户相关 接口
+ */
+interface UserApi{
+
+    /*
+        用户注册
+     */
+    @POST("userCenter/register")
+    fun register(@Body req: RegisterReq): Observable<BaseResp<String>>
+
+    /*
+        用户登录
+     */
+    @POST("userCenter/login")
+    fun login(@Body req: LoginReq):Observable<BaseResp<UserInfo>>
+
+    /*
+        忘记密码
+//     */
+//    @POST("userCenter/forgetPwd")
+//    fun forgetPwd(@Body req:ForgetPwdReq):Observable<BaseResp<String>>
+//
+//    /*
+//        重置密码
+//     */
+//    @POST("userCenter/resetPwd")
+//    fun resetPwd(@Body req:ResetPwdReq):Observable<BaseResp<String>>
+//
+//    /*
+//        编辑用户资料
+//     */
+//    @POST("userCenter/editUser")
+//    fun editUser(@Body req:EditUserReq):Observable<BaseResp<UserInfo>>
+}

+ 6 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/protocol/LoginReq.kt

@@ -0,0 +1,6 @@
+package com.cooleshow.usercenter.data.protocol
+
+/*
+    登录请求体
+ */
+data class LoginReq(val mobile:String, val pwd:String, val pushId:String)

+ 6 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/protocol/RegisterReq.kt

@@ -0,0 +1,6 @@
+package com.cooleshow.usercenter.data.protocol
+
+/*
+    注册请求体
+ */
+data class RegisterReq(val mobile:String,val pwd:String,val verifyCode:String)

+ 22 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/respository/UploadRepository.kt

@@ -0,0 +1,22 @@
+package com.cooleshow.usercenter.data.respository
+
+
+import com.cooleshow.base.data.net.RetrofitFactory
+import com.cooleshow.base.data.protocol.BaseResp
+import com.kotlin.user.data.api.UploadApi
+import io.reactivex.rxjava3.core.Observable
+import javax.inject.Inject
+
+/*
+    上传相关 数据层
+ */
+class UploadRepository @Inject constructor(){
+    /*
+        获取七牛云上传凭证
+     */
+    fun getUploadToken(): Observable<BaseResp<String>> {
+        return RetrofitFactory.instance.create(UploadApi::class.java).getUploadToken()
+    }
+
+
+}

+ 51 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/respository/UserRepository.kt

@@ -0,0 +1,51 @@
+package com.kotlin.user.data.respository
+
+import com.cooleshow.base.data.net.RetrofitFactory
+import com.cooleshow.base.data.protocol.BaseResp
+import com.cooleshow.usercenter.data.api.UserApi
+import com.cooleshow.usercenter.data.protocol.LoginReq
+import com.cooleshow.usercenter.data.protocol.RegisterReq
+import com.cooleshow.usercenter.data.protocol.UserInfo
+
+import io.reactivex.rxjava3.core.Observable
+import javax.inject.Inject
+
+/*
+    用户相关数据层
+ */
+class UserRepository @Inject constructor(){
+    /*
+        用户注册
+     */
+    fun register(mobile:String,pwd:String,verifyCode:String): Observable<BaseResp<String>> {
+        return RetrofitFactory.instance.create(UserApi::class.java).register(RegisterReq(mobile,pwd,verifyCode))
+    }
+
+    /*
+        用户登录
+     */
+    fun login(mobile:String,pwd:String,pushId:String): Observable<BaseResp<UserInfo>> {
+        return RetrofitFactory.instance.create(UserApi::class.java).login(LoginReq(mobile,pwd,pushId))
+    }
+    /*
+   //        忘记密码
+   //     */
+//    fun forgetPwd(mobile:String,verifyCode:String): Observable<BaseResp<String>>{
+//        return RetrofitFactory.instance.create(UserApi::class.java).forgetPwd(ForgetPwdReq(mobile,verifyCode))
+//    }
+//
+//    /*
+//        重置密码
+//     */
+//    fun resetPwd(mobile:String,pwd:String): Observable<BaseResp<String>>{
+//        return RetrofitFactory.instance.create(UserApi::class.java).resetPwd(ResetPwdReq(mobile,pwd))
+//    }
+//
+//    /*
+//        编辑用户资料
+//     */
+//    fun editUser(userIcon:String,userName:String,userGender:String,userSign:String):Observable<BaseResp<UserInfo>>{
+//        return RetrofitFactory.instance.create(UserApi::class.java).editUser(EditUserReq(userIcon,userName,userGender,userSign))
+//    }
+//
+}

+ 27 - 0
usercenter/src/main/java/com/cooleshow/usercenter/injection/component/UserComponent.kt

@@ -0,0 +1,27 @@
+package com.cooleshow.usercenter.injection.component
+
+
+import com.cooleshow.base.injection.PerComponentScope
+import com.cooleshow.base.injection.component.ActivityComponent
+import com.cooleshow.usercenter.injection.module.UploadModule
+import com.cooleshow.usercenter.injection.module.UserModule
+import com.cooleshow.usercenter.ui.activity.LoginActivity
+
+import dagger.Component
+
+/*
+    用户模块Component
+ */
+@PerComponentScope
+@Component(dependencies = arrayOf(ActivityComponent::class),modules = arrayOf(
+    UserModule::class,
+    UploadModule::class)
+)
+interface UserComponent {
+
+    fun inject(activity: LoginActivity)
+//    fun inject(activity:RegisterActivity)
+//    fun inject(activity:ForgetPwdActivity)
+//    fun inject(activity:ResetPwdActivity)
+//    fun inject(activity:UserInfoActivity)
+}

+ 18 - 0
usercenter/src/main/java/com/cooleshow/usercenter/injection/module/UploadModule.kt

@@ -0,0 +1,18 @@
+package com.cooleshow.usercenter.injection.module
+
+
+import dagger.Module
+import dagger.Provides
+
+/*
+    上传Module
+ */
+@Module
+class UploadModule {
+
+//    @Provides
+//    fun provideUploadService(uploadService: UploadServiceImpl): UploadService {
+//        return uploadService
+//    }
+
+}

+ 21 - 0
usercenter/src/main/java/com/cooleshow/usercenter/injection/module/UserModule.kt

@@ -0,0 +1,21 @@
+package com.cooleshow.usercenter.injection.module
+
+
+import com.cooleshow.usercenter.service.UserService
+import com.cooleshow.usercenter.service.impl.UserServiceImpl
+import dagger.Module
+import dagger.Provides
+
+/*
+    用户模块Module
+ */
+@Module
+class UserModule {
+
+    @Provides
+    fun provideUserService(userService: UserServiceImpl): UserService {
+        return userService
+    }
+
+}
+

+ 1 - 1
usercenter/src/main/java/com/cooleshow/usercenter/presenter/LoginPresenter.kt

@@ -5,7 +5,7 @@ import com.cooleshow.base.presenter.BasePresenter
 import com.cooleshow.base.rx.BaseSubscriber
 import com.cooleshow.usercenter.data.protocol.UserInfo
 import com.cooleshow.usercenter.presenter.view.LoginView
-import com.cooleshow.usercenter.service.impl.UserService
+import com.cooleshow.usercenter.service.UserService
 import javax.inject.Inject
 
 

+ 8 - 8
usercenter/src/main/java/com/cooleshow/usercenter/service/impl/UserService.kt → usercenter/src/main/java/com/cooleshow/usercenter/service/UserService.kt

@@ -1,4 +1,4 @@
-package com.cooleshow.usercenter.service.impl
+package com.cooleshow.usercenter.service
 
 import com.cooleshow.usercenter.data.protocol.UserInfo
 import io.reactivex.rxjava3.core.Observable
@@ -16,11 +16,11 @@ interface UserService {
     fun login(mobile:String,pwd:String,pushId:String):Observable<UserInfo>
 
     //忘记密码
-    fun forgetPwd(mobile:String,verifyCode:String):Observable<Boolean>
-
-    //重置密码
-    fun resetPwd(mobile:String,pwd:String):Observable<Boolean>
-
-    //编辑用户资料
-    fun editUser(userIcon:String,userName:String,userGender:String,userSign:String):Observable<UserInfo>
+//    fun forgetPwd(mobile:String,verifyCode:String):Observable<Boolean>
+//
+//    //重置密码
+//    fun resetPwd(mobile:String,pwd:String):Observable<Boolean>
+//
+//    //编辑用户资料
+//    fun editUser(userIcon:String,userName:String,userGender:String,userSign:String):Observable<UserInfo>
 }

+ 54 - 0
usercenter/src/main/java/com/cooleshow/usercenter/service/impl/UserServiceImpl.kt

@@ -0,0 +1,54 @@
+package com.cooleshow.usercenter.service.impl
+
+import com.cooleshow.base.ext.convert
+import com.cooleshow.base.ext.convertBoolean
+import com.cooleshow.usercenter.data.protocol.UserInfo
+import com.cooleshow.usercenter.service.UserService
+import com.kotlin.user.data.respository.UserRepository
+import io.reactivex.rxjava3.core.Observable
+import javax.inject.Inject
+
+
+/*
+    用户模块业务实现类
+ */
+class UserServiceImpl @Inject constructor(): UserService {
+    @Inject
+    lateinit var repository: UserRepository
+
+    /*
+        注册
+     */
+    override fun register(mobile: String, pwd: String, verifyCode: String): Observable<Boolean> {
+        return repository.register(mobile, pwd, verifyCode).convertBoolean()
+    }
+
+    /*
+        登录
+     */
+    override fun login(mobile: String, pwd: String, pushId: String): Observable<UserInfo> {
+        return repository.login(mobile, pwd, pushId).convert()
+    }
+
+//    /*
+//        忘记密码
+//     */
+//    override fun forgetPwd(mobile: String, verifyCode: String): Observable<Boolean> {
+//        return repository.forgetPwd(mobile, verifyCode).convertBoolean()
+//    }
+//
+//    /*
+//        重置密码
+//     */
+//    override fun resetPwd(mobile: String, pwd: String): Observable<Boolean> {
+//        return repository.resetPwd(mobile, pwd).convertBoolean()
+//    }
+//
+//    /*
+//        修改用户资料
+//     */
+//    override fun editUser(userIcon: String, userName: String, userGender: String, userSign: String): Observable<UserInfo> {
+//        return repository.editUser(userIcon,userName,userGender,userSign).convert()
+//    }
+
+}

+ 24 - 1
usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/LoginActivity.kt

@@ -1,18 +1,41 @@
 package com.cooleshow.usercenter.ui.activity
 
+import android.os.Bundle
 import android.view.View
 import com.alibaba.android.arouter.facade.annotation.Route
 import com.cooleshow.base.ui.activity.BaseMvpActivity
 import com.cooleshow.provider.router.RouterPath
+import com.cooleshow.usercenter.R
 import com.cooleshow.usercenter.data.protocol.UserInfo
+import com.cooleshow.usercenter.injection.component.DaggerUserComponent
+import com.cooleshow.usercenter.injection.module.UserModule
 import com.cooleshow.usercenter.presenter.LoginPresenter
 import com.cooleshow.usercenter.presenter.view.LoginView
 
 @Route(path = RouterPath.UserCenter.PATH_LOGIN)
 class LoginActivity : BaseMvpActivity<LoginPresenter>(), LoginView, View.OnClickListener{
 
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_login)
+
+        initView()
+    }
+
+    private fun initView() {
+
+
+    }
+
+
     override fun injectComponent() {
-        TODO("Not yet implemented")
+        DaggerUserComponent.builder()
+            .activityComponent(mActivityComponent)
+            .userModule(UserModule())
+            .build()
+            .inject(this)
+        mPresenter.mView = this
     }
 
     override fun onClick(v: View?) {

+ 43 - 0
usercenter/src/main/res/layout/activity_login.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    style="@style/MatchMatch.Vertical.Common">
+    <com.cooleshow.base.widgets.HeaderBar
+        android:id="@+id/mHeaderBar"
+        style="@style/MatchWrap"
+        app:titleText="登录"
+        app:rightText="注册"
+        />
+    <LinearLayout android:background="@drawable/border_corner_all"
+        android:layout_margin="@dimen/common_margin"
+        style="@style/MatchWrap.Vertical">
+        <EditText android:id="@+id/mMobileEt"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/common_line_height"
+            android:background="@null"
+            android:paddingLeft="@dimen/common_padding_small"
+            android:hint="请输入手机号码"
+            android:drawablePadding="@dimen/common_padding_small"
+            android:inputType="phone"/>
+        <View style="@style/DividerFixedHeight"/>
+        <EditText android:id="@+id/mPwdEt"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/common_line_height"
+            android:background="@null"
+            android:paddingLeft="@dimen/common_padding_small"
+            android:hint="请输入密码"
+            android:drawablePadding="@dimen/common_padding_small"
+            android:inputType="textPassword"/>
+    </LinearLayout>
+    <Button
+        android:id="@+id/mLoginBtn"
+        style="@style/FullBtnStyle"
+        android:text="登录"/>
+    <TextView
+        android:id="@+id/mForgetPwdTv"
+        style="@style/WrapWrap"
+        android:textColor="@color/common_blue"
+        android:layout_gravity="right"
+        android:layout_marginRight="@dimen/common_margin"
+        android:text="忘记密码?"/>
+</LinearLayout>