Files
aiagent/backend/app/api/legal.py
renjianbo 41ffd31923 feat: P0 commercial readiness — password security, legal, account management
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>
2026-07-01 22:01:54 +08:00

162 lines
5.4 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.
"""
用户协议 & 隐私政策 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,
)