7e953afbd2
- 新增创作工作台 studio.html:合并选题/内容工厂/文章管理为单一 tab 入口(iframe embed 模式) - 新增 AI味检测模块(ai_slop API + 页面,合规软硬问题分级) - 新增白标品牌配置(branding API + 页面 + deploy 私有化交付包) - 发布闭环:publishing 放宽至 editor + records/mark-published 接口 - 移动端响应式补全(admin/calendar/ai-slop 表格卡片兜底) - 修复菜单幂等播种缺陷(按 path 对齐,避免功能页孤立) - 新增短视频脚本 shortvideo.py 与 2026 市场调研简报
124 lines
6.8 KiB
HTML
124 lines
6.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>宇之然内容创作平台 - 白标设置</title>
|
|
<link rel="stylesheet" href="element-plus.css">
|
|
<link rel="stylesheet" href="theme-modern.css">
|
|
<script src="uni-nav.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="app" v-cloak>
|
|
<uni-nav title="白标设置" :username="currentUser.username" :is-admin="isAdmin" current-page="branding" @navigate="redirectToPage" @logout="handleLogout">
|
|
</uni-nav>
|
|
<div class="main-content">
|
|
<main class="content-area">
|
|
<div class="card page-fade">
|
|
<div class="page-header">
|
|
<h2 class="page-title"><el-icon style="vertical-align:-2px;"><IconSetting /></el-icon> 白标 / 私有化品牌设置</h2>
|
|
<el-tag type="info" size="small">仅管理员可见</el-tag>
|
|
</div>
|
|
<el-alert type="success" :closable="false" show-icon style="margin-bottom:16px;">
|
|
<template #title>私有化交付说明</template>
|
|
修改以下配置即可将本平台改名为贵司品牌(名称 / Logo / 主色 / 支持邮箱),保存后前台导航与品牌色即时生效。适合部署到客户内网或作为白标产品交付。
|
|
</el-alert>
|
|
|
|
<el-form label-width="110px" style="max-width:640px;">
|
|
<el-form-item label="平台名称">
|
|
<el-input v-model="form.brand_name" placeholder="如:星辰内容中台" maxlength="20" show-word-limit></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="Logo 地址">
|
|
<el-input v-model="form.brand_logo" placeholder="https 图片 URL,留空则显示文字名称"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="主色">
|
|
<el-color-picker v-model="form.brand_primary_color"></el-color-picker>
|
|
<el-input v-model="form.brand_primary_color" style="width:120px;margin-left:12px;" placeholder="#2563eb"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="支持邮箱">
|
|
<el-input v-model="form.brand_support_email" placeholder="support@yourcompany.com"></el-input>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button type="primary" :loading="saving" @click="save">保存并应用</el-button>
|
|
<el-button @click="reset">重置为当前</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<el-divider>实时预览</el-divider>
|
|
<div :style="{ background: 'linear-gradient(135deg,' + (form.brand_primary_color || '#2563eb') + ',' + (form.brand_primary_color || '#2563eb') + 'cc)', color:'#fff', padding:'10px 16px', borderRadius:'8px', display:'flex', alignItems:'center', gap:'8px', maxWidth:'480px' }">
|
|
<img v-if="form.brand_logo" :src="form.brand_logo" style="height:22px;border-radius:4px;" />
|
|
<strong>{{ form.brand_name || '平台名称预览' }}</strong>
|
|
<span style="margin-left:auto;font-size:12px;opacity:.85;">v{{ version }}</span>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
<script src="vue.global.prod.js"></script>
|
|
<script src="icon-components.js"></script>
|
|
<script src="element-plus.full.js"></script>
|
|
<script>
|
|
const BrandingApp = {
|
|
data() {
|
|
return {
|
|
isLoggedIn: false, isAdmin: false, currentUser: { username: '' },
|
|
form: { brand_name: '', brand_logo: '', brand_primary_color: '#2563eb', brand_support_email: '' },
|
|
version: '0.1.0', saving: false,
|
|
}
|
|
},
|
|
methods: {
|
|
getToken() { return localStorage.getItem('authToken'); },
|
|
async load() {
|
|
try {
|
|
const data = await fetch('/api/branding').then(r => r.json());
|
|
this.form = {
|
|
brand_name: data.brand_name || '',
|
|
brand_logo: data.brand_logo || '',
|
|
brand_primary_color: data.brand_primary_color || '#2563eb',
|
|
brand_support_email: data.brand_support_email || '',
|
|
};
|
|
this.version = data.version || '0.1.0';
|
|
} catch (e) { this.$message.error('加载品牌配置失败'); }
|
|
},
|
|
async save() {
|
|
this.saving = true;
|
|
try {
|
|
const token = this.getToken();
|
|
const res = await fetch('/api/branding', {
|
|
method: 'PUT',
|
|
headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(this.form)
|
|
});
|
|
if (!res.ok) throw new Error((await res.json()).detail || '保存失败');
|
|
this.$message.success('已保存,刷新其他页面即可看到新品牌');
|
|
setTimeout(() => this.load(), 300);
|
|
} catch (e) {
|
|
this.$message.error('保存失败:' + e.message);
|
|
} finally { this.saving = false; }
|
|
},
|
|
reset() { this.load(); },
|
|
handleLogout() { localStorage.removeItem('authToken'); localStorage.removeItem('userRole'); localStorage.removeItem('currentUser'); window.location.href = '/login.html'; },
|
|
redirectToPage(page) { window.location.href = page.startsWith('/') ? page : '/' + page; },
|
|
},
|
|
mounted() {
|
|
const token = localStorage.getItem('authToken');
|
|
if (!token) { window.location.href = '/login.html'; return; }
|
|
fetch('/api/auth/me', { headers: { 'Authorization': 'Bearer ' + token } })
|
|
.then(r => r.ok ? r.json() : Promise.reject())
|
|
.then(data => {
|
|
this.currentUser = data.user; this.isAdmin = data.user.role === 'admin';
|
|
if (!this.isAdmin) { this.$message.warning('需要管理员权限'); window.location.href = '/index.html'; return; }
|
|
this.load();
|
|
})
|
|
.catch(() => { window.location.href = '/login.html'; });
|
|
}
|
|
};
|
|
const app = Vue.createApp(BrandingApp);
|
|
app.use(ElementPlus);
|
|
if (window.installIcons) { window.installIcons(app); }
|
|
if (window.installUniNav) { window.installUniNav(app); }
|
|
app.mount('#app');
|
|
</script>
|
|
</body>
|
|
</html>
|