{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.lianhewenshe.top/sitemap.json",
  "title": "联合文社官方网站 · JSON 网址地图",
  "description": "联合文社（United Literature Society）官方网站完整结构化的 JSON 格式网址地图，包含所有前端页面、API路由、静态资源和内容文件的层级关系与元数据。",
  "version": "2.3.0",
  "generatedAt": "2026-07-11T00:00:00+08:00",
  "domain": "https://www.lianhewenshe.top",
  "basePath": "/",
  "statistics": {
    "totalPages": 23,
    "totalApiEndpoints": 54,
    "totalStaticAssets": 8,
    "totalContentFiles": 4,
    "totalDatabaseTables": 13,
    "totalServerModules": 15
  },

  "pages": {
    "首页": {
      "url": "/index.html",
      "title": "联合文社 — 文以载道，社以聚心",
      "description": "多体裁、多社团文学联合体官方网站首页。展示品牌介绍、核心特色（多体裁覆盖、多社团协作、赛事驱动、定级制度）、入驻社团网格、进行中赛事卡片。",
      "priority": "1.0",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["hero区域(Markdown)", "关于我们(Markdown)", "社团网格(硬编码16个)", "赛事卡片(API动态)"],
      "apiDependencies": ["GET /api/public/contests"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.mouseBg", "ULS.mdLoader", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "sections": [
        { "id": "hero", "name": "品牌标语区", "description": "联合文社品牌标语与副标题" },
        { "id": "features", "name": "核心特色", "description": "多体裁覆盖、多社团协作、赛事驱动、定级制度四大特色" },
        { "id": "about", "name": "关于我们", "description": "从 content/home/about.md 动态加载的社团介绍" },
        { "id": "societies", "name": "入驻社团", "description": "16个入驻社团名称网格展示" },
        { "id": "contests", "name": "进行中赛事", "description": "最新赛事卡片，从API获取" }
      ]
    },

    "赛事列表": {
      "url": "/contests.html",
      "title": "全部赛事 — 联合文社",
      "description": "所有文学赛事的完整列表页，支持「全部/进行中/已结束」三种状态筛选。",
      "priority": "0.9",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["赛事卡片列表(API动态)"],
      "apiDependencies": ["GET /api/public/contests"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.mouseBg", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "filters": [
        { "value": "all", "label": "全部", "query": "无筛选" },
        { "value": "active", "label": "进行中", "query": "status=active" },
        { "value": "ended", "label": "已结束", "query": "status=ended" }
      ]
    },

    "赛事详情": {
      "url": "/contest.html",
      "title": "赛事详情 — 联合文社",
      "description": "单个文学赛事的完整详情页，包含赛事简介、比赛规则、社团参赛限制、评委评分表格及投稿入口。使用 ?id= 查询参数加载特定赛事。",
      "priority": "0.9",
      "requiresAuth": false,
      "accessLevel": "public",
      "queryParams": ["id (赛事ID)", "redirect (投稿后回跳)"],
      "dynamicContent": ["赛事简介(Markdown)", "比赛规则(Markdown)", "评委评分表格(API动态)"],
      "apiDependencies": ["GET /api/public/contests/:id", "GET /api/public/judge-ratings"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.mouseBg", "ULS.mdLoader", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "sections": [
        { "id": "intro", "name": "赛事简介", "description": "从 content/contest/intro.md 加载" },
        { "id": "rules", "name": "比赛规则", "description": "从 content/contest/rules.md 加载，含社团参赛人数要求、禁AI、定级体系" },
        { "id": "ratings", "name": "评委评分", "description": "动态加载的评审评分表格" },
        { "id": "submit", "name": "投稿入口", "description": "参赛投稿入口按钮" }
      ]
    },

    "在线编辑器": {
      "url": "/editor.html",
      "title": "编辑器 — 联合文社",
      "description": "沉浸式在线写作编辑器，支持侧边栏文档管理、格式化工具栏、Markdown预览、本地自动保存和云存储。",
      "priority": "0.9",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["文档列表(API动态)", "编辑器内容"],
      "apiDependencies": ["GET /api/documents", "POST /api/documents", "PUT /api/documents/:id", "DELETE /api/documents/:id"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.mouseBg", "ULS.components", "ULS.auth", "ULS.toast"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "features": [
        "侧边栏文档管理（新建/重命名/删除）",
        "格式化工具栏（加粗/斜体/标题等）",
        "Markdown 实时预览",
        "localStorage 自动保存",
        "云端存取同步"
      ]
    },

    "AI写作助手": {
      "url": "/ai.html",
      "title": "AI 写作助手 — 联合文社",
      "description": "智能创作，灵感无限。支持多种 AI 角色（诗词助手、小说家、文学评论家等），SSE 流式对话，支持 OpenAI / DeepSeek / Anthropic 三种 AI Provider。",
      "priority": "0.9",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["角色列表(API)", "对话历史(API)", "SSE流式回复"],
      "apiDependencies": [
        "GET /api/ai/roles",
        "GET /api/ai/sessions",
        "POST /api/ai/sessions",
        "DELETE /api/ai/sessions/:id",
        "GET /api/ai/sessions/:id/messages",
        "POST /api/ai/send",
        "POST /api/ai/send-stream"
      ],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth", "ULS.toast"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "ai.css"],
      "features": [
        "AI 角色选择（多角色卡片网格）",
        "SSE 流式对话（打字机逐字渲染）",
        "对话历史管理（可折叠侧边栏）",
        "支持 OpenAI / DeepSeek / Anthropic",
        "无 API 配置时自动 fallback 模拟回复"
      ]
    },

    "排行榜": {
      "url": "/leaderboard.html",
      "title": "排行榜 — 联合文社",
      "description": "基于文章均分的作家水平排行榜。金/银/铜领奖台展示前三名，完整排名表格含均分、文章数、最高分、最低分。",
      "priority": "0.8",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["排行榜数据(API动态)"],
      "apiDependencies": ["GET /api/public/judge-ratings"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.mouseBg", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "sections": [
        { "id": "podium", "name": "领奖台", "description": "金/银/铜牌前三名展示" },
        { "id": "table", "name": "完整排行榜", "description": "排名、作者、社团、均分、文章数等" }
      ]
    },

    "论坛首页": {
      "url": "/bbs.html",
      "title": "论坛 — 联合文社",
      "description": "创作交流、学术讨论、赛事专区。论坛首页展示版块列表与热门帖子概览。",
      "priority": "0.8",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["版块列表", "热门帖子"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛版块": {
      "url": "/bbs-forum.html",
      "title": "版块 — 联合文社论坛",
      "description": "论坛版块内帖子列表，含面包屑导航，动态加载版块内帖子。",
      "priority": "0.8",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["版块帖子列表(API动态)"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛帖子": {
      "url": "/bbs-topic.html",
      "title": "帖子 — 联合文社论坛",
      "description": "论坛帖子详情页，展示帖子标题、正文内容及回复列表。",
      "priority": "0.8",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["帖子内容", "回复列表"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛发帖": {
      "url": "/bbs-post.html",
      "title": "发帖 — 联合文社论坛",
      "description": "在联合文社论坛发表新帖子，含标题输入与内容编辑器。",
      "priority": "0.8",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["编辑器"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛群组": {
      "url": "/bbs-group.html",
      "title": "群组 — 联合文社论坛",
      "description": "创建群组，与文友深入交流。卡片网格展示所有群组，支持创建新群组。",
      "priority": "0.7",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["群组列表(API动态)"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛个人空间": {
      "url": "/bbs-profile.html",
      "title": "个人空间 — 联合文社论坛",
      "description": "论坛用户个人主页，双栏布局（左侧 sticky 侧边栏 + 右侧内容区），展示用户资料和发帖历史。",
      "priority": "0.7",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["用户资料", "发帖历史"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛私信": {
      "url": "/bbs-messages.html",
      "title": "私信 — 联合文社论坛",
      "description": "论坛站内私信中心，私信列表与对话界面。",
      "priority": "0.6",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["私信列表", "对话界面"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛搜索": {
      "url": "/bbs-search.html",
      "title": "搜索 — 联合文社论坛",
      "description": "论坛帖子搜索页，搜索框 + 结果列表。",
      "priority": "0.6",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["搜索结果(API动态)"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "论坛会员": {
      "url": "/bbs-pay.html",
      "title": "开通论坛会员 — 联合文社",
      "description": "5元/月畅享创作交流社区。双栏布局（介绍 + 支付），定价 5 元/月。",
      "priority": "0.6",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["定价信息"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "会员过期": {
      "url": "/bbs-expired.html",
      "title": "会员已到期 — 联合文社",
      "description": "论坛会员已到期提示页，居中卡片提示续费，链接到支付页。",
      "priority": "0.5",
      "requiresAuth": true,
      "accessLevel": "user",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["续费引导"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css", "bbs.css"]
    },

    "登录注册": {
      "url": "/auth.html",
      "title": "登录/注册 — 联合文社",
      "description": "统一认证页面，提供登录和注册两个Tab页。支持普通用户和管理员登录，登录后支持 ?redirect= 参数跳转。",
      "priority": "0.8",
      "requiresAuth": false,
      "accessLevel": "public",
      "queryParams": ["redirect (登录后跳转目标)"],
      "dynamicContent": ["无，纯静态表单"],
      "apiDependencies": ["POST /api/auth/register", "POST /api/auth/login-any"],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.mouseBg", "ULS.components", "ULS.auth", "ULS.toast"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "tabs": [
        { "id": "login", "name": "登录", "fields": ["用户名", "密码"], "endpoint": "/api/auth/login-any" },
        { "id": "register", "name": "注册", "fields": ["用户名(3-20字符)", "密码(≥6位)", "笔名"], "endpoint": "/api/auth/register" }
      ]
    },

    "管理后台": {
      "url": "/admin.html",
      "title": "管理后台 — 联合文社",
      "description": "管理员专属全功能管理面板，左侧固定侧边栏导航，包含赛事/稿件/社团/成员/评分/用户/AI角色/系统设置等管理模块与批量导入功能。",
      "priority": "0.7",
      "requiresAuth": true,
      "accessLevel": "admin",
      "redirectUnauth": "/auth.html",
      "dynamicContent": ["全部管理数据(API动态)"],
      "apiDependencies": [
        "POST /api/admin/auth/login",
        "GET /api/admin/bootstrap",
        "GET/PUT /api/admin/settings",
        "GET/POST/PUT/DELETE /api/admin/contests",
        "GET/POST/PUT/DELETE /api/admin/manuscripts",
        "GET/POST/PUT/DELETE /api/admin/societies",
        "GET/POST/PUT/DELETE /api/admin/members",
        "GET/POST/DELETE /api/admin/judge-ratings",
        "GET/POST/PUT/DELETE /api/admin/users",
        "GET/POST/PUT/PATCH/DELETE /api/admin/app-users",
        "GET/POST/PUT/DELETE /api/ai/admin/roles",
        "GET/POST /api/ai/admin/api-settings",
        "POST /api/admin/bulk/:key"
      ],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth", "ULS.toast", "ULS.dialog"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "panels": [
        { "id": "overview", "name": "统计概览", "description": "赛事/稿件/社团/成员/评分数量统计" },
        { "id": "contests", "name": "赛事管理", "description": "赛事CRUD，含名称/主题/日期/状态" },
        { "id": "manuscripts", "name": "稿件管理", "description": "投稿稿件CRUD，含赛事/标题/作者/社团/体裁/内容/审核" },
        { "id": "societies", "name": "社团管理", "description": "社团CRUD，含名称/负责人/人数/入社年份/评级/积分" },
        { "id": "members", "name": "成员管理", "description": "写手成员CRUD，含笔名/真名/社团/体裁/联系方式/评级/积分" },
        { "id": "ratings", "name": "评委评分", "description": "评审评分管理，含赛事/选手/评委/等级/分数/评语/日期" },
        { "id": "adminUsers", "name": "管理员账号", "description": "管理员CRUD，含用户名/角色(admin|super)/别名" },
        { "id": "appUsers", "name": "普通用户", "description": "普通用户管理，含封禁/解封、备注、投稿评级" },
        { "id": "ai-roles", "name": "AI角色管理", "description": "AI角色CRUD，含名称/Provider/prompt/temperature/max_tokens" },
        { "id": "ai-settings", "name": "AI API设置", "description": "API密钥配置，支持OpenAI/DeepSeek/Anthropic" },
        { "id": "settings", "name": "系统设置", "description": "键值对设置，含title/contestLimit等" },
        { "id": "bulk", "name": "批量导入", "description": "支持 contests/manuscripts/societies/members/judge-ratings/settings/admin-users/app-users 批量导入" }
      ],
      "roles": {
        "admin": "普通管理员 — 可进行大部分CRUD操作，不可管理管理员账号/系统设置/批量导入",
        "super": "超级管理员 — 全部权限，含管理员账号管理、系统设置、批量导入"
      }
    },

    "网址地图": {
      "url": "/sitemap.html",
      "title": "网址地图 — 联合文社",
      "description": "联合文社官方网站完整网址地图，以分组 section 列出所有前端页面卡片、API端点、静态资源、数据库表结构及内容文件的层级索引。",
      "priority": "0.5",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["无，纯静态结构文档"],
      "jsModules": [],
      "cssFiles": ["(内联样式)", "Google Fonts (Inter + JetBrains Mono + Noto Serif SC)"],
      "meta": { "robots": "all" }
    },

    "树形地图": {
      "url": "/sitemap-tree.html",
      "title": "树形网址地图 — 联合文社",
      "description": "联合文社官方网站交互式树形结构网址地图，可展开/折叠的完整网站层级索引，支持搜索过滤与全部展开/折叠。",
      "priority": "0.5",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["树形结构(JS数据驱动)", "搜索高亮"],
      "jsModules": ["(内联JS)"],
      "cssFiles": ["(内联样式)", "Google Fonts (Inter + JetBrains Mono + Noto Serif SC)"],
      "features": [
        "可展开/折叠的树形节点",
        "搜索框实时过滤+高亮",
        "工具栏：全部展开/折叠",
        "虚线引导线连接节点"
      ],
      "meta": { "robots": "all" }
    },

    "关于站长": {
      "url": "/about.html",
      "title": "关于站长 — 春斋主人 · 联合文社",
      "description": "联合文社创始人春斋主人的个人介绍页面。在文学与科技的边缘，寻找属于我们的那一部分青春。",
      "priority": "0.7",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["站长个人信息"],
      "apiDependencies": [],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "meta": { "robots": "all" }
    },

    "棋类对弈": {
      "url": "/chess.html",
      "title": "棋类对弈 — 联合文社",
      "description": "五子棋、围棋在线实时对弈页面，支持模式选择和多种棋盘主题。",
      "priority": "0.7",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["棋盘渲染", "对弈逻辑"],
      "apiDependencies": [],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "meta": { "robots": "all" }
    },

    "选择身份": {
      "url": "/role-select.html",
      "title": "选择身份 — 联合文社",
      "description": "身份选择入口页面，提供站长和游客两种身份入口，选择后进入对应功能区域。",
      "priority": "0.7",
      "requiresAuth": false,
      "accessLevel": "public",
      "dynamicContent": ["身份选择卡片"],
      "apiDependencies": [],
      "jsModules": ["ULS.theme", "ULS.cursor", "ULS.components", "ULS.auth"],
      "cssFiles": ["tokens.css", "base.css", "components.css", "animations.css"],
      "meta": { "robots": "all" }
    }
  },

  "apiRoutes": {
    "健康检查": {
      "prefix": "/api/health",
      "endpoints": [
        { "method": "GET", "path": "/api/health", "auth": "none", "description": "服务健康检查，返回 { ok: true, service: 'uls-backend' }" }
      ]
    },
    "用户认证": {
      "prefix": "/api/auth",
      "endpoints": [
        { "method": "POST", "path": "/api/auth/register", "auth": "none", "body": ["username", "password", "penName"], "description": "普通用户注册，同时自动在 members 表创建成员记录" },
        { "method": "POST", "path": "/api/auth/login", "auth": "none", "body": ["username", "password"], "description": "普通用户登录（仅查 app_users 表）" },
        { "method": "POST", "path": "/api/auth/login-any", "auth": "none", "body": ["username", "password"], "description": "统一登录（先查 admin_users 再查 app_users），返回 type 字段区分身份" },
        { "method": "GET", "path": "/api/auth/me", "auth": "bearer", "description": "获取当前登录用户信息（需 Authorization: Bearer <token>）" }
      ]
    },
    "管理员认证": {
      "prefix": "/api/admin/auth",
      "endpoints": [
        { "method": "POST", "path": "/api/admin/auth/login", "auth": "none", "body": ["username", "password"], "description": "管理员登录，返回JWT token和管理员信息" }
      ]
    },
    "公开数据": {
      "prefix": "/api/public",
      "endpoints": [
        { "method": "GET", "path": "/api/public/contests", "auth": "none", "description": "获取所有赛事列表" },
        { "method": "GET", "path": "/api/public/contests/:id", "auth": "none", "description": "获取单个赛事详情" },
        { "method": "GET", "path": "/api/public/judge-ratings", "auth": "none", "queryParams": ["contestId"], "description": "获取所有评委评分（含 contestId/contestName），可按赛事筛选" }
      ]
    },
    "AI写作助手": {
      "prefix": "/api/ai",
      "endpoints": [
        { "method": "GET", "path": "/api/ai/roles", "auth": "none", "description": "获取所有活跃的 AI 角色（诗词助手、小说家等）" },
        { "method": "GET", "path": "/api/ai/sessions", "auth": "user", "description": "获取当前用户的对话会话列表" },
        { "method": "POST", "path": "/api/ai/sessions", "auth": "user", "body": ["roleId"], "description": "创建新的 AI 对话会话" },
        { "method": "DELETE", "path": "/api/ai/sessions/:id", "auth": "user", "description": "删除指定会话及所有消息" },
        { "method": "GET", "path": "/api/ai/sessions/:id/messages", "auth": "user", "description": "获取会话历史消息记录" },
        { "method": "POST", "path": "/api/ai/send", "auth": "user", "body": ["sessionId", "message"], "description": "发送消息并获取 AI 回复（非流式）" },
        { "method": "POST", "path": "/api/ai/send-stream", "auth": "user", "body": ["sessionId", "message"], "description": "发送消息并获取 AI 流式回复（SSE），支持 OpenAI/DeepSeek/Anthropic" }
      ]
    },
    "AI管理": {
      "prefix": "/api/ai/admin",
      "endpoints": [
        { "method": "GET", "path": "/api/ai/admin/stats", "auth": "admin", "description": "AI 使用统计数据" },
        { "method": "GET", "path": "/api/ai/admin/roles", "auth": "admin", "description": "获取所有 AI 角色（含禁用）" },
        { "method": "POST", "path": "/api/ai/admin/roles", "auth": "admin", "body": ["name", "provider", "model", "prompt", "temperature", "max_tokens"], "description": "创建新 AI 角色" },
        { "method": "GET", "path": "/api/ai/admin/roles/:id", "auth": "admin", "description": "获取单个角色详情" },
        { "method": "PUT", "path": "/api/ai/admin/roles/:id", "auth": "admin", "description": "更新 AI 角色配置" },
        { "method": "DELETE", "path": "/api/ai/admin/roles/:id", "auth": "admin", "description": "删除 AI 角色" },
        { "method": "PUT", "path": "/api/ai/admin/roles/:id/status", "auth": "admin", "body": ["active(boolean)"], "description": "启用/禁用 AI 角色" },
        { "method": "GET", "path": "/api/ai/admin/api-settings", "auth": "admin", "description": "获取 API 密钥配置" },
        { "method": "POST", "path": "/api/ai/admin/api-settings", "auth": "admin", "body": ["provider", "apiKey", "apiUrl", "model"], "description": "保存 API 密钥配置" }
      ]
    },
    "管理后台CRUD": {
      "prefix": "/api/admin",
      "endpoints": [
        { "method": "GET", "path": "/api/admin/stats", "auth": "admin", "description": "统计面板数据" },
        { "method": "GET", "path": "/api/admin/bootstrap", "auth": "admin", "description": "一次性加载所有管理数据" },
        { "method": "GET", "path": "/api/admin/contests", "auth": "admin", "description": "获取所有赛事" },
        { "method": "POST", "path": "/api/admin/contests", "auth": "admin", "body": ["name", "description", "theme", "start_date", "end_date", "status"], "description": "创建赛事（直写API，非localStorage）" },
        { "method": "PUT", "path": "/api/admin/contests/:id", "auth": "admin", "description": "更新赛事（直写API）" },
        { "method": "DELETE", "path": "/api/admin/contests/:id", "auth": "admin", "description": "删除赛事（直写API）" },
        { "method": "GET", "path": "/api/admin/manuscripts", "auth": "admin", "description": "获取所有稿件" },
        { "method": "POST", "path": "/api/admin/manuscripts", "auth": "admin", "body": ["title", "contestId", "author", "authorId", "society", "genre", "content", "date", "reviewStatus", "reviewScore", "reviewComment", "reviewerId"], "description": "创建稿件（直写API）" },
        { "method": "PUT", "path": "/api/admin/manuscripts/:id", "auth": "admin", "description": "更新稿件（直写API）" },
        { "method": "DELETE", "path": "/api/admin/manuscripts/:id", "auth": "admin", "description": "删除稿件（直写API）" },
        { "method": "GET", "path": "/api/admin/societies", "auth": "admin", "description": "获取所有社团" },
        { "method": "POST", "path": "/api/admin/societies", "auth": "super", "body": ["name", "leader", "member_count", "joined_year", "rating", "score"], "description": "创建社团" },
        { "method": "PUT", "path": "/api/admin/societies/:id", "auth": "super", "description": "更新社团" },
        { "method": "DELETE", "path": "/api/admin/societies/:id", "auth": "super", "description": "删除社团" },
        { "method": "GET", "path": "/api/admin/members", "auth": "admin", "description": "获取所有成员" },
        { "method": "POST", "path": "/api/admin/members", "auth": "admin", "body": ["pen_name", "real_name", "society", "genre", "contact", "note", "rating", "score"], "description": "创建成员" },
        { "method": "PUT", "path": "/api/admin/members/:id", "auth": "admin", "description": "更新成员" },
        { "method": "DELETE", "path": "/api/admin/members/:id", "auth": "admin", "description": "删除成员" },
        { "method": "GET", "path": "/api/admin/judge-ratings", "auth": "admin", "description": "获取所有评委评分" },
        { "method": "POST", "path": "/api/admin/judge-ratings", "auth": "admin", "body": ["name", "judge", "level", "score", "contest_id", "contest_name", "society", "comment", "rating_date"], "description": "创建评分" },
        { "method": "DELETE", "path": "/api/admin/judge-ratings/:id", "auth": "admin", "description": "删除单条评分" },
        { "method": "DELETE", "path": "/api/admin/judge-ratings", "auth": "admin", "description": "清空所有评分" },
        { "method": "GET", "path": "/api/admin/users", "auth": "super", "description": "获取管理员列表" },
        { "method": "POST", "path": "/api/admin/users", "auth": "super", "body": ["username", "password", "role", "alias"], "description": "创建管理员" },
        { "method": "PUT", "path": "/api/admin/users/:id", "auth": "super", "description": "更新管理员" },
        { "method": "DELETE", "path": "/api/admin/users/:id", "auth": "super", "description": "删除管理员（默认admin不可删）" },
        { "method": "GET", "path": "/api/admin/app-users", "auth": "super", "description": "获取普通用户列表（含投稿评级）" },
        { "method": "POST", "path": "/api/admin/app-users", "auth": "super", "body": ["username", "password", "pen_name", "level", "score", "banned", "note"], "description": "创建普通用户" },
        { "method": "PUT", "path": "/api/admin/app-users/:id", "auth": "super", "description": "更新普通用户" },
        { "method": "PATCH", "path": "/api/admin/app-users/:id/ban", "auth": "super", "body": ["banned(boolean)"], "description": "封禁/解封用户" },
        { "method": "DELETE", "path": "/api/admin/app-users/:id", "auth": "super", "description": "删除普通用户" },
        { "method": "GET", "path": "/api/admin/settings", "auth": "admin", "description": "获取系统设置" },
        { "method": "PUT", "path": "/api/admin/settings", "auth": "super", "body": ["{ setting_key: setting_value }"], "description": "更新系统设置" },
        { "method": "POST", "path": "/api/admin/bulk/:key", "auth": "super", "body": ["{ items: [...] }"], "params": "key ∈ {contests, manuscripts, societies, members, judge-ratings, settings, admin-users, app-users}", "description": "批量导入数据（使用数据库事务）" }
      ]
    },
    "编辑器文档": {
      "prefix": "/api/documents",
      "endpoints": [
        { "method": "GET", "path": "/api/documents", "auth": "user", "description": "获取当前用户的所有编辑器文档" },
        { "method": "POST", "path": "/api/documents", "auth": "user", "body": ["title", "content"], "description": "创建/更新文档（ON DUPLICATE KEY UPDATE 增量同步）" },
        { "method": "PUT", "path": "/api/documents/:id", "auth": "user", "description": "更新文档" },
        { "method": "DELETE", "path": "/api/documents/:id", "auth": "user", "description": "删除文档" }
      ]
    },
    "成员管理": {
      "prefix": "/api/members",
      "endpoints": [
        { "method": "GET", "path": "/api/members", "auth": "user", "description": "获取成员列表（限50条）" },
        { "method": "POST", "path": "/api/members", "auth": "user", "body": ["pen_name", "real_name", "society", "genre", "contact", "note"], "description": "创建成员记录" }
      ]
    },
    "投稿管理": {
      "prefix": "/api/submissions",
      "endpoints": [
        { "method": "GET", "path": "/api/submissions", "auth": "user", "description": "获取当前用户的投稿稿件" },
        { "method": "POST", "path": "/api/submissions", "auth": "user", "body": ["title", "content", "contestId"], "description": "提交稿件（验证赛事存在性）" }
      ]
    }
  },

  "staticAssets": {
    "css": [
      { "file": "assets/css/tokens.css", "size": "3.97 KB", "description": "设计令牌 — CSS自定义属性，亮/暗双主题、字体栈、动画缓动、间距体系" },
      { "file": "assets/css/base.css", "size": "6 KB", "description": "基础样式 — CSS Reset、排版、栅格系统、辅助类、打印样式、响应式" },
      { "file": "assets/css/components.css", "size": "18.49 KB", "description": "组件库 — 按钮、卡片、徽章、导航、输入框、表格、标签页、模态框、Toast、赛事卡片" },
      { "file": "assets/css/animations.css", "size": "13.76 KB", "description": "动画增强 — Spring过渡、页面切换、交错入场、呼吸灯、骨架屏、滚动揭示、光标拖尾" },
      { "file": "assets/css/ai.css", "size": "13 KB", "description": "AI页面专用样式 — 深色文学风聊天界面、角色卡片网格、SSE流式动画、打字机光标" },
      { "file": "assets/css/bbs.css", "size": "—", "description": "论坛专用样式 — 版块卡片、帖子列表、个人空间双栏布局、私信界面" }
    ],
    "js": [
      { "file": "assets/js/core.js", "size": "14.23 KB", "description": "核心JS库 — 全局 namespace ULS：主题管理、自定义光标、Canvas粒子背景、打字机效果、滚动揭示、Markdown加载渲染、组件加载器、Toast通知、用户认证系统、对话框" }
    ],
    "components": [
      { "file": "assets/components/nav.html", "description": "全局导航栏组件 — 品牌链接、页面导航、用户区域、主题切换" },
      { "file": "assets/components/footer.html", "description": "全局页脚组件 — 品牌介绍、社团列表、链接导航" }
    ]
  },

  "contentFiles": {
    "home": [
      { "file": "content/home/hero.md", "description": "首页 Hero 区域内容 — 联合文社品牌标语与核心理念" },
      { "file": "content/home/about.md", "description": "关于我们 — 入驻社团列表介绍" }
    ],
    "contest": [
      { "file": "content/contest/intro.md", "description": "赛事简介 — 联合文社第二次文字创作大赛介绍" },
      { "file": "content/contest/rules.md", "description": "比赛规则 — 社团参赛人数要求、禁AI、定级制度" }
    ],
    "admin": [
      { "file": "content/admin/", "description": "预留目录，管理后台相关Markdown内容" }
    ]
  },

  "databaseTables": {
    "app_users": {
      "description": "普通用户表（前端注册用户）",
      "primaryKey": "id",
      "fields": ["id", "username", "password_hash", "pen_name", "level", "score", "banned", "ban_reason", "note", "created_at", "updated_at"],
      "uniqueConstraints": ["username"]
    },
    "admin_users": {
      "description": "管理员账号表",
      "primaryKey": "id",
      "fields": ["id", "username", "password_hash", "role(admin|super)", "alias", "created_at", "updated_at"],
      "uniqueConstraints": ["username"]
    },
    "contests": {
      "description": "文学赛事表",
      "primaryKey": "id",
      "fields": ["id", "name", "description", "theme", "start_date", "end_date", "status(active|ended)", "created_at", "updated_at"]
    },
    "manuscripts": {
      "description": "投稿稿件表（含审核字段）",
      "primaryKey": "id",
      "fields": ["id", "contest_id", "contest_name", "title", "author", "author_id", "society", "genre", "content(MEDIUMTEXT)", "work_date", "review_status", "review_score", "review_comment", "reviewer_id", "reviewer_name", "reviewer_anon", "reviewed_at", "created_at", "updated_at"],
      "foreignKeys": ["contest_id → contests.id", "author_id → app_users.id"]
    },
    "societies": {
      "description": "入驻社团表",
      "primaryKey": "id",
      "fields": ["id", "name", "leader", "member_count", "joined_year", "rating", "score", "created_at", "updated_at"],
      "uniqueConstraints": ["name"]
    },
    "members": {
      "description": "成员/写手表",
      "primaryKey": "id",
      "fields": ["id", "pen_name", "real_name", "society", "genre", "contact", "note", "rating", "score", "created_at", "updated_at"]
    },
    "judge_ratings": {
      "description": "评委评分表",
      "primaryKey": "id",
      "fields": ["id", "contest_id", "contest_name", "participant_name", "society", "judge_name", "level", "score", "comment", "rating_date", "created_at", "updated_at"],
      "foreignKeys": ["contest_id → contests.id"]
    },
    "editor_documents": {
      "description": "在线编辑器文档表",
      "primaryKey": "id",
      "fields": ["id", "user_id", "title", "content(MEDIUMTEXT)", "created_at", "updated_at"],
      "foreignKeys": ["user_id → app_users.id (CASCADE)"]
    },
    "settings": {
      "description": "系统设置键值对表",
      "primaryKey": "setting_key",
      "fields": ["setting_key", "setting_value", "updated_at"]
    },
    "ai_roles": {
      "description": "AI 角色定义表",
      "primaryKey": "id",
      "fields": ["id", "name", "provider", "model", "prompt", "temperature", "max_tokens", "active", "created_at", "updated_at"]
    },
    "ai_chat_sessions": {
      "description": "AI 对话会话表",
      "primaryKey": "id",
      "fields": ["id", "user_id", "role_id", "title", "created_at", "updated_at"],
      "foreignKeys": ["user_id → app_users.id", "role_id → ai_roles.id"]
    },
    "ai_chat_messages": {
      "description": "AI 对话消息表",
      "primaryKey": "id",
      "fields": ["id", "session_id", "role(user|assistant)", "content(TEXT)", "created_at"],
      "foreignKeys": ["session_id → ai_chat_sessions.id (CASCADE)"]
    },
    "ai_api_settings": {
      "description": "AI API 密钥配置表",
      "primaryKey": "id",
      "fields": ["id", "provider(openai|deepseek|anthropic)", "api_key", "api_url", "model", "active", "created_at", "updated_at"]
    }
  },

  "serverArchitecture": {
    "entryPoint": "server/app.js",
    "port": 3000,
    "framework": "Express 4.21.2",
    "database": "MySQL 2 (mysql2/promise)",
    "authentication": "JWT (jsonwebtoken 9.0.2, 7天过期)",
    "passwordHashing": "bcryptjs 2.4.3 (12轮)",
    "middleware": [
      "helmet — 安全HTTP头",
      "cors — 跨域请求",
      "morgan — 请求日志",
      "express.json — JSON解析",
      "auth middleware — JWT验证 (optionalAuth / requireAuth / requireAdmin / requireSuperAdmin / signToken)",
      "errorHandler — 全局错误处理（含409重复键）"
    ],
    "routes": [
      "server/routes/auth.js — 用户认证 (4个端点)",
      "server/routes/adminAuth.js — 管理员认证 (1个端点)",
      "server/routes/public.js — 公开数据 (3个端点)",
      "server/routes/ai.js — AI写作助手 (16个端点，含公开/用户/管理三级)",
      "server/routes/adminCrud.js — 管理后台CRUD (30+个端点 + 批量导入)",
      "server/routes/documents.js — 编辑器文档 (4个端点)",
      "server/routes/members.js — 成员管理 (2个端点)",
      "server/routes/submissions.js — 投稿管理 (2个端点)"
    ],
    "utils": [
      "server/utils/asyncHandler.js — 异步错误包装器",
      "server/utils/ids.js — nanoid ID生成器",
      "server/utils/passwords.js — bcryptjs密码哈希/验证"
    ]
  },

  "siteNavigation": {
    "primary": [
      { "label": "首页", "path": "/", "icon": "home" },
      { "label": "赛事", "path": "/contests.html", "icon": "trophy" },
      { "label": "AI助手", "path": "/ai.html", "icon": "sparkles" },
      { "label": "写文章", "path": "/editor.html", "icon": "edit" },
      { "label": "排行榜", "path": "/leaderboard.html", "icon": "chart" },
      { "label": "论坛", "path": "/bbs.html", "icon": "message-square" }
    ],
    "secondary": [
      { "label": "登录", "path": "/auth.html", "icon": "user" },
      { "label": "管理", "path": "/admin.html", "icon": "settings", "access": "admin" }
    ]
  },

  "designSystem": {
    "name": "联合文社 MONO 设计体系",
    "version": "2.0.0",
    "style": "暗色主题 · 0圆角 · 1px边框 · 无投影 · 无渐变 · 极简主义",
    "fonts": ["JetBrains Mono(等宽)", "Inter(系统)", "Noto Serif SC(中文衬线)"],
    "colors": {
      "dark": { "bg": "#0a0a0a", "surface": "#141414", "border": "#2a2a2a", "text": "#e0e0e0", "accent": "#ffffff" },
      "light": { "bg": "#fafafa", "surface": "#ffffff", "border": "#d0d0d0", "text": "#1a1a1a", "accent": "#000000" }
    },
    "cursor": "自定义十字光标 (dot + ring 双圆跟随)",
    "codeStyle": "代码块使用 JetBrains Mono 等宽字体"
  }
}
