@opentiny/tiny-engine-plugin-model-manager 2.9.0 → 2.10.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +349 -328
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/components/ModelBasicForm.vue","../src/components/FieldManager.vue","../src/composable/useModelManager.js","../src/components/ModelSetting.vue","../src/Main.vue","../meta.js","../index.ts"],"sourcesContent":["<template>\n <div class=\"section\">\n <tiny-form ref=\"ruleFormRef\" :model=\"localValue\" :rules=\"rules\">\n <div class=\"form-item\">\n <tiny-form-item label=\"中文名称\" prop=\"nameCn\">\n <tiny-input v-model=\"localValue.nameCn\" placeholder=\"请输入模型中文名称\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"英文名称\" prop=\"nameEn\">\n <tiny-input v-model=\"localValue.nameEn\" placeholder=\"请输入模型英文名称\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"版本号\" prop=\"version\">\n <tiny-input v-model=\"localValue.version\" placeholder=\"1.0.0\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"模型地址\" prop=\"modelUrl\">\n <tiny-input v-model=\"localValue.modelUrl\" placeholder=\"请输入模型地址,如:https://api.example.com/model\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"描述\" prop=\"description\">\n <tiny-input type=\"textarea\" :rows=\"3\" v-model=\"localValue.description\" placeholder=\"请输入模型描述\" />\n </tiny-form-item>\n </div>\n </tiny-form>\n </div>\n</template>\n\n<script setup>\nimport { ref, watch } from 'vue'\nimport { TinyInput, Form as TinyForm, FormItem as TinyFormItem } from '@opentiny/vue'\n\nconst props = defineProps({\n model: { type: Object, required: true }\n})\n\n// 创建本地副本,直接编辑本地数据\nconst localValue = ref(props.model)\n\nconst ruleFormRef = ref()\n\nconst rules = ref({\n nameCn: [\n { required: true, message: '必填', trigger: 'blur' },\n { min: 1, max: 32, message: '长度在1-32之间', trigger: 'blur' }\n ],\n nameEn: [\n { required: true, message: '必填', trigger: 'blur' },\n { min: 1, max: 32, message: '长度在1-32之间', trigger: 'blur' }\n ],\n version: [{ required: true, message: '必填', trigger: 'blur' }],\n modelUrl: [\n { required: true, message: '必填', trigger: 'blur' },\n { min: 1, max: 200, message: '长度在1-200之间', trigger: 'blur' }\n ]\n})\n\n// 监听 props 变化,同步到本地(当选择不同模型时)\nwatch(\n () => props.model,\n (newModel) => {\n localValue.value = newModel\n },\n { deep: true }\n)\n\nconst validate = () => ruleFormRef.value.validate()\n\n// 暴露本地数据给父组件访问\ndefineExpose({\n getLocalValue: () => localValue.value,\n validate\n})\n</script>\n\n<style scoped>\n.section {\n margin-bottom: 16px;\n border-radius: 6px;\n padding: 12px;\n}\n.section-title {\n font-size: 16px;\n font-weight: 600;\n color: #262626;\n margin: 0 0 16px 0;\n padding-bottom: 8px;\n border-bottom: 1px solid #f0f0f0;\n}\n.form-item {\n margin-bottom: 20px;\n}\n.form-item label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: #262626;\n font-size: 14px;\n}\n</style>\n","<template>\n <div class=\"section\">\n <tiny-button size=\"mini\" @click=\"$emit('add-field')\"> <svg-icon name=\"add\"></svg-icon> 添加字段 </tiny-button>\n <div class=\"field-table\">\n <tiny-grid\n :data=\"model.parameters\"\n :header-fixed=\"true\"\n :scrollable=\"{ y: true }\"\n :expand-config=\"expandConfig\"\n ref=\"fieldGrid\"\n style=\"height: 100%\"\n >\n <tiny-grid-column type=\"index\" width=\"60\" title=\"序号\"></tiny-grid-column>\n <tiny-grid-column type=\"expand\" width=\"20\">\n <template #default=\"{ row }\">\n <div v-if=\"row.type === 'Enum'\" class=\"expand-content\">\n <div class=\"expand-section\">\n <h4>默认选项(下拉框)</h4>\n <div class=\"enum-values\">\n <div v-for=\"(opt, index) in row.options || []\" :key=\"index\" class=\"enum-item\">\n <tiny-input\n v-model=\"opt.value\"\n placeholder=\"值\"\n size=\"small\"\n style=\"width: 150px; margin-right: 8px\"\n />\n <tiny-input\n v-model=\"opt.label\"\n placeholder=\"显示标签\"\n size=\"small\"\n style=\"width: 200px; margin-right: 8px\"\n />\n <tiny-button type=\"text\" size=\"small\" @click=\"$emit('insert-enum-after', row, index)\"\n >新增</tiny-button\n >\n <tiny-button type=\"text\" size=\"small\" @click=\"$emit('remove-enum', row, index)\">删除</tiny-button>\n </div>\n </div>\n </div>\n </div>\n <div v-else-if=\"row.type === 'ModelRef'\" class=\"expand-content\">\n <div class=\"expand-section\">\n <h4>引用的模型</h4>\n <div class=\"model-ref-section\">\n <tiny-select\n v-model=\"row.defaultValue\"\n placeholder=\"请选择要引用的模型\"\n size=\"small\"\n style=\"width: 100%\"\n >\n <tiny-option\n v-for=\"model in relativeModels\"\n :key=\"model.id\"\n :value=\"model.id\"\n :label=\"`${model.nameCn} (${model.nameEn})`\"\n />\n </tiny-select>\n <div class=\"model-ref-info\" v-if=\"row.defaultValue\">\n <p>已选择模型:{{ getModelName(row.defaultValue) }}</p>\n </div>\n </div>\n </div>\n </div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"prop\" title=\"字段名称\" width=\"120\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-input v-model=\"row.prop\" placeholder=\"请输入字段名称\" size=\"small\" />\n </div>\n <div v-else class=\"readonly-cell\">{{ row.prop || '点击编辑' }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"type\" title=\"类型\" width=\"110\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-select v-model=\"row.type\" size=\"small\" @change=\"handleTypeChange(row)\">\n <tiny-option value=\"String\" label=\"字符串\" />\n <tiny-option value=\"Number\" label=\"数字\" />\n <tiny-option value=\"Boolean\" label=\"布尔值\" />\n <tiny-option value=\"Date\" label=\"日期\" />\n <tiny-option value=\"Enum\" label=\"枚举值\" />\n <tiny-option value=\"ModelRef\" label=\"模型引用\" />\n </tiny-select>\n </div>\n <div v-else class=\"readonly-cell\">{{ getFieldTypeLabel(row.type) }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"required\" title=\"必填\" width=\"60\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-checkbox v-model=\"row.required\" />\n </div>\n <div v-else class=\"readonly-cell\"><tiny-checkbox v-model=\"row.required\" disabled /></div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"description\" title=\"描述\" width=\"120\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-input v-model=\"row.description\" placeholder=\"请输入字段描述\" size=\"small\" />\n </div>\n <div v-else class=\"readonly-cell\">{{ row.description || '点击编辑' }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"operation\" title=\"操作\" width=\"90\">\n <template #default=\"{ row }\">\n <div class=\"field-actions\">\n <template v-if=\"row.isEditing\">\n <span type=\"text\" size=\"mini\" @click=\"saveFieldEdit(row)\">保存</span>\n <span type=\"text\" size=\"mini\" @click=\"cancelFieldEdit(row)\">取消</span>\n </template>\n <template v-else>\n <span><svg-icon name=\"to-edit\" @click.stop=\"startFieldEdit(row)\" /></span>\n <span><svg-icon name=\"delete\" @click.stop=\"handleDeleteField(row)\" /></span>\n </template>\n </div>\n </template>\n </tiny-grid-column>\n </tiny-grid>\n </div>\n </div>\n</template>\n\n<script setup>\n// 字段表格与展开编辑内容组件\n// 仅承载表格与展开内容,具体列通过插槽从父组件传入,保证与现有逻辑一致\nimport { ref, computed, nextTick } from 'vue'\nimport { TinyButton, TinyGrid, TinyGridColumn, TinyInput, TinySelect, TinyOption, TinyCheckbox } from '@opentiny/vue'\n\nconst props = defineProps({\n model: { type: Object, required: true },\n expandConfig: { type: Object, required: true },\n availableModels: { type: Array, default: () => [] }\n})\n\ndefineEmits(['insert-enum-after', 'remove-enum'])\n\nconst fieldGrid = ref(null)\n\nconst selectedModel = ref(props.model)\n\nconst relativeModels = computed(() => props.availableModels.filter((item) => item.id !== props.model.id))\n\n// 父组件需要:\n// 1) 读取 grid 数据以拿到 _RID\nconst getGridData = () => fieldGrid.value?.getData?.() || []\n\n// 根据模型ID获取模型名称\nconst getModelName = (modelId) => {\n const model = relativeModels.value.find((m) => m.id === modelId)\n return model ? `${model.nameCn} (${model.nameEn})` : '未知模型'\n}\n\n// 字段类型变化处理\nconst handleTypeChange = (field) => {\n if (field.type === 'Enum' || field.type === 'ModelRef') {\n field.isExpanded = true\n // 初始化相应的数据结构\n if (field.type === 'Enum' && (!Array.isArray(field.options) || field.options.length === 0)) {\n field.options = [{ value: '', label: '' }]\n }\n // 模型引用类型:初始化模型引用\n if (field.type === 'ModelRef') {\n field.isModel = true\n field.defaultValue = field.defaultValue || null\n }\n // 将对应 _RID 推入展开 keys(去重)\n nextTick(() => {\n const gridData = fieldGrid.value?.getGridData?.() || []\n gridData.forEach((item) => {\n if (item.id === field.id && !expandConfig.value.expandRowKeys.includes(item._RID)) {\n expandConfig.value.expandRowKeys.push(item._RID)\n }\n })\n })\n } else {\n field.isExpanded = false\n // 按 _RID 从展开 keys 移除\n const gridData = fieldGrid.value?.getGridData?.() || []\n const current = gridData.find((item) => item.id === field.id)\n if (current) {\n const idx = expandConfig.value.expandRowKeys.indexOf(current._RID)\n if (idx > -1) expandConfig.value.expandRowKeys.splice(idx, 1)\n }\n }\n // 强制更新视图\n nextTick(() => {\n if (selectedModel.value && selectedModel.value.parameters) {\n selectedModel.value.parameters = [...selectedModel.value.parameters]\n }\n })\n}\n\n// 字段类型label转换\nconst getFieldTypeLabel = (type) => {\n const typeMap = {\n String: '字符串',\n Number: '数字',\n Boolean: '布尔值',\n Date: '日期',\n Enum: '枚举值',\n ModelRef: '模型引用'\n }\n return typeMap[type] || type\n}\n\n// 字段进入编辑状态\nconst startFieldEdit = (field) => {\n field._editCache = { ...field } // 缓存原始数据\n field.isEditing = true\n // 如果字段类型是枚举值或模型引用类型,自动展开\n if (field.type === 'Enum' || field.type === 'ModelRef') {\n field.isExpanded = true\n // 枚举类型:至少保证一条空数据\n if (field.type === 'Enum' && (!Array.isArray(field.options) || field.options.length === 0)) {\n field.options = [{ value: '', label: '' }]\n }\n // 模型引用类型:初始化模型引用\n if (field.type === 'ModelRef') {\n field.isModel = true\n field.defaultValue = field.defaultValue || null\n }\n // 添加到展开行keys(使用 _RID),并避免重复\n const gridData = fieldGrid.value?.getGridData() || []\n gridData.forEach((item) => {\n if (item.id === field.id && !expandConfig.value.expandRowKeys.includes(item._RID)) {\n expandConfig.value.expandRowKeys.push(item._RID)\n }\n })\n }\n}\n// 字段保存编辑\nconst saveFieldEdit = (field) => {\n field.isEditing = false\n field.isExpanded = false // 保存时收起展开行\n if (field._editCache && JSON.stringify(field._editCache) !== JSON.stringify(field)) {\n field._editCache = null\n }\n // 保存后移除 isNew 标记\n if (field.isNew) delete field.isNew\n}\n\n// 字段取消编辑\nconst cancelFieldEdit = (field) => {\n field.isEditing = false\n field.isExpanded = false // 取消时收起展开行\n // 从展开行keys中移除(使用 _RID)\n const gridData = fieldGrid.value?.getGridData?.() || []\n const current = gridData.find((item) => item.id === field.id)\n if (current) {\n const idx = expandConfig.value.expandRowKeys.indexOf(current._RID)\n if (idx > -1) expandConfig.value.expandRowKeys.splice(idx, 1)\n }\n // 取消编辑时,还原到缓存的数据\n if (field._editCache) {\n Object.assign(field, field._editCache)\n field._editCache = null\n }\n // 如果字段是新增的,则直接删除\n if (field.isNew) {\n const index = selectedModel.value.parameters.findIndex((f) => f.id === field.id)\n if (index > -1) selectedModel.value.parameters.splice(index, 1)\n }\n}\n// 删除字段\nconst handleDeleteField = (field) => {\n const index = selectedModel.value.parameters.findIndex((f) => f.prop === field.prop)\n if (index > -1) selectedModel.value.parameters.splice(index, 1)\n}\n\ndefineExpose({\n fieldGrid,\n getGridData\n})\n</script>\n\n<style lang=\"less\" scoped>\n.section {\n .add-field-btn {\n margin-bottom: 16px;\n }\n\n :deep(.tiny-grid-body__expanded-row) {\n background-color: var(--te-model-manage-input-bg-color);\n }\n .expand-section {\n margin-bottom: 16px;\n\n h4 {\n font-size: 14px;\n font-weight: 600;\n color: var(--te-model-manage-title-text-color);\n margin: 0 0 8px 0;\n padding-bottom: 1px;\n }\n\n .enum-item {\n display: flex;\n align-items: center;\n margin-bottom: 8px;\n padding: 8px;\n background-color: var(--te-model-manage-input-bg-color);\n border-radius: 4px;\n }\n\n .model-ref-section {\n margin-top: 8px;\n }\n\n .model-ref-info {\n margin-top: 8px;\n padding: 8px;\n background: #f0f8ff;\n border-radius: 4px;\n border: 1px solid #d6e4ff;\n\n p {\n margin: 0;\n font-size: 12px;\n color: #1890ff;\n }\n }\n }\n\n .editing-cell {\n :deep(.tiny-input),\n :deep(.tiny-select) {\n width: 100%;\n }\n }\n\n .readonly-cell {\n cursor: pointer;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: #f5f5f5;\n }\n }\n\n .field-actions,\n .editing-cell,\n .readonly-cell {\n background: transparent !important;\n }\n\n .field-actions {\n display: flex;\n gap: 8px;\n span {\n color: var(--te-common-text-emphasize);\n }\n }\n}\n</style>\n","import { getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register'\n\n// 示例API路径,请根据实际后端接口调整\nconst modelApi = '/material-center/api/model'\n\nexport function getModelList(params = {}) {\n return getMetaApi(META_SERVICE.Http).get(`${modelApi}/list`, { params })\n}\n\nexport function createModel(data) {\n return getMetaApi(META_SERVICE.Http).post(`${modelApi}/create`, data)\n}\n\nexport function updateModel(id, data) {\n return getMetaApi(META_SERVICE.Http).put(`${modelApi}/update/${id}`, data)\n}\n\nexport function deleteModel(id) {\n return getMetaApi(META_SERVICE.Http).delete(`${modelApi}/delete/${id}`)\n}\n\nexport function getModelSql() {\n return getMetaApi(META_SERVICE.Http).get(`${modelApi}/table/list`)\n}\n\nexport function getModelSqlById(id) {\n return getMetaApi(META_SERVICE.Http).get(`${modelApi}/table/${id}`)\n}\n","<template>\n <plugin-setting\n v-if=\"isShow\"\n :fixed-name=\"PLUGIN_NAME.ModelManager\"\n :align=\"align\"\n title=\"模型设置\"\n class=\"modelmanager-plugin-setting\"\n >\n <template #header>\n <button-group>\n <tiny-button @click=\"$emit('exportModel', selectedModel?.id)\">导出SQL</tiny-button>\n <tiny-button type=\"primary\" @click=\"saveModel\">保存</tiny-button>\n <svg-button name=\"close\" @click=\"closeModelSettingPanel\"></svg-button>\n </button-group>\n </template>\n\n <template #content>\n <tiny-collapse v-model=\"activeName\" class=\"page-setting-collapse\">\n <tiny-collapse-item title=\"基本设置\" name=\"general\">\n <model-basic-form ref=\"modelBasicFormRef\" :model=\"selectedModel\"></model-basic-form>\n </tiny-collapse-item>\n\n <tiny-collapse-item class=\"base-setting\" title=\"字段管理\" name=\"fields\">\n <field-manager\n ref=\"fieldManagerRef\"\n :model=\"selectedModel\"\n :expand-config=\"expandConfig\"\n :available-models=\"models\"\n @add-field=\"handleAddField\"\n @insert-enum-after=\"insertEnumValueAfter\"\n @remove-enum=\"removeEnumValue\"\n >\n </field-manager>\n </tiny-collapse-item>\n </tiny-collapse>\n </template>\n </plugin-setting>\n</template>\n<script>\nimport { ref, watch, nextTick } from 'vue'\nimport { Button, Collapse, CollapseItem } from '@opentiny/vue'\nimport { PluginSetting, ButtonGroup, SvgButton } from '@opentiny/tiny-engine-common'\nimport { useLayout } from '@opentiny/tiny-engine-meta-register'\nimport ModelBasicForm from './ModelBasicForm.vue'\nimport FieldManager from './FieldManager.vue'\nimport { createModel, updateModel } from '../composable/useModelManager'\n\nconst isShow = ref(false)\n\nexport const openModelSettingPanel = () => {\n isShow.value = true\n}\n\nexport const closeModelSettingPanel = () => {\n isShow.value = false\n}\n\nexport default {\n components: {\n PluginSetting,\n SvgButton,\n ButtonGroup,\n ModelBasicForm,\n FieldManager,\n TinyButton: Button,\n TinyCollapse: Collapse,\n TinyCollapseItem: CollapseItem\n },\n props: {\n model: {\n type: Object,\n default: () => ({})\n },\n models: {\n type: Array,\n default: () => []\n }\n },\n emits: ['editCallback', 'exportModel'],\n setup(props, { emit }) {\n const { PLUGIN_NAME } = useLayout()\n const activeName = ref(['general', 'fields'])\n const selectedModel = ref()\n const modelBasicFormRef = ref()\n // 展开行配置\n const expandConfig = ref({\n expandAll: false,\n trigger: 'row',\n expandRowKeys: [],\n accordion: false,\n activeMethod: (row) => row.type === 'Enum' || row.type === 'ModelRef', // 枚举类型和模型引用类型都显示展开箭头\n showIcon: (row) => row.type === 'Enum' || row.type === 'ModelRef' // 枚举类型和模型引用类型都显示展开箭头\n })\n\n // 添加字段,自动进入编辑状态\n const handleAddField = () => {\n if (!selectedModel.value) return\n const newField = {\n prop: '',\n type: 'String',\n required: false,\n description: '',\n isEditing: true,\n isNew: true // 新增字段标记\n }\n selectedModel.value.parameters.push(newField)\n nextTick(() => {\n const nameInputs = document.querySelectorAll('.editing-cell .tiny-input')\n if (nameInputs.length > 0) nameInputs[nameInputs.length - 1].focus()\n })\n }\n\n // 在当前行后插入一条枚举值\n const insertEnumValueAfter = (field, index) => {\n if (!field.options) {\n field.options = []\n }\n field.options.splice(index + 1, 0, { value: '', label: '' })\n }\n\n // 删除枚举值\n const removeEnumValue = (field, index) => {\n if (!Array.isArray(field.options)) return\n if (field.options.length <= 1) {\n // 只剩一条时,不删除,清空内容\n field.options[0] = { value: '', label: '' }\n return\n }\n field.options.splice(index, 1)\n }\n\n // 保存模型时一并保存version字段\n const saveModel = async () => {\n // 从子组件获取最新的数据\n const latestModelData = modelBasicFormRef.value?.getLocalValue()\n modelBasicFormRef.value.validate().then(async (valid) => {\n if (valid) {\n const newModel = {\n description: latestModelData.description,\n modelUrl: latestModelData.modelUrl,\n nameCn: latestModelData.nameCn,\n nameEn: latestModelData.nameEn,\n version: latestModelData.version,\n id: latestModelData.id,\n parameters: latestModelData.parameters.filter((item) => !!item.prop)\n }\n let isModelRefRelative = true\n let propertyName = ''\n if (newModel.parameters?.length > 0) {\n newModel.parameters.forEach((item) => {\n if (item.type === 'Enum') {\n item.options = JSON.stringify(item.options)\n }\n if (item.type === 'ModelRef') {\n item.isModel = true\n delete item.options\n item.defaultValue = item.defaultValue || null\n isModelRefRelative = !!item.defaultValue\n propertyName = item.prop\n }\n })\n }\n if (!isModelRefRelative) {\n Notify({\n type: 'error',\n message: `字段${propertyName}未关联模型引用`\n })\n return\n }\n if (latestModelData.id === null) {\n delete newModel.id\n await createModel(newModel)\n } else {\n await updateModel(newModel.id, newModel)\n }\n emit('editCallback')\n Notify({\n type: 'success',\n message: '保存成功'\n })\n selectedModel.value = null\n }\n })\n }\n // 监听 props 变化,同步到本地(当选择不同模型时)\n watch(\n () => props.model,\n (newModel) => {\n selectedModel.value = newModel\n },\n { deep: true }\n )\n return {\n isShow,\n PLUGIN_NAME,\n activeName,\n modelBasicFormRef,\n expandConfig,\n selectedModel,\n closeModelSettingPanel,\n handleAddField,\n insertEnumValueAfter,\n removeEnumValue,\n saveModel\n }\n }\n}\n</script>\n<style lang=\"less\" scoped>\n:deep(.plugin-setting) {\n width: fit-content !important;\n}\n</style>\n","<template>\n <div class=\"plugin-modelmanager\">\n <plugin-panel\n :title=\"title\"\n :fixed-name=\"PLUGIN_NAME.ModelManager\"\n :fixedPanels=\"fixedPanels\"\n @close=\"pluginPanelClosed\"\n >\n <template #header>\n <svg-button class=\"add-icon\" name=\"add\" placement=\"bottom\" tips=\"新建模型\" @click=\"handleAddModel\"></svg-button>\n <svg-button\n class=\"flow-download-icon\"\n name=\"flow-download\"\n placement=\"bottom\"\n tips=\"导出SQL\"\n @click=\"exportModel\"\n ></svg-button>\n </template>\n <template #content>\n <div class=\"model-manager-search\" clearable placeholder=\"搜索\">\n <tiny-search v-model=\"localKeyword\">\n <template #prefix>\n <tiny-icon-search />\n </template>\n </tiny-search>\n </div>\n <div class=\"model-list\">\n <template v-if=\"models.length\">\n <div\n v-for=\"model in filteredModels\"\n :key=\"model.id\"\n :class=\"['model-item', { active: selectedModel?.id === model.id }]\"\n @click=\"selectModel(model)\"\n >\n <div class=\"model-info\">\n <div class=\"model-name\">{{ model.nameCn }}</div>\n <div class=\"model-english-name\">{{ model.nameEn }}</div>\n <div class=\"model-desc\">{{ model.description || '暂无描述' }}</div>\n </div>\n <div class=\"model-actions\">\n <svg-icon name=\"delete\" @click.stop=\"handleDeleteModel(model)\"></svg-icon>\n </div>\n </div>\n </template>\n <search-empty :isShow=\"!models.length\" />\n </div>\n </template>\n </plugin-panel>\n <model-setting\n :model=\"selectedModel\"\n :models=\"models\"\n @editCallback=\"editCallback\"\n @exportModel=\"exportModel\"\n ></model-setting>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive, provide, computed, onMounted } from 'vue'\nimport { TinySearch, Modal } from '@opentiny/vue'\nimport { IconSearch } from '@opentiny/vue-icon'\nimport { PluginPanel, SvgButton, SearchEmpty } from '@opentiny/tiny-engine-common'\nimport { useLayout } from '@opentiny/tiny-engine-meta-register'\nimport ModelSetting, { openModelSettingPanel, closeModelSettingPanel } from './components/ModelSetting.vue'\nimport { getModelList, deleteModel, getModelSql, getModelSqlById } from './composable/useModelManager'\n\ndefineProps({\n title: {\n type: String,\n default: '模型管理'\n },\n fixedPanels: {\n type: Array\n }\n})\nconst emit = defineEmits(['close'])\n\nconst { PLUGIN_NAME } = useLayout()\nconst TinyIconSearch = IconSearch()\nconst selectedModel = ref(null) // 当前选中的模型\n// 模型数据列表,包含模型及其字段\nconst models = ref([])\nconst localKeyword = ref('')\n\nconst panelState = reactive({\n emitEvent: emit\n})\n\nprovide('panelState', panelState)\n// 根据搜索关键字过滤模型列表\nconst filteredModels = computed(() => {\n if (!localKeyword.value) return models.value\n return models.value.filter(\n (model) =>\n (model.nameCn || '').toLowerCase().includes(localKeyword.value.toLowerCase()) ||\n (model.description || '').toLowerCase().includes(localKeyword.value.toLowerCase())\n )\n})\n\nconst pluginPanelClosed = () => {\n emit('close')\n closeModelSettingPanel()\n}\n\n// 选中模型\nconst selectModel = (model) => {\n if (model.parameters?.length > 0) {\n model.parameters.forEach((item) => {\n item.isModel = false\n if (item.type === 'Enum') {\n item.options = typeof item.options === 'string' ? JSON.parse(item.options) : item.options || []\n }\n if (item.type === 'ModelRef') {\n item.isModel = true\n item.defaultValue = Number(item.defaultValue)\n }\n })\n }\n selectedModel.value = model\n openModelSettingPanel()\n}\n// 添加新模型\nconst handleAddModel = () => {\n selectedModel.value = {\n id: null,\n nameCn: '',\n nameEn: '',\n version: '',\n modelUrl: '',\n description: '',\n parameters: []\n }\n openModelSettingPanel()\n}\n\n// 删除模型(TinyVue 二次确认)\nconst handleDeleteModel = async (model) => {\n const name = model.nameCn || model.nameEn || model.id\n try {\n const result = await Modal.confirm({\n title: '提示',\n message: `确认删除模型「${name}」吗?该操作不可恢复。`\n })\n const confirmed = result === 'confirm' || result?.action === 'confirm' || result === true || result === undefined\n if (!confirmed) return\n await deleteModel(model.id)\n const index = models.value.findIndex((m) => m.id === model.id)\n if (index > -1) {\n models.value.splice(index, 1)\n if (selectedModel.value?.id === model.id) selectedModel.value = null\n }\n } catch (error) {\n // 用户取消或弹窗异常,不做处理\n }\n}\n\nconst getModelLists = async () => {\n const data = await getModelList({\n currentPage: 1,\n pageSize: 500\n })\n models.value = data.records || []\n}\n// 导出模型的sql\nconst exportModel = async (id) => {\n const sqlContent = id ? await getModelSqlById(id) : await getModelSql()\n // 创建 Blob 对象,指定 MIME 类型为 text/sql\n const blob = new Blob([sqlContent], { type: 'text/sql' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${id ? selectedModel.value?.nameEn : 'models'}.sql`\n // 将 <a> 元素添加到 DOM 中\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n}\n\nconst editCallback = async () => {\n await getModelLists()\n selectedModel.value = null\n closeModelSettingPanel()\n}\n\n// 生命周期:页面加载时拉取模型列表\nonMounted(async () => {\n await getModelLists()\n})\n</script>\n\n<style lang=\"less\" scoped>\n.plugin-modelmanager {\n height: 100%;\n width: 280px;\n\n .model-manager-search {\n padding: 0 12px 12px 12px;\n }\n\n .model-list {\n border-top: 1px solid var(--te-model-common-border-color-divider);\n padding-top: 12px;\n overflow-y: scroll;\n color: var(--te-common-text-primary);\n font-size: var(--te-base-font-size-base);\n\n .model-item {\n padding: 10px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n\n &:hover {\n background-color: var(--te-model-manage-draggable-row-bg-color-hover);\n color: var(--te-model-manage-draggable-text-color);\n }\n\n &.active {\n background-color: var(--te-model-manage-draggable-row-bg-color-hover);\n color: var(--te-model-manage-draggable-text-color);\n }\n\n svg {\n cursor: pointer;\n }\n\n .model-info {\n .model-name {\n font-weight: 600;\n margin-bottom: 2px;\n font-size: 14px;\n }\n .model-english-name {\n font-size: 11px;\n margin-bottom: 4px;\n font-family: monospace;\n }\n .model-desc {\n font-size: 12px;\n color: var(--te-model-manage-tip-text-color);\n display: -webkit-box;\n overflow: hidden;\n }\n }\n }\n }\n}\n</style>\n","export default {\n id: 'engine.plugins.modelmanager',\n title: '模型管理',\n type: 'plugins',\n width: 280,\n icon: 'plugin-icon-modelmanager'\n}\n","import entry from './src/Main.vue'\nimport metaData from './meta'\nimport './src/styles/vars.less'\n\nexport default {\n ...metaData,\n entry\n}\n"],"names":["props","__props","localValue","ref","ruleFormRef","rules","watch","newModel","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","TinyForm","_createElementVNode","_hoisted_2","TinyFormItem","TinyInput","_cache","$event","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","fieldGrid","selectedModel","relativeModels","computed","item","getGridData","_b","_a","getModelName","modelId","model","m","handleTypeChange","field","nextTick","current","idx","getFieldTypeLabel","type","startFieldEdit","saveFieldEdit","cancelFieldEdit","index","f","handleDeleteField","TinyButton","$emit","_component_svg_icon","TinyGrid","TinyGridColumn","_withCtx","row","_Fragment","opt","_hoisted_7","_hoisted_8","TinySelect","_renderList","_createBlock","TinyOption","_hoisted_9","_toDisplayString","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TinyCheckbox","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_withModifiers","modelApi","getModelList","params","getMetaApi","META_SERVICE","createModel","data","updateModel","id","deleteModel","getModelSql","getModelSqlById","isShow","openModelSettingPanel","closeModelSettingPanel","_sfc_main","PluginSetting","SvgButton","ButtonGroup","ModelBasicForm","FieldManager","Button","Collapse","CollapseItem","emit","PLUGIN_NAME","useLayout","activeName","modelBasicFormRef","expandConfig","handleAddField","newField","nameInputs","insertEnumValueAfter","removeEnumValue","saveModel","latestModelData","valid","isModelRefRelative","propertyName","$setup","_component_plugin_setting","_ctx","_component_button_group","_component_tiny_button","_component_svg_button","_component_tiny_collapse","_component_tiny_collapse_item","_component_model_basic_form","_component_field_manager","$props","__emit","TinyIconSearch","IconSearch","models","localKeyword","panelState","reactive","provide","filteredModels","pluginPanelClosed","selectModel","handleAddModel","handleDeleteModel","name","result","Modal","getModelLists","exportModel","sqlContent","blob","url","a","editCallback","onMounted","PluginPanel","TinySearch","SearchEmpty","ModelSetting","metaData","entry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/ModelBasicForm.vue","../src/components/FieldManager.vue","../src/composable/useModelManager.js","../src/components/ModelSetting.vue","../src/Main.vue","../meta.js","../index.ts"],"sourcesContent":["<template>\n <div class=\"section\">\n <tiny-form ref=\"ruleFormRef\" :model=\"localValue\" :rules=\"rules\">\n <div class=\"form-item\">\n <tiny-form-item label=\"中文名称\" prop=\"nameCn\">\n <tiny-input v-model=\"localValue.nameCn\" placeholder=\"请输入模型中文名称\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"英文名称\" prop=\"nameEn\">\n <tiny-input v-model=\"localValue.nameEn\" placeholder=\"请输入模型英文名称\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"版本号\" prop=\"version\">\n <tiny-input v-model=\"localValue.version\" placeholder=\"1.0.0\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"模型地址\" prop=\"modelUrl\">\n <tiny-input v-model=\"localValue.modelUrl\" placeholder=\"请输入模型地址,如:https://api.example.com/model\" />\n </tiny-form-item>\n </div>\n <div class=\"form-item\">\n <tiny-form-item label=\"描述\" prop=\"description\">\n <tiny-input type=\"textarea\" :rows=\"3\" v-model=\"localValue.description\" placeholder=\"请输入模型描述\" />\n </tiny-form-item>\n </div>\n </tiny-form>\n </div>\n</template>\n\n<script setup>\nimport { ref, watch } from 'vue'\nimport { TinyInput, Form as TinyForm, FormItem as TinyFormItem } from '@opentiny/vue'\n\nconst props = defineProps({\n model: { type: Object, required: true }\n})\n\n// 创建本地副本,直接编辑本地数据\nconst localValue = ref({ modelUrl: `${import.meta.env.VITE_ORIGIN}/platform-center/api/model-data`, ...props.model })\n\nconst ruleFormRef = ref()\n\nconst rules = ref({\n nameCn: [\n { required: true, message: '必填', trigger: 'blur' },\n { min: 1, max: 32, message: '长度在1-32之间', trigger: 'blur' }\n ],\n nameEn: [\n { required: true, message: '必填', trigger: 'blur' },\n { min: 1, max: 32, message: '长度在1-32之间', trigger: 'blur' }\n ],\n version: [{ required: true, message: '必填', trigger: 'blur' }],\n modelUrl: [{ min: 1, max: 200, message: '长度在1-200之间', trigger: 'blur' }]\n})\n\n// 监听 props 变化,同步到本地(当选择不同模型时)\nwatch(\n () => props.model,\n (newModel) => {\n localValue.value = newModel\n },\n { deep: true }\n)\n\nconst validate = () => ruleFormRef.value.validate()\n\n// 暴露本地数据给父组件访问\ndefineExpose({\n getLocalValue: () => localValue.value,\n validate\n})\n</script>\n\n<style scoped>\n.section {\n margin-bottom: 16px;\n border-radius: 6px;\n padding: 12px;\n}\n.section-title {\n font-size: 16px;\n font-weight: 600;\n color: #262626;\n margin: 0 0 16px 0;\n padding-bottom: 8px;\n border-bottom: 1px solid #f0f0f0;\n}\n.form-item {\n margin-bottom: 20px;\n}\n.form-item label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: #262626;\n font-size: 14px;\n}\n</style>\n","<template>\n <div class=\"section\">\n <tiny-button class=\"add-field-btn\" size=\"mini\" @click=\"$emit('add-field')\"> <svg-icon name=\"add\"></svg-icon> 添加字段 </tiny-button>\n <div class=\"field-table\">\n <tiny-grid\n :data=\"model.parameters\"\n :header-fixed=\"true\"\n :scrollable=\"{ y: true }\"\n :expand-config=\"expandConfig\"\n ref=\"fieldGrid\"\n style=\"height: 100%\"\n >\n <tiny-grid-column type=\"index\" width=\"60\" title=\"序号\"></tiny-grid-column>\n <tiny-grid-column type=\"expand\" width=\"20\">\n <template #default=\"{ row }\">\n <div v-if=\"row.type === 'Enum'\" class=\"expand-content\">\n <div class=\"expand-section\">\n <h4>默认选项(下拉框)</h4>\n <div class=\"enum-values\">\n <div v-for=\"(opt, index) in row.options || []\" :key=\"index\" class=\"enum-item\">\n <tiny-input\n v-model=\"opt.value\"\n placeholder=\"值\"\n size=\"small\"\n style=\"width: 150px; margin-right: 8px\"\n />\n <tiny-input\n v-model=\"opt.label\"\n placeholder=\"显示标签\"\n size=\"small\"\n style=\"width: 200px; margin-right: 8px\"\n />\n <tiny-button type=\"text\" size=\"small\" @click=\"$emit('insert-enum-after', row, index)\"\n >新增</tiny-button\n >\n <tiny-button type=\"text\" size=\"small\" @click=\"$emit('remove-enum', row, index)\">删除</tiny-button>\n </div>\n </div>\n </div>\n </div>\n <div v-else-if=\"row.type === 'ModelRef'\" class=\"expand-content\">\n <div class=\"expand-section\">\n <h4>引用的模型</h4>\n <div class=\"model-ref-section\">\n <tiny-select\n v-model=\"row.defaultValue\"\n placeholder=\"请选择要引用的模型\"\n size=\"small\"\n style=\"width: 100%\"\n >\n <tiny-option\n v-for=\"model in relativeModels\"\n :key=\"model.id\"\n :value=\"model.id\"\n :label=\"`${model.nameCn} (${model.nameEn})`\"\n />\n </tiny-select>\n <div class=\"model-ref-info\" v-if=\"row.defaultValue\">\n <p>已选择模型:{{ getModelName(row.defaultValue) }}</p>\n </div>\n </div>\n </div>\n </div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"prop\" title=\"字段名称\" width=\"120\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-input v-model=\"row.prop\" placeholder=\"请输入字段名称\" size=\"small\" />\n </div>\n <div v-else class=\"readonly-cell\">{{ row.prop || '点击编辑' }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"type\" title=\"类型\" width=\"110\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-select v-model=\"row.type\" size=\"small\" @change=\"handleTypeChange(row)\">\n <tiny-option value=\"String\" label=\"字符串\" />\n <tiny-option value=\"Number\" label=\"数字\" />\n <tiny-option value=\"Boolean\" label=\"布尔值\" />\n <tiny-option value=\"Date\" label=\"日期\" />\n <tiny-option value=\"Enum\" label=\"枚举值\" />\n <tiny-option value=\"ModelRef\" label=\"模型引用\" />\n </tiny-select>\n </div>\n <div v-else class=\"readonly-cell\">{{ getFieldTypeLabel(row.type) }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"defaultValue\" title=\"默认值\" width=\"120\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-input v-model=\"row.defaultValue\" placeholder=\"请输入默认值\" size=\"small\" />\n </div>\n <div v-else class=\"readonly-cell\">{{ row.defaultValue }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"required\" title=\"必填\" width=\"60\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-checkbox v-model=\"row.required\" />\n </div>\n <div v-else class=\"readonly-cell\"><tiny-checkbox v-model=\"row.required\" disabled /></div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"description\" title=\"描述\" width=\"120\">\n <template #default=\"{ row }\">\n <div v-if=\"row.isEditing\" class=\"editing-cell\">\n <tiny-input v-model=\"row.description\" placeholder=\"请输入字段描述\" size=\"small\" />\n </div>\n <div v-else class=\"readonly-cell\">{{ row.description || '点击编辑' }}</div>\n </template>\n </tiny-grid-column>\n <tiny-grid-column field=\"operation\" title=\"操作\" width=\"90\">\n <template #default=\"{ row }\">\n <div class=\"field-actions\">\n <template v-if=\"row.isEditing\">\n <span type=\"text\" size=\"mini\" @click=\"saveFieldEdit(row)\">保存</span>\n <span type=\"text\" size=\"mini\" @click=\"cancelFieldEdit(row)\">取消</span>\n </template>\n <template v-else>\n <span><svg-icon name=\"to-edit\" @click.stop=\"startFieldEdit(row)\" /></span>\n <span><svg-icon name=\"delete\" @click.stop=\"handleDeleteField(row)\" /></span>\n </template>\n </div>\n </template>\n </tiny-grid-column>\n </tiny-grid>\n </div>\n </div>\n</template>\n\n<script setup>\n// 字段表格与展开编辑内容组件\n// 仅承载表格与展开内容,具体列通过插槽从父组件传入,保证与现有逻辑一致\nimport { ref, computed, nextTick } from 'vue'\nimport { TinyButton, TinyGrid, TinyGridColumn, TinyInput, TinySelect, TinyOption, TinyCheckbox } from '@opentiny/vue'\n\nconst props = defineProps({\n model: { type: Object, required: true },\n expandConfig: { type: Object, required: true },\n availableModels: { type: Array, default: () => [] }\n})\n\ndefineEmits(['insert-enum-after', 'remove-enum'])\n\nconst fieldGrid = ref(null)\n\nconst selectedModel = ref(props.model)\n\nconst relativeModels = computed(() => props.availableModels.filter((item) => item.id !== props.model.id))\n\n// 父组件需要:\n// 1) 读取 grid 数据以拿到 _RID\nconst getGridData = () => fieldGrid.value?.getData?.() || []\n\n// 根据模型ID获取模型名称\nconst getModelName = (modelId) => {\n const model = relativeModels.value.find((m) => m.id === modelId)\n return model ? `${model.nameCn} (${model.nameEn})` : '未知模型'\n}\n\n// 字段类型变化处理\nconst handleTypeChange = (field) => {\n if (field.type === 'Enum' || field.type === 'ModelRef') {\n field.isExpanded = true\n // 初始化相应的数据结构\n if (field.type === 'Enum' && (!Array.isArray(field.options) || field.options.length === 0)) {\n field.options = [{ value: '', label: '' }]\n }\n // 模型引用类型:初始化模型引用\n if (field.type === 'ModelRef') {\n field.isModel = true\n field.defaultValue = field.defaultValue || null\n }\n // 将对应 _RID 推入展开 keys(去重)\n nextTick(() => {\n const gridData = fieldGrid.value?.getGridData?.() || []\n gridData.forEach((item) => {\n if (item.id === field.id && !expandConfig.value.expandRowKeys.includes(item._RID)) {\n expandConfig.value.expandRowKeys.push(item._RID)\n }\n })\n })\n } else {\n field.isExpanded = false\n // 按 _RID 从展开 keys 移除\n const gridData = fieldGrid.value?.getGridData?.() || []\n const current = gridData.find((item) => item.id === field.id)\n if (current) {\n const idx = expandConfig.value.expandRowKeys.indexOf(current._RID)\n if (idx > -1) expandConfig.value.expandRowKeys.splice(idx, 1)\n }\n }\n // 强制更新视图\n nextTick(() => {\n if (selectedModel.value && selectedModel.value.parameters) {\n selectedModel.value.parameters = [...selectedModel.value.parameters]\n }\n })\n}\n\n// 字段类型label转换\nconst getFieldTypeLabel = (type) => {\n const typeMap = {\n String: '字符串',\n Number: '数字',\n Boolean: '布尔值',\n Date: '日期',\n Enum: '枚举值',\n ModelRef: '模型引用'\n }\n return typeMap[type] || type\n}\n\n// 字段进入编辑状态\nconst startFieldEdit = (field) => {\n field._editCache = { ...field } // 缓存原始数据\n field.isEditing = true\n // 如果字段类型是枚举值或模型引用类型,自动展开\n if (field.type === 'Enum' || field.type === 'ModelRef') {\n field.isExpanded = true\n // 枚举类型:至少保证一条空数据\n if (field.type === 'Enum' && (!Array.isArray(field.options) || field.options.length === 0)) {\n field.options = [{ value: '', label: '' }]\n }\n // 模型引用类型:初始化模型引用\n if (field.type === 'ModelRef') {\n field.isModel = true\n field.defaultValue = field.defaultValue || null\n }\n // 添加到展开行keys(使用 _RID),并避免重复\n const gridData = fieldGrid.value?.getGridData() || []\n gridData.forEach((item) => {\n if (item.id === field.id && !expandConfig.value.expandRowKeys.includes(item._RID)) {\n expandConfig.value.expandRowKeys.push(item._RID)\n }\n })\n }\n}\n// 字段保存编辑\nconst saveFieldEdit = (field) => {\n field.isEditing = false\n field.isExpanded = false // 保存时收起展开行\n if (field._editCache && JSON.stringify(field._editCache) !== JSON.stringify(field)) {\n field._editCache = null\n }\n // 保存后移除 isNew 标记\n if (field.isNew) delete field.isNew\n}\n\n// 字段取消编辑\nconst cancelFieldEdit = (field) => {\n field.isEditing = false\n field.isExpanded = false // 取消时收起展开行\n // 从展开行keys中移除(使用 _RID)\n const gridData = fieldGrid.value?.getGridData?.() || []\n const current = gridData.find((item) => item.id === field.id)\n if (current) {\n const idx = expandConfig.value.expandRowKeys.indexOf(current._RID)\n if (idx > -1) expandConfig.value.expandRowKeys.splice(idx, 1)\n }\n // 取消编辑时,还原到缓存的数据\n if (field._editCache) {\n Object.assign(field, field._editCache)\n field._editCache = null\n }\n // 如果字段是新增的,则直接删除\n if (field.isNew) {\n const index = selectedModel.value.parameters.findIndex((f) => f.id === field.id)\n if (index > -1) selectedModel.value.parameters.splice(index, 1)\n }\n}\n// 删除字段\nconst handleDeleteField = (field) => {\n const index = selectedModel.value.parameters.findIndex((f) => f.prop === field.prop)\n if (index > -1) selectedModel.value.parameters.splice(index, 1)\n}\n\ndefineExpose({\n fieldGrid,\n getGridData\n})\n</script>\n\n<style lang=\"less\" scoped>\n.section {\n .add-field-btn {\n margin-bottom: 16px;\n }\n\n :deep(.tiny-grid-body__expanded-row) {\n background-color: var(--te-model-manage-input-bg-color);\n }\n .expand-section {\n margin-bottom: 16px;\n\n h4 {\n font-size: 14px;\n font-weight: 600;\n color: var(--te-model-manage-title-text-color);\n margin: 0 0 8px 0;\n padding-bottom: 1px;\n }\n\n .enum-item {\n display: flex;\n align-items: center;\n margin-bottom: 8px;\n padding: 8px;\n background-color: var(--te-model-manage-input-bg-color);\n border-radius: 4px;\n }\n\n .model-ref-section {\n margin-top: 8px;\n }\n\n .model-ref-info {\n margin-top: 8px;\n padding: 8px;\n background: #f0f8ff;\n border-radius: 4px;\n border: 1px solid #d6e4ff;\n\n p {\n margin: 0;\n font-size: 12px;\n color: #1890ff;\n }\n }\n }\n\n .editing-cell {\n :deep(.tiny-input),\n :deep(.tiny-select) {\n width: 100%;\n }\n }\n\n .readonly-cell {\n cursor: pointer;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: #f5f5f5;\n }\n }\n\n .field-actions,\n .editing-cell,\n .readonly-cell {\n background: transparent !important;\n }\n\n .field-actions {\n display: flex;\n gap: 8px;\n span {\n color: var(--te-common-text-emphasize);\n }\n }\n}\n</style>\n","import { getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register'\n\n// 示例API路径,请根据实际后端接口调整\nconst modelApi = '/material-center/api/model'\n\nexport function getModelList(params = {}) {\n return getMetaApi(META_SERVICE.Http).get(`${modelApi}/list`, { params })\n}\n\nexport function createModel(data) {\n return getMetaApi(META_SERVICE.Http).post(`${modelApi}/create`, data)\n}\n\nexport function updateModel(id, data) {\n return getMetaApi(META_SERVICE.Http).put(`${modelApi}/update/${id}`, data)\n}\n\nexport function deleteModel(id) {\n return getMetaApi(META_SERVICE.Http).delete(`${modelApi}/delete/${id}`)\n}\n\nexport function getModelSql() {\n return getMetaApi(META_SERVICE.Http).get(`${modelApi}/table/list`)\n}\n\nexport function getModelSqlById(id) {\n return getMetaApi(META_SERVICE.Http).get(`${modelApi}/table/${id}`)\n}\n","<template>\n <plugin-setting\n v-if=\"isShow\"\n :fixed-name=\"PLUGIN_NAME.ModelManager\"\n :align=\"align\"\n title=\"模型设置\"\n class=\"modelmanager-plugin-setting\"\n >\n <template #header>\n <button-group>\n <tiny-button @click=\"$emit('exportModel', selectedModel?.id)\">导出SQL</tiny-button>\n <tiny-button type=\"primary\" @click=\"saveModel\">保存</tiny-button>\n <svg-button name=\"close\" @click=\"closeModelSettingPanel\"></svg-button>\n </button-group>\n </template>\n\n <template #content>\n <tiny-collapse v-model=\"activeName\" class=\"page-setting-collapse\">\n <tiny-collapse-item title=\"基本设置\" name=\"general\">\n <model-basic-form ref=\"modelBasicFormRef\" :model=\"selectedModel\"></model-basic-form>\n </tiny-collapse-item>\n\n <tiny-collapse-item class=\"base-setting\" title=\"字段管理\" name=\"fields\">\n <field-manager\n ref=\"fieldManagerRef\"\n :model=\"selectedModel\"\n :expand-config=\"expandConfig\"\n :available-models=\"models\"\n @add-field=\"handleAddField\"\n @insert-enum-after=\"insertEnumValueAfter\"\n @remove-enum=\"removeEnumValue\"\n >\n </field-manager>\n </tiny-collapse-item>\n </tiny-collapse>\n </template>\n </plugin-setting>\n</template>\n<script>\nimport { ref, watch, nextTick } from 'vue'\nimport { Button, Collapse, CollapseItem } from '@opentiny/vue'\nimport { PluginSetting, ButtonGroup, SvgButton } from '@opentiny/tiny-engine-common'\nimport { useLayout } from '@opentiny/tiny-engine-meta-register'\nimport ModelBasicForm from './ModelBasicForm.vue'\nimport FieldManager from './FieldManager.vue'\nimport { createModel, updateModel } from '../composable/useModelManager'\n\nconst isShow = ref(false) \n\nexport const openModelSettingPanel = () => {\n isShow.value = true\n}\n\nexport const closeModelSettingPanel = () => {\n isShow.value = false\n}\n\nexport default {\n components: {\n PluginSetting,\n SvgButton,\n ButtonGroup,\n ModelBasicForm,\n FieldManager,\n TinyButton: Button,\n TinyCollapse: Collapse,\n TinyCollapseItem: CollapseItem\n },\n props: {\n model: {\n type: Object,\n default: () => ({})\n },\n models: {\n type: Array,\n default: () => []\n }\n },\n emits: ['editCallback', 'exportModel'],\n setup(props, { emit }) {\n const { PLUGIN_NAME } = useLayout()\n const activeName = ref(['general', 'fields'])\n const selectedModel = ref()\n const modelBasicFormRef = ref()\n // 展开行配置\n const expandConfig = ref({\n expandAll: false,\n trigger: 'row',\n expandRowKeys: [],\n accordion: false,\n activeMethod: (row) => row.type === 'Enum' || row.type === 'ModelRef', // 枚举类型和模型引用类型都显示展开箭头\n showIcon: (row) => row.type === 'Enum' || row.type === 'ModelRef' // 枚举类型和模型引用类型都显示展开箭头\n })\n\n // 添加字段,自动进入编辑状态\n const handleAddField = () => {\n if (!selectedModel.value) return\n const newField = {\n prop: '',\n type: 'String',\n required: false,\n description: '',\n isEditing: true,\n isNew: true // 新增字段标记\n }\n selectedModel.value.parameters.push(newField)\n nextTick(() => {\n const nameInputs = document.querySelectorAll('.editing-cell .tiny-input')\n if (nameInputs.length > 0) nameInputs[nameInputs.length - 1].focus()\n })\n }\n\n // 在当前行后插入一条枚举值\n const insertEnumValueAfter = (field, index) => {\n if (!field.options) {\n field.options = []\n }\n field.options.splice(index + 1, 0, { value: '', label: '' })\n }\n\n // 删除枚举值\n const removeEnumValue = (field, index) => {\n if (!Array.isArray(field.options)) return\n if (field.options.length <= 1) {\n // 只剩一条时,不删除,清空内容\n field.options[0] = { value: '', label: '' }\n return\n }\n field.options.splice(index, 1)\n }\n\n // 保存模型时一并保存version字段\n const saveModel = async () => {\n // 从子组件获取最新的数据\n const latestModelData = modelBasicFormRef.value?.getLocalValue()\n modelBasicFormRef.value.validate().then(async (valid) => {\n if (valid) {\n const newModel = {\n description: latestModelData.description,\n modelUrl: latestModelData.modelUrl,\n nameCn: latestModelData.nameCn,\n nameEn: latestModelData.nameEn,\n version: latestModelData.version,\n id: latestModelData.id,\n parameters: latestModelData.parameters.filter((item) => !!item.prop)\n }\n let isModelRefRelative = true\n let propertyName = ''\n if (newModel.parameters?.length > 0) {\n newModel.parameters.forEach((item) => {\n if (item.type === 'Enum') {\n item.options = JSON.stringify(item.options)\n }\n if (item.type === 'ModelRef') {\n item.isModel = true\n delete item.options\n item.defaultValue = item.defaultValue || null\n isModelRefRelative = !!item.defaultValue\n propertyName = item.prop\n }\n })\n }\n if (!isModelRefRelative) {\n Notify({\n type: 'error',\n message: `字段${propertyName}未关联模型引用`\n })\n return\n }\n if (latestModelData.id === null) {\n delete newModel.id\n await createModel(newModel)\n } else {\n await updateModel(newModel.id, newModel)\n }\n emit('editCallback')\n Notify({\n type: 'success',\n message: '保存成功'\n })\n selectedModel.value = null\n }\n })\n }\n // 监听 props 变化,同步到本地(当选择不同模型时)\n watch(\n () => props.model,\n (newModel) => {\n selectedModel.value = newModel\n },\n { deep: true }\n )\n return {\n isShow,\n PLUGIN_NAME,\n activeName,\n modelBasicFormRef,\n expandConfig,\n selectedModel,\n closeModelSettingPanel,\n handleAddField,\n insertEnumValueAfter,\n removeEnumValue,\n saveModel\n }\n }\n}\n</script>\n<style lang=\"less\" scoped>\n.modelmanager-plugin-setting {\n width: fit-content;\n}\n</style>\n","<template>\n <div class=\"plugin-modelmanager\">\n <plugin-panel\n :title=\"title\"\n :fixed-name=\"PLUGIN_NAME.ModelManager\"\n :fixedPanels=\"fixedPanels\"\n @close=\"pluginPanelClosed\"\n >\n <template #header>\n <svg-button class=\"add-icon\" name=\"add\" placement=\"bottom\" tips=\"新建模型\" @click=\"handleAddModel\"></svg-button>\n <svg-button\n class=\"flow-download-icon\"\n name=\"flow-download\"\n placement=\"bottom\"\n tips=\"导出SQL\"\n @click=\"exportModel\"\n ></svg-button>\n </template>\n <template #content>\n <div class=\"model-manager-search\" clearable placeholder=\"搜索\">\n <tiny-search v-model=\"localKeyword\">\n <template #prefix>\n <tiny-icon-search />\n </template>\n </tiny-search>\n </div>\n <div class=\"model-list\">\n <template v-if=\"models.length\">\n <div\n v-for=\"model in filteredModels\"\n :key=\"model.id\"\n :class=\"['model-item', { active: selectedModel?.id === model.id }]\"\n @click=\"selectModel(model)\"\n >\n <div class=\"model-info\">\n <div class=\"model-name\">{{ model.nameCn }}</div>\n <div class=\"model-english-name\">{{ model.nameEn }}</div>\n <div class=\"model-desc\">{{ model.description || '暂无描述' }}</div>\n </div>\n <div class=\"model-actions\">\n <svg-icon name=\"delete\" @click.stop=\"handleDeleteModel(model)\"></svg-icon>\n </div>\n </div>\n </template>\n <search-empty :isShow=\"!models.length\" />\n </div>\n </template>\n </plugin-panel>\n <model-setting\n :model=\"selectedModel\"\n :models=\"models\"\n @editCallback=\"editCallback\"\n @exportModel=\"exportModel\"\n ></model-setting>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive, provide, computed, onMounted } from 'vue'\nimport { TinySearch, Modal } from '@opentiny/vue'\nimport { IconSearch } from '@opentiny/vue-icon'\nimport { PluginPanel, SvgButton, SearchEmpty } from '@opentiny/tiny-engine-common'\nimport { useLayout } from '@opentiny/tiny-engine-meta-register'\nimport ModelSetting, { openModelSettingPanel, closeModelSettingPanel } from './components/ModelSetting.vue'\nimport { getModelList, deleteModel, getModelSql, getModelSqlById } from './composable/useModelManager'\n\ndefineProps({\n title: {\n type: String,\n default: '模型管理'\n },\n fixedPanels: {\n type: Array\n }\n})\nconst emit = defineEmits(['close'])\n\nconst { PLUGIN_NAME } = useLayout()\nconst TinyIconSearch = IconSearch()\nconst selectedModel = ref(null) // 当前选中的模型\n// 模型数据列表,包含模型及其字段\nconst models = ref([])\nconst localKeyword = ref('')\n\nconst panelState = reactive({\n emitEvent: emit\n})\n\nprovide('panelState', panelState)\n// 根据搜索关键字过滤模型列表\nconst filteredModels = computed(() => {\n if (!localKeyword.value) return models.value\n return models.value.filter(\n (model) =>\n (model.nameCn || '').toLowerCase().includes(localKeyword.value.toLowerCase()) ||\n (model.description || '').toLowerCase().includes(localKeyword.value.toLowerCase())\n )\n})\n\nconst pluginPanelClosed = () => {\n emit('close')\n closeModelSettingPanel()\n}\n\n// 选中模型\nconst selectModel = (model) => {\n if (model.parameters?.length > 0) {\n model.parameters.forEach((item) => {\n item.isModel = false\n if (item.type === 'Enum') {\n item.options = typeof item.options === 'string' ? JSON.parse(item.options) : item.options || []\n }\n if (item.type === 'ModelRef') {\n item.isModel = true\n item.defaultValue = Number(item.defaultValue)\n }\n })\n }\n selectedModel.value = model\n openModelSettingPanel()\n}\n// 添加新模型\nconst handleAddModel = () => {\n selectedModel.value = {\n id: null,\n nameCn: '',\n nameEn: '',\n version: '',\n modelUrl: '',\n description: '',\n parameters: []\n }\n openModelSettingPanel()\n}\n\n// 删除模型(TinyVue 二次确认)\nconst handleDeleteModel = async (model) => {\n const name = model.nameCn || model.nameEn || model.id\n try {\n const result = await Modal.confirm({\n title: '提示',\n message: `确认删除模型「${name}」吗?该操作不可恢复。`\n })\n const confirmed = result === 'confirm' || result?.action === 'confirm' || result === true || result === undefined\n if (!confirmed) return\n await deleteModel(model.id)\n const index = models.value.findIndex((m) => m.id === model.id)\n if (index > -1) {\n models.value.splice(index, 1)\n if (selectedModel.value?.id === model.id) selectedModel.value = null\n }\n } catch (error) {\n // 用户取消或弹窗异常,不做处理\n }\n}\n\nconst getModelLists = async () => {\n const data = await getModelList({\n currentPage: 1,\n pageSize: 500\n })\n models.value = data.records || []\n}\n// 导出模型的sql\nconst exportModel = async (id) => {\n const sqlContent = id ? await getModelSqlById(id) : await getModelSql()\n // 创建 Blob 对象,指定 MIME 类型为 text/sql\n const blob = new Blob([sqlContent], { type: 'text/sql' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${id ? selectedModel.value?.nameEn : 'models'}.sql`\n // 将 <a> 元素添加到 DOM 中\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n}\n\nconst editCallback = async () => {\n await getModelLists()\n selectedModel.value = null\n closeModelSettingPanel()\n}\n\n// 生命周期:页面加载时拉取模型列表\nonMounted(async () => {\n await getModelLists()\n})\n</script>\n\n<style lang=\"less\" scoped>\n.plugin-modelmanager {\n height: 100%;\n width: 280px;\n\n .model-manager-search {\n padding: 0 12px 12px 12px;\n }\n\n .model-list {\n border-top: 1px solid var(--te-model-common-border-color-divider);\n padding-top: 12px;\n overflow-y: scroll;\n color: var(--te-common-text-primary);\n font-size: var(--te-base-font-size-base);\n\n .model-item {\n padding: 10px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n\n &:hover {\n background-color: var(--te-model-manage-draggable-row-bg-color-hover);\n color: var(--te-model-manage-draggable-text-color);\n }\n\n &.active {\n background-color: var(--te-model-manage-draggable-row-bg-color-hover);\n color: var(--te-model-manage-draggable-text-color);\n }\n\n svg {\n cursor: pointer;\n }\n\n .model-info {\n .model-name {\n font-weight: 600;\n margin-bottom: 2px;\n font-size: 14px;\n }\n .model-english-name {\n font-size: 11px;\n margin-bottom: 4px;\n font-family: monospace;\n }\n .model-desc {\n font-size: 12px;\n color: var(--te-model-manage-tip-text-color);\n display: -webkit-box;\n overflow: hidden;\n }\n }\n }\n }\n}\n</style>\n","export default {\n id: 'engine.plugins.modelmanager',\n title: '模型管理',\n type: 'plugins',\n width: 280,\n icon: 'plugin-icon-modelmanager'\n}\n","import entry from './src/Main.vue'\nimport metaData from './meta'\nimport './src/styles/vars.less'\n\nexport default {\n ...metaData,\n entry\n}\n"],"names":["props","__props","localValue","ref","ruleFormRef","rules","watch","newModel","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","TinyForm","_createElementVNode","_hoisted_2","TinyFormItem","TinyInput","_cache","$event","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","fieldGrid","selectedModel","relativeModels","computed","item","getGridData","_b","_a","getModelName","modelId","model","m","handleTypeChange","field","nextTick","current","idx","getFieldTypeLabel","type","startFieldEdit","saveFieldEdit","cancelFieldEdit","index","f","handleDeleteField","TinyButton","$emit","_component_svg_icon","TinyGrid","TinyGridColumn","_withCtx","row","_Fragment","opt","_hoisted_7","_hoisted_8","TinySelect","_renderList","_createBlock","TinyOption","_hoisted_9","_toDisplayString","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","TinyCheckbox","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_withModifiers","modelApi","getModelList","params","getMetaApi","META_SERVICE","createModel","data","updateModel","id","deleteModel","getModelSql","getModelSqlById","isShow","openModelSettingPanel","closeModelSettingPanel","_sfc_main","PluginSetting","SvgButton","ButtonGroup","ModelBasicForm","FieldManager","Button","Collapse","CollapseItem","emit","PLUGIN_NAME","useLayout","activeName","modelBasicFormRef","expandConfig","handleAddField","newField","nameInputs","insertEnumValueAfter","removeEnumValue","saveModel","latestModelData","valid","isModelRefRelative","propertyName","$setup","_component_plugin_setting","_ctx","_component_button_group","_component_tiny_button","_component_svg_button","_component_tiny_collapse","_component_tiny_collapse_item","_component_model_basic_form","_component_field_manager","$props","__emit","TinyIconSearch","IconSearch","models","localKeyword","panelState","reactive","provide","filteredModels","pluginPanelClosed","selectModel","handleAddModel","handleDeleteModel","name","result","Modal","getModelLists","exportModel","sqlContent","blob","url","a","editCallback","onMounted","PluginPanel","TinySearch","SearchEmpty","ModelSetting","metaData","entry"],"mappings":"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"}
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.section[data-v-
|
|
1
|
+
.section[data-v-c29b7783]{margin-bottom:16px;border-radius:6px;padding:12px}.section-title[data-v-c29b7783]{font-size:16px;font-weight:600;color:#262626;margin:0 0 16px;padding-bottom:8px;border-bottom:1px solid #f0f0f0}.form-item[data-v-c29b7783]{margin-bottom:20px}.form-item label[data-v-c29b7783]{display:block;margin-bottom:8px;font-weight:500;color:#262626;font-size:14px}.section .add-field-btn[data-v-1e39724d]{margin-bottom:16px}.section[data-v-1e39724d] .tiny-grid-body__expanded-row{background-color:var(--te-model-manage-input-bg-color)}.section .expand-section[data-v-1e39724d]{margin-bottom:16px}.section .expand-section h4[data-v-1e39724d]{font-size:14px;font-weight:600;color:var(--te-model-manage-title-text-color);margin:0 0 8px;padding-bottom:1px}.section .expand-section .enum-item[data-v-1e39724d]{display:flex;align-items:center;margin-bottom:8px;padding:8px;background-color:var(--te-model-manage-input-bg-color);border-radius:4px}.section .expand-section .model-ref-section[data-v-1e39724d]{margin-top:8px}.section .expand-section .model-ref-info[data-v-1e39724d]{margin-top:8px;padding:8px;background:#f0f8ff;border-radius:4px;border:1px solid #d6e4ff}.section .expand-section .model-ref-info p[data-v-1e39724d]{margin:0;font-size:12px;color:#1890ff}.section .editing-cell[data-v-1e39724d] .tiny-input,.section .editing-cell[data-v-1e39724d] .tiny-select{width:100%}.section .readonly-cell[data-v-1e39724d]{cursor:pointer;border-radius:4px;transition:background-color .2s ease}.section .readonly-cell[data-v-1e39724d]:hover{background-color:#f5f5f5}.section .field-actions[data-v-1e39724d],.section .editing-cell[data-v-1e39724d],.section .readonly-cell[data-v-1e39724d]{background:transparent!important}.section .field-actions[data-v-1e39724d]{display:flex;gap:8px}.section .field-actions span[data-v-1e39724d]{color:var(--te-common-text-emphasize)}.modelmanager-plugin-setting[data-v-6efda822]{width:fit-content}.plugin-modelmanager[data-v-0c5de79e]{height:100%;width:280px}.plugin-modelmanager .model-manager-search[data-v-0c5de79e]{padding:0 12px 12px}.plugin-modelmanager .model-list[data-v-0c5de79e]{border-top:1px solid var(--te-model-common-border-color-divider);padding-top:12px;overflow-y:scroll;color:var(--te-common-text-primary);font-size:var(--te-base-font-size-base)}.plugin-modelmanager .model-list .model-item[data-v-0c5de79e]{padding:10px;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.plugin-modelmanager .model-list .model-item[data-v-0c5de79e]:hover,.plugin-modelmanager .model-list .model-item.active[data-v-0c5de79e]{background-color:var(--te-model-manage-draggable-row-bg-color-hover);color:var(--te-model-manage-draggable-text-color)}.plugin-modelmanager .model-list .model-item svg[data-v-0c5de79e]{cursor:pointer}.plugin-modelmanager .model-list .model-item .model-info .model-name[data-v-0c5de79e]{font-weight:600;margin-bottom:2px;font-size:14px}.plugin-modelmanager .model-list .model-item .model-info .model-english-name[data-v-0c5de79e]{font-size:11px;margin-bottom:4px;font-family:monospace}.plugin-modelmanager .model-list .model-item .model-info .model-desc[data-v-0c5de79e]{font-size:12px;color:var(--te-model-manage-tip-text-color);display:-webkit-box;overflow:hidden}.plugin-modelmanager{--te-model-manage-title-text-color: var(--te-common-text-primary);--te-model-manage-input-bg-color: var(--te-common-bg-default);--te-model-manage-input-border-color: var(--te-common-border-default);--te-model-manage-tip-color: var(--te-common-text-primary);--te-model-manage-tip-text-color: var(--te-common-text-weaken);--te-model-manage-tip-dim-text-color: var(--te-common-text-primary);--te-model-manage-tree-text-bg-color: var(--te-common-bg-default);--te-model-manage-tree-node-bg-color: var(--te-common-bg-default);--te-model-manage-tree-node-bg-color-hover: var(--te-common-bg-container);--te-model-manage-text-color: var(--te-common-text-secondary);--te-model-manage-input-head-text-color: var(--te-common-text-primary);--te-model-manage-input-or-output-text-color: var(--te-common-text-secondary);--te-model-manage-life-cycle-alert-text-color: var(--te-common-text-weaken);--te-model-manage-icon-color: var(--te-common-icon-secondary);--te-model-manage-draggable-row-bg-color-hover: var(--te-common-bg-container);--te-model-manage-draggable-text-color: var(--te-common-text-primary);--te-model-manage-draggable-icon-color: var(--te-common-icon-secondary);--te-model-manage-draggable-border-color: var(--te-common-border-checked);--te-model-common-border-color-divider: var(--te-common-border-divider)}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentiny/tiny-engine-plugin-model-manager",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0-alpha.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"homepage": "https://opentiny.design/tiny-engine",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@opentiny/tiny-engine-common": "2.
|
|
33
|
-
"@opentiny/tiny-engine-meta-register": "2.
|
|
32
|
+
"@opentiny/tiny-engine-common": "2.10.0-alpha.1",
|
|
33
|
+
"@opentiny/tiny-engine-meta-register": "2.10.0-alpha.1"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@opentiny/tiny-engine-vite-plugin-meta-comments": "2.
|
|
36
|
+
"@opentiny/tiny-engine-vite-plugin-meta-comments": "2.10.0-alpha.1",
|
|
37
37
|
"@vitejs/plugin-vue": "^5.1.2",
|
|
38
38
|
"@vitejs/plugin-vue-jsx": "^4.0.1",
|
|
39
39
|
"vite": "^5.4.2"
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"@opentiny/vue-renderless": "^3.20.0",
|
|
45
45
|
"vue": "^3.4.15"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "b9fe4bb680b13b929abf932d0e1b44c0a1123a65"
|
|
48
48
|
}
|