feat: 平台配置表扩展配图/字数字段,微信公众号正文插入配图,合规检查从DB读规则
- PlatformConfig模型新增requires_image、image_count_min/max、image_width/height、min_words/max_words - schemas.py同步PlatformConfigBase/Create/Update/Response新字段 - initial_data.py为三大平台填充初始值(微信需配图、字数800-1500等) - database.py添加新列ALTER TABLE迁移 - platforms.html重写编辑弹窗(正确字段名+配图/字数设置) - writer.py微信公众号文章正文h1后插入<img>占位 - compliance_checker.py接受platform_config参数,从DB读取规则替代硬编码 - compliance_optimizer.py启动时加载DB平台配置传入checker
This commit is contained in:
@@ -78,52 +78,74 @@
|
||||
<span class="platform-meta-label">平台标识</span>
|
||||
<span class="platform-meta-value">{{ p.platform }}</span>
|
||||
</div>
|
||||
<div v-if="p.platform_name" class="platform-meta-item">
|
||||
<div class="platform-meta-item">
|
||||
<span class="platform-meta-label">平台名称</span>
|
||||
<span class="platform-meta-value">{{ p.platform_name }}</span>
|
||||
<span class="platform-meta-value">{{ p.name }}</span>
|
||||
</div>
|
||||
<div v-if="p.min_words || p.max_words" class="platform-meta-item">
|
||||
<span class="platform-meta-label">字数限制</span>
|
||||
<span class="platform-meta-value">{{ p.min_words || 0 }} - {{ p.max_words || '不限' }}</span>
|
||||
</div>
|
||||
<div class="platform-meta-item">
|
||||
<span class="platform-meta-label">需要配图</span>
|
||||
<span class="platform-meta-value">{{ p.requires_image ? '是' : '否' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="p.format_rules && Object.keys(p.format_rules).length > 0" class="rules-section">
|
||||
<div class="rules-title"><el-icon style="vertical-align:-2px;"><IconTopic /></el-icon> 格式规则</div>
|
||||
<div v-for="(rule, key) in p.format_rules" :key="key" class="rule-item">
|
||||
<div v-if="p.format_template && Object.keys(p.format_template).length > 0" class="rules-section">
|
||||
<div class="rules-title"><el-icon style="vertical-align:-2px;"><IconTopic /></el-icon> 格式模板</div>
|
||||
<div v-for="(rule, key) in p.format_template" :key="key" class="rule-item">
|
||||
<strong>{{ key }}:</strong> {{ typeof rule === 'object' ? JSON.stringify(rule) : rule }}
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="p.compliance_rules && p.compliance_rules.length > 0" class="rules-section">
|
||||
<div v-if="p.compliance_rules && Object.keys(p.compliance_rules).length > 0" class="rules-section">
|
||||
<div class="rules-title"><el-icon style="vertical-align:-2px;"><IconWarning /></el-icon> 合规规则</div>
|
||||
<div v-for="(rule, idx) in p.compliance_rules" :key="idx" class="rule-item">{{ rule }}</div>
|
||||
<div v-for="(val, key) in p.compliance_rules" :key="key" class="rule-item">
|
||||
<strong>{{ key }}:</strong> {{ typeof val === 'object' ? JSON.stringify(val) : val }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
<el-dialog v-model="showEditDialog" :title="isEditing ? '编辑平台' : '新增平台'" width="600px">
|
||||
<el-form :model="platformForm" label-width="100px">
|
||||
<el-dialog v-model="showEditDialog" :title="isEditing ? '编辑平台' : '新增平台'" width="650px">
|
||||
<el-form :model="platformForm" label-width="120px">
|
||||
<el-form-item label="平台标识" :required="!isEditing">
|
||||
<el-input v-model="platformForm.platform" :disabled="isEditing" placeholder="如: zhihu, wechat, xiaohongshu"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="平台名称">
|
||||
<el-input v-model="platformForm.platform_name" placeholder="如: 知乎"></el-input>
|
||||
<el-input v-model="platformForm.name" placeholder="如: 知乎"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="启用状态">
|
||||
<el-switch v-model="platformForm.is_active"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="标题模板">
|
||||
<el-input v-model="platformForm.title_template" placeholder="如: 【{{tag}}】{{title}}"></el-input>
|
||||
<el-form-item label="默认格式">
|
||||
<el-input v-model="platformForm.default_format" type="textarea" :rows="2" placeholder="如: 公众号图文,800-1500字,亲切口语化"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="正文模板">
|
||||
<el-input v-model="platformForm.body_template" type="textarea" :rows="4" placeholder="如: {{content}}"></el-input>
|
||||
<el-divider content-position="left">字数与配图</el-divider>
|
||||
<el-form-item label="最少字数">
|
||||
<el-input-number v-model="platformForm.min_words" :min="0" :max="100000"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="字数限制">
|
||||
<el-input-number v-model="platformForm.min_words" :min="0" placeholder="最少"></el-input-number>
|
||||
<span style="margin: 0 8px;">-</span>
|
||||
<el-input-number v-model="platformForm.max_words" :min="0" placeholder="最多"></el-input-number>
|
||||
<el-form-item label="最多字数">
|
||||
<el-input-number v-model="platformForm.max_words" :min="0" :max="100000"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="需要配图">
|
||||
<el-switch v-model="platformForm.requires_image"></el-switch>
|
||||
</el-form-item>
|
||||
<template v-if="platformForm.requires_image">
|
||||
<el-form-item label="最少图片数">
|
||||
<el-input-number v-model="platformForm.image_count_min" :min="0" :max="20"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="最多图片数">
|
||||
<el-input-number v-model="platformForm.image_count_max" :min="0" :max="20"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="图片宽度(px)">
|
||||
<el-input-number v-model="platformForm.image_width" :min="0" :max="4096" :step="1"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="图片高度(px)">
|
||||
<el-input-number v-model="platformForm.image_height" :min="0" :max="4096" :step="1"></el-input-number>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showEditDialog = false">取消</el-button>
|
||||
@@ -147,7 +169,7 @@ const PlatformsApp = {
|
||||
showEditDialog: false,
|
||||
isEditing: false,
|
||||
saving: false,
|
||||
platformForm: { platform: '', platform_name: '', is_active: true, title_template: '', body_template: '', min_words: null, max_words: null }
|
||||
platformForm: { platform: '', name: '', is_active: true, default_format: '', requires_image: false, image_count_min: 0, image_count_max: 0, image_width: 0, image_height: 0, min_words: 0, max_words: 0 }
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -188,12 +210,16 @@ const PlatformsApp = {
|
||||
this.isEditing = true;
|
||||
this.platformForm = {
|
||||
platform: p.platform,
|
||||
platform_name: p.platform_name || '',
|
||||
name: p.name || '',
|
||||
is_active: p.is_active,
|
||||
title_template: p.title_template || '',
|
||||
body_template: p.body_template || '',
|
||||
min_words: p.min_words,
|
||||
max_words: p.max_words
|
||||
default_format: p.default_format || '',
|
||||
requires_image: p.requires_image || false,
|
||||
image_count_min: p.image_count_min || 0,
|
||||
image_count_max: p.image_count_max || 0,
|
||||
image_width: p.image_width || 0,
|
||||
image_height: p.image_height || 0,
|
||||
min_words: p.min_words || 0,
|
||||
max_words: p.max_words || 0
|
||||
};
|
||||
this.showEditDialog = true;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user