feat: virtual company module, team projects, PWA dishes app, and startup scripts overhaul

- Add company module (3-tier org, CEO planning, parallel departments)
- Add company orchestrator, knowledge extractor, presets, scheduler
- Add company API endpoints, models, and frontend views
- Add 今天吃啥 PWA app (69 dishes, real images, offline support)
- Add team_projects output directory structure
- Add unified manage.ps1 for service lifecycle
- Add Windows startup guide v1.0
- Add TTS troubleshooting doc
- Update frontend (AgentChat UX overhaul, new views)
- Update backend (voice engine fix, multi-tenant, RBAC)
- Remove deprecated startup scripts and old docs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 22:37:56 +08:00
parent 3483c6b3be
commit f2e65a8fbb
259 changed files with 39239 additions and 3148 deletions

View File

@@ -14,6 +14,7 @@ from sqlalchemy.orm import Session
from sqlalchemy import func
from app.api.auth import get_current_user
from app.api.deps import require_admin
from app.core.database import get_db
from app.core.security import get_password_hash
from app.models.user import User
@@ -24,12 +25,6 @@ logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1/admin/users", tags=["admin-users"])
def _require_admin(current_user: User = Depends(get_current_user)) -> User:
if current_user.role != "admin":
raise HTTPException(status_code=403, detail="仅平台管理员可访问")
return current_user
# ── Request / Response schemas ──
class UserCreateRequest(BaseModel):
@@ -90,7 +85,7 @@ def list_users(
status: Optional[str] = Query(None, description="过滤状态: active/disabled/deleted"),
role: Optional[str] = Query(None, description="过滤角色"),
db: Session = Depends(get_db),
_admin: User = Depends(_require_admin),
_admin: User = Depends(require_admin()),
):
"""获取用户列表(分页、搜索、过滤)"""
q = db.query(User)
@@ -137,7 +132,7 @@ def list_users(
def create_user(
data: UserCreateRequest,
db: Session = Depends(get_db),
_admin: User = Depends(_require_admin),
_admin: User = Depends(require_admin()),
):
"""管理员创建新用户"""
if db.query(User).filter(User.username == data.username).first():
@@ -166,7 +161,7 @@ def create_user(
def get_user(
user_id: str,
db: Session = Depends(get_db),
_admin: User = Depends(_require_admin),
_admin: User = Depends(require_admin()),
):
"""获取用户详情"""
user = db.query(User).filter(User.id == user_id).first()
@@ -187,7 +182,7 @@ def update_user(
user_id: str,
data: UserUpdateRequest,
db: Session = Depends(get_db),
_admin: User = Depends(_require_admin),
_admin: User = Depends(require_admin()),
):
"""编辑用户"""
user = db.query(User).filter(User.id == user_id).first()
@@ -229,7 +224,7 @@ def update_user(
def delete_user(
user_id: str,
db: Session = Depends(get_db),
_admin: User = Depends(_require_admin),
_admin: User = Depends(require_admin()),
):
"""软删除用户(标记为 deleted"""
user = db.query(User).filter(User.id == user_id).first()
@@ -250,7 +245,7 @@ def reset_password(
user_id: str,
data: ResetPasswordRequest,
db: Session = Depends(get_db),
_admin: User = Depends(_require_admin),
_admin: User = Depends(require_admin()),
):
"""重置用户密码"""
user = db.query(User).filter(User.id == user_id).first()