fix: bug
This commit is contained in:
@@ -4,38 +4,90 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{ app_name }} - 登录注册</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260406a" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260410a" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260428h" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260428h" />
|
||||
</head>
|
||||
<body class="simple-page">
|
||||
<main class="simple-wrap">
|
||||
<section class="panel simple-panel">
|
||||
<h2>登录 / 注册</h2>
|
||||
<p class="muted small">登录后将跳转到编辑主页。</p>
|
||||
<body class="simple-page auth-page">
|
||||
<main class="auth-shell">
|
||||
<section class="auth-showcase" aria-label="产品介绍">
|
||||
<div class="brand-lockup auth-brand-lockup">
|
||||
<img class="logo-mark auth-logo" src="/static/favicon.svg?v=20260428h" alt="" />
|
||||
<div>
|
||||
<h1>{{ app_name }}</h1>
|
||||
<p>公众号内容工作台</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid2">
|
||||
<div class="auth-hero-copy">
|
||||
<p class="auth-kicker">AI Content Studio</p>
|
||||
<h2>从原文到草稿,一气呵成</h2>
|
||||
<p>改写、封面、发布,集中完成。</p>
|
||||
</div>
|
||||
|
||||
<div class="auth-preview-card">
|
||||
<div class="auth-preview-body">
|
||||
<div class="auth-preview-cover">
|
||||
<img src="/static/favicon.svg?v=20260428h" alt="" />
|
||||
<div>
|
||||
<strong>今日选题</strong>
|
||||
<p>自动生成公众号封面</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="auth-preview-steps">
|
||||
<span>改写</span>
|
||||
<span>封面</span>
|
||||
<span>发布</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="auth-feature-row">
|
||||
<div>
|
||||
<strong>AI 改写</strong>
|
||||
<span>标题、摘要、正文一次成稿</span>
|
||||
</div>
|
||||
<div>
|
||||
<strong>封面生成</strong>
|
||||
<span>按标题自动生成头图</span>
|
||||
</div>
|
||||
<div>
|
||||
<strong>草稿发布</strong>
|
||||
<span>直达公众号草稿箱</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="auth-panel" aria-label="登录注册">
|
||||
<div class="auth-panel-head">
|
||||
<h2>欢迎回来</h2>
|
||||
<p>登录后继续创作。</p>
|
||||
</div>
|
||||
|
||||
<div class="auth-form">
|
||||
<div>
|
||||
<label>用户名</label>
|
||||
<input id="username" type="text" placeholder="请输入用户名" />
|
||||
<input id="username" type="text" placeholder="请输入用户名" autocomplete="username" />
|
||||
</div>
|
||||
<div>
|
||||
<label>密码</label>
|
||||
<input id="password" type="password" placeholder="请输入密码(至少 6 位)" />
|
||||
<input id="password" type="password" placeholder="请输入密码(至少 6 位)" autocomplete="current-password" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="check-row">
|
||||
<label class="check-label">
|
||||
<input id="rememberMe" type="checkbox" checked />
|
||||
<span>7 天内免登录(限时)</span>
|
||||
</label>
|
||||
<a class="subtle-link" href="/auth/forgot">忘记密码?</a>
|
||||
<div class="check-row">
|
||||
<label class="check-label">
|
||||
<input id="rememberMe" type="checkbox" checked />
|
||||
<span>7 天内免登录</span>
|
||||
</label>
|
||||
<a class="auth-link" href="/auth/forgot">忘记密码?</a>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button id="loginBtn" class="primary" type="button">登录工作台</button>
|
||||
<button id="registerBtn" class="secondary" type="button">注册账号</button>
|
||||
</div>
|
||||
<p id="status" class="status"></p>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button id="loginBtn" class="primary" type="button">登录</button>
|
||||
<button id="registerBtn" class="secondary" type="button">注册</button>
|
||||
</div>
|
||||
<p id="status" class="status"></p>
|
||||
<div class="auth-footnote">首次使用建议先完成公众号与模型配置。</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
|
||||
@@ -4,36 +4,44 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{ app_name }} - 忘记密码</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260406a" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260410a" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260428h" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260428h" />
|
||||
</head>
|
||||
<body class="simple-page">
|
||||
<main class="simple-wrap">
|
||||
<main class="auth-card">
|
||||
<section class="panel simple-panel">
|
||||
<h2>忘记密码</h2>
|
||||
<div class="simple-head">
|
||||
<div class="brand-lockup simple-brand-lockup">
|
||||
<img class="logo-mark" src="/static/favicon.svg?v=20260428h" alt="" />
|
||||
<h1>重置密码</h1>
|
||||
</div>
|
||||
<p class="muted small">使用注册时保存的个人重置码恢复账号访问。</p>
|
||||
</div>
|
||||
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>用户名</label>
|
||||
<input id="username" type="text" placeholder="请输入账号用户名" />
|
||||
<div class="simple-body">
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>用户名</label>
|
||||
<input id="username" type="text" placeholder="请输入账号用户名" />
|
||||
</div>
|
||||
<div>
|
||||
<label>重置码</label>
|
||||
<input id="resetKey" type="password" placeholder="请输入你保存的个人重置码" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label>重置码</label>
|
||||
<input id="resetKey" type="password" placeholder="请输入管理员提供的重置码" />
|
||||
<label>新密码</label>
|
||||
<input id="newPassword" type="password" placeholder="请输入新密码(至少 6 位)" />
|
||||
</div>
|
||||
<p class="muted small">重置码仅在注册时展示一次,请妥善保存。</p>
|
||||
<div class="actions">
|
||||
<button id="resetBtn" class="primary" type="button">重置密码</button>
|
||||
</div>
|
||||
<p id="status" class="status"></p>
|
||||
<div class="actions">
|
||||
<a class="subtle-link" href="/auth?next=/">返回登录页</a>
|
||||
<a class="subtle-link" href="/settings">去设置页</a>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label>新密码</label>
|
||||
<input id="newPassword" type="password" placeholder="请输入新密码(至少 6 位)" />
|
||||
</div>
|
||||
<p class="muted small">请向管理员获取重置码。若未改配置,默认重置码为 x2ws-reset-2026(建议尽快修改)。</p>
|
||||
<div class="actions">
|
||||
<button id="resetBtn" class="primary" type="button">重置密码</button>
|
||||
</div>
|
||||
<p id="status" class="status"></p>
|
||||
<div class="actions">
|
||||
<a class="subtle-link" href="/auth?next=/">返回登录页</a>
|
||||
<a class="subtle-link" href="/settings">去设置页</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
134
app/templates/guide.html
Normal file
134
app/templates/guide.html
Normal file
@@ -0,0 +1,134 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{ app_name }} - 新手引导</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260428h" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260428h" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="product-shell">
|
||||
<aside class="side-nav" aria-label="主导航">
|
||||
<div class="side-brand">
|
||||
<div class="brand-lockup">
|
||||
<img class="logo-mark" src="/static/favicon.svg?v=20260428h" alt="" />
|
||||
<h1>{{ app_name }}</h1>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="nav-group">
|
||||
<div class="nav-label">工作台</div>
|
||||
<a class="nav-item" href="/">内容生产</a>
|
||||
<a class="nav-item" href="/settings">账号与模型</a>
|
||||
<a class="nav-item is-active" href="/guide">新手引导</a>
|
||||
</nav>
|
||||
<div class="side-footer">首次配置 · 三分钟跑通</div>
|
||||
</aside>
|
||||
|
||||
<div class="workspace">
|
||||
<header class="topbar topbar-compact">
|
||||
<div class="topbar-actions">
|
||||
<a class="icon-btn" href="/" aria-label="返回工作台" title="返回工作台">⌂</a>
|
||||
<a class="icon-btn" href="/settings" aria-label="账号与模型设置" title="账号与模型设置">⚙</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="layout guide-layout">
|
||||
<section class="panel guide-panel">
|
||||
<div class="panel-scroll guide-scroll">
|
||||
<section class="guide-hero">
|
||||
<div>
|
||||
<p class="guide-eyebrow">新手引导</p>
|
||||
<h2>从空账号到第一篇公众号草稿</h2>
|
||||
<p class="muted">按下面顺序完成配置、生成、检查和发布。每一步都对应当前项目里的真实页面和按钮。</p>
|
||||
</div>
|
||||
<div class="guide-hero-actions">
|
||||
<a class="subtle-link" href="/settings">先去配置</a>
|
||||
<a class="subtle-link" href="/">开始写作</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="guide-grid">
|
||||
<article class="guide-card">
|
||||
<div class="guide-step">01</div>
|
||||
<h3>准备发布账号</h3>
|
||||
<p>进入账号与模型设置,绑定公众号 AppID 和 Secret。草稿发布、封面上传、段落海报素材都会使用当前选中的发表主体。</p>
|
||||
<a href="/settings" class="guide-link">打开账号设置</a>
|
||||
</article>
|
||||
|
||||
<article class="guide-card">
|
||||
<div class="guide-step">02</div>
|
||||
<h3>配置 AI 模型</h3>
|
||||
<p>保存模型名称、API Key、Base URL、超时秒数和输出 token 上限。未配置模型时将无法进行 AI 改写,请先完成模型配置。</p>
|
||||
<a href="/settings#model-settings" class="guide-link">打开模型配置</a>
|
||||
</article>
|
||||
|
||||
<article class="guide-card">
|
||||
<div class="guide-step">03</div>
|
||||
<h3>输入原文与策略</h3>
|
||||
<p>在内容生产页粘贴原文,补充标题提示、目标读者、语气风格、必须保留观点和避免词汇。目标字数建议先从 500 或 800 开始。</p>
|
||||
<a href="/" class="guide-link">进入写作输入</a>
|
||||
</article>
|
||||
|
||||
<article class="guide-card">
|
||||
<div class="guide-step">04</div>
|
||||
<h3>生成并人工复核</h3>
|
||||
<p>点击“改写并排版”后,检查标题、摘要、正文结构和排版预览。涉及事实、数据、引用和品牌表达时,发布前务必人工确认。</p>
|
||||
<a href="/" class="guide-link">查看发布内容</a>
|
||||
</article>
|
||||
|
||||
<article class="guide-card">
|
||||
<div class="guide-step">05</div>
|
||||
<h3>补齐封面和海报</h3>
|
||||
<p>可按输出标题自动生成 900×383 公众号封面并绑定 thumb_media_id,也可以生成段落海报。勾选自动插入后,发布草稿时会把正文和海报一起编排。</p>
|
||||
<a href="/" class="guide-link">处理内容素材</a>
|
||||
</article>
|
||||
|
||||
<article class="guide-card">
|
||||
<div class="guide-step">06</div>
|
||||
<h3>发布到草稿箱</h3>
|
||||
<p>确认发表主体无误后,点击“发布到公众号草稿箱”。需要团队同步时,再点击“发送到 IM”。草稿发布后仍建议在公众号后台最终预览。</p>
|
||||
<a href="/" class="guide-link">回到发布动作</a>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section class="guide-checklist">
|
||||
<div class="guide-section-head">
|
||||
<h3>发布前检查</h3>
|
||||
<p class="muted small">适合每次出稿前快速扫一遍。</p>
|
||||
</div>
|
||||
<div class="checklist-grid">
|
||||
<label class="check-label"><input type="checkbox" />发表主体是目标公众号</label>
|
||||
<label class="check-label"><input type="checkbox" />标题没有夸大或误导</label>
|
||||
<label class="check-label"><input type="checkbox" />摘要能独立说明文章价值</label>
|
||||
<label class="check-label"><input type="checkbox" />正文事实、数据、引用已核对</label>
|
||||
<label class="check-label"><input type="checkbox" />封面或默认封面策略可接受</label>
|
||||
<label class="check-label"><input type="checkbox" />段落海报插入位置符合预期</label>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="guide-faq">
|
||||
<div class="guide-section-head">
|
||||
<h3>常见问题</h3>
|
||||
<p class="muted small">这些是新账号最常遇到的卡点。</p>
|
||||
</div>
|
||||
<details>
|
||||
<summary>提示未绑定公众号怎么办?</summary>
|
||||
<p>进入账号与模型设置,新增公众号并设为当前账号。绑定后回到内容生产页,顶部发表主体会显示当前账号。</p>
|
||||
</details>
|
||||
<details>
|
||||
<summary>模型不可用或生成失败怎么办?</summary>
|
||||
<p>检查 API Key、Base URL、模型名、超时秒数和输出 token 上限。第三方兼容接口通常需要填写完整 Base URL。</p>
|
||||
</details>
|
||||
<details>
|
||||
<summary>发布成功后在哪里继续编辑?</summary>
|
||||
<p>内容会进入公众号草稿箱。最终标题、封面、排版和群发前预览,建议在公众号后台完成最后确认。</p>
|
||||
</details>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -4,42 +4,59 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{ app_name }}</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260406a" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260421a" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260428h" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260428h" />
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar">
|
||||
<div class="brand">
|
||||
<h1>{{ app_name }}</h1>
|
||||
<p class="muted">从原文到公众号草稿,一页完成编辑、封面和发布。</p>
|
||||
</div>
|
||||
<div class="topbar-actions">
|
||||
<div class="wechat-account-switch" title="草稿发布、封面上传均使用此处选中的公众号">
|
||||
<label for="wechatAccountSelect" class="wechat-account-label">发表主体</label>
|
||||
<select id="wechatAccountSelect" class="topbar-select" aria-label="切换公众号"></select>
|
||||
<span id="wechatAccountStatus" class="muted small wechat-account-status" aria-live="polite"></span>
|
||||
<div class="product-shell">
|
||||
<aside class="side-nav" aria-label="主导航">
|
||||
<div class="side-brand">
|
||||
<div class="brand-lockup">
|
||||
<img class="logo-mark" src="/static/favicon.svg?v=20260428h" alt="" />
|
||||
<h1>{{ app_name }}</h1>
|
||||
</div>
|
||||
</div>
|
||||
<a class="subtle-link" href="/settings">公众号设置</a>
|
||||
<button id="logoutBtn" class="subtle-btn topbar-btn" type="button">退出登录</button>
|
||||
</div>
|
||||
</header>
|
||||
<nav class="nav-group">
|
||||
<div class="nav-label">工作台</div>
|
||||
<a class="nav-item is-active" href="/">内容生产</a>
|
||||
<a class="nav-item" href="/settings">账号与模型</a>
|
||||
<a class="nav-item" href="/guide">新手引导</a>
|
||||
</nav>
|
||||
<div class="side-footer">生产环境 · 内容工作流</div>
|
||||
</aside>
|
||||
|
||||
<div class="workspace">
|
||||
<header class="topbar topbar-compact">
|
||||
<div class="topbar-actions">
|
||||
<div class="wechat-account-switch" title="发布将使用当前账号">
|
||||
<label for="wechatAccountSelect" class="wechat-account-label">发表主体</label>
|
||||
<select id="wechatAccountSelect" class="topbar-select" aria-label="切换公众号"></select>
|
||||
<span id="wechatAccountStatus" class="muted small wechat-account-status" aria-live="polite"></span>
|
||||
</div>
|
||||
<a class="icon-btn" href="/guide" aria-label="新手引导" title="新手引导">?</a>
|
||||
<a class="icon-btn" href="/settings" aria-label="设置" title="设置">⚙</a>
|
||||
<button id="logoutBtn" class="icon-btn topbar-btn" type="button" aria-label="退出登录" title="退出登录">⎋</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="layout">
|
||||
<section class="panel input-panel">
|
||||
<div class="panel-head">
|
||||
<h2>内容输入</h2>
|
||||
<h2>写作输入</h2>
|
||||
</div>
|
||||
|
||||
<div class="panel-scroll">
|
||||
<section class="form-section">
|
||||
<div class="field-head">
|
||||
<label>内容</label>
|
||||
<span id="sourceCount" class="meta">0 字</span>
|
||||
</div>
|
||||
<textarea id="sourceText" rows="9" placeholder="粘贴原文(长帖、线程、摘录均可),洗稿会围绕原文主题展开…"></textarea>
|
||||
<textarea id="sourceText" rows="5" placeholder="粘贴原文内容"></textarea>
|
||||
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>标题提示</label>
|
||||
<input id="titleHint" type="text" placeholder="如:AI Agent 商业化路径" />
|
||||
<input id="titleHint" type="text" placeholder="可选:标题方向" />
|
||||
</div>
|
||||
<div class="multi-field">
|
||||
<div class="field-head">
|
||||
@@ -59,10 +76,12 @@
|
||||
<label class="multi-dropdown-option"><input type="checkbox" name="audienceChip" value="普通读者" />普通读者</label>
|
||||
</div>
|
||||
</details>
|
||||
<input id="audienceExtra" type="text" class="multi-extra" placeholder="其他补充(可选)" />
|
||||
<input id="audienceExtra" type="text" class="multi-extra" placeholder="可选补充" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="form-section">
|
||||
<div class="grid2">
|
||||
<div class="multi-field">
|
||||
<div class="field-head">
|
||||
@@ -83,23 +102,23 @@
|
||||
<label class="multi-dropdown-option"><input type="checkbox" name="toneChip" value="理性克制" />理性克制</label>
|
||||
</div>
|
||||
</details>
|
||||
<input id="toneExtra" type="text" class="multi-extra" placeholder="其他补充(可选)" />
|
||||
<input id="toneExtra" type="text" class="multi-extra" placeholder="可选补充" />
|
||||
</div>
|
||||
<div>
|
||||
<label>避免词汇</label>
|
||||
<input id="avoidWords" type="text" placeholder="如:颠覆、闭环、赋能" />
|
||||
<input id="avoidWords" type="text" placeholder="可选:避免词汇" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>必须保留观点</label>
|
||||
<input id="keepPoints" type="text" placeholder="逗号分隔" />
|
||||
<input id="keepPoints" type="text" placeholder="可选:保留观点(逗号分隔)" />
|
||||
</div>
|
||||
<div class="target-chars-block">
|
||||
<label>改写目标字数</label>
|
||||
<div class="target-chars-inline">
|
||||
<input id="targetBodyChars" type="number" min="180" max="2200" step="10" value="500" placeholder="如:500" />
|
||||
<input id="targetBodyChars" type="number" min="180" max="2200" step="10" value="500" placeholder="目标字数" />
|
||||
<div class="target-chars-quick" aria-label="快捷字数">
|
||||
<button type="button" class="target-char-chip" data-target-chars="300">300</button>
|
||||
<button type="button" class="target-char-chip is-active" data-target-chars="500">500</button>
|
||||
@@ -109,9 +128,13 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="form-section">
|
||||
<button id="rewriteBtn" class="primary">改写并排版</button>
|
||||
<p id="status" class="status"></p>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="panel output-panel">
|
||||
@@ -119,6 +142,8 @@
|
||||
<h2>发布内容</h2>
|
||||
</div>
|
||||
|
||||
<div class="panel-scroll">
|
||||
<section class="form-section">
|
||||
<label>标题</label>
|
||||
<input id="title" type="text" />
|
||||
|
||||
@@ -127,38 +152,93 @@
|
||||
<span id="summaryCount" class="meta">0 字</span>
|
||||
</div>
|
||||
<textarea id="summary" rows="2"></textarea>
|
||||
</section>
|
||||
|
||||
<label>公众号封面(可选上传)</label>
|
||||
<div class="cover-tools">
|
||||
<input id="coverFile" type="file" accept="image/png,image/jpeg,image/jpg,image/webp" />
|
||||
<button id="coverUploadBtn" class="subtle-btn" type="button">上传封面并绑定</button>
|
||||
</div>
|
||||
<input id="thumbMediaId" type="text" placeholder="thumb_media_id(上传后自动填充,也可手动粘贴)" />
|
||||
<p id="coverHint" class="muted small">未上传时将使用后端默认封面策略。</p>
|
||||
|
||||
<section class="form-section">
|
||||
<div class="field-head">
|
||||
<label>正文(4~6 自然段,字数由左侧配置)</label>
|
||||
<label>公众号封面</label>
|
||||
<span class="meta">900×383 横版头图</span>
|
||||
</div>
|
||||
<div class="cover-mode-switch" role="tablist" aria-label="封面模式切换">
|
||||
<button id="coverModeManualBtn" class="cover-mode-btn is-active" type="button">手动上传封面</button>
|
||||
<button id="coverModeAiBtn" class="cover-mode-btn" type="button">AI 自动生成封面</button>
|
||||
</div>
|
||||
<div id="coverAiSection" class="cover-ai-box" hidden>
|
||||
<div class="cover-ai-copy">
|
||||
<strong>AI 自动生成封面</strong>
|
||||
<span>按标题生成并自动上传绑定。</span>
|
||||
</div>
|
||||
<div class="cover-tools">
|
||||
<input id="coverStyleHint" type="text" placeholder="可选:封面风格" />
|
||||
<button id="coverGenerateBtn" class="primary" type="button">按标题生成封面</button>
|
||||
</div>
|
||||
<label class="check-label cover-auto-check"
|
||||
><input id="coverAutoAfterRewrite" type="checkbox" />改写后自动按输出标题生成封面</label
|
||||
>
|
||||
<div id="coverPreviewWrap" class="cover-preview-wrap" hidden>
|
||||
<img id="coverPreview" class="cover-preview" alt="公众号封面预览" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="coverManualSection">
|
||||
<label>手动上传封面</label>
|
||||
<div class="cover-tools">
|
||||
<input id="coverFile" type="file" accept="image/png,image/jpeg,image/jpg,image/webp" />
|
||||
<button id="coverUploadBtn" class="subtle-btn" type="button">上传封面并绑定</button>
|
||||
</div>
|
||||
<div class="cover-tools">
|
||||
<input id="coverUrl" type="url" placeholder="图片 URL(http/https)" />
|
||||
<button id="coverUrlUploadBtn" class="subtle-btn" type="button">URL 上传并绑定</button>
|
||||
</div>
|
||||
</div>
|
||||
<input id="thumbMediaId" type="text" placeholder="thumb_media_id(可选)" />
|
||||
<p id="coverHint" class="muted small">当前为手动上传模式。</p>
|
||||
</section>
|
||||
|
||||
<section class="form-section">
|
||||
<div class="field-head">
|
||||
<label>正文</label>
|
||||
<span id="bodyCount" class="meta">0 字</span>
|
||||
</div>
|
||||
<div class="body-split">
|
||||
<textarea id="body" rows="7" placeholder="五段之间空一行;无需 # 标题"></textarea>
|
||||
<textarea id="body" rows="6" placeholder="可直接编辑正文"></textarea>
|
||||
<div class="preview-panel">
|
||||
<div class="field-head">
|
||||
<label>排版预览</label>
|
||||
<span class="meta">实时同步</span>
|
||||
<span class="meta">实时</span>
|
||||
</div>
|
||||
<div id="bodyPreview" class="markdown-preview"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="actions">
|
||||
<section class="form-section">
|
||||
<div class="poster-tools">
|
||||
<div class="field-head">
|
||||
<label>段落海报(首段不生成)</label>
|
||||
<span class="meta">自动上传</span>
|
||||
</div>
|
||||
<div class="poster-actions-row">
|
||||
<button id="posterGenerateBtn" class="subtle-btn" type="button">生成段落海报</button>
|
||||
<label class="check-label poster-auto-check"
|
||||
><input id="posterAutoInclude" type="checkbox" checked />发布时自动插入海报</label
|
||||
>
|
||||
</div>
|
||||
<p id="posterHint" class="muted small">改写后可生成段落海报。</p>
|
||||
<div id="posterPreviewList" class="poster-preview-list"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="actions publish-actions">
|
||||
<button id="wechatBtn" class="primary">发布到公众号草稿箱</button>
|
||||
<button id="imBtn" class="secondary">发送到 IM</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
<script src="/static/app.js?v=20260421a"></script>
|
||||
<script src="/static/app.js?v=20260428h"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,65 +3,151 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{ app_name }} - 公众号设置</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260406a" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260410a" />
|
||||
<title>{{ app_name }} - 账号与模型设置</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg?v=20260428h" />
|
||||
<link rel="stylesheet" href="/static/style.css?v=20260428h" />
|
||||
</head>
|
||||
<body class="simple-page">
|
||||
<main class="simple-wrap">
|
||||
<section class="panel simple-panel">
|
||||
<div class="panel-head">
|
||||
<h2>公众号设置</h2>
|
||||
<p class="muted small">支持绑定多个公众号并切换当前发布账号。</p>
|
||||
<body>
|
||||
<div class="product-shell">
|
||||
<aside class="side-nav" aria-label="主导航">
|
||||
<div class="side-brand">
|
||||
<div class="brand-lockup">
|
||||
<img class="logo-mark" src="/static/favicon.svg?v=20260428h" alt="" />
|
||||
<h1>{{ app_name }}</h1>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="nav-group">
|
||||
<div class="nav-label">工作台</div>
|
||||
<a class="nav-item" href="/">内容生产</a>
|
||||
<a class="nav-item is-active" href="/settings">账号与模型</a>
|
||||
<a class="nav-item" href="/guide">新手引导</a>
|
||||
</nav>
|
||||
<div class="side-footer">生产环境 · 内容工作流</div>
|
||||
</aside>
|
||||
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>当前账号</label>
|
||||
<select id="accountSelect"></select>
|
||||
<div class="workspace">
|
||||
<header class="topbar topbar-compact">
|
||||
<div class="topbar-actions">
|
||||
<a class="icon-btn" href="/" aria-label="返回工作台" title="返回工作台">⌂</a>
|
||||
<a class="icon-btn" href="/guide" aria-label="新手引导" title="新手引导">?</a>
|
||||
<button id="logoutBtn" class="icon-btn topbar-btn" type="button" aria-label="退出登录" title="退出登录">⎋</button>
|
||||
</div>
|
||||
<div class="actions-inline">
|
||||
<a class="subtle-link" href="/">返回主页</a>
|
||||
<button id="logoutBtn" class="subtle-btn topbar-btn" type="button">退出登录</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<h3 class="section-title">新增公众号</h3>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>账号名</label>
|
||||
<input id="accountName" type="text" placeholder="如:公司主号 / 客户A号" />
|
||||
</div>
|
||||
<div>
|
||||
<label>AppID</label>
|
||||
<input id="appid" type="text" placeholder="请输入公众号 AppID" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label>Secret</label>
|
||||
<input id="secret" type="password" placeholder="请输入公众号 Secret" />
|
||||
</div>
|
||||
<button id="bindBtn" class="primary" type="button">绑定并设为当前账号</button>
|
||||
<main class="layout settings-layout">
|
||||
<section class="panel settings-panel">
|
||||
<div class="panel-scroll settings-panel-scroll">
|
||||
<div class="settings-content">
|
||||
<section class="settings-section settings-card">
|
||||
<div>
|
||||
<label>当前账号</label>
|
||||
<select id="accountSelect"></select>
|
||||
</div>
|
||||
|
||||
<h3 class="section-title">账号安全</h3>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>当前密码</label>
|
||||
<input id="oldPassword" type="password" placeholder="请输入当前密码" />
|
||||
</div>
|
||||
<div>
|
||||
<label>新密码</label>
|
||||
<input id="newPassword" type="password" placeholder="请输入新密码(至少 6 位)" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="actions-inline">
|
||||
<a class="subtle-link" href="/auth/forgot">忘记密码提示</a>
|
||||
<button id="changePwdBtn" class="secondary topbar-btn" type="button">修改密码</button>
|
||||
</div>
|
||||
<p id="status" class="status"></p>
|
||||
</section>
|
||||
</main>
|
||||
<h3 class="section-title">新增公众号</h3>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>账号名</label>
|
||||
<input id="accountName" type="text" placeholder="如:公司主号 / 客户A号" />
|
||||
</div>
|
||||
<div>
|
||||
<label>AppID</label>
|
||||
<input id="appid" type="text" placeholder="请输入公众号 AppID" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label>Secret</label>
|
||||
<input id="secret" type="password" placeholder="请输入公众号 Secret" />
|
||||
</div>
|
||||
<div class="actions">
|
||||
<button id="bindBtn" class="primary" type="button">绑定并设为当前账号</button>
|
||||
<button id="deleteWechatBtn" class="secondary" type="button">删除当前公众号</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script src="/static/settings.js?v=20260410a"></script>
|
||||
<section id="model-settings" class="settings-section settings-card">
|
||||
<h3 class="section-title">AI 模型配置</h3>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>当前模型</label>
|
||||
<select id="modelSelect"></select>
|
||||
</div>
|
||||
<div class="actions-inline">
|
||||
<button id="deleteModelBtn" class="secondary topbar-btn" type="button">删除当前模型</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>配置名称</label>
|
||||
<input id="modelName" type="text" placeholder="如:OpenAI 生产 / 阿里云通义" />
|
||||
</div>
|
||||
<div>
|
||||
<label>模型名</label>
|
||||
<input id="modelValue" type="text" placeholder="如:gpt-4.1-mini / qwen-max" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>Base URL(可选)</label>
|
||||
<input id="baseUrl" type="text" placeholder="如:https://dashscope.aliyuncs.com/compatible-mode/v1" />
|
||||
</div>
|
||||
<div>
|
||||
<label>API Key</label>
|
||||
<input id="apiKey" type="password" placeholder="请输入该模型的 API Key" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>超时秒数</label>
|
||||
<input id="timeoutSec" type="number" min="10" max="600" step="1" value="120" />
|
||||
</div>
|
||||
<div>
|
||||
<label>输出 token 上限</label>
|
||||
<input id="maxOutputTokens" type="number" min="256" max="65536" step="1" value="8192" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label>自动重试次数</label>
|
||||
<input id="maxRetries" type="number" min="0" max="5" step="1" value="0" />
|
||||
</div>
|
||||
<button id="saveModelBtn" class="primary" type="button">保存并设为当前模型</button>
|
||||
</section>
|
||||
|
||||
<section id="security-settings" class="settings-section settings-card">
|
||||
<h3 class="section-title">账号安全</h3>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>当前密码</label>
|
||||
<input id="oldPassword" type="password" placeholder="请输入当前密码" />
|
||||
</div>
|
||||
<div>
|
||||
<label>新密码</label>
|
||||
<input id="newPassword" type="password" placeholder="请输入新密码(至少 6 位)" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="actions-inline">
|
||||
<a class="subtle-link" href="/auth/forgot">忘记密码提示</a>
|
||||
<button id="changePwdBtn" class="secondary topbar-btn" type="button">修改密码</button>
|
||||
</div>
|
||||
<div class="grid2">
|
||||
<div>
|
||||
<label>注销校验密码</label>
|
||||
<input id="deletePassword" type="password" placeholder="请输入当前登录密码" />
|
||||
</div>
|
||||
<div>
|
||||
<label>注销校验重置码</label>
|
||||
<input id="deleteResetKey" type="password" placeholder="请输入你的重置码" />
|
||||
</div>
|
||||
</div>
|
||||
<button id="deleteAccountBtn" class="danger" type="button">注销账户</button>
|
||||
<p id="status" class="status"></p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/settings.js?v=20260428a"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user