style(modules/web): lint code with eslint

This commit is contained in:
Xwite
2024-10-03 10:16:25 +08:00
parent 2b835c0ba4
commit ad27bd8e1f
16 changed files with 195 additions and 196 deletions

View File

@@ -3,8 +3,8 @@ import fs from "node:fs";
import process from "node:process";
if (!process.env.GITHUB_ENV) {
console.log("非Github WorkFlows环境取消文件复制")
process.exit()
console.log("非Github WorkFlows环境取消文件复制");
process.exit();
}
const LEGADO_ASSETS_WEB_VUE_DIR = new URL(
"../../../app/src/main/assets/web/vue",

View File

@@ -3,7 +3,10 @@ import axios from "axios";
const SECOND = 1000;
const ajax = axios.create({
baseURL: import.meta.env.VITE_API || localStorage.getItem("remoteIp") || location.origin,
baseURL:
import.meta.env.VITE_API ||
localStorage.getItem("remoteIp") ||
location.origin,
timeout: 120 * SECOND,
});

View File

@@ -4,8 +4,8 @@ import { ElMessage } from "element-plus/es";
/** https://github.com/gedoor/legado/tree/master/app/src/main/java/io/legado/app/api */
/** https://github.com/gedoor/legado/tree/master/app/src/main/java/io/legado/app/web */
let legado_http_origin
let legado_webSocket_origin
let legado_http_origin;
let legado_webSocket_origin;
const setLeagdoHttpUrl = (http_url) => {
let legado_webSocket_port;
@@ -19,29 +19,28 @@ const setLeagdoHttpUrl = (http_url) => {
} else {
legado_webSocket_port = protocol.startsWith("https:") ? "444" : "81";
}
legado_webSocket_origin =
`${protocol.startsWith("https:") ? "wss://" : "ws://"}${hostname}:${legado_webSocket_port}`;
legado_webSocket_origin = `${protocol.startsWith("https:") ? "wss://" : "ws://"}${hostname}:${legado_webSocket_port}`;
console.info("legado_server_config:");
console.table({legado_http_origin, legado_webSocket_origin});
console.table({ legado_http_origin, legado_webSocket_origin });
};
// 手动初始化 阅读web服务地址
setLeagdoHttpUrl(ajax.defaults.baseURL);
const testLeagdoHttpUrlConnection = async (http_url) => {
const {data = {}} = await ajax.get("/getReadConfig", {
const { data = {} } = await ajax.get("/getReadConfig", {
baseURL: http_url,
timeout: 3000
})
timeout: 3000,
});
// 返回结果应该是JSON 并有键值isSuccess
try {
if ("isSuccess" in data) return data.data
throw new Error("ReadConfig后端返回格式错误" )
if ("isSuccess" in data) return data.data;
throw new Error("ReadConfig后端返回格式错误");
} catch {
throw new Error("ReadConfig后端返回格式错误" )
throw new Error("ReadConfig后端返回格式错误");
}
}
};
const isSourecEditor = /source/i.test(location.href);
const APIExceptionHandler = (error) => {
@@ -59,7 +58,7 @@ ajax.interceptors.response.use((response) => response, APIExceptionHandler);
// 书架API
// Http
/** @returns {Promise<import("axios").AxiosResponse<{isSuccess: boolean, data: string, errorMsg:string}>>} */
const getReadConfig = () => ajax.get("/getReadConfig", {timeout: 3000});
const getReadConfig = () => ajax.get("/getReadConfig", { timeout: 3000 });
const saveReadConfig = (config) => ajax.post("/saveReadConfig", config);
const saveBookProgress = (bookProgress) =>
@@ -70,7 +69,7 @@ const saveBookProgressWithBeacon = (bookProgress) => {
// 常规请求可能会被取消 使用Fetch keep-alive 或者 navigator.sendBeacon
navigator.sendBeacon(
`${legado_http_origin}/saveBookProgress`,
JSON.stringify(bookProgress)
JSON.stringify(bookProgress),
);
};
@@ -81,22 +80,21 @@ const getChapterList = (/** @type {string} */ bookUrl) =>
const getBookContent = (
/** @type {string} */ bookUrl,
/** @type {number} */ chapterIndex
/** @type {number} */ chapterIndex,
) =>
ajax.get(
"/getBookContent?url=" +
encodeURIComponent(bookUrl) +
"&index=" +
chapterIndex
chapterIndex,
);
// webSocket
const search = (
/** @type {string} */ searchKey,
/** @type {(data: string) => void} */ onReceive,
/** @type {() => void} */ onFinish
/** @type {() => void} */ onFinish,
) => {
const url = `${legado_webSocket_origin}/searchBook`;
const socket = new WebSocket(url);
@@ -140,9 +138,8 @@ const debug = (
/** @type {string} */ sourceUrl,
/** @type {string} */ searchKey,
/** @type {(data: string) => void} */ onReceive,
/** @type {() => void} */ onFinish
/** @type {() => void} */ onFinish,
) => {
const url = `${legado_webSocket_origin}/${
isBookSource ? "bookSource" : "rssSource"
}Debug`;
@@ -168,16 +165,16 @@ const debug = (
* @param {string} coverUrl
*/
const getProxyCoverUrl = (coverUrl) => {
if(coverUrl.startsWith(legado_http_origin)) return coverUrl
if (coverUrl.startsWith(legado_http_origin)) return coverUrl;
return legado_http_origin + "/cover?path=" + encodeURIComponent(coverUrl);
}
};
/**
* 从阅读获取需要特定处理的图片
* @param {string} src
* @param {number|`${number}`} width
*/
const getProxyImageUrl = (src, width) => {
if (src.startsWith(legado_http_origin)) return src
if (src.startsWith(legado_http_origin)) return src;
return (
legado_http_origin +
"/image?path=" +
@@ -187,7 +184,7 @@ const getProxyImageUrl = (src, width) => {
"&width=" +
width
);
}
};
export default {
getReadConfig,

View File

@@ -57,14 +57,12 @@ const props = defineProps(["books", "isSearch"]);
const emit = defineEmits(["bookClick"]);
const handleClick = (book) => emit("bookClick", book);
const getCover = (coverUrl) => {
return isLegadoUrl(coverUrl)
? API.getProxyCoverUrl(coverUrl) : coverUrl
return isLegadoUrl(coverUrl) ? API.getProxyCoverUrl(coverUrl) : coverUrl;
};
const proxyImage = (event) => {
event.target.src = API.getProxyCoverUrl(event.target.src);
};
const subJustify = computed(() =>
props.isSearch ? "space-between" : "flex-start",
);

View File

@@ -34,11 +34,15 @@ const props = defineProps({
const getImageSrc = (content) => {
const imgPattern = /<img[^>]*src="([^"]*(?:"[^>]+\})?)"[^>]*>/;
const src = content.match(imgPattern)[1];
if (isLegadoUrl(src)) return API.getProxyImageUrl(src, useBookStore().config.readWidth)
if (isLegadoUrl(src))
return API.getProxyImageUrl(src, useBookStore().config.readWidth);
return src;
};
const proxyImage = (event) => {
event.target.src = API.getProxyImageUrl(event.target.src, useBookStore().config.readWidth);
event.target.src = API.getProxyImageUrl(
event.target.src,
useBookStore().config.readWidth,
);
};
const calculateWordCount = (paragraph) => {

View File

@@ -27,10 +27,7 @@ import CatalogItem from "./CatalogItem.vue";
const store = useBookStore();
const {
catalog,
popCataVisible, miniInterface
} = storeToRefs(store);
const { catalog, popCataVisible, miniInterface } = storeToRefs(store);
//主题
const isNight = computed(() => store.theme);
@@ -89,7 +86,6 @@ const gotoChapter = (note) => {
store.saveBookProgress();
emit("getContent", chapterIndex);
};
</script>
<style lang="scss" scoped>

View File

@@ -68,10 +68,7 @@
"
>确定</el-button
>
<el-button
type="primary"
size="small"
@click="loadFontFromURL"
<el-button type="primary" size="small" @click="loadFontFromURL"
>网络下载</el-button
>
</div>
@@ -196,14 +193,14 @@ watch(
API.saveReadConfig(newValue);
},
{
deep: 2 //深度为2
}
)
deep: 2, //深度为2
},
);
//主题颜色
const theme = computed(() => store.theme);
const isNight = computed(() => store.isNight);
const moonIcon = computed(() => theme.value == 6 ? "" : "");
const moonIcon = computed(() => (theme.value == 6 ? "" : ""));
const themeColors = [
{
background: "rgba(250, 245, 235, 0.8)",
@@ -234,7 +231,7 @@ const popupTheme = computed(() => {
});
const setTheme = (theme) => {
store.config.theme = theme;
}
};
//预置字体
const fonts = ref(["雅黑", "宋体", "楷书"]);
@@ -253,10 +250,7 @@ const setCustomFont = () => {
};
// 加载网络字体
const loadFontFromURL = () => {
ElMessageBox.prompt(
"请输入 字体网络链接",
"提示",
{
ElMessageBox.prompt("请输入 字体网络链接", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
inputPattern: /^https?:.+$/,
@@ -266,18 +260,16 @@ const loadFontFromURL = () => {
instance.confirmButtonLoading = true;
instance.confirmButtonText = "下载中……";
// instance.inputValue
const url = instance.inputValue
const url = instance.inputValue;
if (typeof FontFace !== "function") {
ElMessage.error("浏览器不支持FontFace");
return done();
}
const fontface = new FontFace(
customFontName.value,
`url("${url}")`
)
const fontface = new FontFace(customFontName.value, `url("${url}")`);
//@ts-ignore
document.fonts.add(fontface);
fontface.load()
fontface
.load()
//API.getBookShelf()
.then(function () {
instance.confirmButtonLoading = false;
@@ -295,9 +287,8 @@ const loadFontFromURL = () => {
done();
}
},
}
);
}
});
};
//字体大小
const fontSize = computed(() => {

View File

@@ -44,8 +44,8 @@ const startDebug = async () => {
try {
await API.saveSource(store.currentSource);
} catch (e) {
store.debugFinish()
throw e
store.debugFinish();
throw e;
}
API.debug(
store.currentSourceUrl,

View File

@@ -26,11 +26,11 @@ import { Link } from "@element-plus/icons-vue";
<el-link :icon="Link" href="/help/#httpTTSHelp" target="_blank"
>在线朗读规则</el-link
><br />
<el-link :icon="Link" href="/help/#webDavBookHelp" target="_blank"
> WebDav书籍简明使用教程</el-link
<el-link :icon="Link" href="/help/#webDavBookHelp" target="_blank">
WebDav书籍简明使用教程</el-link
><br />
<el-link :icon="Link" href="/help/#webDavHelp" target="_blank"
> WebDav备份教程</el-link
<el-link :icon="Link" href="/help/#webDavHelp" target="_blank">
WebDav备份教程</el-link
><br />
<el-link :icon="Link" href="https://regexr-cn.com/" target="_blank"
>正则表达式在线验证工具</el-link

View File

@@ -2,7 +2,7 @@ import { createApp } from "vue";
import App from "./App.vue";
import router from "@/router";
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");
@@ -17,5 +17,5 @@ watch(
} else {
document.documentElement.classList.remove("dark");
}
}
)
},
);

View File

@@ -17,5 +17,5 @@ watch(
} else {
document.documentElement.classList.remove("dark");
}
}
)
},
);

View File

@@ -52,7 +52,7 @@ export const useBookStore = defineStore("book", {
};
},
theme: (state) => {
return state.config.theme
return state.config.theme;
},
isNight: (state) => state.config.theme == 6,
},
@@ -114,10 +114,12 @@ export const useBookStore = defineStore("book", {
},
//读取阅读界面配置以初始化夜间模式 以免初次加载书架页面时闪屏
async loadReadConfig() {
return API.getReadConfig().then(response => response.data)
.then(({isSuccess, data}) =>
isSuccess && this.setConfig(JSON.parse(data))
)
}
return API.getReadConfig()
.then((response) => response.data)
.then(
({ isSuccess, data }) =>
isSuccess && this.setConfig(JSON.parse(data)),
);
},
},
});

View File

@@ -301,7 +301,10 @@ const toChapterPos = (pos) => {
};
// 60秒保存一次进度
const saveBookProgressThrottle = useThrottleFn(() => store.saveBookProgress(), 60000)
const saveBookProgressThrottle = useThrottleFn(
() => store.saveBookProgress(),
60000,
);
const onReadedLengthChange = (index, pos) => {
saveReadingBookProgressToBrowser(index, pos);
@@ -491,7 +494,7 @@ onMounted(() => {
bookAuthor: bookAuthor,
bookUrl: bookUrl,
index: chapterIndex,
chapterPos: chapterPos
chapterPos: chapterPos,
};
localStorage.setItem(bookUrl, JSON.stringify(book));
}
@@ -531,7 +534,6 @@ onMounted(() => {
);
});
onUnmounted(() => {
window.removeEventListener("keyup", handleKeyPress);
window.removeEventListener("keydown", ignoreKeyPress);
@@ -544,7 +546,6 @@ onUnmounted(() => {
scrollObserver = null;
});
const addToBookShelfConfirm = async () => {
const bookUrl = sessionStorage.getItem("bookUrl");
const bookName = sessionStorage.getItem("bookName");
@@ -553,10 +554,10 @@ const addToBookShelfConfirm = async () => {
sessionStorage.removeItem("isSeachBook");
// 阅读的是搜索的书籍 并未在书架
if (isSeachBook === "true") {
const addtoshelf = window.confirm(`是否将《${bookName}》放入书架?`)
const addtoshelf = window.confirm(`是否将《${bookName}》放入书架?`);
if (!addtoshelf) await API.deleteBook(book);
//按下返回键时不能触发 ElMessageBox.confirm
/* await ElMessageBox.confirm(
/* await ElMessageBox.confirm(
`是否将《${bookName}》放入书架?`,
"放入书架",
{
@@ -571,7 +572,7 @@ const addToBookShelfConfirm = async () => {
await API.deleteBook(book);
}) */
}
}
};
onBeforeRouteLeave(async (to, from, next) => {
await addToBookShelfConfirm();
next();

View File

@@ -20,7 +20,9 @@
<div class="recent-title">最近阅读</div>
<div class="reading-recent">
<el-tag
:type="readingRecent.name == '尚无阅读记录' ? 'warning' : 'primary'"
:type="
readingRecent.name == '尚无阅读记录' ? 'warning' : 'primary'
"
class="recent-book"
size="large"
@click="
@@ -29,7 +31,7 @@
readingRecent.name,
readingRecent.author,
readingRecent.chapterIndex,
readingRecent.chapterPos
readingRecent.chapterPos,
)
"
:class="{ 'no-point': readingRecent.url == '' }"
@@ -96,7 +98,7 @@ const readingRecent = ref({
const shelfWrapper = ref(null);
const { showLoading, closeLoading, loadingWrapper, isLoading } = useLoading(
shelfWrapper,
"正在获取书籍信息"
"正在获取书籍信息",
);
// 书架书籍和在线书籍搜索
@@ -145,7 +147,7 @@ const searchBook = () => {
if (books.value.length == 0) {
ElMessage.info("搜索结果为空");
}
}
},
);
};
@@ -182,7 +184,7 @@ const setIP = () => {
API.setLeagdoHttpUrl("http://" + ip);
//持久化
localStorage.setItem("remoteIp", ip);
fetchBookShelfData()
fetchBookShelfData();
done();
})
.catch(function (error) {
@@ -196,7 +198,7 @@ const setIP = () => {
done();
}
},
}
},
);
};
@@ -210,13 +212,20 @@ const handleBookClick = async (book) => {
durChapterPos = 0,
} = book;
// 判断是否为 searchBook
const isSeachBook = "respondTime" in book
const isSeachBook = "respondTime" in book;
if (isSeachBook) {
await API.saveBook(book);
}
toDetail(bookUrl, name, author, durChapterIndex, durChapterPos, isSeachBook);
};
const toDetail = (bookUrl, bookName, bookAuthor, chapterIndex, chapterPos, isSeachBook) => {
const toDetail = (
bookUrl,
bookName,
bookAuthor,
chapterIndex,
chapterPos,
isSeachBook,
) => {
if (bookName === "尚无阅读记录") return;
sessionStorage.setItem("bookUrl", bookUrl);
sessionStorage.setItem("bookName", bookName);
@@ -242,21 +251,20 @@ const loadShelf = () => {
store
.saveBookProgress()
//确保各种网络情况下同步请求先完成
.finally(fetchBookShelfData)
.finally(fetchBookShelfData),
);
};
const saveReadConfig = configStr => {
const saveReadConfig = (configStr) => {
try {
store.setConfig(JSON.parse(configStr));
} catch {
ElMessage.info("阅读界面解析错误");
}
}
};
const fetchBookShelfData = () => {
return API.getBookShelf()
.then((response) => {
return API.getBookShelf().then((response) => {
store.setConnectType("success");
if (response.data.isSuccess) {
//store.increaseBookNum(response.data.data.length);
@@ -265,14 +273,14 @@ const fetchBookShelfData = () => {
var x = a["durChapterTime"] || 0;
var y = b["durChapterTime"] || 0;
return y - x;
})
}),
);
} else {
ElMessage.error(response.data.errorMsg ?? "后端返回格式错误!");
}
store.setConnectStatus("已连接 " + API.legado_http_origin);
store.setNewConnect(false);
})
});
};
onMounted(() => {
@@ -290,12 +298,11 @@ onMounted(() => {
.catch(function (error) {
store.setConnectType("danger");
store.setConnectStatus("连接异常");
ElMessage.error("后端连接失败异常请检查阅读WEB服务或者设置其它可用IP")
ElMessage.error("后端连接失败异常请检查阅读WEB服务或者设置其它可用IP");
store.setNewConnect(false);
throw error;
});
});
</script>
<style lang="scss" scoped>

View File

@@ -8,7 +8,7 @@
<script setup>
import bookSourceConfig from "@/config/bookSourceEditConfig";
import rssSourceConfig from "@/config/rssSourceEditConfig";
import "@/assets/sourceeditor.css"
import "@/assets/sourceeditor.css";
import { useDark } from "@vueuse/core";
useDark();