浏览代码

增加老师端首页统计模块

Pq 3 月之前
父节点
当前提交
0667421a67

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

@@ -199,6 +199,7 @@ public abstract class WebConstants {
 
     public static final String TEACHER_APPOINTMENT_COURSE_SETTING = getBaseUrlH5() + "/#/practiceSettingTimer";//老师端约课时间段配置
     public static final String STUDENT_FREE_CARD = getBaseUrlH5() + "/#/discount-card";//畅学卡
+    public static final String HOME_STATISTICS = getBaseUrlH5() + "/#/home-statistics";//老师端首页统计
 
     public static String getAccompanyUA() {
         return WebConstants.WEB_UA_PARAMS + WebConstants.getCustomUAParams();

+ 8 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/main/NewHomeFragmentV2.java

@@ -46,6 +46,7 @@ import com.cooleshow.teacher.contract.HomeContract;
 import com.cooleshow.teacher.databinding.FgNewHomeV2LayoutBinding;
 import com.cooleshow.teacher.helper.EventHelper;
 import com.cooleshow.teacher.presenter.main.HomePresenter;
+import com.cooleshow.teacher.ui.web.ScHtmlFragment;
 import com.cooleshow.teacher.widgets.HomeHotAlbumItemDecoration;
 import com.cooleshow.teacher.widgets.HomeHotMusicSheetItemDecoration;
 import com.cooleshow.teacher.widgets.dialog.BadgeDesDialog;
@@ -68,6 +69,7 @@ import java.util.List;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.LinearSnapHelper;
 import androidx.recyclerview.widget.PagerSnapHelper;
@@ -101,6 +103,7 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
     private String currentSubjectId = "";
     private int indicatorWidth = 0;//金刚位indicator宽度
     private int tenantAlbumStatus = 0;
+    private ScHtmlFragment mScHtmlFragment;
 
     @Override
     protected void initView(View rootView) {
@@ -166,6 +169,11 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
         };
         //banner自带图片轮播的适配器
         mViewBinding.banner.setAdapter(mBannerImageAdapter, true);
+
+        mScHtmlFragment = new ScHtmlFragment();
+        FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
+        fragmentTransaction.replace(R.id.fl_statistics_container, mScHtmlFragment).commitAllowingStateLoss();
+
         initListener();
     }
 

+ 443 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/web/ScHtmlFragment.java

@@ -0,0 +1,443 @@
+package com.cooleshow.teacher.ui.web;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.webkit.GeolocationPermissions;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
+import android.webkit.WebResourceError;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.FrameLayout;
+
+
+import com.cooleshow.base.BuildConfig;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.constanst.ErrorConstants;
+import com.cooleshow.base.constanst.ErrorType;
+import com.cooleshow.base.constanst.LoginStatusConstants;
+import com.cooleshow.base.event.LoginStatusEvent;
+import com.cooleshow.base.ui.fragment.BaseFragment;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.helper.LogUploadManager;
+import com.cooleshow.base.widgets.HttpsServerCertWebViewClient;
+import com.cooleshow.teacher.databinding.FgScHomeWebBinding;
+import com.cooleshow.teacher.widgets.LollipopFixedWebView;
+import com.cooleshow.teacher.widgets.helper.JsInterfaceUtils;
+import com.cooleshow.usercenter.helper.UserHelper;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+import org.json.JSONObject;
+
+
+/**
+ * Author by pq, Date on 2024/12/30.
+ */
+public class ScHtmlFragment extends BaseFragment<FgScHomeWebBinding> implements JsInterfaceUtils.onGetMethodsListener {
+
+    private WebView webView;
+    private boolean isNeedRefresh = false;
+    private boolean isLoadError = false;
+    private boolean isLoadCompleted = false;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        EventBus.getDefault().register(this);
+    }
+
+    @Override
+    protected FgScHomeWebBinding getLayoutView() {
+        return FgScHomeWebBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+        try {
+            if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) {
+                webView = new LollipopFixedWebView(getContext());
+            } else {
+                webView = new WebView(getContext());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (null == webView) {
+            return;
+        }
+        webView.setBackgroundColor(Color.TRANSPARENT);
+        mViewBinding.viewParent.addView(webView, new FrameLayout.LayoutParams(
+                FrameLayout.LayoutParams.MATCH_PARENT,
+                FrameLayout.LayoutParams.MATCH_PARENT));
+        initWebView();
+        String webViewUrl = WebConstants.HOME_STATISTICS;
+        LOG.i("pq", "webViewUrl:" + webViewUrl);
+        webView.loadUrl(UserHelper.getSpliceTokenUrl(webViewUrl));
+    }
+
+    private void initWebView() {
+        //声明WebSettings子类
+        WebSettings webSettings = webView.getSettings();
+        webSettings.setUserAgentString(webSettings.getUserAgentString() + WebConstants.WEB_UA_PARAMS);
+        webSettings.setGeolocationDatabasePath(getContext().getFilesDir().getPath());
+        webSettings.setGeolocationEnabled(true);
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setMediaPlaybackRequiresUserGesture(false);//false允许自动播放音视频
+        //是否启用缓存
+        webSettings.setAppCacheEnabled(true);
+
+        // 开启DOM缓存,默认状态下是不支持LocalStorage的
+        webSettings.setDomStorageEnabled(true);
+        // 开启数据库缓存
+        webSettings.setDatabaseEnabled(true);
+        // 地址跨域导致视频预览图片加载不出来 无法播放:
+        webSettings.setAllowUniversalAccessFromFileURLs(false);
+        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+
+        //设置自适应屏幕,两者合用
+        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+        //缩放操作
+        webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。
+        // 设置允许JS弹窗
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        //其他细节操作
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
+        webSettings.setAllowFileAccess(true); //设置可以访问文件
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
+        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
+        webSettings.setDefaultTextEncodingName("UTF-8");//设置编码格式
+
+        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);  //富文本适配
+        webSettings.setAppCacheMaxSize(Long.MAX_VALUE);
+        webSettings.setAppCachePath(getContext().getDir("appcache", 0).getPath());
+        webSettings.setDatabasePath(getContext().getDir("databases", 0).getPath());
+        webSettings.setGeolocationDatabasePath(getContext().getDir("geolocation", 0)
+                .getPath());
+        webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
+        if (BuildConfig.DEBUG) {
+            webView.setWebContentsDebuggingEnabled(true);
+        }
+        webSettings.setTextZoom(100);//设置字体默认的缩放比例,以避免手机系统的字体修改对页面字体及布局造成影响。
+        webView.setHorizontalScrollBarEnabled(false);
+        webView.setVerticalScrollBarEnabled(false);
+        JsInterfaceUtils jsInterfaceUtils = new JsInterfaceUtils(getActivity());
+        jsInterfaceUtils.setOnItemClickListener(this);
+        webView.setWebViewClient(new WebClient());
+        webView.setWebChromeClient(new MyWebChromeClient());
+        webView.addJavascriptInterface(jsInterfaceUtils, WebConstants.WEB_JS_INTERFACE);
+    }
+
+    @Override
+    protected void initData() {
+        mViewBinding.errorView.hideBack();
+        mViewBinding.errorView.setOnRefreshClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (webView != null) {
+                    reloadWeb();
+                    hideErrorView();
+                }
+            }
+        });
+    }
+
+    private void reloadWeb() {
+        if (webView != null) {
+            webView.reload();
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (isNeedRefresh) {
+            isNeedRefresh = false;
+            reloadWeb();
+        } else {
+            refresh();
+        }
+    }
+
+    private void showWebView() {
+        mViewBinding.viewParent.setVisibility(View.VISIBLE);
+    }
+
+    private void hideErrorView() {
+        mViewBinding.flError.setVisibility(View.GONE);
+    }
+
+    private void showLoadErrorView() {
+        isLoadError = true;
+        mViewBinding.viewParent.setVisibility(View.GONE);
+        mViewBinding.flError.setVisibility(View.VISIBLE);
+    }
+
+    private void notifyWebViewOnResume() {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("api", "webViewOnResume");
+            onSendMessage(jsonObject.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void sendStickyTopMessage(int mode) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("api", "stickyTop");
+            JSONObject contentJson = new JSONObject();
+            contentJson.put("status", mode);
+            jsonObject.put("content", contentJson);
+            onSendMessage(jsonObject.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void onSendMessage(String message) {
+        Log.i("pq", "post message:" + message);
+        webView.evaluateJavascript("postMessage('" + message + "','*')", new ValueCallback<String>() {
+            @Override
+            public void onReceiveValue(String s) {
+            }
+        });
+    }
+
+    @Override
+    public void onAccompanySelecResult(String id, String name) {
+
+    }
+
+    @Override
+    public void chooseFile(JSONObject message) {
+
+    }
+
+    @Override
+    public void createRightNavToShareButton(String image, String url) {
+
+    }
+
+    @Override
+    public void shareAchievements(JSONObject message) {
+
+    }
+
+    @Override
+    public void backIconChange(JSONObject message) {
+
+    }
+
+    @Override
+    public void getNavHeight(JSONObject message) {
+
+    }
+
+    @Override
+    public void setBarStatus(JSONObject message) {
+
+    }
+
+
+    @Override
+    public void authToBack(JSONObject message) {
+
+    }
+
+    @Override
+    public void joinLiveRoom(String roomId, String teacherId) {
+
+    }
+
+    @Override
+    public void joinChatGroup(String type, String id) {
+
+    }
+
+    @Override
+    public void paymentOrder(String orderNo, String payChannel, String payInfo) {
+
+    }
+
+    @Override
+    public void savePicture(String base64, String uuid) {
+
+    }
+
+    @Override
+    public void shareTripartite(JSONObject jsonObject) {
+
+    }
+
+    @Override
+    public void videoCrop(JSONObject jsonObject) {
+
+    }
+
+    @Override
+    public void checkCoursewareCache(JSONObject jsonObject) {
+
+    }
+
+    @Override
+    public void downloadCourseware(String toString) {
+
+    }
+
+    @Override
+    public void cloudLoading(JSONObject jsonObject) {
+
+    }
+
+    @Override
+    public void onBackPress() {
+
+    }
+
+    @Override
+    public void downloadFile(String url, String fileName) {
+
+    }
+
+    @Override
+    public void setStatusBarTextColor(boolean statusBarTextColor) {
+
+    }
+
+    @Override
+    public void saveFile(JSONObject jsonObject) {
+
+    }
+
+    public void refresh() {
+        if (isLoadError) {
+            reloadWeb();
+        }
+        notifyWebViewOnResume();
+    }
+
+    private class WebClient extends HttpsServerCertWebViewClient {
+        //页面开始载入时调用
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            isLoadError = false;
+            isLoadCompleted = false;
+        }
+
+        //页面载入结束时调用
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            if (!isLoadError) {
+                isLoadCompleted = true;
+                showWebView();
+            }
+        }
+
+        //截取url请求,在当前视图加载,避免在跳转到自带浏览器
+        @Override
+        public boolean shouldOverrideUrlLoading(WebView view, String request) {
+            if (!(request.startsWith("http://") || request.startsWith("https://"))) {
+                try {
+                    Intent intent = new Intent();
+                    intent.setAction(Intent.ACTION_VIEW);
+                    intent.setData(Uri.parse(request));
+                    startActivity(intent);
+                } catch (ActivityNotFoundException e) {
+                    ToastUtil.getInstance().show(getContext().getApplicationContext(), "未安装该应用");
+                }
+                return true;
+            } else {
+                view.loadUrl(request);
+                return true;
+            }
+        }
+
+        //处理报错信息
+        @Override
+        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
+            super.onReceivedError(view, request, error);
+            if (error != null) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+                    LOG.i("onReceivedError:" + error.getErrorCode());
+                    LOG.i("onReceivedError:" + error.getDescription());
+                    int errorCode = error.getErrorCode();
+                    if (errorCode == WebViewClient.ERROR_HOST_LOOKUP || errorCode == WebViewClient.ERROR_CONNECT || errorCode == WebViewClient.ERROR_PROXY_AUTHENTICATION) {
+                        if (isLoadCompleted) {
+                            //20240827同步加载完后的error不需要显示 错误页
+                            return;
+                        }
+                        showLoadErrorView();
+                    } else {
+                        if (error.getErrorCode() == WebViewClient.ERROR_UNKNOWN) {
+                            return;
+                        }
+                        String errorMsg = "url:" + request.getUrl().toString() + " " + error.getDescription();
+                        LogUploadManager.getInstance().uploadErrorLog(ErrorType.HTML_ERROR, ErrorConstants.getErrorMsg(error.getErrorCode(), errorMsg));
+                    }
+                }
+            }
+        }
+
+    }
+
+    private class MyWebChromeClient extends WebChromeClient {
+        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
+            callback.invoke(origin, true, false);
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            LOG.e(newProgress + "");
+        }
+
+        @Override
+        public void onReceivedTitle(WebView view, String title) {
+            super.onReceivedTitle(view, title);
+        }
+
+        // Android > 5.0.1
+        public boolean onShowFileChooser(
+                WebView webView, ValueCallback<Uri[]> filePathCallback,
+                FileChooserParams fileChooserParams) {
+            return true;
+        }
+
+        private CustomViewCallback mCustomViewCallback;
+        //  横屏时,显示视频的view
+        private View mCustomView;
+
+
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void loadEventBus(LoginStatusEvent event) {
+        if (event != null && event.eventCode == LoginStatusConstants.LOGIN_OUT) {
+            isNeedRefresh = true;
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        EventBus.getDefault().unregister(this);
+    }
+}

+ 43 - 25
teacher/src/main/res/layout/fg_new_home_v2_layout.xml

@@ -87,32 +87,32 @@
             tools:visibility="visible" />
 
         <FrameLayout
-            android:paddingBottom="6dp"
-            tools:visibility="visible"
-            android:visibility="gone"
             android:id="@+id/fl_tenant_name"
             android:layout_width="0dp"
+            android:layout_height="wrap_content"
             android:layout_marginTop="11dp"
             android:layout_marginEnd="14dp"
-            android:layout_height="wrap_content"
+            android:paddingBottom="6dp"
+            android:visibility="gone"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/tv_teacher_name">
+            app:layout_constraintTop_toBottomOf="@+id/tv_teacher_name"
+            tools:visibility="visible">
 
             <TextView
                 android:id="@+id/tv_tenant_name"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:background="@drawable/shape_12ffa673_border_ffbf9a_4dp"
-                android:paddingStart="5dp"
-                android:paddingEnd="5dp"
                 android:layout_gravity="center_vertical"
+                android:background="@drawable/shape_12ffa673_border_ffbf9a_4dp"
+                android:ellipsize="end"
                 android:gravity="center_vertical"
                 android:includeFontPadding="false"
                 android:maxLines="1"
+                android:paddingStart="5dp"
                 android:paddingTop="1dp"
+                android:paddingEnd="5dp"
                 android:paddingBottom="1dp"
-                android:ellipsize="end"
                 android:textColor="@color/color_ff7b31"
                 android:textSize="@dimen/sp_12"
                 app:layout_constraintHorizontal_bias="0"
@@ -151,16 +151,16 @@
 
 
                 <ImageView
-                    android:layout_marginStart="14dp"
                     android:id="@+id/iv_cert"
                     android:layout_width="wrap_content"
                     android:layout_height="30dp"
+                    android:layout_marginStart="14dp"
+                    android:layout_marginTop="7dp"
                     android:layout_marginEnd="25dp"
                     android:adjustViewBounds="true"
                     android:clickable="false"
-                    android:layout_marginTop="7dp"
-                    app:layout_constraintLeft_toLeftOf="parent"
                     android:src="@drawable/icon_home_un_certification"
+                    app:layout_constraintLeft_toLeftOf="parent"
                     app:layout_constraintTop_toTopOf="parent" />
 
                 <TextView
@@ -176,11 +176,11 @@
                     android:text="认证失败"
                     android:textColor="@color/color_fb5e32"
                     android:textSize="@dimen/sp_10"
-                    tools:visibility="visible"
                     android:visibility="gone"
                     app:layout_constraintCircle="@+id/iv_cert"
                     app:layout_constraintCircleAngle="80"
-                    app:layout_constraintCircleRadius="75dp" />
+                    app:layout_constraintCircleRadius="75dp"
+                    tools:visibility="visible" />
 
                 <View
                     android:id="@+id/view_cert_red_point"
@@ -199,15 +199,15 @@
                     android:text="声部:"
                     android:textColor="@color/color_333333"
                     android:textSize="@dimen/sp_14"
-                    app:layout_constraintRight_toLeftOf="@+id/tv_current_subject"
                     app:layout_constraintBottom_toBottomOf="@+id/iv_cert"
+                    app:layout_constraintRight_toLeftOf="@+id/tv_current_subject"
                     app:layout_constraintTop_toTopOf="@+id/iv_cert" />
 
                 <TextView
-                    android:layout_marginEnd="14dp"
                     android:id="@+id/tv_current_subject"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
+                    android:layout_marginEnd="14dp"
                     android:drawableRight="@drawable/icon_arrow_down2"
                     android:drawablePadding="5dp"
                     android:gravity="center"
@@ -215,8 +215,8 @@
                     android:paddingBottom="5dp"
                     android:textColor="@color/color_666666"
                     android:textSize="@dimen/sp_14"
-                    app:layout_constraintRight_toRightOf="parent"
                     app:layout_constraintBottom_toBottomOf="@+id/tv_subject_title"
+                    app:layout_constraintRight_toRightOf="parent"
                     app:layout_constraintTop_toTopOf="@+id/tv_subject_title"
                     tools:text="中音萨克斯" />
 
@@ -273,11 +273,11 @@
 
 
                     <ImageView
-                        android:visibility="gone"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginEnd="11dp"
                         android:src="@drawable/icon_arrow_right_bg_tran"
+                        android:visibility="gone"
                         app:layout_constraintBottom_toBottomOf="parent"
                         app:layout_constraintRight_toRightOf="parent"
                         app:layout_constraintTop_toTopOf="parent" />
@@ -304,7 +304,6 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginLeft="@dimen/dp_14"
-                    app:layout_constraintDimensionRatio="w,1:2.63"
                     android:layout_marginTop="@dimen/dp_10"
                     android:layout_marginRight="@dimen/dp_14"
                     android:descendantFocusability="blocksDescendants"
@@ -317,6 +316,7 @@
                     app:banner_indicator_selected_color="@color/white"
                     app:banner_indicator_selected_width="12dp"
                     app:banner_radius="10dp"
+                    app:layout_constraintDimensionRatio="w,1:2.63"
                     app:layout_constraintTop_toBottomOf="@+id/fl_course_enter" />
 
                 <androidx.cardview.widget.CardView
@@ -330,9 +330,9 @@
                     app:cardBackgroundColor="@color/color_fef9f4"
                     app:cardCornerRadius="10dp"
                     app:cardElevation="0dp"
-                    tools:visibility="visible"
                     app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/banner">
+                    app:layout_constraintTop_toBottomOf="@+id/banner"
+                    tools:visibility="visible">
 
                     <androidx.constraintlayout.widget.ConstraintLayout
                         android:layout_width="match_parent"
@@ -423,10 +423,28 @@
                     android:id="@+id/top_help_line"
                     android:layout_width="1px"
                     android:layout_height="1px"
-                    app:layout_goneMarginTop="20dp"
                     android:layout_marginTop="8dp"
                     app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/fl_top_menu" />
+                    app:layout_constraintTop_toBottomOf="@+id/fl_top_menu"
+                    app:layout_goneMarginTop="20dp" />
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_home_statistics"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/dp_12"
+                    android:paddingStart="14dp"
+                    android:paddingEnd="14dp"
+                    app:layout_constraintTop_toBottomOf="@+id/top_help_line"
+                    tools:visibility="visible">
+
+                    <FrameLayout
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        android:id="@+id/fl_statistics_container"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
 
                 <androidx.constraintlayout.widget.ConstraintLayout
                     android:id="@+id/cl_hot_album"
@@ -434,8 +452,8 @@
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/dp_20"
                     android:visibility="gone"
-                    tools:visibility="visible"
-                    app:layout_constraintTop_toBottomOf="@+id/top_help_line">
+                    app:layout_constraintTop_toBottomOf="@+id/cl_home_statistics"
+                    tools:visibility="visible">
 
                     <View
                         android:id="@+id/tv_hot_album_line"

+ 27 - 0
teacher/src/main/res/layout/fg_sc_home_web.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+    <FrameLayout
+        android:id="@+id/view_parent"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <FrameLayout
+        android:paddingBottom="12dp"
+        android:paddingTop="12dp"
+        android:background="@color/white"
+        android:id="@+id/fl_error"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="gone">
+
+        <com.cooleshow.base.widgets.ErrorView
+            android:id="@+id/error_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center" />
+
+    </FrameLayout>
+</FrameLayout>

+ 28 - 5
usercenter/src/main/java/com/cooleshow/usercenter/helper/UserHelper.java

@@ -9,15 +9,18 @@ import com.cooleshow.base.data.net.CommonParamsHelper;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.utils.DateUtil;
 import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.SPUtils;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.usercenter.R;
 import com.cooleshow.usercenter.bean.StudentUserInfo;
 import com.cooleshow.usercenter.bean.TeacherUserInfo;
-import com.cooleshow.usercenter.bean.UserInfo;
 import com.cooleshow.usercenter.bean.UserLoginInfo;
 import com.cooleshow.usercenter.constants.UserConstants;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
 /**
  * Author by pq, Date nton 2022/4/22.
  */
@@ -147,9 +150,9 @@ public class UserHelper {
         //头像
         SPUtils.getInstance().put(USER_AVATAR, userInfo.heardUrl);
         //声部id
-        SPUtils.getInstance().put(SUBJECT_ID,userInfo.getSubjectId());
+        SPUtils.getInstance().put(SUBJECT_ID, userInfo.getSubjectId());
         //声部名称
-        SPUtils.getInstance().put(SUBJECT_NAME,userInfo.getSubjectName());
+        SPUtils.getInstance().put(SUBJECT_NAME, userInfo.getSubjectName());
         //机构id
         SPUtils.getInstance().put(TENANTID_KEY + "_" + getUserId(), userInfo.tenantId);
         //机构名称
@@ -227,6 +230,7 @@ public class UserHelper {
 
     /**
      * 是否是多角色账号
+     *
      * @return
      */
     public static boolean isMultiAccountUser() {
@@ -356,11 +360,11 @@ public class UserHelper {
         return isTenantAccount(tenantId);
     }
 
-    public static String getSubjectId(){
+    public static String getSubjectId() {
         return SPUtils.getInstance().getString(SUBJECT_ID);
     }
 
-    public static String getSubjectName(){
+    public static String getSubjectName() {
         return SPUtils.getInstance().getString(SUBJECT_NAME);
     }
 
@@ -383,4 +387,23 @@ public class UserHelper {
         updateHasShowGuideCompleted(CommonConfig.APP_MY_WORKS_GUIDE_TAG, false);
         CommonConfig.resetGuide();
     }
+
+    public static String getSpliceTokenUrl(String webViewUrl) {
+        String userToken = getUserToken();
+        if (!TextUtils.isEmpty(userToken)) {
+            try {
+                userToken = URLEncoder.encode(userToken, "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            boolean status = webViewUrl.contains("?");
+            if (status) {
+                webViewUrl = (webViewUrl + "&Authorization=" + userToken);
+            } else {
+                webViewUrl = (webViewUrl + "?Authorization=" + userToken);
+            }
+            LogUtils.i("pq", "webViewUrl:" + webViewUrl);
+        }
+        return webViewUrl;
+    }
 }