mirror of
https://github.com/certd/certd.git
synced 2025-11-25 09:10:11 +08:00
chore: 新增插件额外配置功能
- 在插件管理中添加 extra 字段,用于存储额外配置信息 - 实现插件编辑页面的额外配置编辑功能 - 更新数据库结构,增加 extra 列 - 优化代码编辑器的导入方式 - 更新 fast-crud 相关包版本
This commit is contained in:
@@ -29,10 +29,10 @@
|
||||
"@aws-sdk/client-s3": "^3.535.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.535.0",
|
||||
"@ctrl/tinycolor": "^4.1.0",
|
||||
"@fast-crud/fast-crud": "^1.25.7",
|
||||
"@fast-crud/fast-extends": "^1.25.7",
|
||||
"@fast-crud/ui-antdv4": "^1.25.7",
|
||||
"@fast-crud/ui-interface": "^1.25.7",
|
||||
"@fast-crud/fast-crud": "^1.25.8",
|
||||
"@fast-crud/fast-extends": "^1.25.8",
|
||||
"@fast-crud/ui-antdv4": "^1.25.8",
|
||||
"@fast-crud/ui-interface": "^1.25.8",
|
||||
"@iconify/tailwind": "^1.2.0",
|
||||
"@iconify/vue": "^4.1.1",
|
||||
"@manypkg/get-packages": "^2.2.2",
|
||||
|
||||
@@ -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 jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
|
||||
import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
|
||||
|
||||
@@ -6,6 +6,8 @@ import { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq,
|
||||
import { useUserStore } from "/src/store/modules/user";
|
||||
import { useSettingStore } from "/src/store/modules/settings";
|
||||
import { Modal } from "ant-design-vue";
|
||||
//@ts-ignore
|
||||
import yaml from "js-yaml";
|
||||
|
||||
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
|
||||
const router = useRouter();
|
||||
@@ -277,7 +279,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
},
|
||||
},
|
||||
},
|
||||
"default.strategy.runStrategy": {
|
||||
"extra.default.strategy.runStrategy": {
|
||||
title: "运行策略",
|
||||
type: "dict-select",
|
||||
|
||||
@@ -299,6 +301,16 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
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: {
|
||||
title: "点击禁用/启用",
|
||||
|
||||
@@ -33,7 +33,9 @@
|
||||
<a-tabs type="card">
|
||||
<a-tab-pane key="script" tab="脚本"> </a-tab-pane>
|
||||
</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>
|
||||
</fs-page>
|
||||
@@ -42,10 +44,10 @@
|
||||
import { onMounted, provide, ref, Ref } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import * as api from "./api";
|
||||
import yaml from "js-yaml";
|
||||
import { notification } from "ant-design-vue";
|
||||
import createCrudOptions from "./crud";
|
||||
import { useColumns } from "@fast-crud/fast-crud";
|
||||
import yaml from "js-yaml";
|
||||
|
||||
const CertApplyPluginNames = ["CertApply", "CertApplyLego", "CertApplyUpload"];
|
||||
defineOptions({
|
||||
@@ -81,19 +83,14 @@ initFormOptions();
|
||||
async function getPlugin() {
|
||||
const id = route.query.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;
|
||||
|
||||
const baseFrom = {
|
||||
...pluginObj,
|
||||
};
|
||||
if (baseFrom.extra) {
|
||||
baseFrom.extra = yaml.load(baseFrom.extra);
|
||||
}
|
||||
delete baseFrom.metadata;
|
||||
delete baseFrom.content;
|
||||
baseFormRef.value.setFormData(baseFrom);
|
||||
@@ -107,17 +104,31 @@ provide("get: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);
|
||||
async function doSave() {
|
||||
validate();
|
||||
saveLoading.value = true;
|
||||
const baseForm = baseFormRef.value.getFormData();
|
||||
const metadata = yaml.load(plugin.value.metadata);
|
||||
metadata.default = baseForm.default;
|
||||
const form = {
|
||||
...plugin.value,
|
||||
...baseForm,
|
||||
metadata: yaml.dump(metadata, { indent: 2 }),
|
||||
};
|
||||
if (form.extra) {
|
||||
form.extra = yaml.dump(form.extra);
|
||||
}
|
||||
try {
|
||||
await api.UpdateObj(form);
|
||||
notification.success({
|
||||
@@ -161,6 +172,10 @@ async function doTest() {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
.base-body {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.metadata {
|
||||
@@ -191,6 +206,9 @@ async function doTest() {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
.script-body {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<template>
|
||||
<fs-page class="page-cert">
|
||||
<template #header>
|
||||
<div class="title">插件管理</div>
|
||||
<div class="title">
|
||||
插件管理
|
||||
<span class="sub">自定义插件处于BETA测试版,后续可能会有破坏性变更</span>
|
||||
</div>
|
||||
</template>
|
||||
<fs-crud ref="crudRef" v-bind="crudBinding">
|
||||
<!-- <template #pagination-left>-->
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
ALTER TABLE pi_plugin ADD COLUMN "pluginType" varchar(100);
|
||||
ALTER TABLE pi_plugin ADD COLUMN "metadata" varchar(40960);
|
||||
ALTER TABLE pi_plugin ADD COLUMN "author" varchar(100);
|
||||
ALTER TABLE pi_plugin ADD COLUMN "extra" varchar(40960);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -44,6 +44,9 @@ export class PluginEntity {
|
||||
@Column({ comment: '元数据', length: 40960, nullable: true })
|
||||
metadata: string;
|
||||
|
||||
@Column({ comment: '额外配置', length: 40960, nullable: true })
|
||||
extra: string;
|
||||
|
||||
@Column({ comment: '作者', length: 100, nullable: true })
|
||||
author: string;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user