mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-08 06:16:27 +08:00
262 lines
7.9 KiB
Vue
262 lines
7.9 KiB
Vue
<template>
|
|
<router-view v-slot="{ Component }">
|
|
<!-- <transition name="fade"> -->
|
|
<component ref="view" :is="Component" />
|
|
<!-- </transition> -->
|
|
</router-view>
|
|
<QuickCommand />
|
|
</template>
|
|
|
|
<script>
|
|
import { defineComponent } from "vue";
|
|
import { setCssVar } from "quasar";
|
|
import { utoolsFull, dbManager } from "./js/utools.js";
|
|
import { useCommandManager } from "./js/commandManager.js";
|
|
import programmings from "./js/options/programs.js";
|
|
import defaultProfile from "./js/options/defaultProfile.js";
|
|
import Cron from "croner";
|
|
import QuickCommand from "components/quickcommandUI/QuickCommand";
|
|
// import autoDetach from "./js/autoDetach.js";
|
|
|
|
export default defineComponent({
|
|
components: { QuickCommand },
|
|
name: "App",
|
|
data() {
|
|
return {
|
|
commandManager: useCommandManager(),
|
|
setCssVar: setCssVar,
|
|
programs: programmings,
|
|
profile: defaultProfile.common,
|
|
nativeProfile: defaultProfile.native,
|
|
utools: utoolsFull,
|
|
cronJobs: {},
|
|
enterData: {},
|
|
subInputEvent: null,
|
|
isVIP: false,
|
|
};
|
|
},
|
|
created: function () {
|
|
this.init();
|
|
},
|
|
methods: {
|
|
init() {
|
|
window.utools = window.getuToolsLite();
|
|
if (!this.checkVer()) return;
|
|
this.firstRun();
|
|
this.startUp();
|
|
},
|
|
checkVer() {
|
|
const requiredVersion = "2.6.1";
|
|
// 有可能版本低到没有这个接口
|
|
let version = utools.getAppVersion?.();
|
|
if (!version || version < requiredVersion) {
|
|
this.$router.push({
|
|
name: "needupdate",
|
|
params: { version: version, requiredVersion: requiredVersion },
|
|
});
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
startUp() {
|
|
this.loadProfile();
|
|
this.startUpOnce();
|
|
this.utools.onPluginEnter((enter) => {
|
|
this.enterPlugin(enter);
|
|
});
|
|
window.isAppVersion4() &&
|
|
this.utools.onMainPush(
|
|
async ({ code, payload }) => {
|
|
let result = await this.runCommand(code, payload, 5000);
|
|
return result.map((x) => {
|
|
return {
|
|
text: x,
|
|
};
|
|
});
|
|
},
|
|
({ option }) => {
|
|
window.quickcommand.writeClipboard(option.text);
|
|
window.utools.showNotification("已复制");
|
|
}
|
|
);
|
|
this.utools.onPluginOut(() => {
|
|
this.outPlugin();
|
|
});
|
|
},
|
|
loadProfile() {
|
|
let commonProfile = dbManager.getDB("cfg_profile");
|
|
let nativeProfile = dbManager.getDB(
|
|
"cfg_" + utools.getNativeId() + "_profile"
|
|
);
|
|
this.profile = Object.assign(
|
|
window.lodashM.cloneDeep(this.profile),
|
|
commonProfile
|
|
);
|
|
this.nativeProfile = Object.assign(
|
|
window.lodashM.cloneDeep(this.nativeProfile),
|
|
nativeProfile
|
|
);
|
|
},
|
|
saveProfile() {
|
|
dbManager.putDB(window.lodashM.cloneDeep(this.profile), "cfg_profile");
|
|
dbManager.putDB(
|
|
window.lodashM.cloneDeep(this.nativeProfile),
|
|
"cfg_" + utools.getNativeId() + "_profile"
|
|
);
|
|
},
|
|
// 插件全生命周期只运行一次,主要针对多开的情况
|
|
startUpOnce() {
|
|
if (window.multiProcessDetection())
|
|
return console.log("multiProcess Detected");
|
|
// 计划任务
|
|
window.lodashM.forIn(
|
|
this.nativeProfile.crontabs,
|
|
(cronExp, featureCode) => {
|
|
this.runCronTask(featureCode, cronExp);
|
|
}
|
|
);
|
|
// 快捷命令服务
|
|
if (this.nativeProfile.serverStatus) {
|
|
window.quickcommandHttpServer().run(this.nativeProfile.serverPort);
|
|
console.log("Server Start...");
|
|
}
|
|
},
|
|
enterPlugin(enter) {
|
|
this.updateExp();
|
|
this.$q.dark.set(utools.isDarkColors());
|
|
this.enterData = enter;
|
|
this.$router.push(enter.code);
|
|
},
|
|
outPlugin() {
|
|
// 退出时保存RunCode和RunComposer的命令
|
|
if (["code", "composer"].includes(this.$route.name)) {
|
|
let currentCommand = window.lodashM.cloneDeep(
|
|
this.commandManager.state.currentCommand
|
|
);
|
|
|
|
if (this.$route.name === "composer") {
|
|
currentCommand =
|
|
this.commandManager.getLitedComposerCommand(currentCommand);
|
|
}
|
|
|
|
dbManager.putDB(currentCommand, `cfg_${this.$route.name}History`);
|
|
}
|
|
|
|
this.$router.push("/");
|
|
this.saveProfile();
|
|
},
|
|
runCronTask(featureCode, cronExp) {
|
|
this.cronJobs[featureCode] = Cron(cronExp, () => {
|
|
this.runCommandSilently(featureCode);
|
|
});
|
|
},
|
|
runCommand(featureCode, mainInput, timeout = false) {
|
|
return new Promise((reslove, reject) => {
|
|
timeout &&
|
|
setTimeout(() => {
|
|
reslove([`超过${timeout}ms未响应`]);
|
|
}, timeout);
|
|
let command = dbManager.getDB("qc_" + featureCode);
|
|
let commandCode = command.cmd;
|
|
if (mainInput)
|
|
commandCode = commandCode.replace(/\{\{input\}\}/g, mainInput);
|
|
if (command.program === "quickcommand") {
|
|
window.runCodeInSandbox(commandCode, (stdout, stderr) => {
|
|
stderr && reslove([stderr.toString()]);
|
|
reslove(stdout);
|
|
});
|
|
} else {
|
|
let option =
|
|
command.program === "custom"
|
|
? command.customOptions
|
|
: this.programs[command.program];
|
|
option.scptarg = command.scptarg;
|
|
option.charset = command.charset;
|
|
window.runCodeFile(
|
|
commandCode,
|
|
option,
|
|
false,
|
|
(stdout, stderr) => {
|
|
stderr && reslove([stderr.toString()]);
|
|
reslove([stdout]);
|
|
},
|
|
false
|
|
);
|
|
}
|
|
});
|
|
},
|
|
runCommandSilently(featureCode) {
|
|
this.runCommand(featureCode);
|
|
},
|
|
updateExp() {
|
|
let exp = dbManager.getDB("cfg_exp");
|
|
if (typeof exp !== "object") {
|
|
exp += 1;
|
|
dbManager.putDB(exp, "cfg_exp");
|
|
return;
|
|
}
|
|
try {
|
|
let statisticsData = dbManager.getDB("cfg_statisticsData");
|
|
exp = Object.values(statisticsData)
|
|
.map((x) => x.length)
|
|
.reduce((x, y) => x + y);
|
|
// 有BUG可能删不掉
|
|
dbManager.delDB("cfg_statisticsData");
|
|
} catch (error) {
|
|
exp = 0;
|
|
}
|
|
dbManager.putDB(exp, "cfg_exp");
|
|
},
|
|
parseDate: (dateString) => {
|
|
return {
|
|
year: dateString.getFullYear(),
|
|
month: dateString.getMonth() + 1,
|
|
day: dateString.getDate(),
|
|
hour: dateString.getHours(),
|
|
minute: dateString.getMinutes(),
|
|
second: dateString.getSeconds(),
|
|
};
|
|
},
|
|
firstRun() {
|
|
if (dbManager.getStorage("st_v300Inited")) return;
|
|
window.showUb.help();
|
|
// 删掉数据库内的默认命令
|
|
dbManager.delAll("qc_default");
|
|
dbManager.setStorage("st_v300Inited", true);
|
|
},
|
|
getOpacityColor(color, percent) {
|
|
return (
|
|
color +
|
|
parseInt(0xff * percent)
|
|
.toString(16)
|
|
.padStart(2, "0")
|
|
);
|
|
},
|
|
},
|
|
watch: {
|
|
// 监听 glassEffect 值变化
|
|
"profile.glassEffect": {
|
|
immediate: true,
|
|
handler(val) {
|
|
// 给 body 添加 glass-effect-menu 类和强度值
|
|
document.body.classList.toggle("glass-effect-menu", val > 0);
|
|
document.body.style.setProperty("--glass-effect-strength", val);
|
|
},
|
|
},
|
|
// 监听 primaryColor 值变化
|
|
"profile.primaryColor": {
|
|
immediate: true,
|
|
handler(val) {
|
|
this.setCssVar("primary", val);
|
|
this.setCssVar("primary-opacity-5", this.getOpacityColor(val, 0.05));
|
|
this.setCssVar("primary-opacity-10", this.getOpacityColor(val, 0.1));
|
|
this.setCssVar("primary-opacity-20", this.getOpacityColor(val, 0.2));
|
|
this.setCssVar("primary-opacity-30", this.getOpacityColor(val, 0.3));
|
|
this.setCssVar("primary-opacity-40", this.getOpacityColor(val, 0.4));
|
|
this.setCssVar("primary-opacity-50", this.getOpacityColor(val, 0.5));
|
|
},
|
|
},
|
|
},
|
|
});
|
|
</script>
|