Browse Source

学生端开头
学生端商城
我的 设置 收货地址(修改添加地址)
关于我们
个人设置(头像、昵称、性别、手机号、修改密码、实名认证、退出登录)
首页部分

Ryan8057 2 năm trước cách đây
mục cha
commit
0fa6ca7a55
100 tập tin đã thay đổi với 4403 bổ sung7 xóa
  1. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java
  2. 21 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java
  3. 3 0
      BaseLibrary/src/main/res/values/colors.xml
  4. 59 0
      student/src/main/AndroidManifest.xml
  5. 63 0
      student/src/main/java/com/cooleshow/student/adapter/AddressListAdapter.java
  6. 35 0
      student/src/main/java/com/cooleshow/student/adapter/HomeMenuItemAdapter.java
  7. 35 0
      student/src/main/java/com/cooleshow/student/adapter/HomeMenuPagerAdapter.java
  8. 30 0
      student/src/main/java/com/cooleshow/student/adapter/ItemMarkAdapter.java
  9. 133 0
      student/src/main/java/com/cooleshow/student/api/APIService.java
  10. 23 0
      student/src/main/java/com/cooleshow/student/bean/AddressBean.java
  11. 75 0
      student/src/main/java/com/cooleshow/student/bean/AppHomeBean.java
  12. 15 0
      student/src/main/java/com/cooleshow/student/bean/PayTestBean.java
  13. 64 0
      student/src/main/java/com/cooleshow/student/bean/StudentUserInfo.java
  14. 0 0
      student/src/main/java/com/cooleshow/student/bean/alipay/AuthResult.java
  15. 1 0
      student/src/main/java/com/cooleshow/student/bean/alipay/PayResult.java
  16. 74 0
      student/src/main/java/com/cooleshow/student/bean/weixinpay/WeixinPayInfo.java
  17. 17 0
      student/src/main/java/com/cooleshow/student/contract/AboutContract.java
  18. 20 0
      student/src/main/java/com/cooleshow/student/contract/AddressListContract.java
  19. 18 0
      student/src/main/java/com/cooleshow/student/contract/CheckModifyPhoneNumContract.java
  20. 18 0
      student/src/main/java/com/cooleshow/student/contract/EditAddressContract.java
  21. 2 0
      student/src/main/java/com/cooleshow/student/contract/HomeContract.java
  22. 17 0
      student/src/main/java/com/cooleshow/student/contract/HomeMenuContract.java
  23. 3 0
      student/src/main/java/com/cooleshow/student/contract/MineContract.java
  24. 19 0
      student/src/main/java/com/cooleshow/student/contract/ModifyNickNameContract.java
  25. 19 0
      student/src/main/java/com/cooleshow/student/contract/ModifyPasswordContract.java
  26. 18 0
      student/src/main/java/com/cooleshow/student/contract/ModifyPhoneNumContract.java
  27. 19 0
      student/src/main/java/com/cooleshow/student/contract/PayTestContract.java
  28. 18 0
      student/src/main/java/com/cooleshow/student/contract/PersonalCertificationContract.java
  29. 22 0
      student/src/main/java/com/cooleshow/student/contract/PersonalSettingContract.java
  30. 17 0
      student/src/main/java/com/cooleshow/student/contract/SettingContract.java
  31. 13 0
      student/src/main/java/com/cooleshow/student/presenter/main/HomeMenuPresenter.java
  32. 39 0
      student/src/main/java/com/cooleshow/student/presenter/main/HomePresenter.java
  33. 15 0
      student/src/main/java/com/cooleshow/student/presenter/main/MinePresenter.java
  34. 14 0
      student/src/main/java/com/cooleshow/student/presenter/mine/AboutPresenter.java
  35. 47 0
      student/src/main/java/com/cooleshow/student/presenter/mine/AddressListPresenter.java
  36. 47 0
      student/src/main/java/com/cooleshow/student/presenter/mine/CheckModifyPhoneNumPresenter.java
  37. 76 0
      student/src/main/java/com/cooleshow/student/presenter/mine/EditAddressPresenter.java
  38. 40 0
      student/src/main/java/com/cooleshow/student/presenter/mine/ModifyNickNamePresenter.java
  39. 73 0
      student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPasswordPresenter.java
  40. 44 0
      student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPhoneNumPresenter.java
  41. 40 0
      student/src/main/java/com/cooleshow/student/presenter/mine/PayTestPresenter.java
  42. 47 0
      student/src/main/java/com/cooleshow/student/presenter/mine/PersonalCertificationPresenter.java
  43. 84 0
      student/src/main/java/com/cooleshow/student/presenter/mine/PersonalSettingPresenter.java
  44. 14 0
      student/src/main/java/com/cooleshow/student/presenter/mine/SettingPresenter.java
  45. 71 0
      student/src/main/java/com/cooleshow/student/ui/main/HomeFragment.java
  46. 68 0
      student/src/main/java/com/cooleshow/student/ui/main/HomeMenuFragment.java
  47. 1 1
      student/src/main/java/com/cooleshow/student/ui/main/MainActivity.java
  48. 146 1
      student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java
  49. 138 5
      student/src/main/java/com/cooleshow/student/ui/main/ShopMallFragment.java
  50. 43 0
      student/src/main/java/com/cooleshow/student/ui/mine/AboutActivity.java
  51. 88 0
      student/src/main/java/com/cooleshow/student/ui/mine/AddressListActivity.java
  52. 89 0
      student/src/main/java/com/cooleshow/student/ui/mine/CheckModifyPhoneNumActivity.java
  53. 394 0
      student/src/main/java/com/cooleshow/student/ui/mine/EditAddressActivity.java
  54. 86 0
      student/src/main/java/com/cooleshow/student/ui/mine/ModifyNickNameActivity.java
  55. 197 0
      student/src/main/java/com/cooleshow/student/ui/mine/ModifyPasswordActivity.java
  56. 173 0
      student/src/main/java/com/cooleshow/student/ui/mine/ModifyPhoneNumActivity.java
  57. 255 0
      student/src/main/java/com/cooleshow/student/ui/mine/PayTestActivity.java
  58. 84 0
      student/src/main/java/com/cooleshow/student/ui/mine/PersonalCertificationActivity.java
  59. 361 0
      student/src/main/java/com/cooleshow/student/ui/mine/PersonalSettingActivity.java
  60. 94 0
      student/src/main/java/com/cooleshow/student/ui/mine/SettingActivity.java
  61. 456 0
      student/src/main/java/com/cooleshow/student/ui/web/WebActivity.java
  62. 145 0
      student/src/main/java/com/cooleshow/student/widgets/helper/JsInterfaceHelper.java
  63. 62 0
      student/src/main/java/com/cooleshow/student/wxapi/WXPayEntryActivity.java
  64. BIN
      student/src/main/res/drawable-xhdpi/icon_about_logo.png
  65. BIN
      student/src/main/res/drawable-xhdpi/icon_black_down.png
  66. BIN
      student/src/main/res/drawable-xhdpi/icon_et_close.png
  67. BIN
      student/src/main/res/drawable-xhdpi/icon_go_down.png
  68. BIN
      student/src/main/res/drawable-xhdpi/icon_home_menu_live.png
  69. BIN
      student/src/main/res/drawable-xhdpi/icon_home_menu_practice.png
  70. BIN
      student/src/main/res/drawable-xhdpi/icon_home_menu_score.png
  71. BIN
      student/src/main/res/drawable-xhdpi/icon_home_menu_style.png
  72. BIN
      student/src/main/res/drawable-xhdpi/icon_home_menu_video.png
  73. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_course.png
  74. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_device_detection.png
  75. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_goods_order.png
  76. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_help.png
  77. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_homework.png
  78. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_id_star.png
  79. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_meter_records.png
  80. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_network_detection.png
  81. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_score.png
  82. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_setting.png
  83. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_top_bg.png
  84. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_transaction_record.png
  85. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_vip_bg.png
  86. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_vip_center.png
  87. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_vip_star.png
  88. BIN
      student/src/main/res/drawable-xhdpi/icon_modify_address.png
  89. BIN
      student/src/main/res/drawable-xhdpi/icon_next_right.png
  90. BIN
      student/src/main/res/drawable-xhdpi/icon_student_default_head.png
  91. BIN
      student/src/main/res/drawable-xhdpi/icon_switch_off.png
  92. BIN
      student/src/main/res/drawable-xhdpi/icon_switch_open.png
  93. BIN
      student/src/main/res/drawable-xhdpi/icon_top_message.png
  94. BIN
      student/src/main/res/drawable-xxhdpi/icon_about_logo.png
  95. BIN
      student/src/main/res/drawable-xxhdpi/icon_black_down.png
  96. BIN
      student/src/main/res/drawable-xxhdpi/icon_et_close.png
  97. BIN
      student/src/main/res/drawable-xxhdpi/icon_go_down.png
  98. BIN
      student/src/main/res/drawable-xxhdpi/icon_home_menu_live.png
  99. BIN
      student/src/main/res/drawable-xxhdpi/icon_home_menu_practice.png
  100. BIN
      student/src/main/res/drawable-xxhdpi/icon_home_menu_score.png

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java

@@ -12,6 +12,7 @@ public class BaseConstant {
     public final static String AUTH_GROUP = "api-auth/";
     public final static String MALL_ADMIN_SERVER = "api-mall-admin/";
     public final static String MALL_PORTAL_SERVER = "api-mall-portal/";
+    public final static String CMS_SERVER = "api-cms/";
 
 
     public final static String TABLE_PREFS = "Kotlin_mall";

+ 21 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java

@@ -21,6 +21,27 @@ public abstract class WebConstants {
     private static String getBaseUrlH5() {
         return BaseApplication.Companion.isTeacherClient() ? getTeacherBaseUrlH5() : getStudentBaseUrlH5();
     }
+    //直播课列表
+    public static  final String STUDENT_LIVE_CLASS=getBaseUrlH5() +"/#/liveClass";
+    //视频课列表
+    public static  final String STUDENT_VIDEO_CLASS=getBaseUrlH5() +"/#/videoClass";
+    //陪练课列表
+    public static  final String STUDENT_PRACTICE_CLASS=getBaseUrlH5() +"/#/practiceClass";
+    //评测记录
+    public static  final String STUDENT_MEMBER_RECORD=getBaseUrlH5() +"/#/memberRecord";
+    //会员中心
+    public static  final String STUDENT_MEMBER_CENTER=getBaseUrlH5() +"/#/memberCenter";
+    //老师主页
+    public static  final String STUDENT_TEACHER_HOME=getBaseUrlH5() +"/#/teacherHome?teacherId=";
+    //老师风采
+    public static  final String STUDENT_TEACHER_ELEGANT=getBaseUrlH5() +"/#/teacherElegant";
+    //交易记录
+    public static  final String STUDENT_TRAD_RECORD=getBaseUrlH5() +"/#/tradeRecord";
+    //我的关注
+    public static  final String STUDENT_TEACHER_FOLLOW=getBaseUrlH5() +"/#/teacherFollow";
+    //我的乐谱
+    public static  final String STUDENT_MUSIC_PERSONAL=getBaseUrlH5() +"/#/music-personal";
+
 
     //注册协议
     public static final String REGISTRATION_AGREEMENT = getBaseUrlH5() + "/#/registerProtocol";

+ 3 - 0
BaseLibrary/src/main/res/values/colors.xml

@@ -84,4 +84,7 @@
     <color name="color_cefbe3">#CEFBE3</color>
     <color name="color_9e9e9e">#9E9E9E</color>
     <color name="color_dcebe4">#DCEBE4</color>
+    <color name="color_fed271">#FED271</color>
+    <color name="color_778098">#778098</color>
+    <color name="color_ebebeb">#EBEBEB</color>
 </resources>

+ 59 - 0
student/src/main/AndroidManifest.xml

@@ -30,6 +30,65 @@
         <activity
             android:name=".ui.main.MainActivity"
             android:exported="false"/>
+        <activity
+            android:name=".ui.web.WebActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.SettingActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.AddressListActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.AboutActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.EditAddressActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.PersonalSettingActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.CheckModifyPhoneNumActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.ModifyPhoneNumActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.ModifyPasswordActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.PersonalCertificationActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.ModifyNickNameActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.mine.PayTestActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".wxapi.WXPayEntryActivity"
+            android:exported="true"
+            android:launchMode="singleTop">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:scheme="wx149a928c415c137a" />
+            </intent-filter>
+
+        </activity>
     </application>
 
 </manifest>

+ 63 - 0
student/src/main/java/com/cooleshow/student/adapter/AddressListAdapter.java

@@ -0,0 +1,63 @@
+package com.cooleshow.student.adapter;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.AddressBean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/17 15:32
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class AddressListAdapter extends BaseQuickAdapter<AddressBean, BaseViewHolder> {
+
+    public AddressListAdapter(List<AddressBean> data) {
+        super(R.layout.layout_address_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, AddressBean item) {
+        TextView tv_name=helper.getView(R.id.tv_name);
+        TextView tv_phone=helper.getView(R.id.tv_phone);
+        TextView tv_address=helper.getView(R.id.tv_address);
+        View view_line=helper.getView(R.id.view_line);
+        tv_name.setText(item.name);
+        String cPhone = item.phoneNumber.substring(0, 3) + "****" + item.phoneNumber.substring(7, item.phoneNumber.length());
+        tv_phone.setText(cPhone);
+        String addressDetail=item.province+item.city+item.region+item.detailAddress;
+        tv_address.setText(addressDetail);
+        if (getData().size()-1==getItemPosition(item)){
+            view_line.setVisibility(View.GONE);
+        }else {
+            view_line.setVisibility(View.VISIBLE);
+        }
+        ImageView im_modify = helper.getView(R.id.im_modify);
+        im_modify.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Bundle bundle = new Bundle();
+                bundle.putSerializable("AddressBean", item);
+
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_EDIT_ADDRESS)
+                        .withBoolean("isAdd",false)
+                        .withBundle("bundle",bundle)
+                        .navigation();
+            }
+        });
+
+    }
+
+
+}

+ 35 - 0
student/src/main/java/com/cooleshow/student/adapter/HomeMenuItemAdapter.java

@@ -0,0 +1,35 @@
+package com.cooleshow.student.adapter;
+
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.AddressBean;
+import com.cooleshow.student.bean.AppHomeBean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/26 18:00
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeMenuItemAdapter extends BaseQuickAdapter<AppHomeBean.ItemBean, BaseViewHolder> {
+
+    public HomeMenuItemAdapter(List<AppHomeBean.ItemBean> data) {
+        super(R.layout.layout_home_menu_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, AppHomeBean.ItemBean item) {
+        ImageView im_pic = helper.getView(R.id.im_pic);
+        TextView tv_title = helper.getView(R.id.tv_title);
+        GlideUtils.INSTANCE.loadImage(getContext(), item.coverImage, im_pic);
+        tv_title.setText(item.title);
+    }
+}

+ 35 - 0
student/src/main/java/com/cooleshow/student/adapter/HomeMenuPagerAdapter.java

@@ -0,0 +1,35 @@
+package com.cooleshow.student.adapter;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/26 17:30
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeMenuPagerAdapter extends FragmentPagerAdapter {
+
+
+    private List<Fragment> fragments;
+
+    public HomeMenuPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
+        super(fm);
+        this.fragments = fragments;
+    }
+
+    @Override
+    public Fragment getItem(int position) {
+        return fragments != null && fragments.size() > position ? fragments.get(position) : null;
+    }
+
+    @Override
+    public int getCount() {
+        return fragments == null ? 0 : fragments.size();
+    }
+
+}

+ 30 - 0
student/src/main/java/com/cooleshow/student/adapter/ItemMarkAdapter.java

@@ -0,0 +1,30 @@
+package com.cooleshow.student.adapter;
+
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.student.R;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/26 14:07
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ItemMarkAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
+
+    public ItemMarkAdapter(List<String> data) {
+        super(R.layout.layout_mark_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, String item) {
+        TextView tv_content = helper.getView(R.id.tv_content);
+        tv_content.setText(item);
+    }
+
+}

+ 133 - 0
student/src/main/java/com/cooleshow/student/api/APIService.java

@@ -1,12 +1,28 @@
 package com.cooleshow.student.api;
 
 import static com.cooleshow.base.common.BaseConstant.AUTH_GROUP;
+import static com.cooleshow.base.common.BaseConstant.CMS_SERVER;
+import static com.cooleshow.base.common.BaseConstant.MALL_PORTAL_SERVER;
+import static com.cooleshow.base.common.BaseConstant.STUDENT_GROUP;
+import static com.cooleshow.base.common.BaseConstant.TEACHER_GROUP;
 
 import com.cooleshow.base.data.net.BaseResponse;
+import com.cooleshow.student.bean.AddressBean;
+import com.cooleshow.student.bean.AppHomeBean;
+import com.cooleshow.student.bean.PayTestBean;
+import com.cooleshow.student.bean.StudentUserInfo;
+import com.cooleshow.usercenter.bean.SetDetailBean;
 import com.cooleshow.usercenter.bean.UserInfo;
 
+import java.util.List;
+
 import io.reactivex.rxjava3.core.Observable;
+import okhttp3.RequestBody;
+import retrofit2.http.Body;
 import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
 
 /**
  * 创建日期:2022/5/26 10:01
@@ -23,4 +39,121 @@ public interface APIService {
      */
     @GET(AUTH_GROUP + "api/queryUserInfo")
     Observable<BaseResponse<UserInfo>> getUserInfo();
+
+    /**
+     * 查询学员基本信息
+     *
+     * @return
+     */
+    @GET(STUDENT_GROUP + "student/queryUserInfo")
+    Observable<BaseResponse<StudentUserInfo>> queryUserInfo();
+
+    /**
+     * 获取所有收货地址
+     *
+     * @return
+     */
+    @GET(MALL_PORTAL_SERVER + "member/address/list")
+    Observable<BaseResponse<List<AddressBean>>> companyAddressList();
+
+    /**
+     * 添加收货地址
+     *
+     * @param body
+     * @return
+     */
+    @POST(MALL_PORTAL_SERVER + "member/address/add")
+    Observable<BaseResponse<Object>> createNewAddress(@Body RequestBody body);
+
+    /**
+     * 修改地址
+     *
+     * @param id
+     * @param body
+     * @return
+     */
+    @POST(MALL_PORTAL_SERVER + "member/address/update/{id}")
+    Observable<BaseResponse<Object>> updateAddress(@Path("id") int id, @Body RequestBody body);
+
+    /**
+     * 获取设置详情
+     *
+     * @return
+     */
+    @GET(AUTH_GROUP + "user/getSetDetail")
+    Observable<BaseResponse<SetDetailBean>> getSetDetail();
+
+    /**
+     * 修改设置信息
+     *
+     * @param body
+     * @return
+     */
+    @POST(AUTH_GROUP + "user/submitSetDetail")
+    Observable<BaseResponse<SetDetailBean>> submitSetDetail(@Body RequestBody body);
+
+    /**
+     * 校验用户手机号和密码
+     *
+     * @param phone
+     * @param password
+     * @return
+     */
+    @GET(AUTH_GROUP + "user/checkUser")
+    Observable<BaseResponse<Object>> checkUser(@Query("phone") String phone, @Query("password") String password);
+
+    /**
+     * 修改手机号
+     *
+     * @param authCode
+     * @param newPhone
+     * @param oldPhone
+     * @return
+     */
+    @GET(AUTH_GROUP + "user/updatePhone")
+    Observable<BaseResponse<Object>> updatePhone(@Query("authCode") String authCode, @Query("newPhone") String newPhone, @Query("oldPhone") String oldPhone);
+
+    /**
+     * 手机验证码修改密码
+     *
+     * @param body
+     * @return
+     */
+    @POST(AUTH_GROUP + "user/updatePassword")
+    Observable<BaseResponse<Object>> updatePassword(@Body RequestBody body);
+
+    /**
+     * 发送登录短信验证码
+     *
+     * @param body mobile 手机号
+     *             type:类型(PASSWD:修改密码,LOGIN:登录,REGISTER:注册,BANK:绑定银行卡))
+     * @return
+     */
+    @POST(STUDENT_GROUP + "code/sendSmsCode")
+    Observable<BaseResponse<Object>> sendSmsCode(@Body RequestBody body);
+
+    /**
+     * 实名认证
+     *
+     * @param body
+     * @return
+     */
+    @POST(AUTH_GROUP + "user/realNameAuth")
+    Observable<BaseResponse<Object>> realNameAuth(@Body RequestBody body);
+
+    /**
+     * 测试订单支付
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "userOrder/orderPay")
+    Observable<BaseResponse<PayTestBean>> orderPay(@Body RequestBody body);
+
+    /**
+     * app首页banner、按钮、资讯
+     *
+     * @return
+     */
+    @POST(CMS_SERVER + "news/app/home")
+    Observable<BaseResponse<AppHomeBean>> appHome(@Body RequestBody body);
 }

+ 23 - 0
student/src/main/java/com/cooleshow/student/bean/AddressBean.java

@@ -0,0 +1,23 @@
+package com.cooleshow.student.bean;
+
+import java.io.Serializable;
+
+/**
+ * 创建日期:2022/5/17 15:29
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class AddressBean implements Serializable {
+
+    public String city;
+    public int defaultStatus; //是否默认收货地址:0->否;1->是
+    public String detailAddress;
+    public int id;
+    public String memberId;
+    public String name;
+    public String phoneNumber;
+    public String postCode;
+    public String province;
+    public String region;
+}

+ 75 - 0
student/src/main/java/com/cooleshow/student/bean/AppHomeBean.java

@@ -0,0 +1,75 @@
+package com.cooleshow.student.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/26 16:58
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class AppHomeBean {
+    public List<ItemBean> appMenu;
+    public List<ItemBean> banner;
+    public List<ItemBean> flashPage;
+    public List<ItemBean> information;
+
+    public static class ItemBean implements Serializable {
+        /*
+        		"attribute1": "",
+				"attribute2": "",
+				"content": "",
+				"coverImage": "",
+				"createTime": "",
+				"delFlag": true,
+				"hrefTarget": "",
+				"id": 0,
+				"linkType": "",
+				"linkUrl": "",
+				"memo": "",
+				"offlineTime": "",
+				"onlineTime": "",
+				"order": 0,
+				"showTime": 0,
+				"status": "",
+				"subType": 0,
+				"subTypeName": "",
+				"subjectIdList": "",
+				"subjectName": "",
+				"title": "",
+				"type": 0,
+				"typeName": "",
+				"updateName": "",
+				"updateTime": "",
+				"videoCoverImage": ""
+         */
+        public String attribute1;
+        public String attribute2;
+        public String content;
+        public String coverImage;
+        public String createTime;
+        public boolean delFlag;
+        public String hrefTarget;
+        public long id;
+        public String linkType;
+        public String linkUrl;
+        public String memo;
+        public String offlineTime;
+        public String onlineTime;
+        public int order;
+        public int showTime;
+        public String status;
+        public int subType;
+        public String subTypeName;
+        public String subjectIdList;
+        public String subjectName;
+        public String title;
+        public int type;
+        public String typeName;
+        public String updateName;
+        public String updateTime;
+        public String videoCoverImage;
+
+    }
+}

+ 15 - 0
student/src/main/java/com/cooleshow/student/bean/PayTestBean.java

@@ -0,0 +1,15 @@
+package com.cooleshow.student.bean;
+
+/**
+ * 创建日期:2022/5/25 14:37
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PayTestBean {
+    public String paymentNo;
+    public String payChannel;
+    public String pay_amt;
+    public String pay_info;
+
+}

+ 64 - 0
student/src/main/java/com/cooleshow/student/bean/StudentUserInfo.java

@@ -0,0 +1,64 @@
+package com.cooleshow.student.bean;
+
+/**
+ * 创建日期:2022/5/26 13:51
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class StudentUserInfo {
+    /*
+    	"birthdate": "",
+		"cloudStudySequenceDays": 0,
+		"cloudStudyUseLastDay": "",
+		"createTime": "",
+		"exerciseDays": 0,
+		"exerciseHours": 0,
+		"finshClassHours": 0,
+		"gender": "",
+		"heardUrl": "",
+		"idCardNo": "",
+		"isReal": "",
+		"memberRankSettingId": 0,
+		"membershipDays": 0,
+		"membershipEndTime": "",
+		"membershipStartTime": "",
+		"phone": "",
+		"realName": "",
+		"starTeacherNum": 0,
+		"subjectId": "",
+		"subjectName": "",
+		"testingNum": 0,
+		"unfinshClassHours": 0,
+		"updateTime": "",
+		"userId": 0,
+		"username": ""
+     */
+    public String birthdate;
+    public int cloudStudySequenceDays;
+    public String cloudStudyUseLastDay;
+    public String createTime;
+    public int exerciseDays;
+    public int exerciseHours;
+    public int finshClassHours;
+    public String gender;
+    public String heardUrl;
+    public String idCardNo;
+    public String isReal;
+    public long memberRankSettingId;
+    public int membershipDays;
+    public String membershipEndTime;
+    public String membershipStartTime;
+    public String phone;
+    public String realName;
+    public String starTeacherNum;
+    public String subjectId;
+    public String subjectName;
+    public int testingNum;
+    public int unfinshClassHours;
+    public String updateTime;
+    public long userId;
+    public String username;
+
+
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
student/src/main/java/com/cooleshow/student/bean/alipay/AuthResult.java


+ 1 - 0
student/src/main/java/com/cooleshow/student/bean/alipay/PayResult.java

@@ -0,0 +1 @@
+package com.cooleshow.student.bean.alipay;

import android.text.TextUtils;

import java.util.Map;

public class PayResult {
	private String resultStatus;
	private String result;
	private String memo;

	public PayResult(Map<String, String> rawResult) {
		if (rawResult == null) {
			return;
		}

		for (String key : rawResult.keySet()) {
			if (TextUtils.equals(key, "resultStatus")) {
				resultStatus = rawResult.get(key);
			} else if (TextUtils.equals(key, "result")) {
				result = rawResult.get(key);
			} else if (TextUtils.equals(key, "memo")) {
				memo = rawResult.get(key);
			}
		}
	}

	@Override
	public String toString() {
		return "resultStatus={" + resultStatus + "};memo={" + memo
				+ "};result={" + result + "}";
	}

	/**
	 * @return the resultStatus
	 */
	public String getResultStatus() {
		return resultStatus;
	}

	/**
	 * @return the memo
	 */
	public String getMemo() {
		return memo;
	}

	/**
	 * @return the result
	 */
	public String getResult() {
		return result;
	}
}

+ 74 - 0
student/src/main/java/com/cooleshow/student/bean/weixinpay/WeixinPayInfo.java

@@ -0,0 +1,74 @@
+package com.cooleshow.student.bean.weixinpay;
+
+/**
+ * 创建日期:2022/5/25 14:47
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class WeixinPayInfo {
+
+    private String appid;
+    private String noncestr;
+    private String packageValue;
+    private String partnerid;
+    private String prepayid;
+    private String Sign;
+    private String timestamp;
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public String getNoncestr() {
+        return noncestr;
+    }
+
+    public void setNoncestr(String noncestr) {
+        this.noncestr = noncestr;
+    }
+
+    public String getPackageValue() {
+        return packageValue;
+    }
+
+    public void setPackageValue(String packageValue) {
+        this.packageValue = packageValue;
+    }
+
+    public String getPartnerid() {
+        return partnerid;
+    }
+
+    public void setPartnerid(String partnerid) {
+        this.partnerid = partnerid;
+    }
+
+    public String getPrepayid() {
+        return prepayid;
+    }
+
+    public void setPrepayid(String prepayid) {
+        this.prepayid = prepayid;
+    }
+
+    public String getSign() {
+        return Sign;
+    }
+
+    public void setSign(String sign) {
+        Sign = sign;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+}

+ 17 - 0
student/src/main/java/com/cooleshow/student/contract/AboutContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/18 14:11
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface AboutContract {
+    interface AboutView extends BaseView {
+
+    }
+    interface Presenter {
+    }
+}

+ 20 - 0
student/src/main/java/com/cooleshow/student/contract/AddressListContract.java

@@ -0,0 +1,20 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.AddressBean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/17 15:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface AddressListContract {
+    interface AddressListView extends BaseView {
+        void companyAddressListSuccess(List<AddressBean> data);
+    }
+    interface Presenter {
+    }
+}

+ 18 - 0
student/src/main/java/com/cooleshow/student/contract/CheckModifyPhoneNumContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/17 10:15
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface CheckModifyPhoneNumContract {
+    interface CheckModifyPhoneNumView extends BaseView {
+        void checkUserSuccess(Object object);
+    }
+
+    interface Presenter {
+    }
+}

+ 18 - 0
student/src/main/java/com/cooleshow/student/contract/EditAddressContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/18 10:20
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface EditAddressContract {
+    interface EditAddressView extends BaseView {
+        void createNewAddressSuccess(Object object);
+    }
+
+    interface Presenter {
+    }
+}

+ 2 - 0
student/src/main/java/com/cooleshow/student/contract/HomeContract.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.AppHomeBean;
 
 /**
  * 创建日期:2022/5/26 10:09
@@ -10,6 +11,7 @@ import com.cooleshow.base.presenter.view.BaseView;
  */
 public interface HomeContract {
     interface HomeView extends BaseView {
+        void appHomeSuccess(AppHomeBean appHomeBean);
     }
 
     interface Presenter {

+ 17 - 0
student/src/main/java/com/cooleshow/student/contract/HomeMenuContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/26 17:41
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface HomeMenuContract {
+    interface HomeMenuView extends BaseView {
+    }
+
+    interface Presenter {
+    }
+}

+ 3 - 0
student/src/main/java/com/cooleshow/student/contract/MineContract.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.StudentUserInfo;
 
 /**
  * 创建日期:2022/5/26 10:06
@@ -10,8 +11,10 @@ import com.cooleshow.base.presenter.view.BaseView;
  */
 public interface MineContract {
     interface MineView extends BaseView {
+        void queryUserInfoSuccess(StudentUserInfo data);
     }
 
     interface Presenter {
+        void queryUserInfo();
     }
 }

+ 19 - 0
student/src/main/java/com/cooleshow/student/contract/ModifyNickNameContract.java

@@ -0,0 +1,19 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+/**
+ * 创建日期:2022/5/16 17:50
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ModifyNickNameContract {
+    interface ModifyNickNameView extends BaseView {
+        void submitSetDetailSuccess(SetDetailBean setDetailBean);
+    }
+
+    interface Presenter {
+    }
+}

+ 19 - 0
student/src/main/java/com/cooleshow/student/contract/ModifyPasswordContract.java

@@ -0,0 +1,19 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/17 13:36
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ModifyPasswordContract {
+    interface ModifyPasswordView extends BaseView {
+        void updatePasswordSuccess(Object object);
+        void sendSmsCodeSuccess(Object object);
+    }
+
+    interface Presenter {
+    }
+}

+ 18 - 0
student/src/main/java/com/cooleshow/student/contract/ModifyPhoneNumContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/17 10:57
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ModifyPhoneNumContract {
+    interface ModifyPhoneNumView extends BaseView {
+        void updatePhoneSuccess(Object object);
+    }
+
+    interface Presenter {
+    }
+}

+ 19 - 0
student/src/main/java/com/cooleshow/student/contract/PayTestContract.java

@@ -0,0 +1,19 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.PayTestBean;
+
+/**
+ * 创建日期:2022/5/25 13:47
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface PayTestContract {
+    interface PayTestView extends BaseView {
+        void orderPaySuccess(PayTestBean o);
+
+    }
+    interface Presenter {
+    }
+}

+ 18 - 0
student/src/main/java/com/cooleshow/student/contract/PersonalCertificationContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/17 14:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface PersonalCertificationContract {
+    interface PersonalCertificationView extends BaseView {
+        void realNameAuthSuccess(Object object);
+    }
+
+    interface Presenter {
+    }
+}

+ 22 - 0
student/src/main/java/com/cooleshow/student/contract/PersonalSettingContract.java

@@ -0,0 +1,22 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+/**
+ * 创建日期:2022/5/16 16:12
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface PersonalSettingContract {
+    interface PersonalSettingView extends BaseView {
+        void getSetDetailSuccess(SetDetailBean setDetailBean);
+        void submitSetDetailSuccess(SetDetailBean setDetailBean);
+        void upLoadImageSuccess(String url);
+        void upLoadImageFailure();
+    }
+    interface Presenter {
+        void getSetDetail();
+    }
+}

+ 17 - 0
student/src/main/java/com/cooleshow/student/contract/SettingContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/16 16:58
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface SettingContract {
+    interface SettingView extends BaseView {
+
+    }
+    interface Presenter {
+    }
+}

+ 13 - 0
student/src/main/java/com/cooleshow/student/presenter/main/HomeMenuPresenter.java

@@ -0,0 +1,13 @@
+package com.cooleshow.student.presenter.main;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.student.contract.HomeMenuContract;
+
+/**
+ * 创建日期:2022/5/26 17:40
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeMenuPresenter extends BasePresenter<HomeMenuContract.HomeMenuView> implements HomeMenuContract.Presenter {
+}

+ 39 - 0
student/src/main/java/com/cooleshow/student/presenter/main/HomePresenter.java

@@ -1,9 +1,18 @@
 package com.cooleshow.student.presenter.main;
 
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.AppHomeBean;
+import com.cooleshow.student.bean.PayTestBean;
 import com.cooleshow.student.contract.HomeContract;
 import com.cooleshow.student.contract.MineContract;
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
 /**
  * 创建日期:2022/5/26 10:09
  *
@@ -11,4 +20,34 @@ import com.cooleshow.student.contract.MineContract;
  * 类说明:
  */
 public class HomePresenter extends BasePresenter<HomeContract.HomeView> implements HomeContract.Presenter {
+    public void appHome() {
+        getView().showLoading();
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("platform", "android");
+            jsonObject.putOpt("version", "1");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).appHome(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<AppHomeBean>(getView()) {
+            @Override
+            protected void onSuccess(AppHomeBean data) {
+                if (null!=getView()){
+                    getView().appHomeSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
 }

+ 15 - 0
student/src/main/java/com/cooleshow/student/presenter/main/MinePresenter.java

@@ -1,6 +1,9 @@
 package com.cooleshow.student.presenter.main;
 
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.StudentUserInfo;
 import com.cooleshow.student.contract.MineContract;
 
 /**
@@ -10,4 +13,16 @@ import com.cooleshow.student.contract.MineContract;
  * 类说明:
  */
 public class MinePresenter extends BasePresenter<MineContract.MineView> implements MineContract.Presenter {
+    @Override
+    public void queryUserInfo() {
+        addSubscribe(create(APIService.class).queryUserInfo(), new BaseObserver<StudentUserInfo>(getView()) {
+            @Override
+            protected void onSuccess(StudentUserInfo data) {
+                if (getView() != null) {
+                    getView().queryUserInfoSuccess(data);
+                }
+            }
+        });
+    }
+
 }

+ 14 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/AboutPresenter.java

@@ -0,0 +1,14 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.student.contract.AboutContract;
+
+/**
+ * 创建日期:2022/5/18 14:08
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class AboutPresenter extends BasePresenter<AboutContract.AboutView> implements AboutContract.Presenter {
+
+}

+ 47 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/AddressListPresenter.java

@@ -0,0 +1,47 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.ErrorParse;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.AddressBean;
+import com.cooleshow.student.contract.AddressListContract;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/17 15:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class AddressListPresenter extends BasePresenter<AddressListContract.AddressListView> implements AddressListContract.Presenter {
+    public void companyAddressList() {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).companyAddressList(), new BaseObserver<List<AddressBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<AddressBean> data) {
+                if (getView() != null) {
+                    getView().companyAddressListSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+}

+ 47 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/CheckModifyPhoneNumPresenter.java

@@ -0,0 +1,47 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.ErrorParse;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.CheckModifyPhoneNumContract;
+
+
+/**
+ * 创建日期:2022/5/17 10:15
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class CheckModifyPhoneNumPresenter extends BasePresenter<CheckModifyPhoneNumContract.CheckModifyPhoneNumView> implements CheckModifyPhoneNumContract.Presenter {
+
+    public void checkUser(String phone, String password) {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).checkUser(phone, password), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().checkUserSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+}

+ 76 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/EditAddressPresenter.java

@@ -0,0 +1,76 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.ErrorParse;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.EditAddressContract;
+
+/**
+ * 创建日期:2022/5/18 10:20
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class EditAddressPresenter extends BasePresenter<EditAddressContract.EditAddressView> implements EditAddressContract.Presenter {
+
+    public void createNewAddress(String jsonStr) {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).createNewAddress(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().createNewAddressSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+
+    public void updateAddress(int id,String jsonStr) {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).updateAddress(id,RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().createNewAddressSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+
+}

+ 40 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/ModifyNickNamePresenter.java

@@ -0,0 +1,40 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.ModifyNickNameContract;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+/**
+ * 创建日期:2022/5/16 17:49
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ModifyNickNamePresenter extends BasePresenter<ModifyNickNameContract.ModifyNickNameView> implements ModifyNickNameContract.Presenter {
+
+    public void submitSetDetail(String jsonStr){
+        getView().showLoading();
+        addSubscribe(create(APIService.class).submitSetDetail(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().submitSetDetailSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+}

+ 73 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPasswordPresenter.java

@@ -0,0 +1,73 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.ErrorParse;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.ModifyPasswordContract;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+/**
+ * 创建日期:2022/5/17 13:36
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ModifyPasswordPresenter extends BasePresenter<ModifyPasswordContract.ModifyPasswordView> implements ModifyPasswordContract.Presenter {
+    public void updatePassword(String jsonStr) {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).updatePassword(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().updatePasswordSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+
+    }
+    public void sendSmsCode(String jsonStr){
+        getView().showLoading();
+        addSubscribe(create(APIService.class).sendSmsCode(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().sendSmsCodeSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+}

+ 44 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPhoneNumPresenter.java

@@ -0,0 +1,44 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.ErrorParse;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.ModifyPhoneNumContract;
+
+/**
+ * 创建日期:2022/5/17 10:56
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ModifyPhoneNumPresenter extends BasePresenter<ModifyPhoneNumContract.ModifyPhoneNumView> implements ModifyPhoneNumContract.Presenter {
+    public void updatePhone(String authCode,String newPhone, String oldPhone) {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).updatePhone(authCode, newPhone,oldPhone), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().updatePhoneSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+}

+ 40 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/PayTestPresenter.java

@@ -0,0 +1,40 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.PayTestBean;
+import com.cooleshow.student.contract.PayTestContract;
+
+/**
+ * 创建日期:2022/5/25 13:47
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PayTestPresenter extends BasePresenter<PayTestContract.PayTestView> implements PayTestContract.Presenter {
+    public void orderPay(String jsonStr) {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).orderPay(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<PayTestBean>(getView()) {
+            @Override
+            protected void onSuccess(PayTestBean data) {
+                if (null!=getView()){
+                    getView().orderPaySuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+}

+ 47 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/PersonalCertificationPresenter.java

@@ -0,0 +1,47 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.ErrorParse;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.PersonalCertificationContract;
+
+/**
+ * 创建日期:2022/5/17 14:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PersonalCertificationPresenter extends BasePresenter<PersonalCertificationContract.PersonalCertificationView> implements PersonalCertificationContract.Presenter {
+    public void realNameAuth(String jsonStr){
+        getView().showLoading();
+        addSubscribe(create(APIService.class).realNameAuth(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().realNameAuthSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (e instanceof ApiException) {
+                    ErrorParse.getInstance().parseError(e);
+                    ApiException apiException = (ApiException) e;
+                    ToastUtils.showShort(apiException.getErrmsg());
+                }
+            }
+        });
+    }
+
+}

+ 84 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/PersonalSettingPresenter.java

@@ -0,0 +1,84 @@
+package com.cooleshow.student.presenter.mine;
+
+import android.app.Activity;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.base.utils.helper.upload.UploadHelper;
+
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.contract.PersonalSettingContract;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+import java.io.File;
+
+/**
+ * 创建日期:2022/5/16 16:10
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PersonalSettingPresenter extends BasePresenter<PersonalSettingContract.PersonalSettingView> implements PersonalSettingContract.Presenter {
+
+    @Override
+    public void getSetDetail() {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).getSetDetail(), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().getSetDetailSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+        });
+    }
+    public void submitSetDetail(String jsonStr){
+        getView().showLoading();
+        addSubscribe(create(APIService.class).submitSetDetail(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().submitSetDetailSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+
+    public void upLoadImage(Activity activity, String filePath) {
+        UploadHelper uploadHelper = new UploadHelper(activity);
+        uploadHelper.uploadFile(new File(filePath));
+        uploadHelper.setUpLoadCallBack(new UploadHelper.UpLoadCallBack() {
+            @Override
+            public void onSuccess(String url) {
+                if (getView() != null) {
+                    getView().upLoadImageSuccess(url);
+                }
+            }
+
+            @Override
+            public void onFailure() {
+                if (getView() != null) {
+                    getView().upLoadImageFailure();
+                }
+            }
+        });
+    }
+}

+ 14 - 0
student/src/main/java/com/cooleshow/student/presenter/mine/SettingPresenter.java

@@ -0,0 +1,14 @@
+package com.cooleshow.student.presenter.mine;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.student.contract.SettingContract;
+
+/**
+ * 创建日期:2022/5/16 16:58
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class SettingPresenter extends BasePresenter<SettingContract.SettingView> implements SettingContract.Presenter {
+
+}

+ 71 - 0
student/src/main/java/com/cooleshow/student/ui/main/HomeFragment.java

@@ -2,10 +2,23 @@ package com.cooleshow.student.ui.main;
 
 import android.view.View;
 
+import androidx.fragment.app.Fragment;
+
+import com.bumptech.glide.Glide;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.student.adapter.HomeMenuPagerAdapter;
+import com.cooleshow.student.bean.AppHomeBean;
 import com.cooleshow.student.contract.HomeContract;
 import com.cooleshow.student.databinding.FragmentHomeLayoutBinding;
 import com.cooleshow.student.presenter.main.HomePresenter;
+import com.youth.banner.Banner;
+import com.youth.banner.adapter.BannerImageAdapter;
+import com.youth.banner.holder.BannerImageHolder;
+import com.youth.banner.indicator.CircleIndicator;
+import com.youth.banner.listener.OnBannerListener;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 创建日期:2022/5/26 10:03
@@ -29,13 +42,71 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
         return new HomePresenter();
     }
 
+    private Banner banner;
+
     @Override
     protected void initView(View rootView) {
+        banner = mViewBinding.banner;
+
+    }
+
+    private void initBanner(List<AppHomeBean.ItemBean> bannerList) {
+        //banner自带图片轮播的适配器
+        banner.setAdapter(new BannerImageAdapter<AppHomeBean.ItemBean>(bannerList) {
+
+                    @Override
+                    public void onBindView(BannerImageHolder holder, AppHomeBean.ItemBean data, int position, int size) {
+                        Glide.with(holder.imageView)
+                                .load(data.coverImage)
+//                                .thumbnail(Glide.with(holder.itemView).load(R.drawable.loading))//加载成功前显示一个loading的加载
+                                //.apply(RequestOptions.bitmapTransform(new RoundedCorners(30)))  //设置图片圆角
+                                .into(holder.imageView);
+                        //关于glide的引用添加:
+                        //implementation 'com.github.bumptech.glide:glide:4.11.0'
+                        //annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
 
+                    }
+                }).addBannerLifecycleObserver(this)//添加生命周期观察者
+                .setIntercept(false) //是否要拦截事件
+                .setBannerRound(10f) //圆角
+                .isAutoLoop(true)
+                .removeIndicator()
+//                .setIndicator(new CircleIndicator(getContext())) //圆形指示器 还支持条形指示器等
+                .setOnBannerListener(new OnBannerListener() {
+                    @Override
+                    public void OnBannerClick(Object data, int position) {
+                    }
+                });
     }
 
+
     @Override
     protected void initData() {
+        presenter.appHome();
+
+    }
+
+    @Override
+    public void appHomeSuccess(AppHomeBean appHomeBean) {
+        initBanner(appHomeBean.banner);
+        initMenu(appHomeBean.appMenu);
+    }
+
+    private void initMenu(List<AppHomeBean.ItemBean> menuList) {
+        List<Fragment> fragments = new ArrayList<>();
+        int count = menuList.size() / 4;
+        if (menuList.size() % 4 > 0) {
+            count++;
+        }
 
+//        menuList.
+        for (int i = 0; i < count; i++) {
+            List<AppHomeBean.ItemBean> dataList=new ArrayList<>();
+            for (int j = i * 4; j < menuList.size() && j < (i + 1) * 4; j++) {
+                dataList.add(menuList.get(j));
+            }
+            fragments.add(HomeMenuFragment.newInstance(dataList));
+        }
+        mViewBinding.viewpagerMenu.setAdapter(new HomeMenuPagerAdapter(getParentFragmentManager(), fragments));
     }
 }

+ 68 - 0
student/src/main/java/com/cooleshow/student/ui/main/HomeMenuFragment.java

@@ -0,0 +1,68 @@
+package com.cooleshow.student.ui.main;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.HomeMenuItemAdapter;
+import com.cooleshow.student.bean.AppHomeBean;
+import com.cooleshow.student.databinding.FragmentHomeMenuBinding;
+import com.cooleshow.student.presenter.main.HomeMenuPresenter;
+import com.daya.live_teaching.ui.adapter.AddPhotoListAdapter;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/26 17:33
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeMenuFragment extends BaseMVPFragment<FragmentHomeMenuBinding, HomeMenuPresenter> implements View.OnClickListener {
+    @Override
+    public void onClick(View view) {
+
+    }
+
+    public static HomeMenuFragment newInstance(List<AppHomeBean.ItemBean> itemBeanList) {
+        Bundle args = new Bundle();
+        HomeMenuFragment fragment = new HomeMenuFragment();
+        args.putSerializable("itemBeanList", (Serializable) itemBeanList);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    protected FragmentHomeMenuBinding getLayoutView() {
+        return FragmentHomeMenuBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected HomeMenuPresenter createPresenter() {
+        return new HomeMenuPresenter();
+    }
+
+    private List<AppHomeBean.ItemBean> itemBeanList = new ArrayList<>();
+
+    @Override
+    protected void initView(View rootView) {
+        itemBeanList = (List<AppHomeBean.ItemBean>) getArguments().getSerializable("itemBeanList");
+        RecyclerView rvMenu = mViewBinding.rvMenu;
+        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 4);
+        rvMenu.setLayoutManager(gridLayoutManager);
+        HomeMenuItemAdapter addPhotoListAdapter = new HomeMenuItemAdapter(itemBeanList);
+        rvMenu.setAdapter(addPhotoListAdapter);
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+}

+ 1 - 1
student/src/main/java/com/cooleshow/student/ui/main/MainActivity.java

@@ -79,7 +79,7 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
         if (currentItem == 3) {
             //商城
             if (null!=shopMallFragment){
-//                shopMallFragment.clickBack();
+                shopMallFragment.clickBack();
             }
         } else {
             super.onBackPressed();

+ 146 - 1
student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java

@@ -1,12 +1,26 @@
 package com.cooleshow.student.ui.main;
 
+import android.text.TextUtils;
 import android.view.View;
 
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.ItemMarkAdapter;
+import com.cooleshow.student.bean.StudentUserInfo;
 import com.cooleshow.student.contract.MineContract;
 import com.cooleshow.student.databinding.FragmentMineLayoutBinding;
 import com.cooleshow.student.presenter.main.MinePresenter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 创建日期:2022/5/26 10:03
  *
@@ -16,7 +30,80 @@ import com.cooleshow.student.presenter.main.MinePresenter;
 public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, MinePresenter> implements MineContract.MineView, View.OnClickListener {
     @Override
     public void onClick(View view) {
-
+        switch (view.getId()) {
+            case R.id.iv_avatar:
+                //个人中心
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_PERSONAL_SETTING)
+                        .navigation();
+                break;
+            case R.id.iv_setting:
+                //设置
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_SETTING)
+                        .navigation();
+                break;
+            case R.id.im_vip:
+                //会员中心
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.STUDENT_MEMBER_CENTER)
+                        .navigation();
+                break;
+            case R.id.ll_mine_course:
+                //我的课程
+                break;
+            case R.id.ll_mine_homework:
+                //我的作业
+                break;
+            case R.id.ll_mine_score:
+                //我的乐谱
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.STUDENT_MUSIC_PERSONAL)
+                        .navigation();
+                break;
+            case R.id.ll_meter_records:
+                //评测记录
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.STUDENT_MEMBER_RECORD)
+                        .navigation();
+                break;
+            case R.id.ll_goods_order:
+                //商品订单
+                break;
+            case R.id.tv_transaction_record:
+                //交易记录
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.STUDENT_TRAD_RECORD)
+                        .navigation();
+                break;
+            case R.id.tv_network_detection:
+                //网络检测
+                break;
+            case R.id.tv_device_detection:
+                //设备检测
+                //支付测试
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_PAY_TEST)
+                        .navigation();
+                break;
+            case R.id.tv_help:
+                //帮助中心
+                break;
+            case R.id.ll_follow_teacher:
+                //关注老师
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.STUDENT_TEACHER_FOLLOW)
+                        .navigation();
+                break;
+            case R.id.ll_finished_class:
+                //已完成课时
+                break;
+            case R.id.ll_residue_class:
+                //剩余课时
+                break;
+        }
     }
 
     @Override
@@ -29,8 +116,26 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
         return new MinePresenter();
     }
 
+    private RecyclerView rv_mark;
+
     @Override
     protected void initView(View rootView) {
+        mViewBinding.imVip.setOnClickListener(this);
+        rv_mark = mViewBinding.rvMark;
+        mViewBinding.ivAvatar.setOnClickListener(this);
+        mViewBinding.ivSetting.setOnClickListener(this);
+        mViewBinding.llMineCourse.setOnClickListener(this);
+        mViewBinding.llMineHomework.setOnClickListener(this);
+        mViewBinding.llMineCourse.setOnClickListener(this);
+        mViewBinding.llMeterRecords.setOnClickListener(this);
+        mViewBinding.llGoodsOrder.setOnClickListener(this);
+        mViewBinding.tvTransactionRecord.setOnClickListener(this);
+        mViewBinding.tvNetworkDetection.setOnClickListener(this);
+        mViewBinding.tvDeviceDetection.setOnClickListener(this);
+        mViewBinding.tvHelp.setOnClickListener(this);
+        mViewBinding.llFollowTeacher.setOnClickListener(this);
+        mViewBinding.llFinishedClass.setOnClickListener(this);
+        mViewBinding.llResidueClass.setOnClickListener(this);
 
     }
 
@@ -38,4 +143,44 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
     protected void initData() {
 
     }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        presenter.queryUserInfo();
+    }
+
+    @Override
+    public void queryUserInfoSuccess(StudentUserInfo data) {
+        if (null == data) {
+            return;
+        }
+        GlideUtils.INSTANCE.loadImage(getContext(), data.heardUrl, mViewBinding.ivAvatar,R.drawable.icon_student_default_head);
+        mViewBinding.tvNickname.setText(data.username);
+        mViewBinding.tvCardId.setText("学好;" + data.idCardNo);
+        mViewBinding.tvValidity.setText(data.membershipDays + "");
+        mViewBinding.tvFinishedClass.setText(data.finshClassHours + "");
+        mViewBinding.tvResidueClass.setText(data.unfinshClassHours + "");
+        mViewBinding.tvFocusTeacher.setText(data.starTeacherNum + "");
+        if (!TextUtils.isEmpty(data.subjectName)) {
+            rv_mark.setVisibility(View.VISIBLE);
+            List<String> markList = new ArrayList<>();
+            if (data.subjectName.contains(",")) {
+                String[] split = data.subjectName.split(",");
+                for (String s : split) {
+                    markList.add(s);
+                }
+            } else {
+                markList.add(data.subjectName);
+            }
+            LinearLayoutManager manager = new LinearLayoutManager(getContext());
+            manager.setOrientation(LinearLayoutManager.HORIZONTAL);
+            rv_mark.setLayoutManager(manager);
+            ItemMarkAdapter itemMarkAdapter = new ItemMarkAdapter(markList);
+            rv_mark.setAdapter(itemMarkAdapter);
+        } else {
+            rv_mark.setVisibility(View.GONE);
+        }
+
+    }
 }

+ 138 - 5
student/src/main/java/com/cooleshow/student/ui/main/ShopMallFragment.java

@@ -1,11 +1,23 @@
 package com.cooleshow.student.ui.main;
 
+import android.os.Build;
 import android.view.View;
+import android.webkit.GeolocationPermissions;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.FrameLayout;
 
+import com.cooleshow.base.BuildConfig;
+import com.cooleshow.base.common.WebConstants;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.widgets.LollipopFixedWebView;
+import com.cooleshow.base.widgets.WebClient;
 import com.cooleshow.student.contract.ShopMallContract;
 import com.cooleshow.student.databinding.FragmentShopmalBinding;
 import com.cooleshow.student.presenter.main.ShopMallPresenter;
+import com.cooleshow.usercenter.helper.UserHelper;
 
 /**
  * 创建日期:2022/5/26 10:10
@@ -13,11 +25,10 @@ import com.cooleshow.student.presenter.main.ShopMallPresenter;
  * @author Ryan
  * 类说明:
  */
-public class ShopMallFragment extends BaseMVPFragment<FragmentShopmalBinding, ShopMallPresenter> implements ShopMallContract.ShopMallView, View.OnClickListener {
-    @Override
-    public void onClick(View view) {
-
-    }
+public class ShopMallFragment extends BaseMVPFragment<FragmentShopmalBinding, ShopMallPresenter> implements ShopMallContract.ShopMallView {
+    private WebView webView;
+    private String url;
+    private WebClient mWebClient;
 
     @Override
     protected FragmentShopmalBinding getLayoutView() {
@@ -29,8 +40,122 @@ public class ShopMallFragment extends BaseMVPFragment<FragmentShopmalBinding, Sh
         return new ShopMallPresenter();
     }
 
+    private View view_status_bar;
+
     @Override
     protected void initView(View rootView) {
+        view_status_bar = mViewBinding.viewStatusBar;
+        try {
+            if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) {
+                webView = new LollipopFixedWebView(getContext());
+            } else {
+                webView = new WebView(getContext());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (null == webView) {
+
+            return;
+        }
+        url = WebConstants.TEACHER_SHOPMALL;
+
+        mViewBinding.viewParent.addView(webView, new FrameLayout.LayoutParams(
+                FrameLayout.LayoutParams.MATCH_PARENT,
+                FrameLayout.LayoutParams.MATCH_PARENT));
+        initWebView();
+        mWebClient = new WebClient();
+        webView.setWebViewClient(mWebClient);
+        webView.setWebChromeClient(new MyWebChromeClient());
+        loadUrl();
+    }
+
+    private void loadUrl() {
+        String userToken = UserHelper.getUserToken();
+        mWebClient.setAuthorization(userToken);
+        boolean status = url.contains("?");
+        if (status) {
+            url = (url + "&Authorization=" + userToken);
+        } else {
+            url = (url + "?Authorization=" + userToken);
+        }
+        webView.loadUrl(url);
+    }
+
+    private void initWebView() {
+        //声明WebSettings子类
+        WebSettings webSettings = webView.getSettings();
+        webSettings.setUserAgentString(webSettings.getUserAgentString() + WebConstants.WEB_UA_PARAMS);
+        webSettings.setGeolocationDatabasePath(getActivity().getApplicationContext().getFilesDir().getPath());
+        webSettings.setGeolocationEnabled(true);
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setMediaPlaybackRequiresUserGesture(false);//false允许自动播放音视频
+        //是否启用缓存
+        webSettings.setAppCacheEnabled(true);
+
+        // 开启DOM缓存,默认状态下是不支持LocalStorage的
+        webSettings.setDomStorageEnabled(true);
+        // 开启数据库缓存
+        webSettings.setDatabaseEnabled(true);
+        // 地址跨域导致视频预览图片加载不出来 无法播放:
+        webSettings.setAllowUniversalAccessFromFileURLs(false);
+        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+
+        //设置自适应屏幕,两者合用
+        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+        //缩放操作
+        webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。
+        // 设置允许JS弹窗
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        //其他细节操作
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
+        webSettings.setAllowFileAccess(true); //设置可以访问文件
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
+        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
+        webSettings.setDefaultTextEncodingName("UTF-8");//设置编码格式
+
+        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);  //富文本适配
+        webSettings.setAppCacheMaxSize(Long.MAX_VALUE);
+        webSettings.setAppCachePath(getContext().getDir("appcache", 0).getPath());
+        webSettings.setDatabasePath(getContext().getDir("databases", 0).getPath());
+        webSettings.setGeolocationDatabasePath(getContext().getDir("geolocation", 0)
+                .getPath());
+        webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
+        if (BuildConfig.DEBUG) {
+            webView.setWebContentsDebuggingEnabled(true);
+        }
+        webSettings.setTextZoom(100);//设置字体默认的缩放比例,以避免手机系统的字体修改对页面字体及布局造成影响。
+        webView.setHorizontalScrollBarEnabled(false);
+        webView.setVerticalScrollBarEnabled(false);
+    }
+
+
+    private class MyWebChromeClient extends WebChromeClient {
+        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
+            callback.invoke(origin, true, false);
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            LogUtils.e(newProgress + "");
+            if (newProgress == 100 && null != mViewBinding.progressBar) {
+                mViewBinding.progressBar.setVisibility(View.GONE);//加载完网页进度条消失
+            } else {
+                if (null != mViewBinding.progressBar) {
+                    mViewBinding.progressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
+                    mViewBinding.progressBar.setProgress(newProgress);//设置进度值
+                }
+
+            }
+        }
+
+        @Override
+        public void onReceivedTitle(WebView view, String title) {
+            super.onReceivedTitle(view, title);
+        }
 
     }
 
@@ -38,4 +163,12 @@ public class ShopMallFragment extends BaseMVPFragment<FragmentShopmalBinding, Sh
     protected void initData() {
 
     }
+
+    public void clickBack() {
+        if (webView.canGoBack()) {
+            webView.goBack();
+        } else {
+            ((MainActivity) getActivity()).clickBackPressed();
+        }
+    }
 }

+ 43 - 0
student/src/main/java/com/cooleshow/student/ui/mine/AboutActivity.java

@@ -0,0 +1,43 @@
+package com.cooleshow.student.ui.mine;
+
+import android.view.View;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.AppUtils;
+import com.cooleshow.student.contract.AboutContract;
+import com.cooleshow.student.databinding.ActivityAboutBinding;
+import com.cooleshow.student.presenter.mine.AboutPresenter;
+
+/**
+ * 创建日期:2022/5/18 14:08
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_ABOUT)
+public class AboutActivity extends BaseMVPActivity<ActivityAboutBinding, AboutPresenter> implements AboutContract.AboutView, View.OnClickListener {
+
+    @Override
+    public void onClick(View view) {
+
+    }
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "关于我们");
+        viewBinding.tvVersion.setText("版本号:"+ AppUtils.getAppVersionName());
+    }
+
+    @Override
+    protected ActivityAboutBinding getLayoutView() {
+        return ActivityAboutBinding.inflate(getLayoutInflater());
+
+    }
+
+    @Override
+    protected AboutPresenter createPresenter() {
+        return new AboutPresenter();
+    }
+}

+ 88 - 0
student/src/main/java/com/cooleshow/student/ui/mine/AddressListActivity.java

@@ -0,0 +1,88 @@
+package com.cooleshow.student.ui.mine;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.AddressListAdapter;
+import com.cooleshow.student.bean.AddressBean;
+import com.cooleshow.student.contract.AddressListContract;
+import com.cooleshow.student.databinding.ActivityAddressListBinding;
+import com.cooleshow.student.presenter.mine.AddressListPresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/17 15:16
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_ADDRESS_LIST)
+public class AddressListActivity extends BaseMVPActivity<ActivityAddressListBinding, AddressListPresenter> implements AddressListContract.AddressListView, View.OnClickListener {
+
+    private AddressListAdapter addressListAdapter;
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.tv_add:
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_EDIT_ADDRESS)
+                        .withBoolean("isAdd",true)
+                        .navigation();
+                break;
+        }
+    }
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+    private List<AddressBean> dataList = new ArrayList<>();
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "地址列表");
+        viewBinding.tvAdd.setOnClickListener(this);
+        RecyclerView rvAddress = viewBinding.rvAddress;
+        LinearLayoutManager manager = new LinearLayoutManager(this);
+        rvAddress.setLayoutManager(manager);
+        addressListAdapter = new AddressListAdapter(dataList);
+        rvAddress.setAdapter(addressListAdapter);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        presenter.companyAddressList();
+    }
+
+    @Override
+    protected ActivityAddressListBinding getLayoutView() {
+        return ActivityAddressListBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected AddressListPresenter createPresenter() {
+        return new AddressListPresenter();
+    }
+
+    @Override
+    public void companyAddressListSuccess(List<AddressBean> data) {
+        dataList.clear();
+        dataList.addAll(data);
+        addressListAdapter.notifyDataSetChanged();
+    }
+}

+ 89 - 0
student/src/main/java/com/cooleshow/student/ui/mine/CheckModifyPhoneNumActivity.java

@@ -0,0 +1,89 @@
+package com.cooleshow.student.ui.mine;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.CheckModifyPhoneNumContract;
+import com.cooleshow.student.databinding.ActivityCheckModifyPhonenumBinding;
+import com.cooleshow.student.presenter.mine.CheckModifyPhoneNumPresenter;
+
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/17 10:02
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_CHECK_MODIFY_PHONENUM)
+public class CheckModifyPhoneNumActivity extends BaseMVPActivity<ActivityCheckModifyPhonenumBinding, CheckModifyPhoneNumPresenter> implements CheckModifyPhoneNumContract.CheckModifyPhoneNumView, View.OnClickListener {
+    private final int MODIFY_PHONE = 1011;
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.tv_confirm:
+                String phoneNum = viewBinding.etPhoneNum.getText().toString().trim();
+                if (TextUtils.isEmpty(phoneNum)) {
+                    ToastUtils.showShort("请输入手机号");
+                    break;
+                }
+                String password = viewBinding.etPassword.getText().toString().trim();
+                if (TextUtils.isEmpty(password)) {
+                    ToastUtils.showShort("请输入密码");
+                    break;
+                }
+                presenter.checkUser(phoneNum, password);
+                break;
+        }
+    }
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "修改手机号");
+        viewBinding.tvConfirm.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityCheckModifyPhonenumBinding getLayoutView() {
+        return ActivityCheckModifyPhonenumBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected CheckModifyPhoneNumPresenter createPresenter() {
+        return new CheckModifyPhoneNumPresenter();
+    }
+
+    @Override
+    public void checkUserSuccess(Object object) {
+        ARouter.getInstance().build(RouterPath.MineCenter.MINE_MODIFY_PHONENUM)
+                .withString("oldPhone",viewBinding.etPhoneNum.getText().toString().trim())
+                .navigation(this, MODIFY_PHONE);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (resultCode==RESULT_OK){
+            if (requestCode==MODIFY_PHONE){
+                setResult(RESULT_OK,data);
+                finish();
+            }
+        }
+    }
+}

+ 394 - 0
student/src/main/java/com/cooleshow/student/ui/mine/EditAddressActivity.java

@@ -0,0 +1,394 @@
+package com.cooleshow.student.ui.mine;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Autowired;
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.cooleshow.base.bean.JsonBean;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GetJsonDataUtil;
+import com.cooleshow.base.utils.ToastUtils;
+
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.AddressBean;
+import com.cooleshow.student.contract.EditAddressContract;
+import com.cooleshow.student.databinding.ActivityEditAddressBinding;
+import com.cooleshow.student.presenter.mine.EditAddressPresenter;
+import com.google.gson.Gson;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/18 9:47
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_EDIT_ADDRESS)
+public class EditAddressActivity extends BaseMVPActivity<ActivityEditAddressBinding, EditAddressPresenter> implements EditAddressContract.EditAddressView, View.OnClickListener {
+
+    private String province;//省
+    private String city;//市
+    private String region;//区
+    private boolean isDefaultAddress;
+    private int id;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.im_set_default:
+                isDefaultAddress = !isDefaultAddress;
+                if (isDefaultAddress) {
+                    viewBinding.imSetDefault.setImageResource(R.drawable.icon_switch_off);
+                } else {
+                    viewBinding.imSetDefault.setImageResource(R.drawable.icon_switch_open);
+                }
+                break;
+            case R.id.tv_district_detail:
+                if (isLoaded) {
+                    showPickerView();
+                } else {
+                    ToastUtils.showShort("数据加载中,请稍后重试!");
+                }
+                break;
+            case R.id.tv_save:
+                String name = viewBinding.etName.getText().toString().trim();
+                if (TextUtils.isEmpty(name)) {
+                    ToastUtils.showShort("请输入姓名");
+                    break;
+                }
+                String phoneNumber = viewBinding.etPhone.getText().toString().trim();
+                if (TextUtils.isEmpty(phoneNumber)) {
+                    ToastUtils.showShort("请输入收件人电话号码");
+                    break;
+                }
+                if (TextUtils.isEmpty(province)) {
+                    ToastUtils.showShort("请选择所在地区");
+                    break;
+                }
+                String detailAddress = viewBinding.etDetailAddress.getText().toString().trim();
+                if (TextUtils.isEmpty(detailAddress)) {
+                    ToastUtils.showShort("请输入详细地址");
+                    break;
+                }
+
+                /*
+                	"city": "",
+	"defaultStatus": 0,
+	"detailAddress": "",
+	"id": 0,
+	"memberId": 0,
+	"name": "",
+	"phoneNumber": "",
+	"postCode": "",
+	"province": "",
+	"region": ""
+                 */
+                JSONObject jsonObject = new JSONObject();
+                try {
+                    jsonObject.putOpt("name", name);
+                    jsonObject.putOpt("phoneNumber", phoneNumber);
+                    jsonObject.putOpt("province", province);
+                    jsonObject.putOpt("city", city);
+                    jsonObject.putOpt("region", region);
+                    if (isDefaultAddress) {
+                        jsonObject.putOpt("defaultStatus", 1);
+                    } else {
+                        jsonObject.putOpt("defaultStatus", 0);
+                    }
+                    jsonObject.putOpt("detailAddress", detailAddress);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                if (isAdd) {
+                    presenter.createNewAddress(jsonObject.toString());
+                } else {
+                    presenter.updateAddress(id,jsonObject.toString());
+                }
+
+                break;
+        }
+    }
+
+    @Autowired(name = "isAdd")
+    boolean isAdd;
+
+    @Autowired(name = "bundle")
+    Bundle myBundle;
+
+
+    @Override
+    protected void initView() {
+        ARouter.getInstance().inject(this);
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "地址列表");
+        viewBinding.tvSave.setOnClickListener(this);
+        viewBinding.imSetDefault.setOnClickListener(this);
+        viewBinding.tvDistrictDetail.setOnClickListener(this);
+        mHandler.sendEmptyMessage(MSG_LOAD_DATA);
+        if (null != myBundle) {
+            AddressBean addressBean = (AddressBean) myBundle.getSerializable("AddressBean");
+            viewBinding.etName.setText(addressBean.name);
+            viewBinding.etPhone.setText(addressBean.phoneNumber);
+            if (!TextUtils.isEmpty(addressBean.province)) {
+                viewBinding.tvDistrictDetail.setText(addressBean.province + addressBean.city + addressBean.region);
+                viewBinding.tvDistrictDetail.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a));
+            }
+            viewBinding.etDetailAddress.setText(addressBean.detailAddress);
+            id = addressBean.id;
+        }
+    }
+
+    @Override
+    protected ActivityEditAddressBinding getLayoutView() {
+        return ActivityEditAddressBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected EditAddressPresenter createPresenter() {
+        return new EditAddressPresenter();
+    }
+
+    @Override
+    public void createNewAddressSuccess(Object object) {
+        finish();
+    }
+
+
+    private List<JsonBean> options1Items = new ArrayList<>();
+    private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();
+    private ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>();
+    private Thread thread;
+    private static final int MSG_LOAD_DATA = 0x0001;
+    private static final int MSG_LOAD_SUCCESS = 0x0002;
+    private static final int MSG_LOAD_FAILED = 0x0003;
+
+    private static boolean isLoaded = false;
+    private OptionsPickerView pvOptions;
+
+    private void showPickerView() {// 弹出选择器
+
+        pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
+            @Override
+            public void onOptionsSelect(int options1, int options2, int options3, View v) {
+                //返回的分别是三个级别的选中位置
+                String opt1tx = options1Items.size() > 0 ?
+                        options1Items.get(options1).getPickerViewText() : "";
+
+                String opt2tx = options2Items.size() > 0
+                        && options2Items.get(options1).size() > 0 ?
+                        options2Items.get(options1).get(options2) : "";
+
+                String opt3tx = options2Items.size() > 0
+                        && options3Items.get(options1).size() > 0
+                        && options3Items.get(options1).get(options2).size() > 0 ?
+                        options3Items.get(options1).get(options2).get(options3) : "";
+
+                String tx = opt1tx + opt2tx + opt3tx;
+                province = opt1tx;
+                city = opt2tx;
+                region = opt3tx;
+                viewBinding.tvDistrictDetail.setText(tx);
+                viewBinding.tvDistrictDetail.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a));
+            }
+        })
+                .setLayoutRes(R.layout.pickerview_address_layout, new CustomListener() {
+                    @Override
+                    public void customLayout(View v) {
+                        //自定义布局中的控件初始化及事件处理
+                        final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
+                        TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
+                        tvSubmit.setOnClickListener(new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+                                pvOptions.returnData();
+                                pvOptions.dismiss();
+                            }
+                        });
+                        ivCancel.setOnClickListener(new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+                                pvOptions.dismiss();
+                            }
+                        });
+
+                    }
+                })
+//                .setLineSpacingMultiplier(2.5f)
+//                .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
+                .isDialog(false)//是否显示为对话框样式
+                .build();
+        pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器
+        pvOptions.show();
+
+    }
+
+    private void initJsonData() {//解析数据
+
+        /**
+         * 注意:assets 目录下的Json文件仅供参考,实际使用可自行替换文件
+         * 关键逻辑在于循环体
+         *
+         * */
+        String JsonData = new GetJsonDataUtil().getJson(this, "province.json");//获取assets目录下的json文件数据
+
+        ArrayList<JsonBean> jsonBean = parseData(JsonData);//用Gson 转成实体
+
+        /**
+         * 添加省份数据
+         *
+         * 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口,
+         * PickerView会通过getPickerViewText方法获取字符串显示出来。
+         */
+        options1Items = jsonBean;
+
+        for (int i = 0; i < jsonBean.size(); i++) {//遍历省份
+            ArrayList<String> cityList = new ArrayList<>();//该省的城市列表(第二级)
+            ArrayList<ArrayList<String>> province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极)
+
+            for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市
+                String cityName = jsonBean.get(i).getCityList().get(c).getName();
+                cityList.add(cityName);//添加城市
+                ArrayList<String> city_AreaList = new ArrayList<>();//该城市的所有地区列表
+                //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃
+                if (jsonBean.get(i).getCityList().get(c).getArea() == null
+                        || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {
+                    city_AreaList.add("");
+                } else {
+                    city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());
+                }
+                city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());
+                province_AreaList.add(city_AreaList);//添加该省所有地区数据
+            }
+
+            /**
+             * 添加城市数据
+             */
+            options2Items.add(cityList);
+
+            /**
+             * 添加地区数据
+             */
+            options3Items.add(province_AreaList);
+        }
+
+        mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS);
+
+    }
+
+
+    public ArrayList<JsonBean> parseData(String result) {//Gson 解析
+        ArrayList<JsonBean> detail = new ArrayList<>();
+        try {
+            JSONArray data = new JSONArray(result);
+            Gson gson = new Gson();
+            for (int i = 0; i < data.length(); i++) {
+                JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);
+                detail.add(entity);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            mHandler.sendEmptyMessage(MSG_LOAD_FAILED);
+        }
+        return detail;
+    }
+
+    @SuppressLint("HandlerLeak")
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_LOAD_DATA:
+                    if (thread == null) {//如果已创建就不再重新创建子线程了
+                        Log.e("asdkjhakdsfs", "Begin Parse Data");
+                        thread = new Thread(new Runnable() {
+                            @Override
+                            public void run() {
+                                // 子线程中解析省市区数据
+                                initJsonData();
+                            }
+                        });
+                        thread.start();
+                    }
+                    break;
+
+                case MSG_LOAD_SUCCESS:
+                    Log.e("asdkjhakdsfs", "Parse Succeed");
+                    isLoaded = true;
+                    break;
+
+                case MSG_LOAD_FAILED:
+                    Log.e("asdkjhakdsfs", "Parse Failed");
+                    break;
+            }
+        }
+    };
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+
+            View v = getCurrentFocus();
+            if (isShouldHideInput(v, ev)) {
+
+                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+                if (imm != null) {
+                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+                }
+            }
+            return super.dispatchTouchEvent(ev);
+        }
+        // 必不可少,否则所有的组件都不会有TouchEvent了
+        if (getWindow().superDispatchTouchEvent(ev)) {
+            return true;
+        }
+        return onTouchEvent(ev);
+    }
+
+    public boolean isShouldHideInput(View v, MotionEvent event) {
+        if (v != null && (v instanceof EditText)) {
+            int[] leftTop = {0, 0};
+            //获取输入框当前的location位置
+            v.getLocationInWindow(leftTop);
+            int left = leftTop[0];
+            int top = leftTop[1];
+            int bottom = top + v.getHeight();
+            int right = left + v.getWidth();
+            return !(event.getX() > left && event.getX() < right
+                    && event.getY() > top && event.getY() < bottom);
+        }
+        return false;
+    }
+
+}

+ 86 - 0
student/src/main/java/com/cooleshow/student/ui/mine/ModifyNickNameActivity.java

@@ -0,0 +1,86 @@
+package com.cooleshow.student.ui.mine;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Autowired;
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.ModifyNickNameContract;
+import com.cooleshow.student.databinding.ActivityModifyNicknameBinding;
+import com.cooleshow.student.presenter.mine.ModifyNickNamePresenter;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+import com.google.gson.Gson;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/16 17:22
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_MODIFY_NICKNAME)
+public class ModifyNickNameActivity extends BaseMVPActivity<ActivityModifyNicknameBinding, ModifyNickNamePresenter> implements ModifyNickNameContract.ModifyNickNameView, View.OnClickListener {
+    @Autowired(name = "bundle")
+    Bundle myBundle;
+    private SetDetailBean mySetDetailBean;
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.tv_right_text:
+                Gson gson = new Gson();
+                mySetDetailBean.username= viewBinding.etNickname.getText().toString().trim();
+                presenter.submitSetDetail(gson.toJson(mySetDetailBean));
+                break;
+            case R.id.im_close:
+                viewBinding.etNickname.setText("");
+                break;
+
+        }
+    }
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+    @Override
+    protected void initView() {
+        ARouter.getInstance().inject(this);
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "修改昵称");
+        viewBinding.toolbarInclude.tvRightText.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        viewBinding.toolbarInclude.tvRightText.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRightText.setText("保存");
+        viewBinding.toolbarInclude.tvRightText.setOnClickListener(this);
+        if (null != myBundle) {
+            mySetDetailBean = (SetDetailBean) myBundle.getSerializable("teacherInfoBean");
+            viewBinding.etNickname.setText(mySetDetailBean.username);
+        }
+        viewBinding.imClose.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityModifyNicknameBinding getLayoutView() {
+        return ActivityModifyNicknameBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ModifyNickNamePresenter createPresenter() {
+        return new ModifyNickNamePresenter();
+    }
+
+    @Override
+    public void submitSetDetailSuccess(SetDetailBean setDetailBean) {
+        Intent intent=new Intent();
+        intent.putExtra("userName",setDetailBean.username);
+        setResult(RESULT_OK,intent);
+        finish();
+    }
+}

+ 197 - 0
student/src/main/java/com/cooleshow/student/ui/mine/ModifyPasswordActivity.java

@@ -0,0 +1,197 @@
+package com.cooleshow.student.ui.mine;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Autowired;
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.ModifyPasswordContract;
+import com.cooleshow.student.databinding.ActivityModifyPasswordBinding;
+import com.cooleshow.student.presenter.mine.ModifyPasswordPresenter;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/17 13:33
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_MODIFY_PASSWORD)
+public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswordBinding, ModifyPasswordPresenter> implements ModifyPasswordContract.ModifyPasswordView, View.OnClickListener {
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()){
+            case R.id.tv_confirm:
+                String password = viewBinding.etPassword.getText().toString().trim();
+                if (TextUtils.isEmpty(password)||password.length()<6||password.length()>20){
+                    ToastUtils.showShort("请输入6-20位密码");
+                    break;
+                }
+                String authCode = viewBinding.etAuthCode.getText().toString().trim();
+                if (TextUtils.isEmpty(authCode)){
+                    ToastUtils.showShort("请输入验证码");
+                    break;
+                }
+                JSONObject jsonObjectC = new JSONObject();
+                try {
+                    jsonObjectC.putOpt("mobile", phoneNum);
+                    jsonObjectC.putOpt("authCode", authCode);
+                    jsonObjectC.putOpt("newPassword", password);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                presenter.updatePassword(jsonObjectC.toString());
+                break;
+            case R.id.tv_get_auth_code:
+                JSONObject jsonObject = new JSONObject();
+                try {
+                    jsonObject.putOpt("mobile", phoneNum);
+                    jsonObject.putOpt("type", "PASSWD");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                presenter.sendSmsCode(jsonObject.toString());
+                break;
+        }
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+    @Autowired(name = "phoneNum")
+    String phoneNum;
+
+    @Override
+    protected void initView() {
+        ARouter.getInstance().inject(this);
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "修改密码");
+        viewBinding.tvConfirm.setOnClickListener(this);
+        viewBinding.tvGetAuthCode.setOnClickListener(this);
+        String cPhone = phoneNum.substring(0, 3) + "****" + phoneNum.substring(7, phoneNum.length());
+        viewBinding.tvPhone.setText(cPhone);
+    }
+
+    @Override
+    protected ActivityModifyPasswordBinding getLayoutView() {
+        return ActivityModifyPasswordBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ModifyPasswordPresenter createPresenter() {
+        return new ModifyPasswordPresenter();
+    }
+
+    @Override
+    public void updatePasswordSuccess(Object object) {
+        finish();
+    }
+
+    @Override
+    public void sendSmsCodeSuccess(Object object) {
+        getCodeSuccess();
+    }
+
+
+    public void getCodeSuccess() {
+        ToastUtils.showShort("验证码发送成功,请注意查收!");
+        startTimer();
+    }
+
+    /**
+     * 执行完成
+     */
+    public static final int EXECUTE_FINISH = 0X11000;
+    /**
+     * 执行中
+     */
+    public static final int EXECUTE_LOADING = 0X4000;
+    private int mTimerId = 60;
+
+    private TimerTask timerTask;
+
+    private Timer timer;
+
+    /**
+     * 开始倒计时
+     */
+    private void startTimer() {
+
+        if (timerTask == null) {
+            timerTask = new TimerTask() {
+                @Override
+                public void run() {
+                    Message msg = new Message();
+                    msg.what = EXECUTE_LOADING;
+                    msg.arg1 = --mTimerId;
+                    handler.sendMessage(msg);
+                }
+            };
+            timer = new Timer();
+            timer.schedule(timerTask, 100, 1000);
+        }
+    }
+
+    /**
+     * 结束计时
+     */
+    private void closeTimer() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        if (timerTask != null) {
+            timerTask = null;
+        }
+        mTimerId = 60;
+        handler.sendEmptyMessage(EXECUTE_FINISH);
+    }
+
+    @SuppressLint("HandlerLeak")
+    private Handler handler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case EXECUTE_LOADING:
+                    viewBinding.tvGetAuthCode.setText(msg.arg1 + "s");
+                    viewBinding.tvGetAuthCode.setClickable(false);
+                    if (msg.arg1 == 0) {
+                        closeTimer();
+                        viewBinding.tvGetAuthCode.setClickable(true);
+                    }
+                    break;
+                case EXECUTE_FINISH:
+                    viewBinding.tvGetAuthCode.setClickable(true);
+                    viewBinding.tvGetAuthCode.setText("获取验证码");
+                    break;
+            }
+            super.handleMessage(msg);
+        }
+    };
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        handler.removeCallbacksAndMessages(EXECUTE_LOADING);
+    }
+}

+ 173 - 0
student/src/main/java/com/cooleshow/student/ui/mine/ModifyPhoneNumActivity.java

@@ -0,0 +1,173 @@
+package com.cooleshow.student.ui.mine;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Autowired;
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.ModifyPhoneNumContract;
+import com.cooleshow.student.databinding.ActivityModifyPhonenumBinding;
+import com.cooleshow.student.presenter.mine.ModifyPhoneNumPresenter;
+
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/17 10:49
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_MODIFY_PHONENUM)
+public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonenumBinding, ModifyPhoneNumPresenter> implements ModifyPhoneNumContract.ModifyPhoneNumView, View.OnClickListener {
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()){
+            case R.id.tv_get_auth_code:
+                getCodeSuccess();
+                break;
+            case R.id.tv_save:
+                String phoneNum = viewBinding.etPhoneNum.getText().toString().trim();
+                if (TextUtils.isEmpty(phoneNum)){
+                    ToastUtils.showShort("请输入手机号");
+                    break;
+                }
+                String authCode = viewBinding.etAuthCode.getText().toString().trim();
+                if (TextUtils.isEmpty(authCode)){
+                    ToastUtils.showShort("请输入验证码");
+                    break;
+                }
+                presenter.updatePhone(oldPhone,phoneNum,authCode);
+                break;
+        }
+    }
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+    @Autowired(name = "oldPhone")
+    String oldPhone;
+    @Override
+    protected void initView() {
+        ARouter.getInstance().inject(this);
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "新手机号绑定");
+        viewBinding.tvGetAuthCode.setOnClickListener(this);
+        viewBinding.tvSave.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityModifyPhonenumBinding getLayoutView() {
+        return ActivityModifyPhonenumBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ModifyPhoneNumPresenter createPresenter() {
+        return new ModifyPhoneNumPresenter();
+    }
+
+    @Override
+    public void updatePhoneSuccess(Object object) {
+        Intent intent=new Intent();
+        intent.putExtra("newPhoneNum",viewBinding.etPhoneNum.getText().toString().trim());
+        setResult(RESULT_OK,intent);
+        finish();
+    }
+
+    public void getCodeSuccess() {
+        ToastUtils.showShort("验证码发送成功,请注意查收!");
+        startTimer();
+    }
+
+    /**
+     * 执行完成
+     */
+    public static final int EXECUTE_FINISH = 0X11000;
+    /**
+     * 执行中
+     */
+    public static final int EXECUTE_LOADING = 0X4000;
+    private int mTimerId = 60;
+
+    private TimerTask timerTask;
+
+    private Timer timer;
+
+    /**
+     * 开始倒计时
+     */
+    private void startTimer() {
+
+        if (timerTask == null) {
+            timerTask = new TimerTask() {
+                @Override
+                public void run() {
+                    Message msg = new Message();
+                    msg.what = EXECUTE_LOADING;
+                    msg.arg1 = --mTimerId;
+                    handler.sendMessage(msg);
+                }
+            };
+            timer = new Timer();
+            timer.schedule(timerTask, 100, 1000);
+        }
+    }
+
+    /**
+     * 结束计时
+     */
+    private void closeTimer() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        if (timerTask != null) {
+            timerTask = null;
+        }
+        mTimerId = 60;
+        handler.sendEmptyMessage(EXECUTE_FINISH);
+    }
+
+    @SuppressLint("HandlerLeak")
+    private Handler handler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case EXECUTE_LOADING:
+                    viewBinding.tvGetAuthCode.setText(msg.arg1 + "s");
+                    viewBinding.tvGetAuthCode.setClickable(false);
+                    if (msg.arg1 == 0) {
+                        closeTimer();
+                        viewBinding.tvGetAuthCode.setClickable(true);
+                    }
+                    break;
+                case EXECUTE_FINISH:
+                    viewBinding.tvGetAuthCode.setClickable(true);
+                    viewBinding.tvGetAuthCode.setText("获取验证码");
+                    break;
+            }
+            super.handleMessage(msg);
+        }
+    };
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        handler.removeCallbacksAndMessages(EXECUTE_LOADING);
+    }
+}

+ 255 - 0
student/src/main/java/com/cooleshow/student/ui/mine/PayTestActivity.java

@@ -0,0 +1,255 @@
+package com.cooleshow.student.ui.mine;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alipay.sdk.app.PayTask;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.PayTestBean;
+import com.cooleshow.student.bean.alipay.AuthResult;
+import com.cooleshow.student.bean.alipay.PayResult;
+import com.cooleshow.student.bean.weixinpay.WeixinPayInfo;
+import com.cooleshow.student.contract.PayTestContract;
+import com.cooleshow.student.databinding.ActivityPayTestBinding;
+import com.cooleshow.student.presenter.mine.PayTestPresenter;
+import com.google.gson.Gson;
+import com.tencent.mm.opensdk.modelpay.PayReq;
+import com.tencent.mm.opensdk.openapi.IWXAPI;
+import com.tencent.mm.opensdk.openapi.WXAPIFactory;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Map;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/25 13:46
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_PAY_TEST)
+public class PayTestActivity extends BaseMVPActivity<ActivityPayTestBinding, PayTestPresenter> implements PayTestContract.PayTestView, View.OnClickListener {
+    private static final int SDK_PAY_FLAG = 1;
+    private static final int SDK_AUTH_FLAG = 2;
+    private IWXAPI api;
+
+    @Override
+    public void onClick(View view) {
+        String orderNo = viewBinding.etId.getText().toString().trim();
+        switch (view.getId()) {
+            case R.id.tv_weixin:
+              /*  if (TextUtils.isEmpty(orderNo)) {
+                    ToastUtils.showShort("输入订单号");
+                    break;
+                }
+                doWeixinPay(orderNo);*/
+
+
+                //微信
+                PayReq req = new PayReq();
+                /*req.appId = weixinPayInfo.getAppid();
+                req.partnerId = weixinPayInfo.getPartnerid();
+                req.prepayId = weixinPayInfo.getPrepayid();
+                req.nonceStr = weixinPayInfo.getNoncestr();
+                req.timeStamp = weixinPayInfo.getTimestamp();
+                req.packageValue = weixinPayInfo.getPackageValue();
+                req.sign = weixinPayInfo.getSign();*/
+
+             /*   req.appId="wx149a928c415c137a";
+                req.partnerId="1625930034";
+                req.prepayId="wx261155254861066e2f36eef49c8b970000";
+                req.packageValue="Sign=WXPay";
+                req.nonceStr="ZHAHmiQmqD7E4qKGqcceTHJ1j1vCtuYJ";
+                req.timeStamp="1653537327";
+                req.sign="7364A25C06D2C99774EEFA1D1625E4F4";*/
+
+                     req.appId="wx149a928c415c137a";
+                req.partnerId="1625930034";
+                req.prepayId="wx26160134460852b370615e815a964e0000";
+                req.packageValue="Sign=WXPay";
+                req.nonceStr="BghF8ntwjEWX75cLOprfQBT2aPesy9dN";
+                req.timeStamp="1653552095";
+                req.sign="JU5+1rCjvkIMrtYNsrEt9uRUu53MF51vp/izZV4yhvxIJY1no+L0WBHRTgCfeckgsdcCyn1LJTvcRSCiG4NpgcGahtsuQTMvO5fxgimJ/eSZl20jho11o9rJOcRmGKVSq/nQMUJeRMWy6FUbT857yWIzIQjQVLk0LE0yMe1SlyD0WgDr9Wt0FjaS7mplBk3d6pF2EMsWhgylXna/n5AdLLRs3ZV5x/DO7w/yemuKUgqmmRbVnt2T/ygbHl/p8O+Ggmud6ES7ZyVWH0un7lZt1B1F+g+eunOk5dxfnn/6m8YyEOXXzg+Zzyg+nRzFpT0E4BeDO4dy5wfrLNlImM4keA==";
+
+
+//                    req.extData			= "app data"; // optional
+                //正在前往微信支付
+                // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
+                api.sendReq(req);
+                break;
+            case R.id.tv_alipay:
+                if (TextUtils.isEmpty(orderNo)) {
+                    ToastUtils.showShort("输入订单号");
+                    break;
+                }
+                doAliPay(orderNo);
+                break;
+        }
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+        api = WXAPIFactory.createWXAPI(this, null);
+        api.registerApp("wx149a928c415c137a");
+    }
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "测试支付");
+        viewBinding.tvWeixin.setOnClickListener(this);
+        viewBinding.tvAlipay.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityPayTestBinding getLayoutView() {
+        return ActivityPayTestBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected PayTestPresenter createPresenter() {
+        return new PayTestPresenter();
+    }
+
+    public void doAliPay(String orderNo) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("orderNo", orderNo);
+            jsonObject.putOpt("payChannel", "ali_app");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        presenter.orderPay(jsonObject.toString());
+    }
+
+    public void doWeixinPay(String orderNo) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("orderNo", orderNo);
+            jsonObject.putOpt("payChannel", "wx_app");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        presenter.orderPay(jsonObject.toString());
+    }
+
+    @Override
+    public void orderPaySuccess(PayTestBean o) {
+        if (o != null) {
+            if (o.payChannel.equals("ali_app")) {
+                String orderInfo = o.pay_info;
+                final Runnable payRunnable = new Runnable() {
+                    @Override
+                    public void run() {
+                        PayTask alipay = new PayTask(PayTestActivity.this);
+                        Map<String, String> result = alipay.payV2(orderInfo, true);
+                        Log.i("msp", result.toString());
+
+                        Message msg = new Message();
+                        msg.what = SDK_PAY_FLAG;
+                        msg.obj = result;
+                        mHandler.sendMessage(msg);
+                    }
+                };
+
+                // 必须异步调用
+                Thread payThread = new Thread(payRunnable);
+                payThread.start();
+            }else{
+                //微信
+                Gson gson=new Gson();
+                WeixinPayInfo weixinPayInfo = gson.fromJson(o.pay_info, WeixinPayInfo.class);
+                PayReq req = new PayReq();
+                /*req.appId = weixinPayInfo.getAppid();
+                req.partnerId = weixinPayInfo.getPartnerid();
+                req.prepayId = weixinPayInfo.getPrepayid();
+                req.nonceStr = weixinPayInfo.getNoncestr();
+                req.timeStamp = weixinPayInfo.getTimestamp();
+                req.packageValue = weixinPayInfo.getPackageValue();
+                req.sign = weixinPayInfo.getSign();*/
+
+                req.appId="wx149a928c415c137a";
+                req.partnerId="1625930034";
+                req.prepayId="wx261155254861066e2f36eef49c8b970000";
+                req.packageValue="Sign=WXPay";
+                req.nonceStr="ZHAHmiQmqD7E4qKGqcceTHJ1j1vCtuYJ";
+                req.timeStamp="1653537327";
+                req.sign="7364A25C06D2C99774EEFA1D1625E4F4";
+
+
+//                    req.extData			= "app data"; // optional
+                //正在前往微信支付
+                // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
+                api.sendReq(req);
+            }
+        }
+    }
+
+
+    @SuppressLint("HandlerLeak")
+    private Handler mHandler = new Handler() {
+        @SuppressWarnings("unused")
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case SDK_PAY_FLAG: {
+                    @SuppressWarnings("unchecked")
+                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
+                    /**
+                     * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
+                     */
+                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
+                    String resultStatus = payResult.getResultStatus();
+                    // 判断resultStatus 为9000则代表支付成功
+                    if (TextUtils.equals(resultStatus, "9000")) {
+                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
+//                        isAlipayOk = true;
+                        ToastUtils.showShort("支付成功");
+                    } else {
+//                        isAlipayOk = false;
+                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
+//                        showAlert(VipInfoActivity.this, getString(R.string.pay_failed) + payResult.getMemo());
+                        ToastUtils.showShort("支付失败"+resultStatus);
+                    }
+                    break;
+                }
+                case SDK_AUTH_FLAG: {
+                    @SuppressWarnings("unchecked")
+                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
+                    String resultStatus = authResult.getResultStatus();
+
+                    // 判断resultStatus 为“9000”且result_code
+                    // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
+                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
+                        // 获取alipay_open_id,调支付时作为参数extern_token 的value
+                        // 传入,则支付账户为该授权账户
+//                        showAlert(MainActivity.this, getString(R.string.auth_success) + authResult);
+                    } else {
+                        // 其他状态值则为授权失败
+//                        showAlert(MainActivity.this, getString(R.string.auth_failed) + authResult);
+                    }
+                    break;
+                }
+                default:
+                    break;
+            }
+        }
+
+    };
+
+
+}

+ 84 - 0
student/src/main/java/com/cooleshow/student/ui/mine/PersonalCertificationActivity.java

@@ -0,0 +1,84 @@
+package com.cooleshow.student.ui.mine;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.PersonalCertificationContract;
+import com.cooleshow.student.databinding.ActivityPersonalCertificationBinding;
+import com.cooleshow.student.presenter.mine.PersonalCertificationPresenter;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/17 14:17
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_PERSONAL_CERTIFICATION)
+public class PersonalCertificationActivity extends BaseMVPActivity<ActivityPersonalCertificationBinding, PersonalCertificationPresenter> implements PersonalCertificationContract.PersonalCertificationView, View.OnClickListener {
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()){
+            case R.id.tv_confirm:
+                String name = viewBinding.etName.getText().toString().trim();
+                if (TextUtils.isEmpty(name)){
+                    ToastUtils.showShort("请输入真实姓名");
+                    break;
+                }
+                String certificateNum = viewBinding.etCertificateNum.getText().toString().trim();
+                if (TextUtils.isEmpty(certificateNum)){
+                    ToastUtils.showShort("请输入身份证号");
+                    break;
+                }
+                JSONObject jsonObjectC = new JSONObject();
+                try {
+                    jsonObjectC.putOpt("realName", name);
+                    jsonObjectC.putOpt("idCardNo", certificateNum);
+                    jsonObjectC.putOpt("save", false);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                presenter.realNameAuth(jsonObjectC.toString());
+                break;
+        }
+    }
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "实名认证");
+        viewBinding.tvConfirm.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityPersonalCertificationBinding getLayoutView() {
+        return ActivityPersonalCertificationBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected PersonalCertificationPresenter createPresenter() {
+        return new PersonalCertificationPresenter();
+    }
+
+    @Override
+    public void realNameAuthSuccess(Object object) {
+        finish();
+    }
+}

+ 361 - 0
student/src/main/java/com/cooleshow/student/ui/mine/PersonalSettingActivity.java

@@ -0,0 +1,361 @@
+package com.cooleshow.student.ui.mine;
+
+import android.Manifest;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.core.content.FileProvider;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ActivityUtils;
+import com.cooleshow.base.utils.FileUtils;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.PopupUtil;
+import com.cooleshow.base.utils.ToastUtil;
+
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.PersonalSettingContract;
+import com.cooleshow.student.databinding.ActivityPersonalSettingBinding;
+import com.cooleshow.student.presenter.mine.PersonalSettingPresenter;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.google.gson.Gson;
+import com.tbruyelle.rxpermissions3.RxPermissions;
+
+import java.io.File;
+import java.io.IOException;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/16 16:07
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_PERSONAL_SETTING)
+public class PersonalSettingActivity extends BaseMVPActivity<ActivityPersonalSettingBinding, PersonalSettingPresenter> implements PersonalSettingContract.PersonalSettingView, View.OnClickListener {
+    private SetDetailBean mySetDetailBean;
+    private final int MODIFY_NICKNAME = 1001;
+    private final int MODIFY_PHONE = 1002;
+    private final int PERSONAL_CERTIFICATION = 1003;
+    private final int REQUEST_CODE_CAMERA = 0x44;
+    public final int REQUEST_CODE_LOCAL = 0x19;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+
+    }
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.cl_header:
+                selectHeader();
+                break;
+            case R.id.cl_name:
+                if (null != mySetDetailBean) {
+                    Bundle bundle = new Bundle();
+                    bundle.putSerializable("teacherInfoBean", mySetDetailBean);
+                    ARouter.getInstance().build(RouterPath.MineCenter.MINE_MODIFY_NICKNAME)
+                            .withBundle("bundle", bundle)
+                            .navigation(this, MODIFY_NICKNAME);
+                }
+
+                break;
+            case R.id.cl_sex:
+                modifySex();
+                break;
+            case R.id.cl_phone:
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_CHECK_MODIFY_PHONENUM)
+                        .navigation(this, MODIFY_PHONE);
+                break;
+            case R.id.cl_modify_psd:
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_MODIFY_PASSWORD)
+                        .withString("phoneNum", mySetDetailBean.phone)
+                        .navigation();
+                break;
+            case R.id.cl_certification:
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_PERSONAL_CERTIFICATION)
+                        .navigation(this, PERSONAL_CERTIFICATION);
+                break;
+            case R.id.tv_login_out:
+                UserHelper.saveUserToken("");
+                ARouter.getInstance().build(RouterPath.UserCenter.PATH_VERIFY_LOGIN)
+                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
+                        .navigation();
+                break;
+        }
+    }
+
+    private void modifySex() {
+        PopupUtil.showInBottom(this, R.layout.pop_modify_sex, (view, popupWindow) -> {
+            TextView tv_boy = view.findViewById(R.id.tv_boy);
+            TextView tv_girl = view.findViewById(R.id.tv_girl);
+            TextView tv_cancel = view.findViewById(R.id.tv_cancel);
+            tv_boy.setOnClickListener(view13 -> {
+                SetDetailBean requestBean = new SetDetailBean();
+                requestBean.gender = 1;
+                requestBean.real = mySetDetailBean.real;
+                requestBean.phone = mySetDetailBean.phone;
+                requestBean.birthdate = mySetDetailBean.birthdate;
+                requestBean.avatar = mySetDetailBean.avatar;
+                requestBean.username = mySetDetailBean.username;
+                Gson gson = new Gson();
+                presenter.submitSetDetail(gson.toJson(requestBean));
+            });
+            tv_girl.setOnClickListener(view12 -> {
+                SetDetailBean requestBean = new SetDetailBean();
+                requestBean.gender = 0;
+                requestBean.real = mySetDetailBean.real;
+                requestBean.phone = mySetDetailBean.phone;
+                requestBean.birthdate = mySetDetailBean.birthdate;
+                requestBean.avatar = mySetDetailBean.avatar;
+                requestBean.username = mySetDetailBean.username;
+                Gson gson = new Gson();
+                presenter.submitSetDetail(gson.toJson(requestBean));
+            });
+            tv_cancel.setOnClickListener(view1 -> popupWindow.dismiss());
+
+        });
+
+    }
+
+    private void selectHeader() {
+        PopupUtil.showInBottom(this, R.layout.pop_modify_header, (view, popupWindow) -> {
+            TextView tv_camera = view.findViewById(R.id.tv_camera);
+            TextView tv_album = view.findViewById(R.id.tv_album);
+            TextView tv_cancel = view.findViewById(R.id.tv_cancel);
+            tv_camera.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    toCamera();
+                    popupWindow.dismiss();
+                }
+            });
+            tv_album.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    toAlbum();
+                    popupWindow.dismiss();
+                }
+            });
+            tv_cancel.setOnClickListener(view1 -> popupWindow.dismiss());
+        });
+    }
+
+    private void toCamera() {
+        new RxPermissions(this)
+                .request(Manifest.permission.CAMERA,
+                        Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
+                .subscribe(granted -> {
+                    if (granted) {
+                      /*  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+                        File file = new File(imagePath);
+                        Uri imageUri = Uri.fromFile(file);
+                        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
+                        Log.e("asdfasdfasdfadfs", "111111" );
+                        ActivityUtils.startActivityForResult(this, intent, REQUEST_CODE_CAMERA);*/
+                        imagePath = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + System.currentTimeMillis() + ".jpg";
+                        requestCamera(imagePath);
+                    } else {
+                        ToastUtil.getInstance().show(this, "请选择存储和相机权限!");
+                    }
+                });
+    }
+
+    private void requestCamera(String filePath) {
+        File outputImage = new File(filePath);
+                /*
+                创建一个File文件对象,用于存放摄像头拍下的图片,我们把这个图片命名为output_image.jpg
+                并把它存放在应用关联缓存目录下,调用getExternalCacheDir()可以得到这个目录,为什么要
+                用关联缓存目录呢?由于android6.0开始,读写sd卡列为了危险权限,使用的时候必须要有权限,
+                应用关联目录则可以跳过这一步
+                 */
+        try//判断图片是否存在,存在则删除在创建,不存在则直接创建
+        {
+            if (!outputImage.getParentFile().exists()) {
+                outputImage.getParentFile().mkdirs();
+            }
+            if (outputImage.exists()) {
+                outputImage.delete();
+            }
+
+            outputImage.createNewFile();
+            Uri imageUri;
+            if (Build.VERSION.SDK_INT >= 24) {
+                imageUri = FileProvider.getUriForFile(this,
+                        "com.cooleshow.teacher.fileprovider", outputImage);
+            } else {
+                imageUri = Uri.fromFile(outputImage);
+            }
+            //使用隐示的Intent,系统会找到与它对应的活动,即调用摄像头,并把它存储
+            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
+            ActivityUtils.startActivityForResult(this, intent, REQUEST_CODE_CAMERA);
+            //调用会返回结果的开启方式,返回成功的话,则把它显示出来
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private String imagePath = null;//当前图片的路径
+
+
+    private void toAlbum() {
+        new RxPermissions(this)
+                .request(Manifest.permission.CAMERA,
+                        Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
+                .subscribe(granted -> {
+                    if (granted) {
+                        Intent intent;
+                        if (Build.VERSION.SDK_INT < 19) {
+                            intent = new Intent(Intent.ACTION_GET_CONTENT);
+                            intent.setType("image/*");
+                        } else {
+                            intent = new Intent(Intent.ACTION_PICK,
+                                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+                        }
+                        ActivityUtils.startActivityForResult(this, intent, REQUEST_CODE_LOCAL);
+                    } else {
+                        ToastUtil.getInstance().show(this, "请选择存储和相机权限!");
+                    }
+                });
+    }
+
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "设置");
+        viewBinding.clHeader.setOnClickListener(this);
+        viewBinding.clName.setOnClickListener(this);
+        viewBinding.clSex.setOnClickListener(this);
+        viewBinding.clPhone.setOnClickListener(this);
+        viewBinding.clModifyPsd.setOnClickListener(this);
+        viewBinding.clCertification.setOnClickListener(this);
+        viewBinding.tvLoginOut.setOnClickListener(this);
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        presenter.getSetDetail();
+    }
+
+    @Override
+    protected ActivityPersonalSettingBinding getLayoutView() {
+        return ActivityPersonalSettingBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected PersonalSettingPresenter createPresenter() {
+        return new PersonalSettingPresenter();
+    }
+
+    @Override
+    public void getSetDetailSuccess(SetDetailBean setDetailBean) {
+        mySetDetailBean = setDetailBean;
+        GlideUtils.INSTANCE.loadImage(this, setDetailBean.avatar, viewBinding.imHeader, R.drawable.icon_student_default_head);
+        viewBinding.tvNickname.setText(setDetailBean.username);
+        if (setDetailBean.gender == 0) {
+            //女
+            viewBinding.tvSex.setText("女");
+        } else {
+            //男
+            viewBinding.tvSex.setText("男");
+        }
+        viewBinding.tvPhone.setText(setDetailBean.phone);
+        if (setDetailBean.real) {
+            //是
+            viewBinding.tvCertificationStatus.setText("已认证");
+        } else {
+            //否
+            viewBinding.tvCertificationStatus.setText("未认证");
+        }
+    }
+
+    @Override
+    public void submitSetDetailSuccess(SetDetailBean setDetailBean) {
+        mySetDetailBean.gender = setDetailBean.gender;
+        mySetDetailBean.avatar = setDetailBean.avatar;
+        if (setDetailBean.gender == 0) {
+            //女
+            viewBinding.tvSex.setText("女");
+        } else {
+            //男
+            viewBinding.tvSex.setText("男");
+        }
+        GlideUtils.INSTANCE.loadImage(this, setDetailBean.avatar, viewBinding.imHeader, R.drawable.icon_student_default_head);
+
+
+    }
+
+    @Override
+    public void upLoadImageSuccess(String url) {
+        hideLoading();
+        SetDetailBean requestBean = new SetDetailBean();
+        requestBean.gender = 1;
+        requestBean.real = mySetDetailBean.real;
+        requestBean.phone = mySetDetailBean.phone;
+        requestBean.birthdate = mySetDetailBean.birthdate;
+        requestBean.avatar = url;
+        requestBean.username = mySetDetailBean.username;
+        Gson gson = new Gson();
+        presenter.submitSetDetail(gson.toJson(requestBean));
+    }
+
+    @Override
+    public void upLoadImageFailure() {
+        hideLoading();
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (resultCode == RESULT_OK) {
+            if (requestCode == MODIFY_NICKNAME) {
+                String userName = data.getStringExtra("userName");
+                mySetDetailBean.username = userName;
+                viewBinding.tvNickname.setText(userName);
+            } else if (requestCode == MODIFY_PHONE) {
+                String newPhoneNum = data.getStringExtra("newPhoneNum");
+                mySetDetailBean.phone = newPhoneNum;
+                viewBinding.tvPhone.setText(newPhoneNum);
+            } else if (requestCode == PERSONAL_CERTIFICATION) {
+                viewBinding.tvCertificationStatus.setText("已认证");
+            } else if (requestCode == REQUEST_CODE_CAMERA) {
+                if (!TextUtils.isEmpty(imagePath)) {
+                    showLoading();
+                    presenter.upLoadImage(PersonalSettingActivity.this, imagePath);
+
+                }
+
+            } else if (requestCode == REQUEST_CODE_LOCAL) {
+                if (data != null) {
+                    Uri selectedImage = data.getData();
+                    if (selectedImage != null) {
+                        String v_path = FileUtils.getFilePathForN(selectedImage, PersonalSettingActivity.this);
+                        showLoading();
+                        presenter.upLoadImage(PersonalSettingActivity.this, v_path);
+                    }
+                }
+            }
+        }
+    }
+}

+ 94 - 0
student/src/main/java/com/cooleshow/student/ui/mine/SettingActivity.java

@@ -0,0 +1,94 @@
+package com.cooleshow.student.ui.mine;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.SPUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.contract.SettingContract;
+import com.cooleshow.student.databinding.ActivitySettingBinding;
+import com.cooleshow.student.presenter.mine.SettingPresenter;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/16 16:55
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MineCenter.MINE_SETTING)
+public class SettingActivity extends BaseMVPActivity<ActivitySettingBinding, SettingPresenter> implements SettingContract.SettingView, View.OnClickListener {
+
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.cl_address:
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_ADDRESS_LIST)
+                        .navigation();
+                break;
+            case R.id.im_select:
+                is_detection = !is_detection;
+                SPUtils.getInstance().put("IS_DETECTION", is_detection);
+                if (is_detection) {
+                    viewBinding.imSelect.setImageResource(R.drawable.icon_switch_off);
+                } else {
+                    viewBinding.imSelect.setImageResource(R.drawable.icon_switch_open);
+                }
+                break;
+            case R.id.cl_private:
+                //跳转隐私协议
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.PRIVACY_AGREEMENT)
+                        .navigation();
+                break;
+            case R.id.cl_about:
+                ARouter.getInstance().build(RouterPath.MineCenter.MINE_ABOUT)
+                        .navigation();
+                break;
+        }
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+    private boolean is_detection;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "设置");
+        viewBinding.clAddress.setOnClickListener(this);
+        viewBinding.imSelect.setOnClickListener(this);
+        viewBinding.clPrivate.setOnClickListener(this);
+        viewBinding.clAbout.setOnClickListener(this);
+        is_detection = SPUtils.getInstance().getBoolean("IS_DETECTION");
+        if (is_detection) {
+            viewBinding.imSelect.setImageResource(R.drawable.icon_switch_off);
+        } else {
+            viewBinding.imSelect.setImageResource(R.drawable.icon_switch_open);
+        }
+
+    }
+
+    @Override
+    protected ActivitySettingBinding getLayoutView() {
+        return ActivitySettingBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected SettingPresenter createPresenter() {
+        return new SettingPresenter();
+    }
+}

+ 456 - 0
student/src/main/java/com/cooleshow/student/ui/web/WebActivity.java

@@ -0,0 +1,456 @@
+package com.cooleshow.student.ui.web;
+
+import static com.cooleshow.base.common.WebConstants.WEB_URL;
+
+import android.Manifest;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.webkit.GeolocationPermissions;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.BuildConfig;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseActivity;
+import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.utils.PermissionUtils;
+import com.cooleshow.base.utils.UriUtils;
+import com.cooleshow.base.utils.Utils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.upload.UploadHelper;
+import com.cooleshow.base.widgets.LollipopFixedWebView;
+import com.cooleshow.base.widgets.WebClient;
+import com.cooleshow.base.widgets.dialog.CommonDialog;
+import com.cooleshow.student.R;
+import com.cooleshow.student.databinding.ActivityHtmlBinding;
+import com.cooleshow.student.widgets.helper.JsInterfaceHelper;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.daya.live_teaching.utils.GlideEngine;
+import com.luck.picture.lib.PictureSelector;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.tools.PictureFileUtils;
+import com.tbruyelle.rxpermissions3.RxPermissions;
+
+import org.json.JSONObject;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/24.
+ */
+@Route(path = RouterPath.WebCenter.ACTIVITY_HTML)
+public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements JsInterfaceHelper.OnJsMethodCallListener, View.OnClickListener {
+    private static final int REQUEST_CODE_FILE_CHOOSER = 500;
+    private WebView webView;
+    private String url;
+    private JsInterfaceHelper mInterfaceUtils;
+    private WebClient mWebClient;
+    private ValueCallback mUploadCallbackAboveL;
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+    @NonNull
+    @Override
+    protected ActivityHtmlBinding getLayoutView() {
+        return ActivityHtmlBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView() {
+        Utils.setHeadView(viewBinding.statusBarView, this, 0);
+        viewBinding.btnClose.setOnClickListener(this);
+        viewBinding.btnBack.setOnClickListener(this);
+        try {
+            if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) {
+                webView = new LollipopFixedWebView(this);
+            } else {
+                webView = new WebView(this);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (null == webView) {
+            finish();
+            return;
+        }
+        url = getIntent().getStringExtra(WEB_URL);
+        if (TextUtils.isEmpty(url)) {
+            finish();
+            return;
+        }
+        viewBinding.viewParent.addView(webView, new FrameLayout.LayoutParams(
+                FrameLayout.LayoutParams.MATCH_PARENT,
+                FrameLayout.LayoutParams.MATCH_PARENT));
+        initWebView();
+        mInterfaceUtils = new JsInterfaceHelper(WebActivity.this);
+        mInterfaceUtils.setOnJsCallListener(this);
+        webView.addJavascriptInterface(mInterfaceUtils, WebConstants.WEB_JS_INTERFACE);
+        mWebClient = new WebClient();
+        webView.setWebViewClient(mWebClient);
+        webView.setWebChromeClient(new MyWebChromeClient());
+        loadUrl();
+    }
+
+    private void loadUrl() {
+        String userToken = UserHelper.getUserToken();
+        mWebClient.setAuthorization(userToken);
+        boolean status = url.contains("?");
+        if (status) {
+            url = (url + "&Authorization=" + userToken);
+        } else {
+            url = (url + "?Authorization=" + userToken);
+        }
+        webView.loadUrl(url);
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+    }
+
+    private void initWebView() {
+        //声明WebSettings子类
+        WebSettings webSettings = webView.getSettings();
+        webSettings.setUserAgentString(webSettings.getUserAgentString() + WebConstants.WEB_UA_PARAMS);
+        webSettings.setGeolocationDatabasePath(getApplicationContext().getFilesDir().getPath());
+        webSettings.setGeolocationEnabled(true);
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setMediaPlaybackRequiresUserGesture(false);//false允许自动播放音视频
+        //是否启用缓存
+        webSettings.setAppCacheEnabled(true);
+
+        // 开启DOM缓存,默认状态下是不支持LocalStorage的
+        webSettings.setDomStorageEnabled(true);
+        // 开启数据库缓存
+        webSettings.setDatabaseEnabled(true);
+        // 地址跨域导致视频预览图片加载不出来 无法播放:
+        webSettings.setAllowUniversalAccessFromFileURLs(false);
+        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+
+        //设置自适应屏幕,两者合用
+        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+        //缩放操作
+        webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。
+        // 设置允许JS弹窗
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        //其他细节操作
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
+        webSettings.setAllowFileAccess(true); //设置可以访问文件
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
+        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
+        webSettings.setDefaultTextEncodingName("UTF-8");//设置编码格式
+
+        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);  //富文本适配
+        webSettings.setAppCacheMaxSize(Long.MAX_VALUE);
+        webSettings.setAppCachePath(this.getDir("appcache", 0).getPath());
+        webSettings.setDatabasePath(this.getDir("databases", 0).getPath());
+        webSettings.setGeolocationDatabasePath(this.getDir("geolocation", 0)
+                .getPath());
+        webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
+        if (BuildConfig.DEBUG) {
+            webView.setWebContentsDebuggingEnabled(true);
+        }
+        webSettings.setTextZoom(100);//设置字体默认的缩放比例,以避免手机系统的字体修改对页面字体及布局造成影响。
+        webView.setHorizontalScrollBarEnabled(false);
+        webView.setVerticalScrollBarEnabled(false);
+        webView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
+//            downloadFile(url);
+        });
+    }
+
+    /**
+     * 状态栏控制
+     *
+     * @param message
+     */
+    @Override
+    public void setBarStatus(JSONObject message) {
+
+    }
+
+    /**
+     * 返回按钮
+     *
+     * @param message
+     */
+    @Override
+    public void backIconChange(JSONObject message) {
+
+    }
+
+    @Override
+    public void chooseFile(JSONObject message) {
+        JSONObject content = (JSONObject) message.opt("content");
+        String type = (String) content.opt("image/*");
+        String[] types = new String[]{type};
+        showFileChooser();
+    }
+
+    /**
+     * 获取状态栏高度
+     *
+     * @param message
+     */
+    @Override
+    public void getNavHeight(JSONObject message) {
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mInterfaceUtils != null) {
+            mInterfaceUtils.release();
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.btn_back) {
+            onBackPressed();
+            return;
+        }
+        if (v.getId() == R.id.btn_close) {
+            finish();
+            return;
+        }
+    }
+
+
+    private class MyWebChromeClient extends WebChromeClient {
+        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
+            callback.invoke(origin, true, false);
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            LogUtils.e(newProgress + "");
+            if (newProgress == 100 && null != viewBinding.progressBar) {
+                viewBinding.progressBar.setVisibility(View.GONE);//加载完网页进度条消失
+            } else {
+                if (null != viewBinding.progressBar) {
+                    viewBinding.progressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
+                    viewBinding.progressBar.setProgress(newProgress);//设置进度值
+                }
+
+            }
+        }
+
+        @Override
+        public void onReceivedTitle(WebView view, String title) {
+            super.onReceivedTitle(view, title);
+            if (!TextUtils.isEmpty(title)) {
+                viewBinding.tvTitle.setText(title);
+            }
+
+        }
+
+        // Android > 5.0.1
+        @Override
+        public boolean onShowFileChooser(
+                WebView webView, ValueCallback<Uri[]> filePathCallback,
+                FileChooserParams fileChooserParams) {
+            LogUtils.i("pq", "fileChooserParams" + fileChooserParams.toString());
+            if (fileChooserParams.getAcceptTypes().length == 1 && fileChooserParams.getAcceptTypes()[0].equals("image/*")) {
+                mUploadCallbackAboveL = filePathCallback;
+                startPictureSelect();
+            } else {
+                mUploadCallbackAboveL = filePathCallback;
+                startFileSelect(fileChooserParams);
+            }
+            return true;
+        }
+
+        private CustomViewCallback mCustomViewCallback;
+        //  横屏时,显示视频的view
+        private View mCustomView;
+
+        // 点击全屏按钮时,调用的方法
+        @Override
+        public void onShowCustomView(View view, CustomViewCallback callback) {
+            super.onShowCustomView(view, callback);
+
+            //如果view 已经存在,则隐藏
+            if (mCustomView != null) {
+                callback.onCustomViewHidden();
+                return;
+            }
+
+            mCustomView = view;
+            mCustomView.setVisibility(View.VISIBLE);
+            mCustomViewCallback = callback;
+            viewBinding.flVideo.addView(mCustomView);
+            viewBinding.flVideo.setVisibility(View.VISIBLE);
+//            mLayout.bringToFront();
+            viewBinding.headerBarView.setVisibility(View.GONE);
+            //设置横屏
+            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+        }
+
+        // 取消全屏调用的方法
+        @Override
+        public void onHideCustomView() {
+            super.onHideCustomView();
+            if (mCustomView == null) {
+                return;
+            }
+            mCustomView.setVisibility(View.GONE);
+            viewBinding.flVideo.removeView(mCustomView);
+            mCustomView = null;
+            viewBinding.flVideo.setVisibility(View.GONE);
+            try {
+                mCustomViewCallback.onCustomViewHidden();
+            } catch (Exception e) {
+
+            }
+            viewBinding.headerBarView.setVisibility(View.VISIBLE);
+            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
+        }
+    }
+
+    @Override
+    public void onConfigurationChanged(@NonNull Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+    }
+
+    private void showFileChooser() {
+        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.setType("*/*");
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.putExtra(Intent.EXTRA_TITLE, "File Chooser");
+        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+        startActivityForResult(intent, REQUEST_CODE_FILE_CHOOSER);
+    }
+
+    private void startFileSelect(WebChromeClient.FileChooserParams fileChooserParams) {
+        new RxPermissions(this)
+                .request(Manifest.permission.READ_EXTERNAL_STORAGE)
+                .subscribe(permission -> {
+                    if (permission) {
+                        showFileChooser();
+                    } else {
+                        String tip = "上传文件需要储存卡读取权限,是否去设置?";
+                        showCommonTipDialog(tip);
+                    }
+                });
+    }
+
+    private void startPictureSelect() {
+        new RxPermissions(this)
+                .request(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE)
+                .subscribe(permission -> {
+                    if (permission) {
+                        PictureSelector.create(this)
+                                .openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
+                                .loadImageEngine(GlideEngine.createGlideEngine())
+                                .theme(com.cooleshow.base.R.style.picture_daya_style)// 主题样式设置 具体参考 values/styles   用法:R .style.picture.white.style
+                                .selectionMode(PictureConfig.SINGLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
+                                .enableCrop(false)// 是否裁剪 true or false
+                                .showCropGrid(false)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
+                                .compress(true)// 是否压缩 true or false
+                                .circleDimmedLayer(false)// 是否圆形裁剪 true or false
+                                .forResult(PictureConfig.CHOOSE_REQUEST);
+                    } else {
+                        String tip = "上传照片需要相机权限,是否去设置?";
+                        showCommonTipDialog(tip);
+                    }
+                });
+    }
+
+    private void showCommonTipDialog(String tip) {
+        CommonDialog dialog = new CommonDialog(this);
+        dialog.show();
+        dialog.setTitle("提示");
+        dialog.setContent(tip);
+        dialog.setOnCancelClickListener(view1 -> {
+            dialog.dismiss();
+        });
+
+        dialog.setOnConfirmClickListener(view1 -> {
+            PermissionUtils.toSelfSetting(this);
+            dialog.dismiss();
+        });
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        LogUtils.i("pq", "requestCode" + requestCode);
+        LogUtils.i("pq", "resultCode" + resultCode);
+        if (requestCode == PictureConfig.CHOOSE_REQUEST && mUploadCallbackAboveL != null) {
+            // 图片、视频、音频选择结果回调
+            List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
+            String avatar = selectList.get(0).getCompressPath();
+
+            if (avatar != null) {
+                mUploadCallbackAboveL.onReceiveValue(new Uri[]{PictureFileUtils.parUri(getApplicationContext(), new File(avatar))});
+            } else {
+                mUploadCallbackAboveL.onReceiveValue(new Uri[]{});
+            }
+            mUploadCallbackAboveL = null;
+            return;
+        }
+        if (requestCode == REQUEST_CODE_FILE_CHOOSER) {
+            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
+            if (result != null) {
+                File file = UriUtils.uri2File(result);
+                if (file != null && file.exists()) {
+                    UploadHelper uploadHelper = new UploadHelper(WebActivity.this);
+                    uploadHelper.uploadFile(file);
+//                    if (f.exists() && f.isFile()) {
+//                        Uri newUri = Uri.fromFile(f);
+//                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+//                            if (mUploadCallbackAboveL != null) {
+//                                if (newUri != null) {
+//                                    mUploadCallbackAboveL.onReceiveValue(new Uri[]{newUri});
+//                                    mUploadCallbackAboveL = null;
+//                                    return;
+//                                }
+//                            }
+//                        }
+//                    } else {
+//                        ToastUtil.getInstance().show(WebActivity.this, "文件损坏或不存在,请重新选择");
+//                    }
+                }
+            }
+            clearUploadMessage();
+            return;
+        }
+
+    }
+
+    /**
+     * webview没有选择文件也要传null,防止下次无法执行
+     */
+    private void clearUploadMessage() {
+        if (mUploadCallbackAboveL != null) {
+            mUploadCallbackAboveL.onReceiveValue(null);
+            mUploadCallbackAboveL = null;
+        }
+    }
+}

+ 145 - 0
student/src/main/java/com/cooleshow/student/widgets/helper/JsInterfaceHelper.java

@@ -0,0 +1,145 @@
+package com.cooleshow.student.widgets.helper;
+
+import android.app.Activity;
+import android.text.TextUtils;
+import android.webkit.JavascriptInterface;
+
+import com.cooleshow.base.utils.LogUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+/**
+ * Description:
+ * Copyright  : Copyright (c) 2016
+ * Company    : 大雅
+ * Author     : 刘瑞
+ * Date       : 2018/11/12 15:23
+ */
+public class JsInterfaceHelper extends Object {
+    public static final String ENTERLIVEROOM = "enterLiveRoom";
+    public static final String GET_NAV_HEIGHT = "getNavHeight";//获取状态栏高度
+    public static final String BACKICONCHANGE = "backIconChange";//顶部栏返回按钮颜色
+    public static final String SETBARSTATUS = "setBarStatus";//顶部栏控制
+    public static final String FINISH = "back";//结束本页面
+    public static final String CHOOSEFILE = "chooseFile";//选择文件
+
+    private Activity activity;
+    JSONObject resultJson;
+
+    public OnJsMethodCallListener onListener;
+
+
+    public JsInterfaceHelper(Activity activity) {
+        this.activity = activity;
+    }
+
+    /*
+     *统一方法
+     */
+    @JavascriptInterface
+    public void postMessage(String message) {
+        LogUtils.i("pq", "收到Msg:" + message);
+        if (activity == null) {
+            return;
+        }
+        activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                JSONObject jsonObject = null;
+                try {
+                    jsonObject = new JSONObject(message);
+                    String api = jsonObject.getString("api");
+                    handleAction(api, jsonObject);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+
+        });
+    }
+
+    private void handleAction(String api, JSONObject jsonObject) {
+        if (TextUtils.equals(GET_NAV_HEIGHT, api)) {
+            //获取状态栏高度
+            if (onListener != null) {
+                onListener.getNavHeight(jsonObject);
+            }
+            return;
+        }
+
+        if (TextUtils.equals(BACKICONCHANGE, api)) {
+            //返回按钮颜色
+            if (onListener != null) {
+                onListener.backIconChange(jsonObject);
+            }
+            return;
+        }
+
+        if (TextUtils.equals(SETBARSTATUS, api)) {
+            //状态栏控制
+            if (onListener != null) {
+                onListener.setBarStatus(jsonObject);
+            }
+            return;
+        }
+        if (TextUtils.equals(FINISH, api)) {
+            //结束本页面
+            activity.finish();
+            return;
+        }
+
+        if(TextUtils.equals(CHOOSEFILE,api)){
+            //选择文件
+            if (onListener != null) {
+                onListener.chooseFile(jsonObject);
+            }
+            return;
+        }
+    }
+
+
+    public void setOnJsCallListener(OnJsMethodCallListener onListener) {
+        this.onListener = onListener;
+    }
+
+
+    public interface OnJsMethodCallListener {
+
+        /**
+         * 顶部栏控制
+         *
+         * @param message
+         */
+        void setBarStatus(JSONObject message);
+
+        /**
+         * 顶部栏返回按钮颜色
+         * {iconStyle:  black , white}
+         *
+         * @param message
+         */
+        void backIconChange(JSONObject message);
+
+        /**
+         * 选择文件
+         * @param message
+         */
+        void chooseFile(JSONObject message);
+
+        /**
+         * 返回顶部高度
+         * 顶部栏高度
+         * 以及dpi
+         *
+         * @param message
+         */
+        void getNavHeight(JSONObject message);
+    }
+
+
+    public void release() {
+        this.activity = null;
+    }
+}

+ 62 - 0
student/src/main/java/com/cooleshow/student/wxapi/WXPayEntryActivity.java

@@ -0,0 +1,62 @@
+package com.cooleshow.student.wxapi;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.student.R;
+import com.tencent.mm.opensdk.constants.ConstantsAPI;
+import com.tencent.mm.opensdk.modelbase.BaseReq;
+import com.tencent.mm.opensdk.modelbase.BaseResp;
+import com.tencent.mm.opensdk.openapi.IWXAPI;
+import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
+import com.tencent.mm.opensdk.openapi.WXAPIFactory;
+
+public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
+
+    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
+
+    private IWXAPI api;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pay_result);
+
+        api = WXAPIFactory.createWXAPI(this, "wx149a928c415c137a");
+        api.handleIntent(getIntent(), this);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        setIntent(intent);
+        api.handleIntent(intent, this);
+    }
+
+    @Override
+    public void onReq(BaseReq req) {
+    }
+
+    @Override
+    public void onResp(BaseResp resp) {
+        Log.d("TAG", "onPayFinish, errCode = " + resp.errCode);
+
+        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
+            if (resp.errCode == 0) {
+                //成功
+                ToastUtils.showShort("支付成功");
+
+            } else {
+                ToastUtils.showShort("支付失败:" + resp.errCode);
+            }
+			/*AlertDialog.Builder builder = new AlertDialog.Builder(this);
+			builder.setTitle("提示");
+			builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
+			builder.show();*/
+            finish();
+        }
+    }
+}

BIN
student/src/main/res/drawable-xhdpi/icon_about_logo.png


BIN
student/src/main/res/drawable-xhdpi/icon_black_down.png


BIN
student/src/main/res/drawable-xhdpi/icon_et_close.png


BIN
student/src/main/res/drawable-xhdpi/icon_go_down.png


BIN
student/src/main/res/drawable-xhdpi/icon_home_menu_live.png


BIN
student/src/main/res/drawable-xhdpi/icon_home_menu_practice.png


BIN
student/src/main/res/drawable-xhdpi/icon_home_menu_score.png


BIN
student/src/main/res/drawable-xhdpi/icon_home_menu_style.png


BIN
student/src/main/res/drawable-xhdpi/icon_home_menu_video.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_course.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_device_detection.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_goods_order.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_help.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_homework.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_id_star.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_meter_records.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_network_detection.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_score.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_setting.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_top_bg.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_transaction_record.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_vip_bg.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_vip_center.png


BIN
student/src/main/res/drawable-xhdpi/icon_mine_vip_star.png


BIN
student/src/main/res/drawable-xhdpi/icon_modify_address.png


BIN
student/src/main/res/drawable-xhdpi/icon_next_right.png


BIN
student/src/main/res/drawable-xhdpi/icon_student_default_head.png


BIN
student/src/main/res/drawable-xhdpi/icon_switch_off.png


BIN
student/src/main/res/drawable-xhdpi/icon_switch_open.png


BIN
student/src/main/res/drawable-xhdpi/icon_top_message.png


BIN
student/src/main/res/drawable-xxhdpi/icon_about_logo.png


BIN
student/src/main/res/drawable-xxhdpi/icon_black_down.png


BIN
student/src/main/res/drawable-xxhdpi/icon_et_close.png


BIN
student/src/main/res/drawable-xxhdpi/icon_go_down.png


BIN
student/src/main/res/drawable-xxhdpi/icon_home_menu_live.png


BIN
student/src/main/res/drawable-xxhdpi/icon_home_menu_practice.png


BIN
student/src/main/res/drawable-xxhdpi/icon_home_menu_score.png


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác