Sfoglia il codice sorgente

首页闪图
我的课程 (课程详情无)
我的作业

Ryan8057 2 anni fa
parent
commit
25ef66abf7
100 ha cambiato i file con 4228 aggiunte e 54 eliminazioni
  1. 1 1
      BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java
  2. 13 0
      student/src/main/AndroidManifest.xml
  3. 41 0
      student/src/main/java/com/cooleshow/student/adapter/CourseStatusFilterAdapter.java
  4. 92 0
      student/src/main/java/com/cooleshow/student/adapter/CourseTableListAdapter.kt
  5. 58 0
      student/src/main/java/com/cooleshow/student/adapter/HomeWorkPagerAdapter.java
  6. 98 0
      student/src/main/java/com/cooleshow/student/adapter/HomeworkAdapter.java
  7. 67 0
      student/src/main/java/com/cooleshow/student/adapter/LiveCourseListAdapter.java
  8. 110 0
      student/src/main/java/com/cooleshow/student/adapter/MessageBoxAdapter.java
  9. 60 0
      student/src/main/java/com/cooleshow/student/adapter/MineCoursePagerAdapter.java
  10. 79 0
      student/src/main/java/com/cooleshow/student/adapter/PracticeCourseListAdapter.java
  11. 48 0
      student/src/main/java/com/cooleshow/student/adapter/VideoCourseListAdapter.java
  12. 105 0
      student/src/main/java/com/cooleshow/student/api/APIService.java
  13. 12 0
      student/src/main/java/com/cooleshow/student/bean/CountOfUnreadBean.java
  14. 14 0
      student/src/main/java/com/cooleshow/student/bean/CourseFilterStatusBean.java
  15. 65 0
      student/src/main/java/com/cooleshow/student/bean/CourseTableDataBean.java
  16. 57 0
      student/src/main/java/com/cooleshow/student/bean/HomeworkListBean.java
  17. 80 0
      student/src/main/java/com/cooleshow/student/bean/LiveCourseListBean.java
  18. 53 0
      student/src/main/java/com/cooleshow/student/bean/PracticeCourseListBean.java
  19. 65 0
      student/src/main/java/com/cooleshow/student/bean/QuerySubjectBean.java
  20. 59 0
      student/src/main/java/com/cooleshow/student/bean/SystemMessageBean.java
  21. 90 0
      student/src/main/java/com/cooleshow/student/bean/VideoCourseListBean.java
  22. 18 0
      student/src/main/java/com/cooleshow/student/constants/CourseConstants.java
  23. 23 0
      student/src/main/java/com/cooleshow/student/constants/CourseTableContract.java
  24. 3 3
      student/src/main/java/com/cooleshow/student/contract/HomeWorkActContract.java
  25. 21 0
      student/src/main/java/com/cooleshow/student/contract/HomeWorkContract.java
  26. 25 0
      student/src/main/java/com/cooleshow/student/contract/LiveCourseContract.java
  27. 28 0
      student/src/main/java/com/cooleshow/student/contract/MessageBoxContract.java
  28. 17 0
      student/src/main/java/com/cooleshow/student/contract/MineCourseContract.java
  29. 27 0
      student/src/main/java/com/cooleshow/student/contract/MinePracticeCourseContract.java
  30. 20 0
      student/src/main/java/com/cooleshow/student/contract/VideoCourseContract.java
  31. 75 0
      student/src/main/java/com/cooleshow/student/presenter/course/LiveCoursePresenter.java
  32. 14 0
      student/src/main/java/com/cooleshow/student/presenter/course/MineCoursePresenter.java
  33. 76 0
      student/src/main/java/com/cooleshow/student/presenter/course/MinePracticeCoursePresenter.java
  34. 52 0
      student/src/main/java/com/cooleshow/student/presenter/course/VideoCoursePresenter.java
  35. 14 0
      student/src/main/java/com/cooleshow/student/presenter/homework/HomeWorkActPresenter.java
  36. 60 0
      student/src/main/java/com/cooleshow/student/presenter/homework/HomeWorkPresenter.java
  37. 64 5
      student/src/main/java/com/cooleshow/student/presenter/main/CourseTablePresenter.java
  38. 139 0
      student/src/main/java/com/cooleshow/student/presenter/message/MessageBoxPresenter.java
  39. 362 0
      student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java
  40. 78 0
      student/src/main/java/com/cooleshow/student/ui/course/MineCourseActivity.java
  41. 370 0
      student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java
  42. 211 0
      student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java
  43. 0 41
      student/src/main/java/com/cooleshow/student/ui/main/CourseTableFragment.java
  44. 279 0
      student/src/main/java/com/cooleshow/student/ui/main/CourseTableFragment.kt
  45. 73 2
      student/src/main/java/com/cooleshow/student/ui/main/HomeFragment.java
  46. 9 1
      student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java
  47. 239 0
      student/src/main/java/com/cooleshow/student/ui/message/MessageBoxActivity.java
  48. 4 1
      student/src/main/java/com/cooleshow/student/ui/web/WebActivity.java
  49. 88 0
      student/src/main/java/com/cooleshow/student/ui/work/HomeWorkActivity.java
  50. 237 0
      student/src/main/java/com/cooleshow/student/ui/work/HomeWorkFragment.java
  51. 65 0
      student/src/main/java/com/cooleshow/student/widgets/CalendarExpandDecoration.java
  52. 65 0
      student/src/main/java/com/cooleshow/student/widgets/CalendarShrinkDecoration.java
  53. 71 0
      student/src/main/java/com/cooleshow/student/widgets/DialogUtils.java
  54. 36 0
      student/src/main/java/com/cooleshow/student/widgets/helper/CourseHelper.java
  55. 41 0
      student/src/main/java/com/cooleshow/student/wxapi/VideoCourseListItemDecoration.java
  56. 39 0
      student/src/main/res/anim/modal_in.xml
  57. 18 0
      student/src/main/res/anim/modal_out.xml
  58. BIN
      student/src/main/res/drawable-xhdpi/bg_message_list_gradient.png
  59. BIN
      student/src/main/res/drawable-xhdpi/icon_arrow_down.png
  60. BIN
      student/src/main/res/drawable-xhdpi/icon_chat_small.png
  61. BIN
      student/src/main/res/drawable-xhdpi/icon_clock.png
  62. BIN
      student/src/main/res/drawable-xhdpi/icon_edit_appraisal.png
  63. BIN
      student/src/main/res/drawable-xhdpi/icon_empty_message_box.png
  64. BIN
      student/src/main/res/drawable-xhdpi/icon_item_practice.png
  65. BIN
      student/src/main/res/drawable-xhdpi/icon_live_bg.png
  66. BIN
      student/src/main/res/drawable-xhdpi/icon_message_course.png
  67. BIN
      student/src/main/res/drawable-xhdpi/icon_message_evaluate.png
  68. BIN
      student/src/main/res/drawable-xhdpi/icon_message_group_chat.png
  69. BIN
      student/src/main/res/drawable-xhdpi/icon_message_homework.png
  70. BIN
      student/src/main/res/drawable-xhdpi/icon_message_income.png
  71. BIN
      student/src/main/res/drawable-xhdpi/icon_message_live.png
  72. BIN
      student/src/main/res/drawable-xhdpi/icon_message_music_auth.png
  73. BIN
      student/src/main/res/drawable-xhdpi/icon_message_music_sheet.png
  74. BIN
      student/src/main/res/drawable-xhdpi/icon_message_practice.png
  75. BIN
      student/src/main/res/drawable-xhdpi/icon_message_read_all.png
  76. BIN
      student/src/main/res/drawable-xhdpi/icon_message_tab_all.png
  77. BIN
      student/src/main/res/drawable-xhdpi/icon_message_tab_course.png
  78. BIN
      student/src/main/res/drawable-xhdpi/icon_message_tab_system.png
  79. BIN
      student/src/main/res/drawable-xhdpi/icon_message_teacher_auth.png
  80. BIN
      student/src/main/res/drawable-xhdpi/icon_message_video.png
  81. BIN
      student/src/main/res/drawable-xhdpi/icon_message_vip.png
  82. BIN
      student/src/main/res/drawable-xhdpi/icon_set_homework.png
  83. BIN
      student/src/main/res/drawable-xhdpi/icon_star_default.png
  84. BIN
      student/src/main/res/drawable-xhdpi/icon_star_select.png
  85. BIN
      student/src/main/res/drawable-xhdpi/icon_stu_comment_empty.png
  86. BIN
      student/src/main/res/drawable-xhdpi/icon_teacher_appraisal_empty.png
  87. BIN
      student/src/main/res/drawable-xhdpi/icon_video_close.png
  88. BIN
      student/src/main/res/drawable-xxhdpi/bg_message_list_gradient.png
  89. BIN
      student/src/main/res/drawable-xxhdpi/ic_calendar_expand.png
  90. BIN
      student/src/main/res/drawable-xxhdpi/ic_calendar_shrink.png
  91. BIN
      student/src/main/res/drawable-xxhdpi/icon_arrow_down.png
  92. BIN
      student/src/main/res/drawable-xxhdpi/icon_chat_small.png
  93. BIN
      student/src/main/res/drawable-xxhdpi/icon_clock.png
  94. BIN
      student/src/main/res/drawable-xxhdpi/icon_edit_appraisal.png
  95. BIN
      student/src/main/res/drawable-xxhdpi/icon_empty_message_box.png
  96. BIN
      student/src/main/res/drawable-xxhdpi/icon_item_practice.png
  97. BIN
      student/src/main/res/drawable-xxhdpi/icon_live_bg.png
  98. BIN
      student/src/main/res/drawable-xxhdpi/icon_message_course.png
  99. BIN
      student/src/main/res/drawable-xxhdpi/icon_message_evaluate.png
  100. BIN
      student/src/main/res/drawable-xxhdpi/icon_message_group_chat.png

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

@@ -67,7 +67,7 @@ public abstract class WebConstants {
     //开启直播
     public static final String TEACHER_OPEN_LIVE = getBaseUrlH5() + "/#/openLive";
     //帮助中心
-    public static final String TEACHER_HELP_CENTER = getBaseUrlH5() + "/#/helpCenter";
+    public static final String HELP_CENTER = getBaseUrlH5() + "/#/helpCenter";
     //视频课创建
     public static final String TEACHER_VIDEO_CREATE = getBaseUrlH5() + "/#/videoCreate";
     //视频课详情

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

@@ -89,6 +89,19 @@
             </intent-filter>
 
         </activity>
+
+        <activity
+            android:name=".ui.course.MineCourseActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.work.HomeWorkActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.message.MessageBoxActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
     </application>
 
 </manifest>

+ 41 - 0
student/src/main/java/com/cooleshow/student/adapter/CourseStatusFilterAdapter.java

@@ -0,0 +1,41 @@
+package com.cooleshow.student.adapter;
+
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.CourseFilterStatusBean;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class CourseStatusFilterAdapter extends BaseQuickAdapter<CourseFilterStatusBean, BaseViewHolder> {
+    private int selectPosition = -1;
+
+    public CourseStatusFilterAdapter(int layoutResId) {
+        super(layoutResId);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, CourseFilterStatusBean bean) {
+        holder.setText(R.id.tv_title, bean.showText);
+        TextView tv_title = holder.getView(R.id.tv_title);
+        if (getItemPosition(bean) == selectPosition) {
+            tv_title.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        } else {
+            tv_title.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.black_333));
+        }
+    }
+
+    public int getSelectPosition() {
+        return selectPosition;
+    }
+
+    public void setSelect(int selectPosition) {
+        this.selectPosition = selectPosition;
+        notifyDataSetChanged();
+    }
+}

+ 92 - 0
student/src/main/java/com/cooleshow/student/adapter/CourseTableListAdapter.kt

@@ -0,0 +1,92 @@
+package com.cooleshow.student.adapter
+
+import android.text.TextUtils
+import android.view.View
+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.ext.setVisible
+import com.cooleshow.base.utils.GlideUtils
+import com.cooleshow.student.R
+import com.cooleshow.student.bean.CourseTableDataBean
+
+/**
+ * Author by pq, Date on 2022/4/21.
+ */
+class CourseTableListAdapter(layoutResId: Int) :
+    BaseQuickAdapter<CourseTableDataBean.StudentListBean?, BaseViewHolder>(layoutResId) {
+    val LIVE_COURSE = "LIVE_COURSE"
+    val OTHER_COURSE = "PRACTICE"
+    val NOT_START = "NOT_START"
+    val ING = "ING"
+    val COMPLETE = "COMPLETE"
+    val CANCEL = "CANCEL"
+    override fun convert(
+        baseViewHolder: BaseViewHolder,
+        data: CourseTableDataBean.StudentListBean?
+    ) {
+        val tvTime = baseViewHolder.getView<TextView>(R.id.tv_time)
+        val ivAvatar = baseViewHolder.getView<ImageView>(R.id.iv_avatar)
+        val viewLine2 = baseViewHolder.getView<View>(R.id.view_line2)
+        val tvBuyNum = baseViewHolder.getView<TextView>(R.id.tv_buy_num)
+        val tvCourseStatusBt = baseViewHolder.getView<TextView>(R.id.tv_course_status_bt)
+        //开始时间
+        tvTime.text = data?.startTime;
+        //title
+        baseViewHolder.setText(R.id.tv_title, data?.name);
+        //subjectName
+        baseViewHolder.setText(R.id.tv_course_name, data?.subjectName);
+        if (TextUtils.equals(OTHER_COURSE, data?.courseType)) {
+            //陪练课
+            GlideUtils.loadImage(
+                context,
+                data!!.avatar,
+                ivAvatar,
+                R.drawable.icon_teacher_default_head
+            )
+            viewLine2.setVisible(false)
+            tvBuyNum.setVisible(false)
+        } else {
+            //直播课
+            ivAvatar.setImageResource(R.drawable.icon_live_bg)
+            var payCount = data?.payCount
+            //已购人数
+            tvBuyNum.text = context.getString(R.string.pay_count_str, payCount)
+            viewLine2.setVisible(true)
+            tvBuyNum.setVisible(true)
+        }
+        when (data?.status) {
+            NOT_START -> {
+                //未开始
+                if (TextUtils.equals(OTHER_COURSE, data?.courseType)) {
+                    tvCourseStatusBt.setVisible(true)
+                } else {
+                    //直播课隐藏
+                    tvCourseStatusBt.setVisible(false)
+                }
+                baseViewHolder.setText(R.id.tv_course_status, "未开始")
+                tvCourseStatusBt.text = "调课"
+                tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_normal);
+                tvCourseStatusBt.setTextColor(context.resources.getColor(com.cooleshow.base.R.color.color_2dc7aa))
+            }
+            ING -> {
+                //进行中
+                tvCourseStatusBt.setVisible(true)
+                tvCourseStatusBt.text = "进入教室"
+                baseViewHolder.setText(R.id.tv_course_status, "进行中")
+                tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_ing);
+                tvCourseStatusBt.setTextColor(context.resources.getColor(R.color.white))
+
+            }
+            COMPLETE -> {
+                //已完成
+                tvCourseStatusBt.setVisible(true)
+                tvCourseStatusBt.text = "评价"
+                baseViewHolder.setText(R.id.tv_course_status, "已结束")
+                tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_normal);
+                tvCourseStatusBt.setTextColor(context.resources.getColor(com.cooleshow.base.R.color.color_2dc7aa))
+            }
+        }
+    }
+}

+ 58 - 0
student/src/main/java/com/cooleshow/student/adapter/HomeWorkPagerAdapter.java

@@ -0,0 +1,58 @@
+package com.cooleshow.student.adapter;
+
+import android.view.ViewGroup;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/23 10:53
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeWorkPagerAdapter extends FragmentPagerAdapter {
+
+    private List<String> titles;
+    public FragmentManager fm;
+    private List<Fragment> fragments;
+
+    public HomeWorkPagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) {
+        super(fm);
+        this.fm=fm;
+        this.titles = titles;
+        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();
+    }
+
+    @Override
+    public CharSequence getPageTitle(int position) {
+        return titles != null && titles.size() > position ? titles.get(position) : "";
+    }
+    @Override
+    public Fragment instantiateItem(ViewGroup container, int position) {
+        Fragment fragment = (Fragment) super.instantiateItem(container,
+                position);
+        fm.beginTransaction().show(fragment).commit();
+        return fragment;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        // super.destroyItem(container, position, object);
+        Fragment fragment = fragments.get(position);
+        fm.beginTransaction().hide(fragment).commit();
+    }
+}

+ 98 - 0
student/src/main/java/com/cooleshow/student/adapter/HomeworkAdapter.java

@@ -0,0 +1,98 @@
+package com.cooleshow.student.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.HomeworkListBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/23 11:13
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeworkAdapter extends BaseQuickAdapter<HomeworkListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    private String submit;
+    public HomeworkAdapter(List<HomeworkListBean.RowsBean> data,String submit) {
+        super(R.layout.layout_item_homework, data);
+        this.submit=submit;
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, HomeworkListBean.RowsBean item) {
+        TextView tv_date=helper.getView(R.id.tv_date);
+        TextView tv_state=helper.getView(R.id.tv_state);
+        TextView tv_join_state=helper.getView(R.id.tv_join_state);
+        TextView tv_submit=helper.getView(R.id.tv_submit);
+
+        ImageView im_header=helper.getView(R.id.im_header);
+        TextView tv_name=helper.getView(R.id.tv_name);
+        RecyclerView rv_mark=helper.getView(R.id.rv_mark);
+        GlideUtils.INSTANCE.loadImage(getContext(), item.teacherAvatar, im_header, R.drawable.icon_teacher_default_head);
+        tv_name.setText(item.teacherName);
+        if (!TextUtils.isEmpty(item.subjectName)) {
+            rv_mark.setVisibility(View.VISIBLE);
+            List<String> markList = new ArrayList<>();
+            if (item.subjectName.contains(",")) {
+                String[] split = item.subjectName.split(",");
+                for (String s : split) {
+                    markList.add(s);
+                }
+            } else {
+                markList.add(item.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);
+        }
+        tv_date.setText(item.classDate);
+        if (item.absenteeism.equals("YES")){
+            //到课
+            tv_join_state.setText("到课");
+            tv_join_state.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        }else {
+            //旷课
+            tv_join_state.setText("旷课");
+            tv_join_state.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_ff4e19));
+        }
+
+        if (submit.equals("YES")){
+            tv_submit.setText("已提交");
+            tv_submit.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+            tv_submit.setBackgroundResource(R.drawable.bg_999999_border);
+        }else {
+            tv_submit.setText("去提交");
+            tv_submit.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+            tv_submit.setBackgroundResource(R.drawable.bg_2dc7aa_border);
+        }
+
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+
+}

+ 67 - 0
student/src/main/java/com/cooleshow/student/adapter/LiveCourseListAdapter.java

@@ -0,0 +1,67 @@
+package com.cooleshow.student.adapter;
+
+import android.text.TextUtils;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.LiveCourseListBean;
+import com.cooleshow.student.constants.CourseConstants;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class LiveCourseListAdapter extends BaseQuickAdapter<LiveCourseListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public LiveCourseListAdapter(int layoutResId) {
+        super(layoutResId);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, LiveCourseListBean.RowsBean data) {
+        //时间
+        holder.setText(R.id.tv_time, data.startTime);
+        //title
+        holder.setText(R.id.tv_title, data.courseGroupName);
+        //subjectName
+        holder.setText(R.id.tv_course_name, data.subjectName);
+        //购买人数
+        holder.setText(R.id.tv_buy_num, getContext().getString(R.string.pay_count_str, data.studentCount));
+        //头像
+        ImageView iv_avatar = holder.getView(R.id.iv_bg);
+        GlideUtils.INSTANCE.loadImage(getContext(), data.backgroundPic, iv_avatar, R.drawable.icon_teacher_default_head);
+
+        TextView tvCourseStatusBt = holder.getView(R.id.tv_course_status);
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_NOT_START, data.status)) {
+            //未开始
+            holder.setText(R.id.tv_course_status, "未开始");
+            tvCourseStatusBt.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_ff802c));
+        }
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_ING, data.status)) {
+            //进行中
+            holder.setText(R.id.tv_course_status, "进行中");
+            tvCourseStatusBt.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        }
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_COMPLETE, data.status)) {
+            //已结束
+            holder.setText(R.id.tv_course_status, "已结束");
+            tvCourseStatusBt.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        }
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+}

+ 110 - 0
student/src/main/java/com/cooleshow/student/adapter/MessageBoxAdapter.java

@@ -0,0 +1,110 @@
+package com.cooleshow.student.adapter;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.SystemMessageBean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/24 13:50
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MessageBoxAdapter extends BaseQuickAdapter<SystemMessageBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public MessageBoxAdapter(List<SystemMessageBean.RowsBean> data) {
+        super(R.layout.layout_message_nox_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, SystemMessageBean.RowsBean item) {
+        ImageView im_type = helper.getView(R.id.im_type);
+        TextView tv_title=helper.getView(R.id.tv_title);
+        tv_title.setText(item.title);
+        TextView tv_content=helper.getView(R.id.tv_content);
+        tv_content.setText(item.content);
+        TextView tv_date=helper.getView(R.id.tv_date);
+        tv_date.setText(item.sendTime);
+        View view_unread=helper.getView(R.id.view_unread);
+        if (item.readStatus==0){
+            view_unread.setVisibility(View.VISIBLE);
+        }else {
+            view_unread.setVisibility(View.GONE);
+        }
+        switch (item.subType) {
+            case "TEACHER_AUTH":
+                //老师认证
+                im_type.setBackgroundResource(R.drawable.icon_message_teacher_auth);
+                break;
+            case "MUSICIAN_AUTH":
+                //音乐人认证
+                im_type.setBackgroundResource(R.drawable.icon_message_music_auth);
+                break;
+            case "PRACTICE":
+                //陪练课
+                im_type.setBackgroundResource(R.drawable.icon_message_practice);
+                break;
+            case "LIVE":
+                //直播课
+                im_type.setBackgroundResource(R.drawable.icon_message_live);
+                break;
+            case "VIDEO":
+                //视频课
+                im_type.setBackgroundResource(R.drawable.icon_message_video);
+                break;
+            case "MUSIC_SHEET":
+                //乐谱
+                im_type.setBackgroundResource(R.drawable.icon_message_music_sheet);
+                break;
+            case "COURSE":
+                //课程
+                im_type.setBackgroundResource(R.drawable.icon_message_course);
+                break;
+            case "INCOME":
+                //收入
+                im_type.setBackgroundResource(R.drawable.icon_message_income);
+                break;
+            case "HOMEWORK":
+                //作业
+                im_type.setBackgroundResource(R.drawable.icon_message_homework);
+                break;
+            case "EVALUATE":
+                //评价
+                im_type.setBackgroundResource(R.drawable.icon_message_evaluate);
+                break;
+            case "GROUP_CHAT":
+                //群聊
+                im_type.setBackgroundResource(R.drawable.icon_message_group_chat);
+                break;
+            case "VIP":
+                //会员
+                im_type.setBackgroundResource(R.drawable.icon_message_vip);
+                break;
+            case "NOTICE":
+            default:
+                //公告
+//                im_type.setBackgroundResource(R.drawable.icon_message_notice);
+                //TODO 还差公告的图
+                im_type.setBackgroundResource(R.drawable.icon_message_vip);
+                break;
+        }
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+}

+ 60 - 0
student/src/main/java/com/cooleshow/student/adapter/MineCoursePagerAdapter.java

@@ -0,0 +1,60 @@
+package com.cooleshow.student.adapter;
+
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 11:14
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MineCoursePagerAdapter extends FragmentPagerAdapter {
+
+    private List<String> titles;
+    public FragmentManager fm;
+    private List<Fragment> fragments;
+
+    public MineCoursePagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) {
+        super(fm);
+        this.fm=fm;
+        this.titles = titles;
+        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();
+    }
+
+    @Override
+    public CharSequence getPageTitle(int position) {
+        return titles != null && titles.size() > position ? titles.get(position) : "";
+    }
+
+    @Override
+    public Fragment instantiateItem(ViewGroup container, int position) {
+        Fragment fragment = (Fragment) super.instantiateItem(container,
+                position);
+        fm.beginTransaction().show(fragment).commit();
+        return fragment;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        // super.destroyItem(container, position, object);
+        Fragment fragment = fragments.get(position);
+        fm.beginTransaction().hide(fragment).commit();
+    }
+}

+ 79 - 0
student/src/main/java/com/cooleshow/student/adapter/PracticeCourseListAdapter.java

@@ -0,0 +1,79 @@
+package com.cooleshow.student.adapter;
+
+import android.text.TextUtils;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.PracticeCourseListBean;
+import com.cooleshow.student.constants.CourseConstants;
+
+/**
+ * 创建日期:2022/5/30 10:41
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PracticeCourseListAdapter extends BaseQuickAdapter<PracticeCourseListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public PracticeCourseListAdapter(int layoutResId) {
+        super(layoutResId);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, PracticeCourseListBean.RowsBean data) {
+        //时间
+        holder.setText(R.id.tv_time, data.startTime);
+        //title
+        holder.setText(R.id.tv_title, data.userName);
+        //subjectName
+        holder.setText(R.id.tv_course_name, data.subjectName);
+        ImageView iv_avatar = holder.getView(R.id.iv_avatar);
+        //头像
+        GlideUtils.INSTANCE.loadImage(getContext(), data.avatar, iv_avatar, R.drawable.icon_teacher_default_head);
+
+        TextView tvCourseStatusBt = holder.getView(R.id.tv_course_status_bt);
+        TextView tv_course_status = holder.getView(R.id.tv_course_status);
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_NOT_START, data.status)) {
+            //未开始
+            tv_course_status.setText("未开始");
+            tv_course_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_ff802c));
+            tvCourseStatusBt.setText("调课");
+            tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_normal);
+            tvCourseStatusBt.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        }
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_ING, data.status)) {
+            //进行中
+            tv_course_status.setText("进行中");
+            tv_course_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+            tvCourseStatusBt.setText("进入教室");
+            tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_ing);
+            tvCourseStatusBt.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.white));
+        }
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_COMPLETE, data.status)) {
+            //已结束
+            tv_course_status.setText("已结束");
+            tv_course_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+
+            tvCourseStatusBt.setText("评价");
+            tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_normal);
+            tvCourseStatusBt.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        }
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+}

+ 48 - 0
student/src/main/java/com/cooleshow/student/adapter/VideoCourseListAdapter.java

@@ -0,0 +1,48 @@
+package com.cooleshow.student.adapter;
+
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.VideoCourseListBean;
+
+/**
+ * Author by pq, Date on 2022/4/26.
+ */
+public class VideoCourseListAdapter extends BaseQuickAdapter<VideoCourseListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public VideoCourseListAdapter(int layoutResId) {
+        super(layoutResId);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, VideoCourseListBean.RowsBean data) {
+        ImageView iv_bg = holder.getView(R.id.iv_bg);
+        //封面
+        GlideUtils.INSTANCE.loadImage(getContext(), data.lessonCoverUrl, iv_bg);
+        //title
+        holder.setText(R.id.tv_title, data.lessonName);
+        //头像
+        ImageView cir_avatar = holder.getView(R.id.cir_avatar);
+        GlideUtils.INSTANCE.loadImage(getContext(), data.avatar, cir_avatar);
+        //老师名称
+        holder.setText(R.id.tv_author_name, data.username);
+        //购买人数
+        holder.setText(R.id.tv_buy_num, getContext().getString(R.string.pay_count_str, data.countStudent));
+        //¥120/4课时
+        String price = "¥" + data.lessonPrice + "/" + data.lessonCount + "课时";
+        holder.setText(R.id.tv_price, price);
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+}

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

@@ -9,11 +9,19 @@ 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.CountOfUnreadBean;
+import com.cooleshow.student.bean.CourseTableDataBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
+import com.cooleshow.student.bean.HomeworkListBean;
 import com.cooleshow.student.bean.HotAlbumBean;
+import com.cooleshow.student.bean.LiveCourseListBean;
 import com.cooleshow.student.bean.PayTestBean;
+import com.cooleshow.student.bean.PracticeCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
 import com.cooleshow.student.bean.StudentUserInfo;
+import com.cooleshow.student.bean.SystemMessageBean;
+import com.cooleshow.student.bean.VideoCourseListBean;
 import com.cooleshow.usercenter.bean.SetDetailBean;
 import com.cooleshow.usercenter.bean.UserInfo;
 
@@ -171,12 +179,14 @@ public interface APIService {
 
     /**
      * 学生-首页-直播课&视频课&最近课程
+     *
      * @param platform
      * @param version
      * @return
      */
     @GET(STUDENT_GROUP + "courseSchedule/queryLiveAndVideo")
     Observable<BaseResponse<HomeLiveAndVideoBean>> queryLiveAndVideo(@Query("platform") String platform, @Query("version") String version);
+
     /**
      * 首页老师风采-分页
      *
@@ -185,4 +195,99 @@ public interface APIService {
      */
     @POST(STUDENT_GROUP + "teacher/stylePage")
     Observable<BaseResponse<HomeStyleBean>> getStylePage(@Body RequestBody body);
+
+    /**
+     * 我的课程-查询陪练课
+     *
+     * @param
+     * @return
+     */
+    @POST(STUDENT_GROUP + "courseSchedule/queryStudentPracticeCourse")
+    Observable<BaseResponse<PracticeCourseListBean>> queryStudentPracticeCourse(@Body RequestBody body);
+
+    /**
+     * 我的课程-查询直播课
+     *
+     * @param
+     * @return
+     */
+    @POST(STUDENT_GROUP + "courseSchedule/queryStudentLiveCourse")
+    Observable<BaseResponse<LiveCourseListBean>> getLiveCourses(@Body RequestBody body);
+
+    /**
+     * 我的课程-查询视频课
+     *
+     * @param
+     * @return
+     */
+    @POST(STUDENT_GROUP + "videoLesson/selectGroup")
+    Observable<BaseResponse<VideoCourseListBean>> getVideoCourses(@Body RequestBody body);
+
+    /**
+     * 获取声部搜索下拉框
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "student/querySubjectItem")
+    Observable<BaseResponse<List<QuerySubjectBean>>> querySubjectItem();
+
+    /**
+     * 课后作业
+     *
+     * @param body
+     * @return
+     */
+    @POST(STUDENT_GROUP + "homework/list")
+    Observable<BaseResponse<HomeworkListBean>> queryHomeworkList(@Body RequestBody body);
+
+    /**
+     * 获取所有消息列表
+     *
+     * @param body
+     * @return
+     */
+    @POST(STUDENT_GROUP + "sysMessage/list")
+    Observable<BaseResponse<SystemMessageBean>> sysMessageList(@Body RequestBody body);
+    /**
+     * 一键已读
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "sysMessage/batchSetRead")
+    Observable<BaseResponse<Object>> batchSetRead();
+
+    /**
+     * 设置已读
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "sysMessage/setRead/{id}")
+    Observable<BaseResponse<Object>> setCurrentRead(@Path("id") long id);
+
+    /**
+     * 查询用户未读消息条数
+     *
+     * @return
+     */
+    @GET(STUDENT_GROUP + "sysMessage/queryCountOfUnread")
+    Observable<BaseResponse<List<CountOfUnreadBean>>> queryCountOfUnread();
+
+    /**
+     * 根据月份获取老师该月有课的日期
+     *
+     * @param
+     * @return
+     */
+    @POST(STUDENT_GROUP + "courseSchedule/queryCourseScheduleStudent")
+    Observable<BaseResponse<List<String>>> getCourseScheduleDateByMonth(@Body RequestBody body);
+
+    /**
+     * 根据日期获取老师当日排课
+     *
+     * @param
+     * @return
+     */
+    @POST(STUDENT_GROUP + "courseSchedule/queryCourseTeacher")
+    Observable<BaseResponse<CourseTableDataBean>> getCourseSchedulesWithDate(@Body RequestBody body);
+
 }

+ 12 - 0
student/src/main/java/com/cooleshow/student/bean/CountOfUnreadBean.java

@@ -0,0 +1,12 @@
+package com.cooleshow.student.bean;
+
+/**
+ * 创建日期:2022/5/25 10:15
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class CountOfUnreadBean {
+    public Object key;
+    public Object value;
+}

+ 14 - 0
student/src/main/java/com/cooleshow/student/bean/CourseFilterStatusBean.java

@@ -0,0 +1,14 @@
+package com.cooleshow.student.bean;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class CourseFilterStatusBean {
+    public String value;
+    public String showText;
+
+    public CourseFilterStatusBean(String value, String showText) {
+        this.value = value;
+        this.showText = showText;
+    }
+}

+ 65 - 0
student/src/main/java/com/cooleshow/student/bean/CourseTableDataBean.java

@@ -0,0 +1,65 @@
+package com.cooleshow.student.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/21.
+ */
+public class CourseTableDataBean {
+
+    /**
+     * sysConfig : {"liveEndTime":"10","practiceStartTime":"5","practiceEndTime":"5","liveStartTime":"20"}
+     * studentList : [{"endTime":"2022-03-26 12:24:57","status":"COMPLETE","startTime":"2022-03-26 11:24:53","userId":"44","subjectId":1,"courseGoupId":1,"avatar":"","courseType":"PRACTICE","subjectName":"西洋管乐","courseId":1,"classDate":"2022-03-26 00:00:00","cover":"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","payCount":"","name":"cy"}]
+     */
+
+    public SysConfigBean sysConfig;
+    public List<StudentListBean> studentList;
+
+    public static class SysConfigBean {
+        /**
+         * liveEndTime : 10
+         * practiceStartTime : 5
+         * practiceEndTime : 5
+         * liveStartTime : 20
+         */
+
+        public String liveEndTime;
+        public String practiceStartTime;
+        public String practiceEndTime;
+        public String liveStartTime;
+    }
+
+    public static class StudentListBean {
+        /**
+         * endTime : 2022-03-26 12:24:57
+         * status : COMPLETE
+         * startTime : 2022-03-26 11:24:53
+         * userId : 44
+         * subjectId : 1
+         * courseGoupId : 1
+         * avatar :
+         * courseType : PRACTICE
+         * subjectName : 西洋管乐
+         * courseId : 1
+         * classDate : 2022-03-26 00:00:00
+         * cover : https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
+         * payCount :
+         * name : cy
+         */
+
+        public String endTime;
+        public String status;
+        public String startTime;
+        public String userId;
+        public int subjectId;
+        public int courseGoupId;
+        public String avatar;
+        public String courseType;
+        public String subjectName;
+        public int courseId;
+        public String classDate;
+        public String cover;
+        public String payCount;
+        public String name;
+    }
+}

+ 57 - 0
student/src/main/java/com/cooleshow/student/bean/HomeworkListBean.java

@@ -0,0 +1,57 @@
+package com.cooleshow.student.bean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/23 11:09
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeworkListBean {
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public List<RowsBean> rows;
+
+    public static class RowsBean {
+        /*
+
+
+        	"absenteeism": "",
+                    "classDate": "",
+                    "courseGroupId": 0,
+                    "courseId": 0,
+                    "decorateTime": "",
+                    "endTime": "",
+                    "startTime": "",
+                    "studentAvatar": "",
+                    "studentId": 0,
+                    "studentName": "",
+                    "subjectName": "",
+                    "submitTime": "",
+                    "teacherAvatar": "",
+                    "teacherId": 0,
+                    "teacherName": ""
+         */
+        public String absenteeism;
+        public String classDate;
+        public int courseGroupId;
+        public int courseId;
+        public String decorateTime;
+        public String endTime;
+        public String studentAvatar;
+        public int studentId;
+        public String studentName;
+        public String subjectName;
+        public String submitTime;
+        public String teacherAvatar;
+        public int teacherId;
+        public String teacherName;
+
+    }
+}

+ 80 - 0
student/src/main/java/com/cooleshow/student/bean/LiveCourseListBean.java

@@ -0,0 +1,80 @@
+package com.cooleshow.student.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class LiveCourseListBean {
+
+    /**
+     * footer : [{"backgroundPic":"","courseGroupId":0,"courseGroupName":"","endTime":"","startTime":"","status":"","studentCount":0,"subjectName":""}]
+     * limit : 0
+     * nextPage : 0
+     * offset : 0
+     * pageNo : 0
+     * prePage : 0
+     * rows : [{"backgroundPic":"","courseGroupId":0,"courseGroupName":"","endTime":"","startTime":"","status":"","studentCount":0,"subjectName":""}]
+     * statInfo : {}
+     * total : 0
+     * totalPage : 0
+     */
+
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public StatInfoBean statInfo;
+    public int total;
+    public int totalPage;
+    public List<FooterBean> footer;
+    public List<RowsBean> rows;
+
+    public static class StatInfoBean {
+    }
+
+    public static class FooterBean {
+        /**
+         * backgroundPic :
+         * courseGroupId : 0
+         * courseGroupName :
+         * endTime :
+         * startTime :
+         * status :
+         * studentCount : 0
+         * subjectName :
+         */
+
+        public String backgroundPic;
+        public int courseGroupId;
+        public String courseGroupName;
+        public String endTime;
+        public String startTime;
+        public String status;
+        public int studentCount;
+        public String subjectName;
+    }
+
+    public static class RowsBean {
+        /**
+         * backgroundPic :
+         * courseGroupId : 0
+         * courseGroupName :
+         * endTime :
+         * startTime :
+         * status :
+         * studentCount : 0
+         * subjectName :
+         */
+
+        public String backgroundPic;
+        public int courseGroupId;
+        public String courseGroupName;
+        public String endTime;
+        public String startTime;
+        public String status;
+        public String studentCount;
+        public String subjectName;
+    }
+}

+ 53 - 0
student/src/main/java/com/cooleshow/student/bean/PracticeCourseListBean.java

@@ -0,0 +1,53 @@
+package com.cooleshow.student.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 10:26
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PracticeCourseListBean {
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public ArrayList<RowsBean> rows;
+
+    public static class RowsBean{
+        /*
+        	"avatar": "",
+				"classDate": "",
+				"courseGoupId": 0,
+				"courseId": 0,
+				"endTime": "",
+				"id": 0,
+				"realName": "",
+				"signInTime": "",
+				"startTime": "",
+				"status": "",
+				"subjectId": 0,
+				"subjectName": "",
+				"userId": 0,
+				"userName": ""
+         */
+        public String avatar;
+        public String classDate;
+        public String courseGoupId;
+        public String courseId;
+        public String endTime;
+        public int id;
+        public String signInTime;
+        public String startTime;
+        public String status;
+        public int subjectId;
+        public String subjectName;
+        public String userId;//学生ID
+        public String userName;//学生名称
+    }
+}

+ 65 - 0
student/src/main/java/com/cooleshow/student/bean/QuerySubjectBean.java

@@ -0,0 +1,65 @@
+package com.cooleshow.student.bean;
+
+import com.contrarywind.interfaces.IPickerViewData;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 11:53
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class QuerySubjectBean implements IPickerViewData {
+    /*
+    	"code": "",
+			"createTime": "",
+			"delFlag": true,
+			"desc": "",
+			"id": 0,
+			"img": "",
+			"name": "",
+			"parentSubjectId": 0,
+			"parentSubjectName": "",
+			"subjects": [
+				{
+					"code": "",
+					"createTime": "",
+					"delFlag": true,
+					"desc": "",
+					"id": 0,
+					"img": "",
+					"name": "",
+					"parentSubjectId": 0,
+					"parentSubjectName": "",
+					"subjects": [
+						{}
+					],
+					"updateTime": ""
+				}
+			],
+			"updateTime": ""
+     */
+
+    public QuerySubjectBean(String name,int id) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public String code;
+    public String createTime;
+    public boolean delFlag;
+    public String desc;
+    public int id;
+    public String img;
+    public String name;
+    public int parentSubjectId;
+    public String parentSubjectName;
+    public List<QuerySubjectBean> subjects;
+    public String updateTime;
+
+    @Override
+    public String getPickerViewText() {
+        return name;
+    }
+}

+ 59 - 0
student/src/main/java/com/cooleshow/student/bean/SystemMessageBean.java

@@ -0,0 +1,59 @@
+package com.cooleshow.student.bean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/24 13:41
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class SystemMessageBean {
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public List<RowsBean> rows;
+
+    public static class RowsBean {
+        /*
+        	"clientId": "",
+				"content": "",
+				"createOn": "",
+				"errorMsg": "",
+				"group": "",
+				"id": 0,
+				"memo": "",
+				"messageConfigId": 0,
+				"modifyOn": "",
+				"readStatus": 0,
+				"receiver": "",
+				"sendTime": "",
+				"status": "",
+				"subType": "",
+				"title": "",
+				"type": "",
+				"userId": 0
+         */
+        public String clientId;
+        public String content;
+        public String createOn;
+        public String errorMsg;
+        public String group;
+        public long id;
+        public String memo;
+        public long messageConfigId;
+        public String modifyOn;
+        public int readStatus;
+        public String receiver;
+        public String sendTime;
+        public String status;
+        public String subType;
+        public String title;
+        public String type;
+        public long userId;
+    }
+}

+ 90 - 0
student/src/main/java/com/cooleshow/student/bean/VideoCourseListBean.java

@@ -0,0 +1,90 @@
+package com.cooleshow.student.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class VideoCourseListBean {
+
+    /**
+     * footer : [{"auditId":0,"auditName":"","auditStatus":"","avatar":"","countStudent":0,"createTime":"","hotFlag":0,"id":0,"lessonCount":0,"lessonCoverUrl":"","lessonDesc":"","lessonName":"","lessonPrice":0,"lessonSubject":"","lessonSubjectName":"","lessonTag":"","sortNumber":0,"teacherId":0,"topFlag":0,"updateTime":"","username":""}]
+     * limit : 0
+     * nextPage : 0
+     * offset : 0
+     * pageNo : 0
+     * prePage : 0
+     * rows : [{"auditId":0,"auditName":"","auditStatus":"","avatar":"","countStudent":0,"createTime":"","hotFlag":0,"id":0,"lessonCount":0,"lessonCoverUrl":"","lessonDesc":"","lessonName":"","lessonPrice":0,"lessonSubject":"","lessonSubjectName":"","lessonTag":"","sortNumber":0,"teacherId":0,"topFlag":0,"updateTime":"","username":""}]
+     * statInfo : {}
+     * total : 0
+     * totalPage : 0
+     */
+
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public List<RowsBean> rows;
+
+
+
+
+    public static class RowsBean {
+        /**
+         * auditId : 0
+         * auditName :
+         * auditStatus :
+         * avatar :
+         * countStudent : 0
+         * createTime :
+         * hotFlag : 0
+         * id : 0
+         * lessonCount : 0
+         * lessonCoverUrl :
+         * lessonDesc :
+         * lessonName :
+         * lessonPrice : 0
+         * lessonSubject :
+         * lessonSubjectName :
+         * lessonTag :
+         * sortNumber : 0
+         * teacherId : 0
+         * topFlag : 0
+         * updateTime :
+         * username :
+         */
+
+        /*
+        	"avatar": "",
+				"countStudent": 0,
+				"id": 0,
+				"lessonCount": 0,
+				"lessonCoverUrl": "",
+				"lessonDesc": "",
+				"lessonName": "",
+				"lessonPrice": 0,
+				"lessonSubject": "",
+				"lessonSubjectName": "",
+				"realName": "",
+				"teacherId": 0,
+				"userName": ""
+         */
+        public String avatar;
+        public int countStudent;
+        public int id;
+        public int lessonCount;
+        public String lessonCoverUrl;
+        public String lessonDesc;
+        public String lessonName;
+        public double lessonPrice;
+        public String lessonSubject;
+        public String lessonSubjectName;
+        public String realName;
+        public int teacherId;
+        public String username;
+
+    }
+}

+ 18 - 0
student/src/main/java/com/cooleshow/student/constants/CourseConstants.java

@@ -0,0 +1,18 @@
+package com.cooleshow.student.constants;
+
+public class CourseConstants {
+    public static final String COURSE_FILTER_ALL = "";//全部
+    public static final String COURSE_FILTER_HAS_NOT_STARTED = "NOT_START";//未开始
+    public static final String COURSE_FILTER_IN_PROGRESS = "ING";//进行中
+    public static final String COURSE_FILTER_COMPLETED = "COMPLETE";//已完成
+
+    public static final String COURSE_STATUS_NOT_START = "NOT_START";//课程未开始
+    public static final String COURSE_STATUS_ING = "ING";//课程进行中
+    public static final String COURSE_STATUS_COMPLETE = "COMPLETE";//课程已结束
+
+    public static final int COURSE_HOMEWORK_SET = 1;//课程已布置课后作业
+    public static final int COURSE_HOMEWORK_NO_SET = 0;//课程未布置课后作业
+
+    public static final int COURSE_HOMEWORK_STU_SUBMIT = 1;//学员已提交课后作业
+    public static final int COURSE_HOMEWORK_STU_NO_SUBMIT = 0;//学员未提交课后作业
+}

+ 23 - 0
student/src/main/java/com/cooleshow/student/constants/CourseTableContract.java

@@ -0,0 +1,23 @@
+package com.cooleshow.student.constants;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.CourseTableDataBean;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface CourseTableContract {
+
+    interface CourseTableView extends BaseView {
+        void onGetCourseDateByMonthSuccess(List<String> datas);
+        void onGetCourseSchedulesWithDateSuccess(CourseTableDataBean courseTableDataBean);
+    }
+
+    interface Presenter {
+        void getCourseScheduleDateByMonth(String month);
+        void getCourseSchedulesWithDate(Date date);
+    }
+}

+ 3 - 3
student/src/main/java/com/cooleshow/student/contract/CourseTableContract.java → student/src/main/java/com/cooleshow/student/contract/HomeWorkActContract.java

@@ -3,13 +3,13 @@ package com.cooleshow.student.contract;
 import com.cooleshow.base.presenter.view.BaseView;
 
 /**
- * 创建日期:2022/5/26 10:15
+ * 创建日期:2022/5/23 10:50
  *
  * @author Ryan
  * 类说明:
  */
-public interface CourseTableContract {
-    interface CourseTableView extends BaseView {
+public interface HomeWorkActContract {
+    interface HomeWorkActView extends BaseView {
     }
 
     interface Presenter {

+ 21 - 0
student/src/main/java/com/cooleshow/student/contract/HomeWorkContract.java

@@ -0,0 +1,21 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.HomeworkListBean;
+
+/**
+ * 创建日期:2022/5/23 11:00
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface HomeWorkContract {
+    interface HomeWorkView extends BaseView {
+        void queryHomeworkListSuccess(int page, HomeworkListBean data);
+
+        void queryHomeworkListError(int page);
+    }
+
+    interface Presenter {
+    }
+}

+ 25 - 0
student/src/main/java/com/cooleshow/student/contract/LiveCourseContract.java

@@ -0,0 +1,25 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.LiveCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface LiveCourseContract {
+
+    interface LiveCourseView extends BaseView {
+        void onGetLiveCourseSuccess(int page, LiveCourseListBean liveCourseListBean);
+
+        void onGetCourseError(int page);
+
+        void querySubjectItemSuccess(List<QuerySubjectBean> data);
+    }
+
+    interface Presenter {
+        void queryLiveCourse(boolean isShowLoading, String month, String status, int subjectId, int page);
+    }
+}

+ 28 - 0
student/src/main/java/com/cooleshow/student/contract/MessageBoxContract.java

@@ -0,0 +1,28 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.CountOfUnreadBean;
+import com.cooleshow.student.bean.SystemMessageBean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/24 11:52
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface MessageBoxContract {
+    interface MessageBoxView extends BaseView {
+        void sysMessageListSuccess(int page, SystemMessageBean data);
+
+        void sysMessageListError(int page);
+
+        void setCurrentReadSuccess(long id);
+
+        void queryCountOfUnreadSuccess(List<CountOfUnreadBean> data);
+    }
+
+    interface Presenter {
+    }
+}

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

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

+ 27 - 0
student/src/main/java/com/cooleshow/student/contract/MinePracticeCourseContract.java

@@ -0,0 +1,27 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.PracticeCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 10:33
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface MinePracticeCourseContract {
+    interface MinePracticeCourseView extends BaseView {
+        void onGetPracticeCourseSuccess(int page, PracticeCourseListBean sparringCourseBean);
+
+        void onGetCourseError(int page);
+
+        void querySubjectItemSuccess(List<QuerySubjectBean> data);
+    }
+
+    interface Presenter {
+        void queryPracticeCourse(boolean isShowLoading, String month, String status, int subjectId, int page);
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.VideoCourseListBean;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface VideoCourseContract {
+
+    interface VideoCourseView extends BaseView {
+        void onGetVideoCourseSuccess(int page, VideoCourseListBean liveCourseListBean);
+
+        void onGetCourseError(int page);
+    }
+
+    interface Presenter {
+        void queryVideoCourse(boolean isShowLoading,int subjectId, int page);
+    }
+}

+ 75 - 0
student/src/main/java/com/cooleshow/student/presenter/course/LiveCoursePresenter.java

@@ -0,0 +1,75 @@
+package com.cooleshow.student.presenter.course;
+
+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.LiveCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.LiveCourseContract;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.List;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class LiveCoursePresenter extends BasePresenter<LiveCourseContract.LiveCourseView> implements LiveCourseContract.Presenter {
+
+    @Override
+    public void queryLiveCourse(boolean isShowLoading, String month, String status, int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("classDate", month);
+            jsonObject.putOpt("status", status);
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getLiveCourses(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<LiveCourseListBean>(getView()) {
+            @Override
+            protected void onSuccess(LiveCourseListBean data) {
+                if (getView() != null) {
+                    getView().onGetLiveCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+
+    public void querySubjectItem() {
+        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<QuerySubjectBean> data) {
+                if (getView() != null) {
+                    getView().querySubjectItemSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+}

+ 14 - 0
student/src/main/java/com/cooleshow/student/presenter/course/MineCoursePresenter.java

@@ -0,0 +1,14 @@
+package com.cooleshow.student.presenter.course;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.student.contract.MineCourseContract;
+
+/**
+ * 创建日期:2022/5/30 9:25
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MineCoursePresenter extends BasePresenter<MineCourseContract.MineCourseView> implements MineCourseContract.Presenter {
+
+}

+ 76 - 0
student/src/main/java/com/cooleshow/student/presenter/course/MinePracticeCoursePresenter.java

@@ -0,0 +1,76 @@
+package com.cooleshow.student.presenter.course;
+
+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.PracticeCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.MinePracticeCourseContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 10:33
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MinePracticeCoursePresenter extends BasePresenter<MinePracticeCourseContract.MinePracticeCourseView> implements MinePracticeCourseContract.Presenter {
+
+    @Override
+    public void queryPracticeCourse(boolean isShowLoading, String month, String status, int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("classMonth", month);
+            jsonObject.putOpt("status", status);
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).queryStudentPracticeCourse(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<PracticeCourseListBean>(getView()) {
+            @Override
+            protected void onSuccess(PracticeCourseListBean data) {
+                if (getView() != null) {
+                    getView().onGetPracticeCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+
+    public void querySubjectItem() {
+        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<QuerySubjectBean> data) {
+                if (getView() != null) {
+                    getView().querySubjectItemSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+}

+ 52 - 0
student/src/main/java/com/cooleshow/student/presenter/course/VideoCoursePresenter.java

@@ -0,0 +1,52 @@
+package com.cooleshow.student.presenter.course;
+
+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.VideoCourseListBean;
+import com.cooleshow.student.contract.VideoCourseContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class VideoCoursePresenter extends BasePresenter<VideoCourseContract.VideoCourseView> implements VideoCourseContract.Presenter {
+
+    @Override
+    public void queryVideoCourse(boolean isShowLoading, int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getVideoCourses(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<VideoCourseListBean>(getView()) {
+            @Override
+            protected void onSuccess(VideoCourseListBean data) {
+                if (getView() != null) {
+                    getView().onGetVideoCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+}

+ 14 - 0
student/src/main/java/com/cooleshow/student/presenter/homework/HomeWorkActPresenter.java

@@ -0,0 +1,14 @@
+package com.cooleshow.student.presenter.homework;
+
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.student.contract.HomeWorkActContract;
+
+
+/**
+ * 创建日期:2022/5/23 10:49
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeWorkActPresenter extends BasePresenter<HomeWorkActContract.HomeWorkActView> implements HomeWorkActContract.Presenter {
+}

+ 60 - 0
student/src/main/java/com/cooleshow/student/presenter/homework/HomeWorkPresenter.java

@@ -0,0 +1,60 @@
+package com.cooleshow.student.presenter.homework;
+
+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.HomeworkListBean;
+import com.cooleshow.student.contract.HomeWorkContract;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 创建日期:2022/5/23 10:59
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeWorkPresenter extends BasePresenter<HomeWorkContract.HomeWorkView> implements HomeWorkContract.Presenter {
+    public void queryHomeworkList(boolean isLoading,int page,String submit,String date){
+        if (isLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("submit",submit);
+            jsonObject.put("date",date);
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).queryHomeworkList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<HomeworkListBean>(getView()) {
+            @Override
+            protected void onSuccess(HomeworkListBean data) {
+                if (getView() != null) {
+                    getView().queryHomeworkListSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().queryHomeworkListError(page);
+                }
+            }
+        });
+    }
+
+
+}

+ 64 - 5
student/src/main/java/com/cooleshow/student/presenter/main/CourseTablePresenter.java

@@ -1,14 +1,73 @@
 package com.cooleshow.student.presenter.main;
 
 import com.cooleshow.base.presenter.BasePresenter;
-import com.cooleshow.student.contract.CourseTableContract;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.CourseTableDataBean;
+import com.cooleshow.student.constants.CourseTableContract;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Date;
+import java.util.List;
 
 /**
- * 创建日期:2022/5/26 10:15
- *
- * @author Ryan
- * 类说明:
+ * Author by pq, Date on 2022/4/21.
  */
 public class CourseTablePresenter extends BasePresenter<CourseTableContract.CourseTableView> implements CourseTableContract.Presenter {
+    /**
+     * 查询当月有课的日期
+     *
+     * @param month
+     */
+    @Override
+    public void getCourseScheduleDateByMonth(String month) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("classMonth", month);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getCourseScheduleDateByMonth(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<String>>(getView()) {
+            @Override
+            protected void onSuccess(List<String> data) {
+                if (getView() != null) {
+                    getView().onGetCourseDateByMonthSuccess(data);
+                }
+            }
+        });
+    }
 
+    /**
+     * 查询当天的课程
+     *
+     * @param date
+     */
+    @Override
+    public void getCourseSchedulesWithDate(Date date) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("classDate", TimeUtils.date2String(date, TimeUtils.getSafeDateFormat("yyyy-MM-dd")));
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getCourseSchedulesWithDate(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<CourseTableDataBean>(getView()) {
+            @Override
+            protected void onSuccess(CourseTableDataBean data) {
+                if (getView() != null) {
+                    getView().onGetCourseSchedulesWithDateSuccess(data);
+                }
+            }
+        });
+    }
 }

+ 139 - 0
student/src/main/java/com/cooleshow/student/presenter/message/MessageBoxPresenter.java

@@ -0,0 +1,139 @@
+package com.cooleshow.student.presenter.message;
+
+import android.text.TextUtils;
+
+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.CountOfUnreadBean;
+import com.cooleshow.student.bean.SystemMessageBean;
+import com.cooleshow.student.contract.MessageBoxContract;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/24 11:52
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MessageBoxPresenter extends BasePresenter<MessageBoxContract.MessageBoxView> implements MessageBoxContract.Presenter {
+
+
+    public void sysMessageList(boolean isLoading, int page, String group) {
+        if (isLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (!TextUtils.isEmpty(group)) {
+                jsonObject.put("group", group);
+            }
+            //消息类型;1,表示短信;2,表示邮件; 3,app推送消息
+            jsonObject.put("type", 3);
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).sysMessageList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SystemMessageBean>(getView()) {
+            @Override
+            protected void onSuccess(SystemMessageBean data) {
+                if (getView() != null) {
+                    getView().sysMessageListSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().sysMessageListError(page);
+                }
+            }
+        });
+    }
+
+    public void batchSetRead() {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).batchSetRead(), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+
+    public void setCurrentRead(long id){
+        getView().showLoading();
+        addSubscribe(create(APIService.class).setCurrentRead(id), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().setCurrentReadSuccess(id);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+
+
+    public void queryCountOfUnread() {
+        getView().showLoading();
+        addSubscribe(create(APIService.class).queryCountOfUnread(), new BaseObserver<List<CountOfUnreadBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<CountOfUnreadBean> data) {
+                if (getView() != null) {
+                    getView().queryCountOfUnreadSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
+}

+ 362 - 0
student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java

@@ -0,0 +1,362 @@
+package com.cooleshow.student.ui.course;
+
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.utils.PopupUtil;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
+import com.cooleshow.student.adapter.LiveCourseListAdapter;
+import com.cooleshow.student.bean.CourseFilterStatusBean;
+import com.cooleshow.student.bean.LiveCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.constants.CourseConstants;
+import com.cooleshow.student.contract.LiveCourseContract;
+import com.cooleshow.student.databinding.FragmentLiveCourseLayoutBinding;
+import com.cooleshow.student.presenter.course.LiveCoursePresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayoutBinding, LiveCoursePresenter> implements LiveCourseContract.LiveCourseView, View.OnClickListener {
+    private String currentCourseFilterStatus = CourseConstants.COURSE_FILTER_ALL;
+    private String currentFilterDate;
+    private Date currentSelectDate;
+    private int currentSubjectId;
+    private int currentPage;
+    private LiveCourseListAdapter mAdapter;
+    private EmptyViewLayout mEmptyView;
+    private TextView mTvEmptyTip;
+    private ImageView mEmptyIcon;
+    private TimePickerView pvTime;
+    private PopupWindow mPopupWindow;
+    private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
+    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private boolean hasNext = true;
+
+    public static LiveCourseFragment newInstance() {
+        LiveCourseFragment fragment = new LiveCourseFragment();
+        return fragment;
+    }
+    @Override
+    protected FragmentLiveCourseLayoutBinding getLayoutView() {
+        return FragmentLiveCourseLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected LiveCoursePresenter createPresenter() {
+        return new LiveCoursePresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+        mViewBinding.tvTime.setOnClickListener(this);
+        mViewBinding.tvCourseStatus.setOnClickListener(this);
+        mViewBinding.tvAgency.setOnClickListener(this);
+    }
+
+    private void buildDefaultCourseStatusFilterList() {
+        mCourseFilterStatusBeans = new ArrayList<>();
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_HAS_NOT_STARTED, "未开始"));
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_IN_PROGRESS, "进行中"));
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_COMPLETED, "已结束"));
+    }
+
+    private void reBuildFilter(Date date, String status) {
+        currentSelectDate = date != null ? date : TimeUtils.getNowDate();
+        String targetDateTimeStr = TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"));
+        if (TextUtils.equals(targetDateTimeStr, currentFilterDate) && TextUtils.equals(currentCourseFilterStatus, status)) {
+            //防止重复条件触发
+            return;
+        }
+        currentFilterDate = targetDateTimeStr;
+        currentCourseFilterStatus = !TextUtils.isEmpty(status) ? status : CourseConstants.COURSE_FILTER_ALL;
+        currentPage = 1;
+        mViewBinding.tvTime.setText(currentFilterDate);
+        queryCourse(true);
+    }
+
+    @Override
+    protected void initData() {
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                queryCourse(true);
+            }
+        });
+
+        mAdapter = new LiveCourseListAdapter(R.layout.item_live_course_list_layout);
+//        mAdapter.getLoadMoreModule().setEnableLoadMoreIfNotFullPage(false);
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    queryCourse(false);
+                } else {
+                    mAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
+        mViewBinding.recyclerView.setAdapter(mAdapter);
+
+        buildDefaultCourseStatusFilterList();
+        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        presenter.querySubjectItem();
+    }
+
+    private void queryCourse(boolean isShowLoading) {
+        //根据默认筛选条件查询
+        LogUtils.i("pq", "currentFilterDate:" + currentFilterDate);
+        LogUtils.i("pq", "currentCourseFilterStatus:" + currentCourseFilterStatus);
+        LogUtils.i("pq", "currentSubjectId:" + currentSubjectId);
+        LogUtils.i("pq", "currentPage:" + currentPage);
+        presenter.queryLiveCourse(isShowLoading, currentFilterDate, currentCourseFilterStatus, currentSubjectId, currentPage);
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+
+    @Override
+    public void onGetLiveCourseSuccess(int page, LiveCourseListBean liveCourseListBean) {
+        if (isDetached()) {
+            return;
+        }
+        if (liveCourseListBean != null) {
+            if (page == 1) {
+                //第一页
+                mViewBinding.refreshLayout.finishRefresh();
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (liveCourseListBean.rows != null && liveCourseListBean.rows.size() > 0) {
+                        checkHasNext(liveCourseListBean.rows.size());
+                        mAdapter.setNewInstance(liveCourseListBean.rows);
+                    } else {
+                        showEmptyView();
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (liveCourseListBean.rows != null && liveCourseListBean.rows.size() > 0) {
+                        mAdapter.getLoadMoreModule().loadMoreComplete();
+                        checkHasNext(liveCourseListBean.rows.size());
+                        mAdapter.addData(liveCourseListBean.rows);
+                    } else {
+                        mAdapter.getLoadMoreModule().loadMoreEnd();
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onGetCourseError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    private void showEmptyView() {
+        if (mEmptyView == null) {
+            mEmptyView = new EmptyViewLayout(getContext());
+        }
+        mEmptyView.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程~");
+        mAdapter.setEmptyView(mEmptyView);
+    }
+
+
+    private void showTimeSelectPicker() {
+        if (pvTime == null) {
+            pvTime = new TimePickerBuilder(requireContext(), (date, v) -> {//选中事件回调
+                reBuildFilter(date, currentCourseFilterStatus);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_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) {
+                            pvTime.returnData();
+                            pvTime.dismiss();
+                        }
+                    });
+                    ivCancel.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            pvTime.dismiss();
+                        }
+                    });
+
+                }
+            })
+                    .setLineSpacingMultiplier(2.5f)
+                    .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
+                    .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
+                    .isDialog(false)//是否显示为对话框样式
+                    .setLabel("年", "月", "", "", "", "")
+                    .build();
+        }
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentSelectDate);
+        pvTime.setDate(calendar);
+        if (!pvTime.isShowing()) {
+            pvTime.show();
+        }
+    }
+
+    private void initPopu(View targetView) {
+        if (mPopupWindow == null) {
+            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
+            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
+            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
+            bg.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (mPopupWindow != null) {
+                        mPopupWindow.dismiss();
+                    }
+                }
+            });
+            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
+            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
+                @Override
+                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                    Object object = mCourseStatusFilterAdapter.getData().get(position);
+                    if (object instanceof CourseFilterStatusBean) {
+                        if (mCourseStatusFilterAdapter != null) {
+                            mCourseStatusFilterAdapter.setSelect(position);
+                        }
+                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
+                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
+                        reBuildFilter(currentSelectDate, filterStatusBean.value);
+                    }
+                    mPopupWindow.dismiss();
+                }
+            });
+            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
+            recyclerView.setAdapter(mCourseStatusFilterAdapter);
+            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
+            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
+        }
+        mPopupWindow.showAsDropDown(targetView);
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.tv_time) {
+            //时间筛选
+            showTimeSelectPicker();
+            return;
+        }
+
+        if (v.getId() == R.id.tv_course_status) {
+            //课程状态筛选
+            initPopu(mViewBinding.tvCourseStatus);
+            return;
+        }
+
+        if (v.getId()==R.id.tv_agency){
+            //选择声部
+            selectSubject();
+            return;
+        }
+    }
+
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部",0));
+        subjectBeanList.addAll(data);
+    }
+
+    private OptionsPickerView pvOptions;
+    private void selectSubject() {
+        pvOptions = new OptionsPickerBuilder(getContext(), new OnOptionsSelectListener() {
+            @Override
+            public void onOptionsSelect(int options1, int options2, int options3, View v) {
+                currentSubjectId=subjectBeanList.get(options1).id;
+                mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
+                queryCourse(true);
+            }
+        })
+                .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();
+                            }
+                        });
+
+                    }
+                })
+                .isDialog(false)
+                .build();
+        pvOptions.setPicker(subjectBeanList);
+        pvOptions.show();
+
+    }
+}

+ 78 - 0
student/src/main/java/com/cooleshow/student/ui/course/MineCourseActivity.java

@@ -0,0 +1,78 @@
+package com.cooleshow.student.ui.course;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager.widget.ViewPager;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.student.adapter.MineCoursePagerAdapter;
+import com.cooleshow.student.databinding.ActivityMineCourseBinding;
+import com.cooleshow.student.presenter.course.MineCoursePresenter;
+import com.google.android.material.tabs.TabLayout;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/30 9:21
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.CourseCenter.TEACHER_MINE_COURSE)
+public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBinding, MineCoursePresenter> {
+
+
+    private TabLayout tabLayout;
+    private ViewPager viewPager;
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "我的课程");
+        tabLayout = viewBinding.tablayout;
+        viewPager = viewBinding.viewpager;
+        viewPager.setCurrentItem(0);
+    }
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+    @Override
+    protected ActivityMineCourseBinding getLayoutView() {
+        return ActivityMineCourseBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MineCoursePresenter createPresenter() {
+        return new MineCoursePresenter();
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        initTabLayoutAndViewPager();
+    }
+
+    private List<String> titles = new ArrayList<String>(Arrays.asList("陪练课", "直播课", "视频课"));
+    private List<Fragment> fragments = new ArrayList<>();
+
+    private void initTabLayoutAndViewPager() {
+        tabLayout.removeAllTabs();
+        fragments.clear();
+        fragments.add(MinePracticeCourseFragment.newInstance());
+        fragments.add(LiveCourseFragment.newInstance());
+        fragments.add(VideoCourseFragment.newInstance());
+        viewPager.setAdapter(new MineCoursePagerAdapter(getSupportFragmentManager(), fragments, titles));
+        tabLayout.setupWithViewPager(viewPager);
+
+    }
+
+
+}

+ 370 - 0
student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java

@@ -0,0 +1,370 @@
+package com.cooleshow.student.ui.course;
+
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.utils.PopupUtil;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
+import com.cooleshow.student.adapter.PracticeCourseListAdapter;
+import com.cooleshow.student.bean.CourseFilterStatusBean;
+import com.cooleshow.student.bean.PracticeCourseListBean;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.constants.CourseConstants;
+import com.cooleshow.student.contract.MinePracticeCourseContract;
+import com.cooleshow.student.databinding.FragmentPracticeCourseLayoutBinding;
+import com.cooleshow.student.presenter.course.MinePracticeCoursePresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 10:29
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPracticeCourseLayoutBinding, MinePracticeCoursePresenter> implements MinePracticeCourseContract.MinePracticeCourseView, View.OnClickListener {
+    private String currentCourseFilterStatus = CourseConstants.COURSE_FILTER_ALL;
+    private String currentFilterDate;
+    private Date currentSelectDate;
+    private int currentSubjectId;
+    private int currentPage;
+    private boolean hasNext = true;
+    private PracticeCourseListAdapter mAdapter;
+    private EmptyViewLayout mEmptyView;
+    private TimePickerView pvTime;
+    private PopupWindow mPopupWindow;
+    private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
+    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+
+
+    public static MinePracticeCourseFragment newInstance() {
+        MinePracticeCourseFragment fragment = new MinePracticeCourseFragment();
+        return fragment;
+    }
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.tv_time:
+                //时间筛选
+                showTimeSelectPicker();
+                break;
+            case R.id.tv_course_status:
+                //课程状态筛选
+                initPopu(mViewBinding.tvCourseStatus);
+                break;
+            case R.id.tv_agency:
+                selectSubject();
+                break;
+        }
+    }
+
+    @Override
+    protected FragmentPracticeCourseLayoutBinding getLayoutView() {
+        return FragmentPracticeCourseLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MinePracticeCoursePresenter createPresenter() {
+        return new MinePracticeCoursePresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+        mViewBinding.tvTime.setOnClickListener(this);
+        mViewBinding.tvCourseStatus.setOnClickListener(this);
+        mViewBinding.tvAgency.setOnClickListener(this);
+    }
+
+    private void buildDefaultCourseStatusFilterList() {
+        mCourseFilterStatusBeans = new ArrayList<>();
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_HAS_NOT_STARTED, "未开始"));
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_IN_PROGRESS, "进行中"));
+        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_COMPLETED, "已结束"));
+    }
+
+    private void reBuildFilter(Date date, String status) {
+        currentSelectDate = date != null ? date : TimeUtils.getNowDate();
+        String targetDateTimeStr = TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"));
+        if (TextUtils.equals(targetDateTimeStr, currentFilterDate) && TextUtils.equals(currentCourseFilterStatus, status)) {
+            //防止重复条件触发
+            return;
+        }
+        currentFilterDate = targetDateTimeStr;
+        currentCourseFilterStatus = !TextUtils.isEmpty(status) ? status : CourseConstants.COURSE_FILTER_ALL;
+        currentPage = 1;
+        Log.e("askdjhkasdfs", "reBuildFilter: ");
+        mViewBinding.tvTime.setText(currentFilterDate);
+        queryCourse(true);
+    }
+
+    @Override
+    protected void initData() {
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                queryCourse(true);
+            }
+        });
+
+        mAdapter = new PracticeCourseListAdapter(R.layout.item_sparring_course_list_layout);
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    queryCourse(false);
+                } else {
+                    mAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        mAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mAdapter.getData().size()) {
+                    PracticeCourseListBean.RowsBean rowsBean = mAdapter.getData().get(position);
+                    if (rowsBean != null) {
+
+                    }
+                }
+            }
+        });
+        mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
+        mViewBinding.recyclerView.setAdapter(mAdapter);
+        buildDefaultCourseStatusFilterList();
+        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        presenter.querySubjectItem();
+    }
+
+    private void queryCourse(boolean isShowLoading) {
+        //根据默认筛选条件查询
+        LogUtils.i("pq", "currentFilterDate:" + currentFilterDate);
+        LogUtils.i("pq", "currentCourseFilterStatus:" + currentCourseFilterStatus);
+        LogUtils.i("pq", "currentSubjectId:" + currentSubjectId);
+        LogUtils.i("pq", "currentPage:" + currentPage);
+        presenter.queryPracticeCourse(isShowLoading, currentFilterDate, currentCourseFilterStatus, currentSubjectId, currentPage);
+    }
+
+    @Override
+    public void onGetPracticeCourseSuccess(int page, PracticeCourseListBean sparringCourseBean) {
+        if (isDetached()) {
+            return;
+        }
+        if (sparringCourseBean != null) {
+            if (page == 1) {
+                //第一页
+                mViewBinding.refreshLayout.finishRefresh();
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (sparringCourseBean.rows != null && sparringCourseBean.rows.size() > 0) {
+                        checkHasNext(sparringCourseBean.rows.size());
+                        mAdapter.setNewInstance(sparringCourseBean.rows);
+                    } else {
+                        showEmptyView();
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (sparringCourseBean.rows != null && sparringCourseBean.rows.size() > 0) {
+                        mAdapter.getLoadMoreModule().loadMoreComplete();
+                        checkHasNext(sparringCourseBean.rows.size());
+                        mAdapter.addData(sparringCourseBean.rows);
+                    } else {
+                        mAdapter.getLoadMoreModule().loadMoreEnd();
+                    }
+                }
+            }
+        }
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+    @Override
+    public void onGetCourseError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部",0));
+        subjectBeanList.addAll(data);
+    }
+
+    private void showEmptyView() {
+        if (mEmptyView == null) {
+            mEmptyView = new EmptyViewLayout(getContext());
+        }
+        mEmptyView.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程~");
+        mAdapter.setEmptyView(mEmptyView);
+    }
+
+    private void showTimeSelectPicker() {
+        if (pvTime == null) {
+            pvTime = new TimePickerBuilder(requireContext(), (date, v) -> {//选中事件回调
+                reBuildFilter(date, currentCourseFilterStatus);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_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) {
+                                    pvTime.returnData();
+                                    pvTime.dismiss();
+                                }
+                            });
+                            ivCancel.setOnClickListener(new View.OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    pvTime.dismiss();
+                                }
+                            });
+
+                        }
+                    })
+                    .setLineSpacingMultiplier(2.5f)
+                    .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
+                    .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
+                    .isDialog(false)//是否显示为对话框样式
+                    .setLabel("年", "月", "", "", "", "")
+                    .build();
+        }
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentSelectDate);
+        pvTime.setDate(calendar);
+        if (!pvTime.isShowing()) {
+            pvTime.show();
+        }
+    }
+
+    private void initPopu(View targetView) {
+        if (mPopupWindow == null) {
+            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
+            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
+            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
+            bg.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (mPopupWindow != null) {
+                        mPopupWindow.dismiss();
+                    }
+                }
+            });
+            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
+            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
+                @Override
+                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                    Object object = mCourseStatusFilterAdapter.getData().get(position);
+                    if (object instanceof CourseFilterStatusBean) {
+                        if (mCourseStatusFilterAdapter != null) {
+                            mCourseStatusFilterAdapter.setSelect(position);
+                        }
+                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
+                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
+                        reBuildFilter(currentSelectDate, filterStatusBean.value);
+                    }
+                    mPopupWindow.dismiss();
+                }
+            });
+            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
+            recyclerView.setAdapter(mCourseStatusFilterAdapter);
+            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
+            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
+        }
+        mPopupWindow.showAsDropDown(targetView);
+    }
+    private OptionsPickerView pvOptions;
+    private void selectSubject() {
+        pvOptions = new OptionsPickerBuilder(getContext(), new OnOptionsSelectListener() {
+            @Override
+            public void onOptionsSelect(int options1, int options2, int options3, View v) {
+                currentSubjectId=subjectBeanList.get(options1).id;
+                mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
+                queryCourse(true);
+
+            }
+        })
+                .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();
+                            }
+                        });
+
+                    }
+                })
+                .isDialog(false)
+                .build();
+        pvOptions.setPicker(subjectBeanList);
+        pvOptions.show();
+
+    }
+}

+ 211 - 0
student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java

@@ -0,0 +1,211 @@
+package com.cooleshow.student.ui.course;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
+import com.cooleshow.student.adapter.VideoCourseListAdapter;
+import com.cooleshow.student.bean.VideoCourseListBean;
+import com.cooleshow.student.contract.VideoCourseContract;
+import com.cooleshow.student.databinding.FragmentVideoCourseLayoutBinding;
+import com.cooleshow.student.presenter.course.VideoCoursePresenter;
+import com.cooleshow.student.wxapi.VideoCourseListItemDecoration;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayoutBinding, VideoCoursePresenter> implements VideoCourseContract.VideoCourseView, View.OnClickListener {
+    private int currentSubjectId;
+    private int currentPage;
+    private VideoCourseListAdapter mAdapter;
+    private EmptyViewLayout mEmptyView;
+    private TextView mTvEmptyTip;
+    private ImageView mEmptyIcon;
+    private PopupWindow mPopupWindow;
+    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private boolean hasNext = true;
+    public static VideoCourseFragment newInstance() {
+        VideoCourseFragment fragment = new VideoCourseFragment();
+        return fragment;
+    }
+    @Override
+    protected FragmentVideoCourseLayoutBinding getLayoutView() {
+        return FragmentVideoCourseLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected VideoCoursePresenter createPresenter() {
+        return new VideoCoursePresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+    }
+
+    private void buildDefaultCourseStatusFilterList() {
+//        mCourseFilterStatusBeans = new ArrayList<>();
+//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_ALL, "全部"));
+//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_HAS_NOT_STARTED, "未开始"));
+//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_IN_PROGRESS, "进行中"));
+//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_COMPLETED, "已结束"));
+    }
+
+    private void reBuildFilter() {
+        currentPage = 1;
+        queryCourse(true);
+    }
+
+
+    @Override
+    protected void initData() {
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                refresh();
+            }
+        });
+
+        mAdapter = new VideoCourseListAdapter(R.layout.item_video_course_list_layout);
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    loadMore();
+                } else {
+                    mAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        mAdapter.getLoadMoreModule().setAutoLoadMore(true);
+        //当自动加载开启,同时数据不满一屏时,是否继续执行自动加载更多(默认为true)
+        mAdapter.getLoadMoreModule().setEnableLoadMoreIfNotFullPage(false);
+
+        GridLayoutManager gridLayoutManager = new GridLayoutManager(requireContext(), 2);
+        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
+            @Override
+            public int getSpanSize(int position) {
+                int itemViewType = mAdapter.getItemViewType(position);
+                if (itemViewType == BaseQuickAdapter.LOAD_MORE_VIEW) {
+                    return 2;
+                }
+                return 1;
+            }
+        });
+        VideoCourseListItemDecoration itemDecoration = new VideoCourseListItemDecoration(0, SizeUtils.dp2px(11), 0, SizeUtils.dp2px(11), SizeUtils.dp2px(5.5f));
+        mViewBinding.recyclerView.addItemDecoration(itemDecoration);
+        mViewBinding.recyclerView.setLayoutManager(gridLayoutManager);
+        mViewBinding.recyclerView.setAdapter(mAdapter);
+        buildDefaultCourseStatusFilterList();
+        reBuildFilter();
+    }
+
+
+    /**
+     * 刷新
+     */
+    private void refresh() {
+        // 这里的作用是防止下拉刷新的时候还可以上拉加载
+        mAdapter.getLoadMoreModule().setEnableLoadMore(false);
+        // 下拉刷新,需要重置页数
+        currentPage = 1;
+        queryCourse(true);
+    }
+
+    private void loadMore() {
+        currentPage++;
+        queryCourse(false);
+    }
+
+    private void queryCourse(boolean isShowLoading) {
+        //根据默认筛选条件查询
+        LogUtils.i("pq", "currentSubjectId:" + currentSubjectId);
+        LogUtils.i("pq", "currentPage:" + currentPage);
+        presenter.queryVideoCourse(isShowLoading, currentSubjectId, currentPage);
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+
+    @Override
+    public void onGetVideoCourseSuccess(int page, VideoCourseListBean liveCourseListBean) {
+        if (isDetached()) {
+            return;
+        }
+        if (liveCourseListBean != null) {
+            mViewBinding.refreshLayout.finishRefresh();
+            mAdapter.getLoadMoreModule().setEnableLoadMore(true);
+            if (page == 1) {
+                //第一页
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (liveCourseListBean.rows != null && liveCourseListBean.rows.size() > 0) {
+                        checkHasNext(liveCourseListBean.rows.size());
+                        mAdapter.setNewInstance(liveCourseListBean.rows);
+                    } else {
+                        showEmptyView();
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (liveCourseListBean.rows != null && liveCourseListBean.rows.size() > 0) {
+                        checkHasNext(liveCourseListBean.rows.size());
+                        mAdapter.addData(liveCourseListBean.rows);
+                        mAdapter.getLoadMoreModule().loadMoreComplete();
+                    } else {
+                        mAdapter.getLoadMoreModule().loadMoreEnd();
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onGetCourseError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mAdapter.getLoadMoreModule().setEnableLoadMore(true);
+                mAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    private void showEmptyView() {
+        if (mEmptyView == null) {
+            mEmptyView = new EmptyViewLayout(getContext());
+        }
+        mEmptyView.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程~");
+        mAdapter.setEmptyView(mEmptyView);
+    }
+
+
+    @Override
+    public void onClick(View v) {
+
+    }
+}

+ 0 - 41
student/src/main/java/com/cooleshow/student/ui/main/CourseTableFragment.java

@@ -1,41 +0,0 @@
-package com.cooleshow.student.ui.main;
-
-import android.view.View;
-
-import com.cooleshow.base.ui.fragment.BaseMVPFragment;
-import com.cooleshow.student.contract.CourseTableContract;
-import com.cooleshow.student.databinding.FragmentShopmalBinding;
-import com.cooleshow.student.presenter.main.CourseTablePresenter;
-
-/**
- * 创建日期:2022/5/26 10:14
- *
- * @author Ryan
- * 类说明:
- */
-public class CourseTableFragment extends BaseMVPFragment<FragmentShopmalBinding, CourseTablePresenter> implements CourseTableContract.CourseTableView, View.OnClickListener {
-    @Override
-    public void onClick(View view) {
-
-    }
-
-    @Override
-    protected FragmentShopmalBinding getLayoutView() {
-        return FragmentShopmalBinding.inflate(getLayoutInflater());
-    }
-
-    @Override
-    protected CourseTablePresenter createPresenter() {
-        return new CourseTablePresenter();
-    }
-
-    @Override
-    protected void initView(View rootView) {
-
-    }
-
-    @Override
-    protected void initData() {
-
-    }
-}

+ 279 - 0
student/src/main/java/com/cooleshow/student/ui/main/CourseTableFragment.kt

@@ -0,0 +1,279 @@
+package com.cooleshow.student.ui.main
+
+import android.view.MotionEvent
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.bigkoo.pickerview.builder.TimePickerBuilder
+import com.bigkoo.pickerview.listener.CustomListener
+import com.bigkoo.pickerview.listener.OnTimeSelectListener
+import com.bigkoo.pickerview.view.TimePickerView
+import com.chad.library.adapter.base.listener.OnItemClickListener
+import com.cooleshow.base.ui.fragment.BaseMVPFragment
+import com.cooleshow.base.utils.SizeUtils
+import com.cooleshow.base.utils.TimeUtils
+import com.cooleshow.base.widgets.EmptyViewLayout
+import com.cooleshow.student.R
+import com.cooleshow.student.adapter.CourseTableListAdapter
+import com.cooleshow.student.bean.CourseTableDataBean
+import com.cooleshow.student.constants.CourseTableContract
+import com.cooleshow.student.databinding.FragmentCourseTableLayoutBinding
+import com.cooleshow.student.presenter.main.CourseTablePresenter
+import com.cooleshow.student.widgets.CalendarExpandDecoration
+import com.cooleshow.student.widgets.CalendarShrinkDecoration
+import com.cooleshow.student.widgets.helper.CourseHelper
+
+import com.haibin.calendarview.CalendarView
+import kotlinx.android.synthetic.main.fragment_course_table_layout.*
+import java.util.*
+
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+class CourseTableFragment :
+    BaseMVPFragment<FragmentCourseTableLayoutBinding, CourseTablePresenter>(),
+    CalendarView.OnCalendarSelectListener,
+    CalendarView.OnCalendarInterceptListener, CalendarView.OnMonthChangeListener,
+    CalendarView.OnViewChangeListener, CourseTableContract.CourseTableView, View.OnClickListener {
+    private lateinit var currentSelectDate: Date
+    private lateinit var calendarDate: String
+    private lateinit var calendarExpandDecoration: CalendarExpandDecoration
+    private lateinit var calendarShrinkDecoration: CalendarShrinkDecoration
+    private lateinit var adapter: CourseTableListAdapter
+    private lateinit var pvTime: TimePickerView
+    private lateinit var emptyView: EmptyViewLayout
+    private lateinit var emptyText: TextView
+    private lateinit var emptyIcon: ImageView
+    private var day: Int = -1;
+
+    override fun getLayoutView(): FragmentCourseTableLayoutBinding {
+        return FragmentCourseTableLayoutBinding.inflate(layoutInflater)
+    }
+
+    override fun initView(rootView: View?) {
+        mViewBinding.calendarView.setOnCalendarSelectListener(this)
+        mViewBinding.calendarView.setOnCalendarInterceptListener(this)
+        mViewBinding.calendarView.setOnMonthChangeListener(this)
+        mViewBinding.calendarView.setOnViewChangeListener(this)
+        calendarExpandDecoration = CalendarExpandDecoration(context)
+        calendarShrinkDecoration = CalendarShrinkDecoration(context)
+        mViewBinding.tvCurrentDate.setOnClickListener(this)
+        val layoutManager = LinearLayoutManager(
+            activity
+        )
+        mViewBinding.recyclerView.layoutManager = layoutManager
+        mViewBinding.recyclerView.addItemDecoration(calendarShrinkDecoration, 0)
+        adapter = CourseTableListAdapter(R.layout.item_course_table_layout);
+
+        mViewBinding.recyclerView.adapter = adapter
+        mViewBinding.recyclerView.addOnItemTouchListener(object :
+            RecyclerView.SimpleOnItemTouchListener() {
+            var y = 0f
+            override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
+                when (e.action) {
+                    MotionEvent.ACTION_DOWN -> y = e.y
+                    MotionEvent.ACTION_UP -> {
+                        val right: Int = rv.width / 2 - SizeUtils.dp2px(16f)
+                        val left: Int = rv.width / 2 + SizeUtils.dp2px(16f)
+                        if (right < e.x && e.x < left && e.y < SizeUtils.dp2px(30f) && y < SizeUtils.dp2px(
+                                30f
+                            )
+                        ) {
+                            if (mViewBinding.calendarLayout.isExpand) {
+                                mViewBinding.calendarLayout.shrink()
+                            } else {
+                                mViewBinding.calendarLayout.expand()
+                            }
+                            return true
+                        }
+                    }
+                }
+                return super.onInterceptTouchEvent(rv, e)
+            }
+        })
+        adapter.setOnItemClickListener(OnItemClickListener() { adapter, view, position ->
+        })
+    }
+
+    override fun initData() {
+        lazyLoad()
+    }
+
+    private fun lazyLoad() {
+        val calendar = Calendar.getInstance()
+        val year = calendar[Calendar.YEAR]
+        val month = calendar[Calendar.MONTH] + 1
+        day = calendar[Calendar.DAY_OF_MONTH]
+        if ((mViewBinding.calendarView.curDay !== day || mViewBinding.calendarView.curMonth !== month || mViewBinding.calendarView.curYear !== year)) {
+            mViewBinding.calendarView.updateCurrentDate()
+            mViewBinding.calendarView.clearSingleSelect()
+        }
+        mViewBinding.calendarView.scrollToCalendar(year, month, day);
+        setMontAndDay(year, month, day)
+        currentSelectDate = TimeUtils.getNowDate()
+        calendarDate = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("yyyy-MM"))
+    }
+
+    private fun setMontAndDay(year: Int, month: Int, day: Int) {
+        var span: String = if (month < 10) {
+            year.toString() + "年0" + month + "月"
+        } else {
+            year.toString() + "年" + month + "月"
+        }
+        mViewBinding.tvCurrentDate.text = span
+    }
+
+    override fun onCalendarOutOfRange(calendar: com.haibin.calendarview.Calendar?) {
+    }
+
+    override fun onCalendarSelect(calendar: com.haibin.calendarview.Calendar?, isClick: Boolean) {
+        val year = calendar!!.year
+        val month = calendar!!.month
+        val day = calendar!!.day
+        currentSelectDate = TimeUtils.millis2Date(calendar.timeInMillis)
+        calendarDate =
+            TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"))
+        setMontAndDay(year, month, day)
+        queryCurrentDataCourse()
+    }
+
+    /**
+     * 查询当前选择日期的课程
+     */
+    private fun queryCurrentDataCourse() {
+        presenter.getCourseScheduleDateByMonth(calendarDate)
+        presenter.getCourseSchedulesWithDate(currentSelectDate)
+    }
+
+    override fun onCalendarIntercept(calendar: com.haibin.calendarview.Calendar?): Boolean {
+        return false;
+    }
+
+    override fun onCalendarInterceptClick(
+        calendar: com.haibin.calendarview.Calendar?,
+        isClick: Boolean
+    ) {
+
+    }
+
+    override fun onMonthChange(year: Int, month: Int) {
+        setMontAndDay(year, month, day)
+    }
+
+    override fun onViewChange(isMonthView: Boolean) {
+        if (!isMonthView) {
+            recyclerView.removeItemDecoration(calendarExpandDecoration)
+            if (recyclerView.itemDecorationCount == 0 || recyclerView.getItemDecorationAt(0) !is CalendarShrinkDecoration) {
+                recyclerView.addItemDecoration(calendarShrinkDecoration, 0)
+            }
+        } else {
+            recyclerView.removeItemDecoration(calendarShrinkDecoration)
+            if (recyclerView.itemDecorationCount == 0 || recyclerView.getItemDecorationAt(0) !is CalendarExpandDecoration) {
+                recyclerView.addItemDecoration(calendarExpandDecoration, 0)
+            }
+        }
+    }
+
+    override fun createPresenter(): CourseTablePresenter {
+        return CourseTablePresenter()
+    }
+
+    /**
+     * 根据月份查询当月有课的日期
+     */
+    override fun onGetCourseDateByMonthSuccess(datas: MutableList<String>?) {
+        if (isDetached) {
+            return;
+        }
+        if (datas?.size != 0) {
+            //更新日历表,显示有课字样
+            var maps = CourseHelper.filterDate(datas);
+            if (maps != null && maps.isNotEmpty()) {
+                mViewBinding.calendarView.addSchemeDate(maps)
+            }
+        }
+    }
+
+    /**
+     * 查询当天的课程
+     */
+    override fun onGetCourseSchedulesWithDateSuccess(data: CourseTableDataBean) {
+        if (isDetached) {
+            return;
+        }
+        adapter?.data.clear()
+        if (data?.studentList?.size != 0) {
+            //更新日历表,显示有课字样
+            adapter.data.addAll(data?.studentList);
+            adapter?.notifyDataSetChanged()
+        } else {
+            //show空视图
+            adapter?.notifyDataSetChanged()
+            showEmptyView()
+        }
+    }
+
+    private fun showEmptyView() {
+        if (!::emptyView.isInitialized) {
+            emptyView = EmptyViewLayout(context)
+        }
+        emptyView.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程~")
+        adapter.setEmptyView(emptyView)
+    }
+
+    override fun onClick(v: View?) {
+        when (v?.id) {
+            R.id.tv_current_date -> {
+                showTimeSelectView()
+            }
+        }
+    }
+
+    /**
+     * 显示日期选择view
+     */
+    private fun showTimeSelectView() {
+        //正确设置方式 原因:注意事项有说明
+        if (!::pvTime.isInitialized) {
+            pvTime = TimePickerBuilder(
+                requireContext(),
+                OnTimeSelectListener { date: Date?, v: View? ->  //选中事件回调
+                    var year: Int = TimeUtils.getValueByCalendarField(date, Calendar.YEAR)
+                    var month: Int = TimeUtils.getValueByCalendarField(date, Calendar.MONTH) + 1
+                    var day: Int = TimeUtils.getValueByCalendarField(date, Calendar.DAY_OF_MONTH)
+                    mViewBinding.calendarView.scrollToCalendar(year, month, day);
+                }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout,
+                CustomListener { v -> //自定义布局中的控件初始化及事件处理
+                    val tvSubmit =
+                        v.findViewById<View>(com.cooleshow.base.R.id.tv_finish) as TextView
+                    val ivCancel =
+                        v.findViewById<View>(com.cooleshow.base.R.id.tv_cancel) as TextView
+                    tvSubmit.setOnClickListener {
+                        pvTime.returnData()
+                        pvTime.dismiss()
+                    }
+                    ivCancel.setOnClickListener { pvTime.dismiss() }
+                })
+                .setLineSpacingMultiplier(2.5f)
+                .setType(booleanArrayOf(true, true, true, false, false, false)) // 默认全部显示
+                .isCyclic(true) //是否循环滚动
+                .setOutSideCancelable(true) //点击屏幕,点在控件外部范围时,是否取消显示
+                .setTextColorCenter(resources.getColor(com.cooleshow.base.R.color.color_1a1a1a)) //设置选中项的颜色
+//            .setRangDate(null, endDate) //起始终止年月日设定
+//            .setDate(endDate)
+                .isDialog(false) //是否显示为对话框样式
+                .setLabel("年", "月", "日", "", "", "")
+                .build()
+        }
+        var calendar = Calendar.getInstance();
+        calendar.time = currentSelectDate
+        pvTime.setDate(calendar)
+        if (!pvTime.isShowing) {
+            pvTime.show()
+        }
+
+    }
+}

+ 73 - 2
student/src/main/java/com/cooleshow/student/ui/main/HomeFragment.java

@@ -1,11 +1,17 @@
 package com.cooleshow.student.ui.main;
 
+import android.app.Activity;
+import android.app.Dialog;
+import android.graphics.Point;
+import android.graphics.Rect;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
 import androidx.annotation.NonNull;
+import androidx.core.widget.NestedScrollView;
 import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.LinearLayoutManager;
@@ -15,6 +21,7 @@ import com.alibaba.android.arouter.launcher.ARouter;
 import com.bumptech.glide.Glide;
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.common.WebConstants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
@@ -34,6 +41,8 @@ import com.cooleshow.student.bean.HotAlbumBean;
 import com.cooleshow.student.contract.HomeContract;
 import com.cooleshow.student.databinding.FragmentHomeLayoutBinding;
 import com.cooleshow.student.presenter.main.HomePresenter;
+import com.cooleshow.student.widgets.DialogUtils;
+import com.daya.live_teaching.utils.DisplayUtils;
 import com.scwang.smart.refresh.layout.api.RefreshLayout;
 import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 import com.youth.banner.Banner;
@@ -54,6 +63,10 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
     @Override
     public void onClick(View view) {
         switch (view.getId()) {
+            case R.id.im_message:
+                ARouter.getInstance().build(RouterPath.MessageCenter.TEACHER_MESSAGE_MESSAGEBOX)
+                        .navigation();
+                break;
             case R.id.tv_wonderful_info_more:
             case R.id.im_wonderful_info_more:
                 //精彩资讯
@@ -118,6 +131,7 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
     protected void initView(View rootView) {
         banner = mViewBinding.banner;
         llIndicator = mViewBinding.llIndicator;
+        mViewBinding.imMessage.setOnClickListener(this);
         mViewBinding.tvWonderfulInfoMore.setOnClickListener(this);
         mViewBinding.imWonderfulInfoMore.setOnClickListener(this);
         mViewBinding.tvHotAlbumMore.setOnClickListener(this);
@@ -129,6 +143,24 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
         mViewBinding.tvGoLive.setOnClickListener(this);
         mViewBinding.tvTeacherStyleMore.setOnClickListener(this);
         mViewBinding.imTeacherStyleMore.setOnClickListener(this);
+        mViewBinding.scrollLayout.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
+            @Override
+            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
+                boolean localVisibleRect = getLocalVisibleRect(getActivity(), banner, 10);
+                //banner可见的时候就自动循环,否则就停止,解决问题:在scrollview到最底部时候,由于banner自动到第一个时候就往上顶一段距离
+                if (localVisibleRect){
+                    if (null!=banner){
+                        banner.isAutoLoop(true);
+                    }
+                }else {
+                    if (null!=banner){
+                        banner.isAutoLoop(false);
+                    }
+                }
+
+
+            }
+        });
     }
 
     private void initBanner(List<AppHomeBean.ItemBean> bannerList) {
@@ -149,7 +181,7 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
                                 .into(holder.imageView);
 
                     }
-                }).addBannerLifecycleObserver(this)//添加生命周期观察者
+                }, true).addBannerLifecycleObserver(this)//添加生命周期观察者
                 .setIntercept(true) //是否要拦截事件
                 .setBannerRound(10f) //圆角
                 .isAutoLoop(true)
@@ -195,8 +227,15 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
         initBanner(appHomeBean.banner);
         initMenu(appHomeBean.appMenu);
         initWonderfulInfo(appHomeBean.information);
+        showDialog(appHomeBean.flashPage);
     }
 
+    private void showDialog(List<AppHomeBean.ItemBean> flashPage){
+        if (null==flashPage||flashPage.size()==0){
+            return;
+        }
+        DialogUtils.showHomeDialog(getContext(),flashPage.get(0));
+    }
     @Override
     public void hotAlbumListSuccess(HotAlbumBean data) {
         if (null == data || null == data.rows || data.rows.size() == 0) {
@@ -280,7 +319,7 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
         homeLiveCourseAdapter.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-    
+
             }
         });
     }
@@ -406,4 +445,36 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
             }
         });
     }
+
+    public static boolean getLocalVisibleRect(Activity activity, View view, int offsetY) {
+
+        Point p = new Point();
+
+        activity.getWindowManager().getDefaultDisplay().getSize(p);
+
+        int screenWidth = p.x;
+
+        int screenHeight = p.y;
+
+        Rect rect = new Rect(0, 0, screenWidth, screenHeight);//得到屏幕矩阵
+
+        int[] location = new int[2];
+
+        location[1] = location[1] + DisplayUtils.dip2px(BaseApplication.context,offsetY);
+
+        view.getLocationInWindow(location);
+
+        view.setTag(location[1]);//存储y方向的位置
+
+        if (view.getLocalVisibleRect(rect)) {
+
+            return true;
+
+        } else {
+
+            return false;
+
+        }
+
+    }
 }

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

@@ -50,9 +50,13 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
                 break;
             case R.id.ll_mine_course:
                 //我的课程
+                ARouter.getInstance().build(RouterPath.CourseCenter.TEACHER_MINE_COURSE)
+                        .navigation();
                 break;
             case R.id.ll_mine_homework:
                 //我的作业
+                ARouter.getInstance().build(RouterPath.WorkCenter.TEACHER_WORK_HOMEWORK)
+                        .navigation();
                 break;
             case R.id.ll_mine_score:
                 //我的乐谱
@@ -89,6 +93,10 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
                 break;
             case R.id.tv_help:
                 //帮助中心
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, WebConstants.HELP_CENTER)
+                        .navigation();
                 break;
             case R.id.ll_follow_teacher:
                 //关注老师
@@ -124,7 +132,7 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
         rv_mark = mViewBinding.rvMark;
         mViewBinding.ivAvatar.setOnClickListener(this);
         mViewBinding.ivSetting.setOnClickListener(this);
-        mViewBinding.llMineCourse.setOnClickListener(this);
+        mViewBinding.llMineScore.setOnClickListener(this);
         mViewBinding.llMineHomework.setOnClickListener(this);
         mViewBinding.llMineCourse.setOnClickListener(this);
         mViewBinding.llMeterRecords.setOnClickListener(this);

+ 239 - 0
student/src/main/java/com/cooleshow/student/ui/message/MessageBoxActivity.java

@@ -0,0 +1,239 @@
+package com.cooleshow.student.ui.message;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.MessageBoxAdapter;
+import com.cooleshow.student.bean.CountOfUnreadBean;
+import com.cooleshow.student.bean.SystemMessageBean;
+import com.cooleshow.student.contract.MessageBoxContract;
+import com.cooleshow.student.databinding.ActivityMessageBoxBinding;
+import com.cooleshow.student.presenter.message.MessageBoxPresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/24 11:14
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.MessageCenter.TEACHER_MESSAGE_MESSAGEBOX)
+public class MessageBoxActivity extends BaseMVPActivity<ActivityMessageBoxBinding, MessageBoxPresenter> implements MessageBoxContract.MessageBoxView, View.OnClickListener {
+    //SYSTEM:系统消息 COURSE:课程信息 NOTICE:公告
+    private String group = "";
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.cl_all:
+                group = "";
+                defaultTextColor();
+                viewBinding.tvAll.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_333333));
+                currentPage = 1;
+                queryList(true);
+                break;
+            case R.id.cl_course:
+                group = "COURSE";
+                defaultTextColor();
+                viewBinding.tvCourse.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_333333));
+                currentPage = 1;
+                queryList(true);
+                break;
+            case R.id.cl_system:
+                group = "SYSTEM";
+                defaultTextColor();
+                viewBinding.tvSystem.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_333333));
+                currentPage = 1;
+                queryList(true);
+                break;
+            case R.id.tv_right:
+            case R.id.tv_right_text:
+                presenter.batchSetRead();
+                break;
+        }
+    }
+
+    private void defaultTextColor() {
+        viewBinding.tvAll.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        viewBinding.tvCourse.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        viewBinding.tvSystem.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_999999));
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+    private MessageBoxAdapter messageBoxAdapter;
+    List<SystemMessageBean.RowsBean> dataList = new ArrayList<>();
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "消息盒子");
+        viewBinding.clAll.setOnClickListener(this);
+        viewBinding.clCourse.setOnClickListener(this);
+        viewBinding.clSystem.setOnClickListener(this);
+        viewBinding.tvAll.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_333333));
+        viewBinding.toolbarInclude.tvRightText.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRightText.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        viewBinding.toolbarInclude.tvRightText.setTextSize(11);
+        viewBinding.toolbarInclude.tvRightText.setText("全部已读");
+        viewBinding.toolbarInclude.tvRightText.setOnClickListener(this);
+        viewBinding.toolbarInclude.tvRight.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRight.setBackgroundResource(R.drawable.icon_message_read_all);
+        viewBinding.toolbarInclude.tvRight.setOnClickListener(this);
+        RecyclerView rvAddress = viewBinding.recyclerView;
+        LinearLayoutManager manager = new LinearLayoutManager(this);
+        rvAddress.setLayoutManager(manager);
+        messageBoxAdapter = new MessageBoxAdapter(dataList);
+        LayoutInflater inflater = LayoutInflater.from(this);
+        View emptyLayout = inflater.inflate(R.layout.layout_empty_conent, null);
+        ImageView im_empty_logo = emptyLayout.findViewById(R.id.im_empty_logo);
+        im_empty_logo.setBackgroundResource(R.drawable.icon_empty_message_box);
+        messageBoxAdapter.setEmptyView(emptyLayout);
+        rvAddress.setAdapter(messageBoxAdapter);
+        messageBoxAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                SystemMessageBean.RowsBean item = (SystemMessageBean.RowsBean) adapter.getItem(position);
+                if (item.readStatus==0){
+                    presenter.setCurrentRead(item.id);
+                }
+            }
+        });
+    }
+
+    @Override
+    protected ActivityMessageBoxBinding getLayoutView() {
+        return ActivityMessageBoxBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MessageBoxPresenter createPresenter() {
+        return new MessageBoxPresenter();
+    }
+
+    private int currentPage;
+
+    @Override
+    public void initData() {
+        super.initData();
+        viewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                queryList(true);
+            }
+        });
+        messageBoxAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    queryList(false);
+                } else {
+                    messageBoxAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        currentPage = 1;
+        queryList(true);
+    }
+
+    @Override
+    public void sysMessageListSuccess(int page, SystemMessageBean data) {
+        if (data != null) {
+            if (page == 1) {
+                dataList.clear();
+                viewBinding.refreshLayout.finishRefresh();
+                if (data.rows != null && data.rows.size() > 0) {
+                    checkHasNext(data.rows.size());
+                    dataList.addAll(data.rows);
+                    messageBoxAdapter.notifyDataSetChanged();
+                }
+            } else {
+                if (data.rows != null && data.rows.size() > 0) {
+                    messageBoxAdapter.getLoadMoreModule().loadMoreComplete();
+                    checkHasNext(data.rows.size());
+                } else {
+                    messageBoxAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        }
+    }
+
+    private boolean hasNext = true;
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+    private void queryList(boolean isLoading) {
+        presenter.sysMessageList(isLoading, currentPage, group);
+    }
+
+
+    @Override
+    public void sysMessageListError(int page) {
+        if (page == 1) {
+            viewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (messageBoxAdapter != null) {
+                currentPage--;
+                messageBoxAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    @Override
+    public void setCurrentReadSuccess(long id) {
+        for (SystemMessageBean.RowsBean rowsBean : dataList) {
+            if (rowsBean.id==id){
+                rowsBean.readStatus=1;
+                break;
+            }
+        }
+        messageBoxAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        presenter.queryCountOfUnread();
+    }
+
+    @Override
+    public void queryCountOfUnreadSuccess(List<CountOfUnreadBean> data) {
+        Log.e("asdfasdfsdsfafd", "queryCountOfUnreadSuccess: "+data.size() );
+    }
+}

+ 4 - 1
student/src/main/java/com/cooleshow/student/ui/web/WebActivity.java

@@ -265,7 +265,10 @@ public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements Js
         public void onReceivedTitle(WebView view, String title) {
             super.onReceivedTitle(view, title);
             if (!TextUtils.isEmpty(title)) {
-                viewBinding.tvTitle.setText(title);
+                if (null!=viewBinding.tvTitle){
+                    viewBinding.tvTitle.setText(title);
+                }
+
             }
 
         }

+ 88 - 0
student/src/main/java/com/cooleshow/student/ui/work/HomeWorkActivity.java

@@ -0,0 +1,88 @@
+package com.cooleshow.student.ui.work;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager.widget.ViewPager;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.router.RouterPath;
+
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.student.adapter.HomeWorkPagerAdapter;
+import com.cooleshow.student.contract.HomeWorkActContract;
+import com.cooleshow.student.databinding.ActivityHomeworkBinding;
+import com.cooleshow.student.presenter.homework.HomeWorkActPresenter;
+import com.google.android.material.tabs.TabLayout;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/5/23 10:47
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.WorkCenter.TEACHER_WORK_HOMEWORK)
+public class HomeWorkActivity extends BaseMVPActivity<ActivityHomeworkBinding, HomeWorkActPresenter> implements HomeWorkActContract.HomeWorkActView, View.OnClickListener {
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+    private TabLayout tabLayout;
+    private ViewPager viewPager;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "课后作业");
+        tabLayout = viewBinding.tablayout;
+        viewPager = viewBinding.viewpager;
+        viewPager.setCurrentItem(0);
+    }
+
+    @Override
+    protected ActivityHomeworkBinding getLayoutView() {
+        return ActivityHomeworkBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    public void onClick(View view) {
+
+    }
+
+    @Override
+    protected HomeWorkActPresenter createPresenter() {
+        return new HomeWorkActPresenter();
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        initTabLayoutAndViewPager();
+    }
+
+    private List<String> titles = new ArrayList<String>(Arrays.asList("未布置", "已布置"));
+    private List<String> auditStatusList = new ArrayList<String>(Arrays.asList("NO", "YES"));
+    private List<Fragment> fragments = new ArrayList<>();
+
+    private void initTabLayoutAndViewPager() {
+        tabLayout.removeAllTabs();
+        fragments.clear();
+        for (int i = 0; i < titles.size(); i++) {
+            tabLayout.addTab(tabLayout.newTab().setText(titles.get(i)));
+            Fragment adFragment = HomeWorkFragment.newInstance(auditStatusList.get(i));
+            fragments.add(adFragment);
+        }
+        viewPager.setAdapter(new HomeWorkPagerAdapter(getSupportFragmentManager(), fragments, titles));
+        tabLayout.setupWithViewPager(viewPager);
+    }
+
+}

+ 237 - 0
student/src/main/java/com/cooleshow/student/ui/work/HomeWorkFragment.java

@@ -0,0 +1,237 @@
+package com.cooleshow.student.ui.work;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.TimeUtils;
+
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.HomeworkAdapter;
+import com.cooleshow.student.bean.HomeworkListBean;
+import com.cooleshow.student.contract.HomeWorkContract;
+import com.cooleshow.student.databinding.FragmentHomeworkBinding;
+import com.cooleshow.student.presenter.homework.HomeWorkPresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/23 10:54
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class HomeWorkFragment extends BaseMVPFragment<FragmentHomeworkBinding, HomeWorkPresenter> implements HomeWorkContract.HomeWorkView, View.OnClickListener {
+
+    public static HomeWorkFragment newInstance(String submit) {
+        Bundle args = new Bundle();
+        HomeWorkFragment fragment = new HomeWorkFragment();
+        args.putString("submit", submit);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()){
+            case R.id.tv_date:
+                showTimeSelectPicker();
+                break;
+        }
+    }
+
+    @Override
+    protected FragmentHomeworkBinding getLayoutView() {
+        return FragmentHomeworkBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected HomeWorkPresenter createPresenter() {
+        return new HomeWorkPresenter();
+    }
+
+    private String submit = "";
+    private HomeworkAdapter homeworkAdapter;
+    List<HomeworkListBean.RowsBean> dataList = new ArrayList<>();
+
+    @Override
+    protected void initView(View rootView) {
+        submit = getArguments().getString("submit");
+        mViewBinding.tvDate.setOnClickListener(this);
+        RecyclerView rvAddress = mViewBinding.recyclerView;
+        LinearLayoutManager manager = new LinearLayoutManager(getContext());
+        rvAddress.setLayoutManager(manager);
+        homeworkAdapter = new HomeworkAdapter(dataList,submit);
+        LayoutInflater inflater = LayoutInflater.from(getContext());
+        View emptyLayout = inflater.inflate(R.layout.layout_empty_conent, null);
+        homeworkAdapter.setEmptyView(emptyLayout);
+        rvAddress.setAdapter(homeworkAdapter);
+        homeworkAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+
+            }
+        });
+    }
+
+    private int currentPage;
+
+    @Override
+    protected void initData() {
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                queryCourse(true);
+            }
+        });
+        homeworkAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    queryCourse(false);
+                } else {
+                    homeworkAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        currentPage = 1;
+        reBuildFilter(null);
+        queryCourse(true);
+    }
+
+
+    private boolean hasNext = true;
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+    private void queryCourse(boolean isLoading) {
+        presenter.queryHomeworkList(isLoading, currentPage, submit, currentFilterDate);
+    }
+
+    @Override
+    public void queryHomeworkListSuccess(int page, HomeworkListBean data) {
+        if (isDetached()) {
+            return;
+        }
+        if (data != null) {
+            if (page == 1) {
+                dataList.clear();
+                mViewBinding.refreshLayout.finishRefresh();
+                if (data.rows != null && data.rows.size() > 0) {
+                    checkHasNext(data.rows.size());
+                    dataList.addAll(data.rows);
+                    homeworkAdapter.notifyDataSetChanged();
+                }
+            } else {
+                if (data.rows != null && data.rows.size() > 0) {
+                    homeworkAdapter.getLoadMoreModule().loadMoreComplete();
+                    checkHasNext(data.rows.size());
+                } else {
+                    homeworkAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public void queryHomeworkListError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (homeworkAdapter != null) {
+                currentPage--;
+                homeworkAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    private TimePickerView pvTime;
+
+    private void showTimeSelectPicker() {
+        if (pvTime == null) {
+            pvTime = new TimePickerBuilder(requireContext(), (date, v) -> {//选中事件回调
+                reBuildFilter(date);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_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) {
+                                    pvTime.returnData();
+                                    pvTime.dismiss();
+                                }
+                            });
+                            ivCancel.setOnClickListener(new View.OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    pvTime.dismiss();
+                                }
+                            });
+
+                        }
+                    })
+                    .setLineSpacingMultiplier(2.5f)
+                    .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
+                    .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
+                    .isDialog(false)//是否显示为对话框样式
+                    .setLabel("年", "月", "", "", "", "")
+                    .build();
+        }
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentSelectDate);
+        pvTime.setDate(calendar);
+        if (!pvTime.isShowing()) {
+            pvTime.show();
+        }
+    }
+    private Date currentSelectDate;
+    private String currentFilterDate;
+    private void reBuildFilter(Date date) {
+        currentSelectDate = date != null ? date : TimeUtils.getNowDate();
+        String targetDateTimeStr = TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"));
+        if (TextUtils.equals(targetDateTimeStr, currentFilterDate)) {
+            //防止重复条件触发
+            return;
+        }
+        currentFilterDate = targetDateTimeStr;
+        currentPage = 1;
+        mViewBinding.tvDate.setText(currentFilterDate);
+        queryCourse(true);
+    }
+}

+ 65 - 0
student/src/main/java/com/cooleshow/student/widgets/CalendarExpandDecoration.java

@@ -0,0 +1,65 @@
+package com.cooleshow.student.widgets;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.view.View;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.student.R;
+
+/**
+ * Description:
+ * Copyright  : Copyright (c) 2019
+ * Company    : 大雅乐盟
+ * Author     : r
+ * Date       : 2019/10/22 10:07
+ */
+public class CalendarExpandDecoration extends RecyclerView.ItemDecoration {
+    private int mHeight;
+    private Paint mPaint;
+    Bitmap mSrcBitmap;
+    Context context;
+
+    public CalendarExpandDecoration(Context context) {
+        this.context = context;
+        mPaint = new Paint();
+        mPaint.setStyle(Paint.Style.FILL);
+        mPaint.setColor(0xffDFDEDE);
+        mPaint.setStrokeWidth(0);
+        mPaint.setAntiAlias(true);
+        mSrcBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_calendar_expand);
+        mHeight = SizeUtils.dp2px( 38);
+    }
+
+    public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
+        super.onDrawOver(canvas, parent, state);
+        int mWidth = parent.getWidth();
+        mPaint.setStrokeWidth(1);
+        mPaint.setColor(0xffffffff);
+        canvas.drawRoundRect(new RectF(0, 0, mWidth, mHeight), 0, 0, mPaint);
+        int mBitmapHeight = mSrcBitmap.getHeight();
+        int mBitmapWidth = mSrcBitmap.getWidth();
+
+        RectF rectF = new RectF(mWidth / 2 - mBitmapWidth / 2, mHeight / 2 - mBitmapHeight / 2, mWidth / 2 + mBitmapWidth / 2, mHeight / 2 + mBitmapHeight / 2);
+        canvas.drawBitmap(mSrcBitmap, null, rectF, mPaint);
+
+    }
+
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+        int position = parent.getChildAdapterPosition(view);
+        if (position == 0) {
+            outRect.top = mHeight;
+        }
+    }
+
+
+}

+ 65 - 0
student/src/main/java/com/cooleshow/student/widgets/CalendarShrinkDecoration.java

@@ -0,0 +1,65 @@
+package com.cooleshow.student.widgets;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.view.View;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.student.R;
+
+/**
+ * Description:
+ * Copyright  : Copyright (c) 2019
+ * Company    : 大雅乐盟
+ * Author     : r
+ * Date       : 2019/10/22 10:07
+ */
+public class CalendarShrinkDecoration extends RecyclerView.ItemDecoration {
+    private int mHeight;
+    private Paint mPaint;
+    Bitmap mSrcBitmap;
+    Context context;
+
+    public CalendarShrinkDecoration(Context context) {
+        this.context = context;
+        mPaint = new Paint();
+        mPaint.setStyle(Paint.Style.FILL);
+        mPaint.setColor(0xffDFDEDE);
+        mPaint.setStrokeWidth(0);
+        mPaint.setAntiAlias(true);
+        mSrcBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_calendar_shrink);
+        mHeight = SizeUtils.dp2px(38);
+    }
+
+    public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
+        super.onDrawOver(canvas, parent, state);
+        int mWidth = parent.getWidth();
+        mPaint.setStrokeWidth(1);
+        mPaint.setColor(0xffffffff);
+        canvas.drawRoundRect(new RectF(0, 0, mWidth, mHeight), 0, 0, mPaint);
+        int mBitmapHeight = mSrcBitmap.getHeight();
+        int mBitmapWidth = mSrcBitmap.getWidth();
+
+        RectF rectF = new RectF(mWidth / 2 - mBitmapWidth / 2, mHeight / 2 - mBitmapHeight / 2, mWidth / 2 + mBitmapWidth / 2, mHeight / 2 + mBitmapHeight / 2);
+        canvas.drawBitmap(mSrcBitmap, null, rectF, mPaint);
+
+    }
+
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+        int position = parent.getChildAdapterPosition(view);
+        if (position == 0) {
+            outRect.top = mHeight;
+        }
+    }
+
+
+}

+ 71 - 0
student/src/main/java/com/cooleshow/student/widgets/DialogUtils.java

@@ -0,0 +1,71 @@
+package com.cooleshow.student.widgets;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.cooleshow.base.common.BaseApplication;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.AppHomeBean;
+import com.cooleshow.usercenter.utils.SavePicUtil;
+import com.daya.live_teaching.utils.ToastUtils;
+
+/**
+ * 创建日期:2022/5/30 10:08
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class DialogUtils {
+    public interface ActionDialogCallback {
+        /**
+         * Called when left Button is click
+         */
+        void onConfirmClick();
+
+        /**
+         * Called when left Button is click
+         */
+        void onCancelClick();
+
+    }
+
+    public static void showHomeDialog(Context context, AppHomeBean.ItemBean data) {
+        LinearLayout.LayoutParams pm = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
+        AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.Dialog);
+        LayoutInflater inflater = LayoutInflater.from(context);
+        View view = inflater.inflate(R.layout.dialog_home_dialog, null);//这里的R.layout.alertdialog即为你自定义的布局文件
+        ImageView im_pic = view.findViewById(R.id.im_pic);
+        GlideUtils.INSTANCE.loadImage(context, data.coverImage, im_pic);
+        ImageView im_close = view.findViewById(R.id.im_close);
+
+        final AlertDialog mAlertDialog = builder.create();
+        mAlertDialog.getWindow().setBackgroundDrawableResource(com.cooleshow.base.R.color.transparent);
+        mAlertDialog.setCanceledOnTouchOutside(true);
+        mAlertDialog.setCancelable(true);
+        mAlertDialog.show();
+        mAlertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+        mAlertDialog.getWindow().setContentView(view, pm);
+
+        im_close.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                mAlertDialog.dismiss();
+            }
+        });
+    }
+}

+ 36 - 0
student/src/main/java/com/cooleshow/student/widgets/helper/CourseHelper.java

@@ -0,0 +1,36 @@
+package com.cooleshow.student.widgets.helper;
+
+import com.cooleshow.base.utils.TimeUtils;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Author by pq, Date on 2022/4/24.
+ */
+public class CourseHelper {
+    public static Map<String, com.haibin.calendarview.Calendar> filterDate(List<String> targetList) {
+        Map<String, com.haibin.calendarview.Calendar> calendarMap = new HashMap<>();
+        try {
+            for (int i = 0; i < targetList.size(); i++) {
+                String s = targetList.get(i);
+                Date date = TimeUtils.stringToDate(s);
+                int year = TimeUtils.getValueByCalendarField(date, Calendar.YEAR);
+                int month = TimeUtils.getValueByCalendarField(date, Calendar.MONTH) + 1;
+                int day = TimeUtils.getValueByCalendarField(date, Calendar.DAY_OF_MONTH);
+                com.haibin.calendarview.Calendar calendar = new com.haibin.calendarview.Calendar();
+                calendar.setYear(year);
+                calendar.setMonth(month);
+                calendar.setDay(day);
+                calendarMap.put(calendar.toString(), calendar);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return calendarMap;
+    }
+}

+ 41 - 0
student/src/main/java/com/cooleshow/student/wxapi/VideoCourseListItemDecoration.java

@@ -0,0 +1,41 @@
+package com.cooleshow.student.wxapi;
+
+import android.graphics.Rect;
+import android.view.View;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2021/3/18 0018.
+ */
+public class VideoCourseListItemDecoration extends RecyclerView.ItemDecoration {
+
+    private int top;
+    private int left;
+    private int bottom;
+    private int right;
+    private int center;
+
+    public VideoCourseListItemDecoration(int top, int left, int bottom, int right, int center) {
+        this.top = top;
+        this.left = left;
+        this.bottom = bottom;
+        this.right = right;
+        this.center = center;
+    }
+
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        //每行都只有2个
+        int childLayoutPosition = parent.getChildLayoutPosition(view);
+        outRect.top = top;
+        outRect.bottom = bottom;
+        if (childLayoutPosition % 2 == 0) {
+            outRect.right = center;
+            outRect.left = left;
+        } else {
+            outRect.left = center;
+            outRect.right = right;
+        }
+    }
+}

+ 39 - 0
student/src/main/res/anim/modal_in.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/linear_interpolator"
+    android:shareInterpolator="true">
+    <alpha
+        android:fromAlpha="0.2"
+        android:toAlpha="1"
+        android:duration="90"/>
+
+    <scale
+        android:fromXScale="0.7"
+        android:toXScale="1.05"
+        android:fromYScale="0.7"
+        android:toYScale="1.05"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="135"/>
+
+    <scale
+        android:fromXScale="1.05"
+        android:toXScale="0.95"
+        android:fromYScale="1.05"
+        android:toYScale="0.95"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="105"
+        android:startOffset="135"/>
+
+    <scale
+        android:fromXScale="0.95"
+        android:toXScale="1"
+        android:fromYScale="0.95"
+        android:toYScale="1"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="60"
+        android:startOffset="240"/>
+</set>

+ 18 - 0
student/src/main/res/anim/modal_out.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/linear_interpolator"
+    android:shareInterpolator="true">
+    <scale
+        android:fromXScale="1"
+        android:toXScale="0.6"
+        android:fromYScale="1"
+        android:toYScale="0.6"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="150"/>
+    <!-- <alpha
+         android:fromAlpha="1"
+         android:toAlpha="0"
+         android:duration="150"/> -->
+</set>

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


Some files were not shown because too many files changed in this diff