Files
life-echo/api/app/features/content/router.py
Kevin 309a051038 feat: 回忆录证据血缘与内部评测可追溯,顺带对齐本地评测台与 CI
数据库与模型:新增多版迁移(章节证据快照、对话血缘、记忆事实/时间线 lineage 等),把「成稿 ↔ 对话/记忆」的溯源信息落到表结构里。
业务链路:会话与 WS、回忆录/故事流水线、记忆写入与 enrichment 等跟着接上线索与快照;新增章节证据快照与评测侧 EvalTraceService 等模块,方便组评审用的证据包。
内部评测:自动化 run 与手工 memoir 评审共用可追溯证据;rubric/ judge 相关脚本与文档有配套调整。
app-eval-web:Memoir/实验详情里能展开看证据摘要与 evidence_trace(含对话轮次 id);Vite 代理与 development.sh 注入的 API 端口与当前默认内部评测端口一致,避免改端口后页面连错服务。
工程杂项:GitHub Actions / 仓库说明有更新;各适配器与支付/配额/plan 等多处为小改动或跟随主改动的收尾;新增/扩充了?
2026-04-08 15:37:09 +08:00

437 lines
22 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
静态内容路由FAQ、法律文档、官网主页。
"""
from pathlib import Path
from typing import List
from fastapi import APIRouter
from fastapi.responses import HTMLResponse
from app.features.content.schemas import FAQResponse
router = APIRouter(tags=["content"], responses={404: {"description": "资源不存在"}})
_STATIC_DIR = Path(__file__).resolve().parent.parent.parent.parent / "static"
# ── FAQ data ─────────────────────────────────────────────────
FAQS = [
FAQResponse(
id="1",
question="如何使用回忆录功能?",
answer="创建对话后与AI助手交流分享您的人生故事。AI会自动整理并生成回忆录章节。您可以在'我的回忆录'页面查看所有章节,并选择对话进行整理。",
category="使用指南",
order=1,
),
FAQResponse(
id="2",
question="免费版和高级版有什么区别?",
answer="免费版限制3次对话和10个章节高级版提供无限对话和章节以及优先处理服务。高级版用户还可以享受更快的处理速度和专属客服支持。",
category="订阅计划",
order=2,
),
FAQResponse(
id="3",
question="如何导出回忆录?",
answer="'我的回忆录'页面,您可以查看所有章节。导出功能正在开发中,敬请期待!",
category="使用指南",
order=3,
),
FAQResponse(
id="4",
question="数据安全吗?",
answer="我们采用加密存储,严格保护用户隐私,您的数据仅用于生成回忆录,不会用于其他用途。所有数据都经过加密处理,确保您的隐私安全。",
category="隐私安全",
order=4,
),
FAQResponse(
id="5",
question="如何升级到高级版?",
answer="'我的'页面点击'订阅计划',选择高级版并完成支付即可升级。升级后立即生效,享受所有高级功能。",
category="订阅计划",
order=5,
),
FAQResponse(
id="6",
question="可以修改已生成的章节吗?",
answer="可以,在章节详情页面可以编辑内容,修改后会自动保存。您也可以重新整理对话来更新章节内容。",
category="使用指南",
order=6,
),
FAQResponse(
id="7",
question="如何整理对话内容成章节?",
answer="'我的回忆录'页面,点击'整理对话'按钮选择要整理的对话AI会自动将对话内容整理成一个个小章节。每个章节展开后可以看到详细内容。",
category="使用指南",
order=7,
),
FAQResponse(
id="8",
question="章节是如何生成的?",
answer="AI会根据对话内容自动识别主题将相关内容整理成章节。每个章节都有标题和详细内容您可以随时查看和编辑。",
category="使用指南",
order=8,
),
FAQResponse(
id="9",
question="可以删除对话或章节吗?",
answer="可以,在对话列表或章节列表中,您可以长按或点击删除按钮来删除不需要的内容。删除后无法恢复,请谨慎操作。",
category="使用指南",
order=9,
),
FAQResponse(
id="10",
question="如何联系客服?",
answer="您可以在'我的'页面点击'反馈与客服',填写反馈表单或联系客服。我们会尽快回复您的问题。",
category="帮助支持",
order=10,
),
FAQResponse(
id="11",
question="回忆录支持哪些格式?",
answer="目前支持文本格式的回忆录。PDF导出功能正在开发中敬请期待",
category="使用指南",
order=11,
),
FAQResponse(
id="12",
question="如何备份我的数据?",
answer="您的数据会自动保存在云端,无需手动备份。导出功能正在开发中,完成后您可以导出数据到本地。",
category="数据管理",
order=12,
),
FAQResponse(
id="13",
question="语音功能什么时候上线?",
answer="语音模块正在开发中,包括语音输入和语音播放功能。敬请期待!",
category="功能预告",
order=13,
),
FAQResponse(
id="14",
question="可以多人协作编辑回忆录吗?",
answer="目前不支持多人协作,每个账号只能编辑自己的回忆录。多人协作功能正在规划中。",
category="功能预告",
order=14,
),
FAQResponse(
id="15",
question="如何提高回忆录的质量?",
answer="建议您详细描述每个话题提供更多细节和感受。AI会根据您提供的信息生成更丰富、更生动的回忆录内容。",
category="使用技巧",
order=15,
),
]
# ── Routes ───────────────────────────────────────────────────
@router.get("/api/faqs", response_model=List[FAQResponse])
async def get_faqs():
"""获取常见问题列表"""
return FAQS
@router.get("/api/legal/terms", response_class=HTMLResponse)
async def get_terms():
"""用户协议页面"""
html_content = """
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户协议 - 岁月时书</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
line-height: 1.8;
color: #333;
background: #faf7f8;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
background: #fff;
padding: 40px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
h1 {
color: #200028;
font-size: 28px;
margin-bottom: 10px;
text-align: center;
}
.subtitle {
text-align: center;
color: #8C8EA3;
margin-bottom: 30px;
font-size: 14px;
}
h2 {
color: #A177A6;
font-size: 20px;
margin-top: 30px;
margin-bottom: 15px;
border-bottom: 2px solid #CEB0DA;
padding-bottom: 8px;
}
p {
margin-bottom: 15px;
text-align: justify;
}
.company-info {
background: #FAF7F8;
padding: 15px;
border-radius: 6px;
margin-bottom: 20px;
border-left: 4px solid #A177A6;
}
.update-date {
text-align: right;
color: #8C8EA3;
font-size: 14px;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<h1>用户协议</h1>
<div class="subtitle">岁月时书用户服务协议</div>
<div class="company-info">
<strong>服务提供方:</strong>上海华嘎科技有限公司<br>
<strong>产品名称:</strong>岁月时书<br>
<strong>生效日期:</strong>2026年1月27日
</div>
<h2>一、协议的接受</h2>
<p>欢迎使用岁月时书(以下简称"本服务")。本协议是您与上海华嘎科技有限公司(以下简称"我们""公司")之间关于使用本服务的法律协议。</p>
<p>请您仔细阅读本协议的全部内容,特别是涉及免除或限制责任的条款、法律适用和争议解决条款。当您点击"同意"按钮或实际使用本服务时,即表示您已充分阅读、理解并同意接受本协议的全部内容。</p>
<h2>二、服务说明</h2>
<p>1. 岁月时书是一款帮助用户记录和整理人生回忆的智能应用服务。</p>
<p>2. 我们有权根据业务发展需要调整、变更或终止部分或全部服务内容。</p>
<p>3. 我们保留随时修改或中断服务而不需通知用户的权利。</p>
<h2>三、用户账户</h2>
<p>1. 您需要注册账户才能使用本服务的部分功能。注册时,您应当提供真实、准确、完整的个人信息。</p>
<p>2. 您有责任维护账户信息的安全性和准确性,并对账户下的所有活动负责。</p>
<p>3. 如发现账户被盗用或存在安全漏洞,请立即通知我们。</p>
<h2>四、用户行为规范</h2>
<p>1. 您在使用本服务时,应当遵守国家法律法规,不得利用本服务从事违法违规活动。</p>
<p>2. 您不得上传、发布、传播含有以下内容的信息:</p>
<p style="padding-left: 20px;">
1违反国家法律法规、危害国家安全、破坏社会稳定的内容<br>
2侵犯他人知识产权、隐私权、名誉权等合法权益的内容<br>
3色情、暴力、赌博、诈骗等不良信息<br>
4其他违反公序良俗的内容。
</p>
<p>3. 您应当尊重他人的合法权益,不得恶意干扰、破坏本服务的正常运行。</p>
<h2>五、知识产权</h2>
<p>1. 本服务的所有知识产权,包括但不限于商标、专利、著作权等,均归我们所有。</p>
<p>2. 您在使用本服务过程中产生的内容(包括但不限于文字、图片、音频等),其知识产权归您所有,但您授予我们在提供服务所必需的范围内使用这些内容的权利。</p>
<p>3. 未经我们书面许可,您不得以任何形式复制、传播、展示、镜像、上传、下载本服务的任何内容。</p>
<h2>六、隐私保护</h2>
<p>我们非常重视您的隐私保护。关于我们如何收集、使用、存储和保护您的个人信息,请详细阅读我们的《隐私政策》。</p>
<h2>七、免责声明</h2>
<p>1. 本服务基于现有技术和条件提供,我们不对服务的及时性、准确性、完整性、可靠性作任何明示或暗示的保证。</p>
<p>2. 因不可抗力、计算机病毒、黑客攻击、系统不稳定、用户设备故障等原因导致的服务中断或数据丢失,我们不承担责任。</p>
<p>3. 您因使用本服务而产生的任何直接或间接损失,我们均不承担责任。</p>
<h2>八、服务变更与终止</h2>
<p>1. 我们有权根据业务发展需要,随时变更、中断或终止部分或全部服务。</p>
<p>2. 如您违反本协议,我们有权立即终止向您提供服务,并保留追究法律责任的权利。</p>
<p>3. 服务终止后,您账户内的数据可能被删除,请您提前备份重要数据。</p>
<h2>九、协议修改</h2>
<p>我们有权随时修改本协议。协议修改后,我们会在相关页面公布修改后的协议内容。如您不同意修改后的协议,请停止使用本服务;如您继续使用,则视为接受修改后的协议。</p>
<h2>十、法律适用与争议解决</h2>
<p>1. 本协议的订立、生效、解释、履行和争议解决均适用中华人民共和国大陆地区法律法规。</p>
<p>2. 如因本协议产生任何争议,双方应友好协商解决;协商不成的,任何一方均可向我们住所地有管辖权的人民法院提起诉讼。</p>
<h2>十一、其他</h2>
<p>1. 如本协议的任何条款被认定为无效或不可执行,不影响其他条款的效力。</p>
<p>2. 本协议的标题仅为方便阅读而设,不影响本协议任何条款的含义或解释。</p>
<p>3. 如您对本协议有任何疑问,可通过我们提供的联系方式与我们联系。</p>
<div class="update-date">
最后更新时间2026年1月27日
</div>
</div>
</body>
</html>
"""
return HTMLResponse(content=html_content)
@router.get("/api/legal/privacy", response_class=HTMLResponse)
async def get_privacy():
"""隐私政策页面"""
html_content = """
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>隐私政策 - 岁月时书</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
line-height: 1.8;
color: #333;
background: #faf7f8;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
background: #fff;
padding: 40px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
h1 {
color: #200028;
font-size: 28px;
margin-bottom: 10px;
text-align: center;
}
.subtitle {
text-align: center;
color: #8C8EA3;
margin-bottom: 30px;
font-size: 14px;
}
h2 {
color: #A177A6;
font-size: 20px;
margin-top: 30px;
margin-bottom: 15px;
border-bottom: 2px solid #CEB0DA;
padding-bottom: 8px;
}
p {
margin-bottom: 15px;
text-align: justify;
}
.company-info {
background: #FAF7F8;
padding: 15px;
border-radius: 6px;
margin-bottom: 20px;
border-left: 4px solid #A177A6;
}
.update-date {
text-align: right;
color: #8C8EA3;
font-size: 14px;
margin-top: 30px;
}
</style>
</head>
<body>
<div class="container">
<h1>隐私政策</h1>
<div class="subtitle">岁月时书隐私保护政策</div>
<div class="company-info">
<strong>服务提供方:</strong>上海华嘎科技有限公司<br>
<strong>产品名称:</strong>岁月时书<br>
<strong>生效日期:</strong>2026年1月27日
</div>
<p>上海华嘎科技有限公司(以下简称"我们")非常重视用户的隐私保护。本隐私政策说明了我们如何收集、使用、存储和保护您的个人信息。请您仔细阅读本隐私政策,以了解我们对您个人信息的处理方式。</p>
<h2>一、信息收集</h2>
<p>为了向您提供更好的服务,我们可能会收集以下信息:</p>
<p><strong>1. 账户信息:</strong>当您注册账户时,我们会收集您的手机号码、密码、昵称、邮箱(可选)等信息。</p>
<p><strong>2. 设备信息:</strong>我们可能会收集您的设备型号、操作系统版本、设备标识符、IP地址等信息用于提供更好的服务体验和保障账户安全。</p>
<p><strong>3. 使用信息:</strong>我们会收集您使用本服务时产生的信息,包括但不限于对话记录、语音内容、文字内容、操作日志等。</p>
<p><strong>4. 位置信息:</strong>在您授权的情况下,我们可能会收集您的位置信息,用于提供基于位置的服务。</p>
<h2>二、信息使用</h2>
<p>我们收集您的个人信息主要用于以下目的:</p>
<p>1. <strong>提供服务:</strong>使用您的信息来提供、维护、改进我们的服务,包括处理您的对话请求、生成回忆录内容等。</p>
<p>2. <strong>账户管理:</strong>用于账户注册、登录验证、密码重置、账户安全保护等。</p>
<p>3. <strong>客户服务:</strong>用于响应您的咨询、处理您的反馈、解决技术问题等。</p>
<p>4. <strong>安全保护:</strong>用于检测、预防、处理欺诈、滥用、安全风险和技术问题。</p>
<p>5. <strong>法律合规:</strong>遵守适用的法律法规、法律程序或政府要求。</p>
<p>6. <strong>服务改进:</strong>分析用户使用情况,改进我们的产品和服务质量。</p>
<h2>三、信息存储</h2>
<p>1. <strong>存储地点:</strong>您的个人信息将存储在中华人民共和国境内。如需跨境传输,我们将严格按照相关法律法规执行。</p>
<p>2. <strong>存储期限:</strong>我们仅在为实现本政策所述目的所必需的期间内保留您的个人信息。在您注销账户后,我们将删除或匿名化处理您的个人信息,法律法规另有规定的除外。</p>
<p>3. <strong>安全措施:</strong>我们采用行业标准的安全技术和措施来保护您的个人信息,包括但不限于数据加密、访问控制、安全审计等。</p>
<h2>四、信息共享与披露</h2>
<p>我们承诺不会向第三方出售、出租或以其他方式披露您的个人信息,但以下情况除外:</p>
<p>1. <strong>获得您的同意:</strong>在获得您明确同意的情况下,我们可能会与第三方共享您的信息。</p>
<p>2. <strong>服务提供商:</strong>我们可能会与为我们提供服务的第三方(如云服务提供商、数据分析服务商等)共享必要的信息,但这些第三方必须遵守严格的保密义务。</p>
<p>3. <strong>法律要求:</strong>根据法律法规、法律程序、诉讼或政府主管部门的要求,我们可能需要披露您的个人信息。</p>
<p>4. <strong>紧急情况:</strong>为保护我们、用户或公众的权利、财产或安全,我们可能会在必要时披露相关信息。</p>
<h2>五、您的权利</h2>
<p>根据相关法律法规,您对自己的个人信息享有以下权利:</p>
<p>1. <strong>访问权:</strong>您有权访问我们持有的您的个人信息。</p>
<p>2. <strong>更正权:</strong>您有权要求更正不准确或不完整的个人信息。</p>
<p>3. <strong>删除权:</strong>在特定情况下,您有权要求删除您的个人信息。</p>
<p>4. <strong>撤回同意:</strong>您有权撤回之前给予我们的同意,但这可能影响您使用部分服务功能。</p>
<p>5. <strong>注销账户:</strong>您有权注销您的账户。账户注销后,我们将删除或匿名化处理您的个人信息。</p>
<p>如您需要行使上述权利,请通过我们提供的联系方式与我们联系。</p>
<h2>六、未成年人保护</h2>
<p>我们非常重视对未成年人个人信息的保护。如果您是18周岁以下的未成年人请在您的监护人同意和指导下使用本服务。如果我们发现自己在未事先获得可证实的监护人同意的情况下收集了未成年人的个人信息我们会设法尽快删除相关数据。</p>
<h2>七、Cookie和类似技术</h2>
<p>我们可能会使用Cookie和类似技术来收集信息、改善用户体验、分析服务使用情况等。您可以通过浏览器设置管理Cookie但请注意禁用Cookie可能会影响部分服务功能的使用。</p>
<h2>八、第三方服务</h2>
<p>我们的服务可能包含指向第三方网站、产品和服务的链接。我们不对这些第三方的隐私做法负责,建议您仔细阅读这些第三方的隐私政策。</p>
<h2>九、隐私政策的更新</h2>
<p>我们可能会不时更新本隐私政策。更新后,我们会在相关页面公布最新版本的隐私政策,并通过适当方式通知您。如您不同意更新后的隐私政策,请停止使用本服务;如您继续使用,则视为接受更新后的隐私政策。</p>
<h2>十、联系我们</h2>
<p>如您对本隐私政策有任何疑问、意见或建议,或需要行使您的相关权利,请通过以下方式与我们联系:</p>
<p><strong>公司名称:</strong>上海华嘎科技有限公司<br>
<strong>产品名称:</strong>岁月时书</p>
<p>我们将在收到您的请求后,尽快予以回复。</p>
<div class="update-date">
最后更新时间2026年1月27日
</div>
</div>
</body>
</html>
"""
return HTMLResponse(content=html_content)
@router.get("/", response_class=HTMLResponse)
async def get_home():
"""应用官网主页"""
html_path = _STATIC_DIR / "home.html"
return HTMLResponse(content=html_path.read_text(encoding="utf-8"))