feat: update content creation management

This commit is contained in:
2026-04-27 10:23:27 +08:00
parent d628dfdd72
commit d516886fc9

View File

@@ -1,4 +1,4 @@
<template> <template>
<div class="creation-page" :class="{ 'is-submitting': submitLoading }"> <div class="creation-page" :class="{ 'is-submitting': submitLoading }">
<div v-if="submitLoading" class="creation-loading-mask"> <div v-if="submitLoading" class="creation-loading-mask">
<div class="creation-loading-card"> <div class="creation-loading-card">
@@ -100,7 +100,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, nextTick, onMounted, reactive, ref, watch } from 'vue'; import { computed, onMounted, reactive, ref, watch } from 'vue';
import { ElMessage, type FormInstance, type FormRules } from 'element-plus'; import { ElMessage, type FormInstance, type FormRules } from 'element-plus';
import { import {
createCreation, createCreation,
@@ -175,28 +175,32 @@ const rules: FormRules = {
title: [{ required: true, message: '请输入标题', trigger: 'blur' }], title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
style: [{ required: true, message: '请选择内容风格', trigger: 'change' }], style: [{ required: true, message: '请选择内容风格', trigger: 'change' }],
count: [{ required: true, message: '请输入生成条数', trigger: 'change' }], count: [{ required: true, message: '请输入生成条数', trigger: 'change' }],
image_per_post: [{ image_per_post: [
required: true, {
message: '请输入配图数量', required: true,
trigger: 'change', message: '请输入配图数量',
validator: (rule, value, callback) => { trigger: 'change',
void rule; validator: (rule, value, callback) => {
if (!showImageConfig.value) return callback(); void rule;
if (!value) return callback(new Error('请输入配图数量')); if (!showImageConfig.value) return callback();
callback(); if (!value) return callback(new Error('请输入配图数量'));
callback();
},
}, },
}], ],
image_ratio: [{ image_ratio: [
required: true, {
message: '请选择图片比例', required: true,
trigger: 'change', message: '请选择图片比例',
validator: (rule, value, callback) => { trigger: 'change',
void rule; validator: (rule, value, callback) => {
if (!showImageConfig.value) return callback(); void rule;
if (!value) return callback(new Error('请选择图片比例')); if (!showImageConfig.value) return callback();
callback(); if (!value) return callback(new Error('请选择图片比例'));
callback();
},
}, },
}], ],
}; };
const joinUrl = (base: string, path: string) => `${base.replace(/\/$/, '')}${path.startsWith('/') ? path : `/${path}`}`; const joinUrl = (base: string, path: string) => `${base.replace(/\/$/, '')}${path.startsWith('/') ? path : `/${path}`}`;
const buildAssetUrl = (path?: string) => { const buildAssetUrl = (path?: string) => {
@@ -297,16 +301,6 @@ const downloadNode = async (data: TreeNode) => {
ElMessage.error('下载失败'); ElMessage.error('下载失败');
} }
}; };
const findFirstPreviewNode = (nodes: TreeNode[]): TreeNode | null => {
for (const node of nodes) {
if (node.nodeType === 'html' || node.nodeType === 'image') return node;
if (node.children?.length) {
const matched = findFirstPreviewNode(node.children);
if (matched) return matched;
}
}
return null;
};
const getList = async () => { const getList = async () => {
treeLoading.value = true; treeLoading.value = true;
try { try {
@@ -314,9 +308,6 @@ const getList = async () => {
imgAddressPrefix.value = res.data?.imgAddressPrefix || ''; imgAddressPrefix.value = res.data?.imgAddressPrefix || '';
treeNodes.value = buildTreeNodes(res.data?.Tree || []); treeNodes.value = buildTreeNodes(res.data?.Tree || []);
selectedPreview.value = null; selectedPreview.value = null;
await nextTick();
const firstLeaf = findFirstPreviewNode(treeNodes.value);
if (firstLeaf) handleNodeClick(firstLeaf);
} catch { } catch {
treeNodes.value = []; treeNodes.value = [];
imgAddressPrefix.value = ''; imgAddressPrefix.value = '';