Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

kunfei 3 лет назад
Родитель
Сommit
aabece0a9e

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/BookChapter-0270f952.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/BookShelf-751754db.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/BookShelf-c2410b56.js


+ 1 - 1
app/src/main/assets/web/vue/assets/config-752e04be.js → app/src/main/assets/web/vue/assets/config-0e6be994.js

@@ -1 +1 @@
-import{u as n,A as r}from"./index-f4927a88.js";import"./vendor-bf77f5c0.js";const i=n();i.setMiniInterface(window.innerWidth<750);window.onresize=()=>{i.setMiniInterface(window.innerWidth<750)};r.getReadConfig().then(a=>{var e=a.data.data;if(e){const t=n();let o=JSON.parse(e),s=t.config;o=Object.assign(s,o),t.setConfig(o)}});
+import{u as n,A as r}from"./index-76057bdd.js";import"./vendor-93648100.js";const i=n();i.setMiniInterface(window.innerWidth<750);window.onresize=()=>{i.setMiniInterface(window.innerWidth<750)};r.getReadConfig().then(a=>{var e=a.data.data;if(e){const t=n();let o=JSON.parse(e),s=t.config;o=Object.assign(s,o),t.setConfig(o)}});

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/el-loading-404c2b84.js


+ 0 - 1
app/src/main/assets/web/vue/assets/index-060af40e.css

@@ -1 +0,0 @@
-.el-link[data-v-aee57c78]{padding:4px}.el-text[data-v-aee57c78]{padding-top:20px}.error[data-v-d4c4e88b]{border-color:var(--el-color-error)!important;color:var(--el-color-error)!important;--el-checkbox-checked-text-color: var(--el-color-error);--el-checkbox-checked-bg-color: var(--el-color-error);--el-checkbox-checked-input-border-color: var(--el-color-error)}.tool[data-v-76d18c9a]{display:flex;margin:4px 0;justify-content:center}#source-list[data-v-76d18c9a]{margin-top:6px;height:calc(100vh - 119px)}#source-list[data-v-76d18c9a] .el-checkbox{margin-bottom:4px;width:100%}[data-v-fe904689] #debug-text{height:calc(100vh - 86px)}[data-v-7e91a802] .el-input{width:100%}[data-v-7e91a802] #source-json{height:calc(100vh - 50px)}[data-v-dcce2457] .el-tabs__header{margin-bottom:5px}.flex-space-between[data-v-dc7cd0f9]{display:flex;justify-content:space-between;align-items:baseline}.flex-column-center[data-v-dc7cd0f9]{display:flex;flex-direction:column;justify-content:center}.menu>.el-button[data-v-dc7cd0f9]{margin:4px;padding:1em;width:6em}.hotkeys-item .title[data-v-dc7cd0f9]{width:5em;display:flex;justify-content:flex-end;margin-right:1em}.hotkeys-item__content[data-v-dc7cd0f9]{display:flex;flex-wrap:wrap;flex:1}.hotkeys-item__content div[data-v-dc7cd0f9]{margin-bottom:1em}.hotkeys-item__content span[data-v-dc7cd0f9]{margin:.5em}[data-v-2cfb5302] .el-tab-pane{height:calc(100vh - 55px);padding-top:15px;padding-right:5px;overflow-y:auto}[data-v-2cfb5302] .el-tabs__header{margin:0}kbd{background-color:#fcfcfc;border-radius:3px;border:1px solid hsl(0deg,0%,80%);padding:4px 5px;font-weight:700}code{background-color:#f2f1f1;padding:.125rem .25rem;border-radius:.25rem;font-size:.835rem}body{padding:0;margin:0}.el-tabs__header{position:sticky;top:0px;z-index:2;background-color:#fff}.editor[data-v-e99e7704]{display:flex;height:100vh;overflow:hidden}.editor .left[data-v-e99e7704]{flex:1;margin-left:20px}.editor .right[data-v-e99e7704]{flex:1;width:360px;margin-right:20px}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/index-3a786cf8.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/index-76057bdd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/index-f4927a88.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
app/src/main/assets/web/vue/assets/vendor-93648100.js


+ 3 - 3
app/src/main/assets/web/vue/index.html

@@ -4,10 +4,10 @@
         <meta charset="UTF-8" />
         <meta charset="UTF-8" />
         <link rel="icon" href="./favicon.ico" />
         <link rel="icon" href="./favicon.ico" />
     <meta name="viewport" content="width=device-width,initial-scale=1.0" />
     <meta name="viewport" content="width=device-width,initial-scale=1.0" />
-      <script type="module" crossorigin src="./assets/index-f4927a88.js"></script>
-      <link rel="modulepreload" crossorigin href="./assets/vendor-bf77f5c0.js">
+      <script type="module" crossorigin src="./assets/index-76057bdd.js"></script>
+      <link rel="modulepreload" crossorigin href="./assets/vendor-93648100.js">
       <link rel="stylesheet" href="./assets/vendor-6f0d1692.css">
       <link rel="stylesheet" href="./assets/vendor-6f0d1692.css">
-      <link rel="stylesheet" href="./assets/index-060af40e.css">
+      <link rel="stylesheet" href="./assets/index-3a786cf8.css">
     </head>
     </head>
 
 
     <body>
     <body>

+ 20 - 0
app/src/main/java/io/legado/app/help/http/BackstageWebView.kt

@@ -1,10 +1,12 @@
 package io.legado.app.help.http
 package io.legado.app.help.http
 
 
 import android.annotation.SuppressLint
 import android.annotation.SuppressLint
+import android.net.http.SslError
 import android.os.Handler
 import android.os.Handler
 import android.os.Looper
 import android.os.Looper
 import android.util.AndroidRuntimeException
 import android.util.AndroidRuntimeException
 import android.webkit.CookieManager
 import android.webkit.CookieManager
+import android.webkit.SslErrorHandler
 import android.webkit.WebSettings
 import android.webkit.WebSettings
 import android.webkit.WebView
 import android.webkit.WebView
 import android.webkit.WebViewClient
 import android.webkit.WebViewClient
@@ -135,6 +137,15 @@ class BackstageWebView(
             mHandler.postDelayed(runnable, 1000)
             mHandler.postDelayed(runnable, 1000)
         }
         }
 
 
+        @SuppressLint("WebViewClientOnReceivedSslError")
+        override fun onReceivedSslError(
+            view: WebView?,
+            handler: SslErrorHandler?,
+            error: SslError?
+        ) {
+            handler?.proceed()
+        }
+
     }
     }
 
 
     private inner class EvalJsRunnable(
     private inner class EvalJsRunnable(
@@ -197,6 +208,15 @@ class BackstageWebView(
             }
             }
         }
         }
 
 
+        @SuppressLint("WebViewClientOnReceivedSslError")
+        override fun onReceivedSslError(
+            view: WebView?,
+            handler: SslErrorHandler?,
+            error: SslError?
+        ) {
+            handler?.proceed()
+        }
+
     }
     }
 
 
     private class LoadJsRunnable(
     private class LoadJsRunnable(

+ 12 - 0
app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt

@@ -3,6 +3,7 @@ package io.legado.app.ui.browser
 import android.annotation.SuppressLint
 import android.annotation.SuppressLint
 import android.content.pm.ActivityInfo
 import android.content.pm.ActivityInfo
 import android.net.Uri
 import android.net.Uri
+import android.net.http.SslError
 import android.os.Bundle
 import android.os.Bundle
 import android.view.KeyEvent
 import android.view.KeyEvent
 import android.view.Menu
 import android.view.Menu
@@ -247,12 +248,14 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
                 "http", "https" -> {
                 "http", "https" -> {
                     return false
                     return false
                 }
                 }
+
                 "legado", "yuedu" -> {
                 "legado", "yuedu" -> {
                     startActivity<OnLineImportActivity> {
                     startActivity<OnLineImportActivity> {
                         data = url
                         data = url
                     }
                     }
                     return true
                     return true
                 }
                 }
+
                 else -> {
                 else -> {
                     binding.root.longSnackbar("跳转其它应用", "确认") {
                     binding.root.longSnackbar("跳转其它应用", "确认") {
                         openUrl(url)
                         openUrl(url)
@@ -262,6 +265,15 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
             }
             }
         }
         }
 
 
+        @SuppressLint("WebViewClientOnReceivedSslError")
+        override fun onReceivedSslError(
+            view: WebView?,
+            handler: SslErrorHandler?,
+            error: SslError?
+        ) {
+            handler?.proceed()
+        }
+
     }
     }
 
 
 }
 }

+ 10 - 0
app/src/main/java/io/legado/app/ui/login/WebViewLoginFragment.kt

@@ -2,6 +2,7 @@ package io.legado.app.ui.login
 
 
 import android.annotation.SuppressLint
 import android.annotation.SuppressLint
 import android.graphics.Bitmap
 import android.graphics.Bitmap
+import android.net.http.SslError
 import android.os.Bundle
 import android.os.Bundle
 import android.view.Menu
 import android.view.Menu
 import android.view.MenuItem
 import android.view.MenuItem
@@ -85,6 +86,15 @@ class WebViewLoginFragment : BaseFragment(R.layout.fragment_web_view_login) {
                 }
                 }
                 super.onPageFinished(view, url)
                 super.onPageFinished(view, url)
             }
             }
+
+            @SuppressLint("WebViewClientOnReceivedSslError")
+            override fun onReceivedSslError(
+                view: WebView?,
+                handler: SslErrorHandler?,
+                error: SslError?
+            ) {
+                handler?.proceed()
+            }
         }
         }
         binding.webView.webChromeClient = object : WebChromeClient() {
         binding.webView.webChromeClient = object : WebChromeClient() {
 
 

+ 16 - 0
app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
 import android.content.pm.ActivityInfo
 import android.content.pm.ActivityInfo
 import android.content.res.Configuration
 import android.content.res.Configuration
 import android.net.Uri
 import android.net.Uri
+import android.net.http.SslError
 import android.os.Bundle
 import android.os.Bundle
 import android.view.*
 import android.view.*
 import android.webkit.*
 import android.webkit.*
@@ -66,6 +67,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
                 window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN)
                 window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN)
                 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
                 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
             }
             }
+
             Configuration.ORIENTATION_PORTRAIT -> {
             Configuration.ORIENTATION_PORTRAIT -> {
                 window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
                 window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
                 window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN)
                 window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN)
@@ -95,6 +97,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
             R.id.menu_rss_refresh -> viewModel.refresh {
             R.id.menu_rss_refresh -> viewModel.refresh {
                 binding.webView.reload()
                 binding.webView.reload()
             }
             }
+
             R.id.menu_rss_star -> viewModel.favorite()
             R.id.menu_rss_star -> viewModel.favorite()
             R.id.menu_share_it -> {
             R.id.menu_share_it -> {
                 binding.webView.url?.let {
                 binding.webView.url?.let {
@@ -103,11 +106,13 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
                     share(it.link)
                     share(it.link)
                 } ?: toastOnUi(R.string.null_url)
                 } ?: toastOnUi(R.string.null_url)
             }
             }
+
             R.id.menu_aloud -> readAloud()
             R.id.menu_aloud -> readAloud()
             R.id.menu_login -> startActivity<SourceLoginActivity> {
             R.id.menu_login -> startActivity<SourceLoginActivity> {
                 putExtra("type", "rssSource")
                 putExtra("type", "rssSource")
                 putExtra("key", viewModel.rssSource?.loginUrl)
                 putExtra("key", viewModel.rssSource?.loginUrl)
             }
             }
+
             R.id.menu_browser_open -> binding.webView.url?.let {
             R.id.menu_browser_open -> binding.webView.url?.let {
                 openUrl(it)
                 openUrl(it)
             } ?: toastOnUi("url null")
             } ?: toastOnUi("url null")
@@ -397,12 +402,14 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
                 "http", "https", "jsbridge" -> {
                 "http", "https", "jsbridge" -> {
                     return false
                     return false
                 }
                 }
+
                 "legado", "yuedu" -> {
                 "legado", "yuedu" -> {
                     startActivity<OnLineImportActivity> {
                     startActivity<OnLineImportActivity> {
                         data = url
                         data = url
                     }
                     }
                     return true
                     return true
                 }
                 }
+
                 else -> {
                 else -> {
                     binding.root.longSnackbar(R.string.jump_to_another_app, R.string.confirm) {
                     binding.root.longSnackbar(R.string.jump_to_another_app, R.string.confirm) {
                         openUrl(url)
                         openUrl(url)
@@ -412,6 +419,15 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
             }
             }
         }
         }
 
 
+        @SuppressLint("WebViewClientOnReceivedSslError")
+        override fun onReceivedSslError(
+            view: WebView?,
+            handler: SslErrorHandler?,
+            error: SslError?
+        ) {
+            handler?.proceed()
+        }
+
     }
     }
 
 
 }
 }

+ 20 - 5
modules/web/src/components/SourceItem.vue

@@ -2,23 +2,35 @@
   <el-checkbox
   <el-checkbox
     size="large"
     size="large"
     border
     border
-    :label="source"
-    :class="{ error: errorPushSources.includes(source) }"
-    @change="handleSourceClick(source)"
+    :label="sourceUrl"
+    :class="{
+      error: errorPushSources.includes(source),
+      edit: sourceUrl == currentSourceUrl,
+    }"
   >
   >
     {{ source.bookSourceName || source.sourceName }}
     {{ source.bookSourceName || source.sourceName }}
+    <el-button text :icon="Edit" @click="handleSourceClick(source)" />
   </el-checkbox>
   </el-checkbox>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-defineProps(["source"]);
+import { Edit } from "@element-plus/icons-vue";
+
+const props = defineProps(["source"]);
+const sourceUrl = props.source.bookSourceUrl || props.source.sourceUrl;
 const store = useSourceStore();
 const store = useSourceStore();
-const { errorPushSources } = storeToRefs(store);
+const { errorPushSources, currentSourceUrl } = storeToRefs(store);
 const handleSourceClick = (source) => {
 const handleSourceClick = (source) => {
   store.changeCurrentSource(source);
   store.changeCurrentSource(source);
 };
 };
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
+:deep(.el-checkbox__label) {
+  flex: 1;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
 .error {
 .error {
   border-color: var(--el-color-error) !important;
   border-color: var(--el-color-error) !important;
   color: var(--el-color-error) !important;
   color: var(--el-color-error) !important;
@@ -26,4 +38,7 @@ const handleSourceClick = (source) => {
   --el-checkbox-checked-bg-color: var(--el-color-error);
   --el-checkbox-checked-bg-color: var(--el-color-error);
   --el-checkbox-checked-input-border-color: var(--el-color-error);
   --el-checkbox-checked-input-border-color: var(--el-color-error);
 }
 }
+.edit {
+  border-color: var(--el-color-dark) !important;
+}
 </style>
 </style>

+ 21 - 7
modules/web/src/components/SourceList.vue

@@ -18,7 +18,7 @@
       type="danger"
       type="danger"
       :icon="Delete"
       :icon="Delete"
       @click="deleteSelectSources"
       @click="deleteSelectSources"
-      :disabled="sourceSelect.length === 0"
+      :disabled="sourceUrlSelect.length === 0"
       >删除</el-button
       >删除</el-button
     >
     >
     <el-button
     <el-button
@@ -29,7 +29,7 @@
       >清空</el-button
       >清空</el-button
     >
     >
   </div>
   </div>
-  <el-checkbox-group id="source-list" v-model="sourceSelect">
+  <el-checkbox-group id="source-list" v-model="sourceUrlSelect">
     <virtual-list
     <virtual-list
       style="height: 100%; overflow-y: auto; overflow-x: hidden"
       style="height: 100%; overflow-y: auto; overflow-x: hidden"
       :data-key="(source) => source.bookSourceUrl || source.sourceUrl"
       :data-key="(source) => source.bookSourceUrl || source.sourceUrl"
@@ -48,22 +48,37 @@ import VirtualList from "vue3-virtual-scroll-list";
 import SourceItem from "./SourceItem.vue";
 import SourceItem from "./SourceItem.vue";
 
 
 const store = useSourceStore();
 const store = useSourceStore();
-const sourceSelect = ref([]);
+const sourceUrlSelect = ref([]);
 const searchKey = ref("");
 const searchKey = ref("");
 const { sources } = storeToRefs(store);
 const { sources } = storeToRefs(store);
 const isBookSource = computed(() => {
 const isBookSource = computed(() => {
   return /bookSource/.test(window.location.href);
   return /bookSource/.test(window.location.href);
 });
 });
+const sourceSelect = computed(() => {
+  let temp = sourceUrlSelect.value,
+    selectUrlsLength = temp.length;
+  if (selectUrlsLength == 0) return [];
+  let searchKey = "sourceUrl";
+  if (isBookSource.value) searchKey = "bookSourceUrl";
+  return sources.value.filter((source) => {
+    let searchIndex = temp.indexOf(source[searchKey]);
+    if (searchIndex > -1) {
+      temp.splice(searchIndex, 1);
+      return true;
+    }
+    return false;
+  });
+});
 const deleteSelectSources = () => {
 const deleteSelectSources = () => {
   API.deleteSource(sourceSelect.value).then(({ data }) => {
   API.deleteSource(sourceSelect.value).then(({ data }) => {
     if (!data.isSuccess) return ElMessage.error(data.errorMsg);
     if (!data.isSuccess) return ElMessage.error(data.errorMsg);
     store.deleteSources(sourceSelect.value);
     store.deleteSources(sourceSelect.value);
-    sourceSelect.value = [];
+    sourceUrlSelect.value = [];
   });
   });
 };
 };
 const clearAllSources = () => {
 const clearAllSources = () => {
   store.clearAllSource();
   store.clearAllSource();
-  sourceSelect.value = [];
+  sourceUrlSelect.value = [];
 };
 };
 //筛选源
 //筛选源
 const sourcesFiltered = computed(() => {
 const sourcesFiltered = computed(() => {
@@ -104,7 +119,7 @@ const importSourceFile = () => {
 const outExport = () => {
 const outExport = () => {
   const exportFile = document.createElement("a");
   const exportFile = document.createElement("a");
   let sources =
   let sources =
-      sourceSelect.value.length === 0
+      sourceUrlSelect.value.length === 0
         ? sourcesFiltered.value
         ? sourcesFiltered.value
         : sourceSelect.value,
         : sourceSelect.value,
     sourceType = isBookSource.value ? "BookSource" : "RssSource";
     sourceType = isBookSource.value ? "BookSource" : "RssSource";
@@ -131,7 +146,6 @@ const outExport = () => {
 #source-list {
 #source-list {
   margin-top: 6px;
   margin-top: 6px;
   height: calc(100vh - 112px - 7px);
   height: calc(100vh - 112px - 7px);
-
   :deep(.el-checkbox) {
   :deep(.el-checkbox) {
     margin-bottom: 4px;
     margin-bottom: 4px;
     width: 100%;
     width: 100%;

Некоторые файлы не были показаны из-за большого количества измененных файлов