fix(web): fix issue of tags component flickering when fisrt paint night theme bookshelf

commit 8c268e4f59 unfixed
This commit is contained in:
Xwite
2024-10-03 11:42:25 +08:00
parent 7f4c3f38f2
commit d461a8f42b
4 changed files with 276 additions and 232 deletions
-3
View File
@@ -5,9 +5,6 @@ import store from "@/store";
import "element-plus/theme-chalk/dark/css-vars.css"; import "element-plus/theme-chalk/dark/css-vars.css";
createApp(App).use(store).use(router).mount("#app"); createApp(App).use(store).use(router).mount("#app");
//读取阅读界面设置
useBookStore().loadReadConfig();
// 书架 同步Element PLUS 夜间模式 // 书架 同步Element PLUS 夜间模式
watch( watch(
() => useBookStore().isNight, () => useBookStore().isNight,
-2
View File
@@ -6,8 +6,6 @@ import "element-plus/theme-chalk/dark/css-vars.css";
createApp(App).use(store).use(bookRouter).mount("#app"); createApp(App).use(store).use(bookRouter).mount("#app");
//读取阅读界面设置
useBookStore().loadReadConfig();
// 同步Element PLUS 夜间模式 // 同步Element PLUS 夜间模式
watch( watch(
() => useBookStore().isNight, () => useBookStore().isNight,
-9
View File
@@ -112,14 +112,5 @@ export const useBookStore = defineStore("book", {
if (!this.bookProgress) return Promise.resolve(); if (!this.bookProgress) return Promise.resolve();
return API.saveBookProgress(this.bookProgress); return API.saveBookProgress(this.bookProgress);
}, },
//读取阅读界面配置以初始化夜间模式 以免初次加载书架页面时闪屏
async loadReadConfig() {
return API.getReadConfig()
.then((response) => response.data)
.then(
({ isSuccess, data }) =>
isSuccess && this.setConfig(JSON.parse(data)),
);
},
}, },
}); });
+108 -50
View File
@@ -8,9 +8,9 @@
<div class="search-wrapper"> <div class="search-wrapper">
<el-input <el-input
placeholder="搜索书籍,在线书籍自动加入书架" placeholder="搜索书籍,在线书籍自动加入书架"
v-model="search" v-model="searchWord"
class="search-input" class="search-input"
:prefix-icon="Search" :prefix-icon="SearchIcon"
@keyup.enter="searchBook" @keyup.enter="searchBook"
> >
</el-input> </el-input>
@@ -76,59 +76,75 @@
</div> </div>
</template> </template>
<script setup> <script>
import "@/assets/bookshelf.css"; import "@/assets/bookshelf.css";
import "@/assets/fonts/shelffont.css"; import "@/assets/fonts/shelffont.css";
import { useBookStore } from "@/store"; import { useBookStore } from "@/store";
import githubUrl from "@/assets/imgs/github.png"; import githubUrl from "@/assets/imgs/github.png";
import { useLoading } from "@/hooks/loading"; import { useLoading } from "@/hooks/loading";
import { Search } from "@element-plus/icons-vue"; import { Search as SearchIcon } from "@element-plus/icons-vue";
import API from "@api"; import API from "@api";
const store = useBookStore(); export default defineComponent({
const isNight = computed(() => store.isNight); beforeRouteEnter: (to, from, next) => {
API.getReadConfig()
.then((response) => response.data)
.then(({ isSuccess, data }) => {
if (isSuccess) {
next((vm) => {
console.log("初始化加载阅读界面配置成功");
vm.saveReadConfig(data);
});
}
})
.catch(() => next());
},
setup: () => {
const store = useBookStore();
const isNight = computed(() => store.isNight);
const readingRecent = ref({ const readingRecent = ref({
name: "尚无阅读记录", name: "尚无阅读记录",
author: "", author: "",
url: "", url: "",
chapterIndex: 0, chapterIndex: 0,
chapterPos: 0, chapterPos: 0,
}); });
const shelfWrapper = ref(null); const shelfWrapper = ref(null);
const { showLoading, closeLoading, loadingWrapper, isLoading } = useLoading( const { showLoading, closeLoading, loadingWrapper, isLoading } = useLoading(
shelfWrapper, shelfWrapper,
"正在获取书籍信息", "正在获取书籍信息",
); );
// 书架书籍和在线书籍搜索 // 书架书籍和在线书籍搜索
const books = shallowRef([]); const books = shallowRef([]);
const shelf = computed(() => store.shelf); const shelf = computed(() => store.shelf);
const search = ref(""); const searchWord = ref("");
const isSearching = ref(false); const isSearching = ref(false);
watchEffect(() => { watchEffect(() => {
if (isSearching.value && search.value != "") return; if (isSearching.value && searchWord.value != "") return;
isSearching.value = false; isSearching.value = false;
books.value = []; books.value = [];
if (search.value == "") { if (searchWord.value == "") {
books.value = shelf.value; books.value = shelf.value;
return; return;
} }
books.value = shelf.value.filter((book) => { books.value = shelf.value.filter((book) => {
return ( return (
book.name.includes(search.value) || book.author.includes(search.value) book.name.includes(searchWord.value) ||
book.author.includes(searchWord.value)
); );
}); });
}); });
//搜索在线书籍 //搜索在线书籍
const searchBook = () => { const searchBook = () => {
if (search.value == "") return; if (searchWord.value == "") return;
books.value = []; books.value = [];
store.clearSearchBooks(); store.clearSearchBooks();
showLoading(); showLoading();
isSearching.value = true; isSearching.value = true;
API.search( API.search(
search.value, searchWord.value,
(data) => { (data) => {
if (isLoading) { if (isLoading) {
closeLoading(); closeLoading();
@@ -149,13 +165,13 @@ const searchBook = () => {
} }
}, },
); );
}; };
//连接状态 //连接状态
const connectStatus = computed(() => store.connectStatus); const connectStatus = computed(() => store.connectStatus);
const connectType = computed(() => store.connectType); const connectType = computed(() => store.connectType);
const newConnect = computed(() => store.newConnect); const newConnect = computed(() => store.newConnect);
const setIP = () => { const setIP = () => {
ElMessageBox.prompt( ElMessageBox.prompt(
"请输入 IP 和端口 ( 如:127.0.0.1:9527 或者通过内网穿透的地址)", "请输入 IP 和端口 ( 如:127.0.0.1:9527 或者通过内网穿透的地址)",
"提示", "提示",
@@ -200,10 +216,10 @@ const setIP = () => {
}, },
}, },
); );
}; };
const router = useRouter(); const router = useRouter();
const handleBookClick = async (book) => { const handleBookClick = async (book) => {
const { const {
bookUrl, bookUrl,
name, name,
@@ -216,16 +232,23 @@ const handleBookClick = async (book) => {
if (isSeachBook) { if (isSeachBook) {
await API.saveBook(book); await API.saveBook(book);
} }
toDetail(bookUrl, name, author, durChapterIndex, durChapterPos, isSeachBook); toDetail(
}; bookUrl,
const toDetail = ( name,
author,
durChapterIndex,
durChapterPos,
isSeachBook,
);
};
const toDetail = (
bookUrl, bookUrl,
bookName, bookName,
bookAuthor, bookAuthor,
chapterIndex, chapterIndex,
chapterPos, chapterPos,
isSeachBook, isSeachBook,
) => { ) => {
if (bookName === "尚无阅读记录") return; if (bookName === "尚无阅读记录") return;
sessionStorage.setItem("bookUrl", bookUrl); sessionStorage.setItem("bookUrl", bookUrl);
sessionStorage.setItem("bookName", bookName); sessionStorage.setItem("bookName", bookName);
@@ -240,30 +263,33 @@ const toDetail = (
chapterIndex: chapterIndex, chapterIndex: chapterIndex,
chapterPos: chapterPos, chapterPos: chapterPos,
}; };
localStorage.setItem("readingRecent", JSON.stringify(readingRecent.value)); localStorage.setItem(
"readingRecent",
JSON.stringify(readingRecent.value),
);
router.push({ router.push({
path: "/chapter", path: "/chapter",
}); });
}; };
const loadShelf = () => { const loadShelf = () => {
loadingWrapper( loadingWrapper(
store store
.saveBookProgress() .saveBookProgress()
//确保各种网络情况下同步请求先完成 //确保各种网络情况下同步请求先完成
.finally(fetchBookShelfData), .finally(fetchBookShelfData),
); );
}; };
const saveReadConfig = (configStr) => { const saveReadConfig = (configStr) => {
try { try {
store.setConfig(JSON.parse(configStr)); store.setConfig(JSON.parse(configStr));
} catch { } catch {
ElMessage.info("阅读界面解析错误"); ElMessage.info("阅读界面配置解析错误");
} }
}; };
const fetchBookShelfData = () => { const fetchBookShelfData = () => {
return API.getBookShelf().then((response) => { return API.getBookShelf().then((response) => {
store.setConnectType("success"); store.setConnectType("success");
if (response.data.isSuccess) { if (response.data.isSuccess) {
@@ -281,9 +307,8 @@ const fetchBookShelfData = () => {
store.setConnectStatus("已连接 " + API.legado_http_origin); store.setConnectStatus("已连接 " + API.legado_http_origin);
store.setNewConnect(false); store.setNewConnect(false);
}); });
}; };
onMounted(() => {
onMounted(() => {
//获取最近阅读书籍 //获取最近阅读书籍
let readingRecentStr = localStorage.getItem("readingRecent"); let readingRecentStr = localStorage.getItem("readingRecent");
if (readingRecentStr != null) { if (readingRecentStr != null) {
@@ -292,16 +317,37 @@ onMounted(() => {
readingRecent.value.chapterIndex = 0; readingRecent.value.chapterIndex = 0;
} }
} }
console.log("bookshelf mounted");
API.testLeagdoHttpUrlConnection() API.testLeagdoHttpUrlConnection()
//.then(saveReadConfig) 应该在组件挂载前读取阅读配置 //.then(saveReadConfig) 应该在组件挂载前读取阅读配置
.then(loadShelf) .then(loadShelf)
.catch(function (error) { .catch(function (error) {
store.setConnectType("danger"); store.setConnectType("danger");
store.setConnectStatus("连接异常"); store.setConnectStatus("连接异常");
ElMessage.error("后端连接失败异常,请检查阅读WEB服务或者设置其它可用IP"); ElMessage.error(
"后端连接失败异常,请检查阅读WEB服务或者设置其它可用IP",
);
store.setNewConnect(false); store.setNewConnect(false);
throw error; throw error;
}); });
});
return {
setIP,
isNight,
connectStatus,
connectType,
newConnect,
saveReadConfig,
readingRecent,
searchBook,
books,
handleBookClick,
isSearching,
SearchIcon,
githubUrl,
searchWord,
};
},
}); });
</script> </script>
@@ -419,34 +465,42 @@ onMounted(() => {
.index-wrapper { .index-wrapper {
overflow-x: hidden; overflow-x: hidden;
flex-direction: column; flex-direction: column;
.navigation-wrapper { .navigation-wrapper {
padding: 20px 24px; padding: 20px 24px;
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
.navigation-title-wrapper { .navigation-title-wrapper {
white-space: nowrap; white-space: nowrap;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-end; align-items: flex-end;
} }
.bottom-wrapper { .bottom-wrapper {
flex-direction: row; flex-direction: row;
> * { > * {
flex-grow: 1; flex-grow: 1;
margin-top: 18px; margin-top: 18px;
.reading-recent, .reading-recent,
.setting-item { .setting-item {
margin-bottom: 0px; margin-bottom: 0px;
} }
} }
} }
.bottom-icons { .bottom-icons {
display: none; display: none;
} }
} }
.shelf-wrapper { .shelf-wrapper {
padding: 0; padding: 0;
flex-grow: 1; flex-grow: 1;
:deep(.el-loading-spinner) { :deep(.el-loading-spinner) {
display: none; display: none;
} }
@@ -457,20 +511,24 @@ onMounted(() => {
.night { .night {
:deep(.navigation-wrapper) { :deep(.navigation-wrapper) {
background-color: #454545; background-color: #454545;
.navigation-title { .navigation-title {
color: #aeaeae; color: #aeaeae;
} }
.search-wrapper { .search-wrapper {
.search-input { .search-input {
.el-input__wrapper { .el-input__wrapper {
background-color: #454545; background-color: #454545;
} }
.el-input__inner { .el-input__inner {
color: #b1b1b1; color: #b1b1b1;
} }
} }
} }
} }
:deep(.shelf-wrapper) { :deep(.shelf-wrapper) {
background-color: #161819; background-color: #161819;
} }