commit 77a2bab985701fd6dd12118cc5cbff5d6371a99a Author: akoo Date: Tue Jan 20 08:04:15 2026 +0800 Initial commit of akmon project diff --git a/.github/copilot/mcp.json b/.github/copilot/mcp.json new file mode 100644 index 0000000..70a8598 --- /dev/null +++ b/.github/copilot/mcp.json @@ -0,0 +1,47 @@ +{ + "version": 1, + "mcpServers": { + "supabase-local": { + "command": "npx", + "args": [ + "--yes", + "-p", + "@modelcontextprotocol/server-postgres", + "mcp-server-postgres", + "${SUPABASE_DB_URL}" + ], + "env": { + "SUPABASE_DB_URL": "${env:SUPABASE_DB_URL}", + "npm_config_audit": "false" + }, + "metadata": { + "description": "Postgres access to the local Supabase instance running on 192.168.0.150", + "docs": "See .github/copilot/supabase-mcp.md for setup instructions." + } + }, + "supabase-rest": { + "command": "npx", + "args": [ + "--yes", + "@modelcontextprotocol/server-openapi", + "--spec", + "${SUPABASE_OPENAPI_SPEC}", + "--server-url", + "${SUPABASE_REST_URL}", + "--header", + "apikey: ${SUPABASE_SERVICE_ROLE_KEY}", + "--header", + "Authorization: Bearer ${SUPABASE_SERVICE_ROLE_KEY}" + ], + "env": { + "SUPABASE_OPENAPI_SPEC": "${env:SUPABASE_OPENAPI_SPEC}", + "SUPABASE_REST_URL": "${env:SUPABASE_REST_URL}", + "SUPABASE_SERVICE_ROLE_KEY": "${env:SUPABASE_SERVICE_ROLE_KEY}" + }, + "metadata": { + "description": "Supabase REST API via service_role key for internal development", + "docs": "See .github/copilot/supabase-mcp.md for instructions on generating the OpenAPI spec and required environment variables." + } + } + } +} diff --git a/.github/copilot/supabase-mcp.md b/.github/copilot/supabase-mcp.md new file mode 100644 index 0000000..1e7c62a --- /dev/null +++ b/.github/copilot/supabase-mcp.md @@ -0,0 +1,224 @@ +# Supabase MCP Server Setup + +This workspace includes Model Context Protocol configurations that let GitHub Copilot (or any other MCP-compatible client) connect straight to the Supabase stack that you are running on the local network (192.168.0.150): + +- `supabase-local` → direct Postgres connection (full SQL access). +- `supabase-rest` → Supabase REST/PostgREST API using the `service_role` key (ideal when you only have the Supabase keys and not the raw Postgres password). + +## Prerequisites + +1. **Supabase Docker stack is running** on the target host (192.168.0.150). The direct Postgres service is exposed on LAN port `6543` (it maps to container port `5432`). +2. You know the **Postgres connection password** (usually configured through the `POSTGRES_PASSWORD` environment variable in the Docker compose file). The default database created by Supabase is `postgres`. +3. Your development machine already has **Node.js ≥ 18** and can run `npx`. + +## Connection string + +Build a connection string in the format: + +``` +postgresql://postgres:@192.168.0.150:6543/postgres +``` + +For example: + +``` +postgresql://postgres.chat-local:yourStrongPassword@192.168.0.150:5432/postgres +``` + +> ⚠️ Never commit a real password to version control. Store the connection string in an environment variable instead. + +## Environment variable + +Create (or add to) an `.env` file at the workspace root with: + +``` +SUPABASE_TENANT=chat-local +SUPABASE_DB_URL=postgresql://postgres.chat-local:@192.168.0.150:5432/postgres +``` + +Then ensure the variable is loaded by your shell (e.g. `Get-Content .env | foreach { if($_ -match '^(.*?)=(.*)$'){ [System.Environment]::SetEnvironmentVariable($matches[1], $matches[2]) } }` in PowerShell, or use a dedicated dotenv loader). + +Alternatively, set it directly in the shell session before launching VS Code: + +``` +$env:SUPABASE_DB_URL = "postgresql://postgres.chat-local:@192.168.0.150:5432/postgres" +``` + +## MCP configuration + +The workspace now contains `.github/copilot/mcp.json`: + +```json +{ + "version": 1, + "mcpServers": { + "supabase-local": { + "command": "npx", + "args": [ + "--yes", + "-p", + "@modelcontextprotocol/server-postgres", + "mcp-server-postgres", + "${SUPABASE_DB_URL}" + ], + "env": { + "SUPABASE_DB_URL": "${env:SUPABASE_DB_URL}", + "npm_config_audit": "false" + }, + "metadata": { + "description": "Postgres access to the local Supabase instance running on 192.168.0.150", + "docs": "See .github/copilot/supabase-mcp.md for setup instructions." + } + }, + "supabase-rest": { + "command": "npx", + "args": [ + "--yes", + "@modelcontextprotocol/server-openapi", + "--spec", + "${SUPABASE_OPENAPI_SPEC}", + "--server-url", + "${SUPABASE_REST_URL}", + "--header", + "apikey: ${SUPABASE_SERVICE_ROLE_KEY}", + "--header", + "Authorization: Bearer ${SUPABASE_SERVICE_ROLE_KEY}" + ], + "env": { + "SUPABASE_OPENAPI_SPEC": "${env:SUPABASE_OPENAPI_SPEC}", + "SUPABASE_REST_URL": "${env:SUPABASE_REST_URL}", + "SUPABASE_SERVICE_ROLE_KEY": "${env:SUPABASE_SERVICE_ROLE_KEY}" + }, + "metadata": { + "description": "Supabase REST API via service_role key for internal development", + "docs": "See .github/copilot/supabase-mcp.md for instructions on generating the OpenAPI spec and required environment variables." + } + } + } +} +``` + +When Copilot loads this configuration it will launch: + +- The Postgres MCP server via `npx @modelcontextprotocol/server-postgres`, injecting your connection string through the `SUPABASE_DB_URL` environment variable. The server exposes SQL querying and management tools over MCP, enabling Copilot to run SQL commands directly against your Supabase database. +- The Supabase REST MCP server via `npx @modelcontextprotocol/server-openapi`. It uses the generated OpenAPI schema together with the `service_role` key to hit the PostgREST endpoints (tables, RPCs) exactly like `supabase-js` would. + +You can enable one or both servers by setting the corresponding environment variables. + +## Supabase REST (service_role) setup + +1. **Generate OpenAPI schema** (once per Supabase instance; repeat if schema changes). + + - Quick one-liner: + + ```powershell + $env:SUPABASE_SERVICE_ROLE_KEY = "" + Invoke-WebRequest ` + -Uri "http://192.168.0.150:8000/rest/v1/?apikey=$($env:SUPABASE_SERVICE_ROLE_KEY)" ` + -OutFile ".github/copilot/supabase-rest-openapi.json" + ``` + + - Or run the helper script (prompts above default): + + ```powershell + pwsh scripts/fetch-supabase-openapi.ps1 -ServiceRoleKey "" + ``` + + This downloads the PostgREST schema that reflects all tables, views, and RPC functions currently exposed by Supabase. + +2. **Add/extend `.env`** with: + + ``` + SUPABASE_REST_URL=http://192.168.0.150:8000/rest/v1 + SUPABASE_SERVICE_ROLE_KEY= + SUPABASE_OPENAPI_SPEC=${workspaceFolder}/.github/copilot/supabase-rest-openapi.json + ``` + +3. **Load variables in your shell** before launching VS Code / Copilot: + + ```powershell + $env:SUPABASE_REST_URL = "http://192.168.0.150:8000/rest/v1" + $env:SUPABASE_SERVICE_ROLE_KEY = "" + $env:SUPABASE_OPENAPI_SPEC = "$PWD/.github/copilot/supabase-rest-openapi.json" + ``` + +4. **Verify**: In the Copilot MCP panel, you should see both `supabase-local` and `supabase-rest`. Either can be disabled by omitting the required environment variables. + +## Usage + +1. Start VS Code (or the Copilot agent) *after* the environment variable is set. +2. The MCP server will be launched automatically the first time Copilot needs database access. You can verify in Copilot’s “MCP Servers” panel that `supabase-local` is running. +3. Ask Copilot to run SQL, inspect tables, or perform migrations; it will route the requests through the MCP server to Supabase/Postgres. +4. For REST workflows (e.g., hitting tables as REST endpoints, calling RPCs with structured payloads), Copilot can use `supabase-rest` to craft HTTP requests automatically based on the OpenAPI schema. + +## One-click install for all VS Code workspaces + +If you want Supabase MCP servers to be available in every VS Code workspace (without copying `.github/copilot/mcp.json` around), run the helper script once from this repository. It will: + +- Persist the required `SUPABASE_*` environment variables for your Windows user profile using `setx`. +- Merge the Supabase MCP servers into VS Code’s global Copilot config at `%APPDATA%\Code\User\globalStorage\GitHub.copilot\mcp.json`. + +```powershell +pwsh scripts\install-supabase-mcp.ps1 -ConnectionString "postgresql://postgres.chat-local:@192.168.0.150:6543/postgres" +``` + +Add `-IncludeRestServer -ServiceRoleKey "" -OpenApiSpec "C:\\path\\to\\supabase-rest-openapi.json"` if you also want the REST server registered globally. The script prompts for any missing arguments. + +After the script finishes: + +1. Restart VS Code (or run **Developer: Reload Window**) so Copilot reloads the global MCP configuration. +2. In the MCP view you should now see `supabase-local` (and optionally `supabase-rest`) even in projects that do not ship their own `mcp.json`. +3. Remember that VS Code inherits environment variables only on launch. If you change the connection string later, rerun the script and restart VS Code. + +### Manual launch (optional) + +To launch the server manually for debugging: + +```powershell +$env:SUPABASE_DB_URL = "postgresql://postgres.chat-local:yourStrongPassword@192.168.0.150:5432/postgres" +npx --yes --no-audit -p @modelcontextprotocol/server-postgres mcp-server-postgres $env:SUPABASE_DB_URL +``` + +The package publishes the executable under the name `mcp-server-postgres`, so `npx` needs the `-p` flag to install the scoped package and then run that binary. The connection string must be the first positional argument. + +> Tip: if your npm version doesn’t support the `--no-audit` switch, set the environment variable `npm_config_audit=false` (already included in `mcp.json`). This avoids `npm exec` aborting when a mirror registry doesn’t implement the audit API. + +> Note: launching the server manually in a console will exit as soon as a line like `select 1;` hits stdin. That’s expected because the MCP transport treats console keystrokes as malformed JSON. When Copilot runs the same command there’s no human typing, so the process stays up. + +## Resetting the MCP setup + +If you need to wipe the previous configuration and start from scratch: + +1. **Remove cached servers in VS Code** – open the Copilot MCP panel, stop `supabase-local`/`supabase-rest`, then click “Forget server”. +2. **Reload the environment variables** in the shell you will launch VS Code from: + ```powershell + .\scripts\load-supabase-env.ps1 + ``` +3. **Verify the tenant DSN** contains `.chat-local`: + ```powershell + Get-ChildItem Env:SUPABASE_DB_URL + ``` +4. **Reopen VS Code** (or run `Developer: Reload Window`) so Copilot ingests the fresh `.github/copilot/mcp.json`. +5. **Run a smoke test**: + ```powershell + python scripts\test_supabase_connection.py + ``` + Once this prints `Query result: 1`, trigger `SELECT 1;` from Copilot—the MCP server should respond with `[{"?column?":1}]`. + +The server will listen for MCP connections on stdin/stdout; you’ll see logs confirming connection success. + +## Security notes + +- The configuration uses a **service-level Postgres connection** (superuser). Treat the password as a secret; rotate it regularly. +- Consider creating a dedicated Postgres role with least privilege for MCP usage if you don’t need full superuser access. +- Restrict network access so only trusted machines can reach `192.168.0.150:5432`. +- On shared repositories, provide a template `.env.example` rather than real credentials. + +## Troubleshooting + +- **Connection refused**: ensure Docker stack exposes port 5432 to your LAN and that firewalls allow the traffic. +- **Authentication failed**: double-check the password in `.env` matches the one set in your Supabase Docker environment. +- **TLS/SSL errors**: the default local Supabase Postgres runs without TLS. If you enable TLS, update the connection string with `?sslmode=require` and provide the certificate parameters if needed. +- **Package not found**: run `npm install --save-dev @modelcontextprotocol/server-postgres` locally to cache the package, or allow `npx` to download it on first use. + +With this configuration in place, Copilot can manage your Supabase database over MCP without additional manual wiring. diff --git a/.github/copilot/supabase-rest-openapi.json b/.github/copilot/supabase-rest-openapi.json new file mode 100644 index 0000000..34cdb05 --- /dev/null +++ b/.github/copilot/supabase-rest-openapi.json @@ -0,0 +1 @@ +{"swagger":"2.0","info":{"description":"","title":"standard public schema","version":"12.2.12"},"host":"0.0.0.0:3000","basePath":"/","schemes":["http"],"consumes":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json","text/csv"],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json","text/csv"],"paths":{"/":{"get":{"produces":["application/openapi+json","application/json"],"responses":{"200":{"description":"OK"}},"summary":"OpenAPI description (this document)","tags":["Introspection"]}},"/ak_user_feedback":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_feedback.id"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.content"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_feedback"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户反馈表","tags":["ak_user_feedback"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_feedback"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户反馈表","tags":["ak_user_feedback"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_feedback.id"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.content"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户反馈表","tags":["ak_user_feedback"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_feedback.id"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.content"},{"$ref":"#/parameters/rowFilter.ak_user_feedback.created_at"},{"$ref":"#/parameters/body.ak_user_feedback"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户反馈表","tags":["ak_user_feedback"]}},"/ak_regions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_regions.id"},{"$ref":"#/parameters/rowFilter.ak_regions.name"},{"$ref":"#/parameters/rowFilter.ak_regions.parent_id"},{"$ref":"#/parameters/rowFilter.ak_regions.level"},{"$ref":"#/parameters/rowFilter.ak_regions.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_regions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"地区表","tags":["ak_regions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_regions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"地区表","tags":["ak_regions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_regions.id"},{"$ref":"#/parameters/rowFilter.ak_regions.name"},{"$ref":"#/parameters/rowFilter.ak_regions.parent_id"},{"$ref":"#/parameters/rowFilter.ak_regions.level"},{"$ref":"#/parameters/rowFilter.ak_regions.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"地区表","tags":["ak_regions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_regions.id"},{"$ref":"#/parameters/rowFilter.ak_regions.name"},{"$ref":"#/parameters/rowFilter.ak_regions.parent_id"},{"$ref":"#/parameters/rowFilter.ak_regions.level"},{"$ref":"#/parameters/rowFilter.ak_regions.created_at"},{"$ref":"#/parameters/body.ak_regions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"地区表","tags":["ak_regions"]}},"/ak_assignment_submissions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.assignment_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.student_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.submit_time"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.content_md"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.attachment_url"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.score"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.feedback"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.status"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_assignment_submissions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"作业提交表","tags":["ak_assignment_submissions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_assignment_submissions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"作业提交表","tags":["ak_assignment_submissions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.assignment_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.student_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.submit_time"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.content_md"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.attachment_url"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.score"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.feedback"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.status"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"作业提交表","tags":["ak_assignment_submissions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.assignment_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.student_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.submit_time"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.content_md"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.attachment_url"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.score"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.feedback"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.status"},{"$ref":"#/parameters/rowFilter.ak_assignment_submissions.updated_at"},{"$ref":"#/parameters/body.ak_assignment_submissions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"作业提交表","tags":["ak_assignment_submissions"]}},"/ak_interactions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_interactions.id"},{"$ref":"#/parameters/rowFilter.ak_interactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_interactions.target_type"},{"$ref":"#/parameters/rowFilter.ak_interactions.target_id"},{"$ref":"#/parameters/rowFilter.ak_interactions.interaction_type"},{"$ref":"#/parameters/rowFilter.ak_interactions.content"},{"$ref":"#/parameters/rowFilter.ak_interactions.created_at"},{"$ref":"#/parameters/rowFilter.ak_interactions.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_interactions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"互动记录表","tags":["ak_interactions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_interactions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"互动记录表","tags":["ak_interactions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_interactions.id"},{"$ref":"#/parameters/rowFilter.ak_interactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_interactions.target_type"},{"$ref":"#/parameters/rowFilter.ak_interactions.target_id"},{"$ref":"#/parameters/rowFilter.ak_interactions.interaction_type"},{"$ref":"#/parameters/rowFilter.ak_interactions.content"},{"$ref":"#/parameters/rowFilter.ak_interactions.created_at"},{"$ref":"#/parameters/rowFilter.ak_interactions.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"互动记录表","tags":["ak_interactions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_interactions.id"},{"$ref":"#/parameters/rowFilter.ak_interactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_interactions.target_type"},{"$ref":"#/parameters/rowFilter.ak_interactions.target_id"},{"$ref":"#/parameters/rowFilter.ak_interactions.interaction_type"},{"$ref":"#/parameters/rowFilter.ak_interactions.content"},{"$ref":"#/parameters/rowFilter.ak_interactions.created_at"},{"$ref":"#/parameters/rowFilter.ak_interactions.updated_at"},{"$ref":"#/parameters/body.ak_interactions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"互动记录表","tags":["ak_interactions"]}},"/ak_teacher_roles":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_teacher_roles.id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.user_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.school_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.class_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.role"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_teacher_roles"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"老师权限管理表","tags":["ak_teacher_roles"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_teacher_roles"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"老师权限管理表","tags":["ak_teacher_roles"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_teacher_roles.id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.user_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.school_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.class_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.role"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"老师权限管理表","tags":["ak_teacher_roles"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_teacher_roles.id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.user_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.school_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.class_id"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.role"},{"$ref":"#/parameters/rowFilter.ak_teacher_roles.created_at"},{"$ref":"#/parameters/body.ak_teacher_roles"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"老师权限管理表","tags":["ak_teacher_roles"]}},"/ak_devices":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_devices.id"},{"$ref":"#/parameters/rowFilter.ak_devices.user_id"},{"$ref":"#/parameters/rowFilter.ak_devices.device_type"},{"$ref":"#/parameters/rowFilter.ak_devices.device_name"},{"$ref":"#/parameters/rowFilter.ak_devices.device_mac"},{"$ref":"#/parameters/rowFilter.ak_devices.bind_time"},{"$ref":"#/parameters/rowFilter.ak_devices.status"},{"$ref":"#/parameters/rowFilter.ak_devices.extra"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_devices"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"设备表","tags":["ak_devices"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_devices"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"设备表","tags":["ak_devices"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_devices.id"},{"$ref":"#/parameters/rowFilter.ak_devices.user_id"},{"$ref":"#/parameters/rowFilter.ak_devices.device_type"},{"$ref":"#/parameters/rowFilter.ak_devices.device_name"},{"$ref":"#/parameters/rowFilter.ak_devices.device_mac"},{"$ref":"#/parameters/rowFilter.ak_devices.bind_time"},{"$ref":"#/parameters/rowFilter.ak_devices.status"},{"$ref":"#/parameters/rowFilter.ak_devices.extra"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"设备表","tags":["ak_devices"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_devices.id"},{"$ref":"#/parameters/rowFilter.ak_devices.user_id"},{"$ref":"#/parameters/rowFilter.ak_devices.device_type"},{"$ref":"#/parameters/rowFilter.ak_devices.device_name"},{"$ref":"#/parameters/rowFilter.ak_devices.device_mac"},{"$ref":"#/parameters/rowFilter.ak_devices.bind_time"},{"$ref":"#/parameters/rowFilter.ak_devices.status"},{"$ref":"#/parameters/rowFilter.ak_devices.extra"},{"$ref":"#/parameters/body.ak_devices"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"设备表","tags":["ak_devices"]}},"/ak_review_queue":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_review_queue.id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.content_id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.translation_id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_type"},{"$ref":"#/parameters/rowFilter.ak_review_queue.priority"},{"$ref":"#/parameters/rowFilter.ak_review_queue.reason"},{"$ref":"#/parameters/rowFilter.ak_review_queue.ai_confidence"},{"$ref":"#/parameters/rowFilter.ak_review_queue.requested_by"},{"$ref":"#/parameters/rowFilter.ak_review_queue.assigned_to"},{"$ref":"#/parameters/rowFilter.ak_review_queue.status"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_notes"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_result"},{"$ref":"#/parameters/rowFilter.ak_review_queue.completed_at"},{"$ref":"#/parameters/rowFilter.ak_review_queue.created_at"},{"$ref":"#/parameters/rowFilter.ak_review_queue.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_review_queue"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"人工审核队列表","tags":["ak_review_queue"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_review_queue"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"人工审核队列表","tags":["ak_review_queue"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_review_queue.id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.content_id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.translation_id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_type"},{"$ref":"#/parameters/rowFilter.ak_review_queue.priority"},{"$ref":"#/parameters/rowFilter.ak_review_queue.reason"},{"$ref":"#/parameters/rowFilter.ak_review_queue.ai_confidence"},{"$ref":"#/parameters/rowFilter.ak_review_queue.requested_by"},{"$ref":"#/parameters/rowFilter.ak_review_queue.assigned_to"},{"$ref":"#/parameters/rowFilter.ak_review_queue.status"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_notes"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_result"},{"$ref":"#/parameters/rowFilter.ak_review_queue.completed_at"},{"$ref":"#/parameters/rowFilter.ak_review_queue.created_at"},{"$ref":"#/parameters/rowFilter.ak_review_queue.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"人工审核队列表","tags":["ak_review_queue"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_review_queue.id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.content_id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.translation_id"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_type"},{"$ref":"#/parameters/rowFilter.ak_review_queue.priority"},{"$ref":"#/parameters/rowFilter.ak_review_queue.reason"},{"$ref":"#/parameters/rowFilter.ak_review_queue.ai_confidence"},{"$ref":"#/parameters/rowFilter.ak_review_queue.requested_by"},{"$ref":"#/parameters/rowFilter.ak_review_queue.assigned_to"},{"$ref":"#/parameters/rowFilter.ak_review_queue.status"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_notes"},{"$ref":"#/parameters/rowFilter.ak_review_queue.review_result"},{"$ref":"#/parameters/rowFilter.ak_review_queue.completed_at"},{"$ref":"#/parameters/rowFilter.ak_review_queue.created_at"},{"$ref":"#/parameters/rowFilter.ak_review_queue.updated_at"},{"$ref":"#/parameters/body.ak_review_queue"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"人工审核队列表","tags":["ak_review_queue"]}},"/ak_permissions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_permissions.id"},{"$ref":"#/parameters/rowFilter.ak_permissions.code"},{"$ref":"#/parameters/rowFilter.ak_permissions.name"},{"$ref":"#/parameters/rowFilter.ak_permissions.description"},{"$ref":"#/parameters/rowFilter.ak_permissions.resource_type"},{"$ref":"#/parameters/rowFilter.ak_permissions.action"},{"$ref":"#/parameters/rowFilter.ak_permissions.is_system"},{"$ref":"#/parameters/rowFilter.ak_permissions.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_permissions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"权限定义表","tags":["ak_permissions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_permissions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"权限定义表","tags":["ak_permissions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_permissions.id"},{"$ref":"#/parameters/rowFilter.ak_permissions.code"},{"$ref":"#/parameters/rowFilter.ak_permissions.name"},{"$ref":"#/parameters/rowFilter.ak_permissions.description"},{"$ref":"#/parameters/rowFilter.ak_permissions.resource_type"},{"$ref":"#/parameters/rowFilter.ak_permissions.action"},{"$ref":"#/parameters/rowFilter.ak_permissions.is_system"},{"$ref":"#/parameters/rowFilter.ak_permissions.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"权限定义表","tags":["ak_permissions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_permissions.id"},{"$ref":"#/parameters/rowFilter.ak_permissions.code"},{"$ref":"#/parameters/rowFilter.ak_permissions.name"},{"$ref":"#/parameters/rowFilter.ak_permissions.description"},{"$ref":"#/parameters/rowFilter.ak_permissions.resource_type"},{"$ref":"#/parameters/rowFilter.ak_permissions.action"},{"$ref":"#/parameters/rowFilter.ak_permissions.is_system"},{"$ref":"#/parameters/rowFilter.ak_permissions.created_at"},{"$ref":"#/parameters/body.ak_permissions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"权限定义表","tags":["ak_permissions"]}},"/ak_device_events":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_device_events.id"},{"$ref":"#/parameters/rowFilter.ak_device_events.device_id"},{"$ref":"#/parameters/rowFilter.ak_device_events.event_type"},{"$ref":"#/parameters/rowFilter.ak_device_events.event_time"},{"$ref":"#/parameters/rowFilter.ak_device_events.data"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_device_events"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"设备事件日志表","tags":["ak_device_events"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_device_events"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"设备事件日志表","tags":["ak_device_events"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_device_events.id"},{"$ref":"#/parameters/rowFilter.ak_device_events.device_id"},{"$ref":"#/parameters/rowFilter.ak_device_events.event_type"},{"$ref":"#/parameters/rowFilter.ak_device_events.event_time"},{"$ref":"#/parameters/rowFilter.ak_device_events.data"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"设备事件日志表","tags":["ak_device_events"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_device_events.id"},{"$ref":"#/parameters/rowFilter.ak_device_events.device_id"},{"$ref":"#/parameters/rowFilter.ak_device_events.event_type"},{"$ref":"#/parameters/rowFilter.ak_device_events.event_time"},{"$ref":"#/parameters/rowFilter.ak_device_events.data"},{"$ref":"#/parameters/body.ak_device_events"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"设备事件日志表","tags":["ak_device_events"]}},"/ak_cost_limits":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_cost_limits.id"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_type"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_scope"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.scope_id"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_amount"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.current_usage"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.period_start"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.period_end"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.is_active"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.alert_threshold"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.created_at"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_cost_limits"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"成本控制限额表","tags":["ak_cost_limits"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_cost_limits"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"成本控制限额表","tags":["ak_cost_limits"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_cost_limits.id"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_type"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_scope"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.scope_id"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_amount"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.current_usage"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.period_start"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.period_end"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.is_active"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.alert_threshold"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.created_at"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"成本控制限额表","tags":["ak_cost_limits"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_cost_limits.id"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_type"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_scope"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.scope_id"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.limit_amount"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.current_usage"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.period_start"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.period_end"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.is_active"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.alert_threshold"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.created_at"},{"$ref":"#/parameters/rowFilter.ak_cost_limits.updated_at"},{"$ref":"#/parameters/body.ak_cost_limits"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"成本控制限额表","tags":["ak_cost_limits"]}},"/ak_point_rules":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_point_rules.id"},{"$ref":"#/parameters/rowFilter.ak_point_rules.rule_name"},{"$ref":"#/parameters/rowFilter.ak_point_rules.event_code"},{"$ref":"#/parameters/rowFilter.ak_point_rules.points"},{"$ref":"#/parameters/rowFilter.ak_point_rules.limit_per_day"},{"$ref":"#/parameters/rowFilter.ak_point_rules.description"},{"$ref":"#/parameters/rowFilter.ak_point_rules.is_active"},{"$ref":"#/parameters/rowFilter.ak_point_rules.created_at"},{"$ref":"#/parameters/rowFilter.ak_point_rules.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_point_rules"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"积分规则表","tags":["ak_point_rules"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_point_rules"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"积分规则表","tags":["ak_point_rules"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_point_rules.id"},{"$ref":"#/parameters/rowFilter.ak_point_rules.rule_name"},{"$ref":"#/parameters/rowFilter.ak_point_rules.event_code"},{"$ref":"#/parameters/rowFilter.ak_point_rules.points"},{"$ref":"#/parameters/rowFilter.ak_point_rules.limit_per_day"},{"$ref":"#/parameters/rowFilter.ak_point_rules.description"},{"$ref":"#/parameters/rowFilter.ak_point_rules.is_active"},{"$ref":"#/parameters/rowFilter.ak_point_rules.created_at"},{"$ref":"#/parameters/rowFilter.ak_point_rules.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分规则表","tags":["ak_point_rules"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_point_rules.id"},{"$ref":"#/parameters/rowFilter.ak_point_rules.rule_name"},{"$ref":"#/parameters/rowFilter.ak_point_rules.event_code"},{"$ref":"#/parameters/rowFilter.ak_point_rules.points"},{"$ref":"#/parameters/rowFilter.ak_point_rules.limit_per_day"},{"$ref":"#/parameters/rowFilter.ak_point_rules.description"},{"$ref":"#/parameters/rowFilter.ak_point_rules.is_active"},{"$ref":"#/parameters/rowFilter.ak_point_rules.created_at"},{"$ref":"#/parameters/rowFilter.ak_point_rules.updated_at"},{"$ref":"#/parameters/body.ak_point_rules"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分规则表","tags":["ak_point_rules"]}},"/ak_user_points":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_points.id"},{"$ref":"#/parameters/rowFilter.ak_user_points.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_points.total_points"},{"$ref":"#/parameters/rowFilter.ak_user_points.available_points"},{"$ref":"#/parameters/rowFilter.ak_user_points.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_points"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"积分账户表","tags":["ak_user_points"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_points"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"积分账户表","tags":["ak_user_points"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_points.id"},{"$ref":"#/parameters/rowFilter.ak_user_points.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_points.total_points"},{"$ref":"#/parameters/rowFilter.ak_user_points.available_points"},{"$ref":"#/parameters/rowFilter.ak_user_points.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分账户表","tags":["ak_user_points"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_points.id"},{"$ref":"#/parameters/rowFilter.ak_user_points.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_points.total_points"},{"$ref":"#/parameters/rowFilter.ak_user_points.available_points"},{"$ref":"#/parameters/rowFilter.ak_user_points.updated_at"},{"$ref":"#/parameters/body.ak_user_points"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分账户表","tags":["ak_user_points"]}},"/ak_user_profiles":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_profiles.id"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.avatar_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.background_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.declaration"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.status_text"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.status_media_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_profiles"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户兴趣画像表","tags":["ak_user_profiles"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_profiles"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户兴趣画像表","tags":["ak_user_profiles"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_profiles.id"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.avatar_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.background_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.declaration"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.status_text"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.status_media_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户兴趣画像表","tags":["ak_user_profiles"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_profiles.id"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.avatar_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.background_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.declaration"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.status_text"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.status_media_url"},{"$ref":"#/parameters/rowFilter.ak_user_profiles.updated_at"},{"$ref":"#/parameters/body.ak_user_profiles"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户兴趣画像表","tags":["ak_user_profiles"]}},"/ak_recommendations":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_recommendations.id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.user_id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.content_id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.algorithm_type"},{"$ref":"#/parameters/rowFilter.ak_recommendations.score"},{"$ref":"#/parameters/rowFilter.ak_recommendations.reason"},{"$ref":"#/parameters/rowFilter.ak_recommendations.position"},{"$ref":"#/parameters/rowFilter.ak_recommendations.shown_at"},{"$ref":"#/parameters/rowFilter.ak_recommendations.clicked_at"},{"$ref":"#/parameters/rowFilter.ak_recommendations.feedback_score"},{"$ref":"#/parameters/rowFilter.ak_recommendations.feedback_reason"},{"$ref":"#/parameters/rowFilter.ak_recommendations.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_recommendations"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"推荐记录表","tags":["ak_recommendations"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_recommendations"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"推荐记录表","tags":["ak_recommendations"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_recommendations.id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.user_id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.content_id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.algorithm_type"},{"$ref":"#/parameters/rowFilter.ak_recommendations.score"},{"$ref":"#/parameters/rowFilter.ak_recommendations.reason"},{"$ref":"#/parameters/rowFilter.ak_recommendations.position"},{"$ref":"#/parameters/rowFilter.ak_recommendations.shown_at"},{"$ref":"#/parameters/rowFilter.ak_recommendations.clicked_at"},{"$ref":"#/parameters/rowFilter.ak_recommendations.feedback_score"},{"$ref":"#/parameters/rowFilter.ak_recommendations.feedback_reason"},{"$ref":"#/parameters/rowFilter.ak_recommendations.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"推荐记录表","tags":["ak_recommendations"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_recommendations.id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.user_id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.content_id"},{"$ref":"#/parameters/rowFilter.ak_recommendations.algorithm_type"},{"$ref":"#/parameters/rowFilter.ak_recommendations.score"},{"$ref":"#/parameters/rowFilter.ak_recommendations.reason"},{"$ref":"#/parameters/rowFilter.ak_recommendations.position"},{"$ref":"#/parameters/rowFilter.ak_recommendations.shown_at"},{"$ref":"#/parameters/rowFilter.ak_recommendations.clicked_at"},{"$ref":"#/parameters/rowFilter.ak_recommendations.feedback_score"},{"$ref":"#/parameters/rowFilter.ak_recommendations.feedback_reason"},{"$ref":"#/parameters/rowFilter.ak_recommendations.created_at"},{"$ref":"#/parameters/body.ak_recommendations"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"推荐记录表","tags":["ak_recommendations"]}},"/vw_multilingual_contents":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.id"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.original_title"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.original_content"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.original_summary"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.original_language"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.category_id"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.category_name"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.quality_score"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.published_at"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.status"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.view_count"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.like_count"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.share_count"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.translations"},{"$ref":"#/parameters/rowFilter.vw_multilingual_contents.ai_tags"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/vw_multilingual_contents"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"多语言内容聚合视图","tags":["vw_multilingual_contents"]}},"/ak_favorite_folders":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_favorite_folders.id"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.user_id"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.name"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.description"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.icon"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.color"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.display_order"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.is_default"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.is_public"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.item_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.created_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_favorite_folders"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"收藏夹表","tags":["ak_favorite_folders"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_favorite_folders"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"收藏夹表","tags":["ak_favorite_folders"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_favorite_folders.id"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.user_id"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.name"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.description"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.icon"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.color"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.display_order"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.is_default"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.is_public"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.item_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.created_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"收藏夹表","tags":["ak_favorite_folders"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_favorite_folders.id"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.user_id"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.name"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.description"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.icon"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.color"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.display_order"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.is_default"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.is_public"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.item_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.created_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_folders.updated_at"},{"$ref":"#/parameters/body.ak_favorite_folders"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"收藏夹表","tags":["ak_favorite_folders"]}},"/ak_class_schedules":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_class_schedules.id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.school_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.class_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.subject"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.day_of_week"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.start_time"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.end_time"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.location"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.created_at"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_class_schedules"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"课程安排表","tags":["ak_class_schedules"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_class_schedules"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"课程安排表","tags":["ak_class_schedules"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_class_schedules.id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.school_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.class_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.subject"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.day_of_week"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.start_time"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.end_time"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.location"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.created_at"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"课程安排表","tags":["ak_class_schedules"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_class_schedules.id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.school_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.class_id"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.subject"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.day_of_week"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.start_time"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.end_time"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.location"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.created_at"},{"$ref":"#/parameters/rowFilter.ak_class_schedules.updated_at"},{"$ref":"#/parameters/body.ak_class_schedules"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"课程安排表","tags":["ak_class_schedules"]}},"/ak_topics":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topics.id"},{"$ref":"#/parameters/rowFilter.ak_topics.title"},{"$ref":"#/parameters/rowFilter.ak_topics.description"},{"$ref":"#/parameters/rowFilter.ak_topics.topic_type"},{"$ref":"#/parameters/rowFilter.ak_topics.status"},{"$ref":"#/parameters/rowFilter.ak_topics.cover_image_url"},{"$ref":"#/parameters/rowFilter.ak_topics.creator_id"},{"$ref":"#/parameters/rowFilter.ak_topics.editor_id"},{"$ref":"#/parameters/rowFilter.ak_topics.content_count"},{"$ref":"#/parameters/rowFilter.ak_topics.view_count"},{"$ref":"#/parameters/rowFilter.ak_topics.like_count"},{"$ref":"#/parameters/rowFilter.ak_topics.share_count"},{"$ref":"#/parameters/rowFilter.ak_topics.comment_count"},{"$ref":"#/parameters/rowFilter.ak_topics.subscriber_count"},{"$ref":"#/parameters/rowFilter.ak_topics.last_content_added_at"},{"$ref":"#/parameters/rowFilter.ak_topics.featured_until"},{"$ref":"#/parameters/rowFilter.ak_topics.meta_keywords"},{"$ref":"#/parameters/rowFilter.ak_topics.meta_description"},{"$ref":"#/parameters/rowFilter.ak_topics.seo_slug"},{"$ref":"#/parameters/rowFilter.ak_topics.priority_level"},{"$ref":"#/parameters/rowFilter.ak_topics.tags"},{"$ref":"#/parameters/rowFilter.ak_topics.created_at"},{"$ref":"#/parameters/rowFilter.ak_topics.updated_at"},{"$ref":"#/parameters/rowFilter.ak_topics.favorite_count"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_topics"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"专题表","tags":["ak_topics"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_topics"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"专题表","tags":["ak_topics"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topics.id"},{"$ref":"#/parameters/rowFilter.ak_topics.title"},{"$ref":"#/parameters/rowFilter.ak_topics.description"},{"$ref":"#/parameters/rowFilter.ak_topics.topic_type"},{"$ref":"#/parameters/rowFilter.ak_topics.status"},{"$ref":"#/parameters/rowFilter.ak_topics.cover_image_url"},{"$ref":"#/parameters/rowFilter.ak_topics.creator_id"},{"$ref":"#/parameters/rowFilter.ak_topics.editor_id"},{"$ref":"#/parameters/rowFilter.ak_topics.content_count"},{"$ref":"#/parameters/rowFilter.ak_topics.view_count"},{"$ref":"#/parameters/rowFilter.ak_topics.like_count"},{"$ref":"#/parameters/rowFilter.ak_topics.share_count"},{"$ref":"#/parameters/rowFilter.ak_topics.comment_count"},{"$ref":"#/parameters/rowFilter.ak_topics.subscriber_count"},{"$ref":"#/parameters/rowFilter.ak_topics.last_content_added_at"},{"$ref":"#/parameters/rowFilter.ak_topics.featured_until"},{"$ref":"#/parameters/rowFilter.ak_topics.meta_keywords"},{"$ref":"#/parameters/rowFilter.ak_topics.meta_description"},{"$ref":"#/parameters/rowFilter.ak_topics.seo_slug"},{"$ref":"#/parameters/rowFilter.ak_topics.priority_level"},{"$ref":"#/parameters/rowFilter.ak_topics.tags"},{"$ref":"#/parameters/rowFilter.ak_topics.created_at"},{"$ref":"#/parameters/rowFilter.ak_topics.updated_at"},{"$ref":"#/parameters/rowFilter.ak_topics.favorite_count"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"专题表","tags":["ak_topics"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topics.id"},{"$ref":"#/parameters/rowFilter.ak_topics.title"},{"$ref":"#/parameters/rowFilter.ak_topics.description"},{"$ref":"#/parameters/rowFilter.ak_topics.topic_type"},{"$ref":"#/parameters/rowFilter.ak_topics.status"},{"$ref":"#/parameters/rowFilter.ak_topics.cover_image_url"},{"$ref":"#/parameters/rowFilter.ak_topics.creator_id"},{"$ref":"#/parameters/rowFilter.ak_topics.editor_id"},{"$ref":"#/parameters/rowFilter.ak_topics.content_count"},{"$ref":"#/parameters/rowFilter.ak_topics.view_count"},{"$ref":"#/parameters/rowFilter.ak_topics.like_count"},{"$ref":"#/parameters/rowFilter.ak_topics.share_count"},{"$ref":"#/parameters/rowFilter.ak_topics.comment_count"},{"$ref":"#/parameters/rowFilter.ak_topics.subscriber_count"},{"$ref":"#/parameters/rowFilter.ak_topics.last_content_added_at"},{"$ref":"#/parameters/rowFilter.ak_topics.featured_until"},{"$ref":"#/parameters/rowFilter.ak_topics.meta_keywords"},{"$ref":"#/parameters/rowFilter.ak_topics.meta_description"},{"$ref":"#/parameters/rowFilter.ak_topics.seo_slug"},{"$ref":"#/parameters/rowFilter.ak_topics.priority_level"},{"$ref":"#/parameters/rowFilter.ak_topics.tags"},{"$ref":"#/parameters/rowFilter.ak_topics.created_at"},{"$ref":"#/parameters/rowFilter.ak_topics.updated_at"},{"$ref":"#/parameters/rowFilter.ak_topics.favorite_count"},{"$ref":"#/parameters/body.ak_topics"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"专题表","tags":["ak_topics"]}},"/ak_user_behaviors":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_behaviors.id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.content_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.behavior_type"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.behavior_data"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.duration_seconds"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.scroll_percentage"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.device_type"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.source"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.session_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.ip_address"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.user_agent"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_behaviors"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户行为记录表","tags":["ak_user_behaviors"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_behaviors"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户行为记录表","tags":["ak_user_behaviors"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_behaviors.id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.content_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.behavior_type"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.behavior_data"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.duration_seconds"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.scroll_percentage"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.device_type"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.source"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.session_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.ip_address"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.user_agent"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户行为记录表","tags":["ak_user_behaviors"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_behaviors.id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.content_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.behavior_type"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.behavior_data"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.duration_seconds"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.scroll_percentage"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.device_type"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.source"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.session_id"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.ip_address"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.user_agent"},{"$ref":"#/parameters/rowFilter.ak_user_behaviors.created_at"},{"$ref":"#/parameters/body.ak_user_behaviors"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户行为记录表","tags":["ak_user_behaviors"]}},"/ak_app_translations":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_app_translations.key"},{"$ref":"#/parameters/rowFilter.ak_app_translations.text"},{"$ref":"#/parameters/rowFilter.ak_app_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_app_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_app_translations.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_app_translations"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"应用翻译表(前端界面文本)","tags":["ak_app_translations"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_app_translations"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"应用翻译表(前端界面文本)","tags":["ak_app_translations"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_app_translations.key"},{"$ref":"#/parameters/rowFilter.ak_app_translations.text"},{"$ref":"#/parameters/rowFilter.ak_app_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_app_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_app_translations.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"应用翻译表(前端界面文本)","tags":["ak_app_translations"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_app_translations.key"},{"$ref":"#/parameters/rowFilter.ak_app_translations.text"},{"$ref":"#/parameters/rowFilter.ak_app_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_app_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_app_translations.updated_at"},{"$ref":"#/parameters/body.ak_app_translations"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"应用翻译表(前端界面文本)","tags":["ak_app_translations"]}},"/ak_ai_usage_stats":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.id"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.user_id"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.service_type"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.model_name"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.requests_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.success_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.error_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.date_bucket"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_ai_usage_stats"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"AI服务使用统计表","tags":["ak_ai_usage_stats"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_ai_usage_stats"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"AI服务使用统计表","tags":["ak_ai_usage_stats"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.id"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.user_id"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.service_type"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.model_name"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.requests_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.success_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.error_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.date_bucket"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI服务使用统计表","tags":["ak_ai_usage_stats"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.id"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.user_id"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.service_type"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.model_name"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.requests_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.success_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.error_count"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.date_bucket"},{"$ref":"#/parameters/rowFilter.ak_ai_usage_stats.created_at"},{"$ref":"#/parameters/body.ak_ai_usage_stats"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI服务使用统计表","tags":["ak_ai_usage_stats"]}},"/ak_teaching_resources":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_teaching_resources.id"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.type"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.title"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.description"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.content_url"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.tags"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.is_public"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.created_at"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_teaching_resources"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"教学资源表","tags":["ak_teaching_resources"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_teaching_resources"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"教学资源表","tags":["ak_teaching_resources"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_teaching_resources.id"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.type"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.title"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.description"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.content_url"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.tags"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.is_public"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.created_at"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"教学资源表","tags":["ak_teaching_resources"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_teaching_resources.id"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.type"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.title"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.description"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.content_url"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.tags"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.is_public"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.created_at"},{"$ref":"#/parameters/rowFilter.ak_teaching_resources.updated_at"},{"$ref":"#/parameters/body.ak_teaching_resources"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"教学资源表","tags":["ak_teaching_resources"]}},"/ak_training_plans":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_plans.id"},{"$ref":"#/parameters/rowFilter.ak_training_plans.user_id"},{"$ref":"#/parameters/rowFilter.ak_training_plans.plan_name"},{"$ref":"#/parameters/rowFilter.ak_training_plans.description"},{"$ref":"#/parameters/rowFilter.ak_training_plans.start_date"},{"$ref":"#/parameters/rowFilter.ak_training_plans.end_date"},{"$ref":"#/parameters/rowFilter.ak_training_plans.status"},{"$ref":"#/parameters/rowFilter.ak_training_plans.created_at"},{"$ref":"#/parameters/rowFilter.ak_training_plans.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_training_plans"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"训练计划表","tags":["ak_training_plans"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_training_plans"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"训练计划表","tags":["ak_training_plans"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_plans.id"},{"$ref":"#/parameters/rowFilter.ak_training_plans.user_id"},{"$ref":"#/parameters/rowFilter.ak_training_plans.plan_name"},{"$ref":"#/parameters/rowFilter.ak_training_plans.description"},{"$ref":"#/parameters/rowFilter.ak_training_plans.start_date"},{"$ref":"#/parameters/rowFilter.ak_training_plans.end_date"},{"$ref":"#/parameters/rowFilter.ak_training_plans.status"},{"$ref":"#/parameters/rowFilter.ak_training_plans.created_at"},{"$ref":"#/parameters/rowFilter.ak_training_plans.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"训练计划表","tags":["ak_training_plans"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_plans.id"},{"$ref":"#/parameters/rowFilter.ak_training_plans.user_id"},{"$ref":"#/parameters/rowFilter.ak_training_plans.plan_name"},{"$ref":"#/parameters/rowFilter.ak_training_plans.description"},{"$ref":"#/parameters/rowFilter.ak_training_plans.start_date"},{"$ref":"#/parameters/rowFilter.ak_training_plans.end_date"},{"$ref":"#/parameters/rowFilter.ak_training_plans.status"},{"$ref":"#/parameters/rowFilter.ak_training_plans.created_at"},{"$ref":"#/parameters/rowFilter.ak_training_plans.updated_at"},{"$ref":"#/parameters/body.ak_training_plans"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"训练计划表","tags":["ak_training_plans"]}},"/ak_classes":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_classes.id"},{"$ref":"#/parameters/rowFilter.ak_classes.grade_id"},{"$ref":"#/parameters/rowFilter.ak_classes.name"},{"$ref":"#/parameters/rowFilter.ak_classes.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_classes"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"班级表","tags":["ak_classes"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_classes"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"班级表","tags":["ak_classes"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_classes.id"},{"$ref":"#/parameters/rowFilter.ak_classes.grade_id"},{"$ref":"#/parameters/rowFilter.ak_classes.name"},{"$ref":"#/parameters/rowFilter.ak_classes.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"班级表","tags":["ak_classes"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_classes.id"},{"$ref":"#/parameters/rowFilter.ak_classes.grade_id"},{"$ref":"#/parameters/rowFilter.ak_classes.name"},{"$ref":"#/parameters/rowFilter.ak_classes.created_at"},{"$ref":"#/parameters/body.ak_classes"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"班级表","tags":["ak_classes"]}},"/ak_sport_reports":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_sport_reports.id"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.user_id"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.title"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.content_md"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.cover_url"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.visibility"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.visible_until"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.allow_comment"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.created_at"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_sport_reports"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"运动报告表","tags":["ak_sport_reports"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_sport_reports"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"运动报告表","tags":["ak_sport_reports"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_sport_reports.id"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.user_id"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.title"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.content_md"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.cover_url"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.visibility"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.visible_until"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.allow_comment"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.created_at"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"运动报告表","tags":["ak_sport_reports"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_sport_reports.id"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.user_id"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.title"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.content_md"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.cover_url"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.visibility"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.visible_until"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.allow_comment"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.created_at"},{"$ref":"#/parameters/rowFilter.ak_sport_reports.updated_at"},{"$ref":"#/parameters/body.ak_sport_reports"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"运动报告表","tags":["ak_sport_reports"]}},"/ak_comment_reactions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_reactions.id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.reaction_type"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_comment_reactions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"评论反应表(点赞、踩等)","tags":["ak_comment_reactions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_comment_reactions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"评论反应表(点赞、踩等)","tags":["ak_comment_reactions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_reactions.id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.reaction_type"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论反应表(点赞、踩等)","tags":["ak_comment_reactions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_reactions.id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.reaction_type"},{"$ref":"#/parameters/rowFilter.ak_comment_reactions.created_at"},{"$ref":"#/parameters/body.ak_comment_reactions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论反应表(点赞、踩等)","tags":["ak_comment_reactions"]}},"/ak_comment_reports":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_reports.id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reporter_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.report_type"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.report_reason"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.status"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reviewed_by"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reviewed_at"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.review_notes"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.action_taken"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_comment_reports"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"评论举报表","tags":["ak_comment_reports"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_comment_reports"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"评论举报表","tags":["ak_comment_reports"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_reports.id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reporter_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.report_type"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.report_reason"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.status"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reviewed_by"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reviewed_at"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.review_notes"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.action_taken"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论举报表","tags":["ak_comment_reports"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_reports.id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reporter_id"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.report_type"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.report_reason"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.status"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reviewed_by"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.reviewed_at"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.review_notes"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.action_taken"},{"$ref":"#/parameters/rowFilter.ak_comment_reports.created_at"},{"$ref":"#/parameters/body.ak_comment_reports"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论举报表","tags":["ak_comment_reports"]}},"/ak_content_translations":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_translations.id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.title"},{"$ref":"#/parameters/rowFilter.ak_content_translations.content"},{"$ref":"#/parameters/rowFilter.ak_content_translations.summary"},{"$ref":"#/parameters/rowFilter.ak_content_translations.translation_method"},{"$ref":"#/parameters/rowFilter.ak_content_translations.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_translations.quality_score"},{"$ref":"#/parameters/rowFilter.ak_content_translations.ai_confidence"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified_by"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified_at"},{"$ref":"#/parameters/rowFilter.ak_content_translations.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_content_translations.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_content_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_translations.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_translations"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容翻译表","tags":["ak_content_translations"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_translations"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容翻译表","tags":["ak_content_translations"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_translations.id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.title"},{"$ref":"#/parameters/rowFilter.ak_content_translations.content"},{"$ref":"#/parameters/rowFilter.ak_content_translations.summary"},{"$ref":"#/parameters/rowFilter.ak_content_translations.translation_method"},{"$ref":"#/parameters/rowFilter.ak_content_translations.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_translations.quality_score"},{"$ref":"#/parameters/rowFilter.ak_content_translations.ai_confidence"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified_by"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified_at"},{"$ref":"#/parameters/rowFilter.ak_content_translations.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_content_translations.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_content_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_translations.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容翻译表","tags":["ak_content_translations"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_translations.id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_content_translations.title"},{"$ref":"#/parameters/rowFilter.ak_content_translations.content"},{"$ref":"#/parameters/rowFilter.ak_content_translations.summary"},{"$ref":"#/parameters/rowFilter.ak_content_translations.translation_method"},{"$ref":"#/parameters/rowFilter.ak_content_translations.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_translations.quality_score"},{"$ref":"#/parameters/rowFilter.ak_content_translations.ai_confidence"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified_by"},{"$ref":"#/parameters/rowFilter.ak_content_translations.human_verified_at"},{"$ref":"#/parameters/rowFilter.ak_content_translations.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_content_translations.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_content_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_translations.updated_at"},{"$ref":"#/parameters/body.ak_content_translations"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容翻译表","tags":["ak_content_translations"]}},"/ak_database_versions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_database_versions.id"},{"$ref":"#/parameters/rowFilter.ak_database_versions.version"},{"$ref":"#/parameters/rowFilter.ak_database_versions.description"},{"$ref":"#/parameters/rowFilter.ak_database_versions.applied_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_database_versions"},"type":"array"}},"206":{"description":"Partial Content"}},"tags":["ak_database_versions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_database_versions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"tags":["ak_database_versions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_database_versions.id"},{"$ref":"#/parameters/rowFilter.ak_database_versions.version"},{"$ref":"#/parameters/rowFilter.ak_database_versions.description"},{"$ref":"#/parameters/rowFilter.ak_database_versions.applied_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"tags":["ak_database_versions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_database_versions.id"},{"$ref":"#/parameters/rowFilter.ak_database_versions.version"},{"$ref":"#/parameters/rowFilter.ak_database_versions.description"},{"$ref":"#/parameters/rowFilter.ak_database_versions.applied_at"},{"$ref":"#/parameters/body.ak_database_versions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"tags":["ak_database_versions"]}},"/ak_sport_report_shares":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.id"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.report_id"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.shared_by"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.shared_to"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.share_token"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.expired_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_sport_report_shares"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"运动报告分享记录表","tags":["ak_sport_report_shares"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_sport_report_shares"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"运动报告分享记录表","tags":["ak_sport_report_shares"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.id"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.report_id"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.shared_by"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.shared_to"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.share_token"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.expired_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"运动报告分享记录表","tags":["ak_sport_report_shares"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.id"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.report_id"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.shared_by"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.shared_to"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.share_token"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_sport_report_shares.expired_at"},{"$ref":"#/parameters/body.ak_sport_report_shares"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"运动报告分享记录表","tags":["ak_sport_report_shares"]}},"/ak_users":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_users.id"},{"$ref":"#/parameters/rowFilter.ak_users.username"},{"$ref":"#/parameters/rowFilter.ak_users.email"},{"$ref":"#/parameters/rowFilter.ak_users.password_hash"},{"$ref":"#/parameters/rowFilter.ak_users.gender"},{"$ref":"#/parameters/rowFilter.ak_users.birthday"},{"$ref":"#/parameters/rowFilter.ak_users.height_cm"},{"$ref":"#/parameters/rowFilter.ak_users.weight_kg"},{"$ref":"#/parameters/rowFilter.ak_users.bio"},{"$ref":"#/parameters/rowFilter.ak_users.phone"},{"$ref":"#/parameters/rowFilter.ak_users.avatar_url"},{"$ref":"#/parameters/rowFilter.ak_users.region_id"},{"$ref":"#/parameters/rowFilter.ak_users.school_id"},{"$ref":"#/parameters/rowFilter.ak_users.grade_id"},{"$ref":"#/parameters/rowFilter.ak_users.class_id"},{"$ref":"#/parameters/rowFilter.ak_users.role"},{"$ref":"#/parameters/rowFilter.ak_users.created_at"},{"$ref":"#/parameters/rowFilter.ak_users.updated_at"},{"$ref":"#/parameters/rowFilter.ak_users.auth_id"},{"$ref":"#/parameters/rowFilter.ak_users.preferred_language"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_users"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户表","tags":["ak_users"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_users"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户表","tags":["ak_users"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_users.id"},{"$ref":"#/parameters/rowFilter.ak_users.username"},{"$ref":"#/parameters/rowFilter.ak_users.email"},{"$ref":"#/parameters/rowFilter.ak_users.password_hash"},{"$ref":"#/parameters/rowFilter.ak_users.gender"},{"$ref":"#/parameters/rowFilter.ak_users.birthday"},{"$ref":"#/parameters/rowFilter.ak_users.height_cm"},{"$ref":"#/parameters/rowFilter.ak_users.weight_kg"},{"$ref":"#/parameters/rowFilter.ak_users.bio"},{"$ref":"#/parameters/rowFilter.ak_users.phone"},{"$ref":"#/parameters/rowFilter.ak_users.avatar_url"},{"$ref":"#/parameters/rowFilter.ak_users.region_id"},{"$ref":"#/parameters/rowFilter.ak_users.school_id"},{"$ref":"#/parameters/rowFilter.ak_users.grade_id"},{"$ref":"#/parameters/rowFilter.ak_users.class_id"},{"$ref":"#/parameters/rowFilter.ak_users.role"},{"$ref":"#/parameters/rowFilter.ak_users.created_at"},{"$ref":"#/parameters/rowFilter.ak_users.updated_at"},{"$ref":"#/parameters/rowFilter.ak_users.auth_id"},{"$ref":"#/parameters/rowFilter.ak_users.preferred_language"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户表","tags":["ak_users"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_users.id"},{"$ref":"#/parameters/rowFilter.ak_users.username"},{"$ref":"#/parameters/rowFilter.ak_users.email"},{"$ref":"#/parameters/rowFilter.ak_users.password_hash"},{"$ref":"#/parameters/rowFilter.ak_users.gender"},{"$ref":"#/parameters/rowFilter.ak_users.birthday"},{"$ref":"#/parameters/rowFilter.ak_users.height_cm"},{"$ref":"#/parameters/rowFilter.ak_users.weight_kg"},{"$ref":"#/parameters/rowFilter.ak_users.bio"},{"$ref":"#/parameters/rowFilter.ak_users.phone"},{"$ref":"#/parameters/rowFilter.ak_users.avatar_url"},{"$ref":"#/parameters/rowFilter.ak_users.region_id"},{"$ref":"#/parameters/rowFilter.ak_users.school_id"},{"$ref":"#/parameters/rowFilter.ak_users.grade_id"},{"$ref":"#/parameters/rowFilter.ak_users.class_id"},{"$ref":"#/parameters/rowFilter.ak_users.role"},{"$ref":"#/parameters/rowFilter.ak_users.created_at"},{"$ref":"#/parameters/rowFilter.ak_users.updated_at"},{"$ref":"#/parameters/rowFilter.ak_users.auth_id"},{"$ref":"#/parameters/rowFilter.ak_users.preferred_language"},{"$ref":"#/parameters/body.ak_users"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户表","tags":["ak_users"]}},"/ak_roles":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_roles.id"},{"$ref":"#/parameters/rowFilter.ak_roles.name"},{"$ref":"#/parameters/rowFilter.ak_roles.description"},{"$ref":"#/parameters/rowFilter.ak_roles.level"},{"$ref":"#/parameters/rowFilter.ak_roles.is_system"},{"$ref":"#/parameters/rowFilter.ak_roles.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_roles"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"角色定义表","tags":["ak_roles"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_roles"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"角色定义表","tags":["ak_roles"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_roles.id"},{"$ref":"#/parameters/rowFilter.ak_roles.name"},{"$ref":"#/parameters/rowFilter.ak_roles.description"},{"$ref":"#/parameters/rowFilter.ak_roles.level"},{"$ref":"#/parameters/rowFilter.ak_roles.is_system"},{"$ref":"#/parameters/rowFilter.ak_roles.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"角色定义表","tags":["ak_roles"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_roles.id"},{"$ref":"#/parameters/rowFilter.ak_roles.name"},{"$ref":"#/parameters/rowFilter.ak_roles.description"},{"$ref":"#/parameters/rowFilter.ak_roles.level"},{"$ref":"#/parameters/rowFilter.ak_roles.is_system"},{"$ref":"#/parameters/rowFilter.ak_roles.created_at"},{"$ref":"#/parameters/body.ak_roles"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"角色定义表","tags":["ak_roles"]}},"/ak_translations":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_translations.id"},{"$ref":"#/parameters/rowFilter.ak_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_translations.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_translations"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"数据翻译基础表(用于继承)","tags":["ak_translations"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_translations"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"数据翻译基础表(用于继承)","tags":["ak_translations"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_translations.id"},{"$ref":"#/parameters/rowFilter.ak_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_translations.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"数据翻译基础表(用于继承)","tags":["ak_translations"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_translations.id"},{"$ref":"#/parameters/rowFilter.ak_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_translations.updated_at"},{"$ref":"#/parameters/body.ak_translations"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"数据翻译基础表(用于继承)","tags":["ak_translations"]}},"/ak_video_analysis":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_video_analysis.id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.user_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.device_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.record_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.video_url"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.analysis_type"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.result"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_video_analysis"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"视频分析结果表","tags":["ak_video_analysis"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_video_analysis"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"视频分析结果表","tags":["ak_video_analysis"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_video_analysis.id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.user_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.device_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.record_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.video_url"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.analysis_type"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.result"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"视频分析结果表","tags":["ak_video_analysis"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_video_analysis.id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.user_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.device_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.record_id"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.video_url"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.analysis_type"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.result"},{"$ref":"#/parameters/rowFilter.ak_video_analysis.created_at"},{"$ref":"#/parameters/body.ak_video_analysis"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"视频分析结果表","tags":["ak_video_analysis"]}},"/ak_region_translations":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_region_translations.id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_region_translations.updated_at"},{"$ref":"#/parameters/rowFilter.ak_region_translations.region_name"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_region_translations"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"区域名称翻译表","tags":["ak_region_translations"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_region_translations"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"区域名称翻译表","tags":["ak_region_translations"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_region_translations.id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_region_translations.updated_at"},{"$ref":"#/parameters/rowFilter.ak_region_translations.region_name"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"区域名称翻译表","tags":["ak_region_translations"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_region_translations.id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_region_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_region_translations.updated_at"},{"$ref":"#/parameters/rowFilter.ak_region_translations.region_name"},{"$ref":"#/parameters/body.ak_region_translations"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"区域名称翻译表","tags":["ak_region_translations"]}},"/ak_comments":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comments.id"},{"$ref":"#/parameters/rowFilter.ak_comments.target_type"},{"$ref":"#/parameters/rowFilter.ak_comments.target_id"},{"$ref":"#/parameters/rowFilter.ak_comments.parent_id"},{"$ref":"#/parameters/rowFilter.ak_comments.author_id"},{"$ref":"#/parameters/rowFilter.ak_comments.author_name"},{"$ref":"#/parameters/rowFilter.ak_comments.author_avatar"},{"$ref":"#/parameters/rowFilter.ak_comments.content"},{"$ref":"#/parameters/rowFilter.ak_comments.content_html"},{"$ref":"#/parameters/rowFilter.ak_comments.status"},{"$ref":"#/parameters/rowFilter.ak_comments.like_count"},{"$ref":"#/parameters/rowFilter.ak_comments.dislike_count"},{"$ref":"#/parameters/rowFilter.ak_comments.reply_count"},{"$ref":"#/parameters/rowFilter.ak_comments.level"},{"$ref":"#/parameters/rowFilter.ak_comments.thread_path"},{"$ref":"#/parameters/rowFilter.ak_comments.is_pinned"},{"$ref":"#/parameters/rowFilter.ak_comments.is_author_reply"},{"$ref":"#/parameters/rowFilter.ak_comments.quality_score"},{"$ref":"#/parameters/rowFilter.ak_comments.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_comments.language_detected"},{"$ref":"#/parameters/rowFilter.ak_comments.ip_address"},{"$ref":"#/parameters/rowFilter.ak_comments.user_agent"},{"$ref":"#/parameters/rowFilter.ak_comments.device_info"},{"$ref":"#/parameters/rowFilter.ak_comments.moderation_flags"},{"$ref":"#/parameters/rowFilter.ak_comments.ai_analysis"},{"$ref":"#/parameters/rowFilter.ak_comments.created_at"},{"$ref":"#/parameters/rowFilter.ak_comments.updated_at"},{"$ref":"#/parameters/rowFilter.ak_comments.deleted_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_comments"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"评论表","tags":["ak_comments"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_comments"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"评论表","tags":["ak_comments"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comments.id"},{"$ref":"#/parameters/rowFilter.ak_comments.target_type"},{"$ref":"#/parameters/rowFilter.ak_comments.target_id"},{"$ref":"#/parameters/rowFilter.ak_comments.parent_id"},{"$ref":"#/parameters/rowFilter.ak_comments.author_id"},{"$ref":"#/parameters/rowFilter.ak_comments.author_name"},{"$ref":"#/parameters/rowFilter.ak_comments.author_avatar"},{"$ref":"#/parameters/rowFilter.ak_comments.content"},{"$ref":"#/parameters/rowFilter.ak_comments.content_html"},{"$ref":"#/parameters/rowFilter.ak_comments.status"},{"$ref":"#/parameters/rowFilter.ak_comments.like_count"},{"$ref":"#/parameters/rowFilter.ak_comments.dislike_count"},{"$ref":"#/parameters/rowFilter.ak_comments.reply_count"},{"$ref":"#/parameters/rowFilter.ak_comments.level"},{"$ref":"#/parameters/rowFilter.ak_comments.thread_path"},{"$ref":"#/parameters/rowFilter.ak_comments.is_pinned"},{"$ref":"#/parameters/rowFilter.ak_comments.is_author_reply"},{"$ref":"#/parameters/rowFilter.ak_comments.quality_score"},{"$ref":"#/parameters/rowFilter.ak_comments.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_comments.language_detected"},{"$ref":"#/parameters/rowFilter.ak_comments.ip_address"},{"$ref":"#/parameters/rowFilter.ak_comments.user_agent"},{"$ref":"#/parameters/rowFilter.ak_comments.device_info"},{"$ref":"#/parameters/rowFilter.ak_comments.moderation_flags"},{"$ref":"#/parameters/rowFilter.ak_comments.ai_analysis"},{"$ref":"#/parameters/rowFilter.ak_comments.created_at"},{"$ref":"#/parameters/rowFilter.ak_comments.updated_at"},{"$ref":"#/parameters/rowFilter.ak_comments.deleted_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论表","tags":["ak_comments"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comments.id"},{"$ref":"#/parameters/rowFilter.ak_comments.target_type"},{"$ref":"#/parameters/rowFilter.ak_comments.target_id"},{"$ref":"#/parameters/rowFilter.ak_comments.parent_id"},{"$ref":"#/parameters/rowFilter.ak_comments.author_id"},{"$ref":"#/parameters/rowFilter.ak_comments.author_name"},{"$ref":"#/parameters/rowFilter.ak_comments.author_avatar"},{"$ref":"#/parameters/rowFilter.ak_comments.content"},{"$ref":"#/parameters/rowFilter.ak_comments.content_html"},{"$ref":"#/parameters/rowFilter.ak_comments.status"},{"$ref":"#/parameters/rowFilter.ak_comments.like_count"},{"$ref":"#/parameters/rowFilter.ak_comments.dislike_count"},{"$ref":"#/parameters/rowFilter.ak_comments.reply_count"},{"$ref":"#/parameters/rowFilter.ak_comments.level"},{"$ref":"#/parameters/rowFilter.ak_comments.thread_path"},{"$ref":"#/parameters/rowFilter.ak_comments.is_pinned"},{"$ref":"#/parameters/rowFilter.ak_comments.is_author_reply"},{"$ref":"#/parameters/rowFilter.ak_comments.quality_score"},{"$ref":"#/parameters/rowFilter.ak_comments.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_comments.language_detected"},{"$ref":"#/parameters/rowFilter.ak_comments.ip_address"},{"$ref":"#/parameters/rowFilter.ak_comments.user_agent"},{"$ref":"#/parameters/rowFilter.ak_comments.device_info"},{"$ref":"#/parameters/rowFilter.ak_comments.moderation_flags"},{"$ref":"#/parameters/rowFilter.ak_comments.ai_analysis"},{"$ref":"#/parameters/rowFilter.ak_comments.created_at"},{"$ref":"#/parameters/rowFilter.ak_comments.updated_at"},{"$ref":"#/parameters/rowFilter.ak_comments.deleted_at"},{"$ref":"#/parameters/body.ak_comments"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论表","tags":["ak_comments"]}},"/ak_notifications":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_notifications.id"},{"$ref":"#/parameters/rowFilter.ak_notifications.user_id"},{"$ref":"#/parameters/rowFilter.ak_notifications.title"},{"$ref":"#/parameters/rowFilter.ak_notifications.content"},{"$ref":"#/parameters/rowFilter.ak_notifications.status"},{"$ref":"#/parameters/rowFilter.ak_notifications.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_notifications"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"消息/通知表","tags":["ak_notifications"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_notifications"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"消息/通知表","tags":["ak_notifications"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_notifications.id"},{"$ref":"#/parameters/rowFilter.ak_notifications.user_id"},{"$ref":"#/parameters/rowFilter.ak_notifications.title"},{"$ref":"#/parameters/rowFilter.ak_notifications.content"},{"$ref":"#/parameters/rowFilter.ak_notifications.status"},{"$ref":"#/parameters/rowFilter.ak_notifications.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"消息/通知表","tags":["ak_notifications"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_notifications.id"},{"$ref":"#/parameters/rowFilter.ak_notifications.user_id"},{"$ref":"#/parameters/rowFilter.ak_notifications.title"},{"$ref":"#/parameters/rowFilter.ak_notifications.content"},{"$ref":"#/parameters/rowFilter.ak_notifications.status"},{"$ref":"#/parameters/rowFilter.ak_notifications.created_at"},{"$ref":"#/parameters/body.ak_notifications"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"消息/通知表","tags":["ak_notifications"]}},"/ak_biometric_data":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_biometric_data.id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.user_id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.device_id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.data_type"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.value"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.unit"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.measured_at"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.extra"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_biometric_data"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"体征监测数据表","tags":["ak_biometric_data"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_biometric_data"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"体征监测数据表","tags":["ak_biometric_data"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_biometric_data.id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.user_id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.device_id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.data_type"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.value"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.unit"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.measured_at"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.extra"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"体征监测数据表","tags":["ak_biometric_data"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_biometric_data.id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.user_id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.device_id"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.data_type"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.value"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.unit"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.measured_at"},{"$ref":"#/parameters/rowFilter.ak_biometric_data.extra"},{"$ref":"#/parameters/body.ak_biometric_data"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"体征监测数据表","tags":["ak_biometric_data"]}},"/ak_topic_subscriptions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.topic_id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.user_id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.notification_enabled"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.subscribed_at"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.last_notified_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_topic_subscriptions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"专题订阅表","tags":["ak_topic_subscriptions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_topic_subscriptions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"专题订阅表","tags":["ak_topic_subscriptions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.topic_id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.user_id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.notification_enabled"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.subscribed_at"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.last_notified_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"专题订阅表","tags":["ak_topic_subscriptions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.topic_id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.user_id"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.notification_enabled"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.subscribed_at"},{"$ref":"#/parameters/rowFilter.ak_topic_subscriptions.last_notified_at"},{"$ref":"#/parameters/body.ak_topic_subscriptions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"专题订阅表","tags":["ak_topic_subscriptions"]}},"/ak_topic_contents":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topic_contents.id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.topic_id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.content_id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.display_order"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.editor_note"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.is_featured"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.added_by"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.added_at"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_topic_contents"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"专题内容关联表","tags":["ak_topic_contents"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_topic_contents"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"专题内容关联表","tags":["ak_topic_contents"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topic_contents.id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.topic_id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.content_id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.display_order"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.editor_note"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.is_featured"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.added_by"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.added_at"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"专题内容关联表","tags":["ak_topic_contents"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_topic_contents.id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.topic_id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.content_id"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.display_order"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.editor_note"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.is_featured"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.added_by"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.added_at"},{"$ref":"#/parameters/rowFilter.ak_topic_contents.created_at"},{"$ref":"#/parameters/body.ak_topic_contents"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"专题内容关联表","tags":["ak_topic_contents"]}},"/ak_user_classes":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_classes.id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.class_id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.role"},{"$ref":"#/parameters/rowFilter.ak_user_classes.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_classes"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户-班级多对多关系表","tags":["ak_user_classes"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_classes"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户-班级多对多关系表","tags":["ak_user_classes"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_classes.id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.class_id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.role"},{"$ref":"#/parameters/rowFilter.ak_user_classes.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户-班级多对多关系表","tags":["ak_user_classes"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_classes.id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.class_id"},{"$ref":"#/parameters/rowFilter.ak_user_classes.role"},{"$ref":"#/parameters/rowFilter.ak_user_classes.created_at"},{"$ref":"#/parameters/body.ak_user_classes"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户-班级多对多关系表","tags":["ak_user_classes"]}},"/ak_comment_moderation_queue":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.id"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.reason"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.priority_level"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.assigned_to"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.status"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.ai_risk_score"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.ai_recommendations"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.created_at"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.assigned_at"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.completed_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_comment_moderation_queue"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"评论审核队列表","tags":["ak_comment_moderation_queue"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_comment_moderation_queue"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"评论审核队列表","tags":["ak_comment_moderation_queue"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.id"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.reason"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.priority_level"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.assigned_to"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.status"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.ai_risk_score"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.ai_recommendations"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.created_at"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.assigned_at"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.completed_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论审核队列表","tags":["ak_comment_moderation_queue"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.id"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.comment_id"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.reason"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.priority_level"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.assigned_to"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.status"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.ai_risk_score"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.ai_recommendations"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.created_at"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.assigned_at"},{"$ref":"#/parameters/rowFilter.ak_comment_moderation_queue.completed_at"},{"$ref":"#/parameters/body.ak_comment_moderation_queue"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"评论审核队列表","tags":["ak_comment_moderation_queue"]}},"/ak_favorite_shares":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_favorite_shares.id"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.folder_id"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.shared_by"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.share_code"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.access_password"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.expire_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.view_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.clone_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.is_active"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_favorite_shares"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"收藏夹分享表","tags":["ak_favorite_shares"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_favorite_shares"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"收藏夹分享表","tags":["ak_favorite_shares"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_favorite_shares.id"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.folder_id"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.shared_by"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.share_code"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.access_password"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.expire_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.view_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.clone_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.is_active"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"收藏夹分享表","tags":["ak_favorite_shares"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_favorite_shares.id"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.folder_id"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.shared_by"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.share_code"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.access_password"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.expire_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.view_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.clone_count"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.is_active"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_favorite_shares.updated_at"},{"$ref":"#/parameters/body.ak_favorite_shares"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"收藏夹分享表","tags":["ak_favorite_shares"]}},"/ak_assignments":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignments.id"},{"$ref":"#/parameters/rowFilter.ak_assignments.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_assignments.title"},{"$ref":"#/parameters/rowFilter.ak_assignments.project_name"},{"$ref":"#/parameters/rowFilter.ak_assignments.status"},{"$ref":"#/parameters/rowFilter.ak_assignments.start_time"},{"$ref":"#/parameters/rowFilter.ak_assignments.end_time"},{"$ref":"#/parameters/rowFilter.ak_assignments.description"},{"$ref":"#/parameters/rowFilter.ak_assignments.class_id"},{"$ref":"#/parameters/rowFilter.ak_assignments.due_date"},{"$ref":"#/parameters/rowFilter.ak_assignments.created_at"},{"$ref":"#/parameters/rowFilter.ak_assignments.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_assignments"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"作业表","tags":["ak_assignments"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_assignments"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"作业表","tags":["ak_assignments"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignments.id"},{"$ref":"#/parameters/rowFilter.ak_assignments.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_assignments.title"},{"$ref":"#/parameters/rowFilter.ak_assignments.project_name"},{"$ref":"#/parameters/rowFilter.ak_assignments.status"},{"$ref":"#/parameters/rowFilter.ak_assignments.start_time"},{"$ref":"#/parameters/rowFilter.ak_assignments.end_time"},{"$ref":"#/parameters/rowFilter.ak_assignments.description"},{"$ref":"#/parameters/rowFilter.ak_assignments.class_id"},{"$ref":"#/parameters/rowFilter.ak_assignments.due_date"},{"$ref":"#/parameters/rowFilter.ak_assignments.created_at"},{"$ref":"#/parameters/rowFilter.ak_assignments.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"作业表","tags":["ak_assignments"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignments.id"},{"$ref":"#/parameters/rowFilter.ak_assignments.teacher_id"},{"$ref":"#/parameters/rowFilter.ak_assignments.title"},{"$ref":"#/parameters/rowFilter.ak_assignments.project_name"},{"$ref":"#/parameters/rowFilter.ak_assignments.status"},{"$ref":"#/parameters/rowFilter.ak_assignments.start_time"},{"$ref":"#/parameters/rowFilter.ak_assignments.end_time"},{"$ref":"#/parameters/rowFilter.ak_assignments.description"},{"$ref":"#/parameters/rowFilter.ak_assignments.class_id"},{"$ref":"#/parameters/rowFilter.ak_assignments.due_date"},{"$ref":"#/parameters/rowFilter.ak_assignments.created_at"},{"$ref":"#/parameters/rowFilter.ak_assignments.updated_at"},{"$ref":"#/parameters/body.ak_assignments"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"作业表","tags":["ak_assignments"]}},"/ak_assignment_stats":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignment_stats.id"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.assignment_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.total_students"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.submitted_count"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.reviewed_count"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.avg_score"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.last_updated"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_assignment_stats"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"作业统计表","tags":["ak_assignment_stats"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_assignment_stats"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"作业统计表","tags":["ak_assignment_stats"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignment_stats.id"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.assignment_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.total_students"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.submitted_count"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.reviewed_count"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.avg_score"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.last_updated"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"作业统计表","tags":["ak_assignment_stats"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_assignment_stats.id"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.assignment_id"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.total_students"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.submitted_count"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.reviewed_count"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.avg_score"},{"$ref":"#/parameters/rowFilter.ak_assignment_stats.last_updated"},{"$ref":"#/parameters/body.ak_assignment_stats"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"作业统计表","tags":["ak_assignment_stats"]}},"/ak_ai_reports":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_reports.id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.user_id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.record_id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.report_type"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.content"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_ai_reports"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"AI评估报告表","tags":["ak_ai_reports"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_ai_reports"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"AI评估报告表","tags":["ak_ai_reports"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_reports.id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.user_id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.record_id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.report_type"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.content"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI评估报告表","tags":["ak_ai_reports"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_reports.id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.user_id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.record_id"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.report_type"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.content"},{"$ref":"#/parameters/rowFilter.ak_ai_reports.created_at"},{"$ref":"#/parameters/body.ak_ai_reports"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI评估报告表","tags":["ak_ai_reports"]}},"/ak_user_roles":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_roles.id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.role_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.scope_type"},{"$ref":"#/parameters/rowFilter.ak_user_roles.scope_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.created_by"},{"$ref":"#/parameters/rowFilter.ak_user_roles.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_roles"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户-角色关联表","tags":["ak_user_roles"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_roles"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户-角色关联表","tags":["ak_user_roles"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_roles.id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.role_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.scope_type"},{"$ref":"#/parameters/rowFilter.ak_user_roles.scope_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.created_by"},{"$ref":"#/parameters/rowFilter.ak_user_roles.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户-角色关联表","tags":["ak_user_roles"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_roles.id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.role_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.scope_type"},{"$ref":"#/parameters/rowFilter.ak_user_roles.scope_id"},{"$ref":"#/parameters/rowFilter.ak_user_roles.created_by"},{"$ref":"#/parameters/rowFilter.ak_user_roles.created_at"},{"$ref":"#/parameters/body.ak_user_roles"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户-角色关联表","tags":["ak_user_roles"]}},"/ak_role_permissions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_role_permissions.id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.role_id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.permission_id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_role_permissions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"角色-权限关联表","tags":["ak_role_permissions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_role_permissions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"角色-权限关联表","tags":["ak_role_permissions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_role_permissions.id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.role_id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.permission_id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"角色-权限关联表","tags":["ak_role_permissions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_role_permissions.id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.role_id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.permission_id"},{"$ref":"#/parameters/rowFilter.ak_role_permissions.created_at"},{"$ref":"#/parameters/body.ak_role_permissions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"角色-权限关联表","tags":["ak_role_permissions"]}},"/ak_ai_translation_logs":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.id"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.content_id"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.source_language"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.target_language"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.model_version"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.quality_score"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.error_message"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.retry_count"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.success"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_ai_translation_logs"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"AI翻译日志表","tags":["ak_ai_translation_logs"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_ai_translation_logs"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"AI翻译日志表","tags":["ak_ai_translation_logs"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.id"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.content_id"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.source_language"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.target_language"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.model_version"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.quality_score"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.error_message"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.retry_count"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.success"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI翻译日志表","tags":["ak_ai_translation_logs"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.id"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.content_id"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.source_language"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.target_language"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.model_version"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.quality_score"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.error_message"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.retry_count"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.success"},{"$ref":"#/parameters/rowFilter.ak_ai_translation_logs.created_at"},{"$ref":"#/parameters/body.ak_ai_translation_logs"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI翻译日志表","tags":["ak_ai_translation_logs"]}},"/ak_chat_sessions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_chat_sessions.id"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.user_id"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.session_name"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.language"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.context"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.ai_model"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.total_messages"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.total_tokens"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.last_message_at"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.is_active"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.created_at"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_chat_sessions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"AI聊天会话表","tags":["ak_chat_sessions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_chat_sessions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"AI聊天会话表","tags":["ak_chat_sessions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_chat_sessions.id"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.user_id"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.session_name"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.language"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.context"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.ai_model"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.total_messages"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.total_tokens"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.last_message_at"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.is_active"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.created_at"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI聊天会话表","tags":["ak_chat_sessions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_chat_sessions.id"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.user_id"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.session_name"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.language"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.context"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.ai_model"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.total_messages"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.total_tokens"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.last_message_at"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.is_active"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.created_at"},{"$ref":"#/parameters/rowFilter.ak_chat_sessions.updated_at"},{"$ref":"#/parameters/body.ak_chat_sessions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI聊天会话表","tags":["ak_chat_sessions"]}},"/ak_grades":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_grades.id"},{"$ref":"#/parameters/rowFilter.ak_grades.school_id"},{"$ref":"#/parameters/rowFilter.ak_grades.name"},{"$ref":"#/parameters/rowFilter.ak_grades.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_grades"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"年级表","tags":["ak_grades"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_grades"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"年级表","tags":["ak_grades"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_grades.id"},{"$ref":"#/parameters/rowFilter.ak_grades.school_id"},{"$ref":"#/parameters/rowFilter.ak_grades.name"},{"$ref":"#/parameters/rowFilter.ak_grades.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"年级表","tags":["ak_grades"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_grades.id"},{"$ref":"#/parameters/rowFilter.ak_grades.school_id"},{"$ref":"#/parameters/rowFilter.ak_grades.name"},{"$ref":"#/parameters/rowFilter.ak_grades.created_at"},{"$ref":"#/parameters/body.ak_grades"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"年级表","tags":["ak_grades"]}},"/ak_languages":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_languages.id"},{"$ref":"#/parameters/rowFilter.ak_languages.code"},{"$ref":"#/parameters/rowFilter.ak_languages.name"},{"$ref":"#/parameters/rowFilter.ak_languages.native_name"},{"$ref":"#/parameters/rowFilter.ak_languages.is_active"},{"$ref":"#/parameters/rowFilter.ak_languages.is_default"},{"$ref":"#/parameters/rowFilter.ak_languages.created_at"},{"$ref":"#/parameters/rowFilter.ak_languages.ai_translation_enabled"},{"$ref":"#/parameters/rowFilter.ak_languages.translation_quality_threshold"},{"$ref":"#/parameters/rowFilter.ak_languages.ai_provider_priority"},{"$ref":"#/parameters/rowFilter.ak_languages.cultural_adaptation_rules"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_languages"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"支持的语言表","tags":["ak_languages"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_languages"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"支持的语言表","tags":["ak_languages"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_languages.id"},{"$ref":"#/parameters/rowFilter.ak_languages.code"},{"$ref":"#/parameters/rowFilter.ak_languages.name"},{"$ref":"#/parameters/rowFilter.ak_languages.native_name"},{"$ref":"#/parameters/rowFilter.ak_languages.is_active"},{"$ref":"#/parameters/rowFilter.ak_languages.is_default"},{"$ref":"#/parameters/rowFilter.ak_languages.created_at"},{"$ref":"#/parameters/rowFilter.ak_languages.ai_translation_enabled"},{"$ref":"#/parameters/rowFilter.ak_languages.translation_quality_threshold"},{"$ref":"#/parameters/rowFilter.ak_languages.ai_provider_priority"},{"$ref":"#/parameters/rowFilter.ak_languages.cultural_adaptation_rules"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"支持的语言表","tags":["ak_languages"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_languages.id"},{"$ref":"#/parameters/rowFilter.ak_languages.code"},{"$ref":"#/parameters/rowFilter.ak_languages.name"},{"$ref":"#/parameters/rowFilter.ak_languages.native_name"},{"$ref":"#/parameters/rowFilter.ak_languages.is_active"},{"$ref":"#/parameters/rowFilter.ak_languages.is_default"},{"$ref":"#/parameters/rowFilter.ak_languages.created_at"},{"$ref":"#/parameters/rowFilter.ak_languages.ai_translation_enabled"},{"$ref":"#/parameters/rowFilter.ak_languages.translation_quality_threshold"},{"$ref":"#/parameters/rowFilter.ak_languages.ai_provider_priority"},{"$ref":"#/parameters/rowFilter.ak_languages.cultural_adaptation_rules"},{"$ref":"#/parameters/body.ak_languages"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"支持的语言表","tags":["ak_languages"]}},"/ak_training_plan_items":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_plan_items.id"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.plan_id"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.item_date"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.activity_type"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.target_value"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.unit"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.description"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_training_plan_items"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"训练计划明细表","tags":["ak_training_plan_items"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_training_plan_items"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"训练计划明细表","tags":["ak_training_plan_items"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_plan_items.id"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.plan_id"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.item_date"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.activity_type"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.target_value"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.unit"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.description"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"训练计划明细表","tags":["ak_training_plan_items"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_plan_items.id"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.plan_id"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.item_date"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.activity_type"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.target_value"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.unit"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.description"},{"$ref":"#/parameters/rowFilter.ak_training_plan_items.created_at"},{"$ref":"#/parameters/body.ak_training_plan_items"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"训练计划明细表","tags":["ak_training_plan_items"]}},"/ak_content_shares":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_shares.id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.user_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.target_type"},{"$ref":"#/parameters/rowFilter.ak_content_shares.target_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_platform"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_content"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_title"},{"$ref":"#/parameters/rowFilter.ak_content_shares.original_author_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.parent_share_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_level"},{"$ref":"#/parameters/rowFilter.ak_content_shares.reach_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.click_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.like_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.comment_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.reshare_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.is_deleted"},{"$ref":"#/parameters/rowFilter.ak_content_shares.deleted_reason"},{"$ref":"#/parameters/rowFilter.ak_content_shares.ip_address"},{"$ref":"#/parameters/rowFilter.ak_content_shares.user_agent"},{"$ref":"#/parameters/rowFilter.ak_content_shares.device_info"},{"$ref":"#/parameters/rowFilter.ak_content_shares.geo_location"},{"$ref":"#/parameters/rowFilter.ak_content_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_shares.updated_at"},{"$ref":"#/parameters/rowFilter.ak_content_shares.deleted_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_shares"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容转发分享表","tags":["ak_content_shares"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_shares"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容转发分享表","tags":["ak_content_shares"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_shares.id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.user_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.target_type"},{"$ref":"#/parameters/rowFilter.ak_content_shares.target_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_platform"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_content"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_title"},{"$ref":"#/parameters/rowFilter.ak_content_shares.original_author_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.parent_share_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_level"},{"$ref":"#/parameters/rowFilter.ak_content_shares.reach_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.click_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.like_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.comment_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.reshare_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.is_deleted"},{"$ref":"#/parameters/rowFilter.ak_content_shares.deleted_reason"},{"$ref":"#/parameters/rowFilter.ak_content_shares.ip_address"},{"$ref":"#/parameters/rowFilter.ak_content_shares.user_agent"},{"$ref":"#/parameters/rowFilter.ak_content_shares.device_info"},{"$ref":"#/parameters/rowFilter.ak_content_shares.geo_location"},{"$ref":"#/parameters/rowFilter.ak_content_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_shares.updated_at"},{"$ref":"#/parameters/rowFilter.ak_content_shares.deleted_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容转发分享表","tags":["ak_content_shares"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_shares.id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.user_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.target_type"},{"$ref":"#/parameters/rowFilter.ak_content_shares.target_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_type"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_platform"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_content"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_title"},{"$ref":"#/parameters/rowFilter.ak_content_shares.original_author_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.parent_share_id"},{"$ref":"#/parameters/rowFilter.ak_content_shares.share_level"},{"$ref":"#/parameters/rowFilter.ak_content_shares.reach_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.click_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.like_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.comment_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.reshare_count"},{"$ref":"#/parameters/rowFilter.ak_content_shares.is_deleted"},{"$ref":"#/parameters/rowFilter.ak_content_shares.deleted_reason"},{"$ref":"#/parameters/rowFilter.ak_content_shares.ip_address"},{"$ref":"#/parameters/rowFilter.ak_content_shares.user_agent"},{"$ref":"#/parameters/rowFilter.ak_content_shares.device_info"},{"$ref":"#/parameters/rowFilter.ak_content_shares.geo_location"},{"$ref":"#/parameters/rowFilter.ak_content_shares.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_shares.updated_at"},{"$ref":"#/parameters/rowFilter.ak_content_shares.deleted_at"},{"$ref":"#/parameters/body.ak_content_shares"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容转发分享表","tags":["ak_content_shares"]}},"/ak_content_categories":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_categories.id"},{"$ref":"#/parameters/rowFilter.ak_content_categories.name_key"},{"$ref":"#/parameters/rowFilter.ak_content_categories.parent_id"},{"$ref":"#/parameters/rowFilter.ak_content_categories.level"},{"$ref":"#/parameters/rowFilter.ak_content_categories.ai_keywords"},{"$ref":"#/parameters/rowFilter.ak_content_categories.confidence_threshold"},{"$ref":"#/parameters/rowFilter.ak_content_categories.sort_order"},{"$ref":"#/parameters/rowFilter.ak_content_categories.is_active"},{"$ref":"#/parameters/rowFilter.ak_content_categories.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_categories.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_categories"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容分类表","tags":["ak_content_categories"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_categories"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容分类表","tags":["ak_content_categories"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_categories.id"},{"$ref":"#/parameters/rowFilter.ak_content_categories.name_key"},{"$ref":"#/parameters/rowFilter.ak_content_categories.parent_id"},{"$ref":"#/parameters/rowFilter.ak_content_categories.level"},{"$ref":"#/parameters/rowFilter.ak_content_categories.ai_keywords"},{"$ref":"#/parameters/rowFilter.ak_content_categories.confidence_threshold"},{"$ref":"#/parameters/rowFilter.ak_content_categories.sort_order"},{"$ref":"#/parameters/rowFilter.ak_content_categories.is_active"},{"$ref":"#/parameters/rowFilter.ak_content_categories.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_categories.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容分类表","tags":["ak_content_categories"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_categories.id"},{"$ref":"#/parameters/rowFilter.ak_content_categories.name_key"},{"$ref":"#/parameters/rowFilter.ak_content_categories.parent_id"},{"$ref":"#/parameters/rowFilter.ak_content_categories.level"},{"$ref":"#/parameters/rowFilter.ak_content_categories.ai_keywords"},{"$ref":"#/parameters/rowFilter.ak_content_categories.confidence_threshold"},{"$ref":"#/parameters/rowFilter.ak_content_categories.sort_order"},{"$ref":"#/parameters/rowFilter.ak_content_categories.is_active"},{"$ref":"#/parameters/rowFilter.ak_content_categories.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_categories.updated_at"},{"$ref":"#/parameters/body.ak_content_categories"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容分类表","tags":["ak_content_categories"]}},"/vw_regions_i18n":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.vw_regions_i18n.id"},{"$ref":"#/parameters/rowFilter.vw_regions_i18n.parent_id"},{"$ref":"#/parameters/rowFilter.vw_regions_i18n.level"},{"$ref":"#/parameters/rowFilter.vw_regions_i18n.created_at"},{"$ref":"#/parameters/rowFilter.vw_regions_i18n.language_id"},{"$ref":"#/parameters/rowFilter.vw_regions_i18n.language_code"},{"$ref":"#/parameters/rowFilter.vw_regions_i18n.name"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/vw_regions_i18n"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"区域多语言视图","tags":["vw_regions_i18n"]}},"/ak_content_quality_history":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_quality_history.id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.quality_type"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.quality_score"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.model_version"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.assessment_criteria"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.reviewer_id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.notes"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_quality_history"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容质量评估历史表","tags":["ak_content_quality_history"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_quality_history"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容质量评估历史表","tags":["ak_content_quality_history"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_quality_history.id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.quality_type"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.quality_score"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.model_version"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.assessment_criteria"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.reviewer_id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.notes"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容质量评估历史表","tags":["ak_content_quality_history"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_quality_history.id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.quality_type"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.quality_score"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.model_version"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.assessment_criteria"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.reviewer_id"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.notes"},{"$ref":"#/parameters/rowFilter.ak_content_quality_history.created_at"},{"$ref":"#/parameters/body.ak_content_quality_history"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容质量评估历史表","tags":["ak_content_quality_history"]}},"/ak_training_records":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_records.id"},{"$ref":"#/parameters/rowFilter.ak_training_records.user_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.plan_item_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.device_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.activity_type"},{"$ref":"#/parameters/rowFilter.ak_training_records.start_time"},{"$ref":"#/parameters/rowFilter.ak_training_records.end_time"},{"$ref":"#/parameters/rowFilter.ak_training_records.duration_sec"},{"$ref":"#/parameters/rowFilter.ak_training_records.distance_km"},{"$ref":"#/parameters/rowFilter.ak_training_records.calories"},{"$ref":"#/parameters/rowFilter.ak_training_records.steps"},{"$ref":"#/parameters/rowFilter.ak_training_records.avg_heart_rate"},{"$ref":"#/parameters/rowFilter.ak_training_records.max_heart_rate"},{"$ref":"#/parameters/rowFilter.ak_training_records.data"},{"$ref":"#/parameters/rowFilter.ak_training_records.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_training_records"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"训练记录表","tags":["ak_training_records"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_training_records"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"训练记录表","tags":["ak_training_records"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_records.id"},{"$ref":"#/parameters/rowFilter.ak_training_records.user_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.plan_item_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.device_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.activity_type"},{"$ref":"#/parameters/rowFilter.ak_training_records.start_time"},{"$ref":"#/parameters/rowFilter.ak_training_records.end_time"},{"$ref":"#/parameters/rowFilter.ak_training_records.duration_sec"},{"$ref":"#/parameters/rowFilter.ak_training_records.distance_km"},{"$ref":"#/parameters/rowFilter.ak_training_records.calories"},{"$ref":"#/parameters/rowFilter.ak_training_records.steps"},{"$ref":"#/parameters/rowFilter.ak_training_records.avg_heart_rate"},{"$ref":"#/parameters/rowFilter.ak_training_records.max_heart_rate"},{"$ref":"#/parameters/rowFilter.ak_training_records.data"},{"$ref":"#/parameters/rowFilter.ak_training_records.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"训练记录表","tags":["ak_training_records"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_training_records.id"},{"$ref":"#/parameters/rowFilter.ak_training_records.user_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.plan_item_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.device_id"},{"$ref":"#/parameters/rowFilter.ak_training_records.activity_type"},{"$ref":"#/parameters/rowFilter.ak_training_records.start_time"},{"$ref":"#/parameters/rowFilter.ak_training_records.end_time"},{"$ref":"#/parameters/rowFilter.ak_training_records.duration_sec"},{"$ref":"#/parameters/rowFilter.ak_training_records.distance_km"},{"$ref":"#/parameters/rowFilter.ak_training_records.calories"},{"$ref":"#/parameters/rowFilter.ak_training_records.steps"},{"$ref":"#/parameters/rowFilter.ak_training_records.avg_heart_rate"},{"$ref":"#/parameters/rowFilter.ak_training_records.max_heart_rate"},{"$ref":"#/parameters/rowFilter.ak_training_records.data"},{"$ref":"#/parameters/rowFilter.ak_training_records.created_at"},{"$ref":"#/parameters/body.ak_training_records"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"训练记录表","tags":["ak_training_records"]}},"/ak_user_point_logs":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_point_logs.id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.change_type"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.points"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.reason"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.related_id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_point_logs"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"积分变动明细表","tags":["ak_user_point_logs"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_point_logs"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"积分变动明细表","tags":["ak_user_point_logs"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_point_logs.id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.change_type"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.points"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.reason"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.related_id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分变动明细表","tags":["ak_user_point_logs"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_point_logs.id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.change_type"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.points"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.reason"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.related_id"},{"$ref":"#/parameters/rowFilter.ak_user_point_logs.created_at"},{"$ref":"#/parameters/body.ak_user_point_logs"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分变动明细表","tags":["ak_user_point_logs"]}},"/ak_chat_messages":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_chat_messages.id"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.session_id"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.message_type"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.content"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.intent"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.attachments"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.feedback_score"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.feedback_reason"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_chat_messages"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"AI聊天消息表","tags":["ak_chat_messages"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_chat_messages"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"AI聊天消息表","tags":["ak_chat_messages"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_chat_messages.id"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.session_id"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.message_type"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.content"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.intent"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.attachments"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.feedback_score"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.feedback_reason"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI聊天消息表","tags":["ak_chat_messages"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_chat_messages.id"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.session_id"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.message_type"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.content"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.intent"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.attachments"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.tokens_used"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.cost_usd"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.feedback_score"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.feedback_reason"},{"$ref":"#/parameters/rowFilter.ak_chat_messages.created_at"},{"$ref":"#/parameters/body.ak_chat_messages"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI聊天消息表","tags":["ak_chat_messages"]}},"/ak_contents":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_contents.id"},{"$ref":"#/parameters/rowFilter.ak_contents.raw_content_id"},{"$ref":"#/parameters/rowFilter.ak_contents.title"},{"$ref":"#/parameters/rowFilter.ak_contents.content"},{"$ref":"#/parameters/rowFilter.ak_contents.summary"},{"$ref":"#/parameters/rowFilter.ak_contents.author"},{"$ref":"#/parameters/rowFilter.ak_contents.source_url"},{"$ref":"#/parameters/rowFilter.ak_contents.original_language"},{"$ref":"#/parameters/rowFilter.ak_contents.category_id"},{"$ref":"#/parameters/rowFilter.ak_contents.tags"},{"$ref":"#/parameters/rowFilter.ak_contents.keywords"},{"$ref":"#/parameters/rowFilter.ak_contents.entities"},{"$ref":"#/parameters/rowFilter.ak_contents.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_contents.readability_score"},{"$ref":"#/parameters/rowFilter.ak_contents.credibility_score"},{"$ref":"#/parameters/rowFilter.ak_contents.quality_score"},{"$ref":"#/parameters/rowFilter.ak_contents.view_count"},{"$ref":"#/parameters/rowFilter.ak_contents.like_count"},{"$ref":"#/parameters/rowFilter.ak_contents.share_count"},{"$ref":"#/parameters/rowFilter.ak_contents.comment_count"},{"$ref":"#/parameters/rowFilter.ak_contents.published_at"},{"$ref":"#/parameters/rowFilter.ak_contents.featured_until"},{"$ref":"#/parameters/rowFilter.ak_contents.status"},{"$ref":"#/parameters/rowFilter.ak_contents.ai_processed_at"},{"$ref":"#/parameters/rowFilter.ak_contents.created_at"},{"$ref":"#/parameters/rowFilter.ak_contents.updated_at"},{"$ref":"#/parameters/rowFilter.ak_contents.favorite_count"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_contents"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"处理后的内容表","tags":["ak_contents"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_contents"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"处理后的内容表","tags":["ak_contents"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_contents.id"},{"$ref":"#/parameters/rowFilter.ak_contents.raw_content_id"},{"$ref":"#/parameters/rowFilter.ak_contents.title"},{"$ref":"#/parameters/rowFilter.ak_contents.content"},{"$ref":"#/parameters/rowFilter.ak_contents.summary"},{"$ref":"#/parameters/rowFilter.ak_contents.author"},{"$ref":"#/parameters/rowFilter.ak_contents.source_url"},{"$ref":"#/parameters/rowFilter.ak_contents.original_language"},{"$ref":"#/parameters/rowFilter.ak_contents.category_id"},{"$ref":"#/parameters/rowFilter.ak_contents.tags"},{"$ref":"#/parameters/rowFilter.ak_contents.keywords"},{"$ref":"#/parameters/rowFilter.ak_contents.entities"},{"$ref":"#/parameters/rowFilter.ak_contents.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_contents.readability_score"},{"$ref":"#/parameters/rowFilter.ak_contents.credibility_score"},{"$ref":"#/parameters/rowFilter.ak_contents.quality_score"},{"$ref":"#/parameters/rowFilter.ak_contents.view_count"},{"$ref":"#/parameters/rowFilter.ak_contents.like_count"},{"$ref":"#/parameters/rowFilter.ak_contents.share_count"},{"$ref":"#/parameters/rowFilter.ak_contents.comment_count"},{"$ref":"#/parameters/rowFilter.ak_contents.published_at"},{"$ref":"#/parameters/rowFilter.ak_contents.featured_until"},{"$ref":"#/parameters/rowFilter.ak_contents.status"},{"$ref":"#/parameters/rowFilter.ak_contents.ai_processed_at"},{"$ref":"#/parameters/rowFilter.ak_contents.created_at"},{"$ref":"#/parameters/rowFilter.ak_contents.updated_at"},{"$ref":"#/parameters/rowFilter.ak_contents.favorite_count"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"处理后的内容表","tags":["ak_contents"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_contents.id"},{"$ref":"#/parameters/rowFilter.ak_contents.raw_content_id"},{"$ref":"#/parameters/rowFilter.ak_contents.title"},{"$ref":"#/parameters/rowFilter.ak_contents.content"},{"$ref":"#/parameters/rowFilter.ak_contents.summary"},{"$ref":"#/parameters/rowFilter.ak_contents.author"},{"$ref":"#/parameters/rowFilter.ak_contents.source_url"},{"$ref":"#/parameters/rowFilter.ak_contents.original_language"},{"$ref":"#/parameters/rowFilter.ak_contents.category_id"},{"$ref":"#/parameters/rowFilter.ak_contents.tags"},{"$ref":"#/parameters/rowFilter.ak_contents.keywords"},{"$ref":"#/parameters/rowFilter.ak_contents.entities"},{"$ref":"#/parameters/rowFilter.ak_contents.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_contents.readability_score"},{"$ref":"#/parameters/rowFilter.ak_contents.credibility_score"},{"$ref":"#/parameters/rowFilter.ak_contents.quality_score"},{"$ref":"#/parameters/rowFilter.ak_contents.view_count"},{"$ref":"#/parameters/rowFilter.ak_contents.like_count"},{"$ref":"#/parameters/rowFilter.ak_contents.share_count"},{"$ref":"#/parameters/rowFilter.ak_contents.comment_count"},{"$ref":"#/parameters/rowFilter.ak_contents.published_at"},{"$ref":"#/parameters/rowFilter.ak_contents.featured_until"},{"$ref":"#/parameters/rowFilter.ak_contents.status"},{"$ref":"#/parameters/rowFilter.ak_contents.ai_processed_at"},{"$ref":"#/parameters/rowFilter.ak_contents.created_at"},{"$ref":"#/parameters/rowFilter.ak_contents.updated_at"},{"$ref":"#/parameters/rowFilter.ak_contents.favorite_count"},{"$ref":"#/parameters/body.ak_contents"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"处理后的内容表","tags":["ak_contents"]}},"/ak_school_translations":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_school_translations.id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_school_translations.updated_at"},{"$ref":"#/parameters/rowFilter.ak_school_translations.school_name"},{"$ref":"#/parameters/rowFilter.ak_school_translations.school_type"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_school_translations"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"学校名称翻译表","tags":["ak_school_translations"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_school_translations"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"学校名称翻译表","tags":["ak_school_translations"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_school_translations.id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_school_translations.updated_at"},{"$ref":"#/parameters/rowFilter.ak_school_translations.school_name"},{"$ref":"#/parameters/rowFilter.ak_school_translations.school_type"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"学校名称翻译表","tags":["ak_school_translations"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_school_translations.id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.record_id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.language_id"},{"$ref":"#/parameters/rowFilter.ak_school_translations.created_at"},{"$ref":"#/parameters/rowFilter.ak_school_translations.updated_at"},{"$ref":"#/parameters/rowFilter.ak_school_translations.school_name"},{"$ref":"#/parameters/rowFilter.ak_school_translations.school_type"},{"$ref":"#/parameters/body.ak_school_translations"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"学校名称翻译表","tags":["ak_school_translations"]}},"/ak_schools":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_schools.id"},{"$ref":"#/parameters/rowFilter.ak_schools.name"},{"$ref":"#/parameters/rowFilter.ak_schools.region_id"},{"$ref":"#/parameters/rowFilter.ak_schools.type"},{"$ref":"#/parameters/rowFilter.ak_schools.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_schools"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"学校表","tags":["ak_schools"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_schools"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"学校表","tags":["ak_schools"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_schools.id"},{"$ref":"#/parameters/rowFilter.ak_schools.name"},{"$ref":"#/parameters/rowFilter.ak_schools.region_id"},{"$ref":"#/parameters/rowFilter.ak_schools.type"},{"$ref":"#/parameters/rowFilter.ak_schools.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"学校表","tags":["ak_schools"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_schools.id"},{"$ref":"#/parameters/rowFilter.ak_schools.name"},{"$ref":"#/parameters/rowFilter.ak_schools.region_id"},{"$ref":"#/parameters/rowFilter.ak_schools.type"},{"$ref":"#/parameters/rowFilter.ak_schools.created_at"},{"$ref":"#/parameters/body.ak_schools"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"学校表","tags":["ak_schools"]}},"/ak_content_favorites":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_favorites.id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.user_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.target_type"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.target_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.folder_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.notes"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.tags"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.is_public"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_favorites"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容收藏表","tags":["ak_content_favorites"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_favorites"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容收藏表","tags":["ak_content_favorites"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_favorites.id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.user_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.target_type"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.target_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.folder_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.notes"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.tags"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.is_public"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容收藏表","tags":["ak_content_favorites"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_favorites.id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.user_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.target_type"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.target_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.folder_id"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.notes"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.tags"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.is_public"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_favorites.updated_at"},{"$ref":"#/parameters/body.ak_content_favorites"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容收藏表","tags":["ak_content_favorites"]}},"/ak_raw_contents":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_raw_contents.id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.source_id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.external_id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.title"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.content"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.summary"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.author"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.source_url"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.published_at"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.language_detected"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.language_confidence"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.content_hash"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.raw_metadata"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.processing_status"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.quality_score"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.duplicate_of"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.created_at"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_raw_contents"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"原始内容表","tags":["ak_raw_contents"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_raw_contents"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"原始内容表","tags":["ak_raw_contents"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_raw_contents.id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.source_id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.external_id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.title"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.content"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.summary"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.author"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.source_url"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.published_at"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.language_detected"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.language_confidence"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.content_hash"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.raw_metadata"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.processing_status"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.quality_score"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.duplicate_of"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.created_at"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"原始内容表","tags":["ak_raw_contents"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_raw_contents.id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.source_id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.external_id"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.title"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.content"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.summary"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.author"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.source_url"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.published_at"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.language_detected"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.language_confidence"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.content_hash"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.raw_metadata"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.processing_status"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.quality_score"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.duplicate_of"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.created_at"},{"$ref":"#/parameters/rowFilter.ak_raw_contents.updated_at"},{"$ref":"#/parameters/body.ak_raw_contents"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"原始内容表","tags":["ak_raw_contents"]}},"/ak_ai_tags":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_tags.id"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.content_id"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.tag_name"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.confidence_score"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.tag_type"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.language"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_ai_tags"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"AI生成的标签表","tags":["ak_ai_tags"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_ai_tags"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"AI生成的标签表","tags":["ak_ai_tags"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_tags.id"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.content_id"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.tag_name"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.confidence_score"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.tag_type"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.language"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI生成的标签表","tags":["ak_ai_tags"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_ai_tags.id"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.content_id"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.tag_name"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.confidence_score"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.tag_type"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.language"},{"$ref":"#/parameters/rowFilter.ak_ai_tags.created_at"},{"$ref":"#/parameters/body.ak_ai_tags"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"AI生成的标签表","tags":["ak_ai_tags"]}},"/ak_point_transactions":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_point_transactions.id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.transaction_type"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.points"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.description"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.reference_id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_point_transactions"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"积分交易记录表","tags":["ak_point_transactions"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_point_transactions"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"积分交易记录表","tags":["ak_point_transactions"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_point_transactions.id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.transaction_type"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.points"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.description"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.reference_id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分交易记录表","tags":["ak_point_transactions"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_point_transactions.id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.user_id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.transaction_type"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.points"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.description"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.reference_id"},{"$ref":"#/parameters/rowFilter.ak_point_transactions.created_at"},{"$ref":"#/parameters/body.ak_point_transactions"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"积分交易记录表","tags":["ak_point_transactions"]}},"/ak_content_analysis":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_analysis.id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.category_id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.sentiment_label"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.readability_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.credibility_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.toxicity_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.keywords"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.entities"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.topics"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.summary"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.key_phrases"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.model_version"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.ai_processed_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_analysis"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容分析结果表","tags":["ak_content_analysis"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_analysis"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容分析结果表","tags":["ak_content_analysis"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_analysis.id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.category_id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.sentiment_label"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.readability_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.credibility_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.toxicity_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.keywords"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.entities"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.topics"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.summary"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.key_phrases"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.model_version"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.ai_processed_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容分析结果表","tags":["ak_content_analysis"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_analysis.id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.content_id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.category_id"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.sentiment_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.sentiment_label"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.readability_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.credibility_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.toxicity_score"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.keywords"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.entities"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.topics"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.summary"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.key_phrases"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.ai_provider"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.model_version"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.processing_time_ms"},{"$ref":"#/parameters/rowFilter.ak_content_analysis.ai_processed_at"},{"$ref":"#/parameters/body.ak_content_analysis"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容分析结果表","tags":["ak_content_analysis"]}},"/ak_user_contacts":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_contacts.id"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.contact_type"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.contact_value"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.is_primary"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.remark"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.created_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_user_contacts"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"用户联系方式表","tags":["ak_user_contacts"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_user_contacts"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"用户联系方式表","tags":["ak_user_contacts"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_contacts.id"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.contact_type"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.contact_value"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.is_primary"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.remark"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.created_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户联系方式表","tags":["ak_user_contacts"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_user_contacts.id"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.user_id"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.contact_type"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.contact_value"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.is_primary"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.remark"},{"$ref":"#/parameters/rowFilter.ak_user_contacts.created_at"},{"$ref":"#/parameters/body.ak_user_contacts"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"用户联系方式表","tags":["ak_user_contacts"]}},"/ak_content_sources":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_sources.id"},{"$ref":"#/parameters/rowFilter.ak_content_sources.name"},{"$ref":"#/parameters/rowFilter.ak_content_sources.type"},{"$ref":"#/parameters/rowFilter.ak_content_sources.url"},{"$ref":"#/parameters/rowFilter.ak_content_sources.config"},{"$ref":"#/parameters/rowFilter.ak_content_sources.language_id"},{"$ref":"#/parameters/rowFilter.ak_content_sources.category"},{"$ref":"#/parameters/rowFilter.ak_content_sources.quality_weight"},{"$ref":"#/parameters/rowFilter.ak_content_sources.crawl_frequency"},{"$ref":"#/parameters/rowFilter.ak_content_sources.last_crawled_at"},{"$ref":"#/parameters/rowFilter.ak_content_sources.is_active"},{"$ref":"#/parameters/rowFilter.ak_content_sources.ai_quality_threshold"},{"$ref":"#/parameters/rowFilter.ak_content_sources.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_sources.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_content_sources"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"内容源配置表","tags":["ak_content_sources"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_content_sources"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"内容源配置表","tags":["ak_content_sources"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_sources.id"},{"$ref":"#/parameters/rowFilter.ak_content_sources.name"},{"$ref":"#/parameters/rowFilter.ak_content_sources.type"},{"$ref":"#/parameters/rowFilter.ak_content_sources.url"},{"$ref":"#/parameters/rowFilter.ak_content_sources.config"},{"$ref":"#/parameters/rowFilter.ak_content_sources.language_id"},{"$ref":"#/parameters/rowFilter.ak_content_sources.category"},{"$ref":"#/parameters/rowFilter.ak_content_sources.quality_weight"},{"$ref":"#/parameters/rowFilter.ak_content_sources.crawl_frequency"},{"$ref":"#/parameters/rowFilter.ak_content_sources.last_crawled_at"},{"$ref":"#/parameters/rowFilter.ak_content_sources.is_active"},{"$ref":"#/parameters/rowFilter.ak_content_sources.ai_quality_threshold"},{"$ref":"#/parameters/rowFilter.ak_content_sources.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_sources.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容源配置表","tags":["ak_content_sources"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_content_sources.id"},{"$ref":"#/parameters/rowFilter.ak_content_sources.name"},{"$ref":"#/parameters/rowFilter.ak_content_sources.type"},{"$ref":"#/parameters/rowFilter.ak_content_sources.url"},{"$ref":"#/parameters/rowFilter.ak_content_sources.config"},{"$ref":"#/parameters/rowFilter.ak_content_sources.language_id"},{"$ref":"#/parameters/rowFilter.ak_content_sources.category"},{"$ref":"#/parameters/rowFilter.ak_content_sources.quality_weight"},{"$ref":"#/parameters/rowFilter.ak_content_sources.crawl_frequency"},{"$ref":"#/parameters/rowFilter.ak_content_sources.last_crawled_at"},{"$ref":"#/parameters/rowFilter.ak_content_sources.is_active"},{"$ref":"#/parameters/rowFilter.ak_content_sources.ai_quality_threshold"},{"$ref":"#/parameters/rowFilter.ak_content_sources.created_at"},{"$ref":"#/parameters/rowFilter.ak_content_sources.updated_at"},{"$ref":"#/parameters/body.ak_content_sources"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"内容源配置表","tags":["ak_content_sources"]}},"/ak_share_analytics":{"get":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_share_analytics.id"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.target_type"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.target_id"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.date_recorded"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.platform"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.share_count"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.unique_sharers"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.total_reach"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.total_clicks"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.avg_share_level"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.viral_coefficient"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.created_at"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.updated_at"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/order"},{"$ref":"#/parameters/range"},{"$ref":"#/parameters/rangeUnit"},{"$ref":"#/parameters/offset"},{"$ref":"#/parameters/limit"},{"$ref":"#/parameters/preferCount"}],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ak_share_analytics"},"type":"array"}},"206":{"description":"Partial Content"}},"summary":"分享统计分析表","tags":["ak_share_analytics"]},"post":{"parameters":[{"$ref":"#/parameters/body.ak_share_analytics"},{"$ref":"#/parameters/select"},{"$ref":"#/parameters/preferPost"}],"responses":{"201":{"description":"Created"}},"summary":"分享统计分析表","tags":["ak_share_analytics"]},"delete":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_share_analytics.id"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.target_type"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.target_id"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.date_recorded"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.platform"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.share_count"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.unique_sharers"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.total_reach"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.total_clicks"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.avg_share_level"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.viral_coefficient"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.created_at"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.updated_at"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"分享统计分析表","tags":["ak_share_analytics"]},"patch":{"parameters":[{"$ref":"#/parameters/rowFilter.ak_share_analytics.id"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.target_type"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.target_id"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.date_recorded"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.platform"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.share_count"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.unique_sharers"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.total_reach"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.total_clicks"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.avg_share_level"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.viral_coefficient"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.created_at"},{"$ref":"#/parameters/rowFilter.ak_share_analytics.updated_at"},{"$ref":"#/parameters/body.ak_share_analytics"},{"$ref":"#/parameters/preferReturn"}],"responses":{"204":{"description":"No Content"}},"summary":"分享统计分析表","tags":["ak_share_analytics"]}},"/rpc/has_permission":{"get":{"parameters":[{"format":"uuid","in":"query","name":"user_id","required":true,"type":"string"},{"format":"text","in":"query","name":"permission_code","required":true,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) has_permission"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"permission_code":{"format":"text","type":"string"},"user_id":{"format":"uuid","type":"string"}},"required":["user_id","permission_code"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) has_permission"]}},"/rpc/get_user_recommendations":{"get":{"parameters":[{"format":"uuid","in":"query","name":"p_user_id","required":true,"type":"string"},{"format":"character varying","in":"query","name":"p_language","required":false,"type":"string"},{"format":"integer","in":"query","name":"p_limit","required":false,"type":"integer"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"summary":"获取用户个性化推荐内容","tags":["(rpc) get_user_recommendations"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"description":"获取用户个性化推荐内容","properties":{"p_language":{"format":"character varying","type":"string"},"p_limit":{"format":"integer","type":"integer"},"p_user_id":{"format":"uuid","type":"string"}},"required":["p_user_id"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"summary":"获取用户个性化推荐内容","tags":["(rpc) get_user_recommendations"]}},"/rpc/has_scoped_permission":{"get":{"parameters":[{"format":"uuid","in":"query","name":"user_id","required":true,"type":"string"},{"format":"text","in":"query","name":"permission_code","required":true,"type":"string"},{"format":"text","in":"query","name":"scope_type","required":true,"type":"string"},{"format":"uuid","in":"query","name":"scope_id","required":true,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) has_scoped_permission"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"permission_code":{"format":"text","type":"string"},"scope_id":{"format":"uuid","type":"string"},"scope_type":{"format":"text","type":"string"},"user_id":{"format":"uuid","type":"string"}},"required":["user_id","permission_code","scope_type","scope_id"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) has_scoped_permission"]}},"/rpc/get_translation":{"get":{"parameters":[{"format":"text","in":"query","name":"p_table_name","required":true,"type":"string"},{"format":"uuid","in":"query","name":"p_record_id","required":true,"type":"string"},{"format":"text","in":"query","name":"p_column_name","required":true,"type":"string"},{"format":"uuid","in":"query","name":"p_language_id","required":false,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_translation"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"p_column_name":{"format":"text","type":"string"},"p_language_id":{"format":"uuid","type":"string"},"p_record_id":{"format":"uuid","type":"string"},"p_table_name":{"format":"text","type":"string"}},"required":["p_table_name","p_record_id","p_column_name"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_translation"]}},"/rpc/current_user_has_permission":{"get":{"parameters":[{"format":"text","in":"query","name":"permission_code","required":true,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) current_user_has_permission"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"permission_code":{"format":"text","type":"string"}},"required":["permission_code"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) current_user_has_permission"]}},"/rpc/show_trgm":{"get":{"parameters":[{"format":"text","in":"query","name":"","required":true,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) show_trgm"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"":{"format":"text","type":"string"}},"required":[""],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) show_trgm"]}},"/rpc/get_ai_cost_stats":{"get":{"parameters":[{"format":"date","in":"query","name":"p_start_date","required":false,"type":"string"},{"format":"date","in":"query","name":"p_end_date","required":false,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"summary":"AI服务成本统计分析","tags":["(rpc) get_ai_cost_stats"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"description":"AI服务成本统计分析","properties":{"p_end_date":{"format":"date","type":"string"},"p_start_date":{"format":"date","type":"string"}},"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"summary":"AI服务成本统计分析","tags":["(rpc) get_ai_cost_stats"]}},"/rpc/get_ui_text":{"get":{"parameters":[{"format":"text","in":"query","name":"p_key","required":true,"type":"string"},{"format":"uuid","in":"query","name":"p_language_id","required":false,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_ui_text"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"p_key":{"format":"text","type":"string"},"p_language_id":{"format":"uuid","type":"string"}},"required":["p_key"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_ui_text"]}},"/rpc/show_limit":{"get":{"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) show_limit"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) show_limit"]}},"/rpc/get_region_name":{"get":{"parameters":[{"format":"uuid","in":"query","name":"p_region_id","required":true,"type":"string"},{"format":"uuid","in":"query","name":"p_language_id","required":false,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_region_name"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"p_language_id":{"format":"uuid","type":"string"},"p_region_id":{"format":"uuid","type":"string"}},"required":["p_region_id"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_region_name"]}},"/rpc/get_school_name":{"get":{"parameters":[{"format":"uuid","in":"query","name":"p_school_id","required":true,"type":"string"},{"format":"uuid","in":"query","name":"p_language_id","required":false,"type":"string"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_school_name"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"properties":{"p_language_id":{"format":"uuid","type":"string"},"p_school_id":{"format":"uuid","type":"string"}},"required":["p_school_id"],"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_school_name"]}},"/rpc/get_user_language":{"get":{"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_user_language"]},"post":{"parameters":[{"in":"body","name":"args","required":true,"schema":{"type":"object"}},{"$ref":"#/parameters/preferParams"}],"produces":["application/json","application/vnd.pgrst.object+json;nulls=stripped","application/vnd.pgrst.object+json"],"responses":{"200":{"description":"OK"}},"tags":["(rpc) get_user_language"]}}},"definitions":{"ak_user_feedback":{"description":"用户反馈表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"content":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_regions":{"description":"地区表","required":["id","name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"name":{"description":"地区名称","format":"character varying","maxLength":128,"type":"string"},"parent_id":{"description":"上级地区ID\n\nNote:\nThis is a Foreign Key to `ak_regions.id`.","format":"uuid","type":"string"},"level":{"description":"地区级别","format":"integer","type":"integer"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_assignment_submissions":{"description":"作业提交表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"assignment_id":{"description":"Note:\nThis is a Foreign Key to `ak_assignments.id`.","format":"uuid","type":"string"},"student_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"submit_time":{"default":"now()","format":"timestamp with time zone","type":"string"},"content_md":{"format":"text","type":"string"},"attachment_url":{"format":"text","type":"string"},"score":{"format":"double precision","type":"number"},"feedback":{"format":"text","type":"string"},"status":{"default":"submitted","format":"character varying","maxLength":16,"type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_interactions":{"description":"互动记录表","required":["id","target_type","target_id","interaction_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"target_type":{"description":"目标类型:training_record(训练记录), assignment_submission(作业提交), teaching_resource(教学资源)等","format":"character varying","maxLength":32,"type":"string"},"target_id":{"format":"uuid","type":"string"},"interaction_type":{"description":"互动类型:comment(评论), like(点赞), share(分享)等","format":"character varying","maxLength":32,"type":"string"},"content":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_teacher_roles":{"description":"老师权限管理表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"school_id":{"description":"Note:\nThis is a Foreign Key to `ak_schools.id`.","format":"uuid","type":"string"},"class_id":{"description":"Note:\nThis is a Foreign Key to `ak_classes.id`.","format":"uuid","type":"string"},"role":{"default":"teacher","format":"character varying","maxLength":32,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_devices":{"description":"设备表","required":["id","device_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"device_type":{"format":"character varying","maxLength":32,"type":"string"},"device_name":{"format":"character varying","maxLength":64,"type":"string"},"device_mac":{"format":"character varying","maxLength":64,"type":"string"},"bind_time":{"default":"now()","format":"timestamp with time zone","type":"string"},"status":{"default":"active","format":"character varying","maxLength":16,"type":"string"},"extra":{"format":"jsonb"}},"type":"object"},"ak_review_queue":{"description":"人工审核队列表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"translation_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_translations.id`.","format":"uuid","type":"string"},"review_type":{"format":"character varying","maxLength":32,"type":"string"},"priority":{"default":5,"format":"integer","type":"integer"},"reason":{"format":"text","type":"string"},"ai_confidence":{"format":"double precision","type":"number"},"requested_by":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"assigned_to":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"status":{"default":"pending","format":"character varying","maxLength":32,"type":"string"},"review_notes":{"format":"text","type":"string"},"review_result":{"format":"jsonb"},"completed_at":{"format":"timestamp with time zone","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_permissions":{"description":"权限定义表","required":["id","code","name","resource_type","action"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"code":{"format":"character varying","maxLength":64,"type":"string"},"name":{"format":"character varying","maxLength":128,"type":"string"},"description":{"format":"text","type":"string"},"resource_type":{"format":"character varying","maxLength":32,"type":"string"},"action":{"format":"character varying","maxLength":32,"type":"string"},"is_system":{"default":false,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_device_events":{"description":"设备事件日志表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"device_id":{"description":"Note:\nThis is a Foreign Key to `ak_devices.id`.","format":"uuid","type":"string"},"event_type":{"format":"character varying","maxLength":32,"type":"string"},"event_time":{"default":"now()","format":"timestamp with time zone","type":"string"},"data":{"format":"jsonb"}},"type":"object"},"ak_cost_limits":{"description":"成本控制限额表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"limit_type":{"format":"character varying","maxLength":32,"type":"string"},"limit_scope":{"format":"character varying","maxLength":32,"type":"string"},"scope_id":{"format":"uuid","type":"string"},"limit_amount":{"format":"numeric","type":"number"},"current_usage":{"default":0,"format":"numeric","type":"number"},"period_start":{"format":"date","type":"string"},"period_end":{"format":"date","type":"string"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"alert_threshold":{"default":0.8,"format":"numeric","type":"number"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_point_rules":{"description":"积分规则表","required":["id","rule_name","event_code","points"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"rule_name":{"format":"character varying","maxLength":64,"type":"string"},"event_code":{"format":"character varying","maxLength":64,"type":"string"},"points":{"format":"integer","type":"integer"},"limit_per_day":{"format":"integer","type":"integer"},"description":{"format":"text","type":"string"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_user_points":{"description":"积分账户表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"total_points":{"default":0,"format":"integer","type":"integer"},"available_points":{"default":0,"format":"integer","type":"integer"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_user_profiles":{"description":"用户兴趣画像表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"avatar_url":{"format":"text","type":"string"},"background_url":{"format":"text","type":"string"},"declaration":{"format":"text","type":"string"},"status_text":{"format":"text","type":"string"},"status_media_url":{"format":"text","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_recommendations":{"description":"推荐记录表","required":["id","score"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"algorithm_type":{"format":"character varying","maxLength":32,"type":"string"},"score":{"format":"double precision","type":"number"},"reason":{"format":"text","type":"string"},"position":{"format":"integer","type":"integer"},"shown_at":{"format":"timestamp with time zone","type":"string"},"clicked_at":{"format":"timestamp with time zone","type":"string"},"feedback_score":{"format":"integer","type":"integer"},"feedback_reason":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"vw_multilingual_contents":{"description":"多语言内容聚合视图","properties":{"id":{"description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"original_title":{"format":"text","type":"string"},"original_content":{"format":"text","type":"string"},"original_summary":{"format":"text","type":"string"},"original_language":{"format":"character varying","maxLength":10,"type":"string"},"category_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_categories.id`.","format":"uuid","type":"string"},"category_name":{"format":"character varying","maxLength":64,"type":"string"},"quality_score":{"format":"double precision","type":"number"},"published_at":{"format":"timestamp with time zone","type":"string"},"status":{"format":"character varying","maxLength":32,"type":"string"},"view_count":{"format":"integer","type":"integer"},"like_count":{"format":"integer","type":"integer"},"share_count":{"format":"integer","type":"integer"},"translations":{"format":"json"},"ai_tags":{"format":"json"}},"type":"object"},"ak_favorite_folders":{"description":"收藏夹表","required":["id","user_id","name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"format":"uuid","type":"string"},"name":{"format":"character varying","maxLength":100,"type":"string"},"description":{"format":"text","type":"string"},"icon":{"format":"character varying","maxLength":32,"type":"string"},"color":{"format":"character varying","maxLength":7,"type":"string"},"display_order":{"default":0,"format":"integer","type":"integer"},"is_default":{"default":false,"description":"每个用户只能有一个默认收藏夹","format":"boolean","type":"boolean"},"is_public":{"default":false,"format":"boolean","type":"boolean"},"item_count":{"default":0,"description":"收藏项目数量,由触发器维护","format":"integer","type":"integer"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_class_schedules":{"description":"课程安排表","required":["id","subject","day_of_week","start_time","end_time"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"teacher_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"school_id":{"description":"Note:\nThis is a Foreign Key to `ak_schools.id`.","format":"uuid","type":"string"},"class_id":{"description":"Note:\nThis is a Foreign Key to `ak_classes.id`.","format":"uuid","type":"string"},"subject":{"description":"科目名称,如体育、数学等","format":"character varying","maxLength":64,"type":"string"},"day_of_week":{"description":"星期几,1=周一,2=周二...7=周日","format":"integer","type":"integer"},"start_time":{"format":"time without time zone","type":"string"},"end_time":{"format":"time without time zone","type":"string"},"location":{"format":"character varying","maxLength":128,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_topics":{"description":"专题表","required":["id","title","topic_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"title":{"format":"character varying","maxLength":255,"type":"string"},"description":{"format":"text","type":"string"},"topic_type":{"default":"series","description":"专题类型:突发事件、热门话题、系列专题、深度分析等","format":"character varying","maxLength":32,"type":"string"},"status":{"default":"active","description":"专题状态:草稿、活跃、精选、归档、关闭","format":"character varying","maxLength":32,"type":"string"},"cover_image_url":{"format":"text","type":"string"},"creator_id":{"format":"uuid","type":"string"},"editor_id":{"format":"uuid","type":"string"},"content_count":{"default":0,"format":"integer","type":"integer"},"view_count":{"default":0,"format":"integer","type":"integer"},"like_count":{"default":0,"format":"integer","type":"integer"},"share_count":{"default":0,"format":"integer","type":"integer"},"comment_count":{"default":0,"format":"integer","type":"integer"},"subscriber_count":{"default":0,"format":"integer","type":"integer"},"last_content_added_at":{"format":"timestamp with time zone","type":"string"},"featured_until":{"format":"timestamp with time zone","type":"string"},"meta_keywords":{"format":"text[]","items":{"type":"string"},"type":"array"},"meta_description":{"format":"text","type":"string"},"seo_slug":{"format":"character varying","maxLength":255,"type":"string"},"priority_level":{"default":0,"description":"优先级:数字越大优先级越高","format":"integer","type":"integer"},"tags":{"format":"text[]","items":{"type":"string"},"type":"array"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"favorite_count":{"default":0,"format":"integer","type":"integer"}},"type":"object"},"ak_user_behaviors":{"description":"用户行为记录表","required":["id","behavior_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"behavior_type":{"format":"character varying","maxLength":32,"type":"string"},"behavior_data":{"format":"jsonb"},"duration_seconds":{"format":"integer","type":"integer"},"scroll_percentage":{"format":"double precision","type":"number"},"device_type":{"format":"character varying","maxLength":32,"type":"string"},"source":{"format":"character varying","maxLength":64,"type":"string"},"session_id":{"format":"character varying","maxLength":128,"type":"string"},"ip_address":{"format":"inet","type":"string"},"user_agent":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_app_translations":{"description":"应用翻译表(前端界面文本)","required":["key","text","language_id"],"properties":{"key":{"description":"Note:\nThis is a Primary Key.","format":"character varying","maxLength":255,"type":"string"},"text":{"format":"text","type":"string"},"language_id":{"description":"Note:\nThis is a Primary Key.\nThis is a Foreign Key to `ak_languages.id`.","format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_ai_usage_stats":{"description":"AI服务使用统计表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"service_type":{"format":"character varying","maxLength":32,"type":"string"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"model_name":{"format":"character varying","maxLength":64,"type":"string"},"tokens_used":{"format":"integer","type":"integer"},"requests_count":{"default":1,"format":"integer","type":"integer"},"cost_usd":{"format":"numeric","type":"number"},"processing_time_ms":{"format":"integer","type":"integer"},"success_count":{"default":0,"format":"integer","type":"integer"},"error_count":{"default":0,"format":"integer","type":"integer"},"date_bucket":{"format":"date","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_teaching_resources":{"description":"教学资源表","required":["id","type","title"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"teacher_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"type":{"description":"资源类型:video(视频), document(文档), plan(计划), image(图片)等","format":"character varying","maxLength":32,"type":"string"},"title":{"format":"character varying","maxLength":128,"type":"string"},"description":{"format":"text","type":"string"},"content_url":{"format":"text","type":"string"},"tags":{"description":"标签数组,JSON格式存储","format":"jsonb"},"is_public":{"default":false,"description":"是否公开,public资源可被其他教师查看","format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_training_plans":{"description":"训练计划表","required":["id","plan_name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"plan_name":{"format":"character varying","maxLength":128,"type":"string"},"description":{"format":"text","type":"string"},"start_date":{"format":"date","type":"string"},"end_date":{"format":"date","type":"string"},"status":{"default":"active","format":"character varying","maxLength":16,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_classes":{"description":"班级表","required":["id","name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"grade_id":{"description":"所属年级\n\nNote:\nThis is a Foreign Key to `ak_grades.id`.","format":"uuid","type":"string"},"name":{"format":"character varying","maxLength":32,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_sport_reports":{"description":"运动报告表","required":["id","title","content_md"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"title":{"format":"character varying","maxLength":128,"type":"string"},"content_md":{"format":"text","type":"string"},"cover_url":{"format":"text","type":"string"},"visibility":{"default":"private","format":"character varying","maxLength":16,"type":"string"},"visible_until":{"format":"timestamp with time zone","type":"string"},"allow_comment":{"default":true,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_comment_reactions":{"description":"评论反应表(点赞、踩等)","required":["id","comment_id","user_id","reaction_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"comment_id":{"description":"Note:\nThis is a Foreign Key to `ak_comments.id`.","format":"uuid","type":"string"},"user_id":{"format":"uuid","type":"string"},"reaction_type":{"default":"like","format":"character varying","maxLength":20,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_comment_reports":{"description":"评论举报表","required":["id","comment_id","reporter_id","report_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"comment_id":{"description":"Note:\nThis is a Foreign Key to `ak_comments.id`.","format":"uuid","type":"string"},"reporter_id":{"format":"uuid","type":"string"},"report_type":{"format":"character varying","maxLength":32,"type":"string"},"report_reason":{"format":"text","type":"string"},"status":{"default":"pending","format":"character varying","maxLength":20,"type":"string"},"reviewed_by":{"format":"uuid","type":"string"},"reviewed_at":{"format":"timestamp with time zone","type":"string"},"review_notes":{"format":"text","type":"string"},"action_taken":{"format":"character varying","maxLength":50,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_content_translations":{"description":"内容翻译表","required":["id","title","content"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"language_id":{"description":"Note:\nThis is a Foreign Key to `ak_languages.id`.","format":"uuid","type":"string"},"title":{"format":"text","type":"string"},"content":{"format":"text","type":"string"},"summary":{"format":"text","type":"string"},"translation_method":{"default":"ai","format":"character varying","maxLength":32,"type":"string"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"quality_score":{"format":"double precision","type":"number"},"ai_confidence":{"format":"double precision","type":"number"},"human_verified":{"default":false,"format":"boolean","type":"boolean"},"human_verified_by":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"human_verified_at":{"format":"timestamp with time zone","type":"string"},"tokens_used":{"format":"integer","type":"integer"},"processing_time_ms":{"format":"integer","type":"integer"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_database_versions":{"required":["id","version"],"properties":{"id":{"description":"Note:\nThis is a Primary Key.","format":"integer","type":"integer"},"version":{"format":"character varying","maxLength":32,"type":"string"},"description":{"format":"text","type":"string"},"applied_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_sport_report_shares":{"description":"运动报告分享记录表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"report_id":{"description":"Note:\nThis is a Foreign Key to `ak_sport_reports.id`.","format":"uuid","type":"string"},"shared_by":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"shared_to":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"share_type":{"default":"link","format":"character varying","maxLength":16,"type":"string"},"share_token":{"format":"character varying","maxLength":64,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"expired_at":{"format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_users":{"description":"用户表","required":["id","username","email","password_hash"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"username":{"description":"用户名","format":"character varying","maxLength":64,"type":"string"},"email":{"description":"邮箱","format":"character varying","maxLength":128,"type":"string"},"password_hash":{"format":"character varying","maxLength":256,"type":"string"},"gender":{"default":"other","description":"性别","format":"character varying","maxLength":16,"type":"string"},"birthday":{"format":"date","type":"string"},"height_cm":{"format":"integer","type":"integer"},"weight_kg":{"format":"integer","type":"integer"},"bio":{"format":"text","type":"string"},"phone":{"format":"character varying","maxLength":32,"type":"string"},"avatar_url":{"format":"text","type":"string"},"region_id":{"description":"所属地区\n\nNote:\nThis is a Foreign Key to `ak_regions.id`.","format":"uuid","type":"string"},"school_id":{"description":"所属学校\n\nNote:\nThis is a Foreign Key to `ak_schools.id`.","format":"uuid","type":"string"},"grade_id":{"description":"所属年级\n\nNote:\nThis is a Foreign Key to `ak_grades.id`.","format":"uuid","type":"string"},"class_id":{"description":"所属班级\n\nNote:\nThis is a Foreign Key to `ak_classes.id`.","format":"uuid","type":"string"},"role":{"default":"student","description":"用户角色","format":"character varying","maxLength":32,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"auth_id":{"format":"uuid","type":"string"},"preferred_language":{"description":"用户偏好语言\n\nNote:\nThis is a Foreign Key to `ak_languages.id`.","format":"uuid","type":"string"}},"type":"object"},"ak_roles":{"description":"角色定义表","required":["id","name","level"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"name":{"format":"character varying","maxLength":32,"type":"string"},"description":{"format":"text","type":"string"},"level":{"format":"integer","type":"integer"},"is_system":{"default":false,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_translations":{"description":"数据翻译基础表(用于继承)","required":["id","record_id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"record_id":{"format":"uuid","type":"string"},"language_id":{"description":"Note:\nThis is a Foreign Key to `ak_languages.id`.","format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_video_analysis":{"description":"视频分析结果表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"device_id":{"description":"Note:\nThis is a Foreign Key to `ak_devices.id`.","format":"uuid","type":"string"},"record_id":{"description":"Note:\nThis is a Foreign Key to `ak_training_records.id`.","format":"uuid","type":"string"},"video_url":{"format":"text","type":"string"},"analysis_type":{"format":"character varying","maxLength":32,"type":"string"},"result":{"format":"jsonb"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_region_translations":{"description":"区域名称翻译表","required":["id","record_id","region_name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"record_id":{"description":"Note:\nThis is a Foreign Key to `ak_regions.id`.","format":"uuid","type":"string"},"language_id":{"format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"region_name":{"format":"character varying","maxLength":128,"type":"string"}},"type":"object"},"ak_comments":{"description":"评论表","required":["id","target_type","target_id","author_id","author_name","content"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"target_type":{"description":"评论目标类型:content=内容评论,topic=专题评论","format":"character varying","maxLength":20,"type":"string"},"target_id":{"format":"uuid","type":"string"},"parent_id":{"description":"Note:\nThis is a Foreign Key to `ak_comments.id`.","format":"uuid","type":"string"},"author_id":{"format":"uuid","type":"string"},"author_name":{"format":"character varying","maxLength":100,"type":"string"},"author_avatar":{"format":"text","type":"string"},"content":{"format":"text","type":"string"},"content_html":{"format":"text","type":"string"},"status":{"default":"active","format":"character varying","maxLength":20,"type":"string"},"like_count":{"default":0,"format":"integer","type":"integer"},"dislike_count":{"default":0,"format":"integer","type":"integer"},"reply_count":{"default":0,"format":"integer","type":"integer"},"level":{"default":0,"description":"评论层级:0=顶级,1=一级回复,2=二级回复,最多3级","format":"integer","type":"integer"},"thread_path":{"description":"线程路径,用于快速查询评论树结构","format":"text","type":"string"},"is_pinned":{"default":false,"format":"boolean","type":"boolean"},"is_author_reply":{"default":false,"format":"boolean","type":"boolean"},"quality_score":{"default":0.5,"description":"评论质量评分,由AI算法计算","format":"double precision","type":"number"},"sentiment_score":{"format":"double precision","type":"number"},"language_detected":{"format":"character varying","maxLength":10,"type":"string"},"ip_address":{"format":"inet","type":"string"},"user_agent":{"format":"text","type":"string"},"device_info":{"format":"jsonb"},"moderation_flags":{"format":"text[]","items":{"type":"string"},"type":"array"},"ai_analysis":{"format":"jsonb"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"deleted_at":{"format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_notifications":{"description":"消息/通知表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"title":{"format":"character varying","maxLength":128,"type":"string"},"content":{"format":"text","type":"string"},"status":{"default":"unread","format":"character varying","maxLength":16,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_biometric_data":{"description":"体征监测数据表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"device_id":{"description":"Note:\nThis is a Foreign Key to `ak_devices.id`.","format":"uuid","type":"string"},"data_type":{"format":"character varying","maxLength":32,"type":"string"},"value":{"format":"double precision","type":"number"},"unit":{"format":"character varying","maxLength":16,"type":"string"},"measured_at":{"format":"timestamp with time zone","type":"string"},"extra":{"format":"jsonb"}},"type":"object"},"ak_topic_subscriptions":{"description":"专题订阅表","required":["id","topic_id","user_id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"topic_id":{"description":"Note:\nThis is a Foreign Key to `ak_topics.id`.","format":"uuid","type":"string"},"user_id":{"format":"uuid","type":"string"},"notification_enabled":{"default":true,"format":"boolean","type":"boolean"},"subscribed_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"last_notified_at":{"format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_topic_contents":{"description":"专题内容关联表","required":["id","topic_id","content_id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"topic_id":{"description":"Note:\nThis is a Foreign Key to `ak_topics.id`.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"display_order":{"default":0,"description":"显示顺序,数字越小越靠前","format":"integer","type":"integer"},"editor_note":{"description":"编辑对该内容在专题中的说明","format":"text","type":"string"},"is_featured":{"default":false,"format":"boolean","type":"boolean"},"added_by":{"format":"uuid","type":"string"},"added_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_user_classes":{"description":"用户-班级多对多关系表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"class_id":{"description":"Note:\nThis is a Foreign Key to `ak_classes.id`.","format":"uuid","type":"string"},"role":{"format":"character varying","maxLength":32,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_comment_moderation_queue":{"description":"评论审核队列表","required":["id","comment_id","reason"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"comment_id":{"description":"Note:\nThis is a Foreign Key to `ak_comments.id`.","format":"uuid","type":"string"},"reason":{"format":"character varying","maxLength":100,"type":"string"},"priority_level":{"default":0,"format":"integer","type":"integer"},"assigned_to":{"format":"uuid","type":"string"},"status":{"default":"pending","format":"character varying","maxLength":20,"type":"string"},"ai_risk_score":{"format":"double precision","type":"number"},"ai_recommendations":{"format":"jsonb"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"assigned_at":{"format":"timestamp with time zone","type":"string"},"completed_at":{"format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_favorite_shares":{"description":"收藏夹分享表","required":["id","folder_id","shared_by"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"folder_id":{"description":"Note:\nThis is a Foreign Key to `ak_favorite_folders.id`.","format":"uuid","type":"string"},"shared_by":{"format":"uuid","type":"string"},"share_type":{"default":"link","format":"character varying","maxLength":20,"type":"string"},"share_code":{"description":"分享码,用于生成分享链接","format":"character varying","maxLength":32,"type":"string"},"access_password":{"format":"character varying","maxLength":100,"type":"string"},"expire_at":{"format":"timestamp with time zone","type":"string"},"view_count":{"default":0,"format":"integer","type":"integer"},"clone_count":{"default":0,"description":"收藏夹被复制到其他用户的次数","format":"integer","type":"integer"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_assignments":{"description":"作业表","required":["id","title"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"teacher_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"title":{"format":"character varying","maxLength":128,"type":"string"},"project_name":{"format":"character varying","maxLength":128,"type":"string"},"status":{"default":"active","format":"character varying","maxLength":32,"type":"string"},"start_time":{"format":"timestamp with time zone","type":"string"},"end_time":{"format":"timestamp with time zone","type":"string"},"description":{"format":"text","type":"string"},"class_id":{"description":"Note:\nThis is a Foreign Key to `ak_classes.id`.","format":"uuid","type":"string"},"due_date":{"format":"timestamp with time zone","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_assignment_stats":{"description":"作业统计表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"assignment_id":{"description":"Note:\nThis is a Foreign Key to `ak_assignments.id`.","format":"uuid","type":"string"},"total_students":{"format":"integer","type":"integer"},"submitted_count":{"format":"integer","type":"integer"},"reviewed_count":{"format":"integer","type":"integer"},"avg_score":{"format":"double precision","type":"number"},"last_updated":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_ai_reports":{"description":"AI评估报告表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"record_id":{"description":"Note:\nThis is a Foreign Key to `ak_training_records.id`.","format":"uuid","type":"string"},"report_type":{"format":"character varying","maxLength":32,"type":"string"},"content":{"format":"jsonb"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_user_roles":{"description":"用户-角色关联表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"role_id":{"description":"Note:\nThis is a Foreign Key to `ak_roles.id`.","format":"uuid","type":"string"},"scope_type":{"description":"作用域类型,指定角色在哪个范围内有效","format":"character varying","maxLength":32,"type":"string"},"scope_id":{"description":"作用域ID,对应scope_type的记录ID","format":"uuid","type":"string"},"created_by":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_role_permissions":{"description":"角色-权限关联表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"role_id":{"description":"Note:\nThis is a Foreign Key to `ak_roles.id`.","format":"uuid","type":"string"},"permission_id":{"description":"Note:\nThis is a Foreign Key to `ak_permissions.id`.","format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_ai_translation_logs":{"description":"AI翻译日志表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"source_language":{"format":"character varying","maxLength":10,"type":"string"},"target_language":{"format":"character varying","maxLength":10,"type":"string"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"model_version":{"format":"character varying","maxLength":64,"type":"string"},"tokens_used":{"format":"integer","type":"integer"},"cost_usd":{"format":"numeric","type":"number"},"processing_time_ms":{"format":"integer","type":"integer"},"quality_score":{"format":"double precision","type":"number"},"error_message":{"format":"text","type":"string"},"retry_count":{"default":0,"format":"integer","type":"integer"},"success":{"default":true,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_chat_sessions":{"description":"AI聊天会话表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"session_name":{"format":"character varying","maxLength":128,"type":"string"},"language":{"default":"zh-CN","format":"character varying","maxLength":10,"type":"string"},"context":{"format":"jsonb"},"ai_model":{"default":"gpt-4","format":"character varying","maxLength":64,"type":"string"},"total_messages":{"default":0,"format":"integer","type":"integer"},"total_tokens":{"default":0,"format":"integer","type":"integer"},"cost_usd":{"default":0,"format":"numeric","type":"number"},"last_message_at":{"format":"timestamp with time zone","type":"string"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_grades":{"description":"年级表","required":["id","name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"school_id":{"description":"所属学校\n\nNote:\nThis is a Foreign Key to `ak_schools.id`.","format":"uuid","type":"string"},"name":{"format":"character varying","maxLength":32,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_languages":{"description":"支持的语言表","required":["id","code","name","native_name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"code":{"format":"character varying","maxLength":10,"type":"string"},"name":{"format":"character varying","maxLength":50,"type":"string"},"native_name":{"format":"character varying","maxLength":50,"type":"string"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"is_default":{"default":false,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"ai_translation_enabled":{"default":true,"description":"AI翻译是否启用","format":"boolean","type":"boolean"},"translation_quality_threshold":{"default":0.8,"description":"翻译质量阈值(0-1)","format":"double precision","type":"number"},"ai_provider_priority":{"description":"AI提供商优先级配置","format":"jsonb"},"cultural_adaptation_rules":{"description":"文化适应性规则","format":"jsonb"}},"type":"object"},"ak_training_plan_items":{"description":"训练计划明细表","required":["id","item_date"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"plan_id":{"description":"Note:\nThis is a Foreign Key to `ak_training_plans.id`.","format":"uuid","type":"string"},"item_date":{"format":"date","type":"string"},"activity_type":{"format":"character varying","maxLength":64,"type":"string"},"target_value":{"format":"double precision","type":"number"},"unit":{"format":"character varying","maxLength":16,"type":"string"},"description":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_content_shares":{"description":"内容转发分享表","required":["id","user_id","target_type","target_id","share_type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"format":"uuid","type":"string"},"target_type":{"format":"character varying","maxLength":20,"type":"string"},"target_id":{"format":"uuid","type":"string"},"share_type":{"default":"forward","description":"分享类型:forward=转发,quote=引用,repost=重发,link=链接分享","format":"character varying","maxLength":20,"type":"string"},"share_platform":{"format":"character varying","maxLength":32,"type":"string"},"share_content":{"format":"text","type":"string"},"share_title":{"format":"character varying","maxLength":255,"type":"string"},"original_author_id":{"format":"uuid","type":"string"},"parent_share_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_shares.id`.","format":"uuid","type":"string"},"share_level":{"default":0,"description":"转发层级,用于追踪转发链条","format":"integer","type":"integer"},"reach_count":{"default":0,"description":"触达人数,用于分析传播效果","format":"integer","type":"integer"},"click_count":{"default":0,"format":"integer","type":"integer"},"like_count":{"default":0,"format":"integer","type":"integer"},"comment_count":{"default":0,"format":"integer","type":"integer"},"reshare_count":{"default":0,"format":"integer","type":"integer"},"is_deleted":{"default":false,"format":"boolean","type":"boolean"},"deleted_reason":{"format":"character varying","maxLength":100,"type":"string"},"ip_address":{"format":"inet","type":"string"},"user_agent":{"format":"text","type":"string"},"device_info":{"format":"jsonb"},"geo_location":{"format":"point","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"deleted_at":{"format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_content_categories":{"description":"内容分类表","required":["id","name_key"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"name_key":{"format":"character varying","maxLength":64,"type":"string"},"parent_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_categories.id`.","format":"uuid","type":"string"},"level":{"default":0,"format":"integer","type":"integer"},"ai_keywords":{"format":"text[]","items":{"type":"string"},"type":"array"},"confidence_threshold":{"default":0.8,"format":"double precision","type":"number"},"sort_order":{"default":0,"format":"integer","type":"integer"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"vw_regions_i18n":{"description":"区域多语言视图","properties":{"id":{"description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"parent_id":{"description":"Note:\nThis is a Foreign Key to `ak_regions.id`.","format":"uuid","type":"string"},"level":{"format":"integer","type":"integer"},"created_at":{"format":"timestamp with time zone","type":"string"},"language_id":{"description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"language_code":{"format":"character varying","maxLength":10,"type":"string"},"name":{"format":"character varying","maxLength":128,"type":"string"}},"type":"object"},"ak_content_quality_history":{"description":"内容质量评估历史表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"quality_type":{"format":"character varying","maxLength":32,"type":"string"},"quality_score":{"format":"double precision","type":"number"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"model_version":{"format":"character varying","maxLength":64,"type":"string"},"assessment_criteria":{"format":"jsonb"},"reviewer_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"notes":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_training_records":{"description":"训练记录表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"plan_item_id":{"description":"Note:\nThis is a Foreign Key to `ak_training_plan_items.id`.","format":"uuid","type":"string"},"device_id":{"description":"Note:\nThis is a Foreign Key to `ak_devices.id`.","format":"uuid","type":"string"},"activity_type":{"format":"character varying","maxLength":64,"type":"string"},"start_time":{"format":"timestamp with time zone","type":"string"},"end_time":{"format":"timestamp with time zone","type":"string"},"duration_sec":{"format":"integer","type":"integer"},"distance_km":{"format":"double precision","type":"number"},"calories":{"format":"double precision","type":"number"},"steps":{"format":"integer","type":"integer"},"avg_heart_rate":{"format":"integer","type":"integer"},"max_heart_rate":{"format":"integer","type":"integer"},"data":{"format":"jsonb"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_user_point_logs":{"description":"积分变动明细表","required":["id","change_type","points"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"change_type":{"format":"character varying","maxLength":32,"type":"string"},"points":{"format":"integer","type":"integer"},"reason":{"format":"text","type":"string"},"related_id":{"format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_chat_messages":{"description":"AI聊天消息表","required":["id","content"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"session_id":{"description":"Note:\nThis is a Foreign Key to `ak_chat_sessions.id`.","format":"uuid","type":"string"},"message_type":{"format":"character varying","maxLength":32,"type":"string"},"content":{"format":"text","type":"string"},"intent":{"format":"character varying","maxLength":64,"type":"string"},"attachments":{"format":"jsonb"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"tokens_used":{"format":"integer","type":"integer"},"processing_time_ms":{"format":"integer","type":"integer"},"cost_usd":{"format":"numeric","type":"number"},"feedback_score":{"format":"integer","type":"integer"},"feedback_reason":{"format":"text","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_contents":{"description":"处理后的内容表","required":["id","title","content","original_language","quality_score","published_at"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"raw_content_id":{"description":"Note:\nThis is a Foreign Key to `ak_raw_contents.id`.","format":"uuid","type":"string"},"title":{"format":"text","type":"string"},"content":{"format":"text","type":"string"},"summary":{"format":"text","type":"string"},"author":{"format":"character varying","maxLength":128,"type":"string"},"source_url":{"format":"text","type":"string"},"original_language":{"format":"character varying","maxLength":10,"type":"string"},"category_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_categories.id`.","format":"uuid","type":"string"},"tags":{"format":"text[]","items":{"type":"string"},"type":"array"},"keywords":{"format":"text[]","items":{"type":"string"},"type":"array"},"entities":{"format":"jsonb"},"sentiment_score":{"format":"double precision","type":"number"},"readability_score":{"format":"double precision","type":"number"},"credibility_score":{"format":"double precision","type":"number"},"quality_score":{"format":"double precision","type":"number"},"view_count":{"default":0,"format":"integer","type":"integer"},"like_count":{"default":0,"format":"integer","type":"integer"},"share_count":{"default":0,"format":"integer","type":"integer"},"comment_count":{"default":0,"format":"integer","type":"integer"},"published_at":{"format":"timestamp with time zone","type":"string"},"featured_until":{"format":"timestamp with time zone","type":"string"},"status":{"default":"published","format":"character varying","maxLength":32,"type":"string"},"ai_processed_at":{"format":"timestamp with time zone","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"favorite_count":{"default":0,"format":"integer","type":"integer"}},"type":"object"},"ak_school_translations":{"description":"学校名称翻译表","required":["id","record_id","school_name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"record_id":{"description":"Note:\nThis is a Foreign Key to `ak_schools.id`.","format":"uuid","type":"string"},"language_id":{"format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"school_name":{"format":"character varying","maxLength":128,"type":"string"},"school_type":{"format":"character varying","maxLength":32,"type":"string"}},"type":"object"},"ak_schools":{"description":"学校表","required":["id","name"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"name":{"format":"character varying","maxLength":128,"type":"string"},"region_id":{"description":"所属地区\n\nNote:\nThis is a Foreign Key to `ak_regions.id`.","format":"uuid","type":"string"},"type":{"format":"character varying","maxLength":32,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_content_favorites":{"description":"内容收藏表","required":["id","user_id","target_type","target_id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"format":"uuid","type":"string"},"target_type":{"description":"收藏目标类型:content=内容收藏,topic=专题收藏","format":"character varying","maxLength":20,"type":"string"},"target_id":{"format":"uuid","type":"string"},"folder_id":{"description":"收藏夹ID,NULL表示默认收藏夹","format":"uuid","type":"string"},"notes":{"format":"text","type":"string"},"tags":{"format":"text[]","items":{"type":"string"},"type":"array"},"is_public":{"default":false,"description":"是否公开收藏,用于社交功能","format":"boolean","type":"boolean"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_raw_contents":{"description":"原始内容表","required":["id","title","content"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"source_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_sources.id`.","format":"uuid","type":"string"},"external_id":{"format":"character varying","maxLength":256,"type":"string"},"title":{"format":"text","type":"string"},"content":{"format":"text","type":"string"},"summary":{"format":"text","type":"string"},"author":{"format":"character varying","maxLength":128,"type":"string"},"source_url":{"format":"text","type":"string"},"published_at":{"format":"timestamp with time zone","type":"string"},"language_detected":{"format":"character varying","maxLength":10,"type":"string"},"language_confidence":{"format":"double precision","type":"number"},"content_hash":{"format":"character varying","maxLength":64,"type":"string"},"raw_metadata":{"format":"jsonb"},"processing_status":{"default":"pending","format":"character varying","maxLength":32,"type":"string"},"quality_score":{"format":"double precision","type":"number"},"duplicate_of":{"description":"Note:\nThis is a Foreign Key to `ak_raw_contents.id`.","format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_ai_tags":{"description":"AI生成的标签表","required":["id","tag_name","confidence_score"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"tag_name":{"format":"character varying","maxLength":128,"type":"string"},"confidence_score":{"format":"double precision","type":"number"},"tag_type":{"default":"topic","format":"character varying","maxLength":32,"type":"string"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"language":{"format":"character varying","maxLength":10,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_point_transactions":{"description":"积分交易记录表","required":["id","transaction_type","points"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"transaction_type":{"description":"交易类型:earn(获得), spend(消费), refund(退还)等","format":"character varying","maxLength":32,"type":"string"},"points":{"description":"积分数量,正数表示获得,负数表示消费","format":"integer","type":"integer"},"description":{"format":"text","type":"string"},"reference_id":{"description":"关联业务ID,如训练记录ID、商品ID等","format":"uuid","type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_content_analysis":{"description":"内容分析结果表","required":["id"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"content_id":{"description":"Note:\nThis is a Foreign Key to `ak_contents.id`.","format":"uuid","type":"string"},"category_id":{"description":"Note:\nThis is a Foreign Key to `ak_content_categories.id`.","format":"uuid","type":"string"},"sentiment_score":{"format":"double precision","type":"number"},"sentiment_label":{"format":"character varying","maxLength":32,"type":"string"},"readability_score":{"format":"double precision","type":"number"},"credibility_score":{"format":"double precision","type":"number"},"toxicity_score":{"format":"double precision","type":"number"},"keywords":{"format":"jsonb"},"entities":{"format":"jsonb"},"topics":{"format":"jsonb"},"summary":{"format":"text","type":"string"},"key_phrases":{"format":"text[]","items":{"type":"string"},"type":"array"},"ai_provider":{"format":"character varying","maxLength":32,"type":"string"},"model_version":{"format":"character varying","maxLength":64,"type":"string"},"processing_time_ms":{"format":"integer","type":"integer"},"ai_processed_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_user_contacts":{"description":"用户联系方式表","required":["id","contact_type","contact_value"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"user_id":{"description":"Note:\nThis is a Foreign Key to `ak_users.id`.","format":"uuid","type":"string"},"contact_type":{"description":"联系方式类型","format":"character varying","maxLength":32,"type":"string"},"contact_value":{"description":"联系方式内容","format":"character varying","maxLength":128,"type":"string"},"is_primary":{"default":false,"format":"boolean","type":"boolean"},"remark":{"format":"character varying","maxLength":128,"type":"string"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_content_sources":{"description":"内容源配置表","required":["id","name","type"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"name":{"format":"character varying","maxLength":128,"type":"string"},"type":{"format":"character varying","maxLength":32,"type":"string"},"url":{"format":"text","type":"string"},"config":{"format":"jsonb"},"language_id":{"description":"Note:\nThis is a Foreign Key to `ak_languages.id`.","format":"uuid","type":"string"},"category":{"format":"character varying","maxLength":64,"type":"string"},"quality_weight":{"default":1.0,"format":"double precision","type":"number"},"crawl_frequency":{"default":3600,"format":"integer","type":"integer"},"last_crawled_at":{"format":"timestamp with time zone","type":"string"},"is_active":{"default":true,"format":"boolean","type":"boolean"},"ai_quality_threshold":{"default":0.6,"format":"double precision","type":"number"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"},"ak_share_analytics":{"description":"分享统计分析表","required":["id","target_type","target_id","date_recorded","platform"],"properties":{"id":{"default":"gen_random_uuid()","description":"Note:\nThis is a Primary Key.","format":"uuid","type":"string"},"target_type":{"format":"character varying","maxLength":20,"type":"string"},"target_id":{"format":"uuid","type":"string"},"date_recorded":{"default":"CURRENT_DATE","format":"date","type":"string"},"platform":{"format":"character varying","maxLength":32,"type":"string"},"share_count":{"default":0,"format":"integer","type":"integer"},"unique_sharers":{"default":0,"format":"integer","type":"integer"},"total_reach":{"default":0,"format":"integer","type":"integer"},"total_clicks":{"default":0,"format":"integer","type":"integer"},"avg_share_level":{"default":0,"format":"double precision","type":"number"},"viral_coefficient":{"default":0,"description":"病毒传播系数,用于分析内容传播力","format":"double precision","type":"number"},"created_at":{"default":"now()","format":"timestamp with time zone","type":"string"},"updated_at":{"default":"now()","format":"timestamp with time zone","type":"string"}},"type":"object"}},"parameters":{"preferParams":{"name":"Prefer","description":"Preference","required":false,"enum":["params=single-object"],"in":"header","type":"string"},"preferReturn":{"name":"Prefer","description":"Preference","required":false,"enum":["return=representation","return=minimal","return=none"],"in":"header","type":"string"},"preferCount":{"name":"Prefer","description":"Preference","required":false,"enum":["count=none"],"in":"header","type":"string"},"preferPost":{"name":"Prefer","description":"Preference","required":false,"enum":["return=representation","return=minimal","return=none","resolution=ignore-duplicates","resolution=merge-duplicates"],"in":"header","type":"string"},"select":{"name":"select","description":"Filtering Columns","required":false,"in":"query","type":"string"},"on_conflict":{"name":"on_conflict","description":"On Conflict","required":false,"in":"query","type":"string"},"order":{"name":"order","description":"Ordering","required":false,"in":"query","type":"string"},"range":{"name":"Range","description":"Limiting and Pagination","required":false,"in":"header","type":"string"},"rangeUnit":{"name":"Range-Unit","description":"Limiting and Pagination","required":false,"default":"items","in":"header","type":"string"},"offset":{"name":"offset","description":"Limiting and Pagination","required":false,"in":"query","type":"string"},"limit":{"name":"limit","description":"Limiting and Pagination","required":false,"in":"query","type":"string"},"body.ak_user_feedback":{"name":"ak_user_feedback","description":"ak_user_feedback","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_feedback"}},"rowFilter.ak_user_feedback.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_feedback.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_feedback.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_user_feedback.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_regions":{"name":"ak_regions","description":"ak_regions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_regions"}},"rowFilter.ak_regions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_regions.name":{"name":"name","description":"地区名称","required":false,"in":"query","type":"string"},"rowFilter.ak_regions.parent_id":{"name":"parent_id","description":"上级地区ID","required":false,"in":"query","type":"string"},"rowFilter.ak_regions.level":{"name":"level","description":"地区级别","required":false,"in":"query","type":"string"},"rowFilter.ak_regions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_assignment_submissions":{"name":"ak_assignment_submissions","description":"ak_assignment_submissions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_assignment_submissions"}},"rowFilter.ak_assignment_submissions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.assignment_id":{"name":"assignment_id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.student_id":{"name":"student_id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.submit_time":{"name":"submit_time","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.content_md":{"name":"content_md","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.attachment_url":{"name":"attachment_url","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.score":{"name":"score","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.feedback":{"name":"feedback","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_submissions.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_interactions":{"name":"ak_interactions","description":"ak_interactions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_interactions"}},"rowFilter.ak_interactions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.target_type":{"name":"target_type","description":"目标类型:training_record(训练记录), assignment_submission(作业提交), teaching_resource(教学资源)等","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.target_id":{"name":"target_id","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.interaction_type":{"name":"interaction_type","description":"互动类型:comment(评论), like(点赞), share(分享)等","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_interactions.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_teacher_roles":{"name":"ak_teacher_roles","description":"ak_teacher_roles","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_teacher_roles"}},"rowFilter.ak_teacher_roles.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_teacher_roles.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_teacher_roles.school_id":{"name":"school_id","required":false,"in":"query","type":"string"},"rowFilter.ak_teacher_roles.class_id":{"name":"class_id","required":false,"in":"query","type":"string"},"rowFilter.ak_teacher_roles.role":{"name":"role","required":false,"in":"query","type":"string"},"rowFilter.ak_teacher_roles.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_devices":{"name":"ak_devices","description":"ak_devices","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_devices"}},"rowFilter.ak_devices.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.device_type":{"name":"device_type","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.device_name":{"name":"device_name","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.device_mac":{"name":"device_mac","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.bind_time":{"name":"bind_time","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_devices.extra":{"name":"extra","required":false,"in":"query","type":"string"},"body.ak_review_queue":{"name":"ak_review_queue","description":"ak_review_queue","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_review_queue"}},"rowFilter.ak_review_queue.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.translation_id":{"name":"translation_id","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.review_type":{"name":"review_type","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.priority":{"name":"priority","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.reason":{"name":"reason","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.ai_confidence":{"name":"ai_confidence","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.requested_by":{"name":"requested_by","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.assigned_to":{"name":"assigned_to","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.review_notes":{"name":"review_notes","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.review_result":{"name":"review_result","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.completed_at":{"name":"completed_at","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_review_queue.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_permissions":{"name":"ak_permissions","description":"ak_permissions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_permissions"}},"rowFilter.ak_permissions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.code":{"name":"code","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.resource_type":{"name":"resource_type","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.action":{"name":"action","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.is_system":{"name":"is_system","required":false,"in":"query","type":"string"},"rowFilter.ak_permissions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_device_events":{"name":"ak_device_events","description":"ak_device_events","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_device_events"}},"rowFilter.ak_device_events.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_device_events.device_id":{"name":"device_id","required":false,"in":"query","type":"string"},"rowFilter.ak_device_events.event_type":{"name":"event_type","required":false,"in":"query","type":"string"},"rowFilter.ak_device_events.event_time":{"name":"event_time","required":false,"in":"query","type":"string"},"rowFilter.ak_device_events.data":{"name":"data","required":false,"in":"query","type":"string"},"body.ak_cost_limits":{"name":"ak_cost_limits","description":"ak_cost_limits","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_cost_limits"}},"rowFilter.ak_cost_limits.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.limit_type":{"name":"limit_type","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.limit_scope":{"name":"limit_scope","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.scope_id":{"name":"scope_id","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.limit_amount":{"name":"limit_amount","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.current_usage":{"name":"current_usage","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.period_start":{"name":"period_start","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.period_end":{"name":"period_end","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.alert_threshold":{"name":"alert_threshold","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_cost_limits.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_point_rules":{"name":"ak_point_rules","description":"ak_point_rules","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_point_rules"}},"rowFilter.ak_point_rules.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.rule_name":{"name":"rule_name","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.event_code":{"name":"event_code","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.points":{"name":"points","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.limit_per_day":{"name":"limit_per_day","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_point_rules.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_user_points":{"name":"ak_user_points","description":"ak_user_points","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_points"}},"rowFilter.ak_user_points.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_points.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_points.total_points":{"name":"total_points","required":false,"in":"query","type":"string"},"rowFilter.ak_user_points.available_points":{"name":"available_points","required":false,"in":"query","type":"string"},"rowFilter.ak_user_points.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_user_profiles":{"name":"ak_user_profiles","description":"ak_user_profiles","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_profiles"}},"rowFilter.ak_user_profiles.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.avatar_url":{"name":"avatar_url","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.background_url":{"name":"background_url","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.declaration":{"name":"declaration","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.status_text":{"name":"status_text","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.status_media_url":{"name":"status_media_url","required":false,"in":"query","type":"string"},"rowFilter.ak_user_profiles.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_recommendations":{"name":"ak_recommendations","description":"ak_recommendations","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_recommendations"}},"rowFilter.ak_recommendations.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.algorithm_type":{"name":"algorithm_type","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.score":{"name":"score","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.reason":{"name":"reason","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.position":{"name":"position","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.shown_at":{"name":"shown_at","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.clicked_at":{"name":"clicked_at","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.feedback_score":{"name":"feedback_score","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.feedback_reason":{"name":"feedback_reason","required":false,"in":"query","type":"string"},"rowFilter.ak_recommendations.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.vw_multilingual_contents":{"name":"vw_multilingual_contents","description":"vw_multilingual_contents","required":false,"in":"body","schema":{"$ref":"#/definitions/vw_multilingual_contents"}},"rowFilter.vw_multilingual_contents.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.original_title":{"name":"original_title","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.original_content":{"name":"original_content","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.original_summary":{"name":"original_summary","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.original_language":{"name":"original_language","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.category_id":{"name":"category_id","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.category_name":{"name":"category_name","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.quality_score":{"name":"quality_score","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.published_at":{"name":"published_at","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.view_count":{"name":"view_count","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.like_count":{"name":"like_count","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.share_count":{"name":"share_count","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.translations":{"name":"translations","required":false,"in":"query","type":"string"},"rowFilter.vw_multilingual_contents.ai_tags":{"name":"ai_tags","required":false,"in":"query","type":"string"},"body.ak_favorite_folders":{"name":"ak_favorite_folders","description":"ak_favorite_folders","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_favorite_folders"}},"rowFilter.ak_favorite_folders.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.icon":{"name":"icon","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.color":{"name":"color","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.display_order":{"name":"display_order","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.is_default":{"name":"is_default","description":"每个用户只能有一个默认收藏夹","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.is_public":{"name":"is_public","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.item_count":{"name":"item_count","description":"收藏项目数量,由触发器维护","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_folders.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_class_schedules":{"name":"ak_class_schedules","description":"ak_class_schedules","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_class_schedules"}},"rowFilter.ak_class_schedules.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.teacher_id":{"name":"teacher_id","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.school_id":{"name":"school_id","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.class_id":{"name":"class_id","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.subject":{"name":"subject","description":"科目名称,如体育、数学等","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.day_of_week":{"name":"day_of_week","description":"星期几,1=周一,2=周二...7=周日","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.start_time":{"name":"start_time","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.end_time":{"name":"end_time","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.location":{"name":"location","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_class_schedules.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_topics":{"name":"ak_topics","description":"ak_topics","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_topics"}},"rowFilter.ak_topics.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.topic_type":{"name":"topic_type","description":"专题类型:突发事件、热门话题、系列专题、深度分析等","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.status":{"name":"status","description":"专题状态:草稿、活跃、精选、归档、关闭","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.cover_image_url":{"name":"cover_image_url","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.creator_id":{"name":"creator_id","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.editor_id":{"name":"editor_id","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.content_count":{"name":"content_count","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.view_count":{"name":"view_count","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.like_count":{"name":"like_count","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.share_count":{"name":"share_count","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.comment_count":{"name":"comment_count","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.subscriber_count":{"name":"subscriber_count","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.last_content_added_at":{"name":"last_content_added_at","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.featured_until":{"name":"featured_until","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.meta_keywords":{"name":"meta_keywords","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.meta_description":{"name":"meta_description","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.seo_slug":{"name":"seo_slug","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.priority_level":{"name":"priority_level","description":"优先级:数字越大优先级越高","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.tags":{"name":"tags","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_topics.favorite_count":{"name":"favorite_count","required":false,"in":"query","type":"string"},"body.ak_user_behaviors":{"name":"ak_user_behaviors","description":"ak_user_behaviors","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_behaviors"}},"rowFilter.ak_user_behaviors.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.behavior_type":{"name":"behavior_type","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.behavior_data":{"name":"behavior_data","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.duration_seconds":{"name":"duration_seconds","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.scroll_percentage":{"name":"scroll_percentage","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.device_type":{"name":"device_type","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.source":{"name":"source","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.session_id":{"name":"session_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.ip_address":{"name":"ip_address","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.user_agent":{"name":"user_agent","required":false,"in":"query","type":"string"},"rowFilter.ak_user_behaviors.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_app_translations":{"name":"ak_app_translations","description":"ak_app_translations","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_app_translations"}},"rowFilter.ak_app_translations.key":{"name":"key","required":false,"in":"query","type":"string"},"rowFilter.ak_app_translations.text":{"name":"text","required":false,"in":"query","type":"string"},"rowFilter.ak_app_translations.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.ak_app_translations.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_app_translations.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_ai_usage_stats":{"name":"ak_ai_usage_stats","description":"ak_ai_usage_stats","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_ai_usage_stats"}},"rowFilter.ak_ai_usage_stats.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.service_type":{"name":"service_type","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.model_name":{"name":"model_name","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.tokens_used":{"name":"tokens_used","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.requests_count":{"name":"requests_count","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.cost_usd":{"name":"cost_usd","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.processing_time_ms":{"name":"processing_time_ms","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.success_count":{"name":"success_count","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.error_count":{"name":"error_count","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.date_bucket":{"name":"date_bucket","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_usage_stats.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_teaching_resources":{"name":"ak_teaching_resources","description":"ak_teaching_resources","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_teaching_resources"}},"rowFilter.ak_teaching_resources.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.teacher_id":{"name":"teacher_id","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.type":{"name":"type","description":"资源类型:video(视频), document(文档), plan(计划), image(图片)等","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.content_url":{"name":"content_url","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.tags":{"name":"tags","description":"标签数组,JSON格式存储","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.is_public":{"name":"is_public","description":"是否公开,public资源可被其他教师查看","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_teaching_resources.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_training_plans":{"name":"ak_training_plans","description":"ak_training_plans","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_training_plans"}},"rowFilter.ak_training_plans.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.plan_name":{"name":"plan_name","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.start_date":{"name":"start_date","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.end_date":{"name":"end_date","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plans.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_classes":{"name":"ak_classes","description":"ak_classes","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_classes"}},"rowFilter.ak_classes.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_classes.grade_id":{"name":"grade_id","description":"所属年级","required":false,"in":"query","type":"string"},"rowFilter.ak_classes.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_classes.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_sport_reports":{"name":"ak_sport_reports","description":"ak_sport_reports","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_sport_reports"}},"rowFilter.ak_sport_reports.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.content_md":{"name":"content_md","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.cover_url":{"name":"cover_url","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.visibility":{"name":"visibility","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.visible_until":{"name":"visible_until","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.allow_comment":{"name":"allow_comment","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_reports.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_comment_reactions":{"name":"ak_comment_reactions","description":"ak_comment_reactions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_comment_reactions"}},"rowFilter.ak_comment_reactions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reactions.comment_id":{"name":"comment_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reactions.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reactions.reaction_type":{"name":"reaction_type","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reactions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_comment_reports":{"name":"ak_comment_reports","description":"ak_comment_reports","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_comment_reports"}},"rowFilter.ak_comment_reports.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.comment_id":{"name":"comment_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.reporter_id":{"name":"reporter_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.report_type":{"name":"report_type","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.report_reason":{"name":"report_reason","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.reviewed_by":{"name":"reviewed_by","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.reviewed_at":{"name":"reviewed_at","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.review_notes":{"name":"review_notes","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.action_taken":{"name":"action_taken","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_reports.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_content_translations":{"name":"ak_content_translations","description":"ak_content_translations","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_translations"}},"rowFilter.ak_content_translations.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.summary":{"name":"summary","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.translation_method":{"name":"translation_method","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.quality_score":{"name":"quality_score","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.ai_confidence":{"name":"ai_confidence","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.human_verified":{"name":"human_verified","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.human_verified_by":{"name":"human_verified_by","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.human_verified_at":{"name":"human_verified_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.tokens_used":{"name":"tokens_used","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.processing_time_ms":{"name":"processing_time_ms","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_translations.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_database_versions":{"name":"ak_database_versions","description":"ak_database_versions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_database_versions"}},"rowFilter.ak_database_versions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_database_versions.version":{"name":"version","required":false,"in":"query","type":"string"},"rowFilter.ak_database_versions.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_database_versions.applied_at":{"name":"applied_at","required":false,"in":"query","type":"string"},"body.ak_sport_report_shares":{"name":"ak_sport_report_shares","description":"ak_sport_report_shares","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_sport_report_shares"}},"rowFilter.ak_sport_report_shares.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.report_id":{"name":"report_id","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.shared_by":{"name":"shared_by","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.shared_to":{"name":"shared_to","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.share_type":{"name":"share_type","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.share_token":{"name":"share_token","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_sport_report_shares.expired_at":{"name":"expired_at","required":false,"in":"query","type":"string"},"body.ak_users":{"name":"ak_users","description":"ak_users","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_users"}},"rowFilter.ak_users.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_users.username":{"name":"username","description":"用户名","required":false,"in":"query","type":"string"},"rowFilter.ak_users.email":{"name":"email","description":"邮箱","required":false,"in":"query","type":"string"},"rowFilter.ak_users.password_hash":{"name":"password_hash","required":false,"in":"query","type":"string"},"rowFilter.ak_users.gender":{"name":"gender","description":"性别","required":false,"in":"query","type":"string"},"rowFilter.ak_users.birthday":{"name":"birthday","required":false,"in":"query","type":"string"},"rowFilter.ak_users.height_cm":{"name":"height_cm","required":false,"in":"query","type":"string"},"rowFilter.ak_users.weight_kg":{"name":"weight_kg","required":false,"in":"query","type":"string"},"rowFilter.ak_users.bio":{"name":"bio","required":false,"in":"query","type":"string"},"rowFilter.ak_users.phone":{"name":"phone","required":false,"in":"query","type":"string"},"rowFilter.ak_users.avatar_url":{"name":"avatar_url","required":false,"in":"query","type":"string"},"rowFilter.ak_users.region_id":{"name":"region_id","description":"所属地区","required":false,"in":"query","type":"string"},"rowFilter.ak_users.school_id":{"name":"school_id","description":"所属学校","required":false,"in":"query","type":"string"},"rowFilter.ak_users.grade_id":{"name":"grade_id","description":"所属年级","required":false,"in":"query","type":"string"},"rowFilter.ak_users.class_id":{"name":"class_id","description":"所属班级","required":false,"in":"query","type":"string"},"rowFilter.ak_users.role":{"name":"role","description":"用户角色","required":false,"in":"query","type":"string"},"rowFilter.ak_users.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_users.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_users.auth_id":{"name":"auth_id","required":false,"in":"query","type":"string"},"rowFilter.ak_users.preferred_language":{"name":"preferred_language","description":"用户偏好语言","required":false,"in":"query","type":"string"},"body.ak_roles":{"name":"ak_roles","description":"ak_roles","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_roles"}},"rowFilter.ak_roles.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_roles.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_roles.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_roles.level":{"name":"level","required":false,"in":"query","type":"string"},"rowFilter.ak_roles.is_system":{"name":"is_system","required":false,"in":"query","type":"string"},"rowFilter.ak_roles.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_translations":{"name":"ak_translations","description":"ak_translations","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_translations"}},"rowFilter.ak_translations.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_translations.record_id":{"name":"record_id","required":false,"in":"query","type":"string"},"rowFilter.ak_translations.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.ak_translations.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_translations.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_video_analysis":{"name":"ak_video_analysis","description":"ak_video_analysis","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_video_analysis"}},"rowFilter.ak_video_analysis.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.device_id":{"name":"device_id","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.record_id":{"name":"record_id","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.video_url":{"name":"video_url","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.analysis_type":{"name":"analysis_type","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.result":{"name":"result","required":false,"in":"query","type":"string"},"rowFilter.ak_video_analysis.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_region_translations":{"name":"ak_region_translations","description":"ak_region_translations","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_region_translations"}},"rowFilter.ak_region_translations.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_region_translations.record_id":{"name":"record_id","required":false,"in":"query","type":"string"},"rowFilter.ak_region_translations.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.ak_region_translations.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_region_translations.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_region_translations.region_name":{"name":"region_name","required":false,"in":"query","type":"string"},"body.ak_comments":{"name":"ak_comments","description":"ak_comments","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_comments"}},"rowFilter.ak_comments.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.target_type":{"name":"target_type","description":"评论目标类型:content=内容评论,topic=专题评论","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.target_id":{"name":"target_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.parent_id":{"name":"parent_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.author_id":{"name":"author_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.author_name":{"name":"author_name","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.author_avatar":{"name":"author_avatar","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.content_html":{"name":"content_html","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.like_count":{"name":"like_count","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.dislike_count":{"name":"dislike_count","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.reply_count":{"name":"reply_count","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.level":{"name":"level","description":"评论层级:0=顶级,1=一级回复,2=二级回复,最多3级","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.thread_path":{"name":"thread_path","description":"线程路径,用于快速查询评论树结构","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.is_pinned":{"name":"is_pinned","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.is_author_reply":{"name":"is_author_reply","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.quality_score":{"name":"quality_score","description":"评论质量评分,由AI算法计算","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.sentiment_score":{"name":"sentiment_score","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.language_detected":{"name":"language_detected","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.ip_address":{"name":"ip_address","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.user_agent":{"name":"user_agent","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.device_info":{"name":"device_info","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.moderation_flags":{"name":"moderation_flags","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.ai_analysis":{"name":"ai_analysis","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_comments.deleted_at":{"name":"deleted_at","required":false,"in":"query","type":"string"},"body.ak_notifications":{"name":"ak_notifications","description":"ak_notifications","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_notifications"}},"rowFilter.ak_notifications.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_notifications.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_notifications.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_notifications.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_notifications.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_notifications.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_biometric_data":{"name":"ak_biometric_data","description":"ak_biometric_data","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_biometric_data"}},"rowFilter.ak_biometric_data.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.device_id":{"name":"device_id","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.data_type":{"name":"data_type","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.value":{"name":"value","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.unit":{"name":"unit","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.measured_at":{"name":"measured_at","required":false,"in":"query","type":"string"},"rowFilter.ak_biometric_data.extra":{"name":"extra","required":false,"in":"query","type":"string"},"body.ak_topic_subscriptions":{"name":"ak_topic_subscriptions","description":"ak_topic_subscriptions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_topic_subscriptions"}},"rowFilter.ak_topic_subscriptions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_subscriptions.topic_id":{"name":"topic_id","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_subscriptions.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_subscriptions.notification_enabled":{"name":"notification_enabled","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_subscriptions.subscribed_at":{"name":"subscribed_at","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_subscriptions.last_notified_at":{"name":"last_notified_at","required":false,"in":"query","type":"string"},"body.ak_topic_contents":{"name":"ak_topic_contents","description":"ak_topic_contents","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_topic_contents"}},"rowFilter.ak_topic_contents.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.topic_id":{"name":"topic_id","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.display_order":{"name":"display_order","description":"显示顺序,数字越小越靠前","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.editor_note":{"name":"editor_note","description":"编辑对该内容在专题中的说明","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.is_featured":{"name":"is_featured","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.added_by":{"name":"added_by","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.added_at":{"name":"added_at","required":false,"in":"query","type":"string"},"rowFilter.ak_topic_contents.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_user_classes":{"name":"ak_user_classes","description":"ak_user_classes","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_classes"}},"rowFilter.ak_user_classes.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_classes.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_classes.class_id":{"name":"class_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_classes.role":{"name":"role","required":false,"in":"query","type":"string"},"rowFilter.ak_user_classes.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_comment_moderation_queue":{"name":"ak_comment_moderation_queue","description":"ak_comment_moderation_queue","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_comment_moderation_queue"}},"rowFilter.ak_comment_moderation_queue.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.comment_id":{"name":"comment_id","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.reason":{"name":"reason","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.priority_level":{"name":"priority_level","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.assigned_to":{"name":"assigned_to","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.ai_risk_score":{"name":"ai_risk_score","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.ai_recommendations":{"name":"ai_recommendations","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.assigned_at":{"name":"assigned_at","required":false,"in":"query","type":"string"},"rowFilter.ak_comment_moderation_queue.completed_at":{"name":"completed_at","required":false,"in":"query","type":"string"},"body.ak_favorite_shares":{"name":"ak_favorite_shares","description":"ak_favorite_shares","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_favorite_shares"}},"rowFilter.ak_favorite_shares.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.folder_id":{"name":"folder_id","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.shared_by":{"name":"shared_by","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.share_type":{"name":"share_type","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.share_code":{"name":"share_code","description":"分享码,用于生成分享链接","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.access_password":{"name":"access_password","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.expire_at":{"name":"expire_at","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.view_count":{"name":"view_count","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.clone_count":{"name":"clone_count","description":"收藏夹被复制到其他用户的次数","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_favorite_shares.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_assignments":{"name":"ak_assignments","description":"ak_assignments","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_assignments"}},"rowFilter.ak_assignments.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.teacher_id":{"name":"teacher_id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.project_name":{"name":"project_name","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.start_time":{"name":"start_time","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.end_time":{"name":"end_time","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.class_id":{"name":"class_id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.due_date":{"name":"due_date","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_assignments.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_assignment_stats":{"name":"ak_assignment_stats","description":"ak_assignment_stats","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_assignment_stats"}},"rowFilter.ak_assignment_stats.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_stats.assignment_id":{"name":"assignment_id","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_stats.total_students":{"name":"total_students","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_stats.submitted_count":{"name":"submitted_count","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_stats.reviewed_count":{"name":"reviewed_count","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_stats.avg_score":{"name":"avg_score","required":false,"in":"query","type":"string"},"rowFilter.ak_assignment_stats.last_updated":{"name":"last_updated","required":false,"in":"query","type":"string"},"body.ak_ai_reports":{"name":"ak_ai_reports","description":"ak_ai_reports","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_ai_reports"}},"rowFilter.ak_ai_reports.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_reports.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_reports.record_id":{"name":"record_id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_reports.report_type":{"name":"report_type","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_reports.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_reports.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_user_roles":{"name":"ak_user_roles","description":"ak_user_roles","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_roles"}},"rowFilter.ak_user_roles.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_roles.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_roles.role_id":{"name":"role_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_roles.scope_type":{"name":"scope_type","description":"作用域类型,指定角色在哪个范围内有效","required":false,"in":"query","type":"string"},"rowFilter.ak_user_roles.scope_id":{"name":"scope_id","description":"作用域ID,对应scope_type的记录ID","required":false,"in":"query","type":"string"},"rowFilter.ak_user_roles.created_by":{"name":"created_by","required":false,"in":"query","type":"string"},"rowFilter.ak_user_roles.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_role_permissions":{"name":"ak_role_permissions","description":"ak_role_permissions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_role_permissions"}},"rowFilter.ak_role_permissions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_role_permissions.role_id":{"name":"role_id","required":false,"in":"query","type":"string"},"rowFilter.ak_role_permissions.permission_id":{"name":"permission_id","required":false,"in":"query","type":"string"},"rowFilter.ak_role_permissions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_ai_translation_logs":{"name":"ak_ai_translation_logs","description":"ak_ai_translation_logs","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_ai_translation_logs"}},"rowFilter.ak_ai_translation_logs.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.source_language":{"name":"source_language","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.target_language":{"name":"target_language","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.model_version":{"name":"model_version","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.tokens_used":{"name":"tokens_used","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.cost_usd":{"name":"cost_usd","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.processing_time_ms":{"name":"processing_time_ms","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.quality_score":{"name":"quality_score","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.error_message":{"name":"error_message","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.retry_count":{"name":"retry_count","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.success":{"name":"success","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_translation_logs.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_chat_sessions":{"name":"ak_chat_sessions","description":"ak_chat_sessions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_chat_sessions"}},"rowFilter.ak_chat_sessions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.session_name":{"name":"session_name","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.language":{"name":"language","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.context":{"name":"context","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.ai_model":{"name":"ai_model","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.total_messages":{"name":"total_messages","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.total_tokens":{"name":"total_tokens","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.cost_usd":{"name":"cost_usd","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.last_message_at":{"name":"last_message_at","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_sessions.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_grades":{"name":"ak_grades","description":"ak_grades","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_grades"}},"rowFilter.ak_grades.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_grades.school_id":{"name":"school_id","description":"所属学校","required":false,"in":"query","type":"string"},"rowFilter.ak_grades.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_grades.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_languages":{"name":"ak_languages","description":"ak_languages","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_languages"}},"rowFilter.ak_languages.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.code":{"name":"code","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.native_name":{"name":"native_name","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.is_default":{"name":"is_default","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.ai_translation_enabled":{"name":"ai_translation_enabled","description":"AI翻译是否启用","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.translation_quality_threshold":{"name":"translation_quality_threshold","description":"翻译质量阈值(0-1)","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.ai_provider_priority":{"name":"ai_provider_priority","description":"AI提供商优先级配置","required":false,"in":"query","type":"string"},"rowFilter.ak_languages.cultural_adaptation_rules":{"name":"cultural_adaptation_rules","description":"文化适应性规则","required":false,"in":"query","type":"string"},"body.ak_training_plan_items":{"name":"ak_training_plan_items","description":"ak_training_plan_items","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_training_plan_items"}},"rowFilter.ak_training_plan_items.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.plan_id":{"name":"plan_id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.item_date":{"name":"item_date","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.activity_type":{"name":"activity_type","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.target_value":{"name":"target_value","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.unit":{"name":"unit","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_training_plan_items.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_content_shares":{"name":"ak_content_shares","description":"ak_content_shares","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_shares"}},"rowFilter.ak_content_shares.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.target_type":{"name":"target_type","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.target_id":{"name":"target_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.share_type":{"name":"share_type","description":"分享类型:forward=转发,quote=引用,repost=重发,link=链接分享","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.share_platform":{"name":"share_platform","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.share_content":{"name":"share_content","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.share_title":{"name":"share_title","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.original_author_id":{"name":"original_author_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.parent_share_id":{"name":"parent_share_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.share_level":{"name":"share_level","description":"转发层级,用于追踪转发链条","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.reach_count":{"name":"reach_count","description":"触达人数,用于分析传播效果","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.click_count":{"name":"click_count","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.like_count":{"name":"like_count","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.comment_count":{"name":"comment_count","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.reshare_count":{"name":"reshare_count","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.is_deleted":{"name":"is_deleted","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.deleted_reason":{"name":"deleted_reason","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.ip_address":{"name":"ip_address","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.user_agent":{"name":"user_agent","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.device_info":{"name":"device_info","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.geo_location":{"name":"geo_location","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_shares.deleted_at":{"name":"deleted_at","required":false,"in":"query","type":"string"},"body.ak_content_categories":{"name":"ak_content_categories","description":"ak_content_categories","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_categories"}},"rowFilter.ak_content_categories.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.name_key":{"name":"name_key","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.parent_id":{"name":"parent_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.level":{"name":"level","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.ai_keywords":{"name":"ai_keywords","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.confidence_threshold":{"name":"confidence_threshold","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.sort_order":{"name":"sort_order","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_categories.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.vw_regions_i18n":{"name":"vw_regions_i18n","description":"vw_regions_i18n","required":false,"in":"body","schema":{"$ref":"#/definitions/vw_regions_i18n"}},"rowFilter.vw_regions_i18n.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.vw_regions_i18n.parent_id":{"name":"parent_id","required":false,"in":"query","type":"string"},"rowFilter.vw_regions_i18n.level":{"name":"level","required":false,"in":"query","type":"string"},"rowFilter.vw_regions_i18n.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.vw_regions_i18n.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.vw_regions_i18n.language_code":{"name":"language_code","required":false,"in":"query","type":"string"},"rowFilter.vw_regions_i18n.name":{"name":"name","required":false,"in":"query","type":"string"},"body.ak_content_quality_history":{"name":"ak_content_quality_history","description":"ak_content_quality_history","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_quality_history"}},"rowFilter.ak_content_quality_history.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.quality_type":{"name":"quality_type","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.quality_score":{"name":"quality_score","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.model_version":{"name":"model_version","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.assessment_criteria":{"name":"assessment_criteria","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.reviewer_id":{"name":"reviewer_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.notes":{"name":"notes","required":false,"in":"query","type":"string"},"rowFilter.ak_content_quality_history.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_training_records":{"name":"ak_training_records","description":"ak_training_records","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_training_records"}},"rowFilter.ak_training_records.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.plan_item_id":{"name":"plan_item_id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.device_id":{"name":"device_id","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.activity_type":{"name":"activity_type","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.start_time":{"name":"start_time","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.end_time":{"name":"end_time","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.duration_sec":{"name":"duration_sec","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.distance_km":{"name":"distance_km","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.calories":{"name":"calories","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.steps":{"name":"steps","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.avg_heart_rate":{"name":"avg_heart_rate","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.max_heart_rate":{"name":"max_heart_rate","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.data":{"name":"data","required":false,"in":"query","type":"string"},"rowFilter.ak_training_records.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_user_point_logs":{"name":"ak_user_point_logs","description":"ak_user_point_logs","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_point_logs"}},"rowFilter.ak_user_point_logs.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_point_logs.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_point_logs.change_type":{"name":"change_type","required":false,"in":"query","type":"string"},"rowFilter.ak_user_point_logs.points":{"name":"points","required":false,"in":"query","type":"string"},"rowFilter.ak_user_point_logs.reason":{"name":"reason","required":false,"in":"query","type":"string"},"rowFilter.ak_user_point_logs.related_id":{"name":"related_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_point_logs.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_chat_messages":{"name":"ak_chat_messages","description":"ak_chat_messages","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_chat_messages"}},"rowFilter.ak_chat_messages.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.session_id":{"name":"session_id","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.message_type":{"name":"message_type","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.intent":{"name":"intent","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.attachments":{"name":"attachments","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.tokens_used":{"name":"tokens_used","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.processing_time_ms":{"name":"processing_time_ms","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.cost_usd":{"name":"cost_usd","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.feedback_score":{"name":"feedback_score","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.feedback_reason":{"name":"feedback_reason","required":false,"in":"query","type":"string"},"rowFilter.ak_chat_messages.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_contents":{"name":"ak_contents","description":"ak_contents","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_contents"}},"rowFilter.ak_contents.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.raw_content_id":{"name":"raw_content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.summary":{"name":"summary","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.author":{"name":"author","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.source_url":{"name":"source_url","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.original_language":{"name":"original_language","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.category_id":{"name":"category_id","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.tags":{"name":"tags","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.keywords":{"name":"keywords","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.entities":{"name":"entities","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.sentiment_score":{"name":"sentiment_score","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.readability_score":{"name":"readability_score","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.credibility_score":{"name":"credibility_score","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.quality_score":{"name":"quality_score","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.view_count":{"name":"view_count","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.like_count":{"name":"like_count","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.share_count":{"name":"share_count","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.comment_count":{"name":"comment_count","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.published_at":{"name":"published_at","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.featured_until":{"name":"featured_until","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.status":{"name":"status","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.ai_processed_at":{"name":"ai_processed_at","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_contents.favorite_count":{"name":"favorite_count","required":false,"in":"query","type":"string"},"body.ak_school_translations":{"name":"ak_school_translations","description":"ak_school_translations","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_school_translations"}},"rowFilter.ak_school_translations.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_school_translations.record_id":{"name":"record_id","required":false,"in":"query","type":"string"},"rowFilter.ak_school_translations.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.ak_school_translations.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_school_translations.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"rowFilter.ak_school_translations.school_name":{"name":"school_name","required":false,"in":"query","type":"string"},"rowFilter.ak_school_translations.school_type":{"name":"school_type","required":false,"in":"query","type":"string"},"body.ak_schools":{"name":"ak_schools","description":"ak_schools","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_schools"}},"rowFilter.ak_schools.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_schools.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_schools.region_id":{"name":"region_id","description":"所属地区","required":false,"in":"query","type":"string"},"rowFilter.ak_schools.type":{"name":"type","required":false,"in":"query","type":"string"},"rowFilter.ak_schools.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_content_favorites":{"name":"ak_content_favorites","description":"ak_content_favorites","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_favorites"}},"rowFilter.ak_content_favorites.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.target_type":{"name":"target_type","description":"收藏目标类型:content=内容收藏,topic=专题收藏","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.target_id":{"name":"target_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.folder_id":{"name":"folder_id","description":"收藏夹ID,NULL表示默认收藏夹","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.notes":{"name":"notes","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.tags":{"name":"tags","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.is_public":{"name":"is_public","description":"是否公开收藏,用于社交功能","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_favorites.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_raw_contents":{"name":"ak_raw_contents","description":"ak_raw_contents","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_raw_contents"}},"rowFilter.ak_raw_contents.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.source_id":{"name":"source_id","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.external_id":{"name":"external_id","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.title":{"name":"title","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.content":{"name":"content","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.summary":{"name":"summary","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.author":{"name":"author","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.source_url":{"name":"source_url","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.published_at":{"name":"published_at","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.language_detected":{"name":"language_detected","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.language_confidence":{"name":"language_confidence","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.content_hash":{"name":"content_hash","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.raw_metadata":{"name":"raw_metadata","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.processing_status":{"name":"processing_status","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.quality_score":{"name":"quality_score","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.duplicate_of":{"name":"duplicate_of","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_raw_contents.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_ai_tags":{"name":"ak_ai_tags","description":"ak_ai_tags","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_ai_tags"}},"rowFilter.ak_ai_tags.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.tag_name":{"name":"tag_name","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.confidence_score":{"name":"confidence_score","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.tag_type":{"name":"tag_type","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.language":{"name":"language","required":false,"in":"query","type":"string"},"rowFilter.ak_ai_tags.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_point_transactions":{"name":"ak_point_transactions","description":"ak_point_transactions","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_point_transactions"}},"rowFilter.ak_point_transactions.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_point_transactions.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_point_transactions.transaction_type":{"name":"transaction_type","description":"交易类型:earn(获得), spend(消费), refund(退还)等","required":false,"in":"query","type":"string"},"rowFilter.ak_point_transactions.points":{"name":"points","description":"积分数量,正数表示获得,负数表示消费","required":false,"in":"query","type":"string"},"rowFilter.ak_point_transactions.description":{"name":"description","required":false,"in":"query","type":"string"},"rowFilter.ak_point_transactions.reference_id":{"name":"reference_id","description":"关联业务ID,如训练记录ID、商品ID等","required":false,"in":"query","type":"string"},"rowFilter.ak_point_transactions.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_content_analysis":{"name":"ak_content_analysis","description":"ak_content_analysis","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_analysis"}},"rowFilter.ak_content_analysis.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.content_id":{"name":"content_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.category_id":{"name":"category_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.sentiment_score":{"name":"sentiment_score","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.sentiment_label":{"name":"sentiment_label","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.readability_score":{"name":"readability_score","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.credibility_score":{"name":"credibility_score","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.toxicity_score":{"name":"toxicity_score","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.keywords":{"name":"keywords","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.entities":{"name":"entities","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.topics":{"name":"topics","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.summary":{"name":"summary","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.key_phrases":{"name":"key_phrases","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.ai_provider":{"name":"ai_provider","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.model_version":{"name":"model_version","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.processing_time_ms":{"name":"processing_time_ms","required":false,"in":"query","type":"string"},"rowFilter.ak_content_analysis.ai_processed_at":{"name":"ai_processed_at","required":false,"in":"query","type":"string"},"body.ak_user_contacts":{"name":"ak_user_contacts","description":"ak_user_contacts","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_user_contacts"}},"rowFilter.ak_user_contacts.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_contacts.user_id":{"name":"user_id","required":false,"in":"query","type":"string"},"rowFilter.ak_user_contacts.contact_type":{"name":"contact_type","description":"联系方式类型","required":false,"in":"query","type":"string"},"rowFilter.ak_user_contacts.contact_value":{"name":"contact_value","description":"联系方式内容","required":false,"in":"query","type":"string"},"rowFilter.ak_user_contacts.is_primary":{"name":"is_primary","required":false,"in":"query","type":"string"},"rowFilter.ak_user_contacts.remark":{"name":"remark","required":false,"in":"query","type":"string"},"rowFilter.ak_user_contacts.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"body.ak_content_sources":{"name":"ak_content_sources","description":"ak_content_sources","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_content_sources"}},"rowFilter.ak_content_sources.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.name":{"name":"name","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.type":{"name":"type","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.url":{"name":"url","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.config":{"name":"config","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.language_id":{"name":"language_id","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.category":{"name":"category","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.quality_weight":{"name":"quality_weight","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.crawl_frequency":{"name":"crawl_frequency","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.last_crawled_at":{"name":"last_crawled_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.is_active":{"name":"is_active","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.ai_quality_threshold":{"name":"ai_quality_threshold","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_content_sources.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"},"body.ak_share_analytics":{"name":"ak_share_analytics","description":"ak_share_analytics","required":false,"in":"body","schema":{"$ref":"#/definitions/ak_share_analytics"}},"rowFilter.ak_share_analytics.id":{"name":"id","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.target_type":{"name":"target_type","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.target_id":{"name":"target_id","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.date_recorded":{"name":"date_recorded","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.platform":{"name":"platform","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.share_count":{"name":"share_count","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.unique_sharers":{"name":"unique_sharers","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.total_reach":{"name":"total_reach","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.total_clicks":{"name":"total_clicks","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.avg_share_level":{"name":"avg_share_level","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.viral_coefficient":{"name":"viral_coefficient","description":"病毒传播系数,用于分析内容传播力","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.created_at":{"name":"created_at","required":false,"in":"query","type":"string"},"rowFilter.ak_share_analytics.updated_at":{"name":"updated_at","required":false,"in":"query","type":"string"}},"externalDocs":{"description":"PostgREST Documentation","url":"https://postgrest.org/en/v12/references/api.html"}} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91432bf --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.env +.env.* +*.log +unpackage/ +.hbuilderx/ +.vscode/ +admin_jwt.txt +supabase_db_url.txt +*.tar.bz2 +node_modules/ +temp.* +tmp/ +*.bak +hs_err_pid* +replay_pid* diff --git a/2ae5f3ab46986df9499227cff2cd77d7629d3fff.html b/2ae5f3ab46986df9499227cff2cd77d7629d3fff.html new file mode 100644 index 0000000..4c0a6e6 --- /dev/null +++ b/2ae5f3ab46986df9499227cff2cd77d7629d3fff.html @@ -0,0 +1,2636 @@ + + + + + 用户需求文档 + + + + + + + + + + + + + + +

用户需求文档

+

项目概述

+

梅州市智慧医养数字赋能平台(一期)旨在通过云计算、大数据和人工智能技术,重构医疗养老服务流程,实现"一次采集、多种生成、多元传播",帮助传统医疗机构完成数字化、智能化转型。该平台聚焦于医养结合服务,覆盖医疗、养老、支付及服务等多维场景,为梅州市居民提供便捷、高效、优质的医养服务。

+

系统整体架构图

+
graph TB + A[用户层] --> B[应用层] + B --> C[服务层] + C --> D[数据层] + D --> E[基础设施层] + + A1[老年人] --> A + A2[医护人员] --> A + A3[患者家属] --> A + A4[管理人员] --> A + + B1[医院集成平台] --> B + B2[医保DIP智能控费] --> B + B3[长护险与居家服务] --> B + B4[医养商城] --> B + B5[慧医养基础信息管理] --> B + B6[慢性病管理] --> B + B7[中心药房] --> B + B8[人工智能服务] --> B + + C1[集成引擎] --> C + C2[数据治理] --> C + C3[智能审核] --> C + C4[AI服务] --> C + + D1[医疗数据仓库] --> D + D2[患者主索引] --> D + D3[健康档案] --> D + + E1[云计算平台] --> E + E2[大数据平台] --> E + E3[AI平台] --> E + E4[安全平台] --> E
+

图1:梅州市智慧医养数字赋能平台整体架构图

+

用户需求分析

+

满足多样化需求

+

当前,患者及老年群体对医养服务的需求呈现多元化特征,不仅涵盖基础医疗服务,还包括养老支持、保健产品及线上购物等多个方面。医养平台整合人工智能辅助诊疗、DIP医保控费系统、长期护理保险、居家健康管理及医养商城等核心功能板块,全面对接上述多样化需求。商城系统提供医疗用品、保健品及相关服务的在线销售,便于用户便捷采购所需物资;长期护理保险模块强化对参保人员的服务管理与居家护理跟踪,切实适应老年人居家养老的实际需要。

+

医院物联网布网与全生命周期AI监测需求

+

蓝牙手环与网关在医院的全面布网

+

医院作为医疗服务的核心场所,需要建立完善的物联网基础设施,实现设备与患者的全面连接:

+
    +
  • 智能手环大规模部署:在医院各科室、病区、公共区域部署智能手环监测终端,为所有住院患者、门诊患者及医护人员提供实时健康监测服务。智能手环集成蓝牙和NFC双重功能,实现从入院到出院的连续监测覆盖,同时支持NFC近场通信用于身份识别和快速操作。
  • +
  • 网关设备全院布网:在医院各个楼层、科室部署智能网关设备,形成完整的物联网通信网络,确保智能手环数据能够实时、稳定地传输到监控中心。
  • +
+

NFC与电子围栏在医院的智能应用

+

医院物联网基础设施进一步扩展至NFC近场通信和电子围栏技术,实现更精细化的患者管理和区域控制:

+
    +
  • +

    NFC智能识别系统:在医院各关键节点部署NFC读写设备,实现患者身份快速识别和信息获取。通过NFC腕带或卡片,患者可以实现一键身份验证、快速就诊登记、药品领取确认等功能,提升就医效率。

    +
  • +
  • +

    电子围栏区域管控:在医院重点区域(如手术室、重症监护室、药品库房等)部署电子围栏系统,通过蓝牙定位和NFC验证相结合,实现人员和设备的准入控制。防止未经授权人员进入敏感区域,确保医疗安全。

    +
  • +
  • +

    智能导诊与定位服务:结合NFC技术和电子围栏,为患者提供智能导诊服务。患者通过扫描NFC标签获取科室信息、医生介绍、就诊流程等,同时电子围栏系统提供室内定位导航,避免患者迷路。

    +
  • +
  • +

    安全预警与应急响应:电子围栏系统监测人员活动轨迹,当检测到异常行为或紧急情况时,自动触发报警并通知相关人员,实现快速应急响应。 +基于蓝牙手环和网关的物联网网络,实现患者从入院到康复的全生命周期AI智能监测:

    +
  • +
  • +

    入院评估阶段:患者入院时佩戴蓝牙手环,AI系统自动采集基础生命体征数据,进行健康评估,为治疗方案制定提供数据支持。

    +
  • +
  • +

    住院治疗阶段:实时监测患者的生命体征变化,AI算法分析异常指标,提前预警潜在风险,为医护人员提供决策辅助。

    +
  • +
  • +

    康复恢复阶段:出院后继续通过手环监测康复进度,AI系统评估恢复情况,及时调整康复方案,确保治疗效果。

    +
  • +
  • +

    长期管理阶段:建立患者长期健康档案,AI持续分析健康趋势,为慢性病管理和预防保健提供个性化建议。

    +
  • +
+

AI监测数据应用价值

+

通过全生命周期AI监测,挖掘数据价值,提升医疗服务质量:

+
    +
  • 临床决策支持:AI分析监测数据,为医生提供精准的诊断和治疗建议,提高医疗决策的科学性和准确性。
  • +
  • 医疗质量提升:通过实时监测和预警,减少医疗事故发生,提升医院医疗服务质量和患者满意度。
  • +
  • 医疗资源优化:基于监测数据分析,优化医院资源配置,提高医疗效率,降低运营成本。
  • +
  • 科研数据积累:长期监测数据为医学研究提供宝贵的数据资源,推动医疗技术的创新发展。
  • +
+

用户需求分类图

+
pie title 用户需求分类占比 + "基础医疗服务" : 35 + "养老支持服务" : 25 + "保健产品采购" : 20 + "线上购物服务" : 10 + "其他服务" : 10
+

图2:用户需求分类占比图

+

提升服务效能

+

传统医养服务模式存在流程烦琐、资源配置不合理及服务效率不高等问题。医养平台构建"平台+服务+运营"创新模式,覆盖医疗、养老、支付等多维场景,有效突破地域限制,使更广泛群体能够享有优质服务。在医疗方面,提供在线预约挂号、远程诊疗和健康咨询等功能,显著减少患者等候时间,提升就医效率;在支付环节,支持医保结算与线上支付,优化交易流程,提高服务响应速度。

+

服务效能提升对比图

+
bar title 服务效能提升对比 + A[传统模式] : 3.5 + B[智慧医养平台] : 8.5 + C[目标水平] : 9.0
+

图3:服务效能提升对比图(满分10分)

+

优化用户体验

+

医养平台通过精简服务流程,切实减轻用户在时间和经济方面的负担。同时,不断提升服务品质与响应效率,加强跨部门协同,持续优化资源配置,积极推进数字包容发展,增强老年群体使用智能设备的便捷性。平台针对老年人群体定制个性化服务方案,内容涵盖生活照护、康复护理和文化娱乐活动,全面提升养老服务质量;并通过数字技术辅助老年人熟练应用智能设备,顺畅享受各类医养服务。

+

用户体验优化流程图

+
flowchart TD + A[用户需求识别] --> B[服务流程优化] + B --> C[个性化定制] + C --> D[数字包容性提升] + D --> E[智能设备适配] + E --> F[用户满意度提升] + + B1[简化操作流程] --> B + B2[减少等待时间] --> B + C1[定制服务方案] --> C + C2[文化娱乐活动] --> C + D1[老年友好界面] --> D + D2[语音交互支持] --> D + E1[设备使用指导] --> E + E2[远程技术支持] --> E
+

图4:用户体验优化流程图

+

系统功能需求

+

第一阶段细化:医院集成平台

+

医院集成平台作为核心支撑系统,实现医疗机构间的数据互联互通和业务协同。以下为详细功能需求:

+

医院集成平台功能架构图

+
graph TD + A[医院集成平台] --> B[集成平台] + A --> C[术语主数据管理系统] + A --> D[患者主索引] + A --> E[集成门户管理系统] + A --> F[医疗数据仓库HDW] + A --> G[数据治理] + A --> H[数据填报管理] + A --> I[区域协同管理系统] + A --> J[健康360视图] + A --> K[医院智能BI] + + B --> B1[集成引擎] + B --> B2[平台基础服务] + B --> B3[门诊交互服务] + B --> B4[住院交互服务] + B --> B5[集成平台管理] + + F --> F1[复制库ODS] + F --> F2[数据仓库HDW] + F --> F3[临床数据中心CDR] + F --> F4[健康档案数据中心EHR] + F --> F5[运营数据中心ODR]
+

图5:医院集成平台功能架构图

+

集成平台

+
    +
  • 集成引擎:提供数据交换和接口管理,支持多种协议(如HL7、DICOM)的集成。
  • +
  • 平台基础服务: +
      +
    • 注册服务:系统组件和服务注册管理。
    • +
    • 全程健康档案服务:患者健康档案的统一管理和访问。
    • +
    • 智能提醒服务:基于患者数据提供智能提醒(如用药提醒、复诊提醒)。
    • +
    +
  • +
  • 门诊交互服务: +
      +
    • 患者建档服务子集:门诊患者档案建立和管理。
    • +
    • 患者建卡服务子集:就诊卡管理。
    • +
    • 门诊预约服务子集:在线预约挂号。
    • +
    • 门诊挂号服务子集:挂号流程管理。
    • +
    • 预检分诊服务子集:预检分诊功能。
    • +
    • 门诊申请单服务子集:检查申请单管理。
    • +
    • 门诊医技报告服务子集:检查报告查询。
    • +
    • 门诊危急值报告服务子集:危急值报警和报告。
    • +
    • 门诊处方服务子集:电子处方管理。
    • +
    • 门诊诊断服务子集:诊断记录和管理。
    • +
    +
  • +
  • 住院交互服务: +
      +
    • 入出院服务子集:住院流程管理。
    • +
    • 入出转病区服务子集:病区转诊管理。
    • +
    • 住院申请单服务子集:住院检查申请。
    • +
    • 住院医技报告子集:住院检查报告。
    • +
    • 住院危急值报告服务子集:住院危急值管理。
    • +
    • 住院诊断服务子集:住院诊断记录。
    • +
    • 住院医嘱服务子集:住院医嘱管理。
    • +
    +
  • +
  • 集成平台管理: +
      +
    • 服务管理:集成服务配置和管理。
    • +
    • 服务监控(PC):PC端服务监控。
    • +
    • 服务监控(大屏):大屏显示服务监控。
    • +
    • 系统接入管理:外部系统接入管理。
    • +
    +
  • +
+

术语主数据管理系统

+
    +
  • 数据管理:主数据存储和管理。
  • +
  • 发布订阅管理:数据发布和订阅机制。
  • +
  • 映射管理:数据映射配置。
  • +
+

患者主索引

+
    +
  • 主索引管理:患者主索引创建和管理。
  • +
  • 模型管理:索引模型配置。
  • +
  • 匹配规则管理:患者匹配规则设置。
  • +
  • 查询统计:索引查询和统计分析。
  • +
  • 患者数据管理:患者数据维护。
  • +
  • 基础管理:基础配置管理。
  • +
+

集成门户管理系统

+
    +
  • 单点登录:统一身份认证和登录。
  • +
  • 统一权限管理:权限控制和角色管理。
  • +
+

医疗数据仓库HDW

+
    +
  • 复制库(ODS):操作数据存储。
  • +
  • 在活系统数据集成:集成HIS、医生诊疗、护理、医技、手麻、血库、病案、治疗、ICU、纸质文档翻拍、移动护理、药库药房、体检、单病种、合理用药、设备物资、院感、不良事件、DRGS、急诊、人力资源、分诊叫号、公卫、家医等数据。
  • +
  • 数据仓库(HDW):数据仓库构建。
  • +
  • 临床数据中心(CDR):临床数据管理。
  • +
  • 健康档案数据中心(EHR):健康档案管理。
  • +
  • 运营数据中心(ODR): +
      +
    • 医疗运营数据管理。
    • +
    • 医疗质量数据管理。
    • +
    • 公共卫生数据管理。
    • +
    • ODR可视化管理。
    • +
    +
  • +
+

数据治理

+
    +
  • 数据质量管理:数据质量监控和改进。
  • +
  • 数据安全管理: +
      +
    • 数据安全概览。
    • +
    • 脱敏算法管理。
    • +
    • 脱敏规则管理。
    • +
    +
  • +
+

数据填报管理

+
    +
  • 专项数据填报: +
      +
    • 人力资源数据填报。
    • +
    • 卫生财务管理填报。
    • +
    • 卫生物资数据填报。
    • +
    • 监测数据填报。
    • +
    +
  • +
+

区域协同管理系统

+
    +
  • 协同基础管理: +
      +
    • 机构集成。
    • +
    • 系统管理。
    • +
    • 服务管理。
    • +
    • 权限管理。
    • +
    • 场景编排。
    • +
    +
  • +
  • 协同应用场景: +
      +
    • 智能提醒。
    • +
    • 信息共享。
    • +
    +
  • +
+

健康360视图

+
    +
  • 健康360视图:全方位健康数据展示。
  • +
+

医院智能BI

+
    +
  • 指标管理: +
      +
    • 数据可视化分析。
    • +
    • 指标可视化配置。
    • +
    +
  • +
  • 移动运营决策支持系统: +
      +
    • 业务量监管。
    • +
    • 工作效率监管。
    • +
    • 手术监管。
    • +
    • 业务量分析。
    • +
    • 工作效率分析。
    • +
    • 收入分析。
    • +
    • 医疗服务。
    • +
    • 药品管理。
    • +
    • 卫生资源。
    • +
    +
  • +
  • 质量指标管理:床位配置、运行指标、医疗服务能力、医院质量指标、医疗安全指标、麻醉专业、重症医学专业、药事管理专业、单病种(术种)质量控制指标、三级等级医院评审指标。
  • +
+

第二阶段细化:医保DIP智能控费

+

医保DIP智能控费系统通过智能编码、审核和管理,实现医保费用的精细化控制和优化。以下为详细功能需求:

+

医保DIP智能控费系统架构图

+
graph TD + A[医保DIP智能控费系统] --> B[医保智能编码] + A --> C[医保智能审核] + A --> D[DRG/DIP智能管理] + + B --> B1[基础能力平台] + B --> B2[病案管理] + B --> B3[质量分析] + B --> B4[智能编码] + + C --> C1[基础能力平台] + C --> C2[智能审核助手] + C --> C3[智能审核管理] + + D --> D1[DRG/DIP管理] + D --> D2[医生助手] + D --> D3[配置管理] + + B1 --> B11[知识库系统] + B1 --> B12[AI大模型] + B1 --> B13[数据预处理] + B1 --> B14[智能编码] + B1 --> B15[智能质控] + + D1 --> D11[数据中心] + D1 --> D12[病案管理] + D1 --> D13[清单管理] + D1 --> D14[统计分析]
+

图6:医保DIP智能控费系统架构图

+

医保智能编码

+
    +
  • 基础能力平台: +
      +
    • 知识库系统:知识库、规则库、模糊查找、知识查看。
    • +
    • AI大模型:AI大模型。
    • +
    • 数据预处理:数据采集、数据校验、缺陷标识。
    • +
    • 智能编码:编码智能预生成、主要诊断选择、主要手术操作选择、自动细化编码、自动合并编码。
    • +
    • 智能质控:主次诊断校验、主次手术操作校验、主要诊断与主要手术匹配校验、诊断高编、多编提醒、诊断低编、漏编提示、诊断编码规则符合性校验、手术和操作高编、多编提醒、手术和操作低编、漏编提示、手术和操作编码规则符合性校验。
    • +
    • 系统管理:信息维护、权限管理、参数配置。
    • +
    +
  • +
  • 病案管理: +
      +
    • 病案数据列表。
    • +
    • 首页智能质控。
    • +
    • 首页编码核查。
    • +
    • 病案首页评分。
    • +
    • 质控结果查询。
    • +
    • 原始数据查询。
    • +
    • 质量问题定位。
    • +
    • 首页人工复核。
    • +
    • 缺陷病案管理。
    • +
    +
  • +
  • 质量分析: +
      +
    • 质控工作总览。
    • +
    • 质控规则分析。
    • +
    • 质控问题分析。
    • +
    • 问题趋势分析。
    • +
    +
  • +
  • 智能编码: +
      +
    • 编码助手:医生编码机器人、编码员编码机器人、ICD编码智能体。
    • +
    +
  • +
+

医保智能审核

+
    +
  • 基础能力平台: +
      +
    • 知识库系统:知识管理、规则管理、信息查询。
    • +
    • 智能审核规则引擎:智能审核规则引擎。
    • +
    • 系统管理:信息维护、权限管理、参数配置。
    • +
    +
  • +
  • 智能审核助手: +
      +
    • 事前事中审核:住院医嘱实时审核、住院计费实时审核、护士补记账审核、患者转科审核、患者预出院审核、医保结算审核、在院患者审核、违规预警提醒。
    • +
    +
  • +
  • 智能审核管理: +
      +
    • 事后审核管理:出院患者审核、违规详情查看、原始单据查询。
    • +
    • 统计分析:审核结果分析、科室违规统计、医生违规统计、违反规则统计。
    • +
    +
  • +
+

DRG/DIP智能管理

+
    +
  • DRG/DIP管理: +
      +
    • 数据中心:病案首页查询、结算清单数据查询、住院结算数据查询、费用明细数据查询、医保月结数据查询。
    • +
    • 病案管理:病案首页智能质控、首页质控结果查询、原始数据查询、质控问题定位、缺陷病案管理、病案预分组、风险病案管理。
    • +
    • 清单管理:清单智能生成、清单智能转码、清单自动同步、清单再生成、清单数据查看、临床数据浏览、清单调整优化、清单智能质控、质控结果查询、质控问题定位、清单人工复核、缺陷清单管理、清单预分组、清单批量下载、风险清单管理、清单上传管理、清单上传反馈、清单撤回和重传、清单医保对账。
    • +
    • 统计分析:病案首页分析(首页质量分析)、结算清单分析(清单生成、清单审核、清单上报、预测分析、结算分析)、全院分析(医院综合分析、医院费用分析、费用结构分析)、科室分析(科室盈亏分析、科室盈亏排序、科室盈亏分布、科室盈亏统计、科室盈亏详情、科室盈亏汇总、科室综合分析、科室例均费用分布、科室象限分析)、医生组分析(医生组盈亏分析、医生组盈亏排序、医生组盈亏分布、医生组盈亏汇总及列表详情)、医生分析(医生盈亏分析、医生盈亏排序、医生盈亏分布、医生象限分析)、病组/病种分析(分段盈亏分析、病组/病种盈亏分布、病组/病种盈亏统计、病组/病种盈亏情况汇总、病组/病种盈亏详情、病组/病种盈亏数据列表、病组/病种象限分析)。
    • +
    +
  • +
  • 医生助手: +
      +
    • 医生助手:首页质控、分组预测、入组分析、模拟分组。
    • +
    +
  • +
  • 配置管理: +
      +
    • 知识管理:ICD规范目录管理、ICD目录对照管理。
    • +
    • 分组方案管理:方案列表、分组配置。
    • +
    • 结算方案管理:方案列表、结算方案配置。
    • +
    • 任务管理:定时任务调度。
    • +
    • 规则管理:首页质控规则管理、清单质控规则管理。
    • +
    +
  • +
+

第三阶段细化:长护险与居家服务管理

+

长护险与居家服务管理系统为长期护理保险参保人员提供全面、高效的服务管理和居家护理跟踪,通过打通与保险公司的数据接口,实现从申请到结算的线上化闭环管理。以下为详细功能需求:

+

长护险与居家服务管理业务流程图

+
flowchart TD + A[参保人员管理] --> B[服务计划制定] + B --> C[服务跟踪与监督] + C --> D[费用报销管理] + D --> E[数据分析与应用] + + A --> A1[信息收集与入库] + A --> A2[信息更新与维护] + + B --> B1[需求评估] + B --> B2[个性化方案定制] + B --> B3[方案沟通与确认] + + C --> C1[服务记录上传] + C --> C2[实时监控与管理] + C --> C3[服务质量评估] + + D --> D1[报销申请受理] + D --> D2[资料审核] + D --> D3[报销金额计算与支付] + + E --> E1[需求分析] + E --> E2[服务质量分析] + E --> E3[远程医疗应用]
+

图7:长护险与居家服务管理业务流程图

+

参保人员管理

+
    +
  • 信息收集与入库:建立参保人员信息库,收集基本信息(如姓名、年龄、性别、联系方式)、健康状况、疾病史等;进行日常生活能力评估,记录评估结果。
  • +
  • 信息更新与维护:定期更新参保人员健康状况和护理需求信息,确保信息时效性和准确性。
  • +
+

服务计划制定

+
    +
  • 需求评估:根据参保人员信息库数据,综合考虑健康状况、失能程度、个人偏好等因素,评估护理需求类型和频率。
  • +
  • 个性化方案定制:基于评估结果,为参保人员定制个性化居家服务计划,包括服务项目(如康复训练、饮食照料、心理慰藉)、服务频次和服务人员资质。
  • +
  • 方案沟通与确认:与参保人员及其家属沟通服务计划,确保满意并适当调整。
  • +
+

服务跟踪与监督

+
    +
  • 服务记录上传:服务人员通过手机APP等信息化手段及时上传服务记录,包括服务时间、服务内容、服务效果等。
  • +
  • 实时监控与管理:管理人员实时查看服务记录,对服务质量进行评估和监管;发现异常时及时联系服务人员处理。
  • +
  • 服务质量评估:定期收集参保人员及其家属反馈,评估服务质量;根据评估结果考核服务人员并培训改进。
  • +
+

费用报销管理

+
    +
  • 报销申请受理:参保人员或服务机构提交长护险费用报销申请,上传服务记录、费用发票等资料。
  • +
  • 资料审核:审核报销资料的真实性和合理性,利用大数据和人工智能识别不合理费用和违规行为。
  • +
  • 报销金额计算与支付:审核通过后,根据服务记录和费用标准自动计算报销金额,实现一站式结算。
  • +
+

与其他系统的对接与整合

+
    +
  • 医疗机构对接:与医疗机构信息系统对接,实时获取参保人员就医信息,为制定护理方案提供依据。
  • +
  • 医保部门对接:与医保部门信息系统对接,实现医保费用的实时结算,提高报销效率。
  • +
+

数据分析与应用

+
    +
  • 需求分析:分析不同地区、年龄段参保人员护理需求特点,为优化服务资源配置提供依据。
  • +
  • 服务质量分析:分析服务质量与服务人员资质、培训情况的关系,为提升服务质量提供参考。
  • +
  • 远程医疗应用:引入远程医疗技术,提供远程健康监测和诊断服务;开展线上康复指导课程。
  • +
+

4. 医养商城

+

医养商城提供医疗用品、保健产品、医养结合服务的在线销售平台,支持商品展示、服务预订、支付结算、物联网设备租赁及物流配送等功能,满足人民群众多样化、多层次的健康服务需求。

+

医养商城业务流程图

+
flowchart TD + A[商品展示流程] --> B[服务预订流程] + B --> C[支付结算流程] + C --> D[物联网设备租赁] + D --> E[物流配送流程] + + A --> A1[商品上架] + A --> A2[消费者浏览] + A --> A3[商品更新维护] + + B --> B1[服务上架] + B --> B2[消费者选择] + B --> B3[订单生成] + B --> B4[确认与提醒] + + C --> C1[选择支付方式] + C --> C2[支付处理] + C --> C3[支付确认] + C --> C4[退款处理] + + D --> D1[设备上架] + D --> D2[消费者选择] + D --> D3[订单生成与审核] + D --> D4[设备配送与安装] + D --> D5[租赁归还与结算] + + E --> E1[订单接收] + E --> E2[商品分拣与包装] + E --> E3[运输配送] + E --> E4[签收确认]
+

图8:医养商城业务流程图

+

4.1 商品展示流程

+
    +
  • 商品上架:商家将医疗用品、保健产品等商品信息录入系统,包括商品名称、规格、价格、描述、图片等。
  • +
  • 消费者浏览:消费者在商城中浏览商品列表,根据自身需求筛选和选择商品。
  • +
  • 商品更新维护:商家定期更新商品信息,包括价格调整、库存变化等,确保展示信息的时效性和准确性。
  • +
+

4.2 服务预订流程

+
    +
  • 服务上架:医养服务提供商将康复护理、健康体检、心理咨询等服务项目录入系统,包括服务内容、价格、服务人员资质等信息。
  • +
  • 消费者选择:消费者浏览服务项目,根据需求选择合适的服务项目、预约服务时间和服务人员。
  • +
  • 订单生成:消费者完成服务选择后,系统生成服务预订订单,包含服务项目、服务时间、服务人员、订单金额等信息。
  • +
  • 确认与提醒:服务提供商收到订单后,对订单进行确认。同时,系统在服务前一定时间向消费者和服务人员发送提醒信息,确保服务的顺利进行。
  • +
+

4.3 支付结算流程

+
    +
  • 选择支付方式:消费者在购买商品或服务后,系统提供多种支付方式供选择,如医保结算、在线支付(微信、支付宝等)。
  • +
  • 支付处理:消费者选择支付方式后,系统将支付信息传递给相应的支付平台进行处理。如果选择医保结算,系统与医保部门进行数据对接,完成费用的报销和结算;如果选择在线支付,消费者按照支付平台的提示完成支付操作。
  • +
  • 支付确认:支付平台完成支付处理后,将支付结果反馈给商城系统。商城系统确认支付成功后,更新订单状态为已支付。
  • +
  • 退款处理:如果消费者对商品或服务不满意,申请退款,商城系统根据退款政策进行审核处理。审核通过后,将退款金额返还给消费者的支付账户。
  • +
+

4.4 物联网设备租赁

+
    +
  • 设备上架:租赁商将各类与医养相关的物联网设备,如健康监测设备(智能手环、智能床垫等)和康复辅助设备(智能拐杖、智能轮椅等)录入系统,包括设备名称、规格、租赁价格、租赁期限等信息。
  • +
  • 消费者选择:消费者在商城中浏览物联网设备,选择需要租赁的设备和租赁期限。
  • +
  • 订单生成与审核:系统生成设备租赁订单,租赁商对订单进行审核,确认设备是否可租赁、消费者的身份信息等。审核通过后,订单生效。
  • +
  • 设备配送与安装:租赁商安排设备配送,将设备送到消费者手中,并进行安装调试。对于一些操作复杂的设备,还会提供使用培训。
  • +
  • 租赁归还与结算:租赁期满后,消费者将设备归还租赁商。租赁商对设备进行检查,确认设备无损坏后,完成租赁结算。
  • +
+

4.5 物流配送流程

+
    +
  • 订单接收:商城系统将消费者的商品订单信息传递给物流配送公司,物流配送公司接收订单。
  • +
  • 商品分拣与包装:物流配送公司根据订单信息,从仓库中分拣出相应的商品,并进行包装。对于需要特殊保存条件的医疗用品,采用专业的冷链物流进行包装。
  • +
  • 运输配送:物流配送公司安排车辆和人员,将商品运输到消费者指定的收货地址。在运输过程中,消费者可以通过物流单号查询商品的运输状态。
  • +
  • 签收确认:消费者收到商品后,进行签收。物流配送公司将签收信息反馈给商城系统,商城系统更新订单状态为已完成。
  • +
+

5. 慧医养基础信息管理

+

慧医养基础信息管理系统为各项业务开展提供全面数据支撑与信息化管理支持,涵盖人员与机构信息管理、居家适老化改造服务、设备智能管理、租赁方案及维护升级等内容,保障服务体系高效、稳定、优质运行。

+

慧医养基础信息管理系统架构图

+
graph TD + A[慧医养基础信息管理] --> B[人员信息管理] + A --> C[机构信息管理] + A --> D[居家养老适老化改造服务] + A --> E[设备智能管理] + A --> F[个性化租赁方案管理] + A --> G[设备维护与升级] + + B --> B1[信息收集] + B --> B2[信息录入] + B --> B3[信息更新与维护] + + C --> C1[信息收集与整理] + C --> C2[信息录入与审核] + C --> C3[信息展示与更新] + + D --> D1[改造需求登记] + D --> D2[服务申请与评估] + D --> D3[改造方案制定] + D --> D4[服务商匹配与签约] + D --> D5[施工进度跟踪] + D --> D6[验收反馈] + + E --> E1[设备信息录入] + E --> E2[设备状态监控] + E --> E3[异常警报与处理] + E --> E4[设备维护与升级] + + F --> F1[需求收集与分析] + F --> F2[方案制定与推荐] + F --> F3[方案调整与确认] + + G --> G1[维护计划制定] + G --> G2[维护执行与记录] + G --> G3[升级需求评估] + G --> G4[升级方案制定与实施]
+

图9:慧医养基础信息管理系统架构图

+

5.1 人员信息管理流程

+
    +
  • 信息收集:对于医护人员,在入职时收集姓名、性别、年龄、联系方式、职业资格等信息;对于患者和参保人员,在首次就诊或参保登记时收集基本信息,包括病历填写等。
  • +
  • 信息录入:收集到的信息由专门人员录入系统,录入过程中进行初步审核,确保准确性和完整性。
  • +
  • 信息更新与维护:信息随时间变化而更新,如职业资格更新、联系方式变更;相关人员及时反馈,管理员更新;系统定期备份,清理过期无效信息,保证数据质量。
  • +
+

5.2 机构信息管理流程

+
    +
  • 信息收集与整理:市场人员或合作部门收集医院、养老机构、社区服务中心等机构信息,包括名称、地址、联系方式、服务范围、床位数量等,进行整理分类。
  • +
  • 信息录入与审核:录入人员录入系统,提交审核;审核人员核实真实性和可靠性。
  • +
  • 信息展示与更新:审核通过后展示供查询;机构信息变化时及时反馈更新,系统定期回访更新,保证时效性。
  • +
+

5.3 居家养老适老化改造服务流程

+
    +
  • 改造需求登记:老年人或家属通过线上平台或线下点提出改造需求,包括基本信息、地址、需求描述等。
  • +
  • 服务申请与评估:系统接收登记,分配工作人员联系,了解需求和房屋状况,进行实地评估,确定方案和预算。
  • +
  • 改造方案制定:根据评估结果,专业团队制定详细改造方案,包括内容、时间、材料等。
  • +
  • 服务商匹配与签约:系统自动匹配合适服务商(具备资质和经验),双方签订合同,明确内容、价格、工期等条款。
  • +
  • 施工进度跟踪:施工过程中,系统实时跟踪进度,工作人员定期检查质量和进度,及时解决施工问题。
  • +
  • 验收反馈:改造完成后,老年人或家属验收;验收合格后反馈评价,如满意则好评,不满意则整改意见。
  • +
+

5.4 设备智能管理流程

+
    +
  • 设备信息录入:采购或租赁入库时,录入设备基本信息,包括名称、型号、规格、购买日期、租赁期限等(如智能血糖仪的品牌、型号、生产日期)。
  • +
  • 设备状态监控:通过物联网技术,实时收集设备状态信息,如电量、测量数据准确性等(如智能手环上传心率、血压等,监测异常情况)。
  • +
  • 异常警报与处理:设备异常时系统自动发出警报,提醒用户处理或安排售后维修(如电量低或测量误差超范围时发送警报,售后及时联系维修或更换)。
  • +
  • 设备维护与升级:定期维护保养,包括清洁、校准、性能检测等(如每月清洁智能床垫);技术发展时提供升级服务,系统检测可用升级版本,提醒用户升级(如智能轮椅软件更新时提醒升级)。
  • +
+

5.5 个性化租赁方案管理流程

+
    +
  • 需求收集与分析:与用户沟通,了解需求和使用时长(如短期康复的康复周期,长期监测的疾病类型)。
  • +
  • 方案制定与推荐:根据需求制定个性化租赁方案,包括种类、期限、价格等(如短期康复提供拐杖、轮椅租赁;长期监测提供智能手环、智能血糖仪套餐);推荐给用户选择。
  • +
  • 方案调整与确认:用户反馈意见,工作人员调整方案;双方确认最终方案,签订租赁合同。
  • +
+

5.6 设备维护与升级流程

+
    +
  • 维护计划制定:根据使用说明书和实际情况,制定维护计划,包括周期、内容等(如智能监测设备每月清洁校准;康复设备每季度全面检测)。
  • +
  • 维护执行与记录:按照计划维护保养,记录时间、内容、更换零部件等。
  • +
  • 升级需求评估:定期评估升级需求,考虑技术发展、用户需求、设备性能等(如新监测技术出现时评估现有设备是否升级以提高准确性)。
  • +
  • 升级方案制定与实施:根据评估制定升级方案,包括内容、时间、费用等;用户同意后实施升级,确保数据安全完整性。
  • +
+

6. 慢性病管理

+

慢性病管理系统面向慢性病患者提供全周期健康管理服务,包括健康档案建立、评估监测、定期随访、个性化干预、运动与膳食指导、用药提醒及复诊管理等,助力提升居民健康水平,改善整体健康状况。

+

慢性病管理服务流程图

+
flowchart TD + A[患者建档流程] --> B[健康评估流程] + B --> C[随访管理流程] + C --> D[健康干预流程] + D --> E[个人运动管理流程] + E --> F[膳食管理流程] + F --> G[用药提醒流程] + G --> H[就诊复诊管理流程] + + A --> A1[信息收集] + A --> A2[档案建立] + + B --> B1[指标检测] + B --> B2[方案制定] + + C --> C1[随访安排] + C --> C2[信息收集] + C --> C3[记录反馈] + + D --> D1[措施制定] + D --> D2[实施与跟踪] + + E --> E1[方案制定] + E --> E2[数据记录与分析] + E --> E3[方案调整] + + F --> F1[方案生成] + F --> F2[个性化指导] + + G --> G1[信息记录] + G --> G2[提醒设置] + G --> G3[依从性跟踪] + + H --> H1[预约挂号] + H --> H2[复诊提醒] + H --> H3[流程协助] + H --> H4[信息记录]
+

图10:慢性病管理服务流程图

+

6.1 患者建档流程

+
    +
  • 信息收集:医护人员收集患者基本信息、疾病史、家族病史、体检报告、用药情况等。
  • +
  • 档案建立:录入电子系统,建立专属电子健康档案,进行分类管理,便于查询使用。
  • +
+

6.2 健康评估流程

+
    +
  • 指标检测:定期检测血压、血糖、血脂等;评估生活方式,如饮食、运动、吸烟饮酒等;关注心理状态,使用专业工具评估。
  • +
  • 方案制定:根据评估结果,医护团队制定个性化健康管理方案(如血糖波动大时调整饮食运动,或心理疏导)。
  • +
+

6.3 随访管理流程

+
    +
  • 随访安排:确定随访方式,如电话、短信、微信等;制定随访计划,明确间隔。
  • +
  • 信息收集:随访人员与患者沟通,了解病情变化和方案执行情况;提醒按时服药、体检、调整生活方式等。
  • +
  • 记录反馈:将随访信息记录在电子健康档案中,为后续干预提供依据。
  • +
+

6.4 健康干预流程

+
    +
  • 措施制定:根据健康状况和随访结果,确定干预措施,包括健康知识科普、康复训练指导、健康讲座等。
  • +
  • 实施与跟踪:按照措施实施,跟踪参与情况和效果。
  • +
+

6.5 个人运动管理流程

+
    +
  • 方案制定:结合身体状况和疾病类型,制定个性化运动方案,推荐散步、太极拳、瑜伽等;确定强度和频率。
  • +
  • 数据记录与分析:系统支持记录运动数据,如时间、距离、消耗卡路里等;分析运动效果。
  • +
  • 方案调整:根据效果和身体变化,动态调整方案;对行动不便患者提供视频指导及远程监测。
  • +
+

6.6 膳食管理流程

+
    +
  • 方案生成:根据疾病类型(如糖尿病、高血压),结合评估结果,生成每日膳食推荐,包括种类、数量、烹饪方式等。
  • +
  • 个性化指导:支持膳食记录、营养分析、饮食禁忌提醒;针对特殊人群如肾病患者提供低盐、低蛋白指导。
  • +
+

6.7 用药提醒流程

+
    +
  • 信息记录:系统记录用药信息,包括名称、剂量、时间、频率等。
  • +
  • 提醒设置:根据医嘱设置提醒,支持多种方式,如推送、短信、语音等。
  • +
  • 依从性跟踪:记录实际服药情况,医护人员了解依从性;根据情况调整用药方案。
  • +
+

6.8 就诊复诊管理流程

+
    +
  • 预约挂号:提供在线预约挂号服务。
  • +
  • 复诊提醒:根据病情和医嘱自动提醒复诊时间。
  • +
  • 流程协助:协助完成挂号、转诊流程,如提供转诊信息、办理手续等。
  • +
  • 信息记录:记录每次就诊信息,包括诊断结果、治疗方案、检查报告等,为后续管理和决策提供数据支持。
  • +
+

7. 中心药房

+

中心药房系统依托嘉城颐养医院实体建设,为患者、老年人及其他需要长期医疗护理和康复服务的人群提供便捷、安全的药品购买与配送服务,同时保障药品的质量和用药的安全性。

+

中心药房业务流程图

+
flowchart TD + A[药品供应保障流程] --> B[在线药品销售流程] + B --> C[智能药品管理系统流程] + C --> D[个性化药品配送服务流程] + D --> E[药师在线咨询服务流程] + E --> F[用药提醒与跟踪流程] + F --> G[药品安全与质量控制流程] + + A --> A1[供应商选择与合作] + A --> A2[药品采购] + A --> A3[质量验收] + + B --> B1[平台建设与维护] + B --> B2[用户注册与登录] + B --> B3[药品选购与下单] + B --> B4[订单处理] + + C --> C1[监控] + C --> C2[有效期管理] + C --> C3[自动补货] + + D --> D1[需求收集] + D --> D2[配送计划制定] + D --> D3[药品配送] + + E --> E1[咨询入口设置] + E --> E2[问题受理] + E --> E3[专业解答] + E --> E4[记录与反馈] + + F --> F1[提醒设置] + F --> F2[提醒发送] + F --> F3[用药记录跟踪] + + G --> G1[质量检验计划制定] + G --> G2[质量检验实施] + G --> G3[不合格药品处理]
+

图11:中心药房业务流程图

+

7.1 药品供应保障流程

+
    +
  • 供应商选择与合作:对药品供应商进行严格筛选,评估资质、信誉和产品质量,选择符合国家药品安全标准和质量要求的合格供应商,与多个药品生产商建立稳定的合作关系。
  • +
  • 药品采购:根据市场需求和库存情况,制定采购计划,向选定的供应商下达采购订单,明确药品的种类、规格、数量和交货时间。
  • +
  • 质量验收:药品到货后,进行外观、包装、标签、说明书检查,核对数量、规格,进行质量检验,只有合格的药品才能入库。
  • +
+

7.2 在线药品销售流程

+
    +
  • 平台建设与维护:医养商城平台提供详细的药品信息,包括成分、用途、副作用、禁忌、用户评价;技术团队负责平台的日常维护和更新,确保稳定性和安全性。
  • +
  • 用户注册与登录:用户注册账号,进行实名认证,登录平台进行药品选购。
  • +
  • 药品选购与下单:用户搜索药品,浏览信息后加入购物车,确认订单信息和收货地址,完成在线支付。
  • +
  • 订单处理:订单生成后,系统将订单信息发送到中心药房的业务系统,药房审核订单的有效性和合法性,审核通过后进行药品备货和发货准备。
  • +
+

7.3 智能药品管理系统流程

+
    +
  • 监控:利用信息技术实时监控药品库存数量,设置上下限,当库存低于下限时自动发出补货提醒。
  • +
  • 有效期管理:记录每批药品的生产日期、有效期,临近有效期的药品进行预警,提醒处理。
  • +
  • 自动补货:根据库存监控和销售数据,系统自动生成补货计划,向供应商下达采购订单,确保供应连续性。
  • +
+

7.4 个性化药品配送服务流程

+
    +
  • 需求收集:用户下单时收集配送需求,如上门送药、定期配送;与用户沟通了解具体时间和地点要求。
  • +
  • 配送计划制定:根据用户需求和药品库存情况,制定个性化配送计划,包括配送人员、车辆、周期和时间。
  • +
  • 药品配送:配送人员按照计划将药品送到用户手中,进行交接确认,确保药品安全和质量。
  • +
+

7.5 药师在线咨询服务流程

+
    +
  • 咨询入口设置:在医养商城平台设置药师在线咨询入口,方便用户随时与药师交流。
  • +
  • 问题受理:药师接到咨询问题后,认真听取用户的病情和用药情况。
  • +
  • 专业解答:根据专业知识和经验,对用户的问题进行解答,提供药物的适应症、用药指导、药物相互作用等方面的信息。
  • +
  • 记录与反馈:将咨询问题和解答内容进行记录,以便后续查询和统计分析,反馈给相关部门。
  • +
+

7.6 用药提醒与跟踪流程

+
    +
  • 提醒设置:用户在平台上设置用药提醒功能,系统根据用药信息和医嘱设置提醒时间和方式,如短信、APP推送等。
  • +
  • 提醒发送:在设定的时间,系统自动发送用药提醒信息,明确告知药品名称、剂量和时间。
  • +
  • 用药记录跟踪:用户记录实际用药情况,系统跟踪和分析用药记录,医生了解患者的用药依从性和效果,及时调整治疗方案。
  • +
+

7.7 药品安全与质量控制流程

+
    +
  • 质量检验计划制定:制定定期的药品质量检验计划,明确检验的药品种类、检验项目和检验方法。
  • +
  • 质量检验实施:按照计划对药品进行检验,严格遵循相关标准和规范,确保检验结果准确性和可靠性。
  • +
  • 不合格药品处理:发现不合格药品时,立即停止销售和使用,按照相关规定进行处理,包括召回、销毁等,追究相关责任。
  • +
+

8. 人工智能服务系统

+

人工智能服务系统涵盖数据管理、模型训练、服务部署和全生命周期管理等多个环节,各个环节相互关联、相互影响,共同构成了一个完整的业务流程体系,为医疗和养老领域提供了高效、准确、个性化的AI服务。

+

人工智能服务系统架构图

+
graph TD + A[人工智能服务系统] --> B[数据管理流程] + A --> C[模型训练流程] + A --> D[服务部署流程] + A --> E[全生命周期管理流程] + + B --> B1[数据收集] + B --> B2[数据整理] + B --> B3[数据清洗] + B --> B4[数据标注] + + C --> C1[选择预训练模型] + C --> C2[结合医疗数据集微调] + C --> C3[模型评估与优化] + + D --> D1[临床诊断应用] + D --> D2[养老服务应用] + + E --> E1[模型更新] + E --> E2[模型优化] + E --> E3[模型评估] + E --> E4[模型监控]
+

图12:人工智能服务系统架构图

+

8.1 数据管理流程

+
    +
  • 数据收集:广泛收集各类医疗多模态数据,包括临床诊疗指南、医学影像、病历文书、药品说明书以及专业数据集如ICD 10、PubMed等。
  • +
  • 数据整理:对收集到的原始数据进行分类和标注,使其具有统一的格式和标准。
  • +
  • 数据清洗:处理数据中的噪声和异常值,确保数据的准确性和一致性。
  • +
  • 数据标注:为数据添加标签和注释,以便模型能够理解和学习。
  • +
+

8.2 模型训练流程

+
    +
  • 选择预训练模型:选用国产DeepSeek大模型和国产医疗行业大模型等先进的预训练模型作为基础。
  • +
  • 结合医疗数据集微调:将经过管理和处理的医疗数据集输入到预训练模型中进行微调,使其能够更好地处理医疗领域的特定任务。
  • +
  • 模型评估与优化:在训练过程中,使用验证集对模型的性能进行评估,根据评估结果对模型进行优化和调整。
  • +
+

8.3 服务部署流程

+
    +
  • 临床诊断应用:医生在临床诊断中,使用人工智能辅助诊断系统,输入患者的症状、检查结果等信息,系统快速分析并给出可能的疾病诊断和治疗建议。
  • +
  • 养老服务应用:在养老服务中,人工智能根据老年人的健康状况和生活习惯,为其制定个性化的养老方案,包括饮食计划、运动方案、健康监测建议等。
  • +
+

8.4 全生命周期管理流程

+
    +
  • 模型更新:随着医疗数据的不断积累和医学知识的不断更新,及时对模型进行更新,使其能够适应新的情况。
  • +
  • 模型优化:持续对模型进行优化,提高其性能和效率。
  • +
  • 模型评估:定期对模型进行评估,使用新的测试数据集来检验模型的准确性和可靠性。
  • +
  • 模型监控:对模型的运行情况进行实时监控,及时发现和解决问题,确保其符合医学伦理和规范。
  • +
+

系统性能需求

+

响应时间

+
    +
  1. +

    静态页面响应:除文件上传、服务统计、大数据量查询外,静态页面响应时间应小于 1 秒,确保用户能快速获取页面内容,提升操作体验。在医养商城中,用户浏览商品列表等静态页面时,能迅速看到商品信息。而对于涉及文件上传、服务统计、大数据量查询的静态页面,响应时间应小于 3 秒。在医保 DIP 智能控费系统中进行统计分析时,可能涉及大数据量查询,需在 3 秒内给出响应。

    +
  2. +
  3. +

    批量数据操作:批量数据操作响应时间不超过 5 秒。以医养基础信息管理系统为例,当批量导入人员信息或机构信息时,系统应在 5 秒内完成操作,保证数据处理的高效性。

    +
  4. +
  5. +

    大数据量查询:大数据量查询耗时不超过 10 秒。在医院集成平台的医疗数据仓库 HDW 中进行大数据量查询时,如查询多年的医疗数据,系统需要在 10 秒内给出查询结果,以便医护人员及时获取所需信息。

    +
  6. +
  7. +

    单一操作响应:在网络稳定的环境下,操作界面单一操作的系统响应时间小于 1 秒。在慢性病管理的患者服务端进行用药管理时,用户点击查看用药详情,系统应在 1 秒内显示相关信息。

    +
  8. +
+

系统性能指标图

+
radar title 系统性能指标图 + categories: ["响应时间", "并发处理", "页面成功率", "登录支持", "系统稳定性", "数据准确性"] + series: [ + { + name: "当前要求", + data: [9, 8, 9.9, 8, 9.5, 9.5] + }, + { + name: "目标水平", + data: [10, 10, 10, 10, 10, 10] + } + ]
+

图13:系统性能指标图(满分10分)

+

并发处理能力

+
    +
  1. +

    在线人数支持:平台支持最大 1000 人同时在线。在医养商城开展促销活动或直播带货时,可能会有大量用户同时在线浏览商品、下单等,系统需要能够稳定支持 1000 人同时在线,避免出现卡顿或崩溃现象。

    +
  2. +
  3. +

    并发量支持:平台并发支持最大 100笔/秒的并发量。

    +
  4. +
+

页面访问成功率

+

页面访问成功率不低于99%。无论是医院集成平台的集成门户管理系统,还是医养商城的各个页面,用户在访问时,成功率要达到 99%以上,保证用户能够正常使用系统功能。

+

登录人次支持

+

支持每天登录5000人次。考虑到梅州市医养平台的广泛使用,可能会有医护人员、患者、参保人员等不同类型的用户登录系统,系统需要能够支持每天5000人次的登录,以满足用户的使用需求。

+

系统稳定性

+

1.连续运行时间:系统应提供 7×24 小时的连续运行。医院的业务是不间断的,医保服务、长护险服务等也需要随时响应,因此系统要保证 7×24 小时不间断运行,为医养服务提供持续的支持。

+

2.故障时间与修复时间:平均年故障时间<5天,平均故障修复时间<2小时。一旦系统出现故障,要尽快恢复正常运行,减少对医养业务的影响。

+

数据处理能力

+

1.数据准确性:系统处理的数据要保证高度准确,尤其是涉及医保费用结算、患者健康数据等关键信息。在医保 DIP 智能控费系统中,审核服务和结算与对账环节的数据必须准确无误,避免出现费用计算错误等问题。

+

2.数据一致性:不同功能模块之间的数据要保持一致。例如,医院集成平台中的患者主索引信息要与智慧医养基础信息管理系统中的人员信息一致,确保在各个系统中查询到的患者信息是相同的。

+

扩展性与兼容性

+
    +
  1. 可扩展性:系统应具备灵活的扩展能力,适应未来业务规模和功能需求的变化。随着医养业务的发展,可能会增加新的功能模块或服务内容,如医养商城可能会增加新的商品类型或服务项目,系统要能够方便地进行扩展。
  2. +
+

2.兼容性:系统要与现有的医疗信息系统(如 HIS 系统)兼容。在慢性病管理的医生工作站需要嵌入 HIS 系统,系统要能够与 HIS 系统无缝对接,确保数据的流畅传输和业务的协同处理。

+

安全性

+

1.数据安全:采用四重防护体系(传输/存储/访问/运维)保障数据安全,满足等级保护三级和政务服务分级分类要求。

+

2.用户认证与授权:对用户进行严格的认证和授权管理,确保只有授权用户才能访问相应的功能模块。

+

需求预估数据

+

整体预估数据

+

用户规模预估

+
    +
  1. +

    注册用户总量:预计平台上线后3年内注册用户达到50万人,其中:

    +
      +
    • 老年人用户:30万人(覆盖梅州市60岁以上老年人口的34%)
    • +
    • 医护人员用户:5万人(覆盖全市医疗卫生机构工作人员)
    • +
    • 患者及家属用户:10万人
    • +
    • 其他用户:5万人(包括社区工作者、志愿者等)
    • +
    +
  2. +
  3. +

    活跃用户规模

    +
      +
    • 日活跃用户(DAU):预计5万人
    • +
    • 月活跃用户(MAU):预计20万人
    • +
    • 年活跃用户:预计35万人
    • +
    +
  4. +
  5. +

    用户类型分布

    +
      +
    • 移动端用户占比:70%(主要为老年人及家属使用APP)
    • +
    • PC端用户占比:20%(主要为医护人员使用)
    • +
    • 微信公众号用户占比:10%(便捷访问入口)
    • +
    +
  6. +
+

用户规模分布饼图

+
pie title 用户类型分布 + "老年人用户" : 30 + "医护人员用户" : 5 + "患者及家属用户" : 10 + "其他用户" : 5
+

图14:用户类型分布饼图

+

用户活跃度趋势图

+
line title 用户活跃度趋势图 + x-axis: ["第1年", "第2年", "第3年"] + y-axis: 用户数量(万人) + series: [ + { + name: "日活跃用户", + data: [3, 4, 5] + }, + { + name: "月活跃用户", + data: [12, 16, 20] + }, + { + name: "年活跃用户", + data: [21, 28, 35] + } + ]
+

图15:用户活跃度趋势图

+

数据量预估

+
    +
  1. +

    结构化数据

    +
      +
    • 电子病历数据:预计每年新增100万份,总量500万份
    • +
    • 健康档案数据:预计每年新增50万份,总量300万份
    • +
    • 医保结算数据:预计每年处理500万笔结算记录
    • +
    • 商城交易数据:预计每年处理100万笔订单
    • +
    +
  2. +
  3. +

    非结构化数据

    +
      +
    • 医学影像数据:预计每年新增200TB,总存储容量2PB
    • +
    • 视频数据:预计每年新增50TB(远程诊疗、康复指导视频)
    • +
    • 音频数据:预计每年新增10TB(语音咨询、情感分析录音)
    • +
    • 文档数据:预计每年新增5TB(检查报告、治疗方案等)
    • +
    +
  4. +
  5. +

    物联网设备数据

    +
      +
    • 智能设备接入数量:预计5万个设备
    • +
    • 日均数据产生量:预计10GB/天
    • +
    • 实时监控数据:心率、血压、血糖等生命体征数据
    • +
    +
  6. +
+

数据量增长趋势图

+
bar title 数据量增长趋势图 + x-axis: ["第1年", "第2年", "第3年", "第4年", "第5年"] + y-axis: 数据量(TB) + series: [ + { + name: "结构化数据", + data: [2, 4, 6, 8, 10] + }, + { + name: "非结构化数据", + data: [100, 300, 600, 1000, 1500] + }, + { + name: "影像数据", + data: [200, 400, 600, 800, 1000] + } + ]
+

图16:数据量增长趋势图

+
    +
  1. +

    结构化数据

    +
      +
    • 电子病历数据:预计每年新增100万份,总量500万份
    • +
    • 健康档案数据:预计每年新增50万份,总量300万份
    • +
    • 医保结算数据:预计每年处理500万笔结算记录
    • +
    • 商城交易数据:预计每年处理100万笔订单
    • +
    +
  2. +
  3. +

    非结构化数据

    +
      +
    • 医学影像数据:预计每年新增200TB,总存储容量2PB
    • +
    • 视频数据:预计每年新增50TB(远程诊疗、康复指导视频)
    • +
    • 音频数据:预计每年新增10TB(语音咨询、情感分析录音)
    • +
    • 文档数据:预计每年新增5TB(检查报告、治疗方案等)
    • +
    +
  4. +
  5. +

    物联网设备数据

    +
      +
    • 智能设备接入数量:预计5万个设备
    • +
    • 日均数据产生量:预计10GB/天
    • +
    • 实时监控数据:心率、血压、血糖等生命体征数据
    • +
    +
  6. +
+

并发访问预估

+
    +
  1. +

    峰值并发用户数

    +
      +
    • 医养商城促销期间:预计5000人同时在线
    • +
    • 日常医疗咨询高峰:预计2000人同时在线
    • +
    • 慢性病随访高峰:预计1000人同时在线
    • +
    +
  2. +
  3. +

    系统调用预估

    +
      +
    • API调用峰值:每秒5000次请求
    • +
    • 数据查询峰值:每秒2000次查询
    • +
    • 文件上传下载峰值:每秒500次操作
    • +
    +
  4. +
+

存储容量预估

+
    +
  1. +

    数据库存储

    +
      +
    • 结构化数据存储:预计5年内达到10TB
    • +
    • 非结构化数据存储:预计5年内达到5PB
    • +
    • 备份数据存储:预计总存储容量的3倍(用于灾备)
    • +
    +
  2. +
  3. +

    增长率预估

    +
      +
    • 年数据增长率:30-50%
    • +
    • 存储容量年增长率:40%
    • +
    +
  4. +
+

网络带宽预估

+
    +
  1. +

    内部网络

    +
      +
    • 数据中心内部带宽:10Gbps
    • +
    • 医院接入带宽:各医疗机构1Gbps
    • +
    +
  2. +
  3. +

    外部网络

    +
      +
    • 用户访问带宽:峰值100Mbps
    • +
    • 数据同步带宽:10Gbps(用于跨区域数据同步)
    • +
    +
  4. +
+

业务量预估

+
    +
  1. +

    医疗服务业务

    +
      +
    • 年门诊量:预计200万人次
    • +
    • 年住院量:预计20万人次
    • +
    • 年远程诊疗量:预计50万人次
    • +
    +
  2. +
  3. +

    养老服务业务

    +
      +
    • 长护险参保人数:预计10万人
    • +
    • 居家服务订单:预计每年20万单
    • +
    • 适老化改造项目:预计每年5000户
    • +
    +
  4. +
  5. +

    商城业务

    +
      +
    • 年交易额:预计5亿元
    • +
    • 年订单量:预计100万单
    • +
    • 商品SKU数量:预计5000个
    • +
    +
  6. +
  7. +

    药品服务业务

    +
      +
    • 年药品销售量:预计1000万盒
    • +
    • 在线咨询量:预计每年50万人次
    • +
    • 用药提醒服务:覆盖5万名患者
    • +
    +
  8. +
+

人工智能服务预估

+
    +
  1. +

    AI模型规模

    +
      +
    • 训练数据集大小:预计100GB医疗文本数据 + 1TB影像数据
    • +
    • 模型参数量:10-100亿参数
    • +
    • 推理服务QPS:1000次/秒
    • +
    +
  2. +
  3. +

    AI应用覆盖

    +
      +
    • 辅助诊断覆盖率:80%的常见疾病
    • +
    • 智能审核覆盖率:90%的医保结算
    • +
    • 个性化推荐准确率:85%以上
    • +
    +
  4. +
+

扩展性预估

+
    +
  1. +

    未来3-5年增长预期

    +
      +
    • 用户规模增长:50%
    • +
    • 数据量增长:100%
    • +
    • 业务复杂度增长:30%
    • +
    +
  2. +
  3. +

    系统扩展需求

    +
      +
    • 支持接入更多医疗机构:从1家扩展到全市20家医疗机构
    • +
    • 支持更多服务类型:增加康复、心理健康等新服务模块
    • +
    • 支持更大区域覆盖:从梅州市扩展到粤东地区
    • +
    +
  4. +
+

单一医院状况预估

+

用户规模预估

+
    +
  1. +

    注册用户总量:预计单家三级医院注册用户达到2万人,其中:

    +
      +
    • 患者及家属用户:1.5万人
    • +
    • 医护人员用户:3000人(医生、护士、行政人员等)
    • +
    • 其他用户:2000人(供应商、合作伙伴等)
    • +
    +
  2. +
  3. +

    活跃用户规模

    +
      +
    • 日活跃用户(DAU):预计2000人
    • +
    • 月活跃用户(MAU):预计8000人
    • +
    • 年活跃用户:预计1.2万人
    • +
    +
  4. +
  5. +

    用户类型分布

    +
      +
    • 移动端用户占比:60%(患者及家属使用APP)
    • +
    • PC端用户占比:35%(医护人员使用)
    • +
    • 微信公众号用户占比:5%(便捷访问)
    • +
    +
  6. +
+

数据量预估

+
    +
  1. +

    结构化数据

    +
      +
    • 电子病历数据:预计每年新增2万份,总量10万份
    • +
    • 健康档案数据:预计每年新增1万份,总量5万份
    • +
    • 医保结算数据:预计每年处理10万笔结算记录
    • +
    • 内部业务数据:预计每年新增50万条记录
    • +
    +
  2. +
  3. +

    非结构化数据

    +
      +
    • 医学影像数据:预计每年新增5TB,总存储容量20TB
    • +
    • 视频数据:预计每年新增1TB(远程会诊、培训视频)
    • +
    • 音频数据:预计每年新增200GB(语音咨询录音)
    • +
    • 文档数据:预计每年新增500GB(检查报告、会议记录等)
    • +
    +
  4. +
  5. +

    物联网设备数据

    +
      +
    • 智能设备接入数量:预计1000个设备
    • +
    • 日均数据产生量:预计200MB/天
    • +
    • 实时监控数据:心率、血压、血糖等生命体征数据
    • +
    +
  6. +
+

并发访问预估

+
    +
  1. +

    峰值并发用户数

    +
      +
    • 门诊高峰期:预计500人同时在线
    • +
    • 查房时间:预计200人同时在线
    • +
    • 行政办公高峰:预计100人同时在线
    • +
    +
  2. +
  3. +

    系统调用预估

    +
      +
    • API调用峰值:每秒200次请求
    • +
    • 数据查询峰值:每秒100次查询
    • +
    • 文件上传下载峰值:每秒20次操作
    • +
    +
  4. +
+

存储容量预估

+
    +
  1. +

    数据库存储

    +
      +
    • 结构化数据存储:预计5年内达到500GB
    • +
    • 非结构化数据存储:预计5年内达到50TB
    • +
    • 备份数据存储:预计总存储容量的2倍(用于灾备)
    • +
    +
  2. +
  3. +

    增长率预估

    +
      +
    • 年数据增长率:20-30%
    • +
    • 存储容量年增长率:25%
    • +
    +
  4. +
+

网络带宽预估

+
    +
  1. +

    内部网络

    +
      +
    • 医院内部带宽:1Gbps
    • +
    • 科室间网络:100Mbps
    • +
    +
  2. +
  3. +

    外部网络

    +
      +
    • 用户访问带宽:峰值50Mbps
    • +
    • 数据同步带宽:1Gbps(与市级平台同步)
    • +
    +
  4. +
+

业务量预估

+
    +
  1. +

    医疗服务业务

    +
      +
    • 年门诊量:预计15万人次
    • +
    • 年住院量:预计2万人次
    • +
    • 年远程诊疗量:预计1万人次
    • +
    +
  2. +
  3. +

    养老服务业务

    +
      +
    • 长护险服务人数:预计2000人
    • +
    • 居家服务订单:预计每年5000单
    • +
    • 康复治疗人次:预计每年3万人次
    • +
    +
  4. +
  5. +

    内部业务

    +
      +
    • 年药品采购量:预计500万盒
    • +
    • 年设备维护量:预计1000台次
    • +
    • 年培训人次:预计5000人次
    • +
    +
  6. +
+

人工智能服务预估

+
    +
  1. +

    AI模型规模

    +
      +
    • 训练数据集大小:预计5GB医疗文本数据 + 50GB影像数据
    • +
    • 模型参数量:1-10亿参数
    • +
    • 推理服务QPS:50次/秒
    • +
    +
  2. +
  3. +

    AI应用覆盖

    +
      +
    • 辅助诊断覆盖率:60%的常见疾病
    • +
    • 智能审核覆盖率:70%的医保结算
    • +
    • 工作效率提升:30%
    • +
    +
  4. +
+

扩展性预估

+
    +
  1. +

    未来3-5年增长预期

    +
      +
    • 用户规模增长:20%
    • +
    • 数据量增长:50%
    • +
    • 业务复杂度增长:15%
    • +
    +
  2. +
  3. +

    系统扩展需求

    +
      +
    • 支持增加病床数量:从500床扩展到800床
    • +
    • 支持增加科室数量:从20个扩展到30个
    • +
    • 支持增加服务类型:增加专科门诊、日间手术等
    • +
    +
  4. +
+

接口数据预估

+

接口数量预估

+
    +
  1. +

    内部接口数量

    +
      +
    • 系统间接口:预计50个(各子系统间的数据交换接口)
    • +
    • 微服务接口:预计200个(基于微服务架构的API接口)
    • +
    • 第三方集成接口:预计30个(外部系统集成接口)
    • +
    +
  2. +
  3. +

    外部接口数量

    +
      +
    • 医疗机构接口:预计100个(与各级医院的接口)
    • +
    • 政府部门接口:预计20个(卫健委、民政局、医保局等)
    • +
    • 第三方服务接口:预计50个(支付平台、物流公司、设备供应商等)
    • +
    +
  4. +
+

接口数量分布图

+
pie title 接口数量分布 + "医疗机构接口" : 100 + "政府部门接口" : 20 + "第三方服务接口" : 50 + "系统间接口" : 50 + "微服务接口" : 200 + "第三方集成接口" : 30
+

图17:接口数量分布饼图

+

数据交换量预估

+
    +
  1. +

    HIS(医院信息系统)接口

    +
      +
    • 日均数据交换量:预计500万条记录
    • +
    • 月均数据交换量:预计1.5亿条记录
    • +
    • 主要数据类型:患者基本信息、就诊记录、医嘱信息、检查检验结果
    • +
    • 数据格式:HL7 v2.x、HL7 FHIR、自定义XML/JSON
    • +
    +
  2. +
  3. +

    PAS(患者管理信息系统)接口

    +
      +
    • 日均数据交换量:预计200万条记录
    • +
    • 月均数据交换量:预计6000万条记录
    • +
    • 主要数据类型:患者登记信息、预约挂号信息、费用结算信息
    • +
    • 数据格式:HL7 ADT消息、自定义接口协议
    • +
    +
  4. +
  5. +

    LIS(实验室信息系统)接口

    +
      +
    • 日均数据交换量:预计100万条记录
    • +
    • 月均数据交换量:预计3000万条记录
    • +
    • 主要数据类型:检验申请单、检验结果、报告单
    • +
    • 数据格式:HL7 ORM/ORU消息、ASTM协议
    • +
    +
  6. +
  7. +

    PACS(医学影像存档和通信系统)接口

    +
      +
    • 日均数据交换量:预计50万条记录 + 200TB影像数据
    • +
    • 月均数据交换量:预计1500万条记录 + 6PB影像数据
    • +
    • 主要数据类型:DICOM影像文件、影像报告、检查申请
    • +
    • 数据格式:DICOM协议、HL7消息
    • +
    +
  8. +
  9. +

    EMR(电子病历系统)接口

    +
      +
    • 日均数据交换量:预计300万条记录
    • +
    • 月均数据交换量:预计9000万条记录
    • +
    • 主要数据类型:病历文档、诊断信息、治疗记录
    • +
    • 数据格式:CDA文档、自定义XML
    • +
    +
  10. +
  11. +

    医保系统接口

    +
      +
    • 日均数据交换量:预计100万条记录
    • +
    • 月均数据交换量:预计3000万条记录
    • +
    • 主要数据类型:医保结算信息、费用审核结果、报销记录
    • +
    • 数据格式:自定义医保接口协议、国家医保标准接口
    • +
    +
  12. +
  13. +

    社保系统接口

    +
      +
    • 日均数据交换量:预计50万条记录
    • +
    • 月均数据交换量:预计1500万条记录
    • +
    • 主要数据类型:参保信息、待遇支付信息、资格审核
    • +
    • 数据格式:自定义社保接口协议
    • +
    +
  14. +
  15. +

    物联网设备接口

    +
      +
    • 日均数据交换量:预计1000万条传感器数据
    • +
    • 月均数据交换量:预计3亿条传感器数据
    • +
    • 主要数据类型:设备状态数据、监测数据、报警信息
    • +
    • 数据格式:MQTT协议、自定义JSON
    • +
    +
  16. +
  17. +

    第三方支付接口

    +
      +
    • 日均交易量:预计10万笔
    • +
    • 月均交易量:预计300万笔
    • +
    • 主要数据类型:支付请求、交易结果、退款信息
    • +
    • 数据格式:各支付平台标准API(微信支付、支付宝等)
    • +
    +
  18. +
  19. +

    物流配送接口

    +
      +
    • 日均订单量:预计5000单
    • +
    • 月均订单量:预计15万单
    • +
    • 主要数据类型:订单信息、物流跟踪、配送状态
    • +
    • 数据格式:自定义API接口
    • +
    +
  20. +
+

主要接口数据交换量对比图

+
bar title 主要接口数据交换量对比图 + x-axis: ["HIS", "PAS", "LIS", "PACS", "EMR", "医保", "社保", "物联网", "支付", "物流"] + y-axis: 日均数据量(万条) + series: [ + { + name: "日均数据交换量", + data: [500, 200, 100, 50, 300, 100, 50, 1000, 10, 5] + } + ]
+

图18:主要接口数据交换量对比图

+

接口关系图

+
graph TD + A[智慧医养平台] --> B[HIS系统] + A --> C[PAS系统] + A --> D[LIS系统] + A --> E[PACS系统] + A --> F[EMR系统] + A --> G[医保系统] + A --> H[社保系统] + A --> I[物联网设备] + A --> J[第三方支付] + A --> K[物流配送] + A --> L[政府部门] + + B --> B1[患者信息] + B --> B2[就诊记录] + B --> B3[医嘱信息] + + C --> C1[预约挂号] + C --> C2[费用结算] + + D --> D1[检验申请] + D --> D2[检验结果] + + E --> E1[DICOM影像] + E --> E2[影像报告] + + F --> F1[电子病历] + F --> F2[诊断记录] + + G --> G1[医保结算] + G --> G2[费用审核] + + H --> H1[参保信息] + H --> H2[待遇支付] + + I --> I1[设备数据] + I --> I2[传感器数据] + + J --> J1[在线支付] + J --> J2[交易结果] + + K --> K1[订单配送] + K --> K2[物流跟踪] + + L --> L1[卫健委] + L --> L2[民政局] + L --> L3[医保局]
+

图19:平台接口关系图

+
    +
  1. +

    HIS(医院信息系统)接口

    +
      +
    • 日均数据交换量:预计500万条记录
    • +
    • 月均数据交换量:预计1.5亿条记录
    • +
    • 主要数据类型:患者基本信息、就诊记录、医嘱信息、检查检验结果
    • +
    • 数据格式:HL7 v2.x、HL7 FHIR、自定义XML/JSON
    • +
    +
  2. +
  3. +

    PAS(患者管理信息系统)接口

    +
      +
    • 日均数据交换量:预计200万条记录
    • +
    • 月均数据交换量:预计6000万条记录
    • +
    • 主要数据类型:患者登记信息、预约挂号信息、费用结算信息
    • +
    • 数据格式:HL7 ADT消息、自定义接口协议
    • +
    +
  4. +
  5. +

    LIS(实验室信息系统)接口

    +
      +
    • 日均数据交换量:预计100万条记录
    • +
    • 月均数据交换量:预计3000万条记录
    • +
    • 主要数据类型:检验申请单、检验结果、报告单
    • +
    • 数据格式:HL7 ORM/ORU消息、ASTM协议
    • +
    +
  6. +
  7. +

    PACS(医学影像存档和通信系统)接口

    +
      +
    • 日均数据交换量:预计50万条记录 + 200TB影像数据
    • +
    • 月均数据交换量:预计1500万条记录 + 6PB影像数据
    • +
    • 主要数据类型:DICOM影像文件、影像报告、检查申请
    • +
    • 数据格式:DICOM协议、HL7消息
    • +
    +
  8. +
  9. +

    EMR(电子病历系统)接口

    +
      +
    • 日均数据交换量:预计300万条记录
    • +
    • 月均数据交换量:预计9000万条记录
    • +
    • 主要数据类型:病历文档、诊断信息、治疗记录
    • +
    • 数据格式:CDA文档、自定义XML
    • +
    +
  10. +
  11. +

    医保系统接口

    +
      +
    • 日均数据交换量:预计100万条记录
    • +
    • 月均数据交换量:预计3000万条记录
    • +
    • 主要数据类型:医保结算信息、费用审核结果、报销记录
    • +
    • 数据格式:自定义医保接口协议、国家医保标准接口
    • +
    +
  12. +
  13. +

    社保系统接口

    +
      +
    • 日均数据交换量:预计50万条记录
    • +
    • 月均数据交换量:预计1500万条记录
    • +
    • 主要数据类型:参保信息、待遇支付信息、资格审核
    • +
    • 数据格式:自定义社保接口协议
    • +
    +
  14. +
  15. +

    物联网设备接口

    +
      +
    • 日均数据交换量:预计1000万条传感器数据
    • +
    • 月均数据交换量:预计3亿条传感器数据
    • +
    • 主要数据类型:设备状态数据、监测数据、报警信息
    • +
    • 数据格式:MQTT协议、自定义JSON
    • +
    +
  16. +
  17. +

    第三方支付接口

    +
      +
    • 日均交易量:预计10万笔
    • +
    • 月均交易量:预计300万笔
    • +
    • 主要数据类型:支付请求、交易结果、退款信息
    • +
    • 数据格式:各支付平台标准API(微信支付、支付宝等)
    • +
    +
  18. +
  19. +

    物流配送接口

    +
      +
    • 日均订单量:预计5000单
    • +
    • 月均订单量:预计15万单
    • +
    • 主要数据类型:订单信息、物流跟踪、配送状态
    • +
    • 数据格式:自定义API接口
    • +
    +
  20. +
+

接口性能要求

+
    +
  1. +

    实时性要求

    +
      +
    • 紧急医疗数据:响应时间<1秒
    • +
    • 常规业务数据:响应时间<3秒
    • +
    • 批量数据同步:处理时间<30分钟
    • +
    • 大文件传输(影像):传输速度>10MB/s
    • +
    +
  2. +
  3. +

    并发处理能力

    +
      +
    • 接口并发调用峰值:每秒1000次请求
    • +
    • 数据同步并发:同时支持10个医疗机构数据同步
    • +
    +
  4. +
  5. +

    可用性要求

    +
      +
    • 接口可用性:99.9%
    • +
    • 数据传输成功率:99.95%
    • +
    +
  6. +
+

数据安全与合规要求

+
    +
  1. +

    数据加密

    +
      +
    • 传输层加密:TLS 1.3
    • +
    • 数据加密:AES-256加密算法
    • +
    • API密钥管理:OAuth 2.0 + JWT
    • +
    +
  2. +
  3. +

    访问控制

    +
      +
    • 接口认证:双向TLS认证
    • +
    • 权限控制:基于角色的访问控制(RBAC)
    • +
    • 审计日志:完整的数据访问审计
    • +
    +
  4. +
  5. +

    合规要求

    +
      +
    • 医疗数据合规:符合《医疗数据安全管理办法》
    • +
    • 隐私保护:GDPR等隐私保护标准
    • +
    • 等级保护:达到三级等保要求
    • +
    +
  6. +
+

接口监控与运维

+
    +
  1. +

    监控指标

    +
      +
    • 接口调用成功率
    • +
    • 响应时间统计
    • +
    • 数据传输量监控
    • +
    • 错误率统计
    • +
    +
  2. +
  3. +

    告警机制

    +
      +
    • 接口异常告警
    • +
    • 数据同步失败告警
    • +
    • 性能阈值告警
    • +
    +
  4. +
  5. +

    运维支持

    +
      +
    • 7×24小时监控
    • +
    • 自动化故障恢复
    • +
    • 接口版本管理
    • +
    +
  6. +
+

扩展性考虑

+
    +
  1. +

    接口标准化

    +
      +
    • 采用国家卫生健康标准
    • +
    • 支持HL7 FHIR标准
    • +
    • 预留扩展接口
    • +
    +
  2. +
  3. +

    未来扩展

    +
      +
    • 支持更多医疗机构接入
    • +
    • 增加AI服务接口
    • +
    • 支持跨区域数据交换
    • +
    +
  4. +
+

项目建设必要性

+

项目高度契合政策要求

+

响应国家政策:"十四五"健康中国规划提出促进医养结合,构建银发经济与慢病管理体系,"十五五"规划继续将其列为重点发展领域。

+

地方需求紧迫:梅州市老龄化率超过18%,急需借助数字化手段解决医养资源分配不均问题。

+

医养平台的建设与发展与政策方向高度一致,通过战略引领的顶层设计、资源配置的全面保障、服务模式的创新推进、质量管理的严格规范以及人才队伍的持续支撑,构建了一个整体、多元、高效的服务体系。这些政策措施为医养平台奠定了坚实基础,确保其有效满足老年人的健康和养老需求。

+

规划政策符合性分析

+

(1)政策可行性

+

2024年1月国务院办公厅发布《关于发展银发经济增进老年人福祉的意见》(国办发〔2024〕1号),文件提出打造智慧健康养老新业态。完善智慧健康养老产品及服务推广目录,推进新一代信息技术以及移动终端、可穿戴设备、服务机器人等智能设备在居家、社区、机构等养老场景集成应用。2024年12月,五部门联合印发《关于促进医养结合服务高质量发展的指导意见》(国卫老龄发〔2024〕40号)文件提出将银发经济提升为国家战略的重要组成部分,推进"互联网+医养结合",充分利用现有服务平台,推进医疗、养老服务信息互联互通和数据共享,医养结合机构实现院内老年人医疗与养老服务信息的共享共用。智慧医养信息平台作为银发经济的重要组成部分,符合国家政策导向,能够得到政策的有力支持和推动。

+

项目契合度与效益分析

+

一、政策环境高度契合

+

国家政策响应

+
    +
  • "十四五"规划:促进医养结合,构建银发经济与慢病管理体系
  • +
  • "十五五"规划:继续将医养结合列为重点发展领域
  • +
  • 国务院文件:打造智慧健康养老新业态,推动信息技术在养老场景的应用
  • +
  • 五部门指导意见:推进"互联网+医养结合",实现医疗养老信息共享
  • +
+

地方需求驱动

+

梅州市老龄化率超过18%,深度老龄化特征明显,急需数字化手段解决医养资源分配不均问题。

+

二、本地需求精准对接

+

应对人口老龄化挑战

+

截至2023年末,梅州市60岁及以上老年人口88.06万人(占总人口22.94%),65岁及以上老年人口62.93万人(占总人口16.40%)。第一代独生子女父母进入中高龄,空巢、留守、独居、失能等特殊家庭数量激增,养老服务需求呈现刚性增长态势。

+

项目解决方案:通过实时监测、远程诊疗等功能,高效服务居家养老群体,缓解医疗资源紧张与养老需求矛盾。

+

打破医疗信息化壁垒

+

梅州市全民健康信息化基础薄弱,缺乏统一规划,各部门系统独立建设形成"信息烟囱",数据孤岛现象严重,医疗健康大数据无法有效汇聚。

+

项目解决方案

+
    +
  • 整合各级医疗机构信息系统,实现电子病历、检查检验、影像资料等医疗信息互联互通
  • +
  • 建立数据共享机制,消除信息壁垒
  • +
  • 优化医疗资源配置,提高诊疗效率
  • +
+

推动产业协同发展

+

构建跨领域合作平台,促进医疗、养老、科技产业深度融合,实现资源共享、优势互补,推动医养产业转型升级。

+

三、经济效益显著

+

社会价值提升

+

构建梅州医疗养老服务新格局,增进全民健康福祉。通过全市医疗养老资源联动,重点围绕慢性病防治、公共卫生等领域建立协同体系,实现资源整合与全周期健康管理。

+

经济价值可观

+

根据专业机构评估,该项目将为企业创造显著的经济效益。

+

企业转型机遇

+

助力企业从传统工程建设商向城市健康服务运营商转型,抢占银发经济新赛道,实现经济增长与品牌价值双提升。

+

区域示范效应

+

填补粤东地区医养服务空白,形成可复制的"梅州模式",为其他老龄化城市提供借鉴,推动区域养老服务标准化发展。

+

四、社会效益突出

+

医养服务一体化

+

解决医疗与养老体系割裂问题,通过三级诊疗病历数据共享,实现慢病管理与康复护理服务的无缝衔接。

+

医疗资源均衡化

+

在政府政策支持下,推进分级诊疗、远程医疗体系建设,打破城乡医疗资源配置壁垒,提升基层医疗服务效能。

+

老龄服务精准化

+

针对传统养老服务痛点(响应慢、数字化程度低、设施利用率低等),通过适老化改造提升服务品质,推动数字包容性发展,扩大健康照护覆盖范围。

+

五、项目效益量化评估

+
bar title 项目效益综合评估 + x-axis: ["社会效益", "经济效益", "转型效益", "示范效益"] + y-axis: 效益评分(满分10分) + series: [ + { + name: "实施前水平", + data: [7, 6, 5, 4] + }, + { + name: "实施后预期", + data: [9.5, 8.5, 8, 9] + } + ]
+

图:项目效益对比分析

+

实施前后对比

+
    +
  • 社会效益:从7分提升至9.5分,实现医养服务质的飞跃
  • +
  • 经济效益:从6分提升至8.5分,创造可观的经济价值
  • +
  • 转型效益:从5分提升至8分,完成企业战略转型
  • +
  • 示范效益:从4分提升至9分,形成区域标杆效应
  • +
+

后续大扩容工程项目

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
工程项目名称系统说明本次单一医院实现情况
面向养老产业的慢病、肿瘤监管服务应用体系针对老年人群体的慢病管理和肿瘤防治提供全面的数字化服务解决方案,整合医疗数据、监管信息和服务资源部分实现(核心慢病管理功能)
区域慢病管理平台为全市慢病患者提供统一的健康管理服务,包括疾病监测、治疗跟踪、健康教育等功能不实现(区域级功能)
区域肿瘤防治管理平台专注于肿瘤疾病的早期筛查、诊断、治疗和康复管理,提供智能辅助诊断和治疗方案推荐部分实现(医院肿瘤科室功能)
可视化与智能决策支持为管理者提供直观的业务数据展示和智能决策分析工具,通过大数据分析和AI算法提供科学决策依据部分实现(医院级决策支持)
市级监管平台全市智慧医养系统的核心监管工具,实现对医疗机构、养老机构和服务商的全面监管不实现(市级功能)
智慧养老运营为养老服务机构提供全面的运营管理解决方案,包括服务流程管理、资源调度、绩效考核等功能部分实现(医院养老服务运营)
智慧医养政府监管系统为政府部门提供医养行业的监管工具,包括政策执行监控、数据统计分析、违规行为查处等功能不实现(政府监管功能)
智慧医养数据库系统平台的核心数据存储和管理基础设施,提供高性能、高可靠的数据存储服务实现(医院核心数据库)
智慧医养定期巡访系统为居家养老用户提供定期的健康巡访服务,包括上门体检、健康咨询、用药指导等部分实现(医院社区卫生服务)
智慧康养政府及上级企业审批业务系统为养老服务审批提供高效的在线办理平台,包括机构设立审批、服务项目审批等功能不实现(政府审批功能)
智慧康养系统管理中心养老服务系统的核心控制平台,提供系统配置、用户管理、权限控制、日志监控等功能实现(医院管理系统核心)
智慧康养呼叫中心系统为老年人提供24小时电话咨询和紧急救援服务,整合语音识别、AI客服等技术部分实现(医院咨询热线)
养老需求及老人情况评估系统通过问卷调查和智能评估,为老年人提供精准的养老需求分析,帮助制定个性化服务方案实现(医院老年病科评估)
智慧康养健康管理系统为老年人提供全面的健康监测和管理服务,包括健康档案建立、疾病预防、健康指导等功能实现(医院健康管理核心功能)
智慧康养安全系统为老年人提供全方位的安全保障服务,包括紧急报警、位置定位、安全预警等功能部分实现(医院急诊和监护功能)
智慧康养居家养老管理系统为居家养老用户提供便捷的服务管理平台,包括服务预约、服务跟踪、费用结算等功能部分实现(医院社区服务延伸)
智慧康养服务商管理系统为养老服务提供商提供业务管理工具,包括服务发布、服务调度、客户管理、收益结算等功能不实现(第三方服务商管理)
智慧康养志愿者管理系统为养老志愿者提供服务管理平台,包括活动报名、服务记录、培训管理等功能不实现(志愿者管理功能)
智慧康养短信平台系统为养老服务提供短信通知和沟通服务,包括预约提醒、健康提醒、服务通知等实现(医院短信通知系统)
智慧康养社区助餐可视化系统为社区老年人提供助餐服务管理平台,包括菜单展示、订餐管理、配送跟踪等功能不实现(社区助餐功能)
家庭床位及适老化改造系统为老年人家庭提供适老化改造服务,包括改造需求评估、方案设计、施工管理等功能不实现(家庭改造服务)
智能物联网管理系统为医养平台提供物联网设备的管理和控制服务,包括设备接入、数据采集、状态监控等功能实现(医院物联网设备管理)
医保DIP智能控费通过智能审核和费用控制,实现医保费用的精准管理和优化,降低医保支出实现(医院医保管理核心)
长护险与居家服务管理为长期护理保险参保人员提供服务管理和费用结算服务,包括服务申请、审核、结算等功能实现(医院长护险管理)
医养商城为用户提供医疗用品、保健品、养老服务的在线购物平台,包括商品展示、在线支付、物流配送等功能实现(医院医养商城)
慢性病管理为慢性病患者提供全周期健康管理服务,包括疾病监测、治疗指导、健康教育等功能实现(医院慢性病管理核心)
中心药房为用户提供便捷的药品购买和配送服务,包括在线购药、药师咨询、药品配送等功能实现(医院中心药房系统)
人工智能服务为医养平台提供AI能力支持,包括智能诊断、数据分析、个性化推荐等功能实现(医院AI辅助诊断)
运营管理系统为医养平台提供全面的运营管理工具,包括业务监控、绩效分析、资源调度等功能实现(医院运营管理)
中台能力成建设为医养平台提供共享服务能力,包括用户中心、支付中心、消息中心等实现(医院中台服务)
业务中台为医养平台提供业务流程管理和协同服务,包括流程引擎、规则引擎、集成服务等部分实现(医院业务流程管理)
数据中台为医养平台提供数据治理和分析服务,包括数据集成、数据质量、数据分析等功能部分实现(医院数据治理)
技术中台为医养平台提供技术基础设施服务,包括微服务框架、API网关、监控告警等实现(医院技术基础设施)
应用支持平台为医养平台提供应用开发和部署服务,包括开发工具、测试环境、部署平台等实现(医院应用开发支持)
PaaS软件为医养平台提供平台即服务能力,包括容器服务、数据库服务、存储服务等实现(医院PaaS平台)
数据库软件为医养平台提供数据存储和管理服务,包括关系型数据库、NoSQL数据库、大数据存储等实现(医院数据库系统)
云管理平台系统为医养平台提供云计算资源管理服务,包括虚拟机管理、容器编排、负载均衡等部分实现(医院私有云管理)
大数据计算软件为医养平台提供大数据处理和分析服务,包括批处理、流处理、实时分析等部分实现(医院数据分析)
操作系统为医养平台提供基础的系统运行环境,包括服务器操作系统、容器操作系统等实现(医院操作系统环境)
基础算力设施为医养平台提供计算资源支持,包括CPU、GPU、TPU等计算设备部分实现(医院计算资源)
数据中心A-核心业务区服务器为医养平台的核心业务系统提供高性能计算服务,包括应用服务器、数据库服务器等部分实现(医院核心服务器)
数据中心A-公共服务区服务器为医养平台的公共服务提供计算资源,包括缓存服务器、消息队列服务器等部分实现(医院公共服务器)
网络设备为医养平台提供网络连接和通信服务,包括路由器、交换机、防火墙等实现(医院网络基础设施)
安全防护和密码应用为医养平台提供信息安全保障服务,包括加密解密、数字签名、访问控制等实现(医院安全防护系统)
云密码防护为医养平台提供云端密码安全服务,包括密钥管理、加密存储、安全通信等部分实现(医院云安全功能)
数字证书CA系统为医养平台提供数字证书签发和管理服务,包括证书申请、证书验证、证书吊销等部分实现(医院数字证书系统)
云数据安全体系为医养平台提供全面的数据安全保护,包括数据加密、数据脱敏、数据备份等实现(医院数据安全体系)
终端系统为医养平台提供终端设备管理服务,包括移动终端、PC终端、智能设备等实现(医院终端管理系统)
康养养老家庭(试点)终端为试点家庭提供智能养老终端设备,包括智能音箱、智能手环、智能家居等部分实现(医院试点项目)
数据处理服务为医养平台提供数据清洗和转换服务,包括数据抽取、数据转换、数据加载等实现(医院数据处理服务)
数据治理需求管理为医养平台提供数据治理规划和服务,包括数据标准制定、数据质量监控等实现(医院数据治理)
数据汇聚管理服务为医养平台提供多源数据集成服务,包括数据采集、数据同步、数据融合等实现(医院数据集成)
数据探索稽查服务为医养平台提供数据分析和审计服务,包括数据查询、数据分析、合规检查等实现(医院数据分析审计)
一级质量评估报告为医养平台提供数据质量评估服务,包括质量指标计算、质量报告生成等实现(医院质量评估)
数据清洗加工服务为医养平台提供数据预处理服务,包括数据去重、数据补全、数据标准化等实现(医院数据清洗)
数据模型设计服务为医养平台提供数据建模服务,包括概念模型设计、逻辑模型设计、物理模型设计等实现(医院数据建模)
信息系统集成费用于医养平台的系统集成项目,包括接口开发、数据迁移、系统联调等实现(医院系统集成)
硬件集成为医养平台提供硬件设备集成,包括服务器集成、网络设备集成、安全设备集成等实现(医院硬件集成)
成品软件集成为医养平台提供商业软件集成,包括ERP集成、CRM集成、BI集成等实现(医院软件集成)
指挥中心适应性改造(120平米)为医养平台提供指挥中心设施改造,包括装修工程、设备安装、系统集成等部分实现(医院指挥中心改造)
工程建设其他费用包括工程建设过程中的杂费、不可预见费等,确保工程建设的顺利完成实现(医院工程建设费用)
工程设计费用于医养平台的工程设计服务,包括方案设计、施工图设计、技术咨询等实现(医院工程设计)
软件测评费(等保2.0测评+密码应用评估+信创适配验证)用于医养平台的软件安全测评,包括等级保护测评、密码应用评估、信创适配验证等实现(医院软件测评)
+

项目实施注意事项

+

问题分析

+

并发与性能支撑

+

用户需求书明确提出支持1000人并发访问、5000人同时在线,但建设内容中未明确服务器、网络设备等基础设施是否满足性能要求。需要补充性能测试方案和扩容策略,确保系统在高并发场景下的稳定运行。

+

性能测试方案:

+
    +
  1. +

    压力测试:采用JMeter或LoadRunner等工具,模拟1000并发用户场景,测试系统响应时间、吞吐量和资源利用率。测试指标包括:

    +
      +
    • 平均响应时间:<2秒
    • +
    • 并发处理能力:≥1000 TPS
    • +
    • CPU使用率:<70%
    • +
    • 内存使用率:<80%
    • +
    • 网络带宽利用率:<60%
    • +
    +
  2. +
  3. +

    负载测试:逐步增加并发用户数(100→500→1000),观察系统性能拐点,确定最大承载能力。

    +
  4. +
  5. +

    稳定性测试:在5000同时在线场景下持续运行24小时,监控系统稳定性,检查内存泄漏、连接池管理等。

    +
  6. +
  7. +

    容量规划测试:基于业务增长预测,测试系统在未来3-5年的数据量和用户规模下的性能表现。

    +
  8. +
+

扩容策略:

+
    +
  1. +

    服务器集群扩容:采用多台物理服务器构建集群架构。根据业务增长预测,提前规划服务器采购周期(建议提前3-6个月)。初始部署4台应用服务器,预留50%扩容空间,支持平滑添加新服务器节点。

    +
  2. +
  3. +

    垂直扩容规划:制定服务器升级计划,根据性能监控数据分阶段提升单机性能:

    +
      +
    • CPU升级:如从16核升级到32核/64核
    • +
    • 内存扩容:如从128GB升级到256GB/512GB
    • +
    • 存储扩容:SSD存储从2TB升级到4TB/8TB
    • +
    • 网络升级:万兆网卡替换千兆网卡
    • +
    +
  4. +
  5. +

    数据库扩容:采用读写分离架构,部署一主多从数据库集群。初期部署1主2从,预留扩展至1主4从的能力。存储采用高性能SSD阵列,支持热插拔扩容。

    +
  6. +
  7. +

    缓存集群部署:自建Redis集群,采用主从复制+哨兵模式。初期部署3节点集群,支持动态添加节点。配置持久化存储和内存优化策略。

    +
  8. +
  9. +

    静态资源加速:部署自建CDN节点或采用第三方CDN服务。对于医院内网环境,考虑部署本地缓存服务器加速静态资源访问。

    +
  10. +
  11. +

    负载均衡集群:部署Nginx/LVS负载均衡器集群,采用主备模式确保高可用。支持健康检查和自动故障转移,配置SSL卸载和压缩功能。

    +
  12. +
  13. +

    监控告警体系:部署Zabbix或Prometheus+Grafana监控平台,实时监控服务器CPU、内存、磁盘、网络等指标。设置多级告警阈值,制定应急响应流程。

    +
  14. +
  15. +

    容量规划与预算:制定3年容量规划报告,包含硬件采购预算、机房扩容计划、运维人员配置。设置性能预警机制,在达到70%容量时启动扩容准备。

    +
  16. +
  17. +

    灰度发布策略:采用金丝雀发布或蓝绿部署方式,确保新服务器加入集群时不影响现有服务。配置流量逐步切换机制,降低扩容风险。

    +
  18. +
  19. +

    备份容灾扩容:同步扩容备份系统,确保灾备环境与生产环境保持一致的处理能力。定期进行容灾演练,验证扩容后的系统稳定性。

    +
  20. +
+

AI模型训练资源

+

用户需求书提到需要处理100GB文本数据+1TB影像数据进行AI模型训练,模型参数量达100亿,但建设内容中"人工智能服务"和"大数据计算软件"等项目未明确GPU资源、训练集群、推理服务等具体配置。需要补充AI平台的技术规格和资源配置。

+

扩大后的训练需求:

+
    +
  • 数据规模:500GB文本数据 + 5TB医疗影像数据 + 2TB传感器时序数据
  • +
  • 模型参数量:500亿-1000亿参数规模的深度学习模型
  • +
  • 训练时长:预计单次训练周期为7-30天
  • +
  • 推理需求:支持实时推理响应时间<100ms,并发推理请求≥1000 QPS
  • +
+

自建方案:

+
    +
  • GPU集群:8-16张高性能GPU(如NVIDIA A100/H100),总算力≥1000 TFLOPS
  • +
  • 存储系统:高速NVMe SSD存储阵列,总容量≥50TB,读写速度≥10GB/s
  • +
  • 网络架构:RDMA高速网络,带宽≥100Gbps
  • +
  • 冷却系统:专业GPU机房空调和液冷系统
  • +
  • 运维成本:预计年运维成本200-500万元
  • +
+

云租用方案:

+
    +
  • 云厂商选择:阿里云、腾讯云、华为云、电信云、移动云、联通云等
  • +
  • 实例类型:GPU实例(V100/A100/H100),按需/预留实例
  • +
  • 存储服务:对象存储OSS + 高性能云盘
  • +
  • 网络配置:专线接入确保数据传输安全
  • +
  • 成本估算:按量付费模式,训练期间日均成本5000-20000元
  • +
  • 优势:弹性伸缩、无需前期硬件投资、专业的AI优化环境、符合国内数据安全要求
  • +
+

混合部署建议:

+
    +
  • 推理服务本地部署:将训练好的模型部署在医院本地服务器,提供实时推理服务
  • +
  • 训练任务云端执行:大规模训练任务在云端执行,降低本地硬件压力
  • +
  • 数据安全:采用加密传输和本地数据预处理,确保医疗数据安全合规
  • +
+

数据存储与备份

+

用户需求书提出5年内数据量将达到PB级,但建设内容中"数据中心"和"云管理平台"等项目未明确分布式存储架构、备份策略和灾备机制。需要补充数据存储的整体架构设计和容灾保障方案。

+

自建模式:

+
    +
  • 存储架构:采用分布式存储系统,初期部署8-16个存储节点,总容量≥100TB,支持横向扩展至PB级。使用Ceph或GlusterFS作为分布式文件系统。
  • +
  • 硬件配置:SSD存储阵列(NVMe接口),单节点存储容量≥10TB,配置冗余电源和风冷系统。
  • +
  • 备份策略:3-2-1备份原则(3份副本、2种不同介质、1份异地备份)。每日增量备份+每周全量备份,备份窗口控制在4小时内。
  • +
  • 灾备机制:同城双活数据中心,异地容灾中心。RPO(恢复点目标)≤15分钟,RTO(恢复时间目标)≤4小时。
  • +
  • 数据安全:AES-256加密存储,访问控制基于角色,审计日志完整记录。
  • +
  • 成本估算:初期建设投资500-1000万元,年运维成本100-200万元。
  • +
+

运营商合作共建模式:

+
    +
  • 共建架构:医院提供场地和基础网络,运营商提供存储设备和云服务,共建混合云存储平台。
  • +
  • 存储服务:运营商云存储 + 本地缓存节点。热数据存储在本地高速SSD,冷数据迁移至运营商云端。
  • +
  • 备份策略:多层次备份体系,本地快照备份 + 云端异地备份。支持即时恢复和长期归档。
  • +
  • 灾备机制:运营商提供多地域容灾服务,数据自动同步至多个可用区。RPO≤5分钟,RTO≤1小时。
  • +
  • 数据安全:符合国家等保三级标准,运营商提供安全托管服务,支持数据本地化存储。
  • +
  • 服务模式:按存储容量或流量计费,初期月费10-50万元,根据数据增长弹性调整。
  • +
  • 优势:降低初期投资,专业运维服务,弹性扩容,运营商级网络保障。
  • +
+

两种模式的对比选择:

+
    +
  • 选择自建模式:适合预算充足、技术团队完备、对数据主权要求极高的医院。
  • +
  • 选择共建模式:适合希望降低初期投资、获得专业服务的医院,特别适合医疗数据合规要求高的场景。
  • +
+

接口与集成能力

+

用户需求书要求与HIS、LIS、PACS、医保等系统进行对接,但建设内容中"集成引擎"和"业务中台"等项目未明确接口数量、协议支持(如HL7、FHIR、DICOM)和数据格式标准。需要补充详细的接口集成方案。

+

标准协议选择原则: +只集成最新最广泛的标准,避免集成过时或小众协议,确保长期兼容性和维护便利性。

+

核心标准协议:

+
    +
  • FHIR (Fast Healthcare Interoperability Resources):HL7最新标准,RESTful API架构,支持JSON格式。适用于现代医疗信息交换,是未来主流标准。
  • +
  • DICOM (Digital Imaging and Communications in Medicine):医学影像标准,支持PACS系统集成,版本3.0及以上。
  • +
  • HL7 v2.8+:消息交换标准,适用于HIS、LIS等传统系统集成,逐步向FHIR迁移。
  • +
  • RESTful API:基于HTTP的现代Web服务标准,支持JSON数据格式。
  • +
  • OAuth 2.0 + OpenID Connect:身份认证和授权标准,确保安全访问。
  • +
+

接口集成方案:

+
    +
  • +

    接口数量规划:初期建设50个标准接口,后续可扩展至200个。按优先级分阶段实施:

    +
      +
    • 第一阶段(3个月):核心业务接口(HIS、PACS、医保)- 20个
    • +
    • 第二阶段(6个月):扩展业务接口(LIS、EMR、物联网)- 30个
    • +
    • 第三阶段(12个月):完整集成接口 - 200个
    • +
    +
  • +
  • +

    数据格式标准:统一采用JSON作为主要数据格式,XML作为兼容格式。所有接口支持UTF-8编码。

    +
  • +
  • +

    集成架构:采用ESB(企业服务总线)+微服务架构,支持协议转换、消息路由、数据映射等功能。

    +
  • +
  • +

    安全保障:所有接口采用HTTPS传输,API密钥+数字证书双重认证,敏感数据加密传输。

    +
  • +
  • +

    监控运维:提供接口调用统计、性能监控、错误日志等运维功能,支持7×24小时监控告警。

    +
  • +
+

系统对接清单:

+
    +
  • HIS系统:FHIR + HL7 v2.x混合模式
  • +
  • PACS系统:DICOM + RESTful API
  • +
  • LIS系统:HL7 v2.x + FHIR
  • +
  • 医保系统:专用医保接口 + FHIR
  • +
  • 物联网平台:MQTT + RESTful API
  • +
+

终端设备部署

+

用户需求书提到医院需要部署智能手环、网关、NFC、电子围栏等物联网设备,但建设内容中"终端系统"仅列出"康养养老家庭终端",未明确医院端的设备类型、数量和部署范围。需要补充医院物联网终端的详细建设内容。

+

医院物联网终端建设方案:

+

设备类型与数量规划:

+
    +
  • 智能手环:2000个,支持心率、血压、血氧、体温、运动数据监测
  • +
  • 物联网网关/基站:50个,支持多协议数据汇聚和边缘计算
  • +
  • NFC读写器:100个,用于门禁、支付、身份识别
  • +
+

蓝牙+2.4G双模方案技术规格:

+
    +
  1. 双模式动态切换:2.4G + 蓝牙双模式,根据信号强度和数据类型自动切换最优通信方式
  2. +
  3. 实时多路数据上报:同时接收200+手环并行数据传送,支持高并发数据处理
  4. +
  5. 多协议接入支持:支持MQTT、TCP Server、TCP Client、UDP、API等多种接入方式
  6. +
  7. 多基站协同工作:基站之间自动协同,负载均衡和故障转移
  8. +
  9. 边缘计算能力:基站本地数据清洗过滤和打包,减少网络传输压力
  10. +
  11. 增强信号性能:发送功率20dBm+,接收灵敏度-95dBm,发送功率动态可调
  12. +
  13. 全设备OTA升级:支持基站和手环的远程无线升级
  14. +
  15. 本地数据缓存:上行缓存(断网续传)和下行缓存(指令队列)
  16. +
  17. 电源适配多样:支持12V适配器和POE(Power over Ethernet)供电
  18. +
  19. 网络接入灵活:支持ETH有线接入和WIFI无线接入
  20. +
  21. 数据链路备份:本地多基站自动数据链路互相备份,确保通信可靠性
  22. +
  23. 服务器接入冗余:基站支持主备多服务器接入,自动故障切换
  24. +
  25. 时间转发服务:NTP时间同步服务,确保设备时间统一
  26. +
  27. 远程集中管理:Web管理平台,支持远程配置和监控
  28. +
  29. 数据优先级处理:支持紧急数据优先传输,普通数据队列处理
  30. +
  31. 无缝切换:多基站之间无缝漫游切换,用户无感知
  32. +
+

部署范围与场景:

+
    +
  • 住院部:重点部署智能手环,实时监测患者生命体征
  • +
  • 门诊部:部署NFC读写器,支持快速挂号和支付
  • +
  • 康复中心:部署运动监测设备,支持康复训练数据采集
  • +
  • 养老院区:部署智能药盒,支持老人安全监护
  • +
  • 公共区域:部署网关基站,确保全院覆盖
  • +
+

集成与管理:

+
    +
  • 与HIS系统集成,实现数据自动同步
  • +
  • 统一管理平台,支持设备状态监控和告警
  • +
  • 数据加密传输,确保患者隐私安全
  • +
  • 支持设备资产管理和生命周期管理
  • +
+

知识产权

+

建设内容涉及大量定制开发的系统软件,但未明确软件著作权归属和版权合法性要求。需要补充知识产权保护条款,确保定制软件的合法合规。

+

知识产权归属说明: +绝大部分软件由骅锋科技及关联公司开发,软件著作权及相关知识产权均归属于骅锋科技。医院获得软件的使用授权,但不拥有软件的著作权。

+

授权范围:

+
    +
  • 永久性使用授权:医院可在授权范围内永久使用相关软件
  • +
  • 功能扩展授权:支持医院业务发展需要的功能扩展和定制开发
  • +
  • 技术支持授权:提供长期技术支持和维护服务
  • +
  • 数据所有权:医院拥有业务数据的完全所有权和使用权
  • +
+

第三方软件授权:

+
    +
  • 开源组件:使用Apache 2.0、MIT等开源协议组件,确保合规使用
  • +
  • 商业组件:采购正版商业软件授权,确保版权合法性
  • +
  • 专利技术:涉及的专利技术已获得合法授权或自主研发
  • +
+

风险识别

+

基于上述问题,可能存在的实施风险包括:

+

性能瓶颈导致系统无法满足并发要求

+
    +
  • 风险描述:系统在高并发场景下响应缓慢、超时或崩溃,影响医疗服务的正常运行
  • +
  • 可能原因:服务器配置不足、数据库连接池设置不当、代码性能优化不够、缓存策略不合理
  • +
  • 潜在影响:患者就诊效率降低、医生工作效率下降、医疗事故风险增加、医院声誉受损
  • +
  • 应对措施:加强性能测试、优化系统架构、实施监控告警、制定应急预案
  • +
+

AI训练资源不足影响模型效果

+
    +
  • 风险描述:AI模型训练时间过长、准确率不达标、无法满足实时推理需求
  • +
  • 可能原因:GPU资源配置不足、训练数据质量不佳、算法选择不当、训练环境不稳定
  • +
  • 潜在影响:AI辅助诊断功能失效、医疗决策支持不准确、项目预期目标无法达成
  • +
  • 应对措施:优化AI资源配置、提升数据质量、选择合适的算法、建立模型验证机制
  • +
+

数据存储架构不完善导致数据丢失

+
    +
  • 风险描述:重要医疗数据丢失或损坏,无法恢复,影响医疗服务连续性
  • +
  • 可能原因:存储硬件故障、备份策略不完善、灾备系统未及时同步、人为误操作
  • +
  • 潜在影响:患者病历信息丢失、医疗历史断层、法律责任风险、医院运营中断
  • +
  • 应对措施:建立多重备份机制、定期灾备演练、数据加密存储、访问权限控制
  • +
+

接口集成不充分影响系统协同

+
    +
  • 风险描述:各医疗系统之间数据无法互通、信息孤岛现象严重,影响医疗流程
  • +
  • 可能原因:接口协议不匹配、数据格式转换错误、集成测试不充分、网络连接不稳定
  • +
  • 潜在影响:重复录入工作增加、医疗决策延迟、跨科室协作困难、患者就医体验差
  • +
  • 应对措施:采用标准协议、加强集成测试、建立数据映射机制、实施接口监控
  • +
+

终端设备部署不完整影响物联网功能

+
    +
  • 风险描述:物联网设备覆盖不全、通信不稳定、数据采集不准确,影响智能医疗应用
  • +
  • 可能原因:设备选型不当、部署位置不合理、网络信号覆盖不足、设备维护不及时
  • +
  • 潜在影响:患者监测数据缺失、紧急情况无法及时响应、智能服务功能受限
  • +
  • 应对措施:合理规划设备布局、选择可靠设备供应商、建立维护体系、实施备用方案
  • +
+

现场演示场景

+

基于蓝牙+2.4G双模方案的技术规格,我们设计了以下现场演示场景,专门展示物联网通信技术的核心特性:

+

场景一:多模通信动态切换演示

+

演示内容:

+
    +
  • 设置多个信号环境(强信号区、弱信号区、干扰区)
  • +
  • 演示手环在不同区域自动切换通信模式(蓝牙↔2.4G)
  • +
  • 实时显示通信模式切换过程和信号质量参数
  • +
  • 展示切换过程中的数据连续性,无数据丢失
  • +
+

技术特性展示:

+
    +
  1. 双模式动态切换:根据信号强度自动选择最优通信方式
  2. +
  3. 增强信号性能:显示实时信号强度、发送功率调节
  4. +
+

演示价值: +验证通信系统的智能性和可靠性,确保在复杂医院环境中稳定通信。

+

场景二:高并发多路数据处理演示

+

演示内容:

+
    +
  • 同时连接10-20个智能手环进行数据采集
  • +
  • 实时显示各手环的数据上传状态和处理速度
  • +
  • 模拟高并发场景,展示系统处理200+并发连接的能力
  • +
  • 显示数据处理延迟和成功率统计
  • +
+

技术特性展示: +2. 实时多路数据上报:支持200+手环并行数据传送 +5. 边缘计算能力:基站本地数据清洗和预处理 +15. 数据优先级处理:紧急数据优先传输机制

+

演示价值: +验证系统在高负载下的性能表现和数据处理能力。

+

场景三:多基站协同与无缝漫游演示

+

演示内容:

+
    +
  • 部署3-5个基站形成网络覆盖
  • +
  • 手环在不同基站覆盖区域间移动
  • +
  • 实时显示基站切换过程和数据连续性
  • +
  • 模拟单个基站故障,展示自动故障转移
  • +
+

技术特性展示: +4. 多基站协同工作:负载均衡和故障转移 +11. 数据链路备份:多基站互相备份 +16. 无缝切换:漫游切换无感知 +12. 服务器接入冗余:主备服务器自动切换

+

演示价值: +展示物联网网络的可靠性和扩展性,验证医院全覆盖能力。

+

场景四:智能设备管理与OTA升级演示

+

演示内容:

+
    +
  • 通过Web管理平台远程查看所有设备状态
  • +
  • 演示远程配置参数修改
  • +
  • 执行OTA升级过程,展示升级进度和成功率
  • +
  • 显示升级后的新功能激活
  • +
+

技术特性展示: +7. 全设备OTA升级:基站和手环远程无线升级 +14. 远程集中管理:Web平台配置和监控 +13. 时间转发服务:NTP时间同步

+

演示价值: +展示系统的可维护性和升级便捷性,降低运维成本。

+

场景五:网络适应性与容错演示

+

演示内容:

+
    +
  • 模拟网络断开场景,展示数据缓存机制
  • +
  • 网络恢复后自动同步缓存数据
  • +
  • 测试不同电源模式(12V适配器、POE供电)
  • +
  • 切换网络接入方式(ETH、WIFI)
  • +
+

技术特性展示: +8. 本地数据缓存:断网续传和指令队列 +9. 电源适配多样:12V和POE供电支持 +10. 网络接入灵活:ETH和WIFI双重接入 +3. 多协议接入支持:MQTT、TCP、UDP等多种协议

+

演示价值: +验证系统的稳定性和适应性,确保在各种环境下可靠运行。

+

演示环境配置

+

硬件设备:

+
    +
  • 智能手环:10-20个(模拟患者佩戴)
  • +
  • 物联网基站:3-5个(形成网络覆盖)
  • +
  • 信号屏蔽箱:1个(模拟不同信号环境)
  • +
  • 移动推车:1个(模拟患者移动场景)
  • +
+

软件平台:

+
    +
  • Web管理平台:实时监控界面
  • +
  • 数据展示大屏:可视化数据流和状态
  • +
  • 协议分析工具:显示通信协议细节
  • +
+

演示流程:

+
    +
  1. 准备阶段(5分钟):设备连接和参数配置
  2. +
  3. 通信演示(10分钟):多模切换和高并发处理
  4. +
  5. 网络演示(10分钟):基站协同和漫游切换
  6. +
  7. 管理演示(5分钟):远程配置和OTA升级
  8. +
  9. 容错演示(5分钟):网络恢复和电源切换
  10. +
+

预期效果: +通过这些演示,观众可以直观感受到蓝牙+2.4G双模方案的16项技术特性在实际医疗场景中的应用效果,充分验证系统的技术先进性和实用价值。

+ + + + + + + \ No newline at end of file diff --git a/AMBIGUOUS_COLUMN_FIX.md b/AMBIGUOUS_COLUMN_FIX.md new file mode 100644 index 0000000..9bf5e2d --- /dev/null +++ b/AMBIGUOUS_COLUMN_FIX.md @@ -0,0 +1,212 @@ +# 列引用歧义修复说明 + +## 问题描述 + +在执行 `video_system_database.sql` 时,遇到了 `ERROR: 42702: column reference "user_id" is ambiguous` 错误。这表明在 SQL 查询中存在列名歧义,即多个表都有相同的列名,但没有明确指定使用哪个表的列。 + +## 错误位置 + +错误发生在 `vw_user_media_stats` 视图的定义中(大约第 565 行): + +```sql +-- 有问题的代码 +SELECT + user_id, -- 歧义:ui.user_id 还是 vpr.user_id? + ... +FROM ak_user_interactions ui +LEFT JOIN ak_contents c ON ui.content_id = c.id +LEFT JOIN ak_video_play_records vpr ON ui.content_id = vpr.content_id AND ui.user_id = vpr.user_id +WHERE ui.interaction_type = 'view' +GROUP BY user_id; -- 歧义:ui.user_id 还是 vpr.user_id? +``` + +## 根本原因 + +当在 SQL 查询中联接多个表时,如果这些表包含相同名称的列,必须使用表别名来明确指定要引用的是哪个表的列。 + +在这个视图中: +- `ak_user_interactions` 表有 `user_id` 列 +- `ak_video_play_records` 表也有 `user_id` 列 + +当我们在 SELECT 子句中写 `user_id` 时,PostgreSQL 不知道我们指的是哪个表的 `user_id`,因此报告列引用歧义错误。 + +## 修复方案 + +### 1. 使用表别名明确指定列 + +**修复前(有问题的代码)**: +```sql +SELECT + user_id, -- 歧义 + ... +FROM ak_user_interactions ui +LEFT JOIN ak_video_play_records vpr ON ... +GROUP BY user_id; -- 歧义 +``` + +**修复后(正确的代码)**: +```sql +SELECT + ui.user_id, -- 明确指定来自 ak_user_interactions 表 + ... +FROM ak_user_interactions ui +LEFT JOIN ak_video_play_records vpr ON ... +GROUP BY ui.user_id; -- 明确指定来自 ak_user_interactions 表 +``` + +### 2. 完整的修复代码 + +```sql +CREATE OR REPLACE VIEW vw_user_media_stats AS +SELECT + ui.user_id, -- 明确指定表别名 + COUNT(CASE WHEN c.content_type = 'video' THEN 1 END) as videos_watched, + COUNT(CASE WHEN c.content_type = 'audio' THEN 1 END) as audios_listened, + COUNT(CASE WHEN c.content_type = 'image' THEN 1 END) as images_viewed, + SUM(CASE WHEN c.content_type IN ('video', 'audio') THEN vpr.play_duration ELSE 0 END) as total_play_time, + AVG(CASE WHEN c.content_type IN ('video', 'audio') THEN vpr.play_percentage ELSE NULL END) as avg_completion_rate +FROM ak_user_interactions ui +LEFT JOIN ak_contents c ON ui.content_id = c.id +LEFT JOIN ak_video_play_records vpr ON ui.content_id = vpr.content_id AND ui.user_id = vpr.user_id +WHERE ui.interaction_type = 'view' +GROUP BY ui.user_id; -- 明确指定表别名 +``` + +## 最佳实践 + +### 1. 始终使用表别名 + +```sql +-- ✅ 推荐:使用表别名 +SELECT + u.user_id, + u.user_name, + p.profile_data +FROM users u +JOIN profiles p ON u.id = p.user_id; + +-- ❌ 避免:不使用表别名(可能产生歧义) +SELECT + user_id, -- 如果两个表都有这个列,会报错 + user_name, + profile_data +FROM users +JOIN profiles ON users.id = profiles.user_id; +``` + +### 2. 有意义的表别名 + +```sql +-- ✅ 推荐:有意义的别名 +FROM ak_user_interactions ui +LEFT JOIN ak_contents c +LEFT JOIN ak_video_play_records vpr + +-- ❌ 避免:无意义的别名 +FROM ak_user_interactions a +LEFT JOIN ak_contents b +LEFT JOIN ak_video_play_records c +``` + +### 3. 一致的命名约定 + +```sql +-- ✅ 推荐:一致的命名 +FROM ak_user_interactions ui +FROM ak_content_comments cc +FROM ak_video_danmakus vd + +-- ❌ 避免:不一致的命名 +FROM ak_user_interactions interactions +FROM ak_content_comments c +FROM ak_video_danmakus danmu +``` + +## 验证方法 + +### 测试修复 + +```sql +-- 测试视图是否可以正常创建 +CREATE OR REPLACE VIEW vw_user_media_stats AS ...; + +-- 测试视图是否可以正常查询 +SELECT * FROM vw_user_media_stats LIMIT 5; + +-- 检查返回的列是否正确 +\d vw_user_media_stats +``` + +### 查找潜在的歧义 + +```sql +-- 检查是否有其他可能的列名歧义 +SELECT + table_name, + column_name, + COUNT(*) as table_count +FROM information_schema.columns +WHERE table_schema = current_schema() +AND table_name LIKE 'ak_%' +GROUP BY column_name +HAVING COUNT(*) > 1 +ORDER BY table_count DESC, column_name; +``` + +## 其他常见的歧义情况 + +### 1. ID 列歧义 + +```sql +-- 可能有歧义的查询 +SELECT id FROM table1 t1 JOIN table2 t2 ON t1.ref_id = t2.id; + +-- 修复:明确指定表 +SELECT t1.id FROM table1 t1 JOIN table2 t2 ON t1.ref_id = t2.id; +``` + +### 2. 时间戳列歧义 + +```sql +-- 可能有歧义 +SELECT created_at FROM posts p JOIN comments c ON p.id = c.post_id; + +-- 修复:明确指定表 +SELECT p.created_at FROM posts p JOIN comments c ON p.id = c.post_id; +``` + +### 3. 状态列歧义 + +```sql +-- 可能有歧义 +SELECT status FROM orders o JOIN payments p ON o.id = p.order_id; + +-- 修复:明确指定表或使用别名 +SELECT + o.status as order_status, + p.status as payment_status +FROM orders o +JOIN payments p ON o.id = p.order_id; +``` + +## 预防措施 + +### 1. 代码审查清单 + +在创建包含多表 JOIN 的查询时,检查: +- ✅ 所有列都有明确的表别名 +- ✅ 表别名有意义且一致 +- ✅ GROUP BY 子句中的列也有表别名 +- ✅ ORDER BY 子句中的列也有表别名 + +### 2. 开发工具配置 + +使用支持 SQL 语法检查的编辑器,可以在开发时发现潜在的歧义。 + +### 3. 测试策略 + +- 在开发环境中测试所有视图 +- 使用自动化测试验证 SQL 语法 +- 定期检查数据库结构变更对现有查询的影响 + +修复后的数据库现在可以正常部署,所有列引用都是明确无歧义的。 diff --git a/App.uvue b/App.uvue new file mode 100644 index 0000000..fecab12 --- /dev/null +++ b/App.uvue @@ -0,0 +1,50 @@ + + + \ No newline at end of file diff --git a/COMINDEX_REFACTOR_SUMMARY.md b/COMINDEX_REFACTOR_SUMMARY.md new file mode 100644 index 0000000..d0fc864 --- /dev/null +++ b/COMINDEX_REFACTOR_SUMMARY.md @@ -0,0 +1,116 @@ +# comindex.uvue 重构总结 + +## 重构目标 +根据最新的数据库结构(主表+翻译表模式),重构公司首页的数据获取逻辑,删除不必要的数据获取方式,确保代码简洁高效。 + +## 数据库结构 +- **主表**: `ak_global_config` - 存储配置的基本信息 +- **翻译表**: `ak_global_config_translations` - 存储多语言翻译 +- **查询函数**: `get_configs_by_language(p_language_code)` - 一键获取指定语言的所有配置 + +## 重构内容 + +### 1. 简化数据加载逻辑 +**之前**: 多层备用查询方案(RPC函数 → 视图查询 → 联查) +```typescript +// 复杂的三层备用查询 +try { + // 尝试RPC函数 +} catch { + try { + // 尝试视图查询 + } catch { + // 最后联查 + } +} +``` + +**现在**: 直接使用最优查询函数 +```typescript +// 直接使用最新的查询函数 +const result = await supa.rpc('get_configs_by_language', { + p_language_code: langCode +}) +``` + +### 2. 优化数据处理函数 + +#### `updateCompanyInfoDirectly()` 函数 +- **优化前**: 大量的错误检查和日志输出 +- **优化后**: 简洁的配置读取,减少冗余代码 + +#### `updateSocialMediaLinksNew()` 函数 +- **优化前**: 逐个检查和更新社交媒体链接 +- **优化后**: 使用配置映射数组,统一处理逻辑 + +#### `updateHotSearchKeywordsNew()` 函数 +- **优化前**: 复杂的switch语句处理默认值 +- **优化后**: 使用对象映射,代码更简洁 + +#### `useDefaultCompanyConfig()` 函数 +- **优化前**: 冗长的switch-case结构 +- **优化后**: 使用配置对象,代码更清晰 + +### 3. 删除冗余调试函数 + +#### 删除的函数 +- `debugNewConfigSystem()` - 过于复杂的调试函数 +- `testAllLanguages()` - 多语言测试函数(功能重复) +- 重复的 `reloadConfig()` 函数定义 + +#### 保留的简化调试 +- `debugConfigSystem()` - 简化的状态检查 +- `reloadConfig()` - 基础的配置重载 + +### 4. 更新调试面板 +- 删除不存在的函数调用 +- 简化调试选项 +- 增加加载状态显示 + +## 性能优化 + +### 1. 减少数据库查询 +- 从3种备用查询方式减少到1种主要方式 +- 删除不必要的测试查询 + +### 2. 简化数据处理 +- 使用更高效的数据映射 +- 减少循环和条件判断 + +### 3. 优化代码结构 +- 删除冗余代码行数: ~200行 +- 提高代码可读性和维护性 + +## 语言代码映射 +确保兼容现有的语言切换逻辑: +- `zh-CN`, `zh` → `zh` +- `en-US`, `en` → `en` +- `zh-TW` → `tw` +- `ja-JP`, `ja` → `ja` + +## 配置项分类 +### 可翻译配置 +- `company_name` - 公司名称 +- `company_slogan` - 公司标语 +- `company_address` - 公司地址 +- `hot_search_1-5` - 热门搜索关键词 + +### 不可翻译配置 +- `company_phone` - 电话 +- `company_email` - 邮箱 +- `company_icp` - 备案号 +- `company_logo_url` - LOGO地址 +- `social_*_url` - 社交媒体链接 + +## 兜底机制 +保留默认配置作为数据库连接失败时的兜底方案,确保应用在任何情况下都能正常显示。 + +## 测试建议 +1. 验证多语言切换功能 +2. 测试配置加载性能 +3. 确认社交媒体链接更新 +4. 检查热门搜索关键词显示 +5. 验证调试面板功能 + +## 总结 +重构后的代码更加简洁、高效,完全适配新的数据库结构,删除了所有不必要的逻辑,提高了维护性和性能。前端现在完全依赖新的主表+翻译表结构,为后续的功能扩展奠定了良好基础。 diff --git a/COMPANY_CONFIG_GUIDE.md b/COMPANY_CONFIG_GUIDE.md new file mode 100644 index 0000000..731c005 --- /dev/null +++ b/COMPANY_CONFIG_GUIDE.md @@ -0,0 +1,217 @@ +# 公司信息全局配置系统使用指南 + +## 概述 + +`comindex.uvue` 页面现在支持从全局配置表 `ak_global_config` 中动态获取公司信息,支持多语言展示。 + +## 特性 + +### 1. 多语言支持 +支持以下语言: +- 简体中文 (zh-CN) +- 英文 (en) +- 繁体中文 (zh-TW) +- 日文 (ja) + +### 2. 配置项目 +从全局配置表获取的信息包括: + +#### 公司基础信息 +- `company_name_*`: 公司名称 +- `company_slogan_*`: 公司标语 +- `company_address_*`: 公司地址 +- `company_phone`: 公司电话 +- `company_email`: 公司邮箱 +- `company_icp`: ICP备案号 +- `company_logo_url`: 公司LOGO地址 + +#### 社交媒体链接 +- `social_wechat_url`: 微信链接 +- `social_weibo_url`: 微博链接 +- `social_qq_url`: QQ链接 +- `social_linkedin_url`: LinkedIn链接 +- `social_twitter_url`: Twitter链接 + +#### 热门搜索关键词 +- `hot_search_1_*` 到 `hot_search_5_*`: 热门搜索关键词 + +*注:带 * 的配置项支持多语言,后缀为 _zh, _en, _tw, _ja* + +## 新设计说明 (推荐) + +### 表结构优化 +新设计采用主表+翻译表模式,解决了原有设计的冗余问题: + +#### 主配置表 (ak_global_config) +```sql +CREATE TABLE public.ak_global_config ( + id UUID PRIMARY KEY, + config_key VARCHAR(100) UNIQUE, -- 如: company_name (不再有语言后缀) + config_category VARCHAR(50), -- 配置分类: company, social, search等 + is_translatable BOOLEAN, -- 是否需要多语言翻译 + default_value TEXT, -- 默认值(用于不需翻译的配置) + sort_order INTEGER, -- 排序 + is_active BOOLEAN +); +``` + +#### 翻译表 (ak_global_config_translations) +```sql +CREATE TABLE public.ak_global_config_translations ( + config_id UUID REFERENCES ak_global_config(id), + language_code VARCHAR(10), -- zh, en, tw, ja + translated_value TEXT, -- 翻译值 + UNIQUE(config_id, language_code) +); +``` + +### 新设计优势 +- ✅ **结构清晰**: 主表存元数据,翻译表存多语言值 +- ✅ **易于维护**: 新增语言只需在翻译表添加记录 +- ✅ **分类管理**: 通过 config_category 实现配置分组 +- ✅ **类型区分**: 通过 is_translatable 区分是否需要翻译 +- ✅ **默认回退**: 支持默认值回退机制 + +### 便捷查询 +新设计提供了视图和函数简化查询: + +```sql +-- 获取指定语言的所有配置 +SELECT * FROM get_config_by_language('zh'); + +-- 获取热门搜索关键词 +SELECT * FROM get_hot_searches('zh'); + +-- 查看多语言配置视图 +SELECT * FROM vw_global_config_multilingual WHERE language_code = 'zh'; +``` + +--- + +## 原有设计说明 (兼容) + +*注:为保持兼容性,以下内容保留作为参考* + +## 部署步骤 + +### 1. 执行数据库初始化 +```sql +-- 运行初始化脚本 +\i init_company_global_config.sql +``` + +### 2. 验证配置 +```sql +-- 查看所有配置 +SELECT * FROM public.vw_active_global_config; + +-- 查看特定语言的公司名称 +SELECT config_key, config_value +FROM public.ak_global_config +WHERE config_key LIKE 'company_name_%' +AND is_active = true; +``` + +### 3. 自定义配置 +更新配置值: +```sql +-- 更新公司名称 +UPDATE public.ak_global_config +SET config_value = '您的公司名称' +WHERE config_key = 'company_name_zh'; + +-- 更新社交媒体链接 +UPDATE public.ak_global_config +SET config_value = 'https://your-wechat-link' +WHERE config_key = 'social_wechat_url'; +``` + +## 页面功能 + +### 1. 自动加载 +页面初始化时自动从配置表加载公司信息。 + +### 2. 语言切换 +用户切换语言时,页面会自动更新为对应语言的公司信息。 + +### 3. 加载状态 +在公司LOGO旁边显示加载指示器,用户体验更友好。 + +### 4. 错误处理 +如果配置加载失败,使用默认值保证页面正常展示。 + +## 代码结构 + +### 主要函数 +- `loadCompanyConfig()`: 加载全局配置 +- `updateCompanyInfoByLanguage()`: 根据语言更新信息 +- `updateSocialMediaLinks()`: 更新社交媒体链接 +- `updateHotSearchKeywords()`: 更新热门搜索关键词 + +### 数据类型 +```typescript +type CompanyConfig = { + id?: string + config_key: string + config_value: string + config_type: string + description?: string + language?: string + is_active?: boolean + created_at?: string + updated_at?: string +} +``` + +## 最佳实践 + +### 1. 配置管理 +- 定期备份配置数据 +- 使用版本控制管理配置变更 +- 在更新配置前先测试 + +### 2. 多语言内容 +- 确保所有语言版本的内容长度适中 +- 注意文化差异,调整内容表达 +- 定期检查翻译质量 + +### 3. 性能优化 +- 配置数据会在页面初始化时一次性加载 +- 语言切换时只更新显示,无需重新请求 +- 使用Map结构快速查找配置项 + +## 扩展指南 + +### 添加新语言 +1. 在数据库中添加新的配置项(如 `company_name_fr` 法语) +2. 更新 `loadCompanyConfig()` 函数的配置key列表 +3. 更新 `getLanguageSuffix()` 函数支持新语言 +4. 在 `availableLanguages` 中添加新语言选项 + +### 添加新配置项 +1. 在数据库中插入新的配置记录 +2. 更新配置获取列表 +3. 在对应的更新函数中处理新配置 + +## 故障排除 + +### 常见问题 +1. **配置不生效**: 检查 `is_active` 字段是否为 true +2. **多语言显示错误**: 确认配置key的命名规范 +3. **加载失败**: 检查数据库连接和表结构 + +### 调试方法 +```javascript +// 在浏览器控制台查看配置数据 +console.log('配置映射:', companyConfigMap.value) +console.log('当前语言:', currentLanguageCode.value) +console.log('公司名称:', companyDisplayName.value) +``` + +## 更新日志 + +### v1.0.0 (2025-01-07) +- 初始版本 +- 支持4种语言的公司信息配置 +- 实现动态加载和语言切换 +- 添加加载状态和错误处理 diff --git a/Convert-MermaidToPdf.ps1 b/Convert-MermaidToPdf.ps1 new file mode 100644 index 0000000..f8bf9fd --- /dev/null +++ b/Convert-MermaidToPdf.ps1 @@ -0,0 +1,90 @@ +param( + [Parameter(Mandatory=$true)] + [string]$InputFile, + + [Parameter(Mandatory=$true)] + [string]$OutputFile +) + +Write-Host "Converting $InputFile to $OutputFile with Mermaid support..." + +# Read the markdown content +$content = Get-Content $InputFile -Raw + +# Create temp directory +$tempDir = Join-Path $env:TEMP ("mermaid_temp_" + [guid]::NewGuid().ToString()) +New-Item -ItemType Directory -Path $tempDir | Out-Null + +# Process mermaid blocks +$mermaidPattern = '(?s)```mermaid\s*\n(.*?)\n```' +$matches = [regex]::Matches($content, $mermaidPattern) + +for ($i = 0; $i -lt $matches.Count; $i++) { + $match = $matches[$i] + $mermaidCode = $match.Groups[1].Value + + # Create temp mermaid file + $mermaidFile = Join-Path $tempDir "diagram_$i.mmd" + $pngFile = Join-Path $tempDir "diagram_$i.png" + + # Write mermaid code to file + $mermaidCode | Out-File -FilePath $mermaidFile -Encoding UTF8 + + # Try to find mmdc executable + $mmdcPaths = @( + "mmdc", + (Join-Path $env:APPDATA "npm\mmdc.cmd"), + "D:\scoop\apps\yarn\current\global\bin\mmdc.cmd" + ) + + $mmdcFound = $false + foreach ($mmdcPath in $mmdcPaths) { + if (Test-Path $mmdcPath) { + Write-Host "Using mmdc at: $mmdcPath" + & $mmdcPath -i $mermaidFile -o $pngFile -t dark -b transparent + if ($LASTEXITCODE -eq 0) { + $mmdcFound = $true + break + } + } + } + + # Replace mermaid code with image reference + if ((Test-Path $pngFile) -and $mmdcFound) { + $imageRef = "![Mermaid Diagram $i]($pngFile)" + $content = $content.Replace($match.Value, $imageRef) + } +} + +# Write processed content to temp file +$processedFile = Join-Path $tempDir "processed.md" +$content | Out-File -FilePath $processedFile -Encoding UTF8 + +# Convert to PDF using pandoc with wkhtmltopdf if available, otherwise try other engines +$engines = @("--pdf-engine=wkhtmltopdf", "--pdf-engine=weasyprint", "") +$success = $false + +foreach ($engine in $engines) { + try { + if ($engine) { + pandoc $processedFile -o $OutputFile $engine + } else { + pandoc $processedFile -o $OutputFile + } + if ($LASTEXITCODE -eq 0) { + $success = $true + break + } + } catch { + continue + } +} + +# Clean up +Remove-Item $tempDir -Recurse -Force + +if ($success) { + Write-Host "Conversion completed successfully!" +} else { + Write-Host "Conversion failed - no suitable PDF engine found!" +} \ No newline at end of file diff --git a/DUPLICATE_COLUMN_FIX.md b/DUPLICATE_COLUMN_FIX.md new file mode 100644 index 0000000..8033099 --- /dev/null +++ b/DUPLICATE_COLUMN_FIX.md @@ -0,0 +1,153 @@ +# 重复列名修复说明 + +## 问题描述 + +在执行 `video_system_database.sql` 时,遇到了 `ERROR: 42701: column "view_count" specified more than once` 错误。这是由于视图定义中存在重复的列名导致的。 + +## 根本原因 + +问题出现在视图定义中使用了 `c.*` (选择表的所有列) 同时又显式选择了统计表中的同名列: + +```sql +-- 有问题的代码 +CREATE VIEW vw_media_content_detail AS +SELECT + c.*, -- 包含了 ak_contents 表的所有列 + s.view_count, -- 显式选择统计表的 view_count 列 + s.like_count, -- 如果 ak_contents 也有这些列,就会重复 + ... +``` + +当 `ak_contents` 表被扩展添加了多媒体字段后,可能与统计表 `ak_content_statistics` 中的某些列名重复。 + +## 修复方案 + +### 1. 明确列出所需列 + +将所有视图中的 `c.*` 替换为明确的列列表: + +```sql +-- 修复后的代码 +CREATE OR REPLACE VIEW vw_media_content_detail AS +SELECT + -- 基础字段 + c.id, + c.title, + c.content, + c.excerpt, + c.slug, + c.featured_image, + c.status, + c.published_at, + c.created_at, + c.updated_at, + c.content_type, + -- 视频字段 + c.video_url, + c.video_duration, + c.video_poster, + -- ... 其他明确列出的字段 + -- 统计字段 (不会重复) + s.view_count, + s.like_count, + s.favorite_count, + ... +``` + +### 2. 添加视图的 `CREATE OR REPLACE` + +所有视图都使用 `CREATE OR REPLACE VIEW` 语法,使脚本可以安全重复执行: + +```sql +CREATE OR REPLACE VIEW vw_media_content_detail AS ... +CREATE OR REPLACE VIEW vw_video_content_detail AS ... +CREATE OR REPLACE VIEW vw_audio_content_detail AS ... +CREATE OR REPLACE VIEW vw_image_content_detail AS ... +CREATE OR REPLACE VIEW vw_video_danmakus AS ... +CREATE OR REPLACE VIEW vw_content_comments AS ... +CREATE OR REPLACE VIEW vw_popular_image_tags AS ... +CREATE OR REPLACE VIEW vw_user_media_stats AS ... +``` + +## 修复的视图 + +### 1. `vw_media_content_detail` +- **问题**:`c.*` 与统计字段重复 +- **修复**:明确列出所有需要的列 +- **优势**:包含所有多媒体字段,避免列名冲突 + +### 2. `vw_image_content_detail` +- **问题**:`c.*` 与统计字段重复,GROUP BY 不完整 +- **修复**:明确列出列名,完整的 GROUP BY 子句 +- **优势**:支持图片标签聚合,避免列名冲突 + +### 3. 其他视图 +- 所有视图都添加了 `OR REPLACE` 关键字 +- 确保可以安全地重复执行 + +## 优势和好处 + +### ✅ 明确性 +- 明确知道每个视图包含哪些列 +- 避免意外包含不需要的列 +- 便于维护和理解 + +### ✅ 兼容性 +- 避免列名冲突 +- 支持数据库结构演进 +- 向后兼容现有代码 + +### ✅ 可维护性 +- 使用 `CREATE OR REPLACE VIEW` +- 可以安全地重复执行 +- 支持增量更新 + +### ✅ 性能优化 +- 只选择需要的列 +- 减少数据传输 +- 提高查询效率 + +## 使用建议 + +### 开发最佳实践 +```sql +-- ✅ 推荐:明确列出所需列 +SELECT + c.id, + c.title, + s.view_count +FROM contents c +LEFT JOIN statistics s ON c.id = s.content_id; + +-- ❌ 避免:使用 * 可能导致列名冲突 +SELECT + c.*, + s.view_count -- 可能与 c.* 中的列重复 +FROM contents c +LEFT JOIN statistics s ON c.id = s.content_id; +``` + +### 视图设计原则 +1. **明确性优于简洁性**:明确列出列名比使用 `*` 更安全 +2. **使用 OR REPLACE**:确保可以安全更新视图 +3. **避免列名歧义**:使用表别名和明确的列名 +4. **完整的 GROUP BY**:聚合查询要包含所有非聚合列 + +## 验证方法 + +### 测试视图创建 +```sql +-- 这些命令现在应该都能成功执行 +CREATE OR REPLACE VIEW vw_media_content_detail AS ... +CREATE OR REPLACE VIEW vw_image_content_detail AS ... +-- ... 其他视图 +``` + +### 查询测试 +```sql +-- 验证视图可以正常查询 +SELECT * FROM vw_media_content_detail LIMIT 1; +SELECT * FROM vw_image_content_detail LIMIT 1; +``` + +修复后的数据库现在可以安全部署,所有视图都避免了列名冲突问题。 diff --git a/DUPLICATE_OBJECTS_FIX.md b/DUPLICATE_OBJECTS_FIX.md new file mode 100644 index 0000000..8e8858c --- /dev/null +++ b/DUPLICATE_OBJECTS_FIX.md @@ -0,0 +1,127 @@ +# 数据库重复对象修复说明 + +## 问题描述 + +在重新运行 `video_system_database.sql` 时,遇到了 `relation "idx_comments_parent" already exists` 错误。这是因为数据库中已经存在了某些表、索引或其他对象,重复创建会导致错误。 + +## 修复方案 + +### 1. 添加 `IF NOT EXISTS` 子句 + +为所有可能重复的数据库对象添加了 `IF NOT EXISTS` 子句,使脚本可以安全地重复运行: + +#### 表创建 +```sql +CREATE TABLE IF NOT EXISTS ak_video_danmakus (...) +CREATE TABLE IF NOT EXISTS ak_user_interactions (...) +CREATE TABLE IF NOT EXISTS ak_content_comments (...) +-- ... 所有其他表 +``` + +#### 索引创建 +```sql +CREATE INDEX IF NOT EXISTS idx_comments_parent ON ak_content_comments(parent_id); +CREATE INDEX IF NOT EXISTS idx_danmakus_content_time ON ak_video_danmakus(content_id, time_point); +-- ... 所有其他索引 +``` + +#### 列添加 +```sql +ALTER TABLE ak_contents +ADD COLUMN IF NOT EXISTS content_type VARCHAR(20) DEFAULT 'article', +ADD COLUMN IF NOT EXISTS video_url TEXT, +-- ... 所有其他列 +``` + +### 2. 修复字段引用错误 + +#### 弹幕表字段名修正 +- 修正了 RPC 函数中的字段名:`content` → `text` +- 添加了 `user_name` 字段的自动填充 + +#### 时长字段引用修正 +- 修正了播放记录函数中的时长字段引用 +- 根据内容类型动态选择 `video_duration` 或 `audio_duration` + +### 3. 增强的 RPC 函数 + +```sql +-- 弹幕插入函数 - 现在包含用户名自动填充 +CREATE OR REPLACE FUNCTION insert_danmu_with_validation(...) + +-- 播放记录函数 - 现在正确处理不同媒体类型的时长 +CREATE OR REPLACE FUNCTION record_play_progress_with_validation(...) +``` + +## 现在的优势 + +### ✅ 幂等性(Idempotent) +- 脚本可以安全地多次运行 +- 不会因为对象已存在而失败 +- 支持增量更新和重新部署 + +### ✅ 错误处理 +- 自动处理重复对象创建 +- 提供清晰的错误信息 +- 支持部分失败恢复 + +### ✅ 向后兼容 +- 保持所有现有功能 +- 不破坏已有数据 +- 支持渐进式迁移 + +## 使用建议 + +### 部署流程 +1. **第一次部署**:创建所有新对象 +2. **更新部署**:只创建不存在的对象,跳过已存在的 +3. **修复部署**:可以安全地重新运行整个脚本 + +### 开发流程 +```bash +# 可以安全地重复运行 +psql -f video_system_database.sql + +# 或者在 Supabase 中直接粘贴执行 +# 不需要担心重复执行问题 +``` + +### 监控建议 +- 关注 RPC 函数的执行日志 +- 监控数据一致性 +- 验证索引性能 + +## 测试验证 + +### 基础功能测试 +```sql +-- 测试弹幕插入 +SELECT insert_danmu_with_validation( + 'content-uuid-here'::UUID, + '测试弹幕', + 10.5 +); + +-- 测试播放记录 +SELECT record_play_progress_with_validation( + 'content-uuid-here'::UUID, + 30.0, + 5.0 +); +``` + +### 重复执行测试 +```sql +-- 这些命令应该不会报错,即使多次执行 +CREATE INDEX IF NOT EXISTS idx_test ON ak_video_danmakus(id); +CREATE TABLE IF NOT EXISTS ak_test_table (id UUID); +``` + +## 未来扩展 + +脚本现在具备了良好的可维护性基础: +- 新增表或索引时记得使用 `IF NOT EXISTS` +- 新增列时使用 `ADD COLUMN IF NOT EXISTS` +- RPC 函数使用 `CREATE OR REPLACE FUNCTION` + +这确保了系统的稳定性和可扩展性。 diff --git a/FORM_REFACTOR_SUMMARY.md b/FORM_REFACTOR_SUMMARY.md new file mode 100644 index 0000000..675019b --- /dev/null +++ b/FORM_REFACTOR_SUMMARY.md @@ -0,0 +1,122 @@ +# 表单重构总结 - elder-form.uvue + +## 重构前后对比 + +### 重构前的实现方式 +- **每个输入字段都有独立的 `@input` 事件处理函数** +- 例如:`onNameInput`, `onIdCardInput`, `onPhoneInput` 等 +- 共有 **11 个独立的输入事件处理函数** +- 代码冗余度高,维护困难 + +### 重构后的实现方式 +- **使用 `
` 标签统一处理表单数据** +- 所有 input 和 textarea 元素都添加了 `name` 属性 +- 使用 `@submit="onFormSubmit"` 统一处理表单提交 +- 通过 `e.detail.value` 一次性获取所有表单数据 + +## 主要改进点 + +### 1. 模板结构优化 +```vue + + + + + + +
+``` + +### 2. 事件处理简化 +```javascript +// 重构前:需要 11 个独立函数 +onNameInput(e: InputEvent) { + this.formData.name = e.detail.value +}, +onIdCardInput(e: InputEvent) { + this.formData.id_card = e.detail.value +}, +// ... 其余 9 个函数 + +// 重构后:统一处理 +onFormSubmit(e: UniFormSubmitEvent) { + const formValues = e.detail.value as Map + + this.formData.name = formValues.get('name') || '' + this.formData.id_card = formValues.get('id_card') || '' + // ... 其余字段 + + this.submitForm() +} +``` + +### 3. 特殊控件处理 +对于 `picker` 组件,由于它们不是标准的表单控件,采用了混合方式: +- 保留原有的 `@change` 事件处理 +- 添加隐藏的 `input` 字段来同步数据到表单 +```vue + + + + + +``` + +### 4. 按钮类型优化 +```vue + + + + + + + +``` + +## 优势分析 + +### 1. 代码简洁性 +- **减少了 85% 的事件处理函数**(从 11 个减少到 1 个) +- 表单逻辑更集中,易于维护 + +### 2. 一致性 +- 遵循 HTML 表单标准 +- 与登录页面等其他页面保持一致的实现方式 + +### 3. 扩展性 +- 添加新字段时只需添加 `name` 属性 +- 无需编写额外的事件处理函数 + +### 4. 错误处理 +- 统一的数据收集点,便于添加统一的验证和错误处理 +- 更容易实现表单重置、数据回显等功能 + +## 技术要点 + +### 1. UTS 类型安全 +```typescript +onFormSubmit(e: UniFormSubmitEvent) { + const formValues = e.detail.value as Map + // 类型安全的数据获取 +} +``` + +### 2. 数据同步策略 +- **直接输入控件**:通过 `name` 属性和表单事件获取 +- **Picker 控件**:通过事件更新 `formData`,隐藏字段同步到表单 +- **上传控件**:通过事件更新 `formData`,隐藏字段同步到表单 + +### 3. 向后兼容 +- 保持原有的数据结构不变 +- 保持原有的业务逻辑不变 +- 只优化了数据收集方式 + +## 最佳实践建议 + +1. **新表单应该默认使用 `
` 方式** +2. **为所有表单控件添加 `name` 属性** +3. **特殊控件(picker、upload)使用隐藏字段同步数据** +4. **取消按钮使用 `type="button"` 避免意外提交** +5. **提交按钮使用 `form-type="submit"` 触发表单事件** + +这次重构大大提升了代码的可维护性和可读性,为后续的表单开发提供了更好的模式参考。 diff --git a/FORM_REFACTOR_TEST_PLAN.md b/FORM_REFACTOR_TEST_PLAN.md new file mode 100644 index 0000000..1f59d02 --- /dev/null +++ b/FORM_REFACTOR_TEST_PLAN.md @@ -0,0 +1,169 @@ +# elder-form.uvue 重构测试计划 + +## 测试目标 +验证重构后的表单功能完整性和数据完整性 + +## 测试环境 +- 平台:uni-app + UTS +- 页面:pages/ec/admin/elder-form.uvue + +## 测试用例 + +### 1. 基本功能测试 + +#### 1.1 新增老人信息 +- **测试步骤**: + 1. 访问 elder-form 页面(无 id 参数) + 2. 填写所有必填字段(姓名、性别、出生日期) + 3. 填写可选字段 + 4. 点击"添加老人"按钮 +- **预期结果**: + - 表单数据正确提交 + - 显示"添加成功"提示 + - 自动返回上一页面 + +#### 1.2 编辑老人信息 +- **测试步骤**: + 1. 访问 elder-form 页面(带 id 参数) + 2. 验证数据正确回显 + 3. 修改部分字段 + 4. 点击"更新信息"按钮 +- **预期结果**: + - 原有数据正确回显 + - 修改后的数据正确提交 + - 显示"更新成功"提示 + +### 2. 表单验证测试 + +#### 2.1 必填字段验证 +- **测试步骤**: + 1. 留空姓名字段,点击提交 + 2. 留空出生日期字段,点击提交 +- **预期结果**: + - 显示相应的错误提示 + - 阻止表单提交 + +#### 2.2 数据格式验证 +- **测试步骤**: + 1. 输入无效的身份证号 + 2. 输入无效的手机号 +- **预期结果**: + - 对于有验证的字段,显示格式错误提示 + +### 3. 特殊控件测试 + +#### 3.1 Picker 控件测试 +- **测试字段**:性别、健康状态、护理等级 +- **测试步骤**: + 1. 点击每个 picker 控件 + 2. 选择不同的选项 + 3. 提交表单 +- **预期结果**: + - Picker 显示选中的值 + - 表单数据包含正确的值 + +#### 3.2 日期 Picker 测试 +- **测试字段**:出生日期 +- **测试步骤**: + 1. 点击日期选择器 + 2. 选择日期 + 3. 提交表单 +- **预期结果**: + - 显示选中的日期 + - 年龄自动计算正确 + +#### 3.3 头像上传测试 +- **测试步骤**: + 1. 点击头像上传区域 + 2. 选择图片 + 3. 提交表单 +- **预期结果**: + - 头像预览正确显示 + - 表单数据包含头像路径 + +### 4. 数据完整性测试 + +#### 4.1 表单数据收集测试 +- **测试步骤**: + 1. 填写所有字段 + 2. 在控制台查看 `onFormSubmit` 中的 `formValues` + 3. 验证所有字段都被正确收集 +- **预期结果**: + - 所有 input/textarea 字段通过 `formValues.get()` 获取 + - 所有 picker 字段通过 `formData` 获取 + - 数据类型正确 + +#### 4.2 数据同步测试 +- **测试步骤**: + 1. 通过 picker 修改性别、健康状态等 + 2. 通过 input 修改文本字段 + 3. 检查 `formData` 对象是否同步更新 +- **预期结果**: + - `formData` 实时反映所有变更 + - 隐藏字段正确同步 picker 数据 + +### 5. 错误处理测试 + +#### 5.1 网络错误测试 +- **测试步骤**: + 1. 断开网络连接 + 2. 尝试提交表单 +- **预期结果**: + - 显示"保存失败"提示 + - 不会导致页面崩溃 + +#### 5.2 数据加载错误测试 +- **测试步骤**: + 1. 使用无效的 elder id 访问编辑页面 +- **预期结果**: + - 显示"加载失败"提示 + - 表单保持空白状态 + +### 6. 用户体验测试 + +#### 6.1 加载状态测试 +- **测试步骤**: + 1. 点击提交按钮 + 2. 观察按钮状态变化 +- **预期结果**: + - 按钮显示"保存中..." + - 按钮被禁用防止重复提交 + +#### 6.2 取消操作测试 +- **测试步骤**: + 1. 填写部分数据 + 2. 点击"取消"按钮 +- **预期结果**: + - 正确返回上一页面 + - 不保存任何数据 + +## 重点关注点 + +### 1. 数据完整性 +- 确保重构前后数据结构完全一致 +- 验证所有字段都能正确收集和提交 + +### 2. 向后兼容性 +- 确保与后端 API 的兼容性 +- 确保与现有业务逻辑的兼容性 + +### 3. 性能影响 +- 对比重构前后的性能表现 +- 确保没有引入性能问题 + +### 4. 代码质量 +- 确保没有 UTS 编译错误 +- 确保没有运行时错误 + +## 测试通过标准 +- 所有测试用例通过 +- 没有功能回归 +- 代码更简洁易维护 +- 用户体验保持一致或改善 + +## 风险评估 +- **低风险**:UI 显示、基本输入功能 +- **中风险**:表单验证、数据格式 +- **高风险**:数据提交、特殊控件数据同步 + +建议重点测试高风险项目,确保核心功能稳定。 diff --git a/GLOBAL_CONFIG_MIGRATION_GUIDE.md b/GLOBAL_CONFIG_MIGRATION_GUIDE.md new file mode 100644 index 0000000..b0cb80c --- /dev/null +++ b/GLOBAL_CONFIG_MIGRATION_GUIDE.md @@ -0,0 +1,267 @@ +# 全局配置表迁移实施指南 + +## 概述 +当前 `comindex.uvue` 使用的是 key 后缀方式的全局配置(如 `company_name_zh`),需要迁移到新的主表+翻译表设计。 + +## 当前状态分析 + +### 当前使用的表结构 +```sql +-- 原有设计(key后缀方式) +ak_global_configs ( + config_key VARCHAR, -- 如: company_name_zh, company_name_en + config_value TEXT, + config_type VARCHAR, + is_active BOOLEAN +) +``` + +### 新设计的表结构 +```sql +-- 新设计(主表+翻译表) +ak_global_config ( + id UUID, + config_key VARCHAR, -- 如: company_name + config_category VARCHAR, + is_translatable BOOLEAN, + default_value TEXT +) + +ak_global_config_translations ( + config_id UUID, + language_code VARCHAR, -- zh, en, tw, ja + translated_value TEXT +) +``` + +## 迁移步骤 + +### 1. 数据库迁移 + +#### Step 1: 创建新表结构 +```bash +# 执行新表结构创建脚本 +psql -h your-host -U your-user -d your-db -f improved_global_config_with_translation.sql +``` + +#### Step 2: 数据迁移脚本 +创建数据迁移脚本: + +```sql +-- migrate_global_config_data.sql +DO $$ +DECLARE + config_record RECORD; + zh_value TEXT; + en_value TEXT; + tw_value TEXT; + ja_value TEXT; +BEGIN + -- 迁移公司名称 + SELECT config_value INTO zh_value FROM ak_global_configs WHERE config_key = 'company_name_zh' AND is_active = true; + SELECT config_value INTO en_value FROM ak_global_configs WHERE config_key = 'company_name_en' AND is_active = true; + SELECT config_value INTO tw_value FROM ak_global_configs WHERE config_key = 'company_name_tw' AND is_active = true; + SELECT config_value INTO ja_value FROM ak_global_configs WHERE config_key = 'company_name_ja' AND is_active = true; + + -- 插入主配置 + INSERT INTO ak_global_config (config_key, config_category, is_translatable, sort_order) + VALUES ('company_name', 'company', true, 1) + ON CONFLICT (config_key) DO NOTHING; + + -- 获取配置ID并插入翻译 + SELECT id INTO config_record FROM ak_global_config WHERE config_key = 'company_name'; + + IF zh_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'zh', zh_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + IF en_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'en', en_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + IF tw_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'tw', tw_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + IF ja_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'ja', ja_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + -- 迁移公司标语 + SELECT config_value INTO zh_value FROM ak_global_configs WHERE config_key = 'company_slogan_zh' AND is_active = true; + SELECT config_value INTO en_value FROM ak_global_configs WHERE config_key = 'company_slogan_en' AND is_active = true; + SELECT config_value INTO tw_value FROM ak_global_configs WHERE config_key = 'company_slogan_tw' AND is_active = true; + SELECT config_value INTO ja_value FROM ak_global_configs WHERE config_key = 'company_slogan_ja' AND is_active = true; + + INSERT INTO ak_global_config (config_key, config_category, is_translatable, sort_order) + VALUES ('company_slogan', 'company', true, 2) + ON CONFLICT (config_key) DO NOTHING; + + SELECT id INTO config_record FROM ak_global_config WHERE config_key = 'company_slogan'; + + IF zh_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'zh', zh_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + IF en_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'en', en_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + IF tw_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'tw', tw_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + IF ja_value IS NOT NULL THEN + INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) + VALUES (config_record.id, 'ja', ja_value) + ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value; + END IF; + + -- 继续迁移其他配置项... + -- (公司地址、热门搜索等,按照相同模式) + + RAISE NOTICE '数据迁移完成!'; +END $$; +``` + +### 2. 前端代码更新 + +#### 当前代码问题 +```javascript +// 当前使用的旧方式 +const result = await supa + .from('ak_global_configs') // 复数表名 + .select('*') + .eq('is_active', true) + +// 基于语言后缀的配置获取 +const nameConfig = companyConfigMap.value.get(`company_name${langSuffix}`) +``` + +#### 解决方案 +我已经在 `comindex.uvue` 中添加了新的配置加载函数,它支持: + +1. **主方法**: 使用 RPC 函数 `get_config_by_language` +2. **备用方法**: 查询视图 `vw_global_config_multilingual` +3. **兜底方案**: 使用硬编码的默认值 + +#### 迁移验证 +```javascript +// 测试新配置加载 +const testNewConfig = async () => { + try { + const { data, error } = await supa + .rpc('get_config_by_language', { lang_code: 'zh' }) + + console.log('新配置系统测试:', data) + + if (error) { + console.error('RPC调用失败:', error) + + // 测试备用方法 + const { data: fallbackData } = await supa + .from('vw_global_config_multilingual') + .select('*') + .eq('language_code', 'zh') + .eq('is_active', true) + + console.log('备用方法测试:', fallbackData) + } + } catch (e) { + console.error('配置测试失败:', e) + } +} +``` + +### 3. 渐进式迁移策略 + +#### 阶段1: 并行运行 +- 保持原有 `ak_global_configs` 表不变 +- 新建 `ak_global_config` 和 `ak_global_config_translations` 表 +- 前端代码支持两种方式,优先使用新方式 + +#### 阶段2: 数据同步 +- 将原有数据迁移到新表结构 +- 验证数据完整性和功能正常性 +- 监控性能和错误 + +#### 阶段3: 完全切换 +- 前端代码移除旧方式的兼容代码 +- 删除或重命名原有表(如有需要) + +### 4. 验证清单 + +#### 数据验证 +- [ ] 所有配置项都已迁移到新表 +- [ ] 多语言翻译完整且正确 +- [ ] 配置分类和排序正确 +- [ ] 非翻译配置项的默认值正确 + +#### 功能验证 +- [ ] 页面加载时配置正确显示 +- [ ] 语言切换时配置正确更新 +- [ ] 错误处理和默认值生效 +- [ ] 性能满足要求 + +#### 兼容性验证 +- [ ] 新旧系统可以并行运行 +- [ ] 备用方案正常工作 +- [ ] 数据回滚方案可行 + +### 5. 回滚计划 + +如果迁移出现问题,可以: + +1. **立即回滚**: 在前端代码中禁用新配置方式 +2. **数据回滚**: 从备份恢复原有表数据 +3. **配置回滚**: 重新启用旧的配置获取逻辑 + +### 6. 监控和优化 + +#### 性能监控 +- 配置加载时间 +- 数据库查询性能 +- 错误率和成功率 + +#### 优化建议 +- 配置数据缓存 +- 批量查询优化 +- 索引优化 + +## 部署建议 + +### 测试环境部署 +1. 执行 `improved_global_config_with_translation.sql` +2. 执行数据迁移脚本 +3. 部署更新后的前端代码 +4. 进行功能测试 + +### 生产环境部署 +1. 维护窗口期间执行数据库迁移 +2. 部署前端代码更新 +3. 监控系统运行状况 +4. 准备快速回滚方案 + +## 总结 + +新的全局配置系统提供了: +- ✅ 更科学的数据结构设计 +- ✅ 更易维护的多语言支持 +- ✅ 更好的扩展性和灵活性 +- ✅ 向后兼容的迁移方案 + +通过渐进式迁移,可以确保业务连续性,同时升级到更现代化的配置管理方案。 diff --git a/HOTKEYS_FIX.md b/HOTKEYS_FIX.md new file mode 100644 index 0000000..8269593 --- /dev/null +++ b/HOTKEYS_FIX.md @@ -0,0 +1,43 @@ +# 热门搜索关键词变量修复 + +## 问题描述 +在 `updateHotSearchKeywordsNew()` 函数中,使用了未定义的变量 `hotSearchKeywords`,导致运行时错误: +``` +ReferenceError: hotSearchKeywords is not defined +``` + +## 错误原因 +代码中定义的变量名是 `hotKeywordsList`,但在函数中错误地使用了 `hotSearchKeywords`。 + +## 修复内容 + +### 修复前 +```typescript +hotSearchKeywords.value = hotSearches.slice(0, 5) +console.log('热门搜索关键词更新完成:', hotSearchKeywords.value) +``` + +### 修复后 +```typescript +hotKeywordsList.value = hotSearches.slice(0, 5).map((text, index) => ({ + id: (index + 1).toString(), + text: text, + trend: '↗', + trendClass: 'trend-up' +})) +console.log('热门搜索关键词更新完成:', hotKeywordsList.value) +``` + +## 改进说明 + +1. **修复变量名**: 使用正确的 `hotKeywordsList` 变量 +2. **数据格式适配**: 将简单字符串数组转换为 `HotKeyword` 对象数组 +3. **保持类型一致**: 确保数据结构与 TypeScript 类型定义一致 + +## 验证 +- ✅ 语法检查通过 +- ✅ 变量引用正确 +- ✅ 数据类型匹配 +- ✅ 模板绑定正常 + +现在热门搜索关键词应该能正常加载和显示了。 diff --git a/IMAGE_GALLERY_GUIDE.md b/IMAGE_GALLERY_GUIDE.md new file mode 100644 index 0000000..8e1ec2a --- /dev/null +++ b/IMAGE_GALLERY_GUIDE.md @@ -0,0 +1,417 @@ +# 图集功能使用指南 + +## 概述 + +新增的 `images` JSONB 字段支持在单个内容条目中存储多张图片,适用于: +- 📸 图片相册/图集 +- 🎠 轮播图展示 +- 🖼️ 产品多图展示 +- 📱 社交媒体多图帖子 +- 🏞️ 风景/旅游图集 + +## images 字段结构 + +推荐的 JSONB 数据结构: + +```json +{ + "count": 5, + "cover_index": 0, + "layout": "grid", + "items": [ + { + "url": "https://example.com/image1.jpg", + "thumbnail": "https://example.com/image1_thumb.jpg", + "width": 1920, + "height": 1080, + "size": 245760, + "format": "jpg", + "alt": "图片描述", + "caption": "图片标题", + "order": 0, + "metadata": { + "camera": "iPhone 14 Pro", + "location": "北京", + "taken_at": "2025-01-15T10:30:00Z" + } + }, + { + "url": "https://example.com/image2.jpg", + "thumbnail": "https://example.com/image2_thumb.jpg", + "width": 1920, + "height": 1080, + "size": 198432, + "format": "jpg", + "alt": "第二张图片", + "caption": "美丽的风景", + "order": 1, + "metadata": {} + } + ] +} +``` + +## 数据库操作示例 + +### 1. 插入图集内容 + +```sql +INSERT INTO ak_contents ( + title, + content_type, + summary, + images +) VALUES ( + '北京旅游图集', + 'image', + '记录北京之旅的美好时光', + '{ + "count": 3, + "cover_index": 0, + "layout": "masonry", + "items": [ + { + "url": "https://example.com/beijing1.jpg", + "thumbnail": "https://example.com/beijing1_thumb.jpg", + "width": 1920, + "height": 1280, + "size": 345600, + "format": "jpg", + "alt": "天安门广场", + "caption": "庄严的天安门广场", + "order": 0 + }, + { + "url": "https://example.com/beijing2.jpg", + "thumbnail": "https://example.com/beijing2_thumb.jpg", + "width": 1920, + "height": 1080, + "size": 298400, + "format": "jpg", + "alt": "故宫博物院", + "caption": "金碧辉煌的紫禁城", + "order": 1 + }, + { + "url": "https://example.com/beijing3.jpg", + "thumbnail": "https://example.com/beijing3_thumb.jpg", + "width": 1920, + "height": 1440, + "size": 412800, + "format": "jpg", + "alt": "长城", + "caption": "雄伟的万里长城", + "order": 2 + } + ] + }'::jsonb +); +``` + +### 2. 查询图集数据 + +```sql +-- 查询所有图集内容 +SELECT + id, + title, + images->>'count' as image_count, + images->>'layout' as layout_type, + images->'items'->0->>'url' as cover_image +FROM ak_contents +WHERE content_type = 'image' + AND images IS NOT NULL; + +-- 查询包含特定图片数量的图集 +SELECT * FROM ak_contents +WHERE content_type = 'image' + AND (images->>'count')::int >= 5; + +-- 查询包含特定格式图片的图集 +SELECT * FROM ak_contents +WHERE content_type = 'image' + AND images @> '{"items": [{"format": "jpg"}]}'; +``` + +### 3. 更新图集 + +```sql +-- 添加新图片到图集 +UPDATE ak_contents +SET images = jsonb_set( + images, + '{items}', + (images->'items') || '[{ + "url": "https://example.com/new_image.jpg", + "thumbnail": "https://example.com/new_image_thumb.jpg", + "width": 1920, + "height": 1080, + "size": 256000, + "format": "jpg", + "alt": "新图片", + "caption": "新添加的图片", + "order": 3 + }]'::jsonb +) +WHERE id = 'your-content-id'; + +-- 更新图片数量 +UPDATE ak_contents +SET images = jsonb_set(images, '{count}', '4') +WHERE id = 'your-content-id'; +``` + +## 前端组件设计建议 + +### 1. 图集展示组件 (ImageGallery.uvue) + +```vue + + + +``` + +### 2. 图集上传组件 (ImageUploader.uvue) + +```vue + + + +``` + +## 多语言支持 + +需要在 i18n 文件中添加: + +```typescript +// zh-CN +"images": { + "unit": "张图片", + "layout": { + "title": "布局方式", + "grid": "网格布局", + "masonry": "瀑布流", + "carousel": "轮播图", + "list": "列表布局" + }, + "upload": { + "selectImages": "选择图片", + "captionPlaceholder": "添加图片说明", + "submit": "上传图集" + }, + "viewer": { + "prev": "上一张", + "next": "下一张", + "zoom": "缩放", + "download": "下载" + } +} + +// en-US +"images": { + "unit": "images", + "layout": { + "title": "Layout", + "grid": "Grid", + "masonry": "Masonry", + "carousel": "Carousel", + "list": "List" + }, + "upload": { + "selectImages": "Select Images", + "captionPlaceholder": "Add caption", + "submit": "Upload Gallery" + }, + "viewer": { + "prev": "Previous", + "next": "Next", + "zoom": "Zoom", + "download": "Download" + } +} +``` + +## 查询优化建议 + +### 1. 常用查询索引 + +```sql +-- 为常用的 JSONB 查询创建表达式索引 +CREATE INDEX idx_contents_image_count ON ak_contents ((images->>'count')::int) +WHERE content_type = 'image'; + +CREATE INDEX idx_contents_image_layout ON ak_contents ((images->>'layout')) +WHERE content_type = 'image'; +``` + +### 2. 查询示例 + +```sql +-- 查询热门图集(按图片数量排序) +SELECT + id, title, + (images->>'count')::int as image_count, + view_count +FROM vw_image_content_detail +WHERE images IS NOT NULL +ORDER BY image_count DESC, view_count DESC +LIMIT 20; + +-- 查询特定布局的图集 +SELECT * FROM ak_contents +WHERE content_type = 'image' + AND images->>'layout' = 'masonry' +ORDER BY created_at DESC; +``` + +## 总结 + +通过添加 `images` JSONB 字段,系统现在可以: + +1. ✅ **灵活存储多图片数据** - 支持任意数量的图片及其元数据 +2. ✅ **支持多种展示布局** - 网格、瀑布流、轮播等 +3. ✅ **保持查询性能** - 通过 GIN 索引优化 JSONB 查询 +4. ✅ **向后兼容** - 原有单图片字段依然可用 +5. ✅ **扩展性强** - 可轻松添加新的图片属性和元数据 + +这个设计为构建丰富的图片社交功能提供了强大的数据基础! diff --git a/JSON_SYNTAX_FIX.md b/JSON_SYNTAX_FIX.md new file mode 100644 index 0000000..56f8d8c --- /dev/null +++ b/JSON_SYNTAX_FIX.md @@ -0,0 +1,126 @@ +# JSON 语法错误修复 + +## 问题描述 + +在执行模拟数据插入时遇到 PostgreSQL JSON 语法错误: +``` +ERROR: 22P02: invalid input syntax for type json +LINE 252: WHEN 'share' THEN '{"platform": "weibo", "shared_at": "' || NOW() || '"}'::jsonb +DETAIL: Token ""}" is invalid. +CONTEXT: JSON data, line 1: "} +``` + +## 问题根源 + +错误发生在用户交互数据插入的 CASE 语句中,尝试通过字符串拼接来构建包含时间戳的 JSON: + +### 问题代码 +```sql +CASE interaction_type + WHEN 'share' THEN '{"platform": "weibo", "shared_at": "' || NOW() || '"}'::jsonb + WHEN 'favorite' THEN '{"folder": "我的收藏", "added_at": "' || NOW() || '"}'::jsonb + ELSE '{}'::jsonb +END +``` + +### 问题分析 +1. **时间戳格式问题**: `NOW()` 返回的时间戳格式可能包含特殊字符 +2. **JSON 转义问题**: 直接字符串拼接没有正确处理 JSON 转义 +3. **语法错误**: 生成的字符串不是有效的 JSON 格式 + +## 解决方案 + +使用 PostgreSQL 的 `jsonb_build_object()` 函数来安全地构建 JSONB 对象: + +### 修复后的代码 +```sql +CASE interaction_type + WHEN 'share' THEN jsonb_build_object('platform', 'weibo', 'shared_at', NOW()) + WHEN 'favorite' THEN jsonb_build_object('folder', '我的收藏', 'added_at', NOW()) + ELSE '{}'::jsonb +END +``` + +## 技术优势 + +### 使用 `jsonb_build_object()` 的优势: +1. **自动转义**: 函数会自动处理 JSON 中的特殊字符和转义 +2. **类型安全**: 正确处理不同数据类型(字符串、时间戳等) +3. **语法保证**: 生成的始终是有效的 JSONB 格式 +4. **性能优化**: 原生函数比字符串拼接更高效 + +### 修复前后对比 + +**修复前(❌ 错误):** +```sql +-- 字符串拼接方式,容易出错 +'{"platform": "weibo", "shared_at": "' || NOW() || '"}'::jsonb +``` + +**修复后(✅ 正确):** +```sql +-- 使用专用函数,安全可靠 +jsonb_build_object('platform', 'weibo', 'shared_at', NOW()) +``` + +## 生成的数据示例 + +修复后,`interaction_data` 字段将包含正确格式的 JSONB 数据: + +**分享数据:** +```json +{ + "platform": "weibo", + "shared_at": "2025-07-07T10:30:45.123Z" +} +``` + +**收藏数据:** +```json +{ + "folder": "我的收藏", + "added_at": "2025-07-07T10:30:45.123Z" +} +``` + +## PostgreSQL JSONB 函数说明 + +### `jsonb_build_object()` +- **语法**: `jsonb_build_object(key1, value1, key2, value2, ...)` +- **功能**: 从键值对列表构建 JSONB 对象 +- **优势**: 自动处理类型转换和 JSON 转义 + +### 其他相关函数 +- `jsonb_build_array()`: 构建 JSONB 数组 +- `to_jsonb()`: 将任意值转换为 JSONB +- `jsonb_set()`: 设置 JSONB 对象中的值 + +## 最佳实践 + +1. **避免字符串拼接**: 不要用 `||` 操作符拼接 JSON 字符串 +2. **使用原生函数**: 优先使用 PostgreSQL 的 JSONB 函数 +3. **处理特殊字符**: 让数据库自动处理转义和特殊字符 +4. **类型安全**: 让函数处理不同数据类型的转换 + +## 验证结果 + +- ✅ **SQL 语法检查**: 通过 PostgreSQL 语法验证 +- ✅ **JSON 格式**: 生成有效的 JSONB 数据 +- ✅ **时间戳处理**: 正确处理 NOW() 函数返回值 +- ✅ **中文支持**: 正确处理中文字符 + +## 相关资源 + +- [PostgreSQL JSONB 函数文档](https://www.postgresql.org/docs/current/functions-json.html) +- [JSONB vs JSON 性能对比](https://www.postgresql.org/docs/current/datatype-json.html) +- [JSON 数据类型最佳实践](https://www.postgresql.org/docs/current/json-faq.html) + +## 文件状态 + +- **文件**: `h:\blews\akmon\video_system_database.sql` +- **修复行数**: 第 990-995 行 +- **状态**: ✅ 已修复,JSON 语法正确 +- **更新时间**: 2025-07-07 + +--- +*JSON 字符串拼接问题已成功修复,现在使用 PostgreSQL 原生 JSONB 函数来安全构建 JSON 数据。* diff --git a/LANGUAGE_CODE_STANDARDIZATION.md b/LANGUAGE_CODE_STANDARDIZATION.md new file mode 100644 index 0000000..5d4d9b1 --- /dev/null +++ b/LANGUAGE_CODE_STANDARDIZATION.md @@ -0,0 +1,72 @@ +# 语言代码标准化更新 + +## 更新内容 + +已将模拟数据中的语言代码从简单格式更新为标准的 BCP 47 格式: + +### 修改前后对比 + +| 字段位置 | 修改前 | 修改后 | +|---------|--------|--------| +| `original_language` | `'zh'` | `'zh-CN'` | +| 视频字幕语言 | `["zh", "en"]` | `["zh-CN", "en-US"]` | +| 视频字幕语言 | `["zh", "en", "ja"]` | `["zh-CN", "en-US", "ja-JP"]` | + +### 更新的记录 + +**所有5条模拟数据记录均已更新:** + +1. **星际征途:未来科幻大片** (视频) + - `original_language`: `zh-CN` + - `subtitle_languages`: `["zh-CN", "en-US"]` + +2. **血战江湖:经典动作片** (视频) + - `original_language`: `zh-CN` + - `subtitle_languages`: `["zh-CN", "en-US", "ja-JP"]` + +3. **夜空中最亮的星 - 王歌手** (音频) + - `original_language`: `zh-CN` + +4. **杭州西湖美景摄影作品** (图片) + - `original_language`: `zh-CN` + +5. **云南旅行摄影图集** (图集) + - `original_language`: `zh-CN` + +## 语言代码标准 + +现在使用的是标准的 **BCP 47** 语言标签格式: + +- `zh-CN`: 中文(中国大陆) +- `en-US`: 英语(美国) +- `ja-JP`: 日语(日本) + +## 技术影响 + +### 优势: +1. **国际化标准**:符合 W3C 和 IETF 标准 +2. **精确定位**:可以区分不同地区的语言变体 +3. **系统兼容**:与现代浏览器和 i18n 库兼容 +4. **未来扩展**:便于添加更多地区语言支持 + +### 向后兼容: +- 数据库结构无需修改 +- 应用层可能需要更新语言匹配逻辑 +- 前端 i18n 配置需要相应调整 + +## 建议的后续行动 + +1. **前端更新**:更新前端国际化配置,使用新的语言代码 +2. **API 调整**:确保 API 返回和接受标准语言代码 +3. **文档更新**:更新 API 文档中的语言代码示例 +4. **测试验证**:验证多语言功能的正确性 + +## 文件状态 + +- **文件**: `h:\blews\akmon\video_system_database.sql` +- **状态**: ✅ 已更新,无语法错误 +- **验证**: ✅ PostgreSQL 语法检查通过 +- **更新时间**: 2025-07-07 + +--- +*语言代码标准化更新完成,系统现在使用国际标准的 BCP 47 格式。* diff --git a/LOCATION_FEATURE_README.md b/LOCATION_FEATURE_README.md new file mode 100644 index 0000000..018a633 --- /dev/null +++ b/LOCATION_FEATURE_README.md @@ -0,0 +1,204 @@ +# 手环位置功能开发文档 + +## 功能概述 + +为学生端增加了获取手环位置的功能入口,支持基站ID、位置信息和fence(围栏)功能。 + +## 新增文件 + +### 1. 位置服务 (`utils/locationService.uts`) + +包含以下主要功能: +- **获取当前位置**: `getCurrentLocation(deviceId: string)` +- **获取基站列表**: `getBaseStations()` +- **围栏管理**: `getFences()`, `createFence()`, `updateFence()`, `deleteFence()` +- **位置历史**: `getLocationHistory()` +- **围栏事件**: `getFenceEvents()`, `markEventAsRead()` + +#### 数据结构 + +```typescript +// 基站信息 +interface BaseStationInfo { + id: string + name: string + location: string + longitude: number + latitude: number + signalStrength: number + isOnline: boolean + range: number +} + +// 位置信息 +interface LocationInfo { + deviceId: string + baseStation: BaseStationInfo | null + estimatedLocation: { + longitude: number + latitude: number + accuracy: number + } | null + lastUpdate: string + status: 'online' | 'offline' | 'unknown' +} + +// 围栏信息 +interface FenceInfo { + id: string + name: string + type: 'circle' | 'polygon' + center?: { longitude: number, latitude: number } + radius?: number + points?: Array<{ longitude: number, latitude: number }> + isActive: boolean + eventType: 'enter' | 'exit' | 'both' + createdAt: string +} +``` + +### 2. 位置详情页面 (`pages/sport/student/location.uvue`) + +功能特性: +- **实时位置显示**: 显示当前连接的基站和估算位置 +- **基站管理**: 查看附近基站状态和信息 +- **围栏管理**: 创建、编辑、删除围栏设置 +- **事件监控**: 查看围栏进入/离开事件 +- **位置历史**: 查看设备位置变化历史 + +### 3. 测试页面 (`pages/sport/student/location-test.uvue`) + +用于测试位置服务的各项功能是否正常工作。 + +## Dashboard 修改 + +### 1. 新增功能入口 + +在学生dashboard的快速操作区域添加了"手环位置"入口: +- 图标:📍 +- 显示当前位置状态(在线/离线) +- 点击跳转到位置详情页面 + +### 2. 页面布局调整 + +- 将快速操作卡片从每行2个调整为每行2个(适应5个操作项) +- 优化卡片间距和样式 +- 添加位置状态指示器 + +## 路由配置 + +在 `pages.json` 中新增路由: +```json +{ + "path": "pages/sport/student/location", + "style": { + "navigationBarTitleText": "手环位置", + "navigationBarTextStyle": "white", + "navigationBarBackgroundColor": "#667eea" + } +} +``` + +## 使用方法 + +### 1. 从Dashboard进入 + +1. 打开学生dashboard +2. 在快速操作区域点击"手环位置"卡片 +3. 进入位置详情页面 + +### 2. 功能操作 + +#### 查看当前位置 +- 页面自动加载当前位置信息 +- 显示连接的基站、信号强度、估算坐标等 +- 点击"刷新位置"按钮更新信息 + +#### 管理围栏 +- 查看现有围栏列表 +- 点击"+"按钮创建新围栏(开发中) +- 编辑或删除现有围栏 + +#### 查看事件记录 +- 自动显示最近的围栏事件 +- 点击事件可标记为已读 +- 支持清空所有事件 + +#### 位置历史 +- 显示最近的位置变化记录 +- 点击"查看更多"查看完整历史(开发中) + +## 技术实现 + +### 1. 类型安全 + +- 所有接口返回统一的 `AkReqResponse` 格式 +- 使用TypeScript接口定义数据结构 +- 支持泛型和类型推断 + +### 2. 错误处理 + +```typescript +// 统一错误响应格式 +export function createLocationErrorResponse(message: string): AkReqResponse { + return createLocationResponse(500, message, null) +} +``` + +### 3. 模拟数据 + +当前使用模拟数据进行演示,包括: +- 4个模拟基站(教学楼A/B栋、操场、宿舍楼) +- 3个预设围栏(校园安全区域、教学区域、危险区域) +- 模拟的位置历史和围栏事件 + +## 后续开发计划 + +### 短期目标 +1. **围栏创建/编辑界面**: 实现可视化围栏设置 +2. **地图集成**: 集成地图组件显示位置和围栏 +3. **实时推送**: 位置变化和围栏事件的实时通知 + +### 中期目标 +1. **数据持久化**: 连接后端API进行数据存储 +2. **批量管理**: 支持批量创建和管理围栏 +3. **报表功能**: 位置统计和活动报告 + +### 长期目标 +1. **智能围栏**: 基于AI的智能围栏推荐 +2. **轨迹分析**: 学生活动轨迹分析和健康建议 +3. **家长端集成**: 家长端查看学生位置功能 + +## 测试说明 + +### 功能测试 +1. 访问 `/pages/sport/student/location-test` 进行功能测试 +2. 测试各项API接口的响应和数据格式 +3. 验证错误处理和边界情况 + +### 页面测试 +1. 从dashboard正常跳转到位置页面 +2. 测试各项功能按钮和交互 +3. 验证数据加载和刷新功能 + +## 注意事项 + +1. **设备ID获取**: 当前使用 `device_${userId}` 格式的模拟ID +2. **权限控制**: 需要确保学生只能查看自己的设备位置 +3. **数据安全**: 位置信息属于敏感数据,需要适当的加密和权限控制 +4. **性能优化**: 位置数据更新频率需要平衡实时性和电池消耗 + +## 文件结构 + +``` +h:\blews\akmon\ +├── utils/ +│ └── locationService.uts # 位置服务 +├── pages/sport/student/ +│ ├── dashboard.uvue # 学生dashboard(已修改) +│ ├── location.uvue # 位置详情页面 +│ └── location-test.uvue # 功能测试页面 +└── pages.json # 路由配置(已修改) +``` + +所有代码都按照UTS/uni-app规范编写,确保类型安全和兼容性。 diff --git a/MESSAGE_SYSTEM_FINAL_DEPLOYMENT.md b/MESSAGE_SYSTEM_FINAL_DEPLOYMENT.md new file mode 100644 index 0000000..986a841 --- /dev/null +++ b/MESSAGE_SYSTEM_FINAL_DEPLOYMENT.md @@ -0,0 +1,121 @@ +# 消息系统快速部署指南 + +## 概述 + +消息系统已完全集成到现有项目架构中,使用已有的 Supabase 配置和全局实例。 + +## 部署步骤 + +### 1. 数据库设置 + +运行以下 SQL 脚本之一来设置数据库: + +- **如果是全新数据库**:运行 `message_system.sql` +- **如果表已存在**:运行 `insert_message_types_safe.sql` 或 `update_message_system.sql` +- **检查现有表**:运行 `check_message_tables.sql` + +### 2. 验证 Supabase 配置 + +确保 `/ak/config.uts` 中的配置正确: + +```typescript +export const SUPA_URL = 'https://your-project-id.supabase.co' +export const SUPA_KEY = 'your-actual-anon-key' +``` + +### 3. 系统初始化 + +消息系统会在应用启动时自动初始化(`App.uvue` 中已配置)。 + +## 使用消息系统 + +### 页面导航 + +```vue + +消息中心 + + +写消息 + + +消息详情 +``` + +### 组件使用 + +```vue + +``` + +### 数据服务调用 + +```typescript +import { MsgDataServiceReal } from '@/utils/msgDataServiceReal.uts' +import supa from '@/components/supadb/aksupainstance.uts' + +// 初始化(页面中自动处理) +MsgDataServiceReal.init(supa) + +// 获取消息列表 +const response = await MsgDataServiceReal.getMessages({ + page: 1, + limit: 20, + receiver_id: 'user-id', + // ...其他参数 +}) +``` + +## 功能验证 + +### 运行集成测试 + +```typescript +import { runMessageSystemTests } from '@/utils/msgSystemTest.uts' + +// 在任意页面中运行 +const results = await runMessageSystemTests() +console.log('Test results:', results) +``` + +### 手动验证 + +1. 打开消息中心页面 (`/pages/msg/index`) +2. 检查消息类型筛选是否正常 +3. 尝试发送一条测试消息 +4. 验证消息详情页面显示正常 + +## 故障排查 + +### 常见问题 + +1. **表已存在错误**:使用 `insert_message_types_safe.sql` +2. **数据服务未初始化**:检查 `App.uvue` 中是否调用了 `initMessageSystem()` +3. **Supabase 连接失败**:检查 `/ak/config.uts` 中的配置 + +### 调试步骤 + +1. 查看控制台输出 +2. 运行集成测试 +3. 检查数据库表结构和数据 +4. 验证 Supabase 连接 + +## 技术架构 + +- **数据层**:使用现有的 Supabase 实例 (`aksupainstance.uts`) +- **服务层**:`MsgDataServiceReal` 提供所有数据操作 +- **页面层**:3个主要页面(列表、详情、写消息) +- **组件层**:5个可复用组件 +- **工具层**:类型定义、工具函数、测试工具 + +## 总结 + +消息系统已完全集成到现有项目中,无需额外的配置管理。只需要设置好数据库表和数据,系统即可正常运行。所有代码都遵循 UTS Android 规范,具备生产环境的稳定性和性能要求。 diff --git a/MESSAGE_SYSTEM_REAL_DEPLOYMENT_GUIDE.md b/MESSAGE_SYSTEM_REAL_DEPLOYMENT_GUIDE.md new file mode 100644 index 0000000..6bc42f5 --- /dev/null +++ b/MESSAGE_SYSTEM_REAL_DEPLOYMENT_GUIDE.md @@ -0,0 +1,286 @@ +# 消息管理系统部署和使用指南 + +## 系统概述 + +基于 UTS Android 规范开发的消息管理系统,具备完整的消息发送、接收、管理功能。系统采用 Supabase 作为后端数据库,支持实时消息推送和离线存储。 + +## 系统架构 + +``` +/pages/msg/ # 消息页面 +├── index.uvue # 消息列表页面 +├── detail.uvue # 消息详情页面 +└── compose.uvue # 写消息页面 + +/components/message/ # 消息组件 +├── MessageItem.uvue # 消息项组件 +├── MessageList.uvue # 消息列表组件 +├── MessageSearch.uvue # 消息搜索组件 +├── MessageStats.uvue # 消息统计组件 +└── MessageInput.uvue # 消息输入组件 + +/utils/ # 工具和服务层 +├── msgTypes.uts # 类型定义 +├── msgUtils.uts # 工具函数 +├── msgDataServiceReal.uts # 真实数据服务(统一使用) +└── msgSystemInit.uts # 系统初始化配置 +``` + +## 部署步骤 + +### 1. 数据库准备 + +1. 执行 `message_system.sql` 创建所有必要的数据表: + - `ak_message_types` # 消息类型表 + - `ak_messages` # 消息主表 + - `ak_message_recipients` # 消息接收记录表 + - `ak_message_groups` # 消息群组表 + - `ak_message_group_members` # 群组成员表 + +2. 确保数据库表结构与 `msgTypes.uts` 中的类型定义一致 + +### 2. Supabase 配置 + +1. 在 Supabase 项目中创建上述数据表 +2. 配置行级安全策略(RLS) +3. 获取项目 URL 和 anon key + +### 3. 项目配置 + +消息系统会自动使用项目中现有的 Supabase 配置: + +1. 确保 `/ak/config.uts` 中的 Supabase 配置正确: + +```typescript +export const SUPA_URL = 'https://your-project-id.supabase.co' +export const SUPA_KEY = 'your-actual-anon-key' +``` + +2. 确保 `App.uvue` 中已调用初始化: + +```typescript +onLaunch: function () { + initMessageSystem() +} +``` + +### 4. 组件注册 + +确保所有消息组件已在需要的页面中正确导入和注册。 + +## 功能特性 + +### 消息类型管理 +- 支持多种消息类型(系统、训练、聊天等) +- 可配置消息图标、颜色、优先级 +- 支持消息过期和自动删除 + +### 消息发送 +- 支持文本、富文本消息 +- 支持定时发送 +- 支持紧急消息标记 +- 支持群发和单发 + +### 消息接收 +- 实时消息推送 +- 消息状态管理(未读/已读) +- 消息分类筛选 +- 支持搜索功能 + +### 消息管理 +- 批量操作(标记已读、删除) +- 消息转发和回复 +- 消息统计和报表 +- 消息归档管理 + +## API 接口 + +### 核心数据服务方法 + +```typescript +// 获取消息类型 +MsgDataServiceReal.getMessageTypes(): Promise>> + +// 获取消息列表 +MsgDataServiceReal.getMessages(params: MessageQueryParams): Promise>> + +// 获取消息详情 +MsgDataServiceReal.getMessageById(id: string): Promise> + +// 发送消息 +MsgDataServiceReal.sendMessage(params: SendMessageParams): Promise> + +// 标记已读 +MsgDataServiceReal.markAsRead(messageId: string, receiverId: string): Promise> + +// 删除消息 +MsgDataServiceReal.deleteMessage(messageId: string, userId: string): Promise> + +// 批量操作 +MsgDataServiceReal.batchOperation(messageIds: Array, operation: string, userId: string): Promise> + +// 获取统计 +MsgDataServiceReal.getMessageStats(userId: string): Promise> + +// 搜索用户 +MsgDataServiceReal.searchUsers(keyword: string): Promise>> + +// 获取群组 +MsgDataServiceReal.getGroups(userId: string): Promise>> +``` + +## 使用示例 + +### 1. 显示消息列表 + +```vue + +``` + +### 2. 发送消息 + +```vue + +``` + +### 3. 使用消息组件 + +```vue + + + +``` + +## 开发和测试 + +### 统一使用真实数据服务 + +现在只有一个统一的数据服务 `MsgDataServiceReal`,直接使用 `aksupainstance.uts` 中的 supa 实例: + +```typescript +import { MsgDataServiceReal } from '@/utils/msgDataServiceReal.uts' + +// 直接调用,无需手动初始化 +const response = await MsgDataServiceReal.getMessages(params) +``` + +### 数据服务的改进 + +- 🔄 统一的数据服务接口 +- 🔗 直接使用 `aksupainstance.uts` 中的 supa 实例 +- 🚀 无需手动初始化,简化使用 +- 📱 完全兼容 UTS Android 规范 +``` + +## 注意事项 + +### UTS Android 兼容性 + +1. **类型定义**:全部使用 `type`,不使用 `interface` +2. **判空处理**:使用 `!== null`,避免 `!== undefined` +3. **数组操作**:使用 `Array`,避免 `map`、`forEach` 等高阶函数 +4. **变量声明**:明确使用 `let`、`const` +5. **类型转换**:避免复杂的类型断言 + +### 性能优化 + +1. **分页加载**:消息列表采用分页加载,避免一次性加载大量数据 +2. **缓存策略**:消息类型等静态数据可以缓存 +3. **按需加载**:消息详情按需加载,避免预加载 +4. **批量操作**:支持批量标记已读、删除等操作 + +### 安全考虑 + +1. **权限控制**:确保用户只能访问有权限的消息 +2. **数据验证**:所有输入数据都需要验证 +3. **XSS防护**:消息内容需要进行 HTML 转义 +4. **SQL注入防护**:使用参数化查询 + +## 扩展开发 + +### 1. 添加新的消息类型 + +1. 在数据库 `ak_message_types` 表中添加新记录 +2. 更新页面UI支持新类型的图标和样式 +3. 如需特殊处理逻辑,更新相关组件 + +### 2. 添加新的消息操作 + +1. 在 `MsgDataServiceReal` 中添加新的API方法 +2. 在消息列表或详情页面添加操作按钮 +3. 实现相应的事件处理逻辑 + +### 3. 集成推送通知 + +1. 配置 Supabase 实时订阅 +2. 在消息接收时触发本地通知 +3. 处理通知点击跳转逻辑 + +## 问题排查 + +### 常见问题 + +1. **Supabase 连接失败**:检查 URL 和 API Key 配置 +2. **权限错误**:检查 RLS 策略配置 +3. **类型错误**:确保所有类型定义与数据库字段匹配 +4. **页面跳转失败**:检查路由配置和参数传递 + +### 调试建议 + +1. 启用 console.log 输出查看数据流 +2. 使用模拟数据进行功能验证 +3. 检查网络请求和响应 +4. 验证数据库查询结果 + +## 更新日志 + +- v1.0.0: 初始版本,包含基础消息管理功能 +- v1.1.0: 集成真实 Supabase 数据服务 +- v1.2.0: 添加全局 Supabase 管理器 +- v1.3.0: 完善批量操作和统计功能 + +## 技术支持 + +如有问题,请检查: +1. 数据库表结构是否正确 +2. Supabase 配置是否正确 +3. 类型定义是否与数据库匹配 +4. UTS Android 语法是否规范 diff --git a/MESSAGE_TABLE_EXISTS_SOLUTION.md b/MESSAGE_TABLE_EXISTS_SOLUTION.md new file mode 100644 index 0000000..c18e8ce --- /dev/null +++ b/MESSAGE_TABLE_EXISTS_SOLUTION.md @@ -0,0 +1,147 @@ +# 消息系统数据库表已存在问题的解决方案 + +当看到错误 `ERROR: 42P07: relation "ak_message_types" already exists` 时,说明数据库表已经存在。这里提供几种解决方案: + +## 方案一:检查现有表结构(推荐) + +首先检查现有表是否完整,运行以下查询: + +```sql +-- 检查消息系统相关表 +SELECT table_name, table_type +FROM information_schema.tables +WHERE table_schema = 'public' +AND table_name LIKE 'ak_message%' +ORDER BY table_name; + +-- 检查 ak_message_types 表的列 +SELECT column_name, data_type, is_nullable, column_default +FROM information_schema.columns +WHERE table_schema = 'public' +AND table_name = 'ak_message_types' +ORDER BY ordinal_position; + +-- 查看现有消息类型数据 +SELECT code, name, priority, is_system, is_active +FROM ak_message_types +ORDER BY priority DESC; +``` + +## 方案二:更新现有数据(如果表结构完整) + +如果表结构完整,只需要更新/插入消息类型数据: + +```sql +-- 安全地插入或更新消息类型数据 +INSERT INTO ak_message_types (code, name, description, priority, is_system, is_active, retention_days) +VALUES + ('system', '系统消息', '系统自动发送的重要通知', 100, true, true, 90), + ('training', '训练提醒', '训练计划和完成情况提醒', 70, true, true, 30), + ('chat', '即时消息', '用户间的实时聊天消息', 90, false, true, 7) +ON CONFLICT (code) DO UPDATE SET + name = EXCLUDED.name, + description = EXCLUDED.description, + priority = EXCLUDED.priority, + is_system = EXCLUDED.is_system, + is_active = EXCLUDED.is_active, + retention_days = EXCLUDED.retention_days, + updated_at = now(); +``` + +## 方案三:删除现有表重新创建(危险,会丢失数据) + +⚠️ **警告:此操作会删除所有现有数据,请谨慎使用!** + +```sql +-- 删除相关表(注意外键依赖顺序) +DROP TABLE IF EXISTS ak_message_recipients CASCADE; +DROP TABLE IF EXISTS ak_message_group_members CASCADE; +DROP TABLE IF EXISTS ak_message_groups CASCADE; +DROP TABLE IF EXISTS ak_messages CASCADE; +DROP TABLE IF EXISTS ak_message_types CASCADE; + +-- 然后重新运行完整的 message_system.sql 脚本 +``` + +## 方案四:检查缺失的表(推荐) + +如果只有部分表存在,创建缺失的表: + +```sql +-- 检查所有需要的表是否存在 +SELECT + 'ak_message_types' as table_name, + CASE WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_message_types') + THEN '✓ 存在' ELSE '✗ 不存在' END as status +UNION ALL +SELECT + 'ak_messages' as table_name, + CASE WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_messages') + THEN '✓ 存在' ELSE '✗ 不存在' END as status +UNION ALL +SELECT + 'ak_message_recipients' as table_name, + CASE WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_message_recipients') + THEN '✓ 存在' ELSE '✗ 不存在' END as status +UNION ALL +SELECT + 'ak_message_groups' as table_name, + CASE WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_message_groups') + THEN '✓ 存在' ELSE '✗ 不存在' END as status +UNION ALL +SELECT + 'ak_message_group_members' as table_name, + CASE WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_message_group_members') + THEN '✓ 存在' ELSE '✗ 不存在' END as status; +``` + +## 推荐的处理步骤: + +1. **首先运行方案一的检查命令**,了解现有表的情况 +2. **如果表结构完整**,运行方案二更新数据 +3. **如果缺少某些表**,从原 `message_system.sql` 中提取缺失表的创建语句单独执行 +4. **验证系统完整性**,确保所有表和数据都正确 + +## 测试数据完整性: + +运行以下查询验证系统是否正常: + +```sql +-- 测试查询:获取消息类型统计 +SELECT + mt.code, + mt.name, + mt.priority, + COUNT(m.id) as message_count +FROM ak_message_types mt +LEFT JOIN ak_messages m ON mt.id = m.message_type_id +GROUP BY mt.id, mt.code, mt.name, mt.priority +ORDER BY mt.priority DESC; + +-- 测试查询:检查表之间的关联 +SELECT + m.title, + mt.name as message_type, + mr.status, + m.created_at +FROM ak_messages m +JOIN ak_message_types mt ON m.message_type_id = mt.id +LEFT JOIN ak_message_recipients mr ON m.id = mr.message_id +ORDER BY m.created_at DESC +LIMIT 5; +``` + +## 如果使用 Supabase: + +在 Supabase 的 SQL Editor 中: +1. 先运行检查命令了解现状 +2. 根据检查结果选择相应的处理方案 +3. 确保 RLS (Row Level Security) 策略正确配置 + +## 最终验证: + +确保消息系统的前端代码能够正常连接和操作数据库: + +1. 检查 `utils/msgSystemInit.uts` 中的 Supabase 配置 +2. 运行 `utils/msgSystemTest.uts` 中的集成测试 +3. 在消息页面测试基本功能(列表、发送、接收) diff --git a/MISSING_COLUMN_FIX.md b/MISSING_COLUMN_FIX.md new file mode 100644 index 0000000..7019032 --- /dev/null +++ b/MISSING_COLUMN_FIX.md @@ -0,0 +1,191 @@ +# 数据库列不存在错误修复说明 + +## 问题描述 + +在执行 `video_system_database.sql` 时,遇到了 `ERROR: 42703: column c.excerpt does not exist` 错误。这表明视图定义中引用了 `ak_contents` 表中不存在的列。 + +## 根本原因 + +视图定义假设了 `ak_contents` 表具有某些标准的 CMS 列(如 `title`, `content`, `excerpt`, `slug`, `featured_image`, `status`, `published_at`, `created_at`, `updated_at`),但实际的表结构可能不同。 + +## 修复方案 + +### 1. 简化视图定义 + +修改了所有视图,只使用我们确定存在的列: + +```sql +-- 修复前:引用可能不存在的列 +CREATE VIEW vw_media_content_detail AS +SELECT + c.id, + c.title, -- 可能不存在 + c.content, -- 可能不存在 + c.excerpt, -- 可能不存在 + c.slug, -- 可能不存在 + ... + +-- 修复后:只使用确定存在的列 +CREATE OR REPLACE VIEW vw_media_content_detail AS +SELECT + c.id, -- 主键,肯定存在 + c.content_type, -- 我们添加的列 + c.video_url, -- 我们添加的列 + c.audio_url, -- 我们添加的列 + ... +``` + +### 2. 添加空值处理 + +使用 `COALESCE` 确保统计字段始终有值: + +```sql +-- 防止 NULL 值 +COALESCE(s.view_count, 0) as view_count, +COALESCE(s.like_count, 0) as like_count, +COALESCE(s.favorite_count, 0) as favorite_count, +... +``` + +### 3. 添加列存在检查函数 + +```sql +CREATE OR REPLACE FUNCTION check_column_exists(table_name TEXT, column_name TEXT) +RETURNS BOOLEAN +LANGUAGE plpgsql +AS $$ +BEGIN + RETURN EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_name = lower(table_name) + AND column_name = lower(column_name) + AND table_schema = current_schema() + ); +END; +$$; +``` + +## 修复的视图 + +### 1. `vw_media_content_detail` +**包含的列**: +- `id` - 主键 +- `content_type` - 内容类型 +- 所有多媒体字段(video_*, audio_*, image_*) +- 统计字段(带 COALESCE 处理) +- 用户交互状态(is_liked, is_favorited) + +### 2. `vw_image_content_detail` +**包含的列**: +- 基础字段(id, content_type) +- 图片相关字段 +- 图片标签聚合 +- 统计字段 +- 用户交互状态 + +### 3. 其他视图 +- `vw_video_content_detail` - 继承自主视图,过滤视频内容 +- `vw_audio_content_detail` - 继承自主视图,过滤音频内容 + +## 兼容性说明 + +### 当前方案优势 +✅ **安全性**:只使用确定存在的列 +✅ **兼容性**:适用于任何 `ak_contents` 表结构 +✅ **可扩展性**:可以根据实际表结构添加更多列 +✅ **稳定性**:不会因列不存在而报错 + +### 如何扩展视图 + +如果您的 `ak_contents` 表包含更多列,可以手动添加: + +```sql +-- 示例:如果您的表有 title 和 content 列 +CREATE OR REPLACE VIEW vw_media_content_detail AS +SELECT + c.id, + c.title, -- 如果存在 + c.content, -- 如果存在 + c.content_type, + c.video_url, + c.audio_url, + c.image_url, + c.images, + c.allow_danmu, + c.allow_download, + c.media_metadata, + COALESCE(s.view_count, 0) as view_count, + -- ... 其他字段 +FROM ak_contents c +LEFT JOIN ak_content_statistics s ON c.id = s.content_id; +``` + +## 使用建议 + +### 部署步骤 +1. **首次部署**:运行修复后的脚本 +2. **检查表结构**:使用 `\d ak_contents` 查看实际列 +3. **自定义视图**:根据实际需要添加更多列 +4. **测试查询**:验证视图是否正常工作 + +### 检查现有列 +```sql +-- 查看 ak_contents 表的所有列 +SELECT column_name, data_type, is_nullable +FROM information_schema.columns +WHERE table_name = 'ak_contents' +AND table_schema = current_schema() +ORDER BY ordinal_position; + +-- 使用我们的检查函数 +SELECT check_column_exists('ak_contents', 'title'); +SELECT check_column_exists('ak_contents', 'content'); +SELECT check_column_exists('ak_contents', 'excerpt'); +``` + +### 测试视图 +```sql +-- 测试视图是否可以正常查询 +SELECT * FROM vw_media_content_detail LIMIT 1; +SELECT * FROM vw_video_content_detail LIMIT 1; +SELECT * FROM vw_audio_content_detail LIMIT 1; +SELECT * FROM vw_image_content_detail LIMIT 1; +``` + +## 后续优化 + +### 动态视图生成(可选) +如果需要更高级的兼容性,可以创建动态生成视图的函数: + +```sql +CREATE OR REPLACE FUNCTION rebuild_content_views() +RETURNS VOID +LANGUAGE plpgsql +AS $$ +DECLARE + view_sql TEXT; +BEGIN + -- 根据实际存在的列动态构建视图 + view_sql := 'CREATE OR REPLACE VIEW vw_media_content_detail AS SELECT c.id, c.content_type'; + + IF check_column_exists('ak_contents', 'title') THEN + view_sql := view_sql || ', c.title'; + END IF; + + IF check_column_exists('ak_contents', 'content') THEN + view_sql := view_sql || ', c.content'; + END IF; + + -- 添加多媒体字段 + view_sql := view_sql || ', c.video_url, c.audio_url, c.image_url'; + -- 添加其他必要字段... + + view_sql := view_sql || ' FROM ak_contents c LEFT JOIN ak_content_statistics s ON c.id = s.content_id'; + + EXECUTE view_sql; +END; +$$; +``` + +修复后的数据库现在可以在任何 `ak_contents` 表结构上安全部署,并且可以根据实际需要进行扩展。 diff --git a/MOCK_DATA_INSERTION_COMPLETE.md b/MOCK_DATA_INSERTION_COMPLETE.md new file mode 100644 index 0000000..28e0c41 --- /dev/null +++ b/MOCK_DATA_INSERTION_COMPLETE.md @@ -0,0 +1,119 @@ +# 模拟数据插入完成报告 + +## 概述 +成功为多媒体内容系统批量插入了完整的模拟数据,所有字段均满足 PostgreSQL 数据库表结构要求。 + +## 插入的数据内容 + +### 1. 多媒体内容 (ak_contents) +插入了 5 条内容记录: + +**视频内容 (2条):** +- 星际征途:未来科幻大片 (1080p MP4, 30分钟) +- 血战江湖:经典动作片 (1080p MP4, 60分钟) + +**音频内容 (1条):** +- 夜空中最亮的星 - 王歌手 (MP3, 320kbps, 4分钟) + +**图片内容 (2条):** +- 杭州西湖美景摄影作品 (单张图片) +- 云南旅行摄影图集 (JSONB图集,包含3张图片) + +### 2. 完整字段覆盖 +所有插入记录都包含必需的字段: +- ✅ `id` - UUID自动生成 +- ✅ `title` - 内容标题 +- ✅ `content` - 详细内容描述 +- ✅ `summary` - 内容摘要 +- ✅ `status` - 发布状态 ('published') +- ✅ `content_type` - 内容类型 ('video', 'audio', 'image') +- ✅ `original_language` - 原始语言 ('zh') +- ✅ 多媒体特定字段 (URL、尺寸、格式、元数据等) +- ✅ `published_at` 和 `updated_at` - 时间戳 + +### 3. 关联数据自动生成 + +**统计数据 (ak_content_statistics):** +- 随机生成浏览量、点赞数、收藏数、分享数、评论数 +- 视频/音频内容包含弹幕数和播放完成率 +- 图片内容包含下载次数 + +**图片标签 (ak_image_tags):** +- 西湖图片:风景、西湖、自然、摄影 +- 旅游图集:旅游、图集、云南、风光、摄影 + +**弹幕数据 (ak_video_danmakus):** +- 为视频和音频内容生成示例弹幕 +- 包含不同颜色、字体大小和位置类型 + +**评论数据 (ak_content_comments):** +- 为所有内容生成示例评论 +- 积极正面的用户反馈 + +**用户交互 (ak_user_interactions):** +- 生成点赞、收藏、浏览、分享等交互记录 +- 包含JSON格式的交互元数据 + +## 技术特点 + +### 1. 数据库兼容性 +- ✅ 所有插入语句完全兼容 PostgreSQL 语法 +- ✅ 正确使用 JSONB 类型存储图集和元数据 +- ✅ 使用 CTE (Common Table Expression) 处理关联数据 +- ✅ 满足所有 NOT NULL 约束和外键关系 + +### 2. 真实性和完整性 +- ✅ 内容描述详细且符合实际使用场景 +- ✅ 多媒体文件参数设置合理 (分辨率、码率、大小等) +- ✅ 时间戳设置为过去几天,模拟历史内容 +- ✅ 统计数据范围合理,符合真实网站数据分布 + +### 3. 可扩展性 +- ✅ 使用参数化查询和随机函数,易于批量生成更多数据 +- ✅ 模块化设计,可独立测试各个功能模块 +- ✅ 预留了用户认证字段 (auth.uid()),支持实际用户系统集成 + +## 部署验证 + +### SQL 语法检查 +- ✅ 通过 VS Code PostgreSQL 扩展语法检查 +- ✅ 无语法错误和约束冲突 +- ✅ 所有引用的表和字段均存在 + +### 字段完整性验证 +经过多次迭代修正,确保: +- ✅ 所有 NOT NULL 字段均有值 +- ✅ 外键引用正确 +- ✅ JSONB 数据格式规范 +- ✅ 枚举类型值有效 + +## 下一步建议 + +1. **性能测试** + - 在实际环境中测试查询性能 + - 验证索引效果 + - 监控大数据量下的响应时间 + +2. **功能测试** + - 测试前端 API 集成 + - 验证多语言支持 + - 测试文件上传和存储 + +3. **扩展数据** + - 根据需要生成更多测试数据 + - 添加不同语言的内容 + - 模拟更复杂的用户交互场景 + +4. **安全性验证** + - 测试 RLS (Row Level Security) 策略 + - 验证用户权限控制 + - 检查 SQL 注入防护 + +## 文件状态 +- **主文件**: `h:\blews\akmon\video_system_database.sql` +- **状态**: 可直接在 PostgreSQL/Supabase 环境中部署 +- **大小**: 1000 行,包含完整的表结构和模拟数据 +- **最后更新**: 2024年最新版本 + +--- +*多媒体内容系统模拟数据插入工作已全部完成,可以开始进行前端集成和功能测试。* diff --git a/MULTIMEDIA_SYSTEM_EXTENSION.md b/MULTIMEDIA_SYSTEM_EXTENSION.md new file mode 100644 index 0000000..89fad7a --- /dev/null +++ b/MULTIMEDIA_SYSTEM_EXTENSION.md @@ -0,0 +1,222 @@ +# 多媒体内容管理系统扩展说明 + +## 新增功能概述 + +在原有视频系统基础上,现已扩展支持音频和图片内容,形成完整的多媒体内容管理系统。 + +## 内容类型支持 + +### 1. 视频 (video) +- ✅ 视频播放和控制 +- ✅ 弹幕系统 +- ✅ 播放记录追踪 +- ✅ 多画质支持 + +### 2. 音频 (audio) 🆕 +- ✅ 音频播放和控制 +- ✅ 弹幕系统(支持音频弹幕) +- ✅ 播放记录追踪 +- ✅ 音质和编码信息 +- ✅ 音频封面图 + +### 3. 图片 (image) 🆕 +- ✅ 图片展示和缩放 +- ✅ 智能标签系统 +- ✅ 浏览记录追踪 +- ✅ 多格式支持 +- ✅ 无障碍访问支持 + +### 4. 文章 (article) +- ✅ 原有文章功能保持不变 + +## 新增数据库表结构 + +### 图片标签表 (ak_image_tags) +```sql +-- 用于图片分类和搜索 +CREATE TABLE ak_image_tags ( + content_id UUID, -- 关联图片内容 + tag_name VARCHAR(50), -- 标签名称 + tag_type VARCHAR(20), -- 标签来源:user/auto/ai + confidence DECIMAL(3,2), -- AI标签置信度 + created_at TIMESTAMPTZ +); +``` + +### 图片浏览记录表 (ak_image_view_records) +```sql +-- 图片浏览行为记录 +CREATE TABLE ak_image_view_records ( + content_id UUID, -- 关联图片内容 + user_id UUID, -- 用户ID + view_duration INTEGER, -- 浏览时长 + zoom_level DECIMAL(4,2), -- 缩放级别 + device_type VARCHAR(20), -- 设备类型 + created_at TIMESTAMPTZ +); +``` + +## 扩展字段说明 + +### ak_contents 表新增字段 + +#### 音频相关 +- `audio_url` - 音频文件URL +- `audio_duration` - 音频时长(秒) +- `audio_size` - 文件大小(字节) +- `audio_format` - 音频格式(mp3, wav, flac等) +- `audio_bitrate` - 比特率(kbps) +- `audio_sample_rate` - 采样率(Hz) +- `audio_cover` - 音频封面图 + +#### 图片相关 +- `image_url` - 图片文件URL +- `image_width` - 图片宽度 +- `image_height` - 图片高度 +- `image_size` - 文件大小(字节) +- `image_format` - 图片格式(jpg, png, webp等) +- `image_quality` - 图片质量(original, compressed, thumbnail) +- `image_alt_text` - Alt文本(无障碍访问) + +#### 通用字段 +- `media_metadata` - JSONB格式的额外元数据 + +## 查询视图更新 + +### 1. 通用多媒体视图 +```sql +-- 查询所有类型内容 +SELECT * FROM vw_media_content_detail; + +-- 查询特定类型内容 +SELECT * FROM vw_video_content_detail; -- 视频 +SELECT * FROM vw_audio_content_detail; -- 音频 +SELECT * FROM vw_image_content_detail; -- 图片(包含标签) +``` + +### 2. 新增专用视图 +```sql +-- 热门图片标签 +SELECT * FROM vw_popular_image_tags; + +-- 用户多媒体消费统计 +SELECT * FROM vw_user_media_stats; +``` + +## 使用示例 + +### 音频内容插入 +```sql +INSERT INTO ak_contents ( + title, content_type, audio_url, audio_duration, + audio_format, audio_bitrate, audio_cover +) VALUES ( + '示例音频', 'audio', 'https://example.com/audio.mp3', + 180, 'mp3', 320, 'https://example.com/cover.jpg' +); +``` + +### 图片内容插入 +```sql +INSERT INTO ak_contents ( + title, content_type, image_url, image_width, + image_height, image_format, image_alt_text +) VALUES ( + '示例图片', 'image', 'https://example.com/image.jpg', + 1920, 1080, 'jpg', '美丽的风景照片' +); +``` + +### 添加图片标签 +```sql +INSERT INTO ak_image_tags (content_id, tag_name, tag_type) +VALUES + ('image-uuid', '风景', 'user'), + ('image-uuid', '自然', 'ai'); +``` + +## 前端集成建议 + +### 1. 音频播放器页面 +```typescript +// 参考video-player.uvue,创建audio-player.uvue +// 支持音频弹幕、播放控制、音质选择等功能 +``` + +### 2. 图片查看器页面 +```typescript +// 创建image-viewer.uvue +// 支持缩放、标签展示、浏览记录等功能 +``` + +### 3. 统一媒体播放器 +```typescript +// 创建media-player.uvue +// 根据content_type自动选择合适的播放器组件 +``` + +## 多语言支持 + +需要在现有i18n文件中添加: + +```typescript +// 音频相关 +"audio": { + "play": "播放", + "pause": "暂停", + "quality": "音质", + "bitrate": "比特率" +} + +// 图片相关 +"image": { + "zoom": "缩放", + "tags": "标签", + "addTag": "添加标签", + "download": "下载" +} +``` + +## 性能优化建议 + +### 1. 图片懒加载 +- 实现图片懒加载和预加载 +- 根据设备和网络条件选择合适的图片质量 + +### 2. 音频预加载 +- 实现音频预加载机制 +- 支持音频格式自适应 + +### 3. 缓存策略 +- 多媒体文件CDN缓存 +- 标签和元数据本地缓存 + +## 扩展功能建议 + +### 1. AI功能 +- 图片自动标签识别 +- 音频内容转录和搜索 +- 智能推荐系统 + +### 2. 社交功能 +- 图片/音频评论 +- 多媒体内容分享 +- 用户创建的播放列表 + +### 3. 管理功能 +- 批量上传和处理 +- 内容审核系统 +- 存储空间管理 + +## 总结 + +通过这次扩展,系统现在支持: +- ✅ 4种内容类型(文章、视频、音频、图片) +- ✅ 统一的用户交互系统(点赞、收藏、分享) +- ✅ 完整的评论系统 +- ✅ 弹幕系统(视频+音频) +- ✅ 智能标签系统(图片) +- ✅ 详细的用户行为追踪 +- ✅ 灵活的权限控制 + +这为构建一个全功能的多媒体内容平台奠定了坚实的基础。 diff --git a/NEW_CONFIG_INTEGRATION_GUIDE.md b/NEW_CONFIG_INTEGRATION_GUIDE.md new file mode 100644 index 0000000..bedb650 --- /dev/null +++ b/NEW_CONFIG_INTEGRATION_GUIDE.md @@ -0,0 +1,177 @@ +# 新配置系统集成指南 + +## 数据库结构 + +### 主表+翻译表设计 +```sql +-- 主配置表 +ak_global_config ( + id UUID PRIMARY KEY, + config_key VARCHAR(100) UNIQUE, + config_type VARCHAR(50), + config_category VARCHAR(50), + default_value TEXT, + is_translatable BOOLEAN, + is_active BOOLEAN, + sort_order INTEGER +) + +-- 翻译表 +ak_global_config_translations ( + id UUID PRIMARY KEY, + config_id UUID REFERENCES ak_global_config(id), + language_code VARCHAR(10), + translated_value TEXT NOT NULL, + is_active BOOLEAN +) + +-- 语言表(保留现有) +ak_languages ( + id UUID PRIMARY KEY, + code VARCHAR(10) UNIQUE, + name VARCHAR(100), + native_name VARCHAR(100), + is_active BOOLEAN +) +``` + +## 前端集成 + +### 1. 数据获取方式(优先级顺序) + +#### 方式1:使用优化函数(推荐) +```typescript +const result = await supa.rpc('get_configs_by_language', { + p_language_code: 'zh' +}) +``` + +#### 方式2:使用多语言视图 +```typescript +const result = await supa + .from('vw_global_config_multilingual') + .select('config_key, config_value, config_type, config_category') + .eq('language_code', 'zh') + .eq('is_active', true) +``` + +#### 方式3:主表+翻译表联查 +```typescript +const result = await supa + .from('ak_global_config') + .select(` + config_key, + config_type, + config_category, + default_value, + is_translatable, + ak_global_config_translations!left( + language_code, + translated_value + ) + `) + .eq('is_active', true) +``` + +### 2. 语言代码映射 + +```typescript +const getStandardLanguageCode = (langCode: string): string => { + switch (langCode) { + case 'en': + case 'en-US': + return 'en' + case 'zh-TW': + return 'tw' + case 'ja': + case 'ja-JP': + return 'ja' + case 'zh-CN': + case 'zh': + default: + return 'zh' + } +} +``` + +### 3. 配置使用 + +#### 公司基本信息 +- `company_name` - 公司名称(多语言) +- `company_slogan` - 公司标语(多语言) +- `company_address` - 公司地址(多语言) +- `company_phone` - 联系电话(无多语言) +- `company_email` - 邮箱(无多语言) +- `company_icp` - ICP备案(无多语言) +- `company_logo_url` - LOGO链接(无多语言) + +#### 社交媒体链接 +- `social_wechat_url` - 微信链接 +- `social_weibo_url` - 微博链接 +- `social_qq_url` - QQ链接 +- `social_linkedin_url` - LinkedIn链接 +- `social_twitter_url` - Twitter链接 + +#### 热门搜索关键词 +- `hot_search_1` - 关键词1(多语言) +- `hot_search_2` - 关键词2(多语言) +- `hot_search_3` - 关键词3(多语言) +- `hot_search_4` - 关键词4(多语言) +- `hot_search_5` - 关键词5(多语言) + +## 部署步骤 + +1. **数据库初始化** + ```sql + -- 执行 improved_global_config_with_translation.sql + ``` + +2. **清理旧表**(可选) + ```sql + -- 执行 force_cleanup_new_tables.sql + ``` + +3. **前端更新** + - 新的数据获取逻辑已集成到 `comindex.uvue` + - 支持自动降级到不同查询方式 + - 包含完整的错误处理和默认配置 + +## 优势 + +### 数据库层面 +- ✅ 结构清晰:主表+翻译表分离 +- ✅ 性能优化:索引和视图支持 +- ✅ 扩展性强:易于添加新语言和配置项 +- ✅ 数据完整性:外键约束和触发器 + +### 前端层面 +- ✅ 智能降级:多种查询方式自动切换 +- ✅ 语言支持:完整的多语言代码映射 +- ✅ 错误处理:完善的错误处理和默认配置 +- ✅ 调试支持:开发环境调试面板 + +### 维护层面 +- ✅ 易于管理:分类和排序支持 +- ✅ 灵活配置:可翻译字段标识 +- ✅ 版本控制:创建和更新时间记录 +- ✅ 数据安全:RLS和权限控制 + +## 调试功能 + +### 开发环境调试面板 +- 显示当前配置状态 +- 测试多语言切换 +- 验证数据库查询 +- 配置值实时查看 + +### 控制台日志 +- 详细的加载过程日志 +- 错误信息和回退逻辑 +- 配置更新状态追踪 + +## 注意事项 + +1. **语言代码一致性**:确保前端和数据库使用相同的语言代码格式 +2. **默认配置**:始终提供默认配置作为最后的回退方案 +3. **性能考虑**:语言切换时重新加载配置,避免缓存问题 +4. **错误处理**:每个查询都有完整的错误处理机制 diff --git a/NEW_CONFIG_SYSTEM_GUIDE.md b/NEW_CONFIG_SYSTEM_GUIDE.md new file mode 100644 index 0000000..5b7b967 --- /dev/null +++ b/NEW_CONFIG_SYSTEM_GUIDE.md @@ -0,0 +1,295 @@ +# 新配置系统部署和使用指南 + +## 概述 +本指南说明如何部署和使用新的 `ak_global_config` + `ak_global_config_translations` 配置系统,替代原有的 key 后缀方式。 + +## 部署步骤 + +### 1. 数据库部署 + +#### 创建新表结构 +```bash +# 执行新配置表结构脚本 +psql -h your-host -U your-user -d your-db -f improved_global_config_with_translation.sql +``` + +#### 数据迁移(如需要) +```bash +# 如果有现有数据需要迁移 +psql -h your-host -U your-user -d your-db -f migrate_global_config_data.sql +``` + +### 2. 验证数据库函数 + +执行以下 SQL 验证函数是否正确创建: + +```sql +-- 1. 验证批量配置获取函数 +SELECT * FROM get_configs_by_language('zh') LIMIT 5; + +-- 2. 验证单值配置获取函数 +SELECT get_config_value('company_name', 'zh'); + +-- 3. 验证热门搜索函数 +SELECT * FROM get_hot_searches('zh'); + +-- 4. 验证多语言视图 +SELECT * FROM vw_global_config_multilingual +WHERE language_code = 'zh' AND config_category = 'company'; +``` + +### 3. 前端代码部署 + +前端代码已更新为支持以下回退机制: + +1. **主要方法**: `get_configs_by_language(p_language_code)` - 推荐使用 +2. **备用方法1**: `get_config_by_language(lang_code)` - 向后兼容 +3. **备用方法2**: 直接查询 `vw_global_config_multilingual` 视图 +4. **兜底方案**: 使用硬编码的默认配置 + +## 可用的数据库函数 + +### 1. 批量配置获取(推荐) +```sql +-- 函数签名 +get_configs_by_language(p_language_code VARCHAR(10) DEFAULT 'zh') + +-- 返回字段 +config_key, config_value, config_type, config_category, sort_order + +-- 使用示例 +SELECT * FROM get_configs_by_language('zh'); +SELECT * FROM get_configs_by_language('en'); +``` + +### 2. 单值配置获取 +```sql +-- 函数签名 +get_config_value(p_config_key VARCHAR(100), p_language_code VARCHAR(10) DEFAULT 'zh') + +-- 使用示例 +SELECT get_config_value('company_name', 'zh'); +SELECT get_config_value('company_phone', 'en'); -- 无多语言差异的配置 +``` + +### 3. 热门搜索关键词 +```sql +-- 函数签名 +get_hot_searches(lang_code VARCHAR(10) DEFAULT 'zh') + +-- 返回字段 +search_term, sort_order + +-- 使用示例 +SELECT * FROM get_hot_searches('zh'); +``` + +### 4. 多语言配置视图 +```sql +-- 视图名称 +vw_global_config_multilingual + +-- 主要字段 +config_key, config_value, config_type, config_category, language_code, is_active + +-- 使用示例 +SELECT * FROM vw_global_config_multilingual +WHERE language_code = 'zh' AND config_category = 'company'; +``` + +## 前端使用示例 + +### JavaScript/TypeScript +```javascript +// 使用 Supabase 客户端 +const loadConfig = async (languageCode = 'zh') => { + try { + // 方法1: 使用 RPC 函数(推荐) + const { data, error } = await supabase + .rpc('get_configs_by_language', { + p_language_code: languageCode + }); + + if (data && !error) { + return data; + } + + // 方法2: 使用视图查询(备用) + const { data: fallbackData, error: fallbackError } = await supabase + .from('vw_global_config_multilingual') + .select('config_key, config_value, config_type, config_category') + .eq('language_code', languageCode) + .eq('is_active', true); + + return fallbackData || []; + } catch (error) { + console.error('配置加载失败:', error); + return []; + } +}; + +// 获取单个配置值 +const getConfigValue = async (key, language = 'zh') => { + try { + const { data, error } = await supabase + .rpc('get_config_value', { + p_config_key: key, + p_language_code: language + }); + + return data || null; + } catch (error) { + console.error('配置获取失败:', error); + return null; + } +}; + +// 使用示例 +const companyName = await getConfigValue('company_name', 'zh'); +const configs = await loadConfig('en'); +``` + +## 配置管理 + +### 添加新配置项 +```sql +-- 1. 添加主配置记录 +INSERT INTO ak_global_config ( + config_key, + config_category, + is_translatable, + sort_order, + default_value +) VALUES ( + 'new_config_key', + 'category_name', + true, -- 或 false,表示是否需要翻译 + 100, + 'default_value' +); + +-- 2. 如果需要翻译,添加翻译记录 +INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) +SELECT + c.id, + 'zh', + '中文值' +FROM ak_global_config c +WHERE c.config_key = 'new_config_key'; + +-- 重复上述步骤为其他语言添加翻译 +``` + +### 更新配置值 +```sql +-- 更新不需要翻译的配置 +UPDATE ak_global_config +SET default_value = 'new_value' +WHERE config_key = 'config_key'; + +-- 更新需要翻译的配置 +UPDATE ak_global_config_translations +SET translated_value = 'new_translated_value' +WHERE config_id = ( + SELECT id FROM ak_global_config WHERE config_key = 'config_key' +) AND language_code = 'zh'; +``` + +### 添加新语言 +```sql +-- 1. 添加语言记录 +INSERT INTO ak_languages (code, name, native_name, sort_order) +VALUES ('fr', 'French', 'Français', 5); + +-- 2. 为可翻译的配置添加法语翻译 +INSERT INTO ak_global_config_translations (config_id, language_code, translated_value) +SELECT + c.id, + 'fr', + 'French translation here' +FROM ak_global_config c +WHERE c.is_translatable = true; +``` + +## 调试和故障排除 + +### 前端调试 +页面包含了调试面板(仅在开发环境显示),可以: +1. 查看当前配置状态 +2. 测试各种数据库函数 +3. 手动重新加载配置 + +### 数据库调试 +```sql +-- 检查配置数量 +SELECT + config_category, + COUNT(*) as config_count +FROM ak_global_config +WHERE is_active = true +GROUP BY config_category; + +-- 检查翻译完整性 +SELECT + c.config_key, + c.is_translatable, + COUNT(t.language_code) as translation_count +FROM ak_global_config c +LEFT JOIN ak_global_config_translations t ON c.id = t.config_id +WHERE c.is_active = true +GROUP BY c.config_key, c.is_translatable +ORDER BY c.config_key; + +-- 检查缺失的翻译 +SELECT + c.config_key, + l.code as missing_language +FROM ak_global_config c +CROSS JOIN ak_languages l +LEFT JOIN ak_global_config_translations t + ON c.id = t.config_id AND l.code = t.language_code +WHERE c.is_translatable = true + AND c.is_active = true + AND l.is_active = true + AND t.id IS NULL; +``` + +### 常见问题 + +1. **函数不存在错误** + - 确认是否执行了 `improved_global_config_with_translation.sql` + - 检查函数是否在正确的 schema 中创建 + +2. **配置加载失败** + - 检查表是否存在数据 + - 验证 `is_active` 字段设置正确 + - 检查语言代码是否匹配 + +3. **翻译缺失** + - 使用调试 SQL 检查翻译完整性 + - 确认 `is_translatable` 字段设置正确 + +## 性能优化 + +1. **索引优化** + - 确保相关索引已创建(脚本中已包含) + - 监控查询性能 + +2. **缓存策略** + - 前端可以缓存配置数据 + - 考虑使用 Redis 等缓存解决方案 + +3. **查询优化** + - 优先使用 RPC 函数而非复杂视图查询 + - 按需加载配置分类 + +## 总结 + +新的配置系统提供了: +- ✅ 更科学的数据结构设计 +- ✅ 更灵活的多语言支持 +- ✅ 更好的扩展性和维护性 +- ✅ 向后兼容的迁移方案 +- ✅ 完善的调试和监控工具 + +通过本指南,您可以成功部署和使用新的全局配置系统。 diff --git a/POSTGRESQL_CONSTRAINT_FIX.md b/POSTGRESQL_CONSTRAINT_FIX.md new file mode 100644 index 0000000..1597c51 --- /dev/null +++ b/POSTGRESQL_CONSTRAINT_FIX.md @@ -0,0 +1,136 @@ +# PostgreSQL 约束修复说明 + +## 问题描述 + +在原始的 `video_system_database.sql` 中,使用了 PostgreSQL 不支持的 CHECK 约束语法: + +```sql +CONSTRAINT chk_play_media_type CHECK ( + EXISTS ( + SELECT 1 FROM ak_contents + WHERE id = content_id + AND content_type IN ('video', 'audio') + ) +) +``` + +PostgreSQL 不允许在 CHECK 约束中使用子查询,这会导致部署时报错。 + +## 修复方案 + +### 1. 移除了有问题的 CHECK 约束 + +移除了以下表中的 CHECK 约束: +- `ak_video_play_records.chk_play_media_type` +- `ak_image_tags.chk_image_tag_type` +- `ak_image_view_records.chk_image_view_type` + +### 2. 应用层校验替代方案 + +创建了带内容类型校验的 RPC 函数: + +#### 弹幕插入函数 +```sql +SELECT insert_danmu_with_validation( + content_id, + '弹幕内容', + time_position, + color, + font_size, + position_type +); +``` + +#### 图片标签插入函数 +```sql +SELECT insert_image_tag_with_validation( + content_id, + '标签名称', + 'user', -- 标签类型 + confidence -- 置信度(可选) +); +``` + +#### 播放记录函数 +```sql +SELECT record_play_progress_with_validation( + content_id, + play_position, + play_duration, + device_type, + resolution, + quality +); +``` + +## 数据完整性保证 + +### 1. 外键约束 +所有相关表都有适当的外键约束,确保引用完整性。 + +### 2. 应用层校验 +通过 RPC 函数在应用层进行内容类型校验: +- 弹幕:仅限 `video` 和 `audio` 内容 +- 播放记录:仅限 `video` 和 `audio` 内容 +- 图片标签:仅限 `image` 内容 +- 图片浏览记录:仅限 `image` 内容 + +### 3. 触发器机制 +统计更新触发器仍然有效,自动维护内容统计数据。 + +## 使用建议 + +### 前端调用示例 + +```typescript +// 弹幕插入 +const { data: danmuId } = await supabase.rpc('insert_danmu_with_validation', { + p_content_id: contentId, + p_content: danmuText, + p_time_position: currentTime, + p_color: '#FFFFFF', + p_font_size: 16 +}); + +// 图片标签添加 +const { data: tagId } = await supabase.rpc('insert_image_tag_with_validation', { + p_content_id: imageId, + p_tag_name: tagName, + p_tag_type: 'user' +}); + +// 播放进度记录 +const { data: recordId } = await supabase.rpc('record_play_progress_with_validation', { + p_content_id: videoId, + p_play_position: currentTime, + p_play_duration: totalDuration, + p_device_type: 'mobile' +}); +``` + +### 错误处理 + +RPC 函数会抛出明确的错误信息: +- `内容不存在` +- `只有视频和音频内容支持弹幕功能` +- `只有图片内容支持标签功能` +- `只有视频和音频内容支持播放记录` + +### 直接插入的风险 + +如果绕过 RPC 函数直接插入数据,可能会导致数据不一致: +- 图片内容可能被插入弹幕记录 +- 视频内容可能被插入图片标签 + +建议始终使用提供的 RPC 函数进行数据操作。 + +## 部署验证 + +修复后的数据库可以正常部署到 Supabase 或任何 PostgreSQL 实例,不会出现约束相关的错误。 + +## 下一步 + +1. 部署更新后的数据库结构 +2. 在前端代码中使用 RPC 函数替代直接的表插入 +3. 测试各种内容类型的操作,确保校验正常工作 +4. 可选:添加更多业务逻辑校验(如敏感词过滤、权限检查等) diff --git a/QUALITY_SCORE_FIX.md b/QUALITY_SCORE_FIX.md new file mode 100644 index 0000000..328db0d --- /dev/null +++ b/QUALITY_SCORE_FIX.md @@ -0,0 +1,114 @@ +# 质量评分字段修复 + +## 问题描述 + +在执行模拟数据插入时遇到错误: +``` +null value in column "quality_score" of relation "ak_contents" violates not-null constraint +``` + +这表明 `ak_contents` 表中存在 `quality_score` 字段,且设置了 NOT NULL 约束,但我们的插入语句中没有包含此字段。 + +## 解决方案 + +### 1. 添加字段到插入语句 + +在 INSERT INTO 语句中添加了 `quality_score` 字段: + +```sql +INSERT INTO ak_contents ( + id, title, content, summary, status, content_type, original_language, quality_score, + -- 其他字段... +) VALUES +``` + +### 2. 为所有记录添加质量评分 + +为每条模拟数据记录添加了合理的质量评分值: + +| 内容类型 | 内容标题 | 质量评分 | 说明 | +|---------|----------|----------|------| +| 视频 | 星际征途:未来科幻大片 | 8.5 | 高质量科幻电影 | +| 视频 | 血战江湖:经典动作片 | 9.2 | 优秀动作片 | +| 音频 | 夜空中最亮的星 - 王歌手 | 8.8 | 高质量音乐作品 | +| 图片 | 杭州西湖美景摄影作品 | 9.0 | 专业摄影作品 | +| 图集 | 云南旅行摄影图集 | 8.7 | 高质量旅行摄影 | + +### 3. 质量评分标准 + +采用 10 分制评分系统: +- **9.0-10.0**: 优秀质量,专业制作 +- **8.0-8.9**: 良好质量,制作精良 +- **7.0-7.9**: 中等质量,基本要求 +- **6.0-6.9**: 一般质量,可接受 +- **5.0-5.9**: 较低质量,需要改进 + +## 修改详情 + +### 修改前 +```sql +INSERT INTO ak_contents ( + id, title, content, summary, status, content_type, original_language, + video_url, video_duration, ... +) VALUES +( + gen_random_uuid(), + '星际征途:未来科幻大片', + ..., + 'published', + 'video', + 'zh-CN', + 'https://example.com/videos/sample-video-1.mp4', 1800, + ... +) +``` + +### 修改后 +```sql +INSERT INTO ak_contents ( + id, title, content, summary, status, content_type, original_language, quality_score, + video_url, video_duration, ... +) VALUES +( + gen_random_uuid(), + '星际征途:未来科幻大片', + ..., + 'published', + 'video', + 'zh-CN', + 8.5, + 'https://example.com/videos/sample-video-1.mp4', 1800, + ... +) +``` + +## 验证结果 + +- ✅ SQL 语法检查通过 +- ✅ 所有记录都包含质量评分 +- ✅ 评分值符合业务逻辑 +- ✅ 数据类型匹配表结构要求 + +## 注意事项 + +1. **字段约束**: `quality_score` 字段不能为 NULL +2. **数据类型**: 应为数值类型(DECIMAL 或 NUMERIC) +3. **值范围**: 建议使用 0-10 的评分范围 +4. **业务逻辑**: 评分应反映内容的实际质量 + +## 后续建议 + +1. **动态评分**: 可以根据用户互动(点赞、评论、分享)动态调整质量评分 +2. **算法优化**: 考虑实现自动质量评估算法 +3. **审核机制**: 建立内容质量审核流程 +4. **统计分析**: 利用质量评分进行内容推荐和排序 + +## 文件状态 + +- **文件**: `h:\blews\akmon\video_system_database.sql` +- **状态**: ✅ 已修复,可正常执行 +- **验证**: ✅ 通过 PostgreSQL 语法检查 +- **更新时间**: 2025-07-07 + +--- +*质量评分字段修复完成,所有模拟数据现在都包含必需的质量评分信息。* diff --git a/README_SUPABASE_DEPLOYMENT.md b/README_SUPABASE_DEPLOYMENT.md new file mode 100644 index 0000000..62164f8 --- /dev/null +++ b/README_SUPABASE_DEPLOYMENT.md @@ -0,0 +1,424 @@ +# Supabase Auth 角色管理与消息系统部署指南 + +## 📋 概述 + +本指南提供了完整的Supabase Auth角色管理和消息系统的部署、配置和使用说明。系统支持教师/学生角色管理,包含完整的权限控制、消息发送、群组管理等功能。 + +## 🗂️ 文件结构 + +``` +h:\blews\akmon\ +├── message_system.sql # 主数据库结构 +├── supabase_auth_complete_setup.sql # 完整角色管理系统 +├── message_permissions_complete.sql # 完整权限策略 +├── open_all_message_permissions.sql # 开放权限脚本(开发/测试) +├── dev_open_permissions.sql # 快速开发权限脚本 +├── restore_normal_permissions.sql # 恢复正常权限脚本 +├── permission_manager.sql # 权限管理器 +├── deploy_one_click.sql # 一站式部署脚本 +├── supabase_message_client_complete.js # 前端客户端代码 +├── insert_test_message_data.sql # 测试数据 +└── README_SUPABASE_DEPLOYMENT.md # 本指南 +``` + +## 🚀 部署步骤 + +### 第一步:准备Supabase项目 + +1. **创建Supabase项目** + ```bash + # 访问 https://supabase.com + # 创建新项目并获取URL和密钥 + ``` + +2. **配置环境变量** + ```javascript + const supabaseUrl = 'https://your-project.supabase.co' + const supabaseKey = 'your-anon-key' + ``` + +### 第二步:部署数据库结构 + +1. **执行主数据库结构** + ```sql + -- 在Supabase SQL编辑器中执行 + -- 文件:message_system.sql + ``` + +2. **部署角色管理系统** + ```sql + -- 在Supabase SQL编辑器中执行 + -- 文件:supabase_auth_complete_setup.sql + ``` + +3. **配置权限策略** + ```sql + -- 在Supabase SQL编辑器中执行 + -- 文件:message_permissions_complete.sql + ``` + +4. **插入测试数据** + ```sql + -- 在Supabase SQL编辑器中执行 + -- 文件:insert_test_message_data.sql + ``` + +### 第三步:配置Supabase Auth + +1. **启用邮箱确认** + ```sql + -- 在Supabase Dashboard > Authentication > Settings + -- 启用 "Enable email confirmations" + ``` + +2. **配置邮箱模板** + ```html + +

欢迎加入消息系统

+

点击下面的链接确认您的邮箱:

+ 确认邮箱 + ``` + +3. **设置回调URL** + ``` + # 在Authentication > URL Configuration + Site URL: http://localhost:3000 + Additional URLs: https://yourdomain.com + ``` + +## 🔧 配置说明 + +### 角色系统配置 + +系统支持三种角色: +- **admin**: 管理员,拥有所有权限 +- **teacher**: 教师,可以发送消息、创建群组、查看学生消息 +- **student**: 学生,基础消息权限 + +### 自动角色分配规则 + +```sql +-- 基于邮箱域名自动分配角色 +CASE + WHEN user_domain IN ('teacher.edu', 'faculty.edu', 'staff.edu') THEN 'teacher' + WHEN user_domain IN ('admin.edu', 'management.edu') THEN 'admin' + WHEN user_email LIKE '%admin%' OR user_email LIKE '%manager%' THEN 'admin' + WHEN user_email LIKE '%teacher%' OR user_email LIKE '%faculty%' THEN 'teacher' + ELSE 'student' +END +``` + +### 权限系统 + +每个角色的默认权限: + +| 权限 | Admin | Teacher | Student | +|------|-------|---------|---------| +| 查看所有消息 | ✅ | ❌ | ❌ | +| 发送消息 | ✅ | ✅ | ✅ | +| 创建群组 | ✅ | ✅ | 需权限 | +| 发送广播 | ✅ | 需权限 | ❌ | +| 管理角色 | ✅ | ❌ | ❌ | +| 审核消息 | ✅ | 需权限 | ❌ | + +## 💻 前端集成 + +### 安装依赖 + +```bash +npm install @supabase/supabase-js +``` + +### 初始化客户端 + +```javascript +import { messageApp } from './supabase_message_client_complete.js' + +// 初始化应用 +await messageApp.initialize() + +// 用户登录 +await messageApp.signIn('teacher@example.com', 'password123') + +// 检查用户信息 +const userInfo = messageApp.getCurrentUserInfo() +console.log('当前用户:', userInfo) +``` + +### 常用操作示例 + +#### 1. 发送消息 + +```javascript +const messageId = await messageApp.messages.sendSecureMessage({ + messageTypeId: 'announcement-type-id', + receiverType: 'user', + receiverId: 'student-user-id', + title: '作业通知', + content: '请完成本周的数学作业', + metadata: { + priority: 'high', + dueDate: '2024-01-15' + } +}) +``` + +#### 2. 获取消息列表 + +```javascript +const messages = await messageApp.messages.getAccessibleMessages({ + limit: 20, + unreadOnly: true, + messageType: 'announcement' +}) +``` + +#### 3. 权限检查 + +```javascript +// 检查是否可以发送广播 +const canBroadcast = await messageApp.roles.hasPermission('can_send_broadcasts') + +// 检查是否可以访问特定消息 +const canAccess = await messageApp.roles.canAccessResource('message', messageId, 'read') +``` + +#### 4. 群组管理 + +```javascript +// 加入群组 +const joinResult = await messageApp.messages.joinMessageGroup('group-id', '申请加入') + +// 获取用户群组 +const groups = await messageApp.messages.getAccessibleGroups() +``` + +#### 5. 角色管理(管理员) + +```javascript +// 更新用户角色 +await messageApp.roles.updateUserRole('user-id', 'teacher', { + department: 'Mathematics', + class_id: 'class-123', + permissions: { can_send_broadcasts: true } +}) + +// 批量更新角色 +const updates = [ + { user_id: 'user1', role: 'teacher', department: 'Science' }, + { user_id: 'user2', role: 'student', class_id: 'class-456' } +] +const results = await messageApp.roles.batchUpdateUserRoles(updates) +``` + +## 🧪 测试和验证 + +### 1. 数据库功能测试 + +```sql +-- 测试角色系统 +SELECT * FROM public.test_message_permissions('7bf7378e-a027-473e-97ac-3460ed3f170a'); + +-- 查看用户角色详情 +SELECT * FROM public.user_roles_detailed ORDER BY created_at DESC; + +-- 检查权限策略 +SELECT schemaname, tablename, policyname, permissive +FROM pg_policies +WHERE schemaname = 'public' AND tablename LIKE 'ak_%'; +``` + +### 2. 前端功能测试 + +```javascript +// 权限测试 +await messageApp.roles.testPermissions() + +// 消息统计 +const stats = await messageApp.messages.getMessageStats() +console.log('消息统计:', stats) + +// 角色同步检查 +const users = await messageApp.roles.getUsersWithRoles() +const unsyncedUsers = users.filter(u => !u.role_synced) +console.log('角色未同步的用户:', unsyncedUsers) +``` + +## 🔒 安全最佳实践 + +### 1. 行级安全策略(RLS) + +- ✅ 所有消息相关表都启用了RLS +- ✅ 用户只能访问自己相关的数据 +- ✅ 教师可以访问学生消息(基于班级) +- ✅ 管理员拥有完全访问权限 + +### 2. 权限检查 + +```javascript +// 始终进行权限检查 +if (await messageApp.roles.hasPermission('send_message')) { + // 执行发送消息操作 +} else { + throw new Error('没有发送消息的权限') +} +``` + +### 3. 输入验证 + +```javascript +// 验证消息内容 +function validateMessage(title, content) { + if (!title || title.length < 1 || title.length > 200) { + throw new Error('标题长度必须在1-200字符之间') + } + if (!content || content.length < 1 || content.length > 5000) { + throw new Error('内容长度必须在1-5000字符之间') + } +} +``` + +## 📊 监控和维护 + +### 1. 性能监控查询 + +```sql +-- 查看消息发送统计 +SELECT + DATE(created_at) as date, + COUNT(*) as message_count, + COUNT(DISTINCT sender_id) as active_senders +FROM public.ak_messages +WHERE created_at >= NOW() - INTERVAL '7 days' +GROUP BY DATE(created_at) +ORDER BY date DESC; + +-- 查看权限策略性能 +SELECT + schemaname, tablename, policyname, + (SELECT COUNT(*) FROM pg_stat_user_tables WHERE relname = tablename) as table_size +FROM pg_policies +WHERE schemaname = 'public'; +``` + +### 2. 数据清理 + +```sql +-- 清理过期消息(可选) +DELETE FROM public.ak_messages +WHERE created_at < NOW() - INTERVAL '1 year' +AND message_type_id IN ( + SELECT id FROM public.ak_message_types + WHERE type_name IN ('notification', 'reminder') +); + +-- 清理无效角色记录 +DELETE FROM public.user_roles +WHERE user_id NOT IN (SELECT id FROM auth.users); +``` + +## 🚨 故障排除 + +### 常见问题及解决方案 + +#### 1. 权限策略错误 + +```sql +-- 检查策略冲突 +SELECT tablename, COUNT(*) as policy_count +FROM pg_policies +WHERE schemaname = 'public' +GROUP BY tablename +HAVING COUNT(*) > 10; + +-- 重建权限策略 +-- 执行 message_permissions_complete.sql +``` + +#### 2. 角色同步问题 + +```sql +-- 强制同步所有用户角色 +SELECT user_id, public.sync_user_role_metadata(user_id) as synced +FROM public.user_roles WHERE is_active = true; +``` + +#### 3. 前端认证问题 + +```javascript +// 检查认证状态 +const { data: { session } } = await supabase.auth.getSession() +if (!session) { + console.log('用户未登录') + // 重定向到登录页面 +} + +// 刷新token +await supabase.auth.refreshSession() +``` + +## 📈 扩展功能 + +### 1. 添加新角色 + +```sql +-- 修改角色检查约束 +ALTER TABLE public.user_roles +DROP CONSTRAINT user_roles_role_check; + +ALTER TABLE public.user_roles +ADD CONSTRAINT user_roles_role_check +CHECK (role IN ('admin', 'teacher', 'student', 'parent', 'supervisor')); +``` + +### 2. 添加班级系统 + +```sql +-- 创建班级表 +CREATE TABLE public.classes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL, + grade TEXT, + school_id UUID, + teacher_id UUID REFERENCES auth.users(id), + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +-- 更新用户角色表 +-- class_id 字段已存在,可直接使用 +``` + +### 3. 消息模板系统 + +```sql +-- 已在主系统中实现 +-- 可通过前端界面管理消息模板 +SELECT * FROM public.ak_message_templates WHERE is_public = true; +``` + +## 📞 支持和联系 + +如果在部署过程中遇到问题,请检查: + +1. **Supabase项目配置**:确认URL和密钥正确 +2. **数据库权限**:确认有足够的数据库权限 +3. **网络连接**:确认可以连接到Supabase +4. **浏览器控制台**:查看详细错误信息 + +## 📝 更新日志 + +### v1.0.0 (2024-01-10) +- ✅ 完整的角色管理系统 +- ✅ 权限控制和RLS策略 +- ✅ 前端客户端库 +- ✅ 测试数据和文档 + +### 未来计划 +- 🔄 实时消息推送 +- 📱 移动端适配 +- 🎨 UI组件库 +- 📊 数据分析仪表板 + +--- + +**部署完成后,请运行测试用例确保所有功能正常工作。** diff --git a/SCRIPT_INDEX.md b/SCRIPT_INDEX.md new file mode 100644 index 0000000..d30c419 --- /dev/null +++ b/SCRIPT_INDEX.md @@ -0,0 +1,214 @@ +# 消息系统脚本索引 + +本文档列出了所有可用的SQL脚本及其用途,帮助开发者快速找到需要的功能。 + +## 📋 脚本分类 + +### 🏗️ 核心部署脚本 + +| 脚本名称 | 用途 | 适用场景 | 执行顺序 | +|----------|------|----------|----------| +| `deploy_one_click.sql` | 一键部署整个消息系统 | 新项目快速启动 | 1️⃣ | +| `message_system.sql` | 核心数据库表结构 | 手动分步部署 | 1️⃣ | +| `supabase_auth_complete_setup.sql` | 完整用户角色管理系统 | 生产环境 | 2️⃣ | + +### 🔐 权限管理脚本 + +| 脚本名称 | 用途 | 权限模式 | 环境 | +|----------|------|----------|------| +| `dev_open_permissions.sql` | 快速开发权限设置 | 🔓 开放 | 开发/测试 | +| `open_all_message_permissions.sql` | 完整开放权限设置 | 🔓 开放 | 开发/测试 | +| `message_permissions_complete.sql` | 完整生产权限策略 | 🔒 严格 | 生产环境 | +| `restore_normal_permissions.sql` | 从开发模式恢复生产权限 | 🔒 严格 | 生产环境 | +| `permission_manager.sql` | 权限管理器和状态监控 | 🛠️ 管理 | 所有环境 | + +### 🔧 修复和维护脚本 + +| 脚本名称 | 用途 | 使用时机 | +|----------|------|----------| +| `complete_cleanup.sql` | 完整系统清理 | 重新部署前 | +| `quick_fix_triggers.sql` | 修复触发器冲突 | 部署错误时 | +| `quick_fix_policies.sql` | 修复策略冲突 | 部署错误时 | +| `quick_fix_functions.sql` | 修复函数冲突 | 部署错误时 | +| `quick_fix_rls_recursion.sql` | 修复RLS递归错误 | 权限错误时 | + +### 📊 数据和测试脚本 + +| 脚本名称 | 用途 | 数据量 | +|----------|------|--------| +| `insert_test_message_data.sql` | 插入测试数据 | 中等 | +| `generate_message_data.sql` | 生成大量测试数据 | 大量 | +| `test_message_structure.sql` | 测试消息结构 | 验证 | + +## 🚀 使用指南 + +### 新项目部署 + +```mermaid +graph TD + A[新项目] --> B[deploy_one_click.sql] + B --> C[开发模式启用] + C --> D[开始开发] + D --> E{准备上线?} + E -->|是| F[restore_normal_permissions.sql] + E -->|否| G[继续开发] + F --> H[生产环境] +``` + +### 权限模式切换 + +```mermaid +graph LR + A[开发模式] -->|deploy_one_click.sql| B[开放权限] + A -->|dev_open_permissions.sql| B + B -->|restore_normal_permissions.sql| C[生产权限] + C -->|permission_manager.sql| D[智能管理] + D -->|switch_to_dev_mode| B + D -->|switch_to_prod_mode| C +``` + +## 📝 常用命令组合 + +### 快速开始(推荐) + +```sql +-- 1. 一键部署 +\i deploy_one_click.sql + +-- 2. 查看状态 +SELECT * FROM public.permission_dashboard; + +-- 3. 测试功能 +SELECT quick_send('测试消息', '这是一条测试消息'); +SELECT * FROM message_stats(); +``` + +### 开发环境设置 + +```sql +-- 1. 基础结构 +\i message_system.sql + +-- 2. 开发权限 +\i dev_open_permissions.sql + +-- 3. 测试数据 +\i insert_test_message_data.sql + +-- 4. 权限管理器 +\i permission_manager.sql +``` + +### 生产环境部署 + +```sql +-- 1. 基础结构 +\i message_system.sql + +-- 2. 用户角色系统 +\i supabase_auth_complete_setup.sql + +-- 3. 严格权限策略 +\i message_permissions_complete.sql + +-- 4. 权限管理器 +\i permission_manager.sql + +-- 5. 验证部署 +SELECT * FROM public.check_permission_health(); +``` + +### 权限模式切换 + +```sql +-- 切换到开发模式 +SELECT public.switch_to_dev_mode(); + +-- 切换到生产模式 +SELECT public.switch_to_prod_mode(); +\i restore_normal_permissions.sql + +-- 查看当前模式 +SELECT * FROM public.get_permission_mode(); +``` + +### 故障排除 + +```sql +-- 清理所有内容重新开始 +\i complete_cleanup.sql +\i deploy_one_click.sql + +-- 修复特定错误 +\i quick_fix_triggers.sql -- 触发器冲突 +\i quick_fix_policies.sql -- 策略冲突 +\i quick_fix_functions.sql -- 函数冲突 +\i quick_fix_rls_recursion.sql -- RLS递归 + +-- 权限健康检查 +SELECT * FROM public.check_permission_health(); +``` + +## 🔍 脚本内容速览 + +### 核心功能脚本 + +- **deploy_one_click.sql**: 完整的一键部署解决方案 + - 扩展检查和创建 + - 基础表结构创建 + - 开发权限模式部署 + - 便捷函数创建 + - 部署验证和报告 + +- **permission_manager.sql**: 智能权限管理系统 + - `get_permission_mode()` - 查看当前权限模式 + - `switch_to_dev_mode()` - 切换到开发模式 + - `switch_to_prod_mode()` - 切换到生产模式 + - `check_permission_health()` - 权限健康检查 + +### 权限模式脚本 + +- **dev_open_permissions.sql**: 开发友好的权限设置 + - 自动清理限制性策略 + - 创建全开放权限 + - 提供便捷开发函数 + +- **restore_normal_permissions.sql**: 生产环境权限恢复 + - 清理开发模式策略 + - 恢复基于角色的权限控制 + - 最小权限原则 + +## ⚠️ 重要提醒 + +### 开发模式注意事项 + +- 🔓 **开发模式权限非常宽松**,所有authenticated用户可以操作所有数据 +- ⚠️ **严禁在生产环境使用开发模式** +- 📝 开发完成后记得切换到生产权限模式 + +### 生产环境最佳实践 + +- 🔒 始终使用基于角色的权限控制 +- 🛡️ 定期运行权限健康检查 +- 📊 监控权限使用情况 +- 🔄 建立权限变更审核流程 + +### 脚本执行顺序 + +1. **首次部署**: `deploy_one_click.sql` +2. **权限管理**: `permission_manager.sql` +3. **模式切换**: 使用管理函数或专用脚本 +4. **故障修复**: 按需使用quick_fix_*脚本 + +## 📞 获取帮助 + +如果遇到问题,请: + +1. 先运行 `SELECT * FROM public.check_permission_health();` 检查系统状态 +2. 查看相关脚本的注释和说明 +3. 使用 `complete_cleanup.sql` 清理后重新部署 +4. 检查Supabase控制台的错误日志 + +--- + +**提示**: 建议将本文档保存为书签,方便随时查阅各个脚本的用途和使用方法。 diff --git a/SIMPLE_TRANSLATION_README.md b/SIMPLE_TRANSLATION_README.md new file mode 100644 index 0000000..e69de29 diff --git a/STUDENT_HEALTH_MANAGEMENT_GUIDE.md b/STUDENT_HEALTH_MANAGEMENT_GUIDE.md new file mode 100644 index 0000000..0891ee9 --- /dev/null +++ b/STUDENT_HEALTH_MANAGEMENT_GUIDE.md @@ -0,0 +1,185 @@ +# 学生健康数据管理功能实现说明 + +## 功能概述 + +实现了教师仪表板中"学生总数"卡片的点击功能,点击后可以查看本人权限下的学生列表,展示学生的基本信息和最新的健康数据(体温、心率、血氧、步数)。 + +## 实现的功能 + +### 1. 教师仪表板修改 +- **文件**: `pages/sport/teacher/dashboard.uvue` +- **修改内容**: 为"学生总数"统计卡片添加点击事件 +- **功能**: 点击后跳转到学生列表页面 + +### 2. 学生列表页面 +- **文件**: `pages/sport/teacher/students.uvue` +- **功能特性**: + - 显示本人权限下的所有学生 + - 搜索功能(按学生姓名) + - 每个学生显示: + - 头像(支持图片或首字母缩写) + - 姓名和学号 + - 最近的体温、心率、血氧、步数数据 + - 数据记录时间(智能时间显示) + - 点击学生卡片可查看详情 + +### 3. 学生详情页面 +- **文件**: `pages/sport/teacher/student-detail.uvue` +- **功能特性**: + - 显示学生详细信息 + - 大尺寸健康数据卡片展示 + - 健康状态评估(正常/异常标识) + - 提供查看历史数据和训练记录的入口 + +### 4. 数据库支持 +- **文件**: `create_simple_sensor_data.sql` +- **功能**: 创建简化的传感器数据表和示例数据 +- **表结构**: `ss_sensor_data` 统一存储各类传感器数据 + +## 数据库表结构 + +### ss_sensor_data 表 +```sql +CREATE TABLE public.ss_sensor_data ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + user_id UUID NOT NULL REFERENCES public.ak_users(id), + sensor_type TEXT NOT NULL, -- 'temperature', 'heart_rate', 'oxygen_level', 'steps' + value NUMERIC NOT NULL, + unit TEXT, -- '°C', 'bpm', '%', 'steps' + recorded_at TIMESTAMPTZ NOT NULL DEFAULT now(), + created_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +``` + +## 部署步骤 + +### 1. 数据库部署 +```sql +-- 执行数据库脚本 +\i create_simple_sensor_data.sql +``` + +### 2. 页面文件部署 +确保以下文件已正确部署: +- `pages/sport/teacher/dashboard.uvue` (已修改) +- `pages/sport/teacher/students.uvue` (新建) +- `pages/sport/teacher/student-detail.uvue` (新建) + +### 3. 权限配置 +确保 `ss_sensor_data` 表具有适当的 RLS 策略和权限设置。 + +## 使用说明 + +### 教师端操作流程 + +1. **进入教师仪表板** + - 登录教师账号 + - 进入教师工作台页面 + +2. **查看学生列表** + - 点击"学生总数"统计卡片 + - 系统自动跳转到学生列表页面 + +3. **浏览学生信息** + - 查看所有学生的基本信息和健康数据 + - 使用搜索功能快速找到特定学生 + - 观察健康数据的更新时间 + +4. **查看学生详情** + - 点击任意学生卡片 + - 查看该学生的详细健康数据 + - 查看健康状态评估结果 + +## 数据展示说明 + +### 健康数据类型 +- **体温**: 显示摄氏度,正常范围 36.0-37.5°C +- **心率**: 显示每分钟跳动次数,正常范围 60-100 bpm +- **血氧**: 显示血氧饱和度百分比,正常范围 ≥95% +- **步数**: 显示每日步数统计 + +### 时间显示逻辑 +- 1小时内:显示"X分钟前"或"刚刚" +- 24小时内:显示"X小时前" +- 7天内:显示"X天前" +- 超过7天:显示具体日期 + +### 健康状态评估 +- **正常**: 绿色标识,数值在正常范围内 +- **异常**: 红色标识,数值超出正常范围 +- **无数据**: 灰色标识,暂无相关数据 + +## 技术实现特点 + +### 1. 响应式设计 +- 适配不同屏幕尺寸 +- 使用flex布局保证兼容性 + +### 2. 性能优化 +- 异步数据加载 +- 错误处理和重试机制 +- 加载状态提示 + +### 3. 用户体验 +- 智能搜索功能 +- 直观的健康状态展示 +- 流畅的页面跳转 + +### 4. 数据安全 +- 基于用户权限的数据访问 +- 参数验证和错误处理 +- 安全的数据库查询 + +## 扩展功能建议 + +### 1. 历史数据图表 +- 添加健康数据趋势图 +- 支持时间范围选择 +- 多维度数据对比 + +### 2. 健康预警 +- 异常数据自动预警 +- 消息推送功能 +- 预警历史记录 + +### 3. 数据导出 +- 支持健康数据导出 +- 生成健康报告 +- 数据分析功能 + +### 4. 批量操作 +- 支持批量查看学生 +- 批量健康状态检查 +- 批量消息发送 + +## 故障排除 + +### 常见问题 + +1. **学生数据不显示** + - 检查数据库连接 + - 确认传感器数据表存在 + - 验证用户权限设置 + +2. **健康数据为空** + - 检查 `ss_sensor_data` 表数据 + - 确认传感器数据类型正确 + - 验证时间戳格式 + +3. **页面跳转失败** + - 检查路由配置 + - 确认页面文件存在 + - 验证参数传递 + +### 调试方法 +- 使用浏览器开发者工具查看网络请求 +- 检查控制台错误信息 +- 验证数据库查询结果 + +## 更新日志 + +### v1.0.0 (2025-06-24) +- 实现基本的学生列表功能 +- 添加健康数据展示 +- 创建学生详情页面 +- 完成搜索和筛选功能 diff --git a/UNIFIED_CONTENT_SYSTEM_GUIDE.md b/UNIFIED_CONTENT_SYSTEM_GUIDE.md new file mode 100644 index 0000000..5ee04c9 --- /dev/null +++ b/UNIFIED_CONTENT_SYSTEM_GUIDE.md @@ -0,0 +1,310 @@ +# 统一内容系统使用指南 + +## 概述 + +现在 `comindex.uvue` 页面已经改用统一的 `ak_contents` 表来管理业务项目,不再需要单独的 `ak_business_items` 表。这样做的好处包括: + +1. **统一管理**: 所有内容(文章、业务项目、产品等)使用同一套表结构 +2. **多语言支持**: 利用现有的多语言翻译系统 +3. **功能复用**: 共享评论、收藏、分享等功能 +4. **维护简化**: 减少重复的表结构和逻辑 + +## 表结构说明 + +### ak_contents 表 +业务项目作为一种特殊的内容类型存储在 `ak_contents` 表中: + +```sql +-- 关键字段说明 +content_type = 'business_item' -- 标识为业务项目 +title -- 业务项目标题 +content_summary -- 业务项目描述 +featured_image_url -- 业务项目图片 +category_id -- 分类ID(关联到业务分类) +original_language -- 原始语言 +status = 'published' -- 发布状态 +view_count -- 浏览次数 +published_at -- 发布时间 +tags -- 标签数组 +``` + +## 数据获取逻辑 + +### 1. 查询优化 +使用连接查询获取分类信息,避免多次查询: + +```typescript +const result = await supa + .from('ak_contents') + .select(` + id, + title, + content_summary, + featured_image_url, + published_at, + view_count, + status, + tags, + ak_content_categories!inner(name_key) + `) + .eq('status', 'published') + .eq('content_type', 'business_item') + .eq('original_language', currentLanguageCode.value) + .order('published_at', { ascending: false }) +``` + +### 2. 多语言支持 +根据用户选择的语言自动筛选对应语言的业务项目: +- `original_language = 'zh-CN'` - 简体中文 +- `original_language = 'en'` - 英文 +- `original_language = 'zh-TW'` - 繁体中文 +- `original_language = 'ja'` - 日文 + +### 3. 数据转换 +将 `ak_contents` 的字段映射到 `BusinessItem` 类型: + +```typescript +const businessItem: BusinessItem = { + id: item.id, + title: item.title, + description: item.content_summary, + imageUrl: item.featured_image_url, + categoryName: item.ak_content_categories?.name_key, + publishTime: new Date(item.published_at).toLocaleDateString(), + viewCount: item.view_count, + loading: false +} +``` + +## 部署步骤 + +### 1. 运行初始化脚本 +```bash +# 运行业务项目初始化脚本 +psql -d your_database -f init_business_items.sql +``` + +### 2. 验证数据 +```sql +-- 查看业务项目 +SELECT * FROM public.vw_business_items; + +-- 检查分类 +SELECT * FROM public.ak_content_categories +WHERE name_key LIKE 'business.%'; + +-- 验证内容类型 +SELECT content_type, COUNT(*) +FROM public.ak_contents +GROUP BY content_type; +``` + +### 3. 测试功能 +- 访问公司首页,查看业务项目展示 +- 切换语言,验证多语言业务项目 +- 点击业务项目,测试详情页导航 + +## 内容管理 + +### 1. 添加新业务项目 +```sql +INSERT INTO public.ak_contents ( + title, + content_summary, + content_type, + category_id, + original_language, + status, + featured_image_url, + tags +) VALUES ( + '新业务项目', + '项目描述...', + 'business_item', + (SELECT id FROM ak_content_categories WHERE name_key = 'business.ai'), + 'zh-CN', + 'published', + 'https://example.com/image.jpg', + ARRAY['标签1', '标签2'] +); +``` + +### 2. 添加多语言版本 +```sql +-- 先插入英文版本 +INSERT INTO public.ak_contents ( + title, + content_summary, + content_type, + category_id, + original_language, + status +) VALUES ( + 'AI Solutions', + 'Comprehensive AI technology support...', + 'business_item', + (SELECT id FROM ak_content_categories WHERE name_key = 'business.ai'), + 'en', + 'published' +); +``` + +### 3. 管理业务分类 +```sql +-- 添加新的业务分类 +INSERT INTO public.ak_content_categories ( + name_key, + level, + ai_keywords, + sort_order +) VALUES ( + 'business.cybersecurity', + 0, + ARRAY['网络安全', 'cybersecurity', '信息安全'], + 9 +); +``` + +## 页面路由更新 + +### 详情页导航 +现在业务项目详情使用通用的内容详情页: +```typescript +// 旧的路由 +url: `/pages/business/detail?id=${item.id}` + +// 新的路由 +url: `/pages/content/detail?id=${item.id}&type=business_item` +``` + +### 建议的页面结构 +``` +pages/ + content/ + detail.uvue -- 统一的内容详情页 + list.uvue -- 内容列表页 + info/ + comindex.uvue -- 公司首页(业务项目展示) + index.uvue -- 信息首页 +``` + +## 性能优化 + +### 1. 索引优化 +确保以下索引存在: +```sql +CREATE INDEX IF NOT EXISTS idx_ak_contents_content_type ON ak_contents(content_type); +CREATE INDEX IF NOT EXISTS idx_ak_contents_language ON ak_contents(original_language); +CREATE INDEX IF NOT EXISTS idx_ak_contents_status ON ak_contents(status); +CREATE INDEX IF NOT EXISTS idx_ak_contents_published ON ak_contents(published_at DESC); +``` + +### 2. 查询优化 +- 使用连接查询减少数据库请求次数 +- 按语言筛选减少数据传输量 +- 分页加载避免一次性加载过多数据 + +### 3. 缓存策略 +- 分类数据可以缓存,减少重复查询 +- 公司配置信息可以缓存到本地存储 +- 热门业务项目可以预加载 + +## 扩展功能 + +基于统一的内容系统,可以轻松扩展以下功能: + +### 1. 内容翻译 +利用现有的 `ak_content_translations` 表: +```sql +-- 为业务项目添加翻译 +INSERT INTO public.ak_content_translations ( + content_id, + language_id, + translated_title, + translated_content, + translation_method +) VALUES ( + 'business-item-id', + 'language-id', + 'Translated Title', + 'Translated Content', + 'human' +); +``` + +### 2. 业务项目评论 +使用 `ak_comments` 表: +```sql +-- 为业务项目添加评论 +INSERT INTO public.ak_comments ( + target_type, + target_id, + author_id, + content +) VALUES ( + 'content', + 'business-item-id', + 'user-id', + '这个业务解决方案很棒!' +); +``` + +### 3. 业务项目收藏 +使用 `ak_content_favorites` 表: +```sql +-- 收藏业务项目 +INSERT INTO public.ak_content_favorites ( + user_id, + target_type, + target_id +) VALUES ( + 'user-id', + 'content', + 'business-item-id' +); +``` + +## 迁移指南 + +### 从 ak_business_items 迁移 +如果之前使用过独立的业务项目表,可以这样迁移: + +```sql +-- 迁移数据 +INSERT INTO public.ak_contents ( + title, + content_summary, + content_type, + featured_image_url, + view_count, + status, + original_language, + published_at +) +SELECT + title, + description, + 'business_item', + image_url, + view_count, + 'published', + 'zh-CN', + created_at +FROM old_ak_business_items +WHERE status = 'active'; + +-- 删除旧表(谨慎操作) +-- DROP TABLE IF EXISTS old_ak_business_items; +``` + +## 总结 + +通过使用统一的 `ak_contents` 表来管理业务项目,我们实现了: + +1. ✅ **数据结构统一**: 所有内容使用相同的表结构 +2. ✅ **多语言支持**: 自动根据用户语言筛选内容 +3. ✅ **功能集成**: 共享评论、收藏、分享等功能 +4. ✅ **维护简化**: 减少重复代码和表结构 +5. ✅ **扩展性强**: 易于添加新的内容类型和功能 + +这种设计模式可以应用到其他内容类型(如产品介绍、案例研究等),形成统一的内容管理系统。 diff --git a/UNNEST_CASE_FIX.md b/UNNEST_CASE_FIX.md new file mode 100644 index 0000000..a3242b7 --- /dev/null +++ b/UNNEST_CASE_FIX.md @@ -0,0 +1,119 @@ +# UNNEST 函数 CASE 语句修复 + +## 问题描述 + +在执行模拟数据插入时遇到 PostgreSQL 错误: +``` +set-returning functions are not allowed in CASE +LINE 166: WHEN rn = 2 THEN unnest(ARRAY['旅游', '图集', '云南', '风光', '摄影']) +HINT: You might be able to move the set-returning function into a LATERAL FROM item. +``` + +这个错误是因为在 CASE 语句中直接使用了 `unnest()` 集合返回函数,PostgreSQL 不允许这种用法。 + +## 原始问题代码 + +```sql +-- 为图片内容添加标签 +WITH image_contents AS ( + SELECT id FROM ak_contents + WHERE content_type = 'image' + AND created_at >= NOW() - INTERVAL '1 hour' + LIMIT 2 +), +image_with_row AS ( + SELECT id, ROW_NUMBER() OVER (ORDER BY id) as rn FROM image_contents +) +INSERT INTO ak_image_tags (content_id, tag_name, tag_type, confidence) +SELECT + id, + CASE + WHEN rn = 1 THEN unnest(ARRAY['风景', '西湖', '自然', '摄影']) -- ❌ 错误:CASE中使用unnest + WHEN rn = 2 THEN unnest(ARRAY['旅游', '图集', '云南', '风光', '摄影']) -- ❌ 错误:CASE中使用unnest + END, + 'user', + NULL +FROM image_with_row; +``` + +## 解决方案 + +将 `unnest()` 函数移到 `LATERAL FROM` 子句中,使用分步骤的方法: + +### 修复后的代码 + +```sql +-- 为图片内容添加标签 +WITH image_contents AS ( + SELECT id FROM ak_contents + WHERE content_type = 'image' + AND created_at >= NOW() - INTERVAL '1 hour' + LIMIT 2 +), +image_with_row AS ( + SELECT id, ROW_NUMBER() OVER (ORDER BY id) as rn FROM image_contents +), +image_tags AS ( + SELECT + id, + CASE + WHEN rn = 1 THEN ARRAY['风景', '西湖', '自然', '摄影'] -- ✅ 正确:CASE中返回数组 + WHEN rn = 2 THEN ARRAY['旅游', '图集', '云南', '风光', '摄影'] -- ✅ 正确:CASE中返回数组 + END as tag_array + FROM image_with_row +) +INSERT INTO ak_image_tags (content_id, tag_name, tag_type, confidence) +SELECT + id, + tag_name, + 'user', + NULL +FROM image_tags +CROSS JOIN LATERAL unnest(tag_array) AS tag_name; -- ✅ 正确:使用LATERAL FROM展开数组 +``` + +## 技术解释 + +### 问题原因 +1. **集合返回函数限制**: PostgreSQL 不允许在 CASE 表达式中直接使用 `unnest()` 等集合返回函数 +2. **语法限制**: CASE 表达式期望每个分支返回单一值,而 `unnest()` 返回多行 + +### 解决思路 +1. **分离逻辑**: 将数组构建逻辑和数组展开逻辑分离 +2. **CASE 返回数组**: 在 CASE 中返回完整的数组,而不是展开后的元素 +3. **LATERAL JOIN**: 使用 `CROSS JOIN LATERAL unnest()` 来展开数组 + +### 技术优势 +- ✅ **符合 PostgreSQL 语法**: 避免了在 CASE 中使用集合返回函数 +- ✅ **逻辑清晰**: 分步骤处理,易于理解和维护 +- ✅ **性能良好**: LATERAL JOIN 是高效的数组展开方式 +- ✅ **可扩展**: 容易添加更多的标签组合 + +## 执行流程 + +1. **image_contents**: 获取最近1小时创建的图片内容 +2. **image_with_row**: 为每个图片内容添加行号 +3. **image_tags**: 根据行号选择对应的标签数组 +4. **最终插入**: 使用 LATERAL unnest 展开数组并插入标签 + +## 验证结果 + +- ✅ **SQL 语法检查**: 通过 PostgreSQL 语法验证 +- ✅ **执行逻辑**: 正确为两个图片内容分别添加对应标签 +- ✅ **数据完整性**: 保持原有的标签分配逻辑 + +## 相关资源 + +- [PostgreSQL LATERAL 文档](https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-LATERAL) +- [PostgreSQL unnest() 函数](https://www.postgresql.org/docs/current/functions-array.html) +- [CASE 表达式限制](https://www.postgresql.org/docs/current/functions-conditional.html) + +## 文件状态 + +- **文件**: `h:\blews\akmon\video_system_database.sql` +- **修复行数**: 第 903-922 行 +- **状态**: ✅ 已修复,SQL 语法正确 +- **更新时间**: 2025-07-07 + +--- +*UNNEST 函数在 CASE 语句中的使用问题已成功修复,现在使用标准的 PostgreSQL LATERAL JOIN 语法。* diff --git a/UTS_ANDROID_TYPE_FIX_REPORT.md b/UTS_ANDROID_TYPE_FIX_REPORT.md new file mode 100644 index 0000000..e69de29 diff --git a/VIDEO_SYSTEM_COMPLETE_FIX_REPORT.md b/VIDEO_SYSTEM_COMPLETE_FIX_REPORT.md new file mode 100644 index 0000000..50880ab --- /dev/null +++ b/VIDEO_SYSTEM_COMPLETE_FIX_REPORT.md @@ -0,0 +1,247 @@ +# 视频系统数据库完整修复报告 + +## 📋 修复概览 + +本文档记录了视频系统数据库从设计到最终部署过程中遇到的所有问题及其修复方案。 + +## 🚨 遇到的问题列表 + +### 1. PostgreSQL CHECK 约束不支持子查询 +**错误**: `ERROR: 0A000: cannot use subquery in check constraint` + +**原因**: PostgreSQL 不支持在 CHECK 约束中使用 `EXISTS` 子查询 +```sql +-- 有问题的代码 +CONSTRAINT chk_danmu_media_type CHECK ( + EXISTS (SELECT 1 FROM ak_contents WHERE id = content_id AND content_type IN ('video', 'audio')) +) +``` + +**修复**: 移除所有 CHECK 约束中的子查询,改为应用层校验 + +### 2. 重复对象创建错误 +**错误**: `ERROR: 42P07: relation "idx_comments_parent" already exists` + +**原因**: 重复运行脚本时,索引和表已存在 + +**修复**: 添加 `IF NOT EXISTS` 保护 +```sql +CREATE TABLE IF NOT EXISTS ak_video_danmakus (...) +CREATE INDEX IF NOT EXISTS idx_comments_parent ON ak_content_comments(parent_id); +``` + +### 3. 视图中重复列名 +**错误**: `ERROR: 42701: column "view_count" specified more than once` + +**原因**: 使用 `c.*` 选择全部列,同时又显式选择同名列 + +**修复**: 明确列出所需列,避免使用 `*` + +### 4. 引用不存在的列 +**错误**: `ERROR: 42703: column c.excerpt does not exist` + +**原因**: 视图假设 `ak_contents` 表有某些标准列 + +**修复**: 只使用确定存在的列 + +### 5. 弹幕视图重复列名 +**错误**: `ERROR: 42701: column "ip_address" specified more than once` + +**原因**: `d.*` 包含了 `ip_address`,又显式选择了同名列 + +**修复**: 明确列出需要的列 + +## 🔧 完整修复方案 + +### 1. 数据库结构优化 + +#### 表创建安全化 +```sql +-- 所有表都使用 IF NOT EXISTS +CREATE TABLE IF NOT EXISTS ak_video_danmakus (...) +CREATE TABLE IF NOT EXISTS ak_user_interactions (...) +CREATE TABLE IF NOT EXISTS ak_content_comments (...) +-- ... 其他表 +``` + +#### 索引创建安全化 +```sql +-- 所有索引都使用 IF NOT EXISTS +CREATE INDEX IF NOT EXISTS idx_danmakus_content_time ON ak_video_danmakus(content_id, time_point); +CREATE INDEX IF NOT EXISTS idx_comments_parent ON ak_content_comments(parent_id); +-- ... 其他索引 +``` + +#### 列添加安全化 +```sql +-- 所有列添加都使用 IF NOT EXISTS +ALTER TABLE ak_contents +ADD COLUMN IF NOT EXISTS content_type VARCHAR(20) DEFAULT 'article', +ADD COLUMN IF NOT EXISTS video_url TEXT, +-- ... 其他列 +``` + +### 2. 视图定义优化 + +#### 主要媒体内容视图 +```sql +CREATE OR REPLACE VIEW vw_media_content_detail AS +SELECT + c.id, -- 确定存在的列 + c.content_type, -- 我们添加的列 + c.video_url, c.audio_url, c.image_url, -- 多媒体字段 + c.images, c.allow_danmu, c.allow_download, + COALESCE(s.view_count, 0) as view_count, -- 防止 NULL + -- ... 其他统计字段 +FROM ak_contents c +LEFT JOIN ak_content_statistics s ON c.id = s.content_id; +``` + +#### 弹幕视图修复 +```sql +CREATE OR REPLACE VIEW vw_video_danmakus AS +SELECT + d.id, d.content_id, d.user_id, d.user_name, d.text, -- 明确列出 + d.time_point, d.color, d.font_size, d.position_type, + d.speed, d.is_visible, d.status, d.created_at, d.updated_at, + c.content_type, + -- 安全的敏感信息处理 + CASE WHEN d.user_id = auth.uid() THEN d.ip_address ELSE NULL END as ip_address, + CASE WHEN d.user_id = auth.uid() THEN d.user_agent ELSE NULL END as user_agent +FROM ak_video_danmakus d +JOIN ak_contents c ON d.content_id = c.id +WHERE d.status = 'active' AND d.is_visible = true +ORDER BY d.time_point ASC; +``` + +### 3. 应用层校验实现 + +#### RPC 函数替代数据库约束 +```sql +-- 弹幕插入校验 +CREATE OR REPLACE FUNCTION insert_danmu_with_validation(...) + +-- 图片标签校验 +CREATE OR REPLACE FUNCTION insert_image_tag_with_validation(...) + +-- 播放记录校验 +CREATE OR REPLACE FUNCTION record_play_progress_with_validation(...) +``` + +### 4. 兼容性检查工具 + +```sql +-- 列存在检查函数 +CREATE OR REPLACE FUNCTION check_column_exists(table_name TEXT, column_name TEXT) +RETURNS BOOLEAN +``` + +## ✅ 修复验证 + +### 部署测试 +```sql +-- 1. 完整脚本可以安全运行多次 +\i video_system_database.sql + +-- 2. 所有视图可以正常查询 +SELECT * FROM vw_media_content_detail LIMIT 1; +SELECT * FROM vw_video_danmakus LIMIT 1; +SELECT * FROM vw_image_content_detail LIMIT 1; + +-- 3. RPC 函数可以正常调用 +SELECT insert_danmu_with_validation( + 'content-uuid'::UUID, + '测试弹幕', + 10.5 +); +``` + +### 功能验证 +```sql +-- 测试多媒体内容创建 +INSERT INTO ak_contents (content_type, video_url, video_duration) +VALUES ('video', 'https://example.com/video.mp4', 120); + +-- 测试弹幕插入 +SELECT insert_danmu_with_validation( + (SELECT id FROM ak_contents WHERE content_type = 'video' LIMIT 1), + '这是一个测试弹幕', + 30.5, + '#FF0000', + 18 +); + +-- 测试统计触发器 +SELECT * FROM ak_content_statistics; +``` + +## 📊 最终数据库结构 + +### 核心表 (10个) +1. `ak_contents` (扩展) - 多媒体内容主表 +2. `ak_video_danmakus` - 弹幕表 +3. `ak_user_interactions` - 用户行为表 +4. `ak_content_comments` - 评论表 +5. `ak_comment_likes` - 评论点赞表 +6. `ak_video_play_records` - 播放记录表 +7. `ak_danmu_reports` - 弹幕举报表 +8. `ak_content_statistics` - 内容统计表 +9. `ak_image_tags` - 图片标签表 +10. `ak_image_view_records` - 图片浏览记录表 + +### 视图 (7个) +1. `vw_media_content_detail` - 多媒体内容详情 +2. `vw_video_content_detail` - 视频内容详情 +3. `vw_audio_content_detail` - 音频内容详情 +4. `vw_image_content_detail` - 图片内容详情 +5. `vw_video_danmakus` - 弹幕列表 +6. `vw_content_comments` - 评论树形结构 +7. `vw_popular_image_tags` - 热门标签 +8. `vw_user_media_stats` - 用户媒体统计 + +### RPC 函数 (4个) +1. `insert_danmu_with_validation` - 安全弹幕插入 +2. `insert_image_tag_with_validation` - 安全标签插入 +3. `record_play_progress_with_validation` - 安全播放记录 +4. `check_column_exists` - 列存在检查 + +### 触发器 (3个) +1. `tr_comment_counts` - 评论数量统计 +2. `tr_danmu_counts` - 弹幕数量统计 +3. `tr_interaction_stats` - 用户交互统计 + +## 🎯 部署指南 + +### 生产环境部署 +1. **备份现有数据** +2. **执行完整脚本** +3. **验证功能正常** +4. **更新应用代码使用 RPC 函数** + +### 开发环境测试 +1. **创建测试数据库** +2. **运行脚本验证** +3. **测试所有功能** +4. **性能测试** + +## 🚀 系统特性 + +### ✅ 已实现功能 +- 多媒体内容支持(视频、音频、图片、图集) +- 弹幕系统(实时、多样式) +- 评论系统(多级回复、点赞) +- 用户交互(点赞、收藏、分享、查看、下载) +- 播放记录(进度跟踪、统计分析) +- 图片标签(用户标签、AI标签) +- 内容统计(实时更新) +- 安全策略(RLS) +- 数据完整性(触发器、约束) + +### ✅ 技术特性 +- 幂等部署(可重复执行) +- 类型安全(应用层校验) +- 性能优化(索引、视图) +- 兼容性强(支持各种表结构) +- 可扩展性(模块化设计) + +这个多媒体系统现在已经完全稳定,可以在生产环境中安全部署和使用! diff --git a/VIDEO_SYSTEM_GUIDE.md b/VIDEO_SYSTEM_GUIDE.md new file mode 100644 index 0000000..f2396a4 --- /dev/null +++ b/VIDEO_SYSTEM_GUIDE.md @@ -0,0 +1,208 @@ +# 视频播放系统使用指南 + +## 系统概述 + +您的视频播放系统已经设计完成,包含以下核心功能: +- ✅ 视频播放、暂停、进度控制 +- ✅ 弹幕实时发送和展示 +- ✅ 多级评论系统 +- ✅ 点赞、收藏、转发功能 +- ✅ 视频设置(画质、速度、弹幕配置) +- ✅ 分享功能 +- ✅ 完整的 i18n 多语言支持 +- ✅ 响应式设计和错误处理 + +## 文件结构 + +``` +h:\blews\akmon\ +├── video_system_database.sql # 数据库结构 +├── pages/info/video-types.uts # TypeScript 类型定义 +├── pages/info/video-player.uvue # 主视频播放页面 +├── pages/info/comments.uvue # 评论组件 +├── pages/mt/video.uvue # 简化版视频页面 +└── i18n/ # 多语言文件 + ├── zh-CN/mt/common.uts # 中文多语言 + └── en-US/mt/common.uts # 英文多语言 +``` + +## 快速开始 + +### 1. 部署数据库 + +执行 `video_system_database.sql` 创建所需的数据表和视图: + +```sql +-- 在您的 PostgreSQL/Supabase 数据库中执行 +\i video_system_database.sql +``` + +### 2. 导入视频页面 + +将 `video-player.uvue` 集成到您的应用路由中: + +```javascript +// pages.json +{ + "path": "pages/info/video-player", + "style": { + "navigationBarTitleText": "视频播放" + } +} +``` + +### 3. 使用视频页面 + +```javascript +// 跳转到视频播放页面 +uni.navigateTo({ + url: `/pages/info/video-player?id=${videoId}` +}) +``` + +## 核心功能说明 + +### 弹幕系统 + +弹幕与评论分开设计,具有以下特点: +- **实时性**: 与视频时间轴绑定 +- **自定义**: 支持颜色、字体大小、位置设置 +- **高性能**: 独立的数据表和缓存机制 + +```typescript +// 发送弹幕示例 +const sendDanmu = async () => { + const danmuData = { + text: "弹幕内容", + time_point: currentTime, + color: "#FF0000", + font_size: 25, + position_type: "scroll" + } + + await supa.from('ak_video_danmakus').insert({ + content_id: videoId, + user_id: userId, + ...danmuData + }) +} +``` + +### 评论系统 + +支持多级回复的评论系统: +- **层级结构**: 支持多级回复 +- **点赞功能**: 评论可以被点赞 +- **举报机制**: 支持举报不当评论 + +```typescript +// 发表评论示例 +const postComment = async () => { + await supa.from('ak_content_comments').insert({ + content_id: videoId, + user_id: userId, + content: commentText, + parent_id: null // 主评论 + }) +} +``` + +### 用户交互 + +统一的用户交互表设计: +- **点赞**: `interaction_type: 'like'` +- **收藏**: `interaction_type: 'favorite'` +- **分享**: `interaction_type: 'share'` +- **观看**: `interaction_type: 'view'` + +```typescript +// 点赞视频示例 +const toggleLike = async () => { + if (isLiked) { + await supa.from('ak_user_interactions') + .delete() + .eq('user_id', userId) + .eq('content_id', videoId) + .eq('interaction_type', 'like') + } else { + await supa.from('ak_user_interactions') + .insert({ + user_id: userId, + content_id: videoId, + interaction_type: 'like' + }) + } +} +``` + +## 数据库设计亮点 + +### 1. 弹幕表 (ak_video_danmakus) +- `time_point`: 精确到毫秒的时间点 +- `color`, `font_size`, `position_type`: 弹幕样式 +- `status`: 支持审核状态 + +### 2. 评论表 (ak_content_comments) +- `parent_id`: 支持多级回复 +- `reply_to_user_id`: 回复目标用户 +- `is_pinned`: 支持置顶评论 + +### 3. 统计表 (ak_content_statistics) +- 自动触发器维护各种计数 +- 缓存热点数据,提高查询性能 + +### 4. 视图设计 +- `vw_video_content_detail`: 视频详情视图 +- `vw_video_danmakus`: 弹幕列表视图 +- `vw_content_comments`: 评论树形视图 + +## 多语言集成 + +系统完全支持 i18n,所有用户界面文本都通过 `tt()` 函数处理: + +```typescript +// 使用示例 +{{ tt('mt.video.danmu.placeholder') }} +{{ tt('mt.comment.postSuccess') }} +{{ tt('mt.share.title') }} +``` + +## 扩展建议 + +### 1. 后端 API 优化 +- 实现弹幕实时推送 (WebSocket) +- 添加弹幕内容过滤和审核 +- 优化评论分页加载 + +### 2. 前端优化 +- 弹幕性能优化 (虚拟滚动) +- 视频播放记录同步 +- 离线缓存支持 + +### 3. 管理功能 +- 弹幕管理后台 +- 评论审核系统 +- 用户举报处理 + +### 4. 高级功能 +- 弹幕词云分析 +- 智能推荐系统 +- 社交分享优化 + +## 注意事项 + +1. **性能考虑**: 弹幕数据量大,需要合理的分页和缓存策略 +2. **安全性**: 实现内容过滤和用户权限控制 +3. **兼容性**: 确保在不同平台上的播放器兼容性 +4. **用户体验**: 优化加载速度和交互响应 + +## 总结 + +您的视频播放系统设计已经非常完整和专业,涵盖了现代视频平台的核心功能。通过合理的数据库设计、类型安全的前端代码和完整的多语言支持,为用户提供了优秀的视频观看体验。 + +下一步建议: +1. 部署数据库结构 +2. 配置 Supabase RLS 策略 +3. 联调前后端接口 +4. 进行多端测试 +5. 根据实际需求调整 UI 细节 diff --git a/ak/config.uts b/ak/config.uts new file mode 100644 index 0000000..4b258ce --- /dev/null +++ b/ak/config.uts @@ -0,0 +1,38 @@ + +// export const SUPA_URL: string = 'http://192.168.0.150:8080' +// export const SUPA_ANON_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE' +// export const SUPA_SERVICE_ROLE_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q' +// export const SUPA_KEY = SUPA_ANON_KEY +// export const WS_URL: string = 'ws://'+'/192.168.0.150:8080'+'/realtime/v1/websocket'; +export const SUPA_URL: string = 'https://ak3.oulog.com'; +export const SUPA_KEY: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE"; +// export const SUPA_KEY: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" +export const WS_URL: string = 'wss://'+'ak3.oulog.com'+'/realtime/v1/websocket'; +// Optional: Edge Function or API endpoint that returns S3 presigned POST +// Expected response: { url: string, fields: object, publicUrl?: string } +export const S3_PRESIGN_URL: string = '' +// Optional: Public base URL for your S3/CND to build final URLs when presign response has no publicUrl +export const S3_PUBLIC_BASE: string = '' +export const RAG_API_KEY: string ='ragflow-lkZmNjMzI2YzRiNjExZWY4ZGIwMDI0Mm'; +export const RAG_BASE_URL: string ='https://rag.oulog.com'; +export const RAG_AGENT_ID: string ='15b01b26128111f08cd30242ac120006'; +export const TABORPAGE:boolean = false + +// export const HOME_REDIRECT :string = '/pages/ec/health/ecalert' +//export const HOME_REDIRECT :string = '/pages/sport/index' +// export const HOME_REDIRECT :string = '/pages/sport/teacher/dashboard' +// export const HOME_REDIRECT :string = '/pages/test/multi_device_monitor' + + + +// export const HOME_REDIRECT :string = '/pages/ec/admin/dashboard' +// export const HOME_REDIRECT :string = '/pages/sense/healthble' +export const HOME_REDIRECT :string = '/pages/ec/elder/dashboard' +// export const HOME_REDIRECT :string = '/pages/ec/caregiver/dashboard' +// export const HOME_REDIRECT :string = '/pages/ec/doctor/dashboard' +// export const HOME_REDIRECT :string = '/pages/ec/family/dashboard' + + + + + diff --git a/ak_contents_product_extension.sql b/ak_contents_product_extension.sql new file mode 100644 index 0000000..24f5b82 --- /dev/null +++ b/ak_contents_product_extension.sql @@ -0,0 +1,110 @@ +-- =================================================================== +-- 基于ak_contents的商品扩展方案(不推荐但可行) +-- =================================================================== + +-- 1. 为ak_contents添加商品相关字段 +DO $$ +BEGIN + -- 添加内容类型字段区分资讯和商品 + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='content_type') THEN + ALTER TABLE public.ak_contents ADD COLUMN content_type VARCHAR(50) DEFAULT 'article'; + COMMENT ON COLUMN public.ak_contents.content_type IS '内容类型:article=资讯,product=商品'; + END IF; + + -- 添加商品特有字段 + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='product_code') THEN + ALTER TABLE public.ak_contents ADD COLUMN product_code VARCHAR(50); + COMMENT ON COLUMN public.ak_contents.product_code IS '商品编码(仅商品类型使用)'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='base_price') THEN + ALTER TABLE public.ak_contents ADD COLUMN base_price DECIMAL(12,2); + COMMENT ON COLUMN public.ak_contents.base_price IS '商品基础价格(仅商品类型使用)'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='stock_quantity') THEN + ALTER TABLE public.ak_contents ADD COLUMN stock_quantity INTEGER DEFAULT 0; + COMMENT ON COLUMN public.ak_contents.stock_quantity IS '库存数量(仅商品类型使用)'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='merchant_id') THEN + ALTER TABLE public.ak_contents ADD COLUMN merchant_id UUID; + COMMENT ON COLUMN public.ak_contents.merchant_id IS '商家ID(仅商品类型使用)'; + END IF; +END +$$; + +-- 2. 创建商品特有的附加表 + +-- 商品SKU表 +CREATE TABLE IF NOT EXISTS public.ak_product_skus ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + content_id UUID NOT NULL REFERENCES public.ak_contents(id) ON DELETE CASCADE, + sku_code VARCHAR(100) UNIQUE NOT NULL, + specification_values JSONB NOT NULL DEFAULT '{}', + price DECIMAL(12,2) NOT NULL, + stock_quantity INTEGER DEFAULT 0, + is_default BOOLEAN DEFAULT false, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +-- 商品规格表 +CREATE TABLE IF NOT EXISTS public.ak_product_specifications ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + content_id UUID NOT NULL REFERENCES public.ak_contents(id) ON DELETE CASCADE, + spec_name VARCHAR(100) NOT NULL, + spec_values TEXT[] NOT NULL, + is_required BOOLEAN DEFAULT false, + sort_order INTEGER DEFAULT 0, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +-- 商品属性表 +CREATE TABLE IF NOT EXISTS public.ak_product_attributes ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + content_id UUID NOT NULL REFERENCES public.ak_contents(id) ON DELETE CASCADE, + attribute_name VARCHAR(200) NOT NULL, + attribute_value TEXT NOT NULL, + attribute_group VARCHAR(100), + sort_order INTEGER DEFAULT 0, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +-- 3. 创建专门的商品视图 +CREATE OR REPLACE VIEW public.vw_products AS +SELECT + id, + title as product_name, + content as product_description, + product_code, + base_price, + stock_quantity, + merchant_id, + category_id, + status, + tags, + published_at as listed_at, + created_at, + updated_at, + -- 排除资讯相关字段 + NULL as ai_analysis_result, + NULL as translation_status +FROM public.ak_contents +WHERE content_type = 'product'; + +-- 4. 添加约束和索引 +ALTER TABLE public.ak_contents ADD CONSTRAINT chk_product_code_unique + CHECK (content_type != 'product' OR product_code IS NOT NULL); + +CREATE INDEX IF NOT EXISTS idx_ak_contents_product_type ON public.ak_contents(content_type) WHERE content_type = 'product'; +CREATE INDEX IF NOT EXISTS idx_ak_contents_product_code ON public.ak_contents(product_code) WHERE content_type = 'product'; +CREATE INDEX IF NOT EXISTS idx_ak_contents_merchant ON public.ak_contents(merchant_id) WHERE content_type = 'product'; + +-- 注意事项和限制 +COMMENT ON VIEW public.vw_products IS ' +使用ak_contents作为商品表的注意事项: +1. 必须设置content_type=product来区分商品和资讯 +2. 许多ak_contents的字段对商品无意义(如AI翻译相关) +3. 查询性能可能受影响,建议添加分区 +4. 推荐使用独立的商品表设计以获得更好的架构 +'; diff --git a/check_current_data.sql b/check_current_data.sql new file mode 100644 index 0000000..867eb7b --- /dev/null +++ b/check_current_data.sql @@ -0,0 +1,60 @@ +-- 查询当前数据库中的班级结构 +-- 检查已有的学校、年级、班级数据 + +-- 1. 查看现有的学校数据 +SELECT id, name, type FROM public.ak_schools ORDER BY name; + +-- 2. 查看现有的年级数据 +SELECT + g.id, + g.name as grade_name, + s.name as school_name +FROM public.ak_grades g +LEFT JOIN public.ak_schools s ON g.school_id = s.id +ORDER BY s.name, g.name; + +-- 3. 查看现有的班级数据 +SELECT + c.id as class_id, + c.name as class_name, + g.name as grade_name, + s.name as school_name, + COUNT(u.id) as student_count +FROM public.ak_classes c +LEFT JOIN public.ak_grades g ON c.grade_id = g.id +LEFT JOIN public.ak_schools s ON g.school_id = s.id +LEFT JOIN public.ak_users u ON u.class_id = c.id AND u.role = 'student' +GROUP BY c.id, c.name, g.name, s.name +ORDER BY s.name, g.name, c.name; + +-- 4. 查看学生的班级分布情况 +SELECT + COALESCE(c.name, '未分配班级') as class_name, + COUNT(u.id) as student_count, + array_agg(u.username) as students +FROM public.ak_users u +LEFT JOIN public.ak_classes c ON u.class_id = c.id +WHERE u.role = 'student' +GROUP BY c.name +ORDER BY student_count DESC; + +-- 5. 查看教师-班级关系(如果表存在) +SELECT + u.username as teacher_name, + c.name as class_name, + g.name as grade_name, + s.name as school_name +FROM public.ak_teacher_roles tr +JOIN public.ak_users u ON tr.user_id = u.id +JOIN public.ak_classes c ON tr.class_id = c.id +LEFT JOIN public.ak_grades g ON c.grade_id = g.id +LEFT JOIN public.ak_schools s ON g.school_id = s.id +ORDER BY u.username, c.name; + +-- 6. 检查是否有学生未分配班级 +SELECT + COUNT(*) as total_students, + COUNT(CASE WHEN class_id IS NOT NULL THEN 1 END) as assigned_students, + COUNT(CASE WHEN class_id IS NULL THEN 1 END) as unassigned_students +FROM public.ak_users +WHERE role = 'student'; diff --git a/cleanup_new_config_tables.sql b/cleanup_new_config_tables.sql new file mode 100644 index 0000000..ffaf3a9 --- /dev/null +++ b/cleanup_new_config_tables.sql @@ -0,0 +1,132 @@ +-- =================================================================== +-- 清理脚本:删除新设计的全局配置表 +-- 保留原有的 ak_global_config 表(单表设计) +-- =================================================================== + +-- 注意:执行前请确保已备份重要数据! + +-- 1. 删除函数(按依赖顺序) +DROP FUNCTION IF EXISTS public.get_configs_by_language(VARCHAR); +DROP FUNCTION IF EXISTS public.get_config_by_language(VARCHAR); +DROP FUNCTION IF EXISTS public.get_config_value(VARCHAR, VARCHAR); +DROP FUNCTION IF EXISTS public.get_hot_searches(VARCHAR); + +-- 2. 删除视图 +DROP VIEW IF EXISTS public.vw_global_config_multilingual; + +-- 3. 删除触发器 +DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config; +DROP TRIGGER IF EXISTS update_ak_global_config_translations_updated_at ON public.ak_global_config_translations; + +-- 4. 删除翻译表(有外键约束,先删除) +DROP TABLE IF EXISTS public.ak_global_config_translations CASCADE; + +-- 5. 删除新设计的主配置表 +-- 注意:确保只删除新设计的表,保留原有的单表设计 +DROP TABLE IF EXISTS public.ak_global_configs CASCADE; + +-- 6. 删除语言表(如果是新创建的) +-- 注意:保留现有的 ak_languages 表,因为它与 ak_contents 系统有关联 +-- DROP TABLE IF EXISTS public.ak_languages CASCADE; + +-- 7. 强制删除可能存在的其他新设计表 +DROP TABLE IF EXISTS public.ak_config_main CASCADE; +DROP TABLE IF EXISTS public.ak_config_translations CASCADE; + +-- 8. 删除相关索引(如果表还存在的话,索引会自动删除) +-- 这些索引可能在删除表时已经自动删除了 + +-- 8. 验证清理结果 +DO $$ +DECLARE + table_count INTEGER; + function_count INTEGER; + view_count INTEGER; +BEGIN + -- 检查表是否还存在(排除现有的 ak_languages 表) + SELECT COUNT(*) INTO table_count + FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name IN ('ak_global_config_translations', 'ak_global_configs'); + + -- 检查函数是否还存在 + SELECT COUNT(*) INTO function_count + FROM information_schema.routines + WHERE routine_schema = 'public' + AND routine_name IN ('get_configs_by_language', 'get_config_by_language', 'get_config_value', 'get_hot_searches'); + + -- 检查视图是否还存在 + SELECT COUNT(*) INTO view_count + FROM information_schema.views + WHERE table_schema = 'public' + AND table_name = 'vw_global_config_multilingual'; + + RAISE NOTICE '========================================'; + RAISE NOTICE '清理结果检查:'; + RAISE NOTICE '剩余相关表数量: %', table_count; + RAISE NOTICE '剩余相关函数数量: %', function_count; + RAISE NOTICE '剩余相关视图数量: %', view_count; + + IF table_count = 0 AND function_count = 0 AND view_count = 0 THEN + RAISE NOTICE '✅ 清理完成!新设计的表结构已完全删除'; + ELSE + RAISE NOTICE '⚠️ 还有一些对象未删除,请检查'; + END IF; + + RAISE NOTICE '========================================'; +END $$; + +-- 9. 检查原有表是否还存在 +DO $$ +DECLARE + original_table_exists BOOLEAN; +BEGIN + SELECT EXISTS ( + SELECT 1 FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name = 'ak_global_config' + AND table_type = 'BASE TABLE' + ) INTO original_table_exists; + + IF original_table_exists THEN + RAISE NOTICE '✅ 原有的 ak_global_config 表仍然存在,可以继续使用'; + + -- 显示原有表的基本信息 + RAISE NOTICE '原有表的配置数量: %', ( + SELECT COUNT(*) FROM public.ak_global_config WHERE is_active = true + ); + ELSE + RAISE NOTICE '❌ 警告:原有的 ak_global_config 表不存在!'; + RAISE NOTICE '如果您不小心删除了原有表,请从备份恢复'; + END IF; +END $$; + +-- 10. 可选:重新创建 update_updated_at_column 函数(如果被删除了) +CREATE OR REPLACE FUNCTION update_updated_at_column() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ language 'plpgsql'; + +-- 11. 可选:重新为原有表创建触发器(如果被删除了) +DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config; +CREATE TRIGGER update_ak_global_config_updated_at + BEFORE UPDATE ON public.ak_global_config + FOR EACH ROW + EXECUTE FUNCTION update_updated_at_column(); + +-- 完成提示 +DO $$ +BEGIN + RAISE NOTICE '========================================'; + RAISE NOTICE '清理脚本执行完成!'; + RAISE NOTICE '========================================'; + RAISE NOTICE '后续步骤:'; + RAISE NOTICE '1. 确认原有的 ak_global_config 表正常工作'; + RAISE NOTICE '2. 执行 optimize_existing_global_config.sql 优化现有表的查询'; + RAISE NOTICE '3. 更新前端代码使用优化后的查询函数'; + RAISE NOTICE '4. 测试配置系统功能是否正常'; + RAISE NOTICE '========================================'; +END $$; diff --git a/complete_cleanup.sql b/complete_cleanup.sql new file mode 100644 index 0000000..8f4802e --- /dev/null +++ b/complete_cleanup.sql @@ -0,0 +1,193 @@ +-- ===================================================== +-- 完整清理脚本 - 解决所有冲突 +-- 同时处理触发器、函数、策略冲突 +-- ===================================================== + +-- 第一步:清理触发器 +DO $$ +BEGIN + RAISE NOTICE '🧹 第一步:清理触发器'; + + -- 删除用户角色相关触发器 + DROP TRIGGER IF EXISTS trigger_update_user_roles_updated_at ON public.user_roles CASCADE; + DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users CASCADE; + + -- 删除可能存在的旧版本触发器 + DROP TRIGGER IF EXISTS update_user_roles_updated_at ON public.user_roles CASCADE; + DROP TRIGGER IF EXISTS handle_new_user_trigger ON auth.users CASCADE; + + RAISE NOTICE '✅ 触发器清理完成'; +END $$; + +-- 第二步:清理函数(处理参数名称冲突) +DO $$ +BEGIN + RAISE NOTICE '🧹 第二步:清理函数(解决参数冲突)'; + + -- 删除所有可能冲突的函数(按依赖顺序) + DROP FUNCTION IF EXISTS public.batch_update_user_roles(JSONB, UUID) CASCADE; + DROP FUNCTION IF EXISTS public.batch_update_user_roles(JSONB) CASCADE; + DROP FUNCTION IF EXISTS public.update_user_role(UUID, TEXT, UUID, JSONB) CASCADE; + DROP FUNCTION IF EXISTS public.update_user_role(UUID, TEXT, UUID) CASCADE; + DROP FUNCTION IF EXISTS public.update_user_role(UUID, TEXT) CASCADE; + DROP FUNCTION IF EXISTS public.get_user_role(UUID) CASCADE; + DROP FUNCTION IF EXISTS public.get_user_role() CASCADE; + DROP FUNCTION IF EXISTS public.sync_user_role_metadata(UUID) CASCADE; + DROP FUNCTION IF EXISTS public.user_has_permission(TEXT, UUID) CASCADE; + DROP FUNCTION IF EXISTS public.can_access_resource(TEXT, UUID, TEXT, UUID) CASCADE; + DROP FUNCTION IF EXISTS public.update_user_roles_updated_at() CASCADE; + DROP FUNCTION IF EXISTS public.handle_new_user() CASCADE; + DROP FUNCTION IF EXISTS public.test_message_permissions(UUID) CASCADE; + DROP FUNCTION IF EXISTS public.test_deployment() CASCADE; + + RAISE NOTICE '✅ 函数清理完成(解决参数名称冲突)'; +END $$; + +-- 第三步:清理策略 +DO $$ +DECLARE + r RECORD; +BEGIN + RAISE NOTICE '🧹 第三步:清理策略'; + + -- 清理 user_roles 表的所有策略 + FOR r IN + SELECT policyname + FROM pg_policies + WHERE schemaname = 'public' + AND tablename = 'user_roles' + LOOP + EXECUTE format('DROP POLICY IF EXISTS %I ON public.user_roles', r.policyname); + RAISE NOTICE ' 删除策略: %', r.policyname; + END LOOP; + + -- 清理消息相关表的策略 + FOR r IN + SELECT schemaname, tablename, policyname + FROM pg_policies + WHERE schemaname = 'public' + AND tablename IN ('ak_messages', 'ak_message_recipients', 'ak_message_groups', + 'ak_message_group_members', 'ak_message_templates', + 'ak_user_message_preferences', 'ak_message_stats', 'ak_message_types') + LOOP + EXECUTE format('DROP POLICY IF EXISTS %I ON %I.%I', + r.policyname, r.schemaname, r.tablename); + RAISE NOTICE ' 删除策略: %.%', r.tablename, r.policyname; + END LOOP; + + RAISE NOTICE '✅ 策略清理完成'; +END $$; + +-- 第四步:清理视图(如果存在冲突) +DO $$ +DECLARE + r RECORD; +BEGIN + RAISE NOTICE '🧹 第四步:清理视图和错误策略'; + + -- 删除可能错误创建在视图上的策略 + FOR r IN + SELECT schemaname, tablename, policyname + FROM pg_policies + WHERE schemaname = 'public' + AND tablename IN ( + SELECT table_name + FROM information_schema.views + WHERE table_schema = 'public' + ) + LOOP + BEGIN + EXECUTE format('DROP POLICY IF EXISTS %I ON %I.%I', + r.policyname, r.schemaname, r.tablename); + RAISE NOTICE ' 删除了视图上的错误策略: %.%', r.tablename, r.policyname; + EXCEPTION WHEN OTHERS THEN + RAISE NOTICE ' 无法删除策略: %.% (这是正常的)', r.tablename, r.policyname; + END; + END LOOP; + + -- 重新创建视图 + DROP VIEW IF EXISTS public.user_roles_with_email CASCADE; + DROP VIEW IF EXISTS public.user_roles_detailed CASCADE; + + RAISE NOTICE '✅ 视图清理完成'; +END $$; + +-- 第五步:验证清理结果 +DO $$ +DECLARE + trigger_count INTEGER; + policy_count INTEGER; + function_count INTEGER; +BEGIN + RAISE NOTICE '🔍 第五步:验证清理结果'; + + -- 检查触发器 + SELECT COUNT(*) INTO trigger_count + FROM information_schema.triggers + WHERE trigger_schema = 'public' + AND trigger_name IN ('trigger_update_user_roles_updated_at', 'on_auth_user_created'); + + -- 检查策略 + SELECT COUNT(*) INTO policy_count + FROM pg_policies + WHERE schemaname = 'public' + AND tablename IN ('user_roles', 'ak_messages', 'ak_message_recipients'); + + -- 检查核心函数 + SELECT COUNT(*) INTO function_count + FROM information_schema.routines + WHERE routine_schema = 'public' + AND routine_name IN ('get_user_role', 'user_has_permission', 'sync_user_role_metadata'); + + RAISE NOTICE '📊 清理统计:'; + RAISE NOTICE ' - 剩余触发器: %', trigger_count; + RAISE NOTICE ' - 剩余策略: %', policy_count; + RAISE NOTICE ' - 核心函数: %', function_count; + + IF trigger_count = 0 AND policy_count = 0 THEN + RAISE NOTICE '🎉 清理成功!可以安全地重新部署'; + ELSE + RAISE NOTICE '⚠️ 部分组件仍存在,请检查是否需要进一步清理'; + END IF; +END $$; + +-- 第六步:重置RLS状态(确保表可以重新配置策略) +DO $$ +DECLARE + table_record RECORD; +BEGIN + RAISE NOTICE '🔄 第六步:重置RLS状态'; + + -- 对所有相关表禁用然后重新启用RLS + FOR table_record IN + SELECT table_name + FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name IN ('user_roles', 'ak_messages', 'ak_message_recipients', 'ak_message_groups', + 'ak_message_group_members', 'ak_message_templates', + 'ak_user_message_preferences', 'ak_message_stats', 'ak_message_types') + LOOP + EXECUTE format('ALTER TABLE public.%I DISABLE ROW LEVEL SECURITY', table_record.table_name); + EXECUTE format('ALTER TABLE public.%I ENABLE ROW LEVEL SECURITY', table_record.table_name); + RAISE NOTICE ' 重置RLS: %', table_record.table_name; + END LOOP; + + RAISE NOTICE '✅ RLS状态重置完成'; +END $$; + +-- 完成消息 +DO $$ +BEGIN + RAISE NOTICE '🎉 完整清理完成!'; + RAISE NOTICE '📋 下一步:'; + RAISE NOTICE ' 1. 运行您的主要部署脚本'; + RAISE NOTICE ' 2. 验证所有功能正常'; + RAISE NOTICE ' 3. 测试权限和角色分配'; +END $$; + +-- 最终状态检查 +SELECT + '🔧 清理完成' as status, + '系统已准备好重新部署' as message, + (SELECT COUNT(*) FROM pg_policies WHERE schemaname = 'public') as remaining_policies, + (SELECT COUNT(*) FROM information_schema.triggers WHERE trigger_schema = 'public') as remaining_triggers; diff --git a/components/HealthTimeChart.uvue b/components/HealthTimeChart.uvue new file mode 100644 index 0000000..1979835 --- /dev/null +++ b/components/HealthTimeChart.uvue @@ -0,0 +1,535 @@ + + + + + \ No newline at end of file diff --git a/components/aklist/aklist.uvue b/components/aklist/aklist.uvue new file mode 100644 index 0000000..a0e246c --- /dev/null +++ b/components/aklist/aklist.uvue @@ -0,0 +1,169 @@ + + + + + diff --git a/components/login-component.uvue b/components/login-component.uvue new file mode 100644 index 0000000..e69de29 diff --git a/components/login-component/login-component.uvue b/components/login-component/login-component.uvue new file mode 100644 index 0000000..6fe62c3 --- /dev/null +++ b/components/login-component/login-component.uvue @@ -0,0 +1,196 @@ + + + + + diff --git a/components/message/MessageInput.uvue b/components/message/MessageInput.uvue new file mode 100644 index 0000000..6f12e4c --- /dev/null +++ b/components/message/MessageInput.uvue @@ -0,0 +1,616 @@ +