Merge remote-tracking branch 'origin/v2-plugin' into v2-plugin

pull/370/head
xiaojunnuo 2025-04-11 22:38:16 +08:00
commit 420b0394a7
8 changed files with 79 additions and 49 deletions

View File

@ -29,10 +29,10 @@
"@aws-sdk/client-s3": "^3.535.0", "@aws-sdk/client-s3": "^3.535.0",
"@aws-sdk/s3-request-presigner": "^3.535.0", "@aws-sdk/s3-request-presigner": "^3.535.0",
"@ctrl/tinycolor": "^4.1.0", "@ctrl/tinycolor": "^4.1.0",
"@fast-crud/fast-crud": "^1.25.7", "@fast-crud/fast-crud": "^1.25.8",
"@fast-crud/fast-extends": "^1.25.7", "@fast-crud/fast-extends": "^1.25.8",
"@fast-crud/ui-antdv4": "^1.25.7", "@fast-crud/ui-antdv4": "^1.25.8",
"@fast-crud/ui-interface": "^1.25.7", "@fast-crud/ui-interface": "^1.25.8",
"@iconify/tailwind": "^1.2.0", "@iconify/tailwind": "^1.2.0",
"@iconify/vue": "^4.1.1", "@iconify/vue": "^4.1.1",
"@manypkg/get-packages": "^2.2.2", "@manypkg/get-packages": "^2.2.2",

View File

@ -1,10 +1,3 @@
// const editorWorker = await import("monaco-editor/esm/vs/editor/editor.worker?worker");
// const jsonWorker = await import("monaco-editor/esm/vs/language/json/json.worker?worker");
// const cssWorker = await import("monaco-editor/esm/vs/language/css/css.worker?worker");
// const htmlWorker = await import("monaco-editor/esm/vs/language/html/html.worker?worker");
// const tsWorker = await import("monaco-editor/esm/vs/language/typescript/ts.worker?worker");
// const yamlWorker = await import("monaco-yaml/yaml.worker.js?worker");
import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker"; import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker"; import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"; import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";

View File

@ -6,6 +6,8 @@ import { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq,
import { useUserStore } from "/src/store/modules/user"; import { useUserStore } from "/src/store/modules/user";
import { useSettingStore } from "/src/store/modules/settings"; import { useSettingStore } from "/src/store/modules/settings";
import { Modal } from "ant-design-vue"; import { Modal } from "ant-design-vue";
//@ts-ignore
import yaml from "js-yaml";
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
const router = useRouter(); const router = useRouter();
@ -277,7 +279,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
}, },
}, },
}, },
"default.strategy.runStrategy": { "extra.default.strategy.runStrategy": {
title: "运行策略", title: "运行策略",
type: "dict-select", type: "dict-select",
@ -299,6 +301,16 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
color: "auto", color: "auto",
}, },
}, },
valueBuilder({ row }) {
if (row.extra) {
row.extra = yaml.load(row.extra);
}
},
valueResolve({ row }) {
if (row.extra) {
row.extra = yaml.dump(row.extra);
}
},
}, },
disabled: { disabled: {
title: "点击禁用/启用", title: "点击禁用/启用",

View File

@ -33,7 +33,9 @@
<a-tabs type="card"> <a-tabs type="card">
<a-tab-pane key="script" tab="脚本"> </a-tab-pane> <a-tab-pane key="script" tab="脚本"> </a-tab-pane>
</a-tabs> </a-tabs>
<code-editor id="content" v-model:model-value="plugin.content" language="javascript" @save="doSave"></code-editor> <div class="script-body">
<code-editor id="content" v-model:model-value="plugin.content" language="javascript" @save="doSave"></code-editor>
</div>
</div> </div>
</div> </div>
</fs-page> </fs-page>
@ -42,10 +44,10 @@
import { onMounted, provide, ref, Ref } from "vue"; import { onMounted, provide, ref, Ref } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import * as api from "./api"; import * as api from "./api";
import yaml from "js-yaml";
import { notification } from "ant-design-vue"; import { notification } from "ant-design-vue";
import createCrudOptions from "./crud"; import createCrudOptions from "./crud";
import { useColumns } from "@fast-crud/fast-crud"; import { useColumns } from "@fast-crud/fast-crud";
import yaml from "js-yaml";
const CertApplyPluginNames = ["CertApply", "CertApplyLego", "CertApplyUpload"]; const CertApplyPluginNames = ["CertApply", "CertApplyLego", "CertApplyUpload"];
defineOptions({ defineOptions({
@ -81,19 +83,14 @@ initFormOptions();
async function getPlugin() { async function getPlugin() {
const id = route.query.id; const id = route.query.id;
const pluginObj = await api.GetObj(id); const pluginObj = await api.GetObj(id);
if (pluginObj.metadata) {
const metadata = yaml.load(pluginObj.metadata);
pluginObj.default = metadata.default || {};
delete metadata.default;
pluginObj.metadata = yaml.dump(metadata, {
indent: 2,
});
}
plugin.value = pluginObj; plugin.value = pluginObj;
const baseFrom = { const baseFrom = {
...pluginObj, ...pluginObj,
}; };
if (baseFrom.extra) {
baseFrom.extra = yaml.load(baseFrom.extra);
}
delete baseFrom.metadata; delete baseFrom.metadata;
delete baseFrom.content; delete baseFrom.content;
baseFormRef.value.setFormData(baseFrom); baseFormRef.value.setFormData(baseFrom);
@ -107,17 +104,31 @@ provide("get:plugin", () => {
return plugin; return plugin;
}); });
function validate() {
try {
yaml.load(plugin.value.metadata);
} catch (e: any) {
const message = `元数据校验失败:${e.message}`;
notification.error({
message,
});
throw new Error(message);
}
}
const saveLoading = ref(false); const saveLoading = ref(false);
async function doSave() { async function doSave() {
validate();
saveLoading.value = true; saveLoading.value = true;
const baseForm = baseFormRef.value.getFormData(); const baseForm = baseFormRef.value.getFormData();
const metadata = yaml.load(plugin.value.metadata);
metadata.default = baseForm.default;
const form = { const form = {
...plugin.value, ...plugin.value,
...baseForm, ...baseForm,
metadata: yaml.dump(metadata, { indent: 2 }),
}; };
if (form.extra) {
form.extra = yaml.dump(form.extra);
}
try { try {
await api.UpdateObj(form); await api.UpdateObj(form);
notification.success({ notification.success({
@ -161,6 +172,10 @@ async function doTest() {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.base-body {
flex: 1;
overflow: auto;
}
} }
.metadata { .metadata {
@ -191,6 +206,9 @@ async function doTest() {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.script-body {
flex: 1;
}
} }
} }
} }

View File

@ -1,7 +1,10 @@
<template> <template>
<fs-page class="page-cert"> <fs-page class="page-cert">
<template #header> <template #header>
<div class="title">插件管理</div> <div class="title">
插件管理
<span class="sub">自定义插件处于BETA测试版后续可能会有破坏性变更</span>
</div>
</template> </template>
<fs-crud ref="crudRef" v-bind="crudBinding"> <fs-crud ref="crudRef" v-bind="crudBinding">
<!-- <template #pagination-left>--> <!-- <template #pagination-left>-->

View File

@ -1,6 +1,7 @@
ALTER TABLE pi_plugin ADD COLUMN "pluginType" varchar(100); ALTER TABLE pi_plugin ADD COLUMN "pluginType" varchar(100);
ALTER TABLE pi_plugin ADD COLUMN "metadata" varchar(40960); ALTER TABLE pi_plugin ADD COLUMN "metadata" varchar(40960);
ALTER TABLE pi_plugin ADD COLUMN "author" varchar(100); ALTER TABLE pi_plugin ADD COLUMN "author" varchar(100);
ALTER TABLE pi_plugin ADD COLUMN "extra" varchar(40960);

View File

@ -44,6 +44,9 @@ export class PluginEntity {
@Column({ comment: '元数据', length: 40960, nullable: true }) @Column({ comment: '元数据', length: 40960, nullable: true })
metadata: string; metadata: string;
@Column({ comment: '额外配置', length: 40960, nullable: true })
extra: string;
@Column({ comment: '作者', length: 100, nullable: true }) @Column({ comment: '作者', length: 100, nullable: true })
author: string; author: string;

View File

@ -1059,17 +1059,17 @@ importers:
specifier: ^4.1.0 specifier: ^4.1.0
version: 4.1.0 version: 4.1.0
'@fast-crud/fast-crud': '@fast-crud/fast-crud':
specifier: ^1.25.7 specifier: ^1.25.8
version: 1.25.7(vue@3.5.13(typescript@5.8.2)) version: 1.25.8(vue@3.5.13(typescript@5.8.2))
'@fast-crud/fast-extends': '@fast-crud/fast-extends':
specifier: ^1.25.7 specifier: ^1.25.8
version: 1.25.7(aws-crt@1.25.3)(vue@3.5.13(typescript@5.8.2)) version: 1.25.8(aws-crt@1.25.3)(vue@3.5.13(typescript@5.8.2))
'@fast-crud/ui-antdv4': '@fast-crud/ui-antdv4':
specifier: ^1.25.7 specifier: ^1.25.8
version: 1.25.7 version: 1.25.8
'@fast-crud/ui-interface': '@fast-crud/ui-interface':
specifier: ^1.25.7 specifier: ^1.25.8
version: 1.25.7 version: 1.25.8
'@iconify/tailwind': '@iconify/tailwind':
specifier: ^1.2.0 specifier: ^1.2.0
version: 1.2.0 version: 1.2.0
@ -3250,17 +3250,17 @@ packages:
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@fast-crud/fast-crud@1.25.7': '@fast-crud/fast-crud@1.25.8':
resolution: {integrity: sha512-dq5ijw6PU/FQBTP+ZwBezMHqAEZDbAoShHGNIkCK9a0vOqL5MhBnOzq5DPRz6yFUNnJEFX8kYB7N7A00Qnw5Zg==} resolution: {integrity: sha512-ftIhCJwDwNdHTgCYeuSwheD9c/Vvf/5ef9hu7ZwDQ22qD9dJmSUxrAYv6UWuJ4r4zcbNCk8BaBcaKwqSltd3Dg==}
'@fast-crud/fast-extends@1.25.7': '@fast-crud/fast-extends@1.25.8':
resolution: {integrity: sha512-vZu6CGXvacgnZI4d78qEc0X1xrdylJjABapU1O60xwwDx+CIcJfH6N+Q4ku/12YdTTeJAsYDnsSFzNEDtzQpwQ==} resolution: {integrity: sha512-aw/8SLJJvBtwQOwafaG87r0IWIncZK7BOiJRl7MZiv3Cp+G4naLam7WjtIQIZIT9zfLZqb+z3zy+x00cbUMRkw==}
'@fast-crud/ui-antdv4@1.25.7': '@fast-crud/ui-antdv4@1.25.8':
resolution: {integrity: sha512-T95LiMO2WV6XcnLyALLRB59xmi43eWHxIeABeZBeDD5Y2nmXR3ceQj63VBo4SJMDNEu49MKabQpOa/A2X6Rmwg==} resolution: {integrity: sha512-lRehabbucwKV2OM0bfVHt0BI8BYu+sb4z9l+9EkIvTDQurowfxZO+WFk/KIe3BhuKHtKlmmwEa73cefMMVzvjA==}
'@fast-crud/ui-interface@1.25.7': '@fast-crud/ui-interface@1.25.8':
resolution: {integrity: sha512-JrP2/dm1Sco0UdSYhIMkf9tdynYURHlO1qyDHmssF1lqo9+PrU1kwuizaK1soG+myHiYznbBiXo1+GIly/MU+A==} resolution: {integrity: sha512-UUoXce20z+BlPu/KKNfdHb6qpX1OdrrkMuIO2KdaI4FENVa9IW83AsttmNSHNkZkvG7zeVacxd03Y0xmdGeioA==}
'@fidm/asn1@1.0.4': '@fidm/asn1@1.0.4':
resolution: {integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==} resolution: {integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==}
@ -15297,7 +15297,7 @@ snapshots:
'@eslint/js@8.57.0': {} '@eslint/js@8.57.0': {}
'@fast-crud/fast-crud@1.25.7(vue@3.5.13(typescript@5.8.2))': '@fast-crud/fast-crud@1.25.8(vue@3.5.13(typescript@5.8.2))':
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
file-saver: 2.0.5 file-saver: 2.0.5
@ -15307,7 +15307,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- vue - vue
'@fast-crud/fast-extends@1.25.7(aws-crt@1.25.3)(vue@3.5.13(typescript@5.8.2))': '@fast-crud/fast-extends@1.25.8(aws-crt@1.25.3)(vue@3.5.13(typescript@5.8.2))':
dependencies: dependencies:
'@aws-sdk/client-s3': 3.758.0(aws-crt@1.25.3) '@aws-sdk/client-s3': 3.758.0(aws-crt@1.25.3)
'@aws-sdk/s3-request-presigner': 3.758.0 '@aws-sdk/s3-request-presigner': 3.758.0
@ -15339,9 +15339,9 @@ snapshots:
- utf-8-validate - utf-8-validate
- vue - vue
'@fast-crud/ui-antdv4@1.25.7': {} '@fast-crud/ui-antdv4@1.25.8': {}
'@fast-crud/ui-interface@1.25.7': '@fast-crud/ui-interface@1.25.8':
dependencies: dependencies:
lodash-es: 4.17.21 lodash-es: 4.17.21
@ -20616,13 +20616,13 @@ snapshots:
resolve: 1.22.10 resolve: 1.22.10
semver: 6.3.1 semver: 6.3.1
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8): eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8):
dependencies: dependencies:
eslint: 7.32.0 eslint: 7.32.0
prettier: 2.8.8 prettier: 2.8.8
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
optionalDependencies: optionalDependencies:
eslint-config-prettier: 8.10.0(eslint@7.32.0) eslint-config-prettier: 8.10.0(eslint@8.57.0)
eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8):
dependencies: dependencies:
@ -23336,7 +23336,7 @@ snapshots:
eslint: 7.32.0 eslint: 7.32.0
eslint-config-prettier: 8.10.0(eslint@7.32.0) eslint-config-prettier: 8.10.0(eslint@7.32.0)
eslint-plugin-node: 11.1.0(eslint@7.32.0) eslint-plugin-node: 11.1.0(eslint@7.32.0)
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8) eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8)
execa: 5.1.1 execa: 5.1.1
inquirer: 7.3.3 inquirer: 7.3.3
json5: 2.2.3 json5: 2.2.3