Backend changes for Phase A of v1.0 commercial launch: P0-3: Password Security - Remove hardcoded admin/123456 defaults from 34+ bootstrap scripts - Add PLATFORM_USERNAME/PLATFORM_PASSWORD env vars to config - Add PUT /api/v1/auth/change-password endpoint (requires old password) P0-1: User Agreement & Privacy Policy - Add agreed_terms/agreed_terms_version/agreed_terms_at to User model - New GET /api/v1/legal/privacy and GET /api/v1/legal/terms endpoints - New POST /api/v1/legal/agree endpoint to record consent - Register endpoint now validates agreed_terms must be True P0-6: Account Management - Add phone/status/is_email_verified to User model - Add DELETE /api/v1/auth/account for account deletion (with password confirmation) - Add PUT /api/v1/auth/phone for phone binding - Reject authentication for deleted accounts (status=deleted) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
162 lines
5.4 KiB
Python
162 lines
5.4 KiB
Python
"""
|
||
用户协议 & 隐私政策 API
|
||
"""
|
||
from fastapi import APIRouter, Depends
|
||
from pydantic import BaseModel
|
||
from sqlalchemy.orm import Session
|
||
from datetime import datetime
|
||
|
||
from app.core.database import get_db
|
||
from app.core.exceptions import ConflictError
|
||
from app.api.auth import get_current_user
|
||
from app.models.user import User
|
||
|
||
router = APIRouter(
|
||
prefix="/api/v1/legal",
|
||
tags=["legal"],
|
||
)
|
||
|
||
# ─── 协议版本 ───────────────────────────────────────────────
|
||
|
||
CURRENT_TERMS_VERSION = "1.0"
|
||
CURRENT_PRIVACY_VERSION = "1.0"
|
||
|
||
# ─── 内容 ───────────────────────────────────────────────────
|
||
|
||
PRIVACY_POLICY = """# 天工智能体平台 隐私政策
|
||
|
||
**更新日期:2026年7月1日**
|
||
**生效日期:2026年7月1日**
|
||
|
||
## 一、信息收集
|
||
|
||
1. 您在注册账户时提供的个人信息,包括用户名、邮箱地址和手机号码。
|
||
2. 您在使用智能体对话功能时产生的对话内容和交互记录。
|
||
3. 设备信息:我们可能收集您的设备型号、操作系统版本、设备标识符等信息用于优化服务。
|
||
|
||
## 二、信息使用
|
||
|
||
1. 为您提供智能体对话、语音识别、推送通知等核心服务。
|
||
2. 改善产品质量和用户体验,包括对话模型的训练和优化。
|
||
3. 提供客户支持和故障排除。
|
||
|
||
## 三、信息存储和保护
|
||
|
||
1. 您的数据存储在中国境内的服务器上。
|
||
2. 我们采用加密传输、访问控制、数据备份等安全措施保护您的信息。
|
||
3. 对话数据在您主动删除或账号注销后将在30天内清除。
|
||
|
||
## 四、信息共享
|
||
|
||
1. 未经您的明确同意,我们不会将您的个人信息共享给第三方。
|
||
2. 法律法规要求披露的除外。
|
||
|
||
## 五、您的权利
|
||
|
||
1. 您可以随时查看、修改您的个人信息。
|
||
2. 您可以导出您的对话数据。
|
||
3. 您可以注销账号并要求删除数据。
|
||
|
||
## 六、联系我们
|
||
|
||
如有隐私相关问题,请联系:support@tiangong.ai
|
||
"""
|
||
|
||
USER_AGREEMENT = """# 天工智能体平台 用户协议
|
||
|
||
**更新日期:2026年7月1日**
|
||
**生效日期:2026年7月1日**
|
||
|
||
## 一、总则
|
||
|
||
1. 天工智能体平台(以下简称"本平台")是一个提供AI智能体服务的在线平台。
|
||
2. 您注册和使用本平台即表示您已阅读、理解并同意本协议的全部条款。
|
||
|
||
## 二、账号管理
|
||
|
||
1. 您应当提供真实、准确的注册信息。
|
||
2. 您对账号下的所有活动负责,请妥善保管账号和密码。
|
||
3. 您不得将账号转让、出借或出售给他人。
|
||
|
||
## 三、使用规范
|
||
|
||
1. 您不得利用本平台从事违法活动,包括但不限于:
|
||
- 生成、传播违法或有害内容
|
||
- 侵犯他人知识产权或隐私权
|
||
- 干扰或破坏平台正常运行
|
||
2. 您不得对智能体进行恶意引导、注入攻击或其他危害系统安全的行为。
|
||
|
||
## 四、知识产权
|
||
|
||
1. 平台本身的软件、界面设计、商标等知识产权归平台所有。
|
||
2. 您创建的智能体配置归您所有。
|
||
3. 您与智能体对话产生的内容归您所有。
|
||
|
||
## 五、免责声明
|
||
|
||
1. AI生成内容仅供参考,不构成专业建议。
|
||
2. 平台不对AI生成内容的准确性、完整性负责。
|
||
3. 因不可抗力或第三方原因导致的服务中断,平台不承担责任。
|
||
|
||
## 六、协议变更
|
||
|
||
1. 我们可能会不时更新本协议,更新后会通过应用内通知告知。
|
||
2. 如果您不同意更新后的条款,您可以停止使用本平台并注销账号。
|
||
|
||
## 七、法律适用与争议解决
|
||
|
||
1. 本协议适用中华人民共和国法律。
|
||
2. 因本协议产生的争议,双方应协商解决;协商不成的,提交平台所在地法院管辖。
|
||
"""
|
||
|
||
|
||
# ─── Response/Request Models ──────────────────────────────────
|
||
|
||
class LegalContentResponse(BaseModel):
|
||
content: str
|
||
version: str
|
||
|
||
|
||
class AgreeRequest(BaseModel):
|
||
terms_version: str | None = None
|
||
privacy_version: str | None = None
|
||
|
||
|
||
class AgreeResponse(BaseModel):
|
||
message: str
|
||
agreed_terms: bool
|
||
agreed_terms_version: str
|
||
|
||
|
||
# ─── Endpoints ────────────────────────────────────────────────
|
||
|
||
@router.get("/privacy", response_model=LegalContentResponse)
|
||
async def get_privacy_policy():
|
||
"""获取隐私政策内容。"""
|
||
return LegalContentResponse(content=PRIVACY_POLICY, version=CURRENT_PRIVACY_VERSION)
|
||
|
||
|
||
@router.get("/terms", response_model=LegalContentResponse)
|
||
async def get_user_agreement():
|
||
"""获取用户协议内容。"""
|
||
return LegalContentResponse(content=USER_AGREEMENT, version=CURRENT_TERMS_VERSION)
|
||
|
||
|
||
@router.post("/agree", response_model=AgreeResponse)
|
||
async def agree_terms(
|
||
body: AgreeRequest,
|
||
current_user: User = Depends(get_current_user),
|
||
db: Session = Depends(get_db),
|
||
):
|
||
"""记录用户同意协议。"""
|
||
current_user.agreed_terms = True
|
||
current_user.agreed_terms_version = body.terms_version or CURRENT_TERMS_VERSION
|
||
current_user.agreed_terms_at = datetime.utcnow()
|
||
db.commit()
|
||
|
||
return AgreeResponse(
|
||
message="协议同意已记录",
|
||
agreed_terms=True,
|
||
agreed_terms_version=current_user.agreed_terms_version,
|
||
)
|