feat: add admin permissions voice input analytics and feedback

This commit is contained in:
2026-08-11 17:17:59 +08:00
parent 3b9215cc3d
commit fd2da26d10
46 changed files with 1836 additions and 192 deletions

View File

@@ -3,6 +3,7 @@ from app.models.ai_config import ContentGenerationConfig, ModelConfig, Prompt, S
from app.models.base import Base
from app.models.chat import ChatMessage, ChatSession, TopicSession
from app.models.entitlement import EntitlementPlan, UserEntitlement, UserEntitlementLog
from app.models.feedback import MessageFeedback
from app.models.growth import GrowthProfileRevision, PeriodicReport, ShareDraft, TeacherHelpCard, TopicSummary, UserGrowthProfile
from app.models.insight import QuestionInsightCleanedQuestion
from app.models.knowledge import (
@@ -50,6 +51,7 @@ __all__ = [
"HumanAttentionHistory",
"HumanAttentionRecord",
"ModelConfig",
"MessageFeedback",
"OperationLog",
"PeriodicReport",
"LogRetentionPolicy",

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from datetime import datetime
from sqlalchemy import BigInteger, DateTime, ForeignKey, String
from sqlalchemy import BigInteger, DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import Base, TimestampMixin
@@ -15,6 +15,7 @@ class Role(Base, TimestampMixin):
code: Mapped[str] = mapped_column(String(50), unique=True, index=True, nullable=False)
name: Mapped[str] = mapped_column(String(50), nullable=False)
remark: Mapped[str | None] = mapped_column(String(255), nullable=True)
permissions: Mapped[str] = mapped_column(Text, nullable=False, default="[]")
admins: Mapped[list["Admin"]] = relationship("Admin", back_populates="role")
@@ -29,5 +30,7 @@ class Admin(Base, TimestampMixin):
role_id: Mapped[int | None] = mapped_column(ForeignKey("sys_role.id"), nullable=True)
status: Mapped[int] = mapped_column(default=1, nullable=False)
last_login_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
must_change_password: Mapped[int] = mapped_column(Integer, nullable=False, default=1)
is_super_admin: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
role: Mapped[Role | None] = relationship("Role", back_populates="admins")

View File

@@ -0,0 +1,26 @@
from __future__ import annotations
from datetime import datetime
from sqlalchemy import BigInteger, DateTime, ForeignKey, Index, Integer, String, Text, UniqueConstraint, func
from sqlalchemy.orm import Mapped, mapped_column
from app.models.base import Base
class MessageFeedback(Base):
__tablename__ = "sys_message_feedback"
__table_args__ = (
UniqueConstraint("user_id", "message_id", name="uq_message_feedback_user_message"),
Index("ix_message_feedback_read_created", "is_read", "created_at"),
)
id: Mapped[int] = mapped_column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True, autoincrement=True)
user_id: Mapped[int] = mapped_column(ForeignKey("sys_user.id"), nullable=False, index=True)
session_id: Mapped[int] = mapped_column(ForeignKey("sys_chat_session.id"), nullable=False, index=True)
message_id: Mapped[int] = mapped_column(ForeignKey("sys_chat_message.id"), nullable=False, index=True)
content: Mapped[str] = mapped_column(String(200), nullable=False)
is_read: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
read_by: Mapped[int | None] = mapped_column(ForeignKey("sys_admin.id"), nullable=True)
read_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), nullable=False)