diff --git a/.env.example b/.env.example index 7b8b1dd..4acb851 100644 --- a/.env.example +++ b/.env.example @@ -37,6 +37,9 @@ OTA_X9_URL_BASE=http://source.luxsin.net # 开发环境自动使用系统临时目录,无需配置 # OTA_UPLOAD_DIR=/data/projects/source +# Curve API +CURVE_API_BASE_URL=https://api.luxsin.com.cn/audio/getCurve + # Redis EQ Cache REDIS_HOST=127.0.0.1 REDIS_PORT=6379 diff --git a/.qoder/repowiki/knowledge/zh/_index.yaml b/.qoder/repowiki/knowledge/zh/_index.yaml index 9e2604d..6b5b3c0 100644 --- a/.qoder/repowiki/knowledge/zh/_index.yaml +++ b/.qoder/repowiki/knowledge/zh/_index.yaml @@ -3,7 +3,7 @@ schema_version: 1 locale: zh-CN branch: main nodes_managed: true -exported_at: "2026-06-30T10:39:57Z" +exported_at: "2026-07-01T09:22:46Z" modules: "": dir_name: 音频设备管理全栈平台 @@ -23,8 +23,8 @@ modules: depends_on: [] related_to: [] backend: - dir_name: 耳机管理后台 API - title: 耳机管理后台 API + dir_name: 音频设备管理后端 API + title: 音频设备管理后端 API scope: - backend/ source_files: [] @@ -93,8 +93,8 @@ modules: depends_on: [] related_to: [] frontend: - dir_name: 音频设备管理前端应用 - title: 音频设备管理前端应用 + dir_name: 耳机品牌与 OTA 升级管理前端 + title: 耳机品牌与 OTA 升级管理前端 scope: - frontend/ source_files: [] diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/概述.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/概述.md index 5f85026..837828e 100644 --- a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/概述.md +++ b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/概述.md @@ -1 +1 @@ -通过 Docker Compose 统一编排前后端服务,提供标准化的本地构建、远程同步及容器化部署流程。 \ No newline at end of file +通过 Docker Compose 统一编排前后端服务,结合标准化部署脚本实现从本地开发到远程服务器的自动化同步与容器化运维。 \ No newline at end of file diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/_module.yaml b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/_module.yaml similarity index 73% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/_module.yaml rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/_module.yaml index 7cd5a72..79e0995 100644 --- a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/_module.yaml +++ b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/_module.yaml @@ -1,6 +1,6 @@ schema_version: 1 module_path: frontend -title: 音频设备管理前端应用 +title: 耳机品牌与 OTA 升级管理前端 scope: - frontend/ source_files: [] diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/技术栈.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/技术栈.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/技术栈.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/技术栈.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/架构设计.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/架构设计.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/架构设计.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/架构设计.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/概述.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/概述.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/概述.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/概述.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/编码规范.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/编码规范.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理前端应用/编码规范.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机品牌与 OTA 升级管理前端/编码规范.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/_module.yaml b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/_module.yaml similarity index 77% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/_module.yaml rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/_module.yaml index 2fa4882..e26db3b 100644 --- a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/_module.yaml +++ b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/_module.yaml @@ -1,6 +1,6 @@ schema_version: 1 module_path: backend -title: 耳机管理后台 API +title: 音频设备管理后端 API scope: - backend/ source_files: [] diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/技术栈.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/技术栈.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/技术栈.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/技术栈.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/架构设计.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/架构设计.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/架构设计.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/架构设计.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/概述.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/概述.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/概述.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/概述.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/特殊配置与命令.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/特殊配置与命令.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/特殊配置与命令.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/特殊配置与命令.md diff --git a/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/编码规范.md b/.qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/编码规范.md similarity index 100% rename from .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/耳机管理后台 API/编码规范.md rename to .qoder/repowiki/knowledge/zh/音频设备管理全栈平台/音频设备管理后端 API/编码规范.md diff --git a/.qoder/repowiki/zh/content/前端组件/页面组件/型号管理页面.md b/.qoder/repowiki/zh/content/前端组件/页面组件/型号管理页面.md index a3c6a8d..85b17bf 100644 --- a/.qoder/repowiki/zh/content/前端组件/页面组件/型号管理页面.md +++ b/.qoder/repowiki/zh/content/前端组件/页面组件/型号管理页面.md @@ -3,19 +3,34 @@ **本文档引用的文件** - [frontend/src/views/model/index.vue](file://frontend/src/views/model/index.vue) +- [frontend/src/views/model/composables/useModelList.js](file://frontend/src/views/model/composables/useModelList.js) +- [frontend/src/views/model/components/ModelFormDialog.vue](file://frontend/src/views/model/components/ModelFormDialog.vue) +- [frontend/src/views/model/components/CsvViewerDialog.vue](file://frontend/src/views/model/components/CsvViewerDialog.vue) +- [frontend/src/views/model/components/EqCacheDialog.vue](file://frontend/src/views/model/components/EqCacheDialog.vue) +- [frontend/src/views/model/components/PushProgressDialog.vue](file://frontend/src/views/model/components/PushProgressDialog.vue) +- [frontend/src/views/model/components/PushViewDialog.vue](file://frontend/src/views/model/components/PushViewDialog.vue) +- [frontend/src/api/model.js](file://frontend/src/api/model.js) - [backend/src/routes/models.js](file://backend/src/routes/models.js) - [backend/src/models/Model.js](file://backend/src/models/Model.js) - [backend/src/validators/model.js](file://backend/src/validators/model.js) -- [frontend/src/api/model.js](file://frontend/src/api/model.js) - [frontend/src/api/brand.js](file://frontend/src/api/brand.js) - [backend/src/models/Brand.js](file://backend/src/models/Brand.js) - [backend/src/routes/brands.js](file://backend/src/routes/brands.js) - [backend/src/services/measurementStorage.js](file://backend/src/services/measurementStorage.js) - [backend/src/services/eqCacheStorage.js](file://backend/src/services/eqCacheStorage.js) +- [backend/src/services/squiglink.js](file://backend/src/services/squiglink.js) - [frontend/src/utils/request.js](file://frontend/src/utils/request.js) - [frontend/src/router/index.js](file://frontend/src/router/index.js) +## 更新摘要 +**变更内容** +- 新增useModelList组合式函数,提供统一的数据管理与状态控制 +- 新增5个专用对话框组件,增强用户体验和功能完整性 +- 新增squig.link外部数据导入功能,支持从第三方网站抓取频响数据 +- 增强型号表单的复杂处理能力,支持文件上传、品牌自动创建等功能 +- 完善批量操作的进度跟踪与错误处理机制 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) @@ -29,25 +44,35 @@ 10. [附录](#附录) ## 简介 -本文件面向“型号管理页面”的技术实现与使用说明,覆盖以下关键能力: +本文件面向"型号管理页面"的技术实现与使用说明,覆盖以下关键能力: - 型号列表展示、搜索过滤、排序与分页 - 型号详情查看与参数配置 - 型号表单的数据结构、字段验证与复杂表单处理(含频响文件上传) - 型号与品牌的关联关系、级联数据管理与外键约束处理 - 型号参数的动态配置、数据格式验证与存储优化 - 批量操作(复制、推送搜索)的实现方案 +- **新增**:squig.link外部数据导入功能 +- **新增**:组合式函数useModelList的状态管理 +- **新增**:5个专用对话框组件的完整功能 ## 项目结构 -型号管理页面位于前端单页应用中,后端提供 REST 接口与数据模型支撑,前端通过 API 模块与后端交互。 +型号管理页面位于前端单页应用中,后端提供 REST 接口与数据模型支撑,前端通过 API 模块与后端交互。系统现已包含完整的对话框组件体系和组合式函数支持。 ```mermaid graph TB subgraph "前端" FE_Model["型号视图
frontend/src/views/model/index.vue"] +FE_useModelList["组合式函数
useModelList.js"] FE_API_Model["型号 API
frontend/src/api/model.js"] FE_API_Brand["品牌 API
frontend/src/api/brand.js"] FE_Request["请求封装
frontend/src/utils/request.js"] FE_Router["路由
frontend/src/router/index.js"] +FE_Components["对话框组件
components/"] +FE_ModelFormDialog["ModelFormDialog.vue"] +FE_CsvViewerDialog["CsvViewerDialog.vue"] +FE_EqCacheDialog["EqCacheDialog.vue"] +FE_PushProgressDialog["PushProgressDialog.vue"] +FE_PushViewDialog["PushViewDialog.vue"] end subgraph "后端" BE_Routes_Models["型号路由
backend/src/routes/models.js"] @@ -57,107 +82,213 @@ BE_Routes_Brands["品牌路由
backend/src/routes/brands.js"] BE_Models_Brand["品牌模型
backend/src/models/Brand.js"] BE_Services_Measure["频响存储服务
backend/src/services/measurementStorage.js"] BE_Services_EQ["EQ 缓存服务
backend/src/services/eqCacheStorage.js"] +BE_Services_Squiglink["squig.link 服务
backend/src/services/squiglink.js"] end +FE_Model --> FE_useModelList FE_Model --> FE_API_Model FE_Model --> FE_API_Brand +FE_useModelList --> FE_API_Model +FE_useModelList --> FE_API_Brand FE_API_Model --> FE_Request FE_API_Brand --> FE_Request FE_Router --> FE_Model +FE_Model --> FE_Components +FE_Components --> FE_ModelFormDialog +FE_Components --> FE_CsvViewerDialog +FE_Components --> FE_EqCacheDialog +FE_Components --> FE_PushProgressDialog +FE_Components --> FE_PushViewDialog FE_API_Model --> BE_Routes_Models FE_API_Brand --> BE_Routes_Brands BE_Routes_Models --> BE_Models_Model BE_Routes_Models --> BE_Validators_Model BE_Routes_Models --> BE_Services_Measure BE_Routes_Models --> BE_Services_EQ +BE_Routes_Models --> BE_Services_Squiglink BE_Routes_Brands --> BE_Models_Brand ``` -图表来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [frontend/src/api/brand.js:1-66](file://frontend/src/api/brand.js#L1-L66) -- [frontend/src/utils/request.js:1-72](file://frontend/src/utils/request.js#L1-L72) -- [frontend/src/router/index.js:1-91](file://frontend/src/router/index.js#L1-L91) -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) -- [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) -- [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22) -- [backend/src/routes/brands.js:1-147](file://backend/src/routes/brands.js#L1-L147) -- [backend/src/models/Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) -- [backend/src/services/measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) -- [backend/src/services/eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) +**图表来源** +- [frontend/src/views/model/index.vue:1-533](file://frontend/src/views/model/index.vue#L1-L533) +- [frontend/src/views/model/composables/useModelList.js:1-191](file://frontend/src/views/model/composables/useModelList.js#L1-L191) +- [frontend/src/views/model/components/ModelFormDialog.vue:1-555](file://frontend/src/views/model/components/ModelFormDialog.vue#L1-L555) +- [frontend/src/views/model/components/CsvViewerDialog.vue:1-50](file://frontend/src/views/model/components/CsvViewerDialog.vue#L1-L50) +- [frontend/src/views/model/components/EqCacheDialog.vue:1-306](file://frontend/src/views/model/components/EqCacheDialog.vue#L1-L306) +- [frontend/src/views/model/components/PushProgressDialog.vue:1-303](file://frontend/src/views/model/components/PushProgressDialog.vue#L1-L303) +- [frontend/src/views/model/components/PushViewDialog.vue:1-60](file://frontend/src/views/model/components/PushViewDialog.vue#L1-L60) -章节来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) +**章节来源** +- [frontend/src/views/model/index.vue:1-533](file://frontend/src/views/model/index.vue#L1-L533) +- [frontend/src/views/model/composables/useModelList.js:1-191](file://frontend/src/views/model/composables/useModelList.js#L1-L191) +- [backend/src/routes/models.js:1-659](file://backend/src/routes/models.js#L1-L659) ## 核心组件 -- 前端视图组件:负责渲染列表、表单、对话框、分页与批量操作,并通过 API 模块与后端交互。 -- 前端 API 模块:封装型号与品牌相关的 HTTP 请求,统一处理 Content-Type 与超时策略。 -- 后端路由:提供型号与品牌的 CRUD、搜索、排序、分页、推送搜索校验与推送、频响文件与 EQ 缓存查询等接口。 -- 数据模型:定义型号与品牌的数据结构、字段类型与约束。 -- 服务层:频响文件上传至 S3、EQ 缓存读取 Redis。 +- **组合式函数**:useModelList提供统一的数据加载、搜索、排序、分页和状态管理功能 +- **主视图组件**:型号管理页面的核心容器,协调各对话框组件和业务逻辑 +- **对话框组件族**: + - ModelFormDialog:完整的型号表单对话框,支持文件上传和squig.link导入 + - CsvViewerDialog:CSV频响数据查看对话框 + - EqCacheDialog:EQ缓存查看对话框,支持JSON树形展示 + - PushProgressDialog:推送进度跟踪对话框 + - PushViewDialog:推送状态查看对话框 +- **API模块**:封装所有型号相关的HTTP请求,包括新增的squig.link导入功能 +- **后端路由**:提供完整的REST接口,包括squig.link数据抓取功能 +- **服务层**:频响文件上传、EQ缓存读取、squig.link数据抓取等服务 -章节来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [frontend/src/api/brand.js:1-66](file://frontend/src/api/brand.js#L1-L66) -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) -- [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) -- [backend/src/models/Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) -- [backend/src/services/measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) -- [backend/src/services/eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) +**章节来源** +- [frontend/src/views/model/composables/useModelList.js:1-191](file://frontend/src/views/model/composables/useModelList.js#L1-L191) +- [frontend/src/views/model/components/ModelFormDialog.vue:1-555](file://frontend/src/views/model/components/ModelFormDialog.vue#L1-L555) +- [frontend/src/views/model/components/CsvViewerDialog.vue:1-50](file://frontend/src/views/model/components/CsvViewerDialog.vue#L1-L50) +- [frontend/src/views/model/components/EqCacheDialog.vue:1-306](file://frontend/src/views/model/components/EqCacheDialog.vue#L1-L306) +- [frontend/src/views/model/components/PushProgressDialog.vue:1-303](file://frontend/src/views/model/components/PushProgressDialog.vue#L1-L303) +- [frontend/src/views/model/components/PushViewDialog.vue:1-60](file://frontend/src/views/model/components/PushViewDialog.vue#L1-L60) +- [frontend/src/api/model.js:1-165](file://frontend/src/api/model.js#L1-L165) ## 架构总览 -型号管理页面采用前后端分离架构,前端通过 Element Plus 组件与 Axios 进行交互,后端基于 Express 提供 REST 接口,数据持久化使用 Sequelize ORM,外部集成 S3 与 Redis。 +型号管理页面采用现代化的Vue 3 Composition API架构,结合Element Plus组件库和Axios进行数据交互。系统支持完整的数据流:从组合式函数的状态管理到对话框组件的用户交互,再到后端服务的业务处理。 ```mermaid sequenceDiagram participant U as "用户" participant V as "型号视图
index.vue" -participant A as "API 模块
model.js/brand.js" -participant R as "后端路由
models.js/brands.js" -participant M as "模型
Model.js/Brand.js" -participant S3 as "S3 存储" -participant EQ as "Redis 缓存" +participant CM as "组合式函数
useModelList" +participant MD as "ModelFormDialog" +participant API as "API 模块
model.js" +participant R as "后端路由
models.js" +participant S as "服务层
squiglink.js" U->>V : 打开型号管理页面 -V->>A : 加载品牌列表 -A->>R : GET /api/brands/ -R->>M : 查询品牌 -M-->>R : 品牌数据 -R-->>A : 品牌列表 -A-->>V : 渲染品牌下拉 -U->>V : 搜索/排序/分页 -V->>A : 获取型号列表 -A->>R : GET /api/models/ -R->>M : 分页查询型号 -M-->>R : 型号数据 -R-->>A : 列表与总数 -A-->>V : 渲染表格 -U->>V : 新增/编辑型号 -V->>A : 提交表单含文件上传 -A->>R : POST/PUT /api/models/ -R->>S3 : 上传频响文件CSV/TXT/JSON -S3-->>R : S3 Key -R->>M : 保存型号记录 -M-->>R : 新建/更新结果 -R-->>A : 成功响应 -A-->>V : 关闭对话框并刷新列表 +V->>CM : 初始化状态管理 +CM->>API : 加载品牌列表 +API->>R : GET /api/models/ +R->>S : 调用squig.link服务 +S-->>R : 返回数据 +R-->>API : 品牌数据 +API-->>CM : 品牌选项 +CM-->>V : 渲染界面 +U->>MD : 点击"新型号" +MD->>API : 上传文件或导入squig.link +API->>R : POST /api/models/squiglink-fetch +R->>S : 抓取外部数据 +S-->>R : 返回CSV内容 +R-->>API : 处理结果 +API-->>MD : 成功响应 +MD-->>V : 关闭对话框并刷新 ``` -图表来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [frontend/src/api/brand.js:1-66](file://frontend/src/api/brand.js#L1-L66) -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) -- [backend/src/routes/brands.js:1-147](file://backend/src/routes/brands.js#L1-L147) -- [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) -- [backend/src/models/Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) -- [backend/src/services/measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) +**图表来源** +- [frontend/src/views/model/index.vue:227-434](file://frontend/src/views/model/index.vue#L227-L434) +- [frontend/src/views/model/composables/useModelList.js:31-191](file://frontend/src/views/model/composables/useModelList.js#L31-L191) +- [frontend/src/views/model/components/ModelFormDialog.vue:158-464](file://frontend/src/views/model/components/ModelFormDialog.vue#L158-L464) +- [frontend/src/api/model.js:157-165](file://frontend/src/api/model.js#L157-L165) +- [backend/src/routes/models.js:307-369](file://backend/src/routes/models.js#L307-L369) +- [backend/src/services/squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) + +**章节来源** +- [frontend/src/views/model/index.vue:227-434](file://frontend/src/views/model/index.vue#L227-L434) +- [frontend/src/views/model/composables/useModelList.js:31-191](file://frontend/src/views/model/composables/useModelList.js#L31-L191) ## 详细组件分析 +### useModelList组合式函数 +useModelList是型号管理页面的核心状态管理函数,提供统一的数据操作接口。 + +**核心功能** +- **数据加载**:统一处理型号列表的加载、搜索、排序和分页 +- **状态管理**:维护表格数据、选中行、品牌选项等状态 +- **搜索过滤**:支持品牌名称和型号名称的模糊搜索 +- **排序控制**:支持按ID和创建时间的升序/降序排序 +- **分页处理**:支持不同页面大小的分页控制 +- **批量操作**:提供复制功能和格式化工具方法 + +**状态属性** +- `loading`: 数据加载状态 +- `tableData`: 当前表格数据 +- `selectedRows`: 选中的行数据 +- `selectedIds`: 选中行的ID数组 +- `brandOptions`: 品牌下拉选项 +- `sortBy`: 排序字段 +- `sortOrder`: 排序顺序 +- `searchForm`: 搜索表单数据 +- `pagination`: 分页配置 + +**方法功能** +- `loadData()`: 加载型号列表数据 +- `loadBrands()`: 加载品牌选项 +- `handleSearch()`: 执行搜索 +- `handleReset()`: 重置搜索条件 +- `handleSortChange()`: 处理排序变更 +- `handleSizeChange()`: 处理页面大小变更 +- `handlePageChange()`: 处理页码变更 +- `handleSelectionChange()`: 处理选择变更 +- `handleCopyName()`: 复制单个型号 +- `handleCopyBrand()`: 复制品牌名称 +- `handleCopySelectedNames()`: 复制选中型号 +- `formatDateTime()`: 格式化日期时间 +- `formatFormLabel()`: 格式化佩戴方式 + +**章节来源** +- [frontend/src/views/model/composables/useModelList.js:1-191](file://frontend/src/views/model/composables/useModelList.js#L1-L191) + +### ModelFormDialog型号表单对话框 +ModelFormDialog是完整的型号创建和编辑对话框,支持复杂的表单处理和外部数据导入。 + +**核心特性** +- **squig.link导入**:支持从第三方网站抓取频响数据 +- **文件上传**:支持CSV、TXT、JSON格式的频响文件上传 +- **品牌自动创建**:当品牌不存在时自动创建新品牌 +- **文件名智能解析**:根据文件名自动解析品牌和型号 +- **表单验证**:完整的字段验证和错误处理 +- **多步骤提交**:支持单次提交和连续提交模式 + +**squig.link导入流程** +1. 用户输入squig.link分享链接 +2. 系统抓取phone_book.json获取可用文件列表 +3. 自动匹配或让用户选择目标文件 +4. 下载TXT频响文件并转换为CSV格式 +5. 自动填充表单字段(品牌、型号、佩戴方式等) + +**文件上传处理** +- 支持multipart/form-data格式 +- 自动检测文件扩展名并验证格式 +- TXT文件自动转换为CSV格式 +- 上传成功后与型号记录关联 + +**章节来源** +- [frontend/src/views/model/components/ModelFormDialog.vue:1-555](file://frontend/src/views/model/components/ModelFormDialog.vue#L1-L555) +- [backend/src/routes/models.js:307-499](file://backend/src/routes/models.js#L307-L499) +- [backend/src/services/squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) + +### 对话框组件体系 +系统包含5个专用对话框组件,每个组件都有明确的功能边界和使用场景。 + +**CsvViewerDialog** +- 功能:查看CSV频响数据内容 +- 特点:支持S3 Key显示和只读文本区域 +- 适用:仅限特定来源的型号查看 + +**EqCacheDialog** +- 功能:查看EQ缓存的Redis数据 +- 特点:支持JSON树形结构展示,可展开查看嵌套数据 +- 适用:调试和分析EQ参数配置 + +**PushProgressDialog** +- 功能:跟踪批量推送的进度 +- 特点:显示校验和推送两个阶段的状态,支持错误详情 +- 适用:批量型号推送操作 + +**PushViewDialog** +- 功能:查看推送状态和文档详情 +- 特点:简洁的信息展示,支持加载状态 +- 适用:查看单个型号的推送结果 + +**章节来源** +- [frontend/src/views/model/components/CsvViewerDialog.vue:1-50](file://frontend/src/views/model/components/CsvViewerDialog.vue#L1-L50) +- [frontend/src/views/model/components/EqCacheDialog.vue:1-306](file://frontend/src/views/model/components/EqCacheDialog.vue#L1-L306) +- [frontend/src/views/model/components/PushProgressDialog.vue:1-303](file://frontend/src/views/model/components/PushProgressDialog.vue#L1-L303) +- [frontend/src/views/model/components/PushViewDialog.vue:1-60](file://frontend/src/views/model/components/PushViewDialog.vue#L1-L60) + ### 型号数据模型与表单结构 -- 数据模型字段 +- **数据模型字段** - 主键:自增整型 ID - 品牌名称:字符串,最大 100 字符,必填 - 型号名称:字符串,最大 100 字符,必填 @@ -166,66 +297,64 @@ A-->>V : 关闭对话框并刷新列表 - 来源:字符串,最大 100 字符,可空 - EQ 键:字符串,最大 255 字符,可空 - 创建时间:日期,默认当前时间 -- 表单字段与验证 +- **表单字段与验证** - 品牌名称:必填 - 型号名称:必填,长度 1-100 - 形式:可选枚举值 - 阻抗:可选 - 来源:可选 - 频响文件:可选上传,支持 CSV/TXT/JSON,TXT 自动转换为 CSV -- 复杂表单处理 +- **复杂表单处理** - 文件上传采用 multipart/form-data - 新增时若品牌不存在,先尝试创建品牌再保存型号 - 文件名解析:优先按品牌接口返回的品牌名进行最长前缀匹配,否则按首个空格拆分 -章节来源 +**章节来源** - [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22) -- [frontend/src/views/model/index.vue:578-777](file://frontend/src/views/model/index.vue#L578-L777) -- [backend/src/routes/models.js:306-436](file://backend/src/routes/models.js#L306-L436) +- [frontend/src/views/model/components/ModelFormDialog.vue:196-214](file://frontend/src/views/model/components/ModelFormDialog.vue#L196-L214) ### 品牌关联与外键约束 -- 品牌模型 +- **品牌模型** - 主键:自增整型 ID - 名称:唯一、非空、最大 100 字符 -- 型号与品牌的关系 +- **型号与品牌的关系** - 前端通过品牌下拉选择型号所属品牌 - 后端在新增/编辑时检查品牌是否存在,不存在则创建 - - 当前模型字段为字符串类型的“品牌名称”,未建立显式的外键约束 -- 级联与一致性 + - 当前模型字段为字符串类型的"品牌名称",未建立显式的外键约束 +- **级联与一致性** - 若后续迁移为外键关联,建议在数据库层面添加约束,并在删除品牌时处理级联或阻止删除 -章节来源 +**章节来源** - [backend/src/models/Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) - [backend/src/routes/brands.js:1-147](file://backend/src/routes/brands.js#L1-L147) -- [frontend/src/views/model/index.vue:664-693](file://frontend/src/views/model/index.vue#L664-L693) ### 搜索过滤、排序与分页 -- 搜索条件 +- **搜索条件** - 品牌名称(模糊匹配) - 型号名称(模糊匹配) -- 排序 +- **排序** - 支持按 ID 与创建时间排序,升序/降序切换 -- 分页 +- **分页** - 页面大小:10/20/50/100 - 当前页变更时重置为第一页并重新加载 -- 后端实现 +- **后端实现** - 使用 Sequelize 查询构建 where 条件与 order 排序 - 限制每页最大 1000 条,总数统计用于分页控件 -章节来源 -- [frontend/src/views/model/index.vue:541-550](file://frontend/src/views/model/index.vue#L541-L550) -- [frontend/src/views/model/index.vue:695-711](file://frontend/src/views/model/index.vue#L695-L711) +**章节来源** +- [frontend/src/views/model/composables/useModelList.js:18-27](file://frontend/src/views/model/composables/useModelList.js#L18-L27) +- [frontend/src/views/model/composables/useModelList.js:87-111](file://frontend/src/views/model/composables/useModelList.js#L87-L111) - [backend/src/routes/models.js:133-181](file://backend/src/routes/models.js#L133-L181) ### 批量操作与推送搜索 -- 批量复制 - - 支持复制所选项的“品牌+型号”文本 -- 推送搜索 +- **批量复制** + - 支持复制所选项的"品牌+型号"文本 +- **推送搜索** - 校验:对选中型号调用曲线校验服务,返回校验失败项 - 推送:将型号数据批量写入 Meilisearch 索引 - 进度弹窗:显示校验与推送步骤状态、当前处理项与错误明细 -- 多媒体资源 +- **多媒体资源** - 查看 EQ 缓存:读取 Redis Hash 字段,支持展开查看 JSON 结构 - 查看 CSV:仅支持来源为特定值的型号,按佩戴方式拼接 S3 Key 并读取 @@ -233,157 +362,197 @@ A-->>V : 关闭对话框并刷新列表 sequenceDiagram participant U as "用户" participant V as "型号视图" -participant A as "API 模块" +participant PP as "PushProgressDialog" +participant API as "API 模块" participant R as "后端路由" participant C as "曲线校验服务" participant MS as "Meilisearch" -U->>V : 选择多个型号并点击“推送搜索” -V->>A : validatePushToMeilisearch(ids) -A->>R : POST /api/models/push-to-search/validate +U->>V : 选择多个型号并点击"推送搜索" +V->>PP : 打开进度对话框 +PP->>API : validatePushToMeilisearch(ids) +API->>R : POST /api/models/push-to-search/validate R->>C : 校验曲线数据 C-->>R : 校验结果 -R-->>A : 校验错误列表或通过 -A-->>V : 显示校验结果 -U->>V : 确认推送 -V->>A : pushToMeilisearch(ids) -A->>R : POST /api/models/push-to-search +R-->>API : 校验错误列表或通过 +API-->>PP : 显示校验结果 +U->>PP : 确认推送 +PP->>API : pushToMeilisearch(ids) +API->>R : POST /api/models/push-to-search R->>MS : 写入索引 MS-->>R : 任务 UID -R-->>A : 推送结果 -A-->>V : 关闭进度弹窗并刷新 +R-->>API : 推送结果 +API-->>PP : 关闭进度弹窗并刷新 ``` -图表来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) +**图表来源** +- [frontend/src/views/model/index.vue:402-428](file://frontend/src/views/model/index.vue#L402-L428) +- [frontend/src/views/model/components/PushProgressDialog.vue:117-195](file://frontend/src/views/model/components/PushProgressDialog.vue#L117-L195) - [frontend/src/api/model.js:128-150](file://frontend/src/api/model.js#L128-L150) - [backend/src/routes/models.js:466-566](file://backend/src/routes/models.js#L466-L566) -章节来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) +**章节来源** +- [frontend/src/views/model/index.vue:402-428](file://frontend/src/views/model/index.vue#L402-L428) +- [frontend/src/views/model/components/PushProgressDialog.vue:117-195](file://frontend/src/views/model/components/PushProgressDialog.vue#L117-L195) - [frontend/src/api/model.js:128-150](file://frontend/src/api/model.js#L128-L150) -- [backend/src/routes/models.js:466-566](file://backend/src/routes/models.js#L466-L566) ### 频响文件上传与存储优化 -- 支持格式 +- **支持格式** - CSV、TXT、JSON - TXT 自动转换为 CSV(保留频率与幅度列) -- 存储路径 +- **存储路径** - S3 Key 规则:autoeq/measurements/{source}/data/{form}/{brandFirstChar}/{brand model}.csv - 上传成功后将 S3 Key 与型号记录关联 -- 读取与展示 +- **读取与展示** - 仅对特定来源与完整字段的型号允许读取 S3 中的 CSV 内容 - 提供弹窗展示 CSV 文本内容 -章节来源 +**章节来源** - [backend/src/routes/models.js:59-68](file://backend/src/routes/models.js#L59-L68) - [backend/src/services/measurementStorage.js:48-108](file://backend/src/services/measurementStorage.js#L48-L108) -- [backend/src/routes/models.js:246-278](file://backend/src/routes/models.js#L246-L278) +- [frontend/src/views/model/components/CsvViewerDialog.vue:1-50](file://frontend/src/views/model/components/CsvViewerDialog.vue#L1-L50) -### EQ 缓存查看与动态配置 -- Redis Key 规则:{品牌名称} {型号名称} -- 功能 +### EQ缓存查看与动态配置 +- **Redis Key 规则**:{品牌名称} {型号名称} +- **功能** - 列出可用的 Hash Key - 展示指定 Key 的 JSON 值(带层级与图标) - 支持加载状态指示与空状态提示 -- 适用场景 +- **适用场景** - 动态配置 EQ 参数、调试频响数据结构 -章节来源 +**章节来源** - [backend/src/services/eqCacheStorage.js:24-66](file://backend/src/services/eqCacheStorage.js#L24-L66) -- [backend/src/routes/models.js:183-223](file://backend/src/routes/models.js#L183-L223) -- [frontend/src/views/model/index.vue:303-383](file://frontend/src/views/model/index.vue#L303-L383) +- [frontend/src/views/model/components/EqCacheDialog.vue:1-306](file://frontend/src/views/model/components/EqCacheDialog.vue#L1-L306) ### 表单字段解析与文件名智能填充 -- 文件名预处理:去除扩展名、合并多余空格 -- 品牌解析策略 +- **文件名预处理**:去除扩展名、合并多余空格 +- **品牌解析策略** - 优先使用品牌接口返回的品牌名进行最长前缀匹配(支持多词品牌) - - 回退为“第一个空格”左侧为品牌、右侧为型号 -- 默认阻抗:新增时若未填写,按规则自动填充 + - 回退为"第一个空格"左侧为品牌、右侧为型号 +- **默认阻抗**:新增时若未填写,按规则自动填充 -章节来源 -- [frontend/src/views/model/index.vue:588-637](file://frontend/src/views/model/index.vue#L588-L637) -- [frontend/src/views/model/index.vue:640-655](file://frontend/src/views/model/index.vue#L640-L655) +**章节来源** +- [frontend/src/views/model/components/ModelFormDialog.vue:233-265](file://frontend/src/views/model/components/ModelFormDialog.vue#L233-L265) + +### Squig.link外部数据导入 +**新增功能**:系统现在支持从squig.link网站导入频响数据。 + +**工作原理** +- **URL解析**:解析squig.link分享URL,提取基础URL和分享参数 +- **清单获取**:获取phone_book.json文件,列出所有可用的测量数据 +- **文件匹配**:根据分享参数精确匹配或模糊匹配目标文件 +- **数据抓取**:下载TXT频响文件并转换为CSV格式 +- **信息提取**:从文件名解析品牌和型号信息 +- **自动填充**:自动填充表单字段(品牌、型号、佩戴方式等) + +**支持的URL格式** +- `https://theaudiostore.squig.link/?share=Nostalgia_Audio_Camelot` +- `https://squig.link/?share=Moondrop_Chu_2` + +**章节来源** +- [frontend/src/api/model.js:157-165](file://frontend/src/api/model.js#L157-L165) +- [backend/src/routes/models.js:307-369](file://backend/src/routes/models.js#L307-L369) +- [backend/src/services/squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) ## 依赖关系分析 -- 前端依赖 +- **前端依赖** - Element Plus UI 组件库 - Axios 请求封装 - - Vue Router 路由守卫 -- 后端依赖 + - Vue 3 Composition API(组合式函数) + - vue-json-pretty JSON展示组件 +- **后端依赖** - Express 路由 - Sequelize ORM - AWS SDK(S3) - Redis 客户端 - Meilisearch 客户端 + - axios(外部数据抓取) ```mermaid graph LR -FE_View["前端视图
index.vue"] --> FE_API["前端 API
model.js/brand.js"] +FE_View["前端视图
index.vue"] --> FE_useModelList["组合式函数
useModelList.js"] +FE_useModelList --> FE_API["前端 API
model.js/brand.js"] FE_API --> FE_Request["请求封装
request.js"] FE_API --> BE_Routes["后端路由
models.js/brands.js"] BE_Routes --> BE_Models["数据模型
Model.js/Brand.js"] -BE_Routes --> BE_Services["服务层
measurementStorage.js/eqCacheStorage.js"] +BE_Routes --> BE_Services["服务层
measurementStorage.js/eqCacheStorage.js/squiglink.js"] BE_Routes --> S3["S3 存储"] BE_Routes --> Redis["Redis 缓存"] BE_Routes --> MS["Meilisearch"] ``` -图表来源 -- [frontend/src/views/model/index.vue:1-1575](file://frontend/src/views/model/index.vue#L1-L1575) -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [frontend/src/api/brand.js:1-66](file://frontend/src/api/brand.js#L1-L66) -- [frontend/src/utils/request.js:1-72](file://frontend/src/utils/request.js#L1-L72) -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) -- [backend/src/routes/brands.js:1-147](file://backend/src/routes/brands.js#L1-L147) -- [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) -- [backend/src/models/Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) -- [backend/src/services/measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) -- [backend/src/services/eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) +**图表来源** +- [frontend/src/views/model/index.vue:227-434](file://frontend/src/views/model/index.vue#L227-L434) +- [frontend/src/views/model/composables/useModelList.js:1-191](file://frontend/src/views/model/composables/useModelList.js#L1-L191) +- [frontend/src/api/model.js:1-165](file://frontend/src/api/model.js#L1-L165) +- [backend/src/routes/models.js:1-659](file://backend/src/routes/models.js#L1-L659) -章节来源 +**章节来源** - [frontend/src/router/index.js:1-91](file://frontend/src/router/index.js#L1-L91) - [frontend/src/utils/request.js:1-72](file://frontend/src/utils/request.js#L1-L72) ## 性能考虑 -- 分页与排序 +- **分页与排序** - 后端限制每页最大 1000 条,避免一次性传输大量数据 - 排序字段限定为 ID 与创建时间,减少复杂索引需求 -- 文件上传 +- **文件上传** - 仅允许特定格式,TXT 自动转换降低客户端处理成本 - S3 上传采用内存存储,注意控制文件大小与并发 -- 缓存与索引 +- **缓存与索引** - EQ 缓存仅列出 Hash Key,避免一次性返回大体积 JSON - 推送搜索采用异步任务与进度弹窗,提升用户体验 +- **squig.link抓取** + - 使用内存缓存squigsites.json,减少外部请求频率 + - 并行处理多项操作,提高响应速度 + +**章节来源** +- [backend/src/services/squiglink.js:33-48](file://backend/src/services/squiglink.js#L33-L48) ## 故障排查指南 -- 登录与鉴权 +- **登录与鉴权** - 401:令牌失效或缺失,自动跳转登录页 - 403:无权限执行操作 -- 网络与超时 +- **网络与超时** - 请求超时:检查后端服务与网络连通性 - 响应错误:查看控制台日志与消息提示 -- 品牌与型号 +- **品牌与型号** - 品牌名称重复:确保品牌唯一性 - 型号重复:同一品牌下型号名称唯一 -- 文件上传 +- **文件上传** - 不支持的文件格式:确认扩展名为 CSV/TXT/JSON - TXT 转换失败:检查文件内容格式是否符合预期 -- S3 与 Redis +- **S3 与 Redis** - 读取失败:确认 S3 Key 是否正确、对象是否存在 - 缓存为空:确认型号 EQ 缓存是否已生成 +- **squig.link导入** + - URL格式错误:确认使用标准的squig.link分享链接 + - 数据抓取失败:检查网络连接和目标网站可用性 + - 文件匹配失败:确认分享参数与目标文件名匹配 -章节来源 +**章节来源** - [frontend/src/utils/request.js:27-69](file://frontend/src/utils/request.js#L27-L69) - [backend/src/routes/brands.js:59-81](file://backend/src/routes/brands.js#L59-L81) -- [backend/src/routes/models.js:306-361](file://backend/src/routes/models.js#L306-L361) +- [backend/src/routes/models.js:371-499](file://backend/src/routes/models.js#L371-L499) - [backend/src/services/measurementStorage.js:87-108](file://backend/src/services/measurementStorage.js#L87-L108) - [backend/src/services/eqCacheStorage.js:47-66](file://backend/src/services/eqCacheStorage.js#L47-L66) +- [backend/src/services/squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) ## 结论 -型号管理页面提供了完整的型号生命周期管理能力:从列表检索、表单录入与校验,到文件上传与外部系统集成(S3、Redis、Meilisearch),再到批量操作与可视化展示。当前实现以字符串关联品牌,具备良好的扩展性;建议在后续版本中引入外键约束与更严格的级联策略,进一步提升数据一致性与安全性。 +型号管理页面经过重构后,现已成为一个功能完整、架构清晰的现代化管理系统。通过useModelList组合式函数实现了状态管理的统一化,通过5个专用对话框组件提供了丰富的用户交互体验,通过squig.link导入功能扩展了数据来源的多样性。 + +系统的主要优势包括: +- **模块化设计**:组合式函数和对话框组件的分离提高了代码的可维护性 +- **用户体验优化**:完整的进度跟踪和错误处理提升了用户满意度 +- **数据来源多样化**:支持本地文件上传和外部网站数据导入 +- **扩展性强**:基于Vue 3 Composition API的设计便于功能扩展 + +建议在后续版本中继续完善: +- 添加更多外部数据源的支持 +- 增强数据验证和错误恢复机制 +- 优化大数据量场景下的性能表现 ## 附录 -- API 一览 +- **API 一览** - 获取型号列表:GET /api/models/ - 获取单个型号:GET /api/models/:id - 创建型号:POST /api/models/ @@ -400,9 +569,10 @@ BE_Routes --> MS["Meilisearch"] - 创建品牌:POST /api/brands/ - 更新品牌:PUT /api/brands/:id - 删除品牌:DELETE /api/brands/:id + - **新增**:squig.link数据抓取:POST /api/models/squiglink-fetch -章节来源 -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) +**章节来源** +- [frontend/src/api/model.js:1-165](file://frontend/src/api/model.js#L1-L165) - [frontend/src/api/brand.js:1-66](file://frontend/src/api/brand.js#L1-L66) -- [backend/src/routes/models.js:133-566](file://backend/src/routes/models.js#L133-L566) +- [backend/src/routes/models.js:133-659](file://backend/src/routes/models.js#L133-L659) - [backend/src/routes/brands.js:14-147](file://backend/src/routes/brands.js#L14-L147) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/后端API文档/型号管理API.md b/.qoder/repowiki/zh/content/后端API文档/型号管理API.md index 7fcdcdc..1848f1c 100644 --- a/.qoder/repowiki/zh/content/后端API文档/型号管理API.md +++ b/.qoder/repowiki/zh/content/后端API文档/型号管理API.md @@ -10,8 +10,18 @@ - [frontend/src/api/model.js](file://frontend/src/api/model.js) - [backend/src/models/Ota.js](file://backend/src/models/Ota.js) - [backend/src/routes/ota.js](file://backend/src/routes/ota.js) +- [backend/src/services/squiglink.js](file://backend/src/services/squiglink.js) +- [frontend/src/views/model/components/ModelFormDialog.vue](file://frontend/src/views/model/components/ModelFormDialog.vue) +## 更新摘要 +**变更内容** +- 新增squig.link外部URL数据源抓取功能 +- 增强模型创建/更新流程支持外部频响数据源 +- 添加squiglink_csv字段支持直接上传CSV内容 +- 新增squiglink-fetch接口用于从外部URL获取频响数据 +- 前端ModelFormDialog组件集成squig.link导入功能 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) @@ -24,63 +34,74 @@ 9. [结论](#结论) ## 简介 -本文件为型号管理API的详细RESTful API文档,覆盖型号的CRUD操作、查询筛选与排序、数据验证规则,以及与OTA固件的一对多关联关系与级联操作。文档同时提供前端调用示例与后端实现细节,帮助开发者快速集成与维护。 +本文件为型号管理API的详细RESTful API文档,覆盖型号的CRUD操作、查询筛选与排序、数据验证规则,以及与OTA固件的一对多关联关系与级联操作。文档同时提供前端调用示例与后端实现细节,帮助开发者快速集成与维护。**最新更新**:新增squig.link外部数据源支持,增强模型创建/更新流程以支持外部URL数据源。 ## 项目结构 型号管理API位于后端Express应用中,采用模块化设计: -- 路由层:集中于 models.js,提供型号的增删改查、搜索推送、频响文件处理等接口 +- 路由层:集中于 models.js,提供型号的增删改查、搜索推送、频响文件处理、**squig.link数据抓取**等接口 - 模型层:Model.js 定义数据库表结构 - 验证层:model.js 使用Zod进行请求体验证 - 工具层:response.js 统一响应格式 - 中间件:auth.js 提供鉴权保护 +- **服务层**:squiglink.js 提供squig.link外部数据源抓取服务 - 前端封装:frontend/src/api/model.js 提供HTTP调用封装 +- **前端组件**:ModelFormDialog.vue 集成squig.link导入功能 ```mermaid graph TB -FE["前端应用
frontend/src/api/model.js"] --> R["路由层
backend/src/routes/models.js"] +FE["前端应用
frontend/src/api/model.js
frontend/src/views/model/components/ModelFormDialog.vue"] --> R["路由层
backend/src/routes/models.js"] R --> M["模型层
backend/src/models/Model.js"] R --> V["验证层
backend/src/validators/model.js"] R --> U["工具层
backend/src/utils/response.js"] R --> A["中间件
backend/src/middleware/auth.js"] +R --> S["服务层
backend/src/services/squiglink.js"] R -. 关联 .-> OTA["OTA模型
backend/src/models/Ota.js"] ``` -图表来源 -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) +**图表来源** +- [backend/src/routes/models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:1-36](file://backend/src/middleware/auth.js#L1-L36) -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) +- [frontend/src/api/model.js:1-165](file://frontend/src/api/model.js#L1-L165) - [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97) +- [backend/src/services/squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) +- [frontend/src/views/model/components/ModelFormDialog.vue:1-555](file://frontend/src/views/model/components/ModelFormDialog.vue#L1-L555) -章节来源 -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) +**章节来源** +- [backend/src/routes/models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:1-36](file://backend/src/middleware/auth.js#L1-L36) -- [frontend/src/api/model.js:1-151](file://frontend/src/api/model.js#L1-L151) +- [frontend/src/api/model.js:1-165](file://frontend/src/api/model.js#L1-L165) - [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97) +- [backend/src/services/squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) +- [frontend/src/views/model/components/ModelFormDialog.vue:1-555](file://frontend/src/views/model/components/ModelFormDialog.vue#L1-L555) ## 核心组件 -- 路由控制器:models.js 提供型号的列表查询、详情获取、创建、更新、删除、搜索推送、频响文件上传与查询等接口 +- 路由控制器:models.js 提供型号的列表查询、详情获取、创建、更新、删除、搜索推送、频响文件上传与查询、**squig.link数据抓取**等接口 - 数据模型:Model.js 定义型号字段及约束 - 请求验证:model.js 使用Zod Schema进行创建/更新的输入校验 - 统一响应:response.js 提供统一的响应结构 - 鉴权中间件:auth.js 实现Bearer Token鉴权 +- **squig.link服务**:squiglink.js 提供外部数据源抓取功能 - 前端封装:frontend/src/api/model.js 提供HTTP调用封装 +- **前端组件**:ModelFormDialog.vue 集成squig.link导入功能 -章节来源 +**章节来源** - [backend/src/routes/models.js:133-181](file://backend/src/routes/models.js#L133-L181) - [backend/src/models/Model.js:4-50](file://backend/src/models/Model.js#L4-L50) - [backend/src/validators/model.js:3-19](file://backend/src/validators/model.js#L3-L19) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) -- [frontend/src/api/model.js:13-150](file://frontend/src/api/model.js#L13-L150) +- [backend/src/services/squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) +- [frontend/src/api/model.js:13-165](file://frontend/src/api/model.js#L13-L165) +- [frontend/src/views/model/components/ModelFormDialog.vue:158-464](file://frontend/src/views/model/components/ModelFormDialog.vue#L158-L464) ## 架构概览 -型号管理API采用分层架构,路由层负责HTTP协议与参数解析,模型层负责数据持久化,验证层确保输入合法性,工具层统一输出格式,中间件提供安全控制。 +型号管理API采用分层架构,路由层负责HTTP协议与参数解析,模型层负责数据持久化,验证层确保输入合法性,工具层统一输出格式,中间件提供安全控制,**服务层提供外部数据源集成**。 ```mermaid sequenceDiagram @@ -88,6 +109,7 @@ participant C as "客户端" participant R as "路由(models.js)" participant V as "验证(model.js)" participant M as "模型(Model.js)" +participant S as "服务(squiglink.js)" participant U as "响应(response.js)" participant A as "鉴权(auth.js)" C->>R : "HTTP请求" @@ -95,16 +117,19 @@ R->>A : "鉴权检查" A-->>R : "通过/拒绝" R->>V : "请求体验证" V-->>R : "验证结果" +R->>S : "外部数据源抓取可选" +S-->>R : "抓取结果" R->>M : "数据库操作" M-->>R : "结果" R->>U : "封装响应" U-->>C : "统一响应" ``` -图表来源 -- [backend/src/routes/models.js:307-361](file://backend/src/routes/models.js#L307-L361) +**图表来源** +- [backend/src/routes/models.js:307-369](file://backend/src/routes/models.js#L307-L369) - [backend/src/validators/model.js:3-19](file://backend/src/validators/model.js#L3-L19) - [backend/src/models/Model.js:4-50](file://backend/src/models/Model.js#L4-L50) +- [backend/src/services/squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) @@ -135,10 +160,10 @@ datetime create_at } ``` -图表来源 +**图表来源** - [backend/src/models/Model.js:4-50](file://backend/src/models/Model.js#L4-L50) -章节来源 +**章节来源** - [backend/src/models/Model.js:4-50](file://backend/src/models/Model.js#L4-L50) ### 型号参数验证规则 @@ -149,7 +174,7 @@ datetime create_at - 更新请求体验证: - 字段同上,但允许部分字段为空(表示不更新) -章节来源 +**章节来源** - [backend/src/validators/model.js:3-19](file://backend/src/validators/model.js#L3-L19) ### 型号CRUD接口 @@ -167,7 +192,7 @@ datetime create_at - 成功响应:包含items、total、skip、limit的分页数据 - 异常响应:统一错误码与消息 -章节来源 +**章节来源** - [backend/src/routes/models.js:133-181](file://backend/src/routes/models.js#L133-L181) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) @@ -179,7 +204,7 @@ datetime create_at - 成功响应:型号基础字段 - 异常响应:未找到或通用错误 -章节来源 +**章节来源** - [backend/src/routes/models.js:280-304](file://backend/src/routes/models.js#L280-L304) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) @@ -190,16 +215,20 @@ datetime create_at - 内容类型:multipart/form-data - 表单字段: - measurement_file:频响文件(CSV/TXT/JSON),可选 + - **squiglink_csv**:squig.link抓取的CSV内容,可选 - brand_name、name、form、rig、source、eq_key - 文件处理: + - **优先级**:squiglink_csv > measurement_file > 无文件 - TXT文件自动转换为CSV - 仅允许.csv、.txt、.json - 上传至S3,键值包含source、form、brand_name、name - 成功响应:创建后的型号信息 - 异常响应:重复、格式不支持、通用错误 -章节来源 -- [backend/src/routes/models.js:306-361](file://backend/src/routes/models.js#L306-L361) +**更新** 新增squiglink_csv字段支持直接上传CSV内容 + +**章节来源** +- [backend/src/routes/models.js:371-437](file://backend/src/routes/models.js#L371-L437) - [backend/src/validators/model.js:3-10](file://backend/src/validators/model.js#L3-L10) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) @@ -214,8 +243,8 @@ datetime create_at - 成功响应:更新后的型号信息 - 异常响应:未找到、重复、格式不支持、通用错误 -章节来源 -- [backend/src/routes/models.js:363-436](file://backend/src/routes/models.js#L363-L436) +**章节来源** +- [backend/src/routes/models.js:439-526](file://backend/src/routes/models.js#L439-L526) - [backend/src/validators/model.js:12-19](file://backend/src/validators/model.js#L12-L19) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) @@ -230,8 +259,8 @@ datetime create_at - 成功响应:删除成功 - 异常响应:未找到、Meilisearch删除失败、通用错误 -章节来源 -- [backend/src/routes/models.js:438-464](file://backend/src/routes/models.js#L438-L464) +**章节来源** +- [backend/src/routes/models.js:528-554](file://backend/src/routes/models.js#L528-L554) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) @@ -240,7 +269,7 @@ datetime create_at - 支持按id或create_at排序,升序/降序 - 分页参数:skip、limit(上限1000) -章节来源 +**章节来源** - [backend/src/routes/models.js:136-157](file://backend/src/routes/models.js#L136-L157) ### 型号与OTA固件的一对多关联 @@ -264,11 +293,11 @@ string model } ``` -图表来源 +**图表来源** - [backend/src/models/Model.js:4-50](file://backend/src/models/Model.js#L4-L50) - [backend/src/models/Ota.js:44-48](file://backend/src/models/Ota.js#L44-L48) -章节来源 +**章节来源** - [backend/src/models/Ota.js:44-48](file://backend/src/models/Ota.js#L44-L48) ### Meilisearch搜索推送与校验 @@ -279,15 +308,15 @@ string model - 输入:model_ids数组 - 输出:推送成功数量、任务ID与推送数据 -章节来源 -- [backend/src/routes/models.js:466-566](file://backend/src/routes/models.js#L466-L566) +**章节来源** +- [backend/src/routes/models.js:556-656](file://backend/src/routes/models.js#L556-L656) ### 频响文件上传与查询 -- 上传:POST /api/models/(multipart/form-data),支持TXT自动转换为CSV +- 上传:POST /api/models/(multipart/form-data),支持TXT自动转换为CSV,**新增squiglink_csv字段** - 查询:GET /api/models/:model_id/measurement(仅Eafonyoung来源且存在form时可用) -章节来源 -- [backend/src/routes/models.js:306-361](file://backend/src/routes/models.js#L306-L361) +**章节来源** +- [backend/src/routes/models.js:371-437](file://backend/src/routes/models.js#L371-L437) - [backend/src/routes/models.js:246-278](file://backend/src/routes/models.js#L246-L278) ### EQ缓存与Meilisearch文档查询 @@ -295,13 +324,53 @@ string model - 获取指定Hash Field:GET /api/models/:model_id/eq-cache/field?key=... - 查询Meilisearch推送状态:GET /api/models/:model_id/meilisearch -章节来源 +**章节来源** - [backend/src/routes/models.js:183-244](file://backend/src/routes/models.js#L183-L244) +### Squig.link外部数据源集成 + +#### Squig.link数据抓取接口 +- 方法与路径:POST /api/models/squiglink-fetch +- 认证:需要登录 +- 请求体参数: + - share_url:squig.link分享链接(必填) + - selected_file:用户选择的特定文件名(可选) +- 功能特性: + - **自动抓取**:根据share_url自动解析并抓取频响数据 + - **候选选择**:当存在多个匹配文件时,返回候选列表供用户选择 + - **直接下载**:当提供selected_file时,直接下载指定文件 + - **佩戴方式检测**:从squigsites.json自动检测佩戴方式 +- 响应格式: + - 单个匹配:返回brand_name、model_name、form、csv_content、data_url + - 多个匹配:返回matches候选列表 + - 错误:返回具体的抓取失败原因 + +#### Squig.link服务功能 +- **URL解析**:解析squig.link分享URL,提取baseURL和share参数 +- **站点发现**:从https://squig.link/squigsites.json获取站点配置 +- **文件匹配**:在phone_book.json中查找匹配的测量文件 +- **数据下载**:支持多种文件后缀的频响数据下载 +- **格式转换**:将TXT文件转换为CSV格式 +- **缓存机制**:squigsites.json内存缓存(1小时TTL) + +#### 前端集成 +- **ModelFormDialog组件**:集成squig.link导入功能 +- **自动填充**:抓取成功后自动填充品牌、型号、佩戴方式等字段 +- **候选选择**:多文件匹配时提供选择对话框 +- **实时预览**:显示数据URL便于验证 + +**新增** 完整的squig.link外部数据源支持 + +**章节来源** +- [backend/src/routes/models.js:307-369](file://backend/src/routes/models.js#L307-L369) +- [backend/src/services/squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) +- [frontend/src/views/model/components/ModelFormDialog.vue:158-464](file://frontend/src/views/model/components/ModelFormDialog.vue#L158-L464) + ## 依赖分析 -- 路由依赖:models.js 依赖Model模型、Zod验证器、响应工具、鉴权中间件,并与Meilisearch、S3服务交互 +- 路由依赖:models.js 依赖Model模型、Zod验证器、响应工具、鉴权中间件,并与Meilisearch、S3服务交互,**新增squiglink服务依赖** - 模型依赖:Model.js 依赖Sequelize ORM - 前端依赖:frontend/src/api/model.js 依赖通用请求封装 +- **服务依赖**:squiglink.js 依赖axios、logger,提供外部数据源抓取功能 ```mermaid graph LR @@ -309,25 +378,30 @@ R["models.js"] --> M["Model.js"] R --> V["model.js(Zod)"] R --> U["response.js"] R --> A["auth.js"] +R --> S["squiglink.js"] R -. 外部 .-> MS["Meilisearch"] R -. 外部 .-> S3["S3存储"] +S -. 外部 .-> SL["squig.link"] ``` -图表来源 -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) +**图表来源** +- [backend/src/routes/models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25) - [backend/src/middleware/auth.js:1-36](file://backend/src/middleware/auth.js#L1-L36) +- [backend/src/services/squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) -章节来源 -- [backend/src/routes/models.js:1-569](file://backend/src/routes/models.js#L1-L569) +**章节来源** +- [backend/src/routes/models.js:1-659](file://backend/src/routes/models.js#L1-L659) ## 性能考虑 - 分页限制:列表查询limit上限为1000,避免一次性返回过多数据 - Meilisearch超时:查询与删除文档设置超时,防止阻塞 - 文件上传:内存存储multer,建议在高并发场景下优化为流式处理或外部对象存储直传 - 验证前置:使用Zod在进入数据库操作前完成字段校验,减少无效请求 +- **squig.link抓取超时**:设置15秒超时,避免外部服务影响系统性能 +- **squigsites.json缓存**:1小时TTL减少对外部服务的频繁请求 ## 故障排除指南 - 401 未登录/无效凭证:检查Authorization头是否为Bearer Token且有效 @@ -336,12 +410,15 @@ R -. 外部 .-> S3["S3存储"] - 重复型号:创建/更新时如提示品牌+型号已存在,请调整参数 - 文件格式不支持:仅允许.csv、.txt、.json,TXT会自动转换为CSV - Meilisearch异常:检查服务连通性与API密钥 +- **squig.link抓取失败**:检查share_url格式、网络连通性、目标站点可用性 +- **squig.link文件下载失败**:确认文件存在、权限正确、支持的文件后缀 -章节来源 +**章节来源** - [backend/src/middleware/auth.js:3-26](file://backend/src/middleware/auth.js#L3-L26) - [backend/src/routes/models.js:314-317](file://backend/src/routes/models.js#L314-L317) - [backend/src/routes/models.js:322-325](file://backend/src/routes/models.js#L322-L325) - [backend/src/routes/models.js:450-455](file://backend/src/routes/models.js#L450-L455) +- [backend/src/services/squiglink.js:33-47](file://backend/src/services/squiglink.js#L33-L47) ## 结论 -型号管理API提供了完善的CRUD能力、灵活的查询过滤与排序、严格的输入验证、以及与搜索与存储系统的集成。结合OTA模型的关联关系,可支撑从型号到固件升级的完整业务闭环。建议在生产环境中关注分页与超时配置、文件上传性能与安全策略,并在删除型号前做好OTA关联清理。 \ No newline at end of file +型号管理API提供了完善的CRUD能力、灵活的查询过滤与排序、严格的输入验证、以及与搜索与存储系统的集成。**最新更新**:新增squig.link外部数据源支持,显著提升了型号数据的获取效率和准确性。结合OTA模型的关联关系,可支撑从型号到固件升级的完整业务闭环。建议在生产环境中关注分页与超时配置、文件上传性能与安全策略、**squig.link抓取的超时与缓存策略**,并在删除型号前做好OTA关联清理。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/核心功能模块/型号管理.md b/.qoder/repowiki/zh/content/核心功能模块/型号管理.md index dea90a8..851d105 100644 --- a/.qoder/repowiki/zh/content/核心功能模块/型号管理.md +++ b/.qoder/repowiki/zh/content/核心功能模块/型号管理.md @@ -6,13 +6,22 @@ - [Brand.js](file://backend/src/models/Brand.js) - [model.js](file://backend/src/validators/model.js) - [models.js](file://backend/src/routes/models.js) +- [squiglink.js](file://backend/src/services/squiglink.js) - [measurementStorage.js](file://backend/src/services/measurementStorage.js) - [eqCacheStorage.js](file://backend/src/services/eqCacheStorage.js) - [curveClient.js](file://backend/src/services/curveClient.js) - [index.vue](file://frontend/src/views/model/index.vue) +- [ModelFormDialog.vue](file://frontend/src/views/model/components/ModelFormDialog.vue) - [model.js](file://frontend/src/api/model.js) +## 更新摘要 +**变更内容** +- 新增squig.link集成服务,支持从外部频率响应数据源自动获取数据 +- 增强前端导入功能,支持从squig.link分享链接直接抓取频响数据 +- 新增自动佩戴方式检测和品牌/型号解析功能 +- 扩展型号创建和更新流程,支持squiglink_csv参数 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) @@ -26,10 +35,10 @@ 10. [附录](#附录) ## 简介 -本文件围绕“型号管理”功能进行系统性说明,涵盖型号的 CRUD 操作、技术规格管理、测量数据存储与检索、以及与品牌模型的一对一关联关系。文档基于实际代码库实现,提供接口调用流程、数据验证规则、存储策略与常见问题的解决方案,并给出面向初学者与高级开发者的分层解读。 +本文件围绕"型号管理"功能进行系统性说明,涵盖型号的 CRUD 操作、技术规格管理、测量数据存储与检索、与品牌模型的一对一关联关系,以及**新增的squig.link集成服务**。文档基于实际代码库实现,提供接口调用流程、数据验证规则、存储策略与常见问题的解决方案,并给出面向初学者与高级开发者的分层解读。 ## 项目结构 -型号管理功能由前端视图、API 客户端与后端路由/模型/服务共同组成,形成“前端交互—HTTP 请求—后端路由—数据模型—外部存储”的完整链路。 +型号管理功能由前端视图、API 客户端与后端路由/模型/服务共同组成,形成"前端交互—HTTP 请求—后端路由—数据模型—外部存储—squig.link集成"的完整链路。 ```mermaid graph TB @@ -40,45 +49,50 @@ ROUTER --> VALIDATOR["型号验证器
backend/src/validators/model.js"] ROUTER --> MSVC["频响存储服务
backend/src/services/measurementStorage.js"] ROUTER --> ESVC["EQ 缓存服务
backend/src/services/eqCacheStorage.js"] ROUTER --> CSVC["曲线校验服务
backend/src/services/curveClient.js"] +ROUTER --> SSVC["squig.link集成服务
backend/src/services/squiglink.js"] ROUTER --> BRAND["品牌模型
backend/src/models/Brand.js"] ``` -图表来源 +**图表来源** - [index.vue:1-1226](file://frontend/src/views/model/index.vue#L1-L1226) -- [model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [models.js:1-569](file://backend/src/routes/models.js#L1-L569) +- [model.js:1-165](file://frontend/src/api/model.js#L1-L165) +- [models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) - [eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) - [curveClient.js:1-147](file://backend/src/services/curveClient.js#L1-L147) +- [squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) -章节来源 +**章节来源** - [index.vue:1-1226](file://frontend/src/views/model/index.vue#L1-L1226) -- [model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [models.js:1-569](file://backend/src/routes/models.js#L1-L569) +- [model.js:1-165](file://frontend/src/api/model.js#L1-L165) +- [models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) - [eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) - [curveClient.js:1-147](file://backend/src/services/curveClient.js#L1-L147) +- [squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) ## 核心组件 - 型号模型:定义型号的数据结构与约束,包括品牌名称、型号名称、形式、阻抗、来源、EQ 键等字段。 - 品牌模型:与型号存在一对一关联,型号通过品牌名称进行关联。 - 型号验证器:使用 Zod 对创建/更新请求体进行严格校验。 -- 型号路由:提供列表查询、详情查看、新增、更新、删除、搜索推送、频响 CSV 查看、EQ 缓存查看等接口。 +- 型号路由:提供列表查询、详情查看、新增、更新、删除、搜索推送、频响 CSV 查看、EQ 缓存查看、**squig.link数据抓取**等接口。 +- **squig.link集成服务**:支持从外部频率响应数据源自动获取数据,包括URL解析、数据抓取、格式转换、品牌/型号解析等功能。 - 测量存储服务:负责将频响 CSV/文本文件上传至 S3,并支持按路径键读取。 - EQ 缓存服务:通过 Redis 提供型号 EQ 数据的哈希字段列表与具体值读取。 - 曲线校验服务:对接外部曲线 API,校验型号的 parametric_eq 数据有效性。 -章节来源 +**章节来源** - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) - [model.js:1-22](file://backend/src/validators/model.js#L1-L22) -- [models.js:133-566](file://backend/src/routes/models.js#L133-L566) +- [models.js:133-659](file://backend/src/routes/models.js#L133-L659) +- [squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) - [measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) - [eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) - [curveClient.js:1-147](file://backend/src/services/curveClient.js#L1-L147) @@ -86,8 +100,8 @@ ROUTER --> BRAND["品牌模型
backend/src/models/Brand.js"] ## 架构总览 型号管理的端到端流程如下: - 前端通过 API 客户端发起请求,后端路由接收并进行鉴权与参数校验。 -- 路由根据业务逻辑调用模型层与服务层,完成数据库读写、外部存储交互与第三方校验。 -- 前端渲染结果,支持批量推送至搜索引擎、查看频响 CSV、查看 EQ 缓存等。 +- 路由根据业务逻辑调用模型层与服务层,完成数据库读写、外部存储交互、第三方校验以及**squig.link数据抓取**。 +- 前端渲染结果,支持批量推送至搜索引擎、查看频响 CSV、查看 EQ 缓存等,**以及从squig.link直接导入数据**。 ```mermaid sequenceDiagram @@ -96,11 +110,12 @@ participant FE as "前端视图" participant API as "API 客户端" participant RT as "后端路由(models.js)" participant MD as "型号模型(Model.js)" +participant SS as "squig.link服务(squiglink.js)" participant MS as "频响存储(measurementStorage.js)" participant ES as "EQ 缓存(eqCacheStorage.js)" participant CS as "曲线校验(curveClient.js)" U->>FE : 打开型号页面 -FE->>API : 发起列表/详情/新增/更新/删除请求 +FE->>API : 发起列表/详情/新增/更新/删除/抓取请求 API->>RT : HTTP 请求 alt 查询列表/详情 RT->>MD : 读取数据库 @@ -108,7 +123,9 @@ MD-->>RT : 返回数据 else 新增/更新 RT->>MD : 写入数据库 MD-->>RT : 返回新记录 -opt 上传频响文件 +opt 上传频响文件或squig.link数据 +RT->>SS : 抓取squig.link数据可选 +SS-->>RT : 返回CSV内容和元数据 RT->>MS : 上传CSV/文本至S3 MS-->>RT : 返回S3 Key end @@ -120,14 +137,15 @@ RT-->>API : 返回响应 API-->>FE : 渲染结果 ``` -图表来源 -- [models.js:133-566](file://backend/src/routes/models.js#L133-L566) +**图表来源** +- [models.js:133-659](file://backend/src/routes/models.js#L133-L659) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) +- [squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) - [measurementStorage.js:61-108](file://backend/src/services/measurementStorage.js#L61-L108) - [eqCacheStorage.js:24-66](file://backend/src/services/eqCacheStorage.js#L24-L66) - [curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138) - [index.vue:714-1063](file://frontend/src/views/model/index.vue#L714-L1063) -- [model.js:13-151](file://frontend/src/api/model.js#L13-L151) +- [model.js:13-165](file://frontend/src/api/model.js#L13-L165) ## 详细组件分析 @@ -155,11 +173,11 @@ datetime create_at BRAND ||--o{ MODEL : "拥有多个型号" ``` -图表来源 +**图表来源** - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) -章节来源 +**章节来源** - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) @@ -168,18 +186,18 @@ BRAND ||--o{ MODEL : "拥有多个型号" - 更新验证器:允许部分字段可选更新,其余规则与创建一致。 - 返回值:验证通过后进入业务流程,失败则返回错误信息。 -章节来源 +**章节来源** - [model.js:1-22](file://backend/src/validators/model.js#L1-L22) ### 型号 CRUD 与查询接口 - 列表查询:支持按品牌名称、型号名称模糊过滤,支持按 id 或创建时间排序,支持分页与跳过。 - 详情查看:按 id 获取单条型号信息。 -- 新增:支持上传频响文件(CSV/TXT/JSON),自动转换 TXT 为 CSV;若存在同品牌同型号则拒绝重复创建。 +- 新增:支持上传频响文件(CSV/TXT/JSON)或**squiglink_csv参数**,自动转换 TXT 为 CSV;若存在同品牌同型号则拒绝重复创建。 - 更新:支持部分字段更新;若上传新文件,需提供来源与形式字段;更新后写入数据库并可重新上传频响文件。 - 删除:删除前尝试从搜索引擎删除文档,再删除数据库记录。 -章节来源 -- [models.js:133-566](file://backend/src/routes/models.js#L133-L566) +**章节来源** +- [models.js:133-659](file://backend/src/routes/models.js#L133-L659) ### 技术规格管理 - 形式字段:支持入耳式、头戴式、耳塞式等枚举值映射。 @@ -187,7 +205,7 @@ BRAND ||--o{ MODEL : "拥有多个型号" - 来源字段:标识型号数据来源(如 Eafonyoung)。 - EQ 键字段:用于关联 EQ 缓存的键名。 -章节来源 +**章节来源** - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [index.vue:226-250](file://frontend/src/views/model/index.vue#L226-L250) @@ -209,12 +227,12 @@ Put --> Done(["完成"]) ErrExt --> Done ``` -图表来源 +**图表来源** - [models.js:59-68](file://backend/src/routes/models.js#L59-L68) - [models.js:307-335](file://backend/src/routes/models.js#L307-L335) - [measurementStorage.js:48-79](file://backend/src/services/measurementStorage.js#L48-L79) -章节来源 +**章节来源** - [models.js:59-68](file://backend/src/routes/models.js#L59-L68) - [models.js:307-335](file://backend/src/routes/models.js#L307-L335) - [measurementStorage.js:48-79](file://backend/src/services/measurementStorage.js#L48-L79) @@ -223,7 +241,7 @@ ErrExt --> Done - EQ 缓存:通过 Redis 哈希存储型号的 EQ 数据,提供字段列表与单字段值读取。 - 频响 CSV:仅对特定来源开放,按来源、形式、品牌、型号拼接 S3 Key 并读取内容。 -章节来源 +**章节来源** - [models.js:183-278](file://backend/src/routes/models.js#L183-L278) - [eqCacheStorage.js:24-66](file://backend/src/services/eqCacheStorage.js#L24-L66) - [measurementStorage.js:87-108](file://backend/src/services/measurementStorage.js#L87-L108) @@ -252,32 +270,94 @@ RT-->>API : 返回错误列表 end ``` -图表来源 +**图表来源** - [models.js:466-514](file://backend/src/routes/models.js#L466-L514) - [models.js:516-566](file://backend/src/routes/models.js#L516-L566) - [curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138) - [index.vue:1117-1220](file://frontend/src/views/model/index.vue#L1117-L1220) -章节来源 +**章节来源** - [models.js:466-514](file://backend/src/routes/models.js#L466-L514) - [models.js:516-566](file://backend/src/routes/models.js#L516-L566) - [curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138) - [index.vue:1117-1220](file://frontend/src/views/model/index.vue#L1117-L1220) +### Squig.link集成服务与自动数据抓取 + +**新增功能**:型号管理现已集成squig.link外部数据源,支持从分享链接自动抓取频响数据。 + +#### 核心特性 +- **URL解析**:支持标准squig.link分享URL格式,自动提取baseURL和share参数 +- **数据抓取**:自动获取phone_book.json清单,匹配目标文件 +- **格式转换**:将TXT格式频响数据转换为CSV格式 +- **品牌/型号解析**:从文件名自动解析品牌和型号信息 +- **佩戴方式检测**:通过squigsites.json配置自动识别入耳式/头戴式/耳塞式 +- **多候选处理**:当存在多个匹配文件时,提供候选列表供用户选择 + +#### 技术实现 +- **squigsites.json缓存**:1小时内存缓存,减少外部请求 +- **并行处理**:同时获取phone_book和检测佩戴方式,提升响应速度 +- **智能匹配**:精确匹配失败时进行模糊搜索,提高成功率 +- **容错机制**:多种TXT文件后缀尝试,确保数据完整性 + +```mermaid +flowchart TD +Start(["squig.link抓取开始"]) --> ParseURL["解析分享URL"] +ParseURL --> GetPhoneBook["获取phone_book.json"] +GetPhoneBook --> MatchFile["匹配目标文件"] +MatchFile --> ExactMatch{"精确匹配?"} +ExactMatch --> |是| DownloadTXT["下载TXT文件"] +ExactMatch --> |否| FuzzySearch["模糊搜索候选"] +FuzzySearch --> Multiple{"多个候选?"} +Multiple --> |是| ShowCandidates["显示候选列表"] +Multiple --> |否| DownloadTXT +ShowCandidates --> UserSelect["用户选择文件"] +UserSelect --> DownloadTXT +DownloadTXT --> ConvertCSV["转换为CSV"] +ConvertCSV --> DetectForm["检测佩戴方式"] +DetectForm --> ParseBrand["解析品牌/型号"] +ParseBrand --> ReturnData["返回抓取结果"] +``` + +**图表来源** +- [squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) +- [squiglink.js:148-207](file://backend/src/services/squiglink.js#L148-L207) +- [squiglink.js:216-247](file://backend/src/services/squiglink.js#L216-L247) + +#### 前端集成 +- **导入界面**:在型号表单中新增squig.link导入区域 +- **实时抓取**:输入URL后自动抓取数据,无需手动提交 +- **候选选择**:当存在多个匹配文件时,弹出选择对话框 +- **自动填充**:成功抓取后自动填充品牌、型号、佩戴方式等字段 + +#### 后端API +- **POST /api/models/squiglink-fetch**:处理squig.link数据抓取请求 +- **支持参数**:share_url(必需)、selected_file(可选) +- **返回数据**:CSV内容、品牌/型号、佩戴方式、数据URL、候选列表 + +**章节来源** +- [squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) +- [models.js:307-369](file://backend/src/routes/models.js#L307-L369) +- [ModelFormDialog.vue:16-46](file://frontend/src/views/model/components/ModelFormDialog.vue#L16-L46) +- [ModelFormDialog.vue:289-332](file://frontend/src/views/model/components/ModelFormDialog.vue#L289-L332) +- [model.js:152-165](file://frontend/src/api/model.js#L152-L165) + ### 前端交互与使用示例 - 列表查询:支持品牌名称与型号名称模糊搜索、排序与分页。 - 详情查看:点击更多操作可查看推送状态、EQ 缓存、CSV 内容。 -- 参数配置:新增/编辑对话框支持品牌选择、型号输入、形式、阻抗、来源与频响文件上传。 +- 参数配置:新增/编辑对话框支持品牌选择、型号输入、形式、阻抗、来源与频响文件上传,**以及squig.link分享链接导入**。 - 批量推送:勾选多条后执行推送流程,包含校验与进度提示。 +- **squig.link导入**:在表单中输入squig.link分享链接,自动抓取频响数据并填充表单字段。 -章节来源 +**章节来源** - [index.vue:1-1226](file://frontend/src/views/model/index.vue#L1-L1226) -- [model.js:1-151](file://frontend/src/api/model.js#L1-L151) +- [ModelFormDialog.vue:1-555](file://frontend/src/views/model/components/ModelFormDialog.vue#L1-L555) +- [model.js:1-165](file://frontend/src/api/model.js#L1-L165) ## 依赖关系分析 - 前端依赖:Element Plus 组件库、Vue 3、axios 请求封装。 - 后端依赖:Express 路由、Sequelize ORM、Zod 验证、Multer 文件上传、Axios 第三方调用、AWS SDK S3 访问、Redis 客户端。 -- 外部服务:Meilisearch(搜索引擎)、Luxsin 曲线 API、S3 存储。 +- 外部服务:Meilisearch(搜索引擎)、Luxsin 曲线 API、S3 存储、**squig.link外部数据源**。 ```mermaid graph LR @@ -288,29 +368,32 @@ RT --> VAL["验证器(model.js)"] RT --> MS["S3(measurementStorage.js)"] RT --> ES["Redis(eqCacheStorage.js)"] RT --> CS["曲线(curveClient.js)"] +RT --> SS["squig.link(squiglink.js)"] RT --> BR["品牌(Brand.js)"] ``` -图表来源 +**图表来源** - [index.vue:1-1226](file://frontend/src/views/model/index.vue#L1-L1226) -- [model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [models.js:1-569](file://backend/src/routes/models.js#L1-L569) +- [model.js:1-165](file://frontend/src/api/model.js#L1-L165) +- [models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) - [eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) - [curveClient.js:1-147](file://backend/src/services/curveClient.js#L1-L147) +- [squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) -章节来源 +**章节来源** - [index.vue:1-1226](file://frontend/src/views/model/index.vue#L1-L1226) -- [model.js:1-151](file://frontend/src/api/model.js#L1-L151) -- [models.js:1-569](file://backend/src/routes/models.js#L1-L569) +- [model.js:1-165](file://frontend/src/api/model.js#L1-L165) +- [models.js:1-659](file://backend/src/routes/models.js#L1-L659) - [Model.js:1-53](file://backend/src/models/Model.js#L1-L53) - [model.js:1-22](file://backend/src/validators/model.js#L1-L22) - [measurementStorage.js:1-115](file://backend/src/services/measurementStorage.js#L1-L115) - [eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73) - [curveClient.js:1-147](file://backend/src/services/curveClient.js#L1-L147) +- [squiglink.js:1-322](file://backend/src/services/squiglink.js#L1-L322) - [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23) ## 性能考虑 @@ -318,6 +401,7 @@ RT --> BR["品牌(Brand.js)"] - 文件上传:上传 TXT 时会进行转换,建议控制文件大小与格式,减少不必要的转换开销。 - 搜索推送:批量推送包含校验步骤,建议分批处理并监控进度,避免超时。 - 缓存与存储:EQ 缓存通过 Redis 快速读取字段列表,避免大对象传输;S3 读取采用流式读取,注意网络抖动与超时配置。 +- **squig.link抓取**:squigsites.json采用1小时缓存,减少外部请求;并行处理phone_book获取和佩戴方式检测,提升响应速度。 ## 故障排查指南 - 参数验证失败 @@ -327,19 +411,19 @@ RT --> BR["品牌(Brand.js)"] - [model.js:3-19](file://backend/src/validators/model.js#L3-L19) - [models.js:307-361](file://backend/src/routes/models.js#L307-L361) - 重复型号 - - 现象:新增时报“该品牌下型号名称已存在”。 + - 现象:新增时报"该品牌下型号名称已存在"。 - 排查:确认数据库中是否已存在相同品牌+型号组合;更新时注意品牌与型号变更后的冲突检测。 - 参考 - [models.js:312-317](file://backend/src/routes/models.js#L312-L317) - [models.js:380-388](file://backend/src/routes/models.js#L380-L388) - 不支持的文件格式 - - 现象:上传文件返回“不支持的文件格式”。 + - 现象:上传文件返回"不支持的文件格式"。 - 排查:确认扩展名为 CSV/TXT/JSON;TXT 会被转换为 CSV。 - 参考 - [models.js:320-325](file://backend/src/routes/models.js#L320-L325) - [models.js:59-68](file://backend/src/routes/models.js#L59-L68) - S3 读取失败 - - 现象:查看 CSV 时提示“S3 上未找到该型号的频响文件”或读取失败。 + - 现象:查看 CSV 时提示"S3 上未找到该型号的频响文件"或读取失败。 - 排查:确认来源为 Eafonyoung、具备形式字段、S3 Key 构造正确;检查桶权限与区域配置。 - 参考 - [models.js:255-258](file://backend/src/routes/models.js#L255-L258) @@ -350,8 +434,15 @@ RT --> BR["品牌(Brand.js)"] - 参考 - [models.js:466-514](file://backend/src/routes/models.js#L466-L514) - [curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138) +- **squig.link抓取失败** + - 现象:输入squig.link分享链接后无法抓取数据。 + - 排查:确认URL格式正确、网络连接正常、目标文件存在于phone_book中;检查squigsites.json缓存是否过期;查看后端日志获取详细错误信息。 + - 参考 + - [models.js:307-369](file://backend/src/routes/models.js#L307-L369) + - [squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) + - [ModelFormDialog.vue:289-332](file://frontend/src/views/model/components/ModelFormDialog.vue#L289-L332) -章节来源 +**章节来源** - [model.js:3-19](file://backend/src/validators/model.js#L3-L19) - [models.js:312-317](file://backend/src/routes/models.js#L312-L317) - [models.js:320-325](file://backend/src/routes/models.js#L320-L325) @@ -359,9 +450,12 @@ RT --> BR["品牌(Brand.js)"] - [measurementStorage.js:87-108](file://backend/src/services/measurementStorage.js#L87-L108) - [models.js:466-514](file://backend/src/routes/models.js#L466-L514) - [curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138) +- [models.js:307-369](file://backend/src/routes/models.js#L307-L369) +- [squiglink.js:261-310](file://backend/src/services/squiglink.js#L261-L310) +- [ModelFormDialog.vue:289-332](file://frontend/src/views/model/components/ModelFormDialog.vue#L289-L332) ## 结论 -型号管理功能通过清晰的前后端职责划分与严格的参数验证,实现了从基础 CRUD 到技术规格管理、测量数据存储与搜索引擎推送的完整闭环。借助 Redis 与 S3 的高效读写能力,以及第三方曲线校验服务,系统在保证数据一致性的同时提升了用户体验与可维护性。建议在生产环境中进一步完善日志与监控,优化批量推送的并发与重试策略,并持续关注外部依赖的稳定性。 +型号管理功能通过清晰的前后端职责划分与严格的参数验证,实现了从基础 CRUD 到技术规格管理、测量数据存储与搜索引擎推送的完整闭环。**新增的squig.link集成服务进一步增强了数据获取能力,支持从外部频率响应数据源自动抓取数据,显著提升了用户体验**。借助 Redis 与 S3 的高效读写能力,以及第三方曲线校验服务,系统在保证数据一致性的同时提升了用户体验与可维护性。建议在生产环境中进一步完善日志与监控,优化批量推送的并发与重试策略,并持续关注外部依赖的稳定性。 ## 附录 - 常用接口清单 @@ -376,7 +470,8 @@ RT --> BR["品牌(Brand.js)"] - 查看频响 CSV:GET /api/models/:id/measurement - 校验推送:POST /api/models/push-to-search/validate - 推送:POST /api/models/push-to-search + - **squig.link数据抓取**:POST /api/models/squiglink-fetch -章节来源 -- [models.js:133-566](file://backend/src/routes/models.js#L133-L566) -- [model.js:13-151](file://frontend/src/api/model.js#L13-L151) \ No newline at end of file +**章节来源** +- [models.js:133-659](file://backend/src/routes/models.js#L133-L659) +- [model.js:13-165](file://frontend/src/api/model.js#L13-L165) \ No newline at end of file diff --git a/.qoder/repowiki/zh/meta/repowiki-metadata.json b/.qoder/repowiki/zh/meta/repowiki-metadata.json index d032f76..914c29a 100644 --- a/.qoder/repowiki/zh/meta/repowiki-metadata.json +++ b/.qoder/repowiki/zh/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"2ba6ee170718db40d0a0c1e0e271ab8c","path":"frontend/src/views/ota/index.vue","line_range":"1-1003","gmt_create":"2026-06-30T18:39:29.609311+08:00","gmt_modified":"2026-06-30T18:39:29.609311+08:00"},{"id":"3e935f654a28968186e9260f2c5035c7","path":"frontend/src/api/ota.js","line_range":"1-68","gmt_create":"2026-06-30T18:39:29.609615+08:00","gmt_modified":"2026-06-30T18:39:29.609615+08:00"},{"id":"edbb69e747bbcd76dd1bc3a361ebf7c0","path":"frontend/src/api/blacklist.js","line_range":"1-57","gmt_create":"2026-06-30T18:39:29.609775+08:00","gmt_modified":"2026-06-30T18:39:29.609775+08:00"},{"id":"4e817a7f3bd90bb9e57c6a2e9009380f","path":"frontend/src/api/otaTargetDevice.js","line_range":"1-57","gmt_create":"2026-06-30T18:39:29.609938+08:00","gmt_modified":"2026-06-30T18:39:29.609938+08:00"},{"id":"72de55f3f022487777e9ad301c9d942b","path":"backend/src/routes/blacklist.js","line_range":"1-223","gmt_create":"2026-06-30T18:39:29.610091+08:00","gmt_modified":"2026-06-30T18:39:29.610091+08:00"},{"id":"ba9810388706ac5ffb0156f74ada8b88","path":"backend/src/routes/otaTargetDevice.js","line_range":"1-248","gmt_create":"2026-06-30T18:39:29.610237+08:00","gmt_modified":"2026-06-30T18:39:29.610237+08:00"},{"id":"f3b38dfd34a76e0d2e62a863fca301a8","path":"frontend/src/views/ota/index.vue","line_range":"420-831","gmt_create":"2026-06-30T18:39:29.611431+08:00","gmt_modified":"2026-06-30T18:39:29.611431+08:00"},{"id":"ae7ce676a4f649c15d0490bbb2954cfe","path":"frontend/src/api/ota.js","line_range":"13-67","gmt_create":"2026-06-30T18:39:29.611582+08:00","gmt_modified":"2026-06-30T18:39:29.611583+08:00"},{"id":"859ba4011a4720ad0ad431545e144986","path":"frontend/src/api/blacklist.js","line_range":"12-56","gmt_create":"2026-06-30T18:39:29.611724+08:00","gmt_modified":"2026-06-30T18:39:29.611724+08:00"},{"id":"c910f65a89648ecf30c84b77b136ad70","path":"frontend/src/api/otaTargetDevice.js","line_range":"12-55","gmt_create":"2026-06-30T18:39:29.611869+08:00","gmt_modified":"2026-06-30T18:39:29.611869+08:00"},{"id":"c042223cf0aa5b2e59be1747923b4baf","path":"frontend/src/api/ota.js","line_range":"13-49","gmt_create":"2026-06-30T18:39:29.612183+08:00","gmt_modified":"2026-06-30T18:39:29.612183+08:00"},{"id":"b1e9d90908a2a5e3d545ca0cf2c86769","path":"backend/src/routes/ota.js","line_range":"24-268","gmt_create":"2026-06-30T18:39:29.612679+08:00","gmt_modified":"2026-06-30T18:39:29.612679+08:00"},{"id":"aae8712924efab58e019d0c963576781","path":"backend/src/routes/blacklist.js","line_range":"96-139","gmt_create":"2026-06-30T18:39:29.612821+08:00","gmt_modified":"2026-06-30T18:39:29.612821+08:00"},{"id":"fb9daf52780951bc4b93f14b1fcfa8f1","path":"backend/src/routes/otaTargetDevice.js","line_range":"96-139","gmt_create":"2026-06-30T18:39:29.612979+08:00","gmt_modified":"2026-06-30T18:39:29.612979+08:00"},{"id":"23aa29b61d1387fca0530a0a1e57e27f","path":"backend/src/routes/ota.js","line_range":"1-292","gmt_create":"2026-06-30T18:39:29.613104+08:00","gmt_modified":"2026-06-30T18:39:29.613104+08:00"},{"id":"e6f541a0af8390b3610d1e380a8d3236","path":"backend/src/models/Ota.js","line_range":"4-94","gmt_create":"2026-06-30T18:39:29.61355+08:00","gmt_modified":"2026-06-30T18:39:29.61355+08:00"},{"id":"4aad83e3e76ccc16e5b91d801ab1b278","path":"backend/src/models/BlackList.js","line_range":"5-36","gmt_create":"2026-06-30T18:39:29.613684+08:00","gmt_modified":"2026-06-30T18:39:29.613684+08:00"},{"id":"54c99704b8bcabdfe63adda9c4392452","path":"backend/src/models/OtaTargetDevice.js","line_range":"5-37","gmt_create":"2026-06-30T18:39:29.613824+08:00","gmt_modified":"2026-06-30T18:39:29.613824+08:00"},{"id":"b7c66d1bc7887a6132dc3acbf6421a5d","path":"backend/src/models/Ota.js","line_range":"1-97","gmt_create":"2026-06-30T18:39:29.613982+08:00","gmt_modified":"2026-06-30T18:39:29.613982+08:00"},{"id":"058bc5c3e018c854b5cf42905abd45d7","path":"backend/src/models/BlackList.js","line_range":"1-36","gmt_create":"2026-06-30T18:39:29.614129+08:00","gmt_modified":"2026-06-30T18:39:29.614129+08:00"},{"id":"3830639d0b7444aa8a1cf3c80d4eef7e","path":"backend/src/models/OtaTargetDevice.js","line_range":"1-37","gmt_create":"2026-06-30T18:39:29.614371+08:00","gmt_modified":"2026-06-30T18:39:29.614371+08:00"},{"id":"be497152bcedca75299e4c2521c11859","path":"backend/src/services/otaStorage.js","line_range":"46-103","gmt_create":"2026-06-30T18:39:29.614741+08:00","gmt_modified":"2026-06-30T18:39:29.614741+08:00"},{"id":"af76fcd4277eeb577f573e21de923bbf","path":"backend/src/config/env.js","line_range":"1-13","gmt_create":"2026-06-30T18:39:29.614989+08:00","gmt_modified":"2026-06-30T18:39:29.614989+08:00"},{"id":"b8c21c93e526039c96f1df526ebdcafe","path":"backend/src/services/otaStorage.js","line_range":"1-113","gmt_create":"2026-06-30T18:39:29.615206+08:00","gmt_modified":"2026-06-30T18:39:29.615206+08:00"},{"id":"424dfd038ca84be6195b08d7032a1235","path":"backend/src/routes/ota.js","line_range":"68-102","gmt_create":"2026-06-30T18:39:29.61565+08:00","gmt_modified":"2026-06-30T18:39:29.61565+08:00"},{"id":"2fc67d9140f7c12759a5188eb6f9b204","path":"frontend/src/views/ota/index.vue","line_range":"305-338","gmt_create":"2026-06-30T18:39:29.615816+08:00","gmt_modified":"2026-06-30T18:39:29.615816+08:00"},{"id":"e3a6003c52bf8b8487bb1b8709da6b4b","path":"backend/src/utils/response.js","line_range":"1-25","gmt_create":"2026-06-30T18:39:29.615973+08:00","gmt_modified":"2026-06-30T18:39:29.615973+08:00"},{"id":"cabe1728acba4dab25a86b5788412e46","path":"backend/src/routes/ota.js","line_range":"25-66","gmt_create":"2026-06-30T18:39:29.616135+08:00","gmt_modified":"2026-06-30T18:39:29.616135+08:00"},{"id":"45f0756fae3928b75883500a5006f7f0","path":"frontend/src/views/ota/index.vue","line_range":"645-734","gmt_create":"2026-06-30T18:39:29.616292+08:00","gmt_modified":"2026-06-30T18:39:29.616292+08:00"},{"id":"f2e521eddcaa25c62a309d5b0af997fa","path":"backend/src/routes/blacklist.js","line_range":"96-204","gmt_create":"2026-06-30T18:39:29.616595+08:00","gmt_modified":"2026-06-30T18:39:29.616595+08:00"},{"id":"6b7ea701575cf98b6ee3431f68ad5649","path":"frontend/src/views/ota/index.vue","line_range":"736-817","gmt_create":"2026-06-30T18:39:29.61672+08:00","gmt_modified":"2026-06-30T18:39:29.61672+08:00"},{"id":"506ecfb839ed7fb3f4199ade7e4b6a64","path":"backend/src/routes/otaTargetDevice.js","line_range":"96-208","gmt_create":"2026-06-30T18:39:29.617009+08:00","gmt_modified":"2026-06-30T18:39:29.617009+08:00"},{"id":"7a5ae98472bdc4806472d50e6b88c997","path":"frontend/src/utils/request.js","line_range":"1-72","gmt_create":"2026-06-30T18:39:29.617154+08:00","gmt_modified":"2026-06-30T18:39:29.617154+08:00"},{"id":"69c930f997042246d4e17369ede6f826","path":"frontend/src/router/index.js","line_range":"1-91","gmt_create":"2026-06-30T18:39:29.617278+08:00","gmt_modified":"2026-06-30T18:39:29.617278+08:00"},{"id":"6b61c60063d41432a3cc1ac4d1699181","path":"frontend/src/utils/request.js","line_range":"44-69","gmt_create":"2026-06-30T18:39:29.619097+08:00","gmt_modified":"2026-06-30T18:39:29.619097+08:00"},{"id":"752be7590bb954b39e5a8f41ce8811eb","path":"backend/src/routes/blacklist.js","line_range":"159-183","gmt_create":"2026-06-30T18:39:29.619239+08:00","gmt_modified":"2026-06-30T18:39:29.619239+08:00"},{"id":"4daa6ac2900ccb8c9fd7142d0ecdd298","path":"backend/src/routes/otaTargetDevice.js","line_range":"142-208","gmt_create":"2026-06-30T18:39:29.619362+08:00","gmt_modified":"2026-06-30T18:39:29.619362+08:00"},{"id":"e22545d86c6efa26c57aea0e355a57f6","path":"DEPLOY.md","line_range":"226-256","gmt_create":"2026-06-30T18:39:29.619502+08:00","gmt_modified":"2026-06-30T18:39:29.619502+08:00"},{"id":"05900505c40339d0cc93870281600479","path":"backend/src/models/BlackList.js","line_range":"1-37","gmt_create":"2026-06-30T18:39:56.520893+08:00","gmt_modified":"2026-06-30T18:39:56.520893+08:00"},{"id":"921d509d2d71df1e2bace1390640482a","path":"backend/src/models/OtaTargetDevice.js","line_range":"1-38","gmt_create":"2026-06-30T18:39:56.521018+08:00","gmt_modified":"2026-06-30T18:39:56.521018+08:00"},{"id":"149a41cdd5807ad4f666e9eb2463fa68","path":"frontend/src/views/ota/index.vue","line_range":"1-628","gmt_create":"2026-06-30T18:39:56.521152+08:00","gmt_modified":"2026-06-30T18:39:56.521152+08:00"},{"id":"771e33c2a04ba5eb1a504cf7aa1e9c36","path":"frontend/src/views/blacklist/index.vue","line_range":"1-381","gmt_create":"2026-06-30T18:39:56.521272+08:00","gmt_modified":"2026-06-30T18:39:56.521272+08:00"},{"id":"f23242497ee4dc9ed490a1d09d0d3d91","path":"frontend/src/views/ota-target-device/index.vue","line_range":"1-386","gmt_create":"2026-06-30T18:39:56.521399+08:00","gmt_modified":"2026-06-30T18:39:56.521399+08:00"},{"id":"0c0ca507fcaf2164af19adf77eaf72e8","path":"backend/src/validators/ota.js","line_range":"1-36","gmt_create":"2026-06-30T18:39:56.523127+08:00","gmt_modified":"2026-06-30T18:39:56.523127+08:00"},{"id":"420851439a300cff8b7fa324589ce87a","path":"backend/src/validators/blacklist.js","line_range":"1-14","gmt_create":"2026-06-30T18:39:56.52326+08:00","gmt_modified":"2026-06-30T18:39:56.52326+08:00"},{"id":"e92ce9787ed66ea4dd0821e0c8f28d8a","path":"backend/src/validators/otaTargetDevice.js","line_range":"1-14","gmt_create":"2026-06-30T18:39:56.523384+08:00","gmt_modified":"2026-06-30T18:39:56.523384+08:00"},{"id":"0696a947e8ffd03fd403809f77673c55","path":"backend/src/routes/ota.js","line_range":"24-66","gmt_create":"2026-06-30T18:39:56.523678+08:00","gmt_modified":"2026-06-30T18:39:56.523678+08:00"},{"id":"0f5328f2be7159ab2f533662f8992b10","path":"frontend/src/views/ota/index.vue","line_range":"384-412","gmt_create":"2026-06-30T18:39:56.524074+08:00","gmt_modified":"2026-06-30T18:39:56.524075+08:00"},{"id":"b6918b1988464553531aec983ea27b7d","path":"backend/src/models/BlackList.js","line_range":"5-32","gmt_create":"2026-06-30T18:39:56.524325+08:00","gmt_modified":"2026-06-30T18:39:56.524326+08:00"},{"id":"59e0c0eb304ea8fbb7145bc038c8fdf6","path":"backend/src/models/OtaTargetDevice.js","line_range":"5-33","gmt_create":"2026-06-30T18:39:56.524448+08:00","gmt_modified":"2026-06-30T18:39:56.524448+08:00"},{"id":"0991eb53c8fe806cf46decab5e748f75","path":"backend/src/services/otaStorage.js","line_range":"72-103","gmt_create":"2026-06-30T18:39:56.525119+08:00","gmt_modified":"2026-06-30T18:39:56.525119+08:00"},{"id":"a826e77f133d3db11e600f30b88f4e9a","path":"backend/src/validators/ota.js","line_range":"3-35","gmt_create":"2026-06-30T18:39:56.525629+08:00","gmt_modified":"2026-06-30T18:39:56.525629+08:00"},{"id":"4a33d32c1578fd612d900aa17246d8c2","path":"backend/src/validators/blacklist.js","line_range":"3-11","gmt_create":"2026-06-30T18:39:56.525734+08:00","gmt_modified":"2026-06-30T18:39:56.525734+08:00"},{"id":"4660c7ce6daeb3f765d39856dcf95f6f","path":"backend/src/validators/otaTargetDevice.js","line_range":"3-11","gmt_create":"2026-06-30T18:39:56.525836+08:00","gmt_modified":"2026-06-30T18:39:56.525836+08:00"},{"id":"7467dc2e2d22c93c63fa6342b2e08541","path":"frontend/src/views/ota/index.vue","line_range":"420-579","gmt_create":"2026-06-30T18:39:56.526564+08:00","gmt_modified":"2026-06-30T18:39:56.526564+08:00"},{"id":"4b5baf2b8dcd8468722cd31868c794b2","path":"frontend/src/views/ota/index.vue","line_range":"645-683","gmt_create":"2026-06-30T18:39:56.526669+08:00","gmt_modified":"2026-06-30T18:39:56.526669+08:00"},{"id":"20e79ab592f63eb9d23c0d563d5f5202","path":"backend/src/routes/blacklist.js","line_range":"16-71","gmt_create":"2026-06-30T18:39:56.527902+08:00","gmt_modified":"2026-06-30T18:39:56.527902+08:00"},{"id":"07afcaa71195b3d86386dcde14973a8d","path":"backend/src/routes/blacklist.js","line_range":"96-131","gmt_create":"2026-06-30T18:39:56.527997+08:00","gmt_modified":"2026-06-30T18:39:56.527997+08:00"},{"id":"2a5364613dbf0723f2e2a64affabb065","path":"frontend/src/views/blacklist/index.vue","line_range":"144-346","gmt_create":"2026-06-30T18:39:56.528097+08:00","gmt_modified":"2026-06-30T18:39:56.528097+08:00"},{"id":"12ad7a8b54f39c0717843220f341d59e","path":"backend/src/routes/otaTargetDevice.js","line_range":"16-71","gmt_create":"2026-06-30T18:39:56.528805+08:00","gmt_modified":"2026-06-30T18:39:56.528805+08:00"},{"id":"585261a6626a815d8f5f83b91a086eb9","path":"frontend/src/views/ota-target-device/index.vue","line_range":"144-351","gmt_create":"2026-06-30T18:39:56.529026+08:00","gmt_modified":"2026-06-30T18:39:56.529026+08:00"},{"id":"2a0437737a8daf4655f00caae7549a06","path":"backend/package.json","line_range":"11-24","gmt_create":"2026-06-30T18:39:56.529846+08:00","gmt_modified":"2026-06-30T18:39:56.529846+08:00"},{"id":"f0cfbce84fd69ea625e215367d5da707","path":"backend/package.json","line_range":"1-29","gmt_create":"2026-06-30T18:39:56.529954+08:00","gmt_modified":"2026-06-30T18:39:56.529954+08:00"},{"id":"fad5c52b0517044faace96133c6e570c","path":"backend/src/routes/ota.js","line_range":"174-181","gmt_create":"2026-06-30T18:39:56.530168+08:00","gmt_modified":"2026-06-30T18:39:56.530168+08:00"},{"id":"f62834891fb8675fbb1dcb6654b186e9","path":"backend/src/services/otaStorage.js","line_range":"95-98","gmt_create":"2026-06-30T18:39:56.530261+08:00","gmt_modified":"2026-06-30T18:39:56.530261+08:00"},{"id":"0c387969b601239a31cb0c672ef3c116","path":"backend/src/routes/blacklist.js","line_range":"108-112","gmt_create":"2026-06-30T18:39:56.530365+08:00","gmt_modified":"2026-06-30T18:39:56.530365+08:00"},{"id":"406e308cbdb4112d67f61a82a8118e9f","path":"backend/src/routes/otaTargetDevice.js","line_range":"108-112","gmt_create":"2026-06-30T18:39:56.530464+08:00","gmt_modified":"2026-06-30T18:39:56.530464+08:00"}],"knowledge_relations":[{"id":2781,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"6b28e060-0be3-411e-8a94-3777d165d10e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e 6b28e060-0be3-411e-8a94-3777d165d10e","gmt_create":"2026-06-30T14:40:47.271887+08:00","gmt_modified":"2026-06-30T14:40:47.271887+08:00"},{"id":2782,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"941d72b1-8daa-4c53-bfeb-9a0b2aa0f43c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e 941d72b1-8daa-4c53-bfeb-9a0b2aa0f43c","gmt_create":"2026-06-30T14:40:47.272516+08:00","gmt_modified":"2026-06-30T14:40:47.272516+08:00"},{"id":2783,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"c6f2cb24-ff10-4ae7-87c2-b23b9bbee033","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e c6f2cb24-ff10-4ae7-87c2-b23b9bbee033","gmt_create":"2026-06-30T14:40:47.272798+08:00","gmt_modified":"2026-06-30T14:40:47.272798+08:00"},{"id":2784,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"4619dc3e-419f-435b-ba7c-e600e188743a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e 4619dc3e-419f-435b-ba7c-e600e188743a","gmt_create":"2026-06-30T14:40:47.272953+08:00","gmt_modified":"2026-06-30T14:40:47.272953+08:00"},{"id":2785,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"7f894188-cf72-40a2-af95-f13ef3dd1f6e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 7f894188-cf72-40a2-af95-f13ef3dd1f6e","gmt_create":"2026-06-30T14:40:47.273394+08:00","gmt_modified":"2026-06-30T14:40:47.273394+08:00"},{"id":2786,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"b66da3f2-6889-45dc-a824-2591d2f5f0f3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e b66da3f2-6889-45dc-a824-2591d2f5f0f3","gmt_create":"2026-06-30T14:40:47.273688+08:00","gmt_modified":"2026-06-30T14:40:47.273688+08:00"},{"id":2787,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 799e02d2-8358-41a1-9f8e-114f8ac00eae","gmt_create":"2026-06-30T14:40:47.273951+08:00","gmt_modified":"2026-06-30T14:40:47.273952+08:00"},{"id":2788,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"be7e1733-8c9e-4849-99b0-bab40fdf271e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e be7e1733-8c9e-4849-99b0-bab40fdf271e","gmt_create":"2026-06-30T14:40:47.274328+08:00","gmt_modified":"2026-06-30T14:40:47.274328+08:00"},{"id":2789,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"8f464fc9-6537-45fa-a0dd-eacdf742b5a1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 8f464fc9-6537-45fa-a0dd-eacdf742b5a1","gmt_create":"2026-06-30T14:40:47.274458+08:00","gmt_modified":"2026-06-30T14:40:47.274458+08:00"},{"id":2790,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"77bc73e0-8709-4209-96e0-5522f9356b06","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 77bc73e0-8709-4209-96e0-5522f9356b06","gmt_create":"2026-06-30T14:40:47.274632+08:00","gmt_modified":"2026-06-30T14:40:47.274632+08:00"},{"id":2791,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"799ec9fc-088e-456c-8f93-72516adac3ac","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 799ec9fc-088e-456c-8f93-72516adac3ac","gmt_create":"2026-06-30T14:40:47.274784+08:00","gmt_modified":"2026-06-30T14:40:47.274784+08:00"},{"id":2792,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"0efcac71-9db4-49c9-a660-690dcb97cd54","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e 0efcac71-9db4-49c9-a660-690dcb97cd54","gmt_create":"2026-06-30T14:40:47.275136+08:00","gmt_modified":"2026-06-30T14:40:47.275136+08:00"},{"id":2793,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"ef11f60f-47aa-41bf-8884-6d51bc9ae8ef","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e ef11f60f-47aa-41bf-8884-6d51bc9ae8ef","gmt_create":"2026-06-30T14:40:47.275339+08:00","gmt_modified":"2026-06-30T14:40:47.275339+08:00"},{"id":2794,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"edd1d813-70d4-49de-9f9e-e3ebf7a68678","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e edd1d813-70d4-49de-9f9e-e3ebf7a68678","gmt_create":"2026-06-30T14:40:47.27546+08:00","gmt_modified":"2026-06-30T14:40:47.27546+08:00"},{"id":2795,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"b2376dbd-002b-4469-8e6e-71748e46e7c2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e b2376dbd-002b-4469-8e6e-71748e46e7c2","gmt_create":"2026-06-30T14:40:47.275789+08:00","gmt_modified":"2026-06-30T14:40:47.275789+08:00"},{"id":2796,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"b5718a44-f452-496d-83c3-4e89b844c709","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e b5718a44-f452-496d-83c3-4e89b844c709","gmt_create":"2026-06-30T14:40:47.276097+08:00","gmt_modified":"2026-06-30T14:40:47.276097+08:00"},{"id":2797,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"539729a8-aa4b-40c6-bf3b-ec9f467f7717","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e 539729a8-aa4b-40c6-bf3b-ec9f467f7717","gmt_create":"2026-06-30T14:40:47.276606+08:00","gmt_modified":"2026-06-30T14:40:47.276606+08:00"},{"id":2798,"source_id":"ed153077-3827-4586-8838-812707189c14","target_id":"b6857b45-a960-4168-92dd-1edcf6567e47","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ed153077-3827-4586-8838-812707189c14 -\u003e b6857b45-a960-4168-92dd-1edcf6567e47","gmt_create":"2026-06-30T14:40:47.277101+08:00","gmt_modified":"2026-06-30T14:40:47.277101+08:00"},{"id":2799,"source_id":"ed153077-3827-4586-8838-812707189c14","target_id":"2971fa4f-335a-4294-9668-0967b9047d66","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ed153077-3827-4586-8838-812707189c14 -\u003e 2971fa4f-335a-4294-9668-0967b9047d66","gmt_create":"2026-06-30T14:40:47.277268+08:00","gmt_modified":"2026-06-30T14:40:47.277268+08:00"},{"id":2800,"source_id":"ed153077-3827-4586-8838-812707189c14","target_id":"f0978b42-6f98-470e-922f-22dec2fac24d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ed153077-3827-4586-8838-812707189c14 -\u003e f0978b42-6f98-470e-922f-22dec2fac24d","gmt_create":"2026-06-30T14:40:47.277627+08:00","gmt_modified":"2026-06-30T14:40:47.277627+08:00"},{"id":2801,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"5ab55e3b-04bc-4e92-93f7-52bec7ad8dde","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e 5ab55e3b-04bc-4e92-93f7-52bec7ad8dde","gmt_create":"2026-06-30T14:40:47.277787+08:00","gmt_modified":"2026-06-30T14:40:47.277787+08:00"},{"id":2802,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"62bcda0f-7c78-4109-9649-58bbf9fd68ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e 62bcda0f-7c78-4109-9649-58bbf9fd68ae","gmt_create":"2026-06-30T14:40:47.27822+08:00","gmt_modified":"2026-06-30T14:40:47.27822+08:00"},{"id":2803,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"86f882d7-9e64-4c38-85e7-4782fd55fed2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e 86f882d7-9e64-4c38-85e7-4782fd55fed2","gmt_create":"2026-06-30T14:40:47.278376+08:00","gmt_modified":"2026-06-30T14:40:47.278376+08:00"},{"id":2804,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"ff04bd0e-99c4-481c-ac8c-3c1a6cae1fb5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e ff04bd0e-99c4-481c-ac8c-3c1a6cae1fb5","gmt_create":"2026-06-30T14:40:47.278503+08:00","gmt_modified":"2026-06-30T14:40:47.278503+08:00"},{"id":2805,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"772c69b5-886e-48f6-bd11-faf8ca2155e8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e 772c69b5-886e-48f6-bd11-faf8ca2155e8","gmt_create":"2026-06-30T14:40:47.278654+08:00","gmt_modified":"2026-06-30T14:40:47.278654+08:00"},{"id":2806,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"babe3ec0-01cb-43c3-93db-7e59cdccce68","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e babe3ec0-01cb-43c3-93db-7e59cdccce68","gmt_create":"2026-06-30T14:40:47.278828+08:00","gmt_modified":"2026-06-30T14:40:47.278828+08:00"},{"id":2807,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e 8d4422fd-bd93-431d-a97c-70b75f370f82","gmt_create":"2026-06-30T14:40:47.278985+08:00","gmt_modified":"2026-06-30T14:40:47.278985+08:00"},{"id":2809,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"100cbee2-f7a5-4cc9-83a3-900a4aacac7e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e 100cbee2-f7a5-4cc9-83a3-900a4aacac7e","gmt_create":"2026-06-30T14:40:47.279419+08:00","gmt_modified":"2026-06-30T14:40:47.279419+08:00"},{"id":2810,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"cf1f3ceb-e3b1-4d5c-8353-f0ea4345414c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e cf1f3ceb-e3b1-4d5c-8353-f0ea4345414c","gmt_create":"2026-06-30T14:40:47.279584+08:00","gmt_modified":"2026-06-30T14:40:47.279584+08:00"},{"id":2811,"source_id":"2971fa4f-335a-4294-9668-0967b9047d66","target_id":"0e003133-7d1a-4708-8599-fc71707070d6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2971fa4f-335a-4294-9668-0967b9047d66 -\u003e 0e003133-7d1a-4708-8599-fc71707070d6","gmt_create":"2026-06-30T14:40:47.280345+08:00","gmt_modified":"2026-06-30T14:40:47.280346+08:00"},{"id":2812,"source_id":"2971fa4f-335a-4294-9668-0967b9047d66","target_id":"4b6d6abc-bfd2-48a5-9c5e-de89f278f887","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2971fa4f-335a-4294-9668-0967b9047d66 -\u003e 4b6d6abc-bfd2-48a5-9c5e-de89f278f887","gmt_create":"2026-06-30T14:40:47.280628+08:00","gmt_modified":"2026-06-30T14:40:47.280628+08:00"},{"id":2813,"source_id":"2971fa4f-335a-4294-9668-0967b9047d66","target_id":"5b84c784-85d8-46e0-8972-e7816f6bd687","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2971fa4f-335a-4294-9668-0967b9047d66 -\u003e 5b84c784-85d8-46e0-8972-e7816f6bd687","gmt_create":"2026-06-30T14:40:47.280745+08:00","gmt_modified":"2026-06-30T14:40:47.280745+08:00"},{"id":2814,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"ad988472-7d0b-4076-86c8-f14661c5923d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e ad988472-7d0b-4076-86c8-f14661c5923d","gmt_create":"2026-06-30T14:40:47.281057+08:00","gmt_modified":"2026-06-30T14:40:47.281057+08:00"},{"id":2815,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"7eee30c6-7725-456b-8b43-35b5e4df7e99","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 7eee30c6-7725-456b-8b43-35b5e4df7e99","gmt_create":"2026-06-30T14:40:47.281191+08:00","gmt_modified":"2026-06-30T14:40:47.281191+08:00"},{"id":2816,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"791c01a2-dea1-407b-948d-3e2da8cbebed","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 791c01a2-dea1-407b-948d-3e2da8cbebed","gmt_create":"2026-06-30T14:40:47.281365+08:00","gmt_modified":"2026-06-30T14:40:47.281365+08:00"},{"id":2817,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","gmt_create":"2026-06-30T14:40:47.281523+08:00","gmt_modified":"2026-06-30T14:40:47.281523+08:00"},{"id":2818,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"6003d293-f2aa-4c49-817a-c7fa652890ed","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 6003d293-f2aa-4c49-817a-c7fa652890ed","gmt_create":"2026-06-30T14:40:47.28164+08:00","gmt_modified":"2026-06-30T14:40:47.28164+08:00"},{"id":2820,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"73336201-a22f-4329-afc6-40fb5f00f4f1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 73336201-a22f-4329-afc6-40fb5f00f4f1","gmt_create":"2026-06-30T14:40:47.281894+08:00","gmt_modified":"2026-06-30T14:40:47.281894+08:00"},{"id":3274,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"fc2d0cc85e5f2565c3105cbe0584903a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Ota.js","gmt_create":"2026-06-30T18:39:29.619553+08:00","gmt_modified":"2026-06-30T18:39:29.619553+08:00"},{"id":3275,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ba84445ce5118798ce7d0da4ecb4d5e2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/ota.js","gmt_create":"2026-06-30T18:39:29.62003+08:00","gmt_modified":"2026-06-30T18:39:29.62003+08:00"},{"id":3276,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"a15b46bcf0be7bfbc82e57adca5be630","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/otaStorage.js","gmt_create":"2026-06-30T18:39:29.620188+08:00","gmt_modified":"2026-06-30T18:39:29.620188+08:00"},{"id":3277,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4bb9a8c7ac3763db0746ff90788525b6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/ota/index.vue","gmt_create":"2026-06-30T18:39:29.620355+08:00","gmt_modified":"2026-06-30T18:39:29.620355+08:00"},{"id":3278,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"29e96dbf4d3d8f6e116ec620bbf504ad","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/ota.js","gmt_create":"2026-06-30T18:39:29.620492+08:00","gmt_modified":"2026-06-30T18:39:29.620492+08:00"},{"id":3279,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"5ceb781f55bf90055f3005880d06ee2a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/blacklist.js","gmt_create":"2026-06-30T18:39:29.620631+08:00","gmt_modified":"2026-06-30T18:39:29.620631+08:00"},{"id":3280,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"5973b5959029669ade01898821960785","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.62078+08:00","gmt_modified":"2026-06-30T18:39:29.62078+08:00"},{"id":3281,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"a84967d9d3088fba02de385738e7ca27","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/BlackList.js","gmt_create":"2026-06-30T18:39:29.620917+08:00","gmt_modified":"2026-06-30T18:39:29.620918+08:00"},{"id":3282,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4ca379f147f6f1da710371999e08dc24","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/OtaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.621051+08:00","gmt_modified":"2026-06-30T18:39:29.621051+08:00"},{"id":3283,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"71a563f23b46da0255a6400402bbfa05","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/blacklist.js","gmt_create":"2026-06-30T18:39:29.62129+08:00","gmt_modified":"2026-06-30T18:39:29.62129+08:00"},{"id":3284,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ea6e178b2f0bdcefe2ae8800166453d5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.621469+08:00","gmt_modified":"2026-06-30T18:39:29.621469+08:00"},{"id":3285,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"30f836e18a6bf9cbcf650e5884375a93","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/utils/response.js","gmt_create":"2026-06-30T18:39:29.621631+08:00","gmt_modified":"2026-06-30T18:39:29.621631+08:00"},{"id":3286,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"2a04b070bd67fc5059bb504232687d64","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/config/env.js","gmt_create":"2026-06-30T18:39:29.621776+08:00","gmt_modified":"2026-06-30T18:39:29.621776+08:00"},{"id":3287,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"34fcf7aeb55a9c0224c554fc48545063","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/utils/request.js","gmt_create":"2026-06-30T18:39:29.621971+08:00","gmt_modified":"2026-06-30T18:39:29.621971+08:00"},{"id":3288,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"08b8d17e3c09b326687a7bca6789507a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/router/index.js","gmt_create":"2026-06-30T18:39:29.622133+08:00","gmt_modified":"2026-06-30T18:39:29.622133+08:00"},{"id":3289,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"0c25a991664c34b2b36ce3aeed80f4da","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DEPLOY.md","gmt_create":"2026-06-30T18:39:29.622343+08:00","gmt_modified":"2026-06-30T18:39:29.622343+08:00"},{"id":3290,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"2ba6ee170718db40d0a0c1e0e271ab8c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#1-1003","gmt_create":"2026-06-30T18:39:29.622527+08:00","gmt_modified":"2026-06-30T18:39:29.622528+08:00"},{"id":3291,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"2ba6ee170718db40d0a0c1e0e271ab8c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-1003","gmt_create":"2026-06-30T18:39:29.622724+08:00","gmt_modified":"2026-06-30T18:39:29.622724+08:00"},{"id":3292,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"3e935f654a28968186e9260f2c5035c7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#1-68","gmt_create":"2026-06-30T18:39:29.622902+08:00","gmt_modified":"2026-06-30T18:39:29.622902+08:00"},{"id":3293,"source_id":"29e96dbf4d3d8f6e116ec620bbf504ad","target_id":"3e935f654a28968186e9260f2c5035c7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-68","gmt_create":"2026-06-30T18:39:29.623031+08:00","gmt_modified":"2026-06-30T18:39:29.623031+08:00"},{"id":3294,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"edbb69e747bbcd76dd1bc3a361ebf7c0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/blacklist.js#1-57","gmt_create":"2026-06-30T18:39:29.623251+08:00","gmt_modified":"2026-06-30T18:39:29.623251+08:00"},{"id":3295,"source_id":"5ceb781f55bf90055f3005880d06ee2a","target_id":"edbb69e747bbcd76dd1bc3a361ebf7c0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-06-30T18:39:29.623384+08:00","gmt_modified":"2026-06-30T18:39:29.623384+08:00"},{"id":3296,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4e817a7f3bd90bb9e57c6a2e9009380f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/otaTargetDevice.js#1-57","gmt_create":"2026-06-30T18:39:29.623559+08:00","gmt_modified":"2026-06-30T18:39:29.623559+08:00"},{"id":3297,"source_id":"5973b5959029669ade01898821960785","target_id":"4e817a7f3bd90bb9e57c6a2e9009380f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-06-30T18:39:29.623688+08:00","gmt_modified":"2026-06-30T18:39:29.623688+08:00"},{"id":3298,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"72de55f3f022487777e9ad301c9d942b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#1-223","gmt_create":"2026-06-30T18:39:29.623918+08:00","gmt_modified":"2026-06-30T18:39:29.623918+08:00"},{"id":3299,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"72de55f3f022487777e9ad301c9d942b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-223","gmt_create":"2026-06-30T18:39:29.624048+08:00","gmt_modified":"2026-06-30T18:39:29.624048+08:00"},{"id":3300,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ba9810388706ac5ffb0156f74ada8b88","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#1-248","gmt_create":"2026-06-30T18:39:29.624221+08:00","gmt_modified":"2026-06-30T18:39:29.624221+08:00"},{"id":3301,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"ba9810388706ac5ffb0156f74ada8b88","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-248","gmt_create":"2026-06-30T18:39:29.62434+08:00","gmt_modified":"2026-06-30T18:39:29.62434+08:00"},{"id":3302,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"f3b38dfd34a76e0d2e62a863fca301a8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#420-831","gmt_create":"2026-06-30T18:39:29.625105+08:00","gmt_modified":"2026-06-30T18:39:29.625105+08:00"},{"id":3303,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"f3b38dfd34a76e0d2e62a863fca301a8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 420-831","gmt_create":"2026-06-30T18:39:29.625218+08:00","gmt_modified":"2026-06-30T18:39:29.625218+08:00"},{"id":3304,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ae7ce676a4f649c15d0490bbb2954cfe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#13-67","gmt_create":"2026-06-30T18:39:29.625427+08:00","gmt_modified":"2026-06-30T18:39:29.625427+08:00"},{"id":3305,"source_id":"29e96dbf4d3d8f6e116ec620bbf504ad","target_id":"ae7ce676a4f649c15d0490bbb2954cfe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-67","gmt_create":"2026-06-30T18:39:29.625541+08:00","gmt_modified":"2026-06-30T18:39:29.625541+08:00"},{"id":3306,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"859ba4011a4720ad0ad431545e144986","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/blacklist.js#12-56","gmt_create":"2026-06-30T18:39:29.625693+08:00","gmt_modified":"2026-06-30T18:39:29.625693+08:00"},{"id":3307,"source_id":"5ceb781f55bf90055f3005880d06ee2a","target_id":"859ba4011a4720ad0ad431545e144986","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-56","gmt_create":"2026-06-30T18:39:29.625828+08:00","gmt_modified":"2026-06-30T18:39:29.625828+08:00"},{"id":3308,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"c910f65a89648ecf30c84b77b136ad70","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/otaTargetDevice.js#12-55","gmt_create":"2026-06-30T18:39:29.625982+08:00","gmt_modified":"2026-06-30T18:39:29.625982+08:00"},{"id":3309,"source_id":"5973b5959029669ade01898821960785","target_id":"c910f65a89648ecf30c84b77b136ad70","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-55","gmt_create":"2026-06-30T18:39:29.626098+08:00","gmt_modified":"2026-06-30T18:39:29.626098+08:00"},{"id":3310,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"c042223cf0aa5b2e59be1747923b4baf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#13-49","gmt_create":"2026-06-30T18:39:29.626374+08:00","gmt_modified":"2026-06-30T18:39:29.626374+08:00"},{"id":3311,"source_id":"29e96dbf4d3d8f6e116ec620bbf504ad","target_id":"c042223cf0aa5b2e59be1747923b4baf","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-49","gmt_create":"2026-06-30T18:39:29.626551+08:00","gmt_modified":"2026-06-30T18:39:29.626551+08:00"},{"id":3312,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"b1e9d90908a2a5e3d545ca0cf2c86769","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#24-268","gmt_create":"2026-06-30T18:39:29.626904+08:00","gmt_modified":"2026-06-30T18:39:29.626904+08:00"},{"id":3313,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"b1e9d90908a2a5e3d545ca0cf2c86769","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-268","gmt_create":"2026-06-30T18:39:29.627017+08:00","gmt_modified":"2026-06-30T18:39:29.627017+08:00"},{"id":3314,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"aae8712924efab58e019d0c963576781","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#96-139","gmt_create":"2026-06-30T18:39:29.627222+08:00","gmt_modified":"2026-06-30T18:39:29.627222+08:00"},{"id":3315,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"aae8712924efab58e019d0c963576781","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-139","gmt_create":"2026-06-30T18:39:29.627488+08:00","gmt_modified":"2026-06-30T18:39:29.627488+08:00"},{"id":3316,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"fb9daf52780951bc4b93f14b1fcfa8f1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#96-139","gmt_create":"2026-06-30T18:39:29.627693+08:00","gmt_modified":"2026-06-30T18:39:29.627693+08:00"},{"id":3317,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"fb9daf52780951bc4b93f14b1fcfa8f1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-139","gmt_create":"2026-06-30T18:39:29.627822+08:00","gmt_modified":"2026-06-30T18:39:29.627822+08:00"},{"id":3318,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"23aa29b61d1387fca0530a0a1e57e27f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#1-292","gmt_create":"2026-06-30T18:39:29.628032+08:00","gmt_modified":"2026-06-30T18:39:29.628032+08:00"},{"id":3319,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"23aa29b61d1387fca0530a0a1e57e27f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-292","gmt_create":"2026-06-30T18:39:29.628183+08:00","gmt_modified":"2026-06-30T18:39:29.628183+08:00"},{"id":3320,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"e6f541a0af8390b3610d1e380a8d3236","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#4-94","gmt_create":"2026-06-30T18:39:29.628646+08:00","gmt_modified":"2026-06-30T18:39:29.628646+08:00"},{"id":3321,"source_id":"fc2d0cc85e5f2565c3105cbe0584903a","target_id":"e6f541a0af8390b3610d1e380a8d3236","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 4-94","gmt_create":"2026-06-30T18:39:29.628773+08:00","gmt_modified":"2026-06-30T18:39:29.628773+08:00"},{"id":3322,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4aad83e3e76ccc16e5b91d801ab1b278","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#5-36","gmt_create":"2026-06-30T18:39:29.628938+08:00","gmt_modified":"2026-06-30T18:39:29.628938+08:00"},{"id":3323,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"4aad83e3e76ccc16e5b91d801ab1b278","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-36","gmt_create":"2026-06-30T18:39:29.629078+08:00","gmt_modified":"2026-06-30T18:39:29.629078+08:00"},{"id":3324,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"54c99704b8bcabdfe63adda9c4392452","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#5-37","gmt_create":"2026-06-30T18:39:29.62924+08:00","gmt_modified":"2026-06-30T18:39:29.62924+08:00"},{"id":3325,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"54c99704b8bcabdfe63adda9c4392452","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-37","gmt_create":"2026-06-30T18:39:29.629354+08:00","gmt_modified":"2026-06-30T18:39:29.629354+08:00"},{"id":3326,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#1-97","gmt_create":"2026-06-30T18:39:29.629506+08:00","gmt_modified":"2026-06-30T18:39:29.629506+08:00"},{"id":3327,"source_id":"fc2d0cc85e5f2565c3105cbe0584903a","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-97","gmt_create":"2026-06-30T18:39:29.629647+08:00","gmt_modified":"2026-06-30T18:39:29.629647+08:00"},{"id":3328,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"058bc5c3e018c854b5cf42905abd45d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#1-36","gmt_create":"2026-06-30T18:39:29.629815+08:00","gmt_modified":"2026-06-30T18:39:29.629815+08:00"},{"id":3329,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"058bc5c3e018c854b5cf42905abd45d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-36","gmt_create":"2026-06-30T18:39:29.629939+08:00","gmt_modified":"2026-06-30T18:39:29.629939+08:00"},{"id":3330,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"3830639d0b7444aa8a1cf3c80d4eef7e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#1-37","gmt_create":"2026-06-30T18:39:29.630118+08:00","gmt_modified":"2026-06-30T18:39:29.630118+08:00"},{"id":3331,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"3830639d0b7444aa8a1cf3c80d4eef7e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-37","gmt_create":"2026-06-30T18:39:29.633252+08:00","gmt_modified":"2026-06-30T18:39:29.633252+08:00"},{"id":3332,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"be497152bcedca75299e4c2521c11859","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#46-103","gmt_create":"2026-06-30T18:39:29.633431+08:00","gmt_modified":"2026-06-30T18:39:29.633431+08:00"},{"id":3333,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"be497152bcedca75299e4c2521c11859","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 46-103","gmt_create":"2026-06-30T18:39:29.633531+08:00","gmt_modified":"2026-06-30T18:39:29.633531+08:00"},{"id":3334,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"af76fcd4277eeb577f573e21de923bbf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/config/env.js#1-13","gmt_create":"2026-06-30T18:39:29.633724+08:00","gmt_modified":"2026-06-30T18:39:29.633724+08:00"},{"id":3335,"source_id":"2a04b070bd67fc5059bb504232687d64","target_id":"af76fcd4277eeb577f573e21de923bbf","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-13","gmt_create":"2026-06-30T18:39:29.633843+08:00","gmt_modified":"2026-06-30T18:39:29.633843+08:00"},{"id":3336,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"b8c21c93e526039c96f1df526ebdcafe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#1-113","gmt_create":"2026-06-30T18:39:29.633998+08:00","gmt_modified":"2026-06-30T18:39:29.633998+08:00"},{"id":3337,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"b8c21c93e526039c96f1df526ebdcafe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-113","gmt_create":"2026-06-30T18:39:29.634119+08:00","gmt_modified":"2026-06-30T18:39:29.634119+08:00"},{"id":3338,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"424dfd038ca84be6195b08d7032a1235","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#68-102","gmt_create":"2026-06-30T18:39:29.634371+08:00","gmt_modified":"2026-06-30T18:39:29.634371+08:00"},{"id":3339,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"424dfd038ca84be6195b08d7032a1235","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 68-102","gmt_create":"2026-06-30T18:39:29.63449+08:00","gmt_modified":"2026-06-30T18:39:29.63449+08:00"},{"id":3340,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"2fc67d9140f7c12759a5188eb6f9b204","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#305-338","gmt_create":"2026-06-30T18:39:29.634627+08:00","gmt_modified":"2026-06-30T18:39:29.634627+08:00"},{"id":3341,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"2fc67d9140f7c12759a5188eb6f9b204","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 305-338","gmt_create":"2026-06-30T18:39:29.634747+08:00","gmt_modified":"2026-06-30T18:39:29.634747+08:00"},{"id":3342,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/utils/response.js#1-25","gmt_create":"2026-06-30T18:39:29.63491+08:00","gmt_modified":"2026-06-30T18:39:29.63491+08:00"},{"id":3343,"source_id":"30f836e18a6bf9cbcf650e5884375a93","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-25","gmt_create":"2026-06-30T18:39:29.635031+08:00","gmt_modified":"2026-06-30T18:39:29.635031+08:00"},{"id":3344,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"cabe1728acba4dab25a86b5788412e46","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#25-66","gmt_create":"2026-06-30T18:39:29.635187+08:00","gmt_modified":"2026-06-30T18:39:29.635187+08:00"},{"id":3345,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"cabe1728acba4dab25a86b5788412e46","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-66","gmt_create":"2026-06-30T18:39:29.635325+08:00","gmt_modified":"2026-06-30T18:39:29.635325+08:00"},{"id":3346,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"45f0756fae3928b75883500a5006f7f0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#645-734","gmt_create":"2026-06-30T18:39:29.635489+08:00","gmt_modified":"2026-06-30T18:39:29.635489+08:00"},{"id":3347,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"45f0756fae3928b75883500a5006f7f0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 645-734","gmt_create":"2026-06-30T18:39:29.635587+08:00","gmt_modified":"2026-06-30T18:39:29.635587+08:00"},{"id":3348,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"f2e521eddcaa25c62a309d5b0af997fa","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#96-204","gmt_create":"2026-06-30T18:39:29.635812+08:00","gmt_modified":"2026-06-30T18:39:29.635812+08:00"},{"id":3349,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"f2e521eddcaa25c62a309d5b0af997fa","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-204","gmt_create":"2026-06-30T18:39:29.635929+08:00","gmt_modified":"2026-06-30T18:39:29.635929+08:00"},{"id":3350,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"6b7ea701575cf98b6ee3431f68ad5649","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#736-817","gmt_create":"2026-06-30T18:39:29.636087+08:00","gmt_modified":"2026-06-30T18:39:29.636087+08:00"},{"id":3351,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"6b7ea701575cf98b6ee3431f68ad5649","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 736-817","gmt_create":"2026-06-30T18:39:29.636205+08:00","gmt_modified":"2026-06-30T18:39:29.636205+08:00"},{"id":3352,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"506ecfb839ed7fb3f4199ade7e4b6a64","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#96-208","gmt_create":"2026-06-30T18:39:29.636418+08:00","gmt_modified":"2026-06-30T18:39:29.636418+08:00"},{"id":3353,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"506ecfb839ed7fb3f4199ade7e4b6a64","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-208","gmt_create":"2026-06-30T18:39:29.636531+08:00","gmt_modified":"2026-06-30T18:39:29.636531+08:00"},{"id":3354,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"7a5ae98472bdc4806472d50e6b88c997","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/utils/request.js#1-72","gmt_create":"2026-06-30T18:39:29.636691+08:00","gmt_modified":"2026-06-30T18:39:29.636691+08:00"},{"id":3355,"source_id":"34fcf7aeb55a9c0224c554fc48545063","target_id":"7a5ae98472bdc4806472d50e6b88c997","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-72","gmt_create":"2026-06-30T18:39:29.636799+08:00","gmt_modified":"2026-06-30T18:39:29.6368+08:00"},{"id":3356,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"69c930f997042246d4e17369ede6f826","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/router/index.js#1-91","gmt_create":"2026-06-30T18:39:29.636927+08:00","gmt_modified":"2026-06-30T18:39:29.636927+08:00"},{"id":3357,"source_id":"08b8d17e3c09b326687a7bca6789507a","target_id":"69c930f997042246d4e17369ede6f826","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-91","gmt_create":"2026-06-30T18:39:29.637036+08:00","gmt_modified":"2026-06-30T18:39:29.637036+08:00"},{"id":3358,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"6b61c60063d41432a3cc1ac4d1699181","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/utils/request.js#44-69","gmt_create":"2026-06-30T18:39:29.638051+08:00","gmt_modified":"2026-06-30T18:39:29.638051+08:00"},{"id":3359,"source_id":"34fcf7aeb55a9c0224c554fc48545063","target_id":"6b61c60063d41432a3cc1ac4d1699181","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 44-69","gmt_create":"2026-06-30T18:39:29.638209+08:00","gmt_modified":"2026-06-30T18:39:29.638209+08:00"},{"id":3360,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"752be7590bb954b39e5a8f41ce8811eb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#159-183","gmt_create":"2026-06-30T18:39:29.638353+08:00","gmt_modified":"2026-06-30T18:39:29.638353+08:00"},{"id":3361,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"752be7590bb954b39e5a8f41ce8811eb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 159-183","gmt_create":"2026-06-30T18:39:29.638443+08:00","gmt_modified":"2026-06-30T18:39:29.638443+08:00"},{"id":3362,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4daa6ac2900ccb8c9fd7142d0ecdd298","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#142-208","gmt_create":"2026-06-30T18:39:29.638592+08:00","gmt_modified":"2026-06-30T18:39:29.638592+08:00"},{"id":3363,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"4daa6ac2900ccb8c9fd7142d0ecdd298","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 142-208","gmt_create":"2026-06-30T18:39:29.638702+08:00","gmt_modified":"2026-06-30T18:39:29.638702+08:00"},{"id":3364,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"e22545d86c6efa26c57aea0e355a57f6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DEPLOY.md#226-256","gmt_create":"2026-06-30T18:39:29.638841+08:00","gmt_modified":"2026-06-30T18:39:29.638841+08:00"},{"id":3365,"source_id":"0c25a991664c34b2b36ce3aeed80f4da","target_id":"e22545d86c6efa26c57aea0e355a57f6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 226-256","gmt_create":"2026-06-30T18:39:29.638935+08:00","gmt_modified":"2026-06-30T18:39:29.638935+08:00"},{"id":3366,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"fc2d0cc85e5f2565c3105cbe0584903a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Ota.js","gmt_create":"2026-06-30T18:39:56.530513+08:00","gmt_modified":"2026-06-30T18:39:56.530513+08:00"},{"id":3367,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"a84967d9d3088fba02de385738e7ca27","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/BlackList.js","gmt_create":"2026-06-30T18:39:56.530752+08:00","gmt_modified":"2026-06-30T18:39:56.530752+08:00"},{"id":3368,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4ca379f147f6f1da710371999e08dc24","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/OtaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.530901+08:00","gmt_modified":"2026-06-30T18:39:56.530901+08:00"},{"id":3369,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"ba84445ce5118798ce7d0da4ecb4d5e2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/ota.js","gmt_create":"2026-06-30T18:39:56.531051+08:00","gmt_modified":"2026-06-30T18:39:56.531051+08:00"},{"id":3370,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"71a563f23b46da0255a6400402bbfa05","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/blacklist.js","gmt_create":"2026-06-30T18:39:56.531158+08:00","gmt_modified":"2026-06-30T18:39:56.531158+08:00"},{"id":3371,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"ea6e178b2f0bdcefe2ae8800166453d5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.531315+08:00","gmt_modified":"2026-06-30T18:39:56.531315+08:00"},{"id":3372,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"a15b46bcf0be7bfbc82e57adca5be630","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/otaStorage.js","gmt_create":"2026-06-30T18:39:56.531436+08:00","gmt_modified":"2026-06-30T18:39:56.531436+08:00"},{"id":3373,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"99aa92df5b8c8412119e9b3cb015f8c4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/ota.js","gmt_create":"2026-06-30T18:39:56.531564+08:00","gmt_modified":"2026-06-30T18:39:56.531564+08:00"},{"id":3374,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0d26d3961441eb708b69c96f1ed1f7b7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/blacklist.js","gmt_create":"2026-06-30T18:39:56.531677+08:00","gmt_modified":"2026-06-30T18:39:56.531677+08:00"},{"id":3375,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"8a4e619bfb6be9c463274f96a2dcb5a0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.531828+08:00","gmt_modified":"2026-06-30T18:39:56.531828+08:00"},{"id":3376,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"30f836e18a6bf9cbcf650e5884375a93","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/utils/response.js","gmt_create":"2026-06-30T18:39:56.531932+08:00","gmt_modified":"2026-06-30T18:39:56.531932+08:00"},{"id":3377,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"2a04b070bd67fc5059bb504232687d64","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/config/env.js","gmt_create":"2026-06-30T18:39:56.53205+08:00","gmt_modified":"2026-06-30T18:39:56.53205+08:00"},{"id":3378,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"cb4575c8c79b7b9f6ffdac43c2369b95","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/config/database.js","gmt_create":"2026-06-30T18:39:56.532162+08:00","gmt_modified":"2026-06-30T18:39:56.532162+08:00"},{"id":3379,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4bb9a8c7ac3763db0746ff90788525b6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/ota/index.vue","gmt_create":"2026-06-30T18:39:56.532265+08:00","gmt_modified":"2026-06-30T18:39:56.532265+08:00"},{"id":3380,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0eb021ef791f4679788fe98caea23e31","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/blacklist/index.vue","gmt_create":"2026-06-30T18:39:56.532386+08:00","gmt_modified":"2026-06-30T18:39:56.532386+08:00"},{"id":3381,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"cc4227daf4f2b37377be96fcc492e509","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/ota-target-device/index.vue","gmt_create":"2026-06-30T18:39:56.532524+08:00","gmt_modified":"2026-06-30T18:39:56.532524+08:00"},{"id":3382,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"29e96dbf4d3d8f6e116ec620bbf504ad","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/ota.js","gmt_create":"2026-06-30T18:39:56.53265+08:00","gmt_modified":"2026-06-30T18:39:56.53265+08:00"},{"id":3383,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"5ceb781f55bf90055f3005880d06ee2a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/blacklist.js","gmt_create":"2026-06-30T18:39:56.532804+08:00","gmt_modified":"2026-06-30T18:39:56.532804+08:00"},{"id":3384,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"5973b5959029669ade01898821960785","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.532906+08:00","gmt_modified":"2026-06-30T18:39:56.532906+08:00"},{"id":3385,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"23aa29b61d1387fca0530a0a1e57e27f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#1-292","gmt_create":"2026-06-30T18:39:56.53307+08:00","gmt_modified":"2026-06-30T18:39:56.53307+08:00"},{"id":3386,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"72de55f3f022487777e9ad301c9d942b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#1-223","gmt_create":"2026-06-30T18:39:56.533275+08:00","gmt_modified":"2026-06-30T18:39:56.533275+08:00"},{"id":3387,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"ba9810388706ac5ffb0156f74ada8b88","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#1-248","gmt_create":"2026-06-30T18:39:56.533479+08:00","gmt_modified":"2026-06-30T18:39:56.533479+08:00"},{"id":3388,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#1-97","gmt_create":"2026-06-30T18:39:56.533642+08:00","gmt_modified":"2026-06-30T18:39:56.533642+08:00"},{"id":3389,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"05900505c40339d0cc93870281600479","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#1-37","gmt_create":"2026-06-30T18:39:56.533836+08:00","gmt_modified":"2026-06-30T18:39:56.533836+08:00"},{"id":3390,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"05900505c40339d0cc93870281600479","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-37","gmt_create":"2026-06-30T18:39:56.533939+08:00","gmt_modified":"2026-06-30T18:39:56.533939+08:00"},{"id":3391,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"921d509d2d71df1e2bace1390640482a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#1-38","gmt_create":"2026-06-30T18:39:56.534096+08:00","gmt_modified":"2026-06-30T18:39:56.534096+08:00"},{"id":3392,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"921d509d2d71df1e2bace1390640482a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-38","gmt_create":"2026-06-30T18:39:56.534213+08:00","gmt_modified":"2026-06-30T18:39:56.534213+08:00"},{"id":3393,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"149a41cdd5807ad4f666e9eb2463fa68","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#1-628","gmt_create":"2026-06-30T18:39:56.534352+08:00","gmt_modified":"2026-06-30T18:39:56.534352+08:00"},{"id":3394,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"149a41cdd5807ad4f666e9eb2463fa68","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-628","gmt_create":"2026-06-30T18:39:56.534456+08:00","gmt_modified":"2026-06-30T18:39:56.534456+08:00"},{"id":3395,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"771e33c2a04ba5eb1a504cf7aa1e9c36","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/blacklist/index.vue#1-381","gmt_create":"2026-06-30T18:39:56.53458+08:00","gmt_modified":"2026-06-30T18:39:56.53458+08:00"},{"id":3396,"source_id":"0eb021ef791f4679788fe98caea23e31","target_id":"771e33c2a04ba5eb1a504cf7aa1e9c36","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-381","gmt_create":"2026-06-30T18:39:56.534732+08:00","gmt_modified":"2026-06-30T18:39:56.534732+08:00"},{"id":3397,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"f23242497ee4dc9ed490a1d09d0d3d91","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota-target-device/index.vue#1-386","gmt_create":"2026-06-30T18:39:56.534886+08:00","gmt_modified":"2026-06-30T18:39:56.534886+08:00"},{"id":3398,"source_id":"cc4227daf4f2b37377be96fcc492e509","target_id":"f23242497ee4dc9ed490a1d09d0d3d91","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-386","gmt_create":"2026-06-30T18:39:56.535014+08:00","gmt_modified":"2026-06-30T18:39:56.535014+08:00"},{"id":3399,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"b8c21c93e526039c96f1df526ebdcafe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#1-113","gmt_create":"2026-06-30T18:39:56.535896+08:00","gmt_modified":"2026-06-30T18:39:56.535896+08:00"},{"id":3400,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0c0ca507fcaf2164af19adf77eaf72e8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/ota.js#1-36","gmt_create":"2026-06-30T18:39:56.53607+08:00","gmt_modified":"2026-06-30T18:39:56.53607+08:00"},{"id":3401,"source_id":"99aa92df5b8c8412119e9b3cb015f8c4","target_id":"0c0ca507fcaf2164af19adf77eaf72e8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-36","gmt_create":"2026-06-30T18:39:56.536174+08:00","gmt_modified":"2026-06-30T18:39:56.536174+08:00"},{"id":3402,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"420851439a300cff8b7fa324589ce87a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/blacklist.js#1-14","gmt_create":"2026-06-30T18:39:56.536294+08:00","gmt_modified":"2026-06-30T18:39:56.536294+08:00"},{"id":3403,"source_id":"0d26d3961441eb708b69c96f1ed1f7b7","target_id":"420851439a300cff8b7fa324589ce87a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-14","gmt_create":"2026-06-30T18:39:56.536388+08:00","gmt_modified":"2026-06-30T18:39:56.536388+08:00"},{"id":3404,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e92ce9787ed66ea4dd0821e0c8f28d8a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/otaTargetDevice.js#1-14","gmt_create":"2026-06-30T18:39:56.536524+08:00","gmt_modified":"2026-06-30T18:39:56.536524+08:00"},{"id":3405,"source_id":"8a4e619bfb6be9c463274f96a2dcb5a0","target_id":"e92ce9787ed66ea4dd0821e0c8f28d8a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-14","gmt_create":"2026-06-30T18:39:56.536607+08:00","gmt_modified":"2026-06-30T18:39:56.536607+08:00"},{"id":3406,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0696a947e8ffd03fd403809f77673c55","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#24-66","gmt_create":"2026-06-30T18:39:56.536822+08:00","gmt_modified":"2026-06-30T18:39:56.536822+08:00"},{"id":3407,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"0696a947e8ffd03fd403809f77673c55","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-66","gmt_create":"2026-06-30T18:39:56.536933+08:00","gmt_modified":"2026-06-30T18:39:56.536933+08:00"},{"id":3408,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"424dfd038ca84be6195b08d7032a1235","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#68-102","gmt_create":"2026-06-30T18:39:56.537069+08:00","gmt_modified":"2026-06-30T18:39:56.53707+08:00"},{"id":3409,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"be497152bcedca75299e4c2521c11859","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#46-103","gmt_create":"2026-06-30T18:39:56.537221+08:00","gmt_modified":"2026-06-30T18:39:56.537221+08:00"},{"id":3410,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0f5328f2be7159ab2f533662f8992b10","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#384-412","gmt_create":"2026-06-30T18:39:56.537364+08:00","gmt_modified":"2026-06-30T18:39:56.537364+08:00"},{"id":3411,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"0f5328f2be7159ab2f533662f8992b10","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 384-412","gmt_create":"2026-06-30T18:39:56.537465+08:00","gmt_modified":"2026-06-30T18:39:56.537465+08:00"},{"id":3412,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e6f541a0af8390b3610d1e380a8d3236","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#4-94","gmt_create":"2026-06-30T18:39:56.537604+08:00","gmt_modified":"2026-06-30T18:39:56.537604+08:00"},{"id":3413,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"b6918b1988464553531aec983ea27b7d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#5-32","gmt_create":"2026-06-30T18:39:56.537774+08:00","gmt_modified":"2026-06-30T18:39:56.537774+08:00"},{"id":3414,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"b6918b1988464553531aec983ea27b7d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-32","gmt_create":"2026-06-30T18:39:56.537912+08:00","gmt_modified":"2026-06-30T18:39:56.537912+08:00"},{"id":3415,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"59e0c0eb304ea8fbb7145bc038c8fdf6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#5-33","gmt_create":"2026-06-30T18:39:56.538023+08:00","gmt_modified":"2026-06-30T18:39:56.538023+08:00"},{"id":3416,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"59e0c0eb304ea8fbb7145bc038c8fdf6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-33","gmt_create":"2026-06-30T18:39:56.538117+08:00","gmt_modified":"2026-06-30T18:39:56.538117+08:00"},{"id":3417,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0991eb53c8fe806cf46decab5e748f75","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#72-103","gmt_create":"2026-06-30T18:39:56.538566+08:00","gmt_modified":"2026-06-30T18:39:56.538566+08:00"},{"id":3418,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"0991eb53c8fe806cf46decab5e748f75","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 72-103","gmt_create":"2026-06-30T18:39:56.538694+08:00","gmt_modified":"2026-06-30T18:39:56.538694+08:00"},{"id":3419,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"a826e77f133d3db11e600f30b88f4e9a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/ota.js#3-35","gmt_create":"2026-06-30T18:39:56.539109+08:00","gmt_modified":"2026-06-30T18:39:56.539109+08:00"},{"id":3420,"source_id":"99aa92df5b8c8412119e9b3cb015f8c4","target_id":"a826e77f133d3db11e600f30b88f4e9a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-35","gmt_create":"2026-06-30T18:39:56.53922+08:00","gmt_modified":"2026-06-30T18:39:56.53922+08:00"},{"id":3421,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4a33d32c1578fd612d900aa17246d8c2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/blacklist.js#3-11","gmt_create":"2026-06-30T18:39:56.539329+08:00","gmt_modified":"2026-06-30T18:39:56.539329+08:00"},{"id":3422,"source_id":"0d26d3961441eb708b69c96f1ed1f7b7","target_id":"4a33d32c1578fd612d900aa17246d8c2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-11","gmt_create":"2026-06-30T18:39:56.539438+08:00","gmt_modified":"2026-06-30T18:39:56.539438+08:00"},{"id":3423,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4660c7ce6daeb3f765d39856dcf95f6f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/otaTargetDevice.js#3-11","gmt_create":"2026-06-30T18:39:56.539551+08:00","gmt_modified":"2026-06-30T18:39:56.539551+08:00"},{"id":3424,"source_id":"8a4e619bfb6be9c463274f96a2dcb5a0","target_id":"4660c7ce6daeb3f765d39856dcf95f6f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-11","gmt_create":"2026-06-30T18:39:56.53963+08:00","gmt_modified":"2026-06-30T18:39:56.53963+08:00"},{"id":3425,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/utils/response.js#1-25","gmt_create":"2026-06-30T18:39:56.539736+08:00","gmt_modified":"2026-06-30T18:39:56.539736+08:00"},{"id":3426,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"7467dc2e2d22c93c63fa6342b2e08541","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#420-579","gmt_create":"2026-06-30T18:39:56.540181+08:00","gmt_modified":"2026-06-30T18:39:56.540181+08:00"},{"id":3427,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"7467dc2e2d22c93c63fa6342b2e08541","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 420-579","gmt_create":"2026-06-30T18:39:56.540259+08:00","gmt_modified":"2026-06-30T18:39:56.540259+08:00"},{"id":3428,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4b5baf2b8dcd8468722cd31868c794b2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#645-683","gmt_create":"2026-06-30T18:39:56.540384+08:00","gmt_modified":"2026-06-30T18:39:56.540384+08:00"},{"id":3429,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"4b5baf2b8dcd8468722cd31868c794b2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 645-683","gmt_create":"2026-06-30T18:39:56.540462+08:00","gmt_modified":"2026-06-30T18:39:56.540462+08:00"},{"id":3430,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"3e935f654a28968186e9260f2c5035c7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#1-68","gmt_create":"2026-06-30T18:39:56.540837+08:00","gmt_modified":"2026-06-30T18:39:56.540837+08:00"},{"id":3431,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"edbb69e747bbcd76dd1bc3a361ebf7c0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/blacklist.js#1-57","gmt_create":"2026-06-30T18:39:56.540981+08:00","gmt_modified":"2026-06-30T18:39:56.540981+08:00"},{"id":3432,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4e817a7f3bd90bb9e57c6a2e9009380f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/otaTargetDevice.js#1-57","gmt_create":"2026-06-30T18:39:56.541105+08:00","gmt_modified":"2026-06-30T18:39:56.541105+08:00"},{"id":3433,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"20e79ab592f63eb9d23c0d563d5f5202","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#16-71","gmt_create":"2026-06-30T18:39:56.541459+08:00","gmt_modified":"2026-06-30T18:39:56.541459+08:00"},{"id":3434,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"20e79ab592f63eb9d23c0d563d5f5202","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-71","gmt_create":"2026-06-30T18:39:56.541542+08:00","gmt_modified":"2026-06-30T18:39:56.541542+08:00"},{"id":3435,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"07afcaa71195b3d86386dcde14973a8d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#96-131","gmt_create":"2026-06-30T18:39:56.541674+08:00","gmt_modified":"2026-06-30T18:39:56.541674+08:00"},{"id":3436,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"07afcaa71195b3d86386dcde14973a8d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-131","gmt_create":"2026-06-30T18:39:56.541757+08:00","gmt_modified":"2026-06-30T18:39:56.541757+08:00"},{"id":3437,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"2a5364613dbf0723f2e2a64affabb065","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/blacklist/index.vue#144-346","gmt_create":"2026-06-30T18:39:56.543701+08:00","gmt_modified":"2026-06-30T18:39:56.543701+08:00"},{"id":3438,"source_id":"0eb021ef791f4679788fe98caea23e31","target_id":"2a5364613dbf0723f2e2a64affabb065","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 144-346","gmt_create":"2026-06-30T18:39:56.54385+08:00","gmt_modified":"2026-06-30T18:39:56.54385+08:00"},{"id":3439,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"12ad7a8b54f39c0717843220f341d59e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#16-71","gmt_create":"2026-06-30T18:39:56.544322+08:00","gmt_modified":"2026-06-30T18:39:56.544322+08:00"},{"id":3440,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"12ad7a8b54f39c0717843220f341d59e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-71","gmt_create":"2026-06-30T18:39:56.544408+08:00","gmt_modified":"2026-06-30T18:39:56.544408+08:00"},{"id":3441,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"fb9daf52780951bc4b93f14b1fcfa8f1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#96-139","gmt_create":"2026-06-30T18:39:56.544514+08:00","gmt_modified":"2026-06-30T18:39:56.544514+08:00"},{"id":3442,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"585261a6626a815d8f5f83b91a086eb9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota-target-device/index.vue#144-351","gmt_create":"2026-06-30T18:39:56.544644+08:00","gmt_modified":"2026-06-30T18:39:56.544644+08:00"},{"id":3443,"source_id":"cc4227daf4f2b37377be96fcc492e509","target_id":"585261a6626a815d8f5f83b91a086eb9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 144-351","gmt_create":"2026-06-30T18:39:56.54475+08:00","gmt_modified":"2026-06-30T18:39:56.54475+08:00"},{"id":3444,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/package.json","gmt_create":"2026-06-30T18:39:56.545256+08:00","gmt_modified":"2026-06-30T18:39:56.545256+08:00"},{"id":3445,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"2a0437737a8daf4655f00caae7549a06","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/package.json#11-24","gmt_create":"2026-06-30T18:39:56.545352+08:00","gmt_modified":"2026-06-30T18:39:56.545352+08:00"},{"id":3446,"source_id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","target_id":"2a0437737a8daf4655f00caae7549a06","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-24","gmt_create":"2026-06-30T18:39:56.545472+08:00","gmt_modified":"2026-06-30T18:39:56.545472+08:00"},{"id":3447,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"f0cfbce84fd69ea625e215367d5da707","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/package.json#1-29","gmt_create":"2026-06-30T18:39:56.545601+08:00","gmt_modified":"2026-06-30T18:39:56.545601+08:00"},{"id":3448,"source_id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","target_id":"f0cfbce84fd69ea625e215367d5da707","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-29","gmt_create":"2026-06-30T18:39:56.545688+08:00","gmt_modified":"2026-06-30T18:39:56.545688+08:00"},{"id":3449,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"af76fcd4277eeb577f573e21de923bbf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/config/env.js#1-13","gmt_create":"2026-06-30T18:39:56.545882+08:00","gmt_modified":"2026-06-30T18:39:56.545882+08:00"},{"id":3450,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"fad5c52b0517044faace96133c6e570c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#174-181","gmt_create":"2026-06-30T18:39:56.546044+08:00","gmt_modified":"2026-06-30T18:39:56.546044+08:00"},{"id":3451,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"fad5c52b0517044faace96133c6e570c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 174-181","gmt_create":"2026-06-30T18:39:56.546129+08:00","gmt_modified":"2026-06-30T18:39:56.546129+08:00"},{"id":3452,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"f62834891fb8675fbb1dcb6654b186e9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#95-98","gmt_create":"2026-06-30T18:39:56.546273+08:00","gmt_modified":"2026-06-30T18:39:56.546273+08:00"},{"id":3453,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"f62834891fb8675fbb1dcb6654b186e9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 95-98","gmt_create":"2026-06-30T18:39:56.546352+08:00","gmt_modified":"2026-06-30T18:39:56.546353+08:00"},{"id":3454,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0c387969b601239a31cb0c672ef3c116","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#108-112","gmt_create":"2026-06-30T18:39:56.546458+08:00","gmt_modified":"2026-06-30T18:39:56.546458+08:00"},{"id":3455,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"0c387969b601239a31cb0c672ef3c116","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 108-112","gmt_create":"2026-06-30T18:39:56.546538+08:00","gmt_modified":"2026-06-30T18:39:56.546538+08:00"},{"id":3456,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"406e308cbdb4112d67f61a82a8118e9f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#108-112","gmt_create":"2026-06-30T18:39:56.546662+08:00","gmt_modified":"2026-06-30T18:39:56.546662+08:00"},{"id":3457,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"406e308cbdb4112d67f61a82a8118e9f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 108-112","gmt_create":"2026-06-30T18:39:56.546751+08:00","gmt_modified":"2026-06-30T18:39:56.546751+08:00"},{"id":3458,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"da7627b0-17b7-42c7-a029-e357bc889416","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e da7627b0-17b7-42c7-a029-e357bc889416","gmt_create":"2026-06-30T18:39:57.127914+08:00","gmt_modified":"2026-06-30T18:39:57.127915+08:00"},{"id":3459,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 7d8f2ef6-290d-4952-b59c-a1d95af0d438","gmt_create":"2026-06-30T18:39:57.129556+08:00","gmt_modified":"2026-06-30T18:39:57.129556+08:00"}],"source_files":[{"id":"fc2d0cc85e5f2565c3105cbe0584903a","path":"backend/src/models/Ota.js","filename":"Ota.js","gmt_create":"2026-06-30T18:39:29.607957+08:00","gmt_modified":"2026-06-30T18:39:29.607957+08:00"},{"id":"ba84445ce5118798ce7d0da4ecb4d5e2","path":"backend/src/routes/ota.js","filename":"ota.js","gmt_create":"2026-06-30T18:39:29.608112+08:00","gmt_modified":"2026-06-30T18:39:29.608112+08:00"},{"id":"a15b46bcf0be7bfbc82e57adca5be630","path":"backend/src/services/otaStorage.js","filename":"otaStorage.js","gmt_create":"2026-06-30T18:39:29.608175+08:00","gmt_modified":"2026-06-30T18:39:29.608175+08:00"},{"id":"4bb9a8c7ac3763db0746ff90788525b6","path":"frontend/src/views/ota/index.vue","filename":"index.vue","gmt_create":"2026-06-30T18:39:29.608241+08:00","gmt_modified":"2026-06-30T18:39:29.608241+08:00"},{"id":"29e96dbf4d3d8f6e116ec620bbf504ad","path":"frontend/src/api/ota.js","filename":"ota.js","gmt_create":"2026-06-30T18:39:29.608321+08:00","gmt_modified":"2026-06-30T18:39:29.608321+08:00"},{"id":"5ceb781f55bf90055f3005880d06ee2a","path":"frontend/src/api/blacklist.js","filename":"blacklist.js","gmt_create":"2026-06-30T18:39:29.608385+08:00","gmt_modified":"2026-06-30T18:39:29.608385+08:00"},{"id":"5973b5959029669ade01898821960785","path":"frontend/src/api/otaTargetDevice.js","filename":"otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.608452+08:00","gmt_modified":"2026-06-30T18:39:29.608452+08:00"},{"id":"a84967d9d3088fba02de385738e7ca27","path":"backend/src/models/BlackList.js","filename":"BlackList.js","gmt_create":"2026-06-30T18:39:29.60851+08:00","gmt_modified":"2026-06-30T18:39:29.60851+08:00"},{"id":"4ca379f147f6f1da710371999e08dc24","path":"backend/src/models/OtaTargetDevice.js","filename":"OtaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.608568+08:00","gmt_modified":"2026-06-30T18:39:29.608568+08:00"},{"id":"71a563f23b46da0255a6400402bbfa05","path":"backend/src/routes/blacklist.js","filename":"blacklist.js","gmt_create":"2026-06-30T18:39:29.608628+08:00","gmt_modified":"2026-06-30T18:39:29.608628+08:00"},{"id":"ea6e178b2f0bdcefe2ae8800166453d5","path":"backend/src/routes/otaTargetDevice.js","filename":"otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.608683+08:00","gmt_modified":"2026-06-30T18:39:29.608683+08:00"},{"id":"30f836e18a6bf9cbcf650e5884375a93","path":"backend/src/utils/response.js","filename":"response.js","gmt_create":"2026-06-30T18:39:29.60874+08:00","gmt_modified":"2026-06-30T18:39:29.608741+08:00"},{"id":"2a04b070bd67fc5059bb504232687d64","path":"backend/src/config/env.js","filename":"env.js","gmt_create":"2026-06-30T18:39:29.60883+08:00","gmt_modified":"2026-06-30T18:39:29.60883+08:00"},{"id":"34fcf7aeb55a9c0224c554fc48545063","path":"frontend/src/utils/request.js","filename":"request.js","gmt_create":"2026-06-30T18:39:29.608908+08:00","gmt_modified":"2026-06-30T18:39:29.608908+08:00"},{"id":"08b8d17e3c09b326687a7bca6789507a","path":"frontend/src/router/index.js","filename":"index.js","gmt_create":"2026-06-30T18:39:29.608963+08:00","gmt_modified":"2026-06-30T18:39:29.608963+08:00"},{"id":"0c25a991664c34b2b36ce3aeed80f4da","path":"DEPLOY.md","filename":"DEPLOY.md","gmt_create":"2026-06-30T18:39:29.60902+08:00","gmt_modified":"2026-06-30T18:39:29.60902+08:00"},{"id":"99aa92df5b8c8412119e9b3cb015f8c4","path":"backend/src/validators/ota.js","filename":"ota.js","gmt_create":"2026-06-30T18:39:56.519241+08:00","gmt_modified":"2026-06-30T18:39:56.519241+08:00"},{"id":"0d26d3961441eb708b69c96f1ed1f7b7","path":"backend/src/validators/blacklist.js","filename":"blacklist.js","gmt_create":"2026-06-30T18:39:56.519295+08:00","gmt_modified":"2026-06-30T18:39:56.519295+08:00"},{"id":"8a4e619bfb6be9c463274f96a2dcb5a0","path":"backend/src/validators/otaTargetDevice.js","filename":"otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.519437+08:00","gmt_modified":"2026-06-30T18:39:56.519437+08:00"},{"id":"cb4575c8c79b7b9f6ffdac43c2369b95","path":"backend/src/config/database.js","filename":"database.js","gmt_create":"2026-06-30T18:39:56.519757+08:00","gmt_modified":"2026-06-30T18:39:56.519757+08:00"},{"id":"0eb021ef791f4679788fe98caea23e31","path":"frontend/src/views/blacklist/index.vue","filename":"index.vue","gmt_create":"2026-06-30T18:39:56.519888+08:00","gmt_modified":"2026-06-30T18:39:56.519889+08:00"},{"id":"cc4227daf4f2b37377be96fcc492e509","path":"frontend/src/views/ota-target-device/index.vue","filename":"index.vue","gmt_create":"2026-06-30T18:39:56.519934+08:00","gmt_modified":"2026-06-30T18:39:56.519934+08:00"},{"id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","path":"backend/package.json","filename":"package.json","gmt_create":"2026-06-30T18:39:56.529813+08:00","gmt_modified":"2026-06-30T18:39:56.529813+08:00"}],"wiki_catalogs":[{"id":"dd61923f-65f8-4e98-85f4-0e0a0a649a27","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"项目概述","description":"project-overview","prompt":"为耳机品牌与型号管理平台创建全面的项目概述内容。详细介绍项目的目标、核心功能和技术架构。解释系统的主要用途:品牌管理、型号配置、OTA固件升级、用户权限管理和分享码日志追踪。描述前后端分离架构,包括Vue 3前端和Express后端的技术组合。说明项目的业务价值和应用场景。提供快速开始指南,包括系统要求、安装步骤和基本使用方法。使用与代码库一致的术语,为初学者提供概念性概述,同时为有经验的开发者提供技术细节。","progress_status":"completed","dependent_files":"README.md,DEPLOY.md,docker-compose.yml","gmt_create":"2026-06-30T14:04:20.633103+08:00","gmt_modified":"2026-06-30T14:09:11.174236+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wV7ojrH0+b4JMz5OewwhBN1ELEwwkQElYbXolx+YIQM0o2FbBtwH/qJtog2gIHchdNwll6Nf1h+JmY9opyg7JsQs/7cTSSrfUmluAQwFCDAvmu/tGmL3XeCzrrmkOI88h7pvsgL2niGJR0xRh4Lglcxbrr0NK4gOQ45RwQchyzpGTB8IiO3XRTcNftONnEzDiJzVODyKOjZe52ws6XblEwu77xu3aef4IAzXLIbyoTb10Z/ue/QVjfqwkoEB9u5ciW4cJImri5dT+xVeLMwEADbmq8MbYy3QkUi4lCv+02P52HSrp5PmR0p110l5NRD3wnUyJ4H3excBt4DYq/WkTlWRnu7SL4FLbChfDRXox0FZjbrSrmstSyjrqOQs0i+3DWG1cAoapA34zEKMkiP2oxZKPn+7VEJ/X8+B7JhsqroKmAs/NykYkyA78uoY/rRIZzhCoDGERQV+E21xUWuvlE/M6M9LjVSnEkBww9yRnijToD6+usihE9d0zbv3MzXNqNqaye4++Ko+2iPoV2eV7lIQXwMto7c2DhmZGyJ5OEE45X826wBdjL/sO1X1QPuglr4HEFXnds8hBA4bPAqVmgptC8bfkf03XDZOL4nlmljZN+Kip5CAYgR9K5mKRD8ZS9gGT6ieJ0jbcHoo6kysaXa+jBICwzeAEQzmvxq2JqEukLdcKXOrZ0CgeeU8SADva7E+gvKzvS/4Zrbv5UEM8NkYcqeX4k9ERuVUjy5J96C0S2GCNR5OPStfW2tKkrorTKngImbE1l0f1/FI2ZhI5sSjUkzAZIKFeXBJpA1hZSNME+E+UIJ+RvcsprmVx62wG1PlwMBeEhu/9cGBj+i+qI6uAlGdhybWAqGSSxsLwdqCiwQEcylelO7fNlSrnz7amb1JuqBfUynCEzpnlNkv6l9jioHXV/fnJIOihiNh7v6/AMwtMvmSnr/j1oUAuJQuDAW149PMRpTre8XUtulayHzPj4ZY7R+4VpHR5kmYcTNmUnCf7Q26XVU6NLlv9Qu/gvQ2TPuGOKCs579fz3jbJC6rn+mQXlkz+vQFu2x4MrUvomEqqCVV9lv7ORQqVPJuJCH5onWcX84PFxIMq38bqGCQ="},{"id":"bcc45977-c058-4033-b0b1-9fd4cd7f4443","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"前端架构","description":"frontend-architecture","prompt":"创建前端架构文档,详细说明Vue 3单页应用的整体架构设计。解释Composition API的使用模式、组件层次结构、路由配置和状态管理策略。文档化Vite构建工具的配置和优化方案。说明前端与后端API的交互模式、错误处理机制和性能优化策略。包含组件通信模式、依赖管理和打包部署流程。提供前端开发环境配置和调试指南。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","progress_status":"completed","dependent_files":"frontend/src/main.js,frontend/src/App.vue,frontend/src/router/index.js,frontend/vite.config.js","gmt_create":"2026-06-30T14:04:44.763098+08:00","gmt_modified":"2026-06-30T14:14:52.87794+08:00","raw_data":"WikiEncrypted:rJ/rIw0gVau8jPGqKFBAsMR2XDSFypkKHZQ6YBOgiEB18etPNKW/AKXxDO5P260N8cfR8zM/FPLMKEziA2ENAEHVfReiRH5pH+fgWYT+2jYTA7RQlp0TufhpU942Hkc/ujxUhYq+V3QzFALbuwWzvx0UL8Xl+TN5xmZ1UNdZO71Qogp53zx2hXdFdKaPDrr4z+LIar4k3xztnrU6feh8nqiV6INc8alIAN875sC2qpjIyq5wlayKyIdU0M+5DXjHjuV+3QmKO4f+JccdKivcFYhs66YKXadO78U+Sx6jpT0RqNqSmB5SNJLPpp6YbwEYtig2YvqVxHgh+FtviAJo+3aiePQw/TkCYVV02sx3HchcKY17yohkf/cGQMfHWKjBC7ZyuuD2WOHobXyyVuIuHVDKntJ2SjXdR7GaQPDZaxSWpeHYcn0+Z1hICSDDP4TfjuXCKtOx01urOs4lYqZsN2SPy3LljUhl9H5uWpEV3VH/LPqTWQ6MdLG8aye4mMcCsw57e+goYu3oRkRf7qvVOAVztMhQTkCgcUPkiPfB+YdqPMMp430Bqr55/AYFsFD2GmYltN+8OgBqLdislp5mudOEF8uE6Awfn0xbNJNePcUD1+Esx+V+RGIXYVMeRXcagKyoftiqtJy7zjwWBmr/oTG428St7QGB+Yha7dSK7y6WiOZjdDUs5Jm354mpkojurMNDW9Pw3s7Rt24W3JHN+Z8iSUq9+Cr2kaQyNT4G8XaqIe0s8pFYoGeAeYcZvyolp+0ZZ6pAH3tyuVe8hrE+3+/x/dOKV5WsDc7Jul/RY0qtkjt39mvXPzbxtMbwGhahGz0xRVYJMlhMkcN/dqJI4Jj0QtNULaonjkU/joC8aUC2Vfa8MFrpfwSTVytGIrfPAvxbxMYgPvqi8KSjqjV5lpDGUcYA+DMgqLOv7mPVrPBosl5m0J5Fitt9KmR1j2OOr77AyteAWJcBvK/idJN48LdNVtAYqErjTGb16luVO1yW9sDX8VXCKzUPBQ8boXaJ","layer_level":1},{"id":"d34906db-4455-4481-9512-b29115655378","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"认证系统API","description":"auth-api","prompt":"为认证系统API创建详细的RESTful API文档。记录用户登录、登出、密码修改等认证相关接口的HTTP方法、URL模式、请求/响应模式和认证方法。包含JWT令牌生成、验证和刷新机制的详细说明。提供认证中间件的使用示例和错误处理策略。文档化密码加密、令牌过期处理和安全最佳实践。包含常见的认证场景、客户端实现指南和调试技巧。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","progress_status":"completed","dependent_files":"backend/src/routes/auth.js,backend/src/middleware/auth.js,backend/src/utils/jwt.js,backend/src/utils/password.js","gmt_create":"2026-06-30T14:04:55.151403+08:00","gmt_modified":"2026-06-30T14:15:47.981318+08:00","raw_data":"WikiEncrypted:I6KYYMxpAemyHFwJy5bny+FhLrJAxcHi9isgLCIR7jKgk+RtRRSImYeiedSZDcwnIMYAtWgsiGag9xYiTBcpIby59MhEIf69Ge8Ey272sEwv4rLKoaCbet71KAMUN4denOOfuaKbrwbXK0Y6FbehkE+pCWtq6ubo7or5Tl+PIwwX3Vha0M9C0aYlIBIXgML+2LymHuPdeYf/f+yy7ivDCl4nIRTcM9C82jpKialSDtNyDOeJKcvnuY7WboeTuADzL6A5fX/baERJkVBnSdbIynmMfReneVt5JAopJ+2NyT22CaFtr2L3C+DKZ74FDaU6iC/85eg42OZ2JgeBZXiffstckEhj2B8H2dLfxGDmQUebrfF6cqty5biCE3zW8cU1QI3+bPdfGaoUhj5xFzd437cjGI+IAkNffhuBei52tU9+6Uyp/Ym7bEGnUpxwS1OOijeLKUstO9d9z5MAs5Ip5+HVcliUeAVujyIwd76cvmbhnuaspCX23T55qAvLoTJKWmDBZaKzPE6hCpNAHPfq9b7tOLID4W0tvfFPZnzGWsZK4LhJHC3i/qAGdXsXDc/JijZ7xvhJMYqJMxcoZ4hdtAdv1YjL98AOd++9n9H0hDplAqDf638QwPeaKC6ogkEw5LCWjJFC3FbT+FvpZTxN7RRHFPVNndBrtwSEJR/6/EfA6+9lpuWMXHNhL2Hl4GsMybpXzg4+AihB6Xy9GPv5kkG1enLqgCaaQJ1blr2eb9rUYLvCkQMW+DRqPPQxfniLGGB5WuUkzxn/NzDZ++XhFvmvW6s0+TPiCNMxhx55Jd+O1ta0CeYAptKYmjSJmlT2XDRO/aqedoSZyzYc3L9gtYD4V6FRBsTtOKLyB22oei614ORfyRcALpx0q5/EeyLHYVN0UM2Xsh5n08o9+mCzjkPjSVfG9NIIBhGUTEj1i4dKxB4vM4hLk3x9i8HdfoZ6f4+3iHGqQtHSFId685Izyli748sL55omKo8e0lizEKTrYd5W2vZUviHInfD/D2cIfwRtRBEksNW/6ycVp+dc33cqX6BIN1uwL7uMBhCJyrLl9TbEaEDKPHaGmi4jx9W+","layer_level":1},{"id":"0f657e8b-77cb-4604-81cd-d3e921d28e21","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"布局组件","description":"layout-components","prompt":"创建布局组件的详细文档,重点描述主布局组件的设计架构和实现细节。详细说明布局组件如何组织页面结构,包括侧边栏、头部导航、内容区域的布局方式。记录布局组件的props配置、插槽使用和响应式设计实现。提供布局切换、主题适配和移动端适配的具体示例。解释布局组件与其他页面组件的集成方式和数据流向。包含布局定制化选项和样式覆盖方法。","parent_id":"aa2583bf-2c6e-4792-b794-1563db547d08","progress_status":"completed","dependent_files":"frontend/src/layout/index.vue","gmt_create":"2026-06-30T14:05:00.056535+08:00","gmt_modified":"2026-06-30T14:15:24.296404+08:00","raw_data":"WikiEncrypted:x3LcpLCzT0KOPxd1xeYY3c7iq48qz+WPAPm3x7MWgVl9Ka0y39BYIpkYIXIwXtcEkjLNRqcKoI34Ay7VLfvIoeNd0L9KiPW38nGEktOH2kdRoWStqgftHHDZZMeM3wTiHozP2mtq/BrgXkFbslneMaOqL0jcIeyYsEzK3XOf2IWybFopdsfudEA64erTFyD7rwb4i8M4/OQlv/7phzTi6ud+DXkigQ4QxPbXoU8Pb60EBp1eZghvTXVMFb5rlp+3kbG8uerYS+ciu/fjCScjFieZOug+uuHKkFaFYBj8Za7rmsWg02byP4r8E5yKIzSPDy+NZcyXTRKFGHYtNCtj4aueEWW2oLGYR0/nYHoeMgwdpaKxBg9Ye0gbrAr9gQvUxrzpwdRrUEUmPdp4oTmO1+y7PWruf0IGT+IA7KRfCxZ03rVNE1s6b72zwuUdEps8hXGWIMTqoYJYcYh57cVQj9l1O153yZRu3x4+GhgBW3fblpCW+bEz14xJrftnR/Qve4y83EkfHuQurRD/YlwaAXS6/Wd0aG06MsRzr2xJPgKjLVxTtAsdz5BI8ksED+Rpxs+vKy/CDOvvIUhAx1A0xnzRxDB+ZCR+u/EilCFFyqqqZyWB90BOY5jlYG9Ci2wONLki4Vjgwz6irpTnjyAwev4wTO/8aLJVBupWUqU5MB6mAreomYWt8GYTQqybbkozb5cbV5rNhZTZql0EV7u9+K4mxe4913Os4q+mI5AbzsqzM16xKoV94kRhPaiubGHpXhh9bVmMFx1DyDRVXPlu1zbbRnGMgbH1bIp5FdYRH38HFuxpXMeHfBmyWq2CIVOuMgJQZ+WFbqZPfHN+LjcAOYmhW/MnaBS3TKjqR/3lHriai1eaX6gHyHcqjUCh/6/IwJ311KB5KiG74iE+EWk1a16r+k5oTkTOUMNGX7YnwoVLs+kVHv1fnD14Rwf3OBrXEKFkNyWE9mPL5SV18Yedhg==","layer_level":1},{"id":"7f36202b-af69-4fc0-b62b-a57e415deb69","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"部署指南","description":"deployment-guide","prompt":"创建详细的部署指南文档,涵盖首次部署、本地构建上传、更新部署等完整流程。详细说明服务器准备工作、目录结构创建、环境变量配置步骤。包含Docker Compose配置说明、服务端口映射和网络设置。提供上传脚本使用方法、手动rsync上传方式和构建启动命令。文档化健康检查、服务验证和常见部署问题解决方案。包含生产环境安全配置建议和最佳实践。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","progress_status":"completed","dependent_files":"DEPLOY.md,docker-compose.yml,scripts/upload.sh","gmt_create":"2026-06-30T14:05:12.310696+08:00","gmt_modified":"2026-06-30T14:16:33.828055+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3wxq1Ie83+Lf6EMuycQSN7s3NFV5ooa3Scq2B9C67gTKq2J61WmIo8uwzopEI3o+rxz7q0fBEeW1pmj3Z5yCZzfN7Q3gteOOQtgoQ9YkE4gpYcO2aDGkpGrIWWNjjQ7GyOJYn8FGR2f/tSJ7yy/HcDn5d2NMrcqrwu4CX5Gvyd5xJmIYcuVjpKRByATlNCS1zM5hEwvlL73AQR2eSztdK0b5QNmGctlhqTgf/bfJABgos38mVZQzbH7O9ocFFyJUbFu6uhqIefp9TJkdsbvU1uMF0d4ZiOsIuQb0iFW9suvsoVwvoTRh4P2mAHkIgDv1aQoO66lJ5hTpWGKjuTRoBV+UETV62ofFoNftmlPOqxy+OikSbYqZh3VfJHAM/gj/ehoEfHSCQXl+YPs6HmF0O72rArAXK0t95ls3PNrQO9l0dAP9L1/TwQrroJcZP2FGM7uiesHanN3jdTNXwgBD3l9gUOzOGl/15A7bXkqFfom4mPjqe6+/6cyxTQzxI7oAwU5654D+GtFcAXw7zvEMq0cOeDIeMUocxBNVpRf8SIpWDCB5fuZth/RVBCE29a0lazqZfhtrvKoROmw9go1mbNtfu0GYtrWHuz3BkMaVCGKKYV2TENB8j91AHzomcbKh1sWaWOVzi2XZUHTcZNhOW7Ob8mCxLNxbYWc+goUyiGyu6fI8rJcq69+Eq6MdAlDb8H23H7TSYkPWwvoiI4SRihEX+kEcVRlZgcxYloixMRqcfAirLSbzDrUxdyL+A636HqHK5wbrXT01hUSqhqmuXcDl1jUYIcSZaaS2GdN5sPNr/tfAEvV/QuZx8OV18PJa1uc0WRgGiX/0qbXAJL9l9rZEPkjjNf1X4S/9PNYbQ7y4YCSa1ug33vS9PYtl3eNOvb8aXrgcYnFnrkCIa/XOtmTrizRBLEyjVMUkRb20GAfpUamYhWVOkVmvOU+OtWeD85PtY9aYy61msYID323pMp14=","layer_level":1},{"id":"dbe5d77f-6f4d-476c-88cf-797b80a11a11","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"实体关系设计","description":"entity-relationships","prompt":"创建详细的实体关系设计文档,说明Brand、Model、Ota之间的关联关系和映射策略。文档化一对一、一对多关系的实现方式,包括外键约束、级联操作和数据完整性保证。解释ORM模型间的关联定义,包括hasMany、belongsTo、hasOne等关系映射。提供实体关系图和实际的数据流向示例。说明关系查询的最佳实践和性能优化策略。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","progress_status":"completed","dependent_files":"backend/src/models/index.js,backend/src/models/Brand.js,backend/src/models/Model.js,backend/src/models/Ota.js","gmt_create":"2026-06-30T14:05:22.620322+08:00","gmt_modified":"2026-06-30T14:18:01.587347+08:00","raw_data":"WikiEncrypted:WnER6MhWFG6N6U3R1m3zi9/PE7USWRBJSA4m5rdVd0roBuaFoWjKznz76Q8kOGO4tNwaCSIDcUIRQho0AHAeCEii3WPT3hVXrhQQYjEzvKo6SYnxMHFyoqyC8KkItViNO7QMqwUXCOqIqkKYJbtN9Sajekq73kPvPqvY8BHSNnqfwmaK1orPvHIjh8Q37172/jp+exIQ+FflmU+mfYsQJ0KuorznohYsQIf3qlfg8KiwSW0u0L8K99eblOKDbNN7MYtC9qf0iFzdGSOSwR4u5r4gtdCB7SAZCvwuy+HaSOgXF4oQDX+STWKFSq2xGuZf3y54WkpwBnQtNhvzIQLDsBrIlz9tHbHjMaQwU3a8HTu8JTO3mYJ3BTiKKC+jsgxGTxRRRTQ9PhQo1waFlJnCSVsR+m30u2zHgq9G3gwORjBImo9vcEDistxC+xSWMBsfJzWlXUhx5EjJYrZ1oHpgxmUGyLoTlfCJvJoNqs+vQLDuVZ6jd6juOPkJ7sanKd4TlWRy4lLmetztJb8ZAKPP6R4RV0YcU4IV3Lr/Tm0KzcHdb84aWPsI0EgbfUkJAWjCOieqWTHBE3qfwchsJYJqR3RrOuH+/OgRl1A6P/5XR2tG4/LwC5N356o2YR38E4icxdWGirKniBpii3TVWrqGEkWMsUbRenNq6PCyT/kcGEb1Mn+/c4b1Rb80dNweaNWDSOLmHQFMvwtgxh48I7NXGBAprbcEP+kwn8U6cf+oo+LDgHKyTDMssoP+fUOnruX6Eq9vx3pklQUfost9b2918rL+L5N9/tKoCpCmXHMgjuEE94T77bU7dXpcCRjh6dza/rLHJfo9rcOESul7Y0UthoahAetOF8CRzabuRNfSA3+/EgpkViiYcAqUOfJO9prMaKspC6udBaqAb8GX20oPvVBnGdehFhjW6ZNUKwhOOyBRpudc+qhvrCn14VSOV60QyhfWkkOtqy6adpmbqDfDn/boGiahg8EgnrKUin0NLy9vZH/v3RdDSgNXAhCHJng3as9wGB02Lo7l/LIlX0/+Pw==","layer_level":1},{"id":"1af0f0e8-0c53-41d7-a894-47d9cc19d4f9","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户认证系统","description":"authentication-system","prompt":"为用户认证系统创建详细内容,深入解释JWT认证机制、密码加密解密、中间件验证流程的实现细节。包含来自实际代码库的具体示例,展示用户登录、令牌生成、权限验证、超级管理员权限检查等功能。文档化认证中间件的配置选项、参数和返回值。解释与路由系统、前端认证状态管理的关系。解决常见的认证问题如令牌过期、权限不足等场景。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","progress_status":"completed","dependent_files":"backend/src/middleware/auth.js,backend/src/utils/jwt.js,backend/src/utils/password.js,backend/src/routes/auth.js,frontend/src/views/login/index.vue,frontend/src/utils/auth.js","gmt_create":"2026-06-30T14:05:25.89264+08:00","gmt_modified":"2026-06-30T14:17:38.563207+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBLXlO/kfAAqZjShpoDF/LwxjObF9jWClg1BjbeyHIZSgS1kW1/rwYWDBEsAU51nyKaMjqaYMMCeAu0tGWpZIc0izGBmzwh6bfOUHboVu8bTGN57x7Ig4dNdDghiUoJkJKQX4Ys9KTK8TqI3fswjZz8hglaQGl4NeRcIcMv/X6D2PrvWe1qVFdZ0SPTExOhFw3RHcXIB6SwncZI+aMeqX09v6wHL4Cp5stm7AWL+txJygRSaQYujDcE62s9wfDJweKf/BQ/zTEigEdc5GbzkMnf5NFxmbi8jVDO7wUEofR5O+0G7fH1Wf3oAZBMkevD8TNGju735s+O957j0f4XKsnnX9lsLIvYZtW3hwTKNBeBoujNYJuApW03clJesocX3Wf8ww8m1IO2jArAjxNy5Kz5feFkFhHiCG8MEacgHT8kg3E7ZzxyNGQ9qNkHcWapTIQs0bhq055rPjXYps6gxDBnOgFKy8B8vJf6NOsu03pfZ3uD3dNNqpYwGSW0z6lGvHkDJd2fJxAFHPmnmL4angdyPotlYsK94FpYGrRt1S9x1phZ9rGSahcTUMsqDcT9Yf+KRzNIDRSVSA32KNeKkIlJ7KkS/Wm0jraxDEOETgabNiprZu9IQc2rO+qgL11sXS2ztPP5P+se2fpoWR4kk1uiZ47ZmEOozxu4PiysCNnQaMA8ANHI+wEeZnkX2tQbrDymKi+ns1ZC695WMnYfGVqqzW7ztwv6hcCxyg1h0cCTV85FVN56EYr/FayPkYHDGEZZVV5ZUDvhVDpwyR3SbeAFQjsbJ0kKXLG89LTiuNzGgRwI4aA6bxge2JglaT1f+mtyXbZSnfdajBzphQGhsXB18VE2IXqwfYJigbP5F/u+e6mB7sN63cqVRQ1ydNmvawS0ojJpoUdPJp746BGGnKgHcDOaskuD4puwZFDNJVLFQql+zdoIL74vkQKXIqKhlm4hvnkOFZ06ODxcJWJqQNMT4gzixw0eo6Edc3t7Gz3J/XGJn+Lm4JoYBdAk0PmDWtQqqAjKqm9ftEqhlBb/nAlZxetLWvyg1railkNORM+louiBsqTKmMqeuxFGvIMxTWvlU0z1uFTBuzUgVEKqUJRQL7XYgPhEQngiJN01Bm3XHt2zKUINah98fqoWiyyAHyX0v/dIbaMiyXnzSIZLIBWZDZL/N1ypvWw8ffozNBXfZhGhoE0OUp+tItqNmnVsYGvwtU1dFJK3ZuLGGkiqACmSRg+oIqURaokDzn4B10iFNXdloxmOHr7bgSoCjlSjyXfECCg+t9GlrWtFGusJSHzWiRdg6rJ9Rd1iTeSafPGd1AD2mZ1bTOdXmS6IT2utJkj4CIc2gIkIpnlTql1NbuOfDA4NTL+t/649wrNxdl/tfq2+8LlsB48ND80XGMdAuipGWEYynvogLDZguqmDXtxMo=","layer_level":1},{"id":"8f0760f5-ef8b-43ef-8fd0-7c6d1f693193","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"侧边栏Logo组件","description":"sidebar-logo-component","prompt":"创建侧边栏Logo组件的详细文档。深入解释SVG图形设计的实现原理,包括渐变色定义、阴影效果和动画过渡。详细说明collapsed属性的作用机制和响应式布局适配。记录组件的CSS样式体系,包括Flex布局、动画过渡和响应式断点。提供在不同侧边栏状态下的使用示例,包括展开和折叠两种模式的视觉差异。解释无障碍访问设计,如aria-hidden属性的使用。包含性能优化建议和自定义样式的扩展方法。","parent_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","progress_status":"completed","dependent_files":"frontend/src/components/SidebarLogo.vue","gmt_create":"2026-06-30T14:05:28.622668+08:00","gmt_modified":"2026-06-30T14:34:09.996181+08:00","raw_data":"WikiEncrypted:fV4HuQ/J1++1YCiBadzlA/Ad9WGt57Xw0P0O4e1aWBZ8j7ewAMLGa30PoRyFOz3WPxWhYzFV771iPkiUIngbYLg/7p5O4HeDzmBW51nlwAWF6h03zUwo1BVzYo/fjr3K/vHHffvWiWcvf6+/Pi/zO1p95ifW1RHBzkGDc4cbtCFnI4TExB7L8RgFPd4xt6LWCmL98hBAGxxSmeVmm2WQY1xGJjqXhRpxokLo77b3Ez1EWub03MklHAlEi4JLgZCXeG0AZMzGl2EApA0orVb+k1nPHohU/sYPxOP1g77oqTo0L6eRrJYqLVzXM4dPj6cJPfoiL1VO/2KqEXmJqEEcvA8tI8Vv7fNcUxexyGaVLP6NrOdFw7GfunFw5t/QC4hNv3P7MI8EUJYJ/PidrenCXzv2FJL9zWw9IsaJbDglurckMqQQka4/AwPlhiPqUP3v9KzvsSqKogDiv94Gx6K87tIpDsodProyn5dx5GKnJIQRuNQYX1lpPTVqMQ2OlAD5KvAnp1VHGyVMPixJgwRLl/SX/Y/mmbAA3QAZC3s3LJSW/Hh6OogBVuThelQoKNB2/rPZ/yEgXcFUj+H9At4yNojzuBdqqMakOsrfs/1WsYmEsUXZ/HgLkCJR2T6jL0BiRhXisXcj5fbzxADw26kbKBhW/suo/JwIzITcMgr+B+vwdmIYlROk2zRWQTcSVdtpdouiZLy50KNTRIQYgqiiE7nEL/p885dM13alTVH7cRjdXV993ONl6tRfBQnS9o2VAa9B/IoHSXQjblj73awUecvCir7Ougv3SPoE8GPBJakIDBiVOGlcooQQjVelDtXjn5zyuz6cLPIZF9rqakHJT7KHTZrM2+Wi+TKoGF4IR0mEcinmwEe+JNRIkItConCqwWx3Ekz+kabb7E1CpVm1yA8794xHHJtDSak71A7IL0KO7cUUC0tFTuy+c5W/vuZfoZX4oiO0lX2SvlQGYkguIQWABQjuuCjerUkGgiScVohUoSA1vJVnraaSNsC3edoxL+W4+juGOZytBN0HGZS0U6a1asEka7fODrK/yhDNJ2XKz7+pcu4DwgRtUHUM26FEG84uR2EBgZRiuI2c7YA9Ag==","layer_level":2},{"id":"105cfe1d-aeeb-44c1-ac3b-6550f2c7a307","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"首页仪表板","description":"home-page","prompt":"创建首页仪表板页面的详细文档。全面介绍首页的功能布局和数据展示机制,包括欢迎信息显示、快捷入口卡片、今日新增统计等核心组件。详细说明首页的数据获取流程,包括getTodayStats API调用、数据格式解析和状态管理。记录首页的响应式布局设计、样式定制和用户体验优化。解释快捷入口的配置方式、路由跳转机制和用户交互行为。提供首页组件的生命周期管理、错误处理和性能优化的最佳实践。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","progress_status":"completed","dependent_files":"frontend/src/views/home/index.vue,frontend/src/api/dashboard.js","gmt_create":"2026-06-30T14:05:55.602204+08:00","gmt_modified":"2026-06-30T14:35:15.434226+08:00","raw_data":"WikiEncrypted:l84AvQDvM6QBXs3c27I7iRN2eqIKPqqnLN0fpl6W1NXbpSYLO1ugdN9q3vfdxcOimx9t9/zu6SUc26bwQ+elEbS+I0PRYDRL4shhpb72Ma/Ng8alFtrqEXILpNlDWRs9AoWzQ2KDmoixk2jOewMEH3JllHtJ8DUYUZNp06dby1l7BRtvY2mOkugkoAohYAjj4QyuCm4GXiALmsr7NFR3LC3O0kqbZE21xaDZXflITmtjSkBHJVQtkVH23ciBJVtJx7Co85atOo33DVRVlrOhEJtgP3suOSOLawlRAo6EcizG7y3pDIU5ypo7B8YRrtllA0l35kDhk3pyDTN1sj7bajT9y2fIinJVq2T/AOLyueKRKMFNLrzr1chgaXuxLhiVRpeHk7C325h3AGYYJ9+6Xtr9kmA5H4Ebjk+2sk2YLVBogzJelsdYQqCiBDGzCxN0BAVpEtw7J50eZ+XDVbOY7JUC16j0oiXukJycIku1pthhJUplqc3HiyebwYVuxfxWdM+2IV0+/ic+3NzpGhu19jpGFUZnSD4NLtTW6QCHZMn4FcScTwzn3/5byoDiy6M6RaM3JFXc1XjuZySnsFKAO/Bo/PgZMmoaNUj+gHQTBOhFflMX2DlPEpj+q5NpHNyY11SKV61o7RWYW8r4F9r22VlfvDnLPI2PEvkX4bjKEBeR3vYrx7FpVdNWkqK9JpVWewynEwDS7csRjVfkc43fe6xYto8zEDV1/AjQdPOhSQHP3UOztX3pS7sBLJq/2N8sWJqG+YrGE6N8mVAmjm4/i1jR1vP9HaW3cqoo4fYDacBXqFkEIyqDicgLUVe2+pCWp5Lek0ENTV1TmLovw2a8dsooOU6GQMozpayiXhtI+WzwZxtXAFHTaVyHFJiWYMOOH1xDFV/IfD54CHmfO9/W/bjOZnxKeS/jSJygbW1/5U3jX84UX1n/gqGOsSnO4SKJDEQbdK6PB4+9ounpuIITKPmk7KMn27m//tj8HPjx3W9lenipUy68iqVbiEUqz+/Ty0SFO87eWJGkvXE/HqepzBh5V7XvutH4Y3F0V+GKn9MYQrquYT8PrsUhfk8cZdXdsq28aDUYUl+B4Q35nG0gew==","layer_level":2},{"id":"de69fb0c-330e-4831-813d-94fb958688da","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"快速开始","description":"getting-started","prompt":"创建详细的快速开始指南,帮助开发者快速搭建和运行项目。包含完整的环境要求说明(Node.js、MySQL、Redis等)、依赖安装步骤、数据库初始化过程、环境变量配置和启动命令。提供Docker容器化部署的完整流程,包括镜像构建和容器启动。包含常见安装问题的解决方案和故障排除提示。提供基本的使用示例,展示如何添加第一个品牌、创建型号和进行OTA更新。确保内容对初学者友好,同时提供足够的技术细节。","order":1,"progress_status":"completed","dependent_files":"backend/package.json,frontend/package.json,backend/start.sh,frontend/install.bat,docker-compose.yml","gmt_create":"2026-06-30T14:04:20.637065+08:00","gmt_modified":"2026-06-30T14:07:37.615397+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRS4I2JpxuOJTz8eCWMUZ1Uyzl3ct5rsyIFu8fuwdbAeggGoVlXxfRcT82rVraC1rlaQRGO5kgcNTJgIeZDa7KIJzJReW1AF2gOcg85NxmyD2QBPU20jUQG8tQZgyOekDGEvFa7bKU1UDQLDNO4yVWuGIsKgfV/whNAizKl0ZZaZ+9iWM2XXBDA9sLrXZQD7fyzUl3elNmWx830Y5ju+KudGoo33Kt/Zp5fVC96xUUwKGcGwH9ptvzXwJy6/w/sF3x8vbGuLrEvc3DHTShxmj7sNOi9NQlkBUDWrQbl44wQC9NfLJYbEHG5mWaT3bFotTFxn/bxdbAce7P9osAkl9SDqVly0X70YjXY4Axe0EdO80cCfQwynIN+uONKc2K+DcTIjJYXIK+dE5l1LUWXxSAWbsgxjnTgTeRqS/RJ7U/LwV6x3M+O42mw7d57H8byAPhaALheFipMQM2Xxemr8LmrCaU/OyB1Zt7NSjO9icOjS7ce0KBJMehTWPQn27B6NBZIwT5MvbL+9Y57TJzYRoPUaywWNeNl20CsE3D7BPdkNz7cT3NEYSTghAfeU0vF120Z/28Pq15ZxBRmIDF6obYSk8NJLSGbOIxYm6QWdJ5c/NnktUQ5V+LKFEgPFSF3HFzIEpolqTpuA30n3Ok0tdZgrCKqqreZOg8uMZPai73OsMcEfntY83IyMpmxd6KNmaZW06B/uk7VOvC6T0wpPksXFRSXonlh0fgnFt4o3fusophHFTQTcpWeBSacU8y2fSx8X6q2zYQj4H/czf/7ijEyOhGFRdm08Eir3Y7kYYFI8hQBfVdDOZ6gFQ5HkQME0ktc5JOWoaqNYrVpVidXpLQ5YMhsh4lHao/nOxWraq/zC3qxrIikrUW0zchTI/h3Jd0fDHMhC2t+Lkbztk3oZ2oCcejCqLBcLrv9ZfkdOxCD+Z4bOao7gjk7dTngaflTdhV8wLJ2RV5IeB0U5YTPVdBfo2VZ3Z5lwdr2Uul/0kxsFfvLfAHgvs+X4oxWle5XW5cu8PoSaCj/pLYjR+/CZ7mtEZLCWj4gas0xmYzqylOaFjIk5cGaAQiW9aRrb4nL6YWK0IH8tum/o61yMkXp4rm6cC3lDsToPthqlHlAoziWtZLPsvc9z6zXUwW38sIA9pz1Q=="},{"id":"5a3639b1-98bc-4bc7-a346-91ed56edd2af","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"后端架构","description":"backend-architecture","prompt":"创建后端架构文档,详细说明Express应用的架构设计和实现。解释MVC模式的具体实现、中间件体系和路由组织结构。文档化数据库连接管理、Redis缓存策略和日志系统配置。说明认证授权机制、错误处理和请求限制策略。包含API版本管理、安全防护和性能优化方案。提供后端服务的启动流程、健康检查和监控配置。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","order":1,"progress_status":"completed","dependent_files":"backend/src/app.js,backend/src/config/database.js,backend/src/config/redis.js,backend/src/middleware/auth.js","gmt_create":"2026-06-30T14:04:44.765806+08:00","gmt_modified":"2026-06-30T14:19:05.642968+08:00","raw_data":"WikiEncrypted:N3UbzwGjCC3xD6BrTM0cq8Y9ccVoDb9n1FwE8c3MNy31fwp7itn1eN/9SBNHQuzqn4Z/E95mV5akFaXhbd+x3Hbeb8Lp+QkTMOKfZNQyKojFvMb3nIaA+mV48tDXDWEqxrlhh4JpRydgTIGrd8n1WR3CjiMs1OtPA6kBQSdqoDuuhqzpLQF8idz+njTnv94/o/48fQBsI6bG1frzakIYWOtViLMUk+plRMY5j0337M+sVWAzgVAFVqgiBfjrTGY6V5DqUqCh8xE5q7CAvBRDT1Jmo2M8F60+ejp31MVUAg6xRp6POj/W3ik2qnAYOVweqNiTiYyns3uz+8l5xceif6+1JZOepuVFsY2Temglybru9Gz2+d+3AJpuvKT5LjJnJ+BMF0P3sGW2ATh6rsJJIu6u7uWn4yr6rsZZYNqdEQW+qWwkT97SWLMa1xtsuNiR3+QKu13kqysVkXG4H/394AJwDoljAoFMTzOsbUlUkY6QrOsx6LagWGbhXIqFrRfDWnSMkE81wWy3pcgFETEzQIaN+xAjV/skriEvn2clKJ6c4DNKTiS/iLu+5T3UPOXO2kbKzPwVqlxhU0xGZ1Pq2RodxcdD2f0abxDz3g0Wx97q+SQUyHL/KmFznoAq7YvBwKc0bWAQXkc1FvmZ6XGHyxoO2JyrbzZOMumcj3gZ6Zxc4nUPXKPoKXDL7unysWj4JDOcJhSB+hGDKjckKvvLLeDFShiGN/JjptjQMBiU39yfOom3FOP/vM/S9QSF3WNTopdDHkSmlh7dZWtHUE/z4TL3fYmzT3iFsTj4yjeoP3+Yx51P+Hz/3jrBPpT92jRo66eNc3GuySe1DeaXPT1YWdIr7S3r5T1r/ojXI4tcYdNj/LkmB+pLLsIvvosu/ETHXLP4L+Brr+mJWjJGSSz7IzsH4UlQFwh0nY8tbkO6UsTnmZY7PQhOHvuLVCOQ3qaLfKU2LxfMTm8oDj/lbOxS9/1KKy/W99UmrkMvhardyA1Y8SqsnkPCXZqFkn7POOgOaIY2vWUs+L4PKd829ZApvZMyukooOwm4NhCvWOp33xo=","layer_level":1},{"id":"779d6806-96dc-4c97-8cfb-15a3d7855bd1","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌管理API","description":"brands-api","prompt":"为品牌管理API创建完整的RESTful API文档。记录品牌CRUD操作的HTTP方法、URL模式、请求/响应模式和数据验证规则。包含品牌列表查询、单个品牌获取、品牌创建、更新和删除接口的详细说明。提供Zod验证器的使用示例和自定义验证规则。文档化品牌与型号的一对一关联关系和数据完整性约束。包含批量操作、分页查询和排序选项的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":1,"progress_status":"completed","dependent_files":"backend/src/routes/brands.js,backend/src/validators/brand.js,backend/src/models/Brand.js","gmt_create":"2026-06-30T14:04:55.154207+08:00","gmt_modified":"2026-06-30T14:19:07.600812+08:00","raw_data":"WikiEncrypted:hJ5e919a6La3vBIeYsDd9H+qoMODEBAlmCzG+cWkGRu78NaFDIi9qITlXW3zUicltUTnty1k0aVuLDmUbWYsq2DQkP84kMUHXEpA6OcQtQQW2b0L3hPiCNJb4ZQrqvo1LXEBjkme7wbSkleJI63o/kaE8846oeYE4AMgjWxEbV54Z95lxWs7OlwO2sCsNbqRc5wR/o7amP61MJ/lKWn8nNLrexqAUu50qeYGngpuqV3zogarV6D9+HK54itBZ/ncQ/+9a/lhzLkb54iR5IcRDOqaVetAPcB7FKWOIWyMYRgn/APHz0vu/Ow/jvrk2IP5VdQBYSzAFPe3odHJBhc53XJToyo3J/RoBJdKTAdLlVolDpTzg9VKOFbCd0ua1syW8RDmRR8CDnzPdnm2/KJn2+vYfnnvQvdbENcsjaVhdZ5GPJSf43fyJOJLXx8L2QjtqQdv69AtBDyTBsnmFqRUG6WKDHnA3WtZJZQ796EgvORbPOAecIhV0hLlvUyUJBOrM4v2ZMmc5RZ+ukl5ruR2PxQRNJRVk5f8BDNoylYtTWow9gb4r9ii7/TP7NjRI37TxCOkatlA10cnKD/24jXu6MRyocnYPVbHAT72NR7srRVXBcqMwlwiK2LCPVG71hlvmt7NiIB+pNCWB8s+qWHNpfV4kmmg9+458bGJdycQgVa4Mb42lqASsqANfZRC0xMGO4JM+Gns7T3vtPmAqjDJB8tZrkZ2p0dnvSBGpkYiLm68HLUpIXD2YldMCbY9ymtkJB6gBWWBUutBXeTQ++SyBn+qRICWqKCnVWYK0rfrYWa76HfOU0xfjpR9sVWFqXvhtkMBd67yy00PkaTUrvIFUq769fpn6KWDb99I8cHWnLIj556iiITHC7TpEqPSdbdkvssbuU0oj7RqG+UAFQWmP5fu2c2dBkaPoaqTfzdrJ4EufHQc+W2V0jZLzdrztAbbrXMIlcSdnIVZcM/yV5kGv89D64a9AfWx3h+b4uVFgMRhqFlACt0/36RwQeI2ZJTp","layer_level":1},{"id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"业务组件","description":"business-components","prompt":"创建业务组件的综合文档,详细说明通用业务组件的设计理念和实现方式。重点介绍侧边栏Logo组件的品牌展示功能、标签页视图组件的页面导航能力、密码修改对话框的安全交互设计。记录每个组件的props接口、事件回调、插槽配置和样式定制选项。提供组件在不同场景下的使用示例和最佳实践。解释组件间的协作关系和状态管理。包含组件的可访问性设计和性能优化建议。","parent_id":"aa2583bf-2c6e-4792-b794-1563db547d08","order":1,"progress_status":"completed","dependent_files":"frontend/src/components/SidebarLogo.vue,frontend/src/components/TabsView.vue,frontend/src/components/ChangePasswordDialog.vue","gmt_create":"2026-06-30T14:05:00.059997+08:00","gmt_modified":"2026-06-30T14:19:27.855603+08:00","raw_data":"WikiEncrypted:mHLzoBKW/ak+KVdbda4A2f7qh44idx3e5sYOKq4y/WJWBVlKxvfsgrfR5kwEoK+5YZtxFpGvHzwX4IOH+DawEmhTwQMjQgMBCcPS53RmGaHOSgU0nKq03Su0/WZVgYDJfX5EkUz6h2rTPEOvq5PXUInOMgSH6UvRdohktfTAFkzFd7S1FTK58sVzdGQozq7wI1koDtSWO/SNpO4Ee8fMt6DTqQ90rTnMbEPKLcOrCDgBxPksoF4AwVmDiOWy6KkShCEKg5p6r82/HoJV2qfYNRVng+LVbIRQN/zKlyM4YEjleh+mVPfQG9melNixR3cJRG3orSswQpSogfZRK8Bo+TO29dCbmXI9Mg5k9sGaNAq2jbK1UKrydX+oZeXgh1B5BSCmOo6BWUzJqDsP9IX3WZ4YYVL08TTVYxPFyLEuNn34DiKMnez9L3SfJSnMIoqN7ClMC6kQ9CccZ6/1deguTXM4M/nzN1SSJuOFkMC4DjWRStbyZPfqHkfhcEG+DW7eaIurD4brX7qVwpAIDEp+HrF4YB/rpvFHpbpqob5nWRmQN6HzhmXSIBVTDNlvO7PuFOz5bARPKE7RKFrgOc2cFBVLCny0niJuaZXDcspCDEjkKMe/W6KijLPgVdFJ319wQi6WwIpUYQEwwRICmXrDU8UXRluSrnbmkI46ju45vwGnf4ZkUgPQhrtrxxqbDjr3wHgQtU9m0G4JzNonUKrVsTmom54Hx2VWzLxdXVlK1T8uszT0ZI2wtEAFmM+maRys0ZM/v6yzw7S4lK6LI76u9HmAWuPDpalJjO66kRoPPqFHGP12HnREYBCpiyzVDOsMKLP+nC9RJxVJyDqINcMIEQ/cvMqQYtNOCoV8uC4xqdOLLw69jWdiOw30qNnb3DwC64POHfTIjLTuZLWorchvBthVfmMzwqrolaR3VHUVgR/m5h9XEGlzXTqA6znkpkA1TjOTmf6YAAGAQ+Zt0IuWfA18ulyPt6eyriUUPdL4oJqBk5XXy45O8tb73hyaJ09bw6OBSdGlDdIsNotjVXwyfFkMEutcpmMT0v9MKTugGcSfEHSUwMnJkFKSB/PL+vn4zUky0vkjG6dUA1kerjwmjSaNZ7vkhCbbP8OFylL15gHQfCdOMb0AOCZTdEob06yof4MSnaXqMF6dufxLdbwOuqCfJUkhi2qwT7TxlBIB+CQ=","layer_level":1},{"id":"f96081f7-f508-41e2-bd45-a5b36a1ea114","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"环境配置","description":"environment-config","prompt":"创建环境配置文档,详细说明所有环境变量的作用和配置方法。包含数据库连接配置、JWT认证配置、Redis缓存配置、S3存储配置、Meilisearch搜索引擎配置等。提供不同环境(开发、测试、生产)的配置差异说明。文档化敏感信息的安全存储方式、配置文件的版本控制策略。包含配置验证方法、常见配置错误和解决办法。提供配置模板和示例文件说明。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","order":1,"progress_status":"completed","dependent_files":"backend/src/config/env.js,backend/src/config/loadEnv.js,.env.example","gmt_create":"2026-06-30T14:05:12.313659+08:00","gmt_modified":"2026-06-30T14:21:11.825296+08:00","raw_data":"WikiEncrypted:mJFb0eo+82adP8NAeq7d4IIa0ji7BfhWd+tPu7r6OpR4X+XfqeclnD20MHCexQtgFzeY+udCFgwSLYPDydN5R8BNpcJBbveVhePMQWOVKGSx4DICe20Yr3Mg9nlLB9FGlGjUc9Y2pTff0xrwHFSfFG9wRb0k2bAg/j1gbq1g3pZxabmYCBYxTPF026U732n/Ksmolpy1y/q6x9P2vurlaRpr34CvTfVkEYogh6YTLfmAhzHfbr4sP+eShuvQDEHYmhRjzMwhYz18NBjgpMKUbE/pndwBftVShR24efIAv/BElGFzh4ocX9Ye4v5tKSBg10FekOLemFoJ8pOCG+BGhsRKs9n51fBFLOmmhXaTFC3SHhG9AITLshuN0sb92me0NMFI7NrhNuNKzc2UHDUgDyF4Vafg9YZgHju8PxlEwOs1BaPCOk0xYsp3DW0oVsG+AwBQvlvriYibLy7tghBmipp4c6l/pSiJCmGjW0JwUul9lVwbeyMAjsVBJp2ZXwzI9IKB/NXvEH/JyDft3X6uxO5VqdujNwKyJ8t8zvrApsSX4vMXO5+2SnxXAGudlLDTLmP6ozej4/197Za0ickFHWFjLPGNZDXv3dGVJfV+YiyL6wDXurvpHfhX09eVn4DP5NLwrzRsggp5XJR9ojLxzMggtxIbLdbx4xTBkRXRiJflCuRSm12Jrt6+U42gs8umQx0/uQSOJX44A0jxVep0MZK5QMIH7oq4jDqBV685QyNKxM4+IDM/E7zWDh9V8U92lhe3mOm4mqolgFJPfEzZaFsi9hOqp+9ZaAPAlXj3DJCXdSDfa8hNtfgjKJ4UgqP/2ESnAZhrUisYaQnfAMUBQKau+qwn+CnUsXOKcJkQNSoaXdvyBbAr18gNn3wK7A0viPPO1OCMf9E0Za9ghsyaTQ0q5kZuNukjWX1iQbG9QZ3TTkxZOzgSpuC9sndRmv6DY9AWL3TaupI10Ec52w4hOZe9TAcM1iN38mHBSSAf8r1qp1rGeo4bV3v8ONIokVkJP/lLXskyXy8PWwyNyN6yE1CfFAh5xxnrjnHNHYgYz9c=","layer_level":1},{"id":"92f94141-482e-499c-bbc3-6101e70206ff","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌模型","description":"brand-model","prompt":"创建Brand模型的详细文档,包括字段定义、数据类型、验证规则和业务含义。说明品牌名称、描述、创建时间等字段的设计考虑。文档化品牌数据的增删改查操作和相关业务逻辑。提供品牌数据的示例和使用场景。解释品牌模型在系统中的作用和与其他模型的关系。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":1,"progress_status":"completed","dependent_files":"backend/src/models/Brand.js","gmt_create":"2026-06-30T14:05:22.62391+08:00","gmt_modified":"2026-06-30T14:21:29.097262+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLlbJ7FPFod4dQS4C2jIEy1Vi+RWBmbRp3cvvlClyElpjY248hN/8uxj/oZc1cBilbx0tRCgx4EXGhbWT0bKPV9CClQk3EyAIvWkjw2qBl1GwoIZaoQbh/lDf7iSv+CjumSc5MqVDv7FeDuoB4BYvqSFuX6/sw/v3wTqRwaKX6wLQyS1j8HSrt/0T9Q28vNhc5WBAPNUs3PzlHBfFfWZpG8H8gVCRsqX5tOhfgNie/doVHGT9Gl74pC4sOjSrm4gseL4GAP1i/34P2j8wpFWOK0PHIrEDdLFB/nl4AmiN3z3GOflyzR8heQlB3L74kyUKX3oVFyL8nei3KJoV9pUbYJJztTdKAUC4USkpOWF2LYTf166CAIIyLuvpGUJmRkxZ9T6fpTbIZ0tWkizC09RvdiaDW1+cjDQhj6Ij23KebNfpMuYYTUkiKJPqASQ9/+A7uNZ43ntzVnopgTzXzDun3QBC7j4m+iF5DLSWdqS3XyRpanF50CvdYz5Px9oLvusDbKohVWQ6zxGf+ZZTXOL5+eTO/qQ3TKNuJA3mkzSqU/zzIodqLG3oFObroU6JLMHgFwXp2OggflULj5njivqDgj90U47CQExGFS8JnCl0dPuxiblN18wZf2ANfUg0IvnU5rAmQ/gz+dtummkOEouqZxCglWdsNKdTIkRWEkDBecIe9oGWuMX8RiWHLnL/Y3EvgSPRu8DkD/n6hbQQPpIrGV7Jf7CIPfqWg8/6VZose+vNR+n9JFdOEU7Q6X9OK8lAsw==","layer_level":1},{"id":"1e3d40bc-a833-4f35-891c-9dd96f09a1a3","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌管理","description":"brand-management","prompt":"为品牌管理功能创建详细内容,深入解释品牌CRUD操作、数据验证规则、缓存策略的实现细节。包含来自实际代码库的具体示例,展示品牌列表查询、新增编辑、删除操作等功能。文档化品牌验证器的配置选项、参数和返回值。解释与型号模型的关联关系、缓存存储的使用场景。解决常见的品牌管理问题如重复品牌、关联删除等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":1,"progress_status":"completed","dependent_files":"backend/src/routes/brands.js,backend/src/validators/brand.js,backend/src/models/Brand.js,frontend/src/views/brand/index.vue,backend/src/services/eqCacheStorage.js","gmt_create":"2026-06-30T14:05:25.896897+08:00","gmt_modified":"2026-06-30T14:21:25.623188+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLid0YsRsuFzxrKFl1UH2EDILD+4NmryAJ+q2oYZ42eaiz44GIk6X8OFlUAZ3K10FBvMN69Ne06Y6iVCy+4xZdAsUGmydXuI9LOupHeDUaC3pvkOjqp3EZ4xOBXToKexD3sJwOHDJUYBWddck1pKB+BpUmpIGWGulvtKNd7rUuuNXGGexSoT2k/+fD8cfS96290Who+jupUypdef/VVLQ+SMm9fS7HoCYxsUJ9tvcR9HLpcihb2gc09v40WXl2RSPF2VOKqtBB6T3R/UTcCJV4p8ISn8geesslxEYyvMaCyHxZrZvjir3/r7oVAAh3KAOE+Nx4JTX1AQd1M8iUlzVaup2ZB8XvjcIj9/TKMdIL3PhNerpdIgsAQ8lwCNMPriXoMoZx0MzlaX5d0D7vEbujs1W/0zu4BgcnCjJtUdvCB+34DyEDjZVd5vEPpMDJyN4KZq0V2zz6XEIXr/SWlY7yRweOhgMAw/2UmV15PZmnHQQIsspcBtED/4LZY8sngC1o50KUM+1PQNQamViqAlGCHXBAR7Cj3E+QvjOBSfAVtc7OPeHToJFTO7XdM8xdMMjkRCdrmB8zJ6XSDish3MLo+tv5fNdSlOF8ZFqklGbV+DaphtWW1k3t13oFWP+IjkbW3xwsA8akuLoG+cXEctO4Uq0VFfoiwI8sfioOV/hJo6y06miVzTDvjdjk2vZ50V8j2qsw3eXt2N4bX4b2I/BjLZzItZdmHID3ExYBmo+VjPOmBXQGuZdhG3wTGSRtD7Phhsd0G6umdHsRVF74ih8xOWkjG4+8dj9F6mnmWm7nn84+bv+Es0fsCjoeqagYkgvIU63p9y/FEcjSTEEdHqZ/0qKXA8S1xyEHzPMmW4LjN8jwyNryVJPl2LOI75aXNvdeoMbfPs9qH5u6SeX8rw6TvD6XwAb28N8ehKfUVwJFEY7PkCn3ROnsjFquwaBd+DjPpH3CY7TdpGqGBuP5a+0z72JVUfnjXKn2oKTR35QRVAhdnXk/st1N3eu8SXBHgx2XHzEB4JAnu1nWqNOr0d5Mn9OVFDqOJ6GD37xh0oQvgefNcxCxgURt08010ZPDFx0TvUMLh2g+plGTyUqDgekPLtY93lC9TEtV4x92OjUub4JRNaGBlHVTUaC/pi2JUS/QYcfOPvjYMa7TgyxylESgrt7jf4+lZOJzAOmJSKScT22E+S1o0omg1Imd7YyAt5QFJwBS8Zm25xjGROuORqURPWRYfToJMKQYjB905rLMlW7JS8VHBVaqUp6R+S4827muvsDVj/opXiMkSLPllSH2AwfVfT8AASFSzz66kvjkmYy","layer_level":1},{"id":"727c25ac-db22-4b34-9486-6fd6946f64f3","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"标签页视图组件","description":"tabs-view-component","prompt":"创建标签页视图组件的综合文档。详细说明标签页的状态管理机制,包括激活状态、关闭操作和重新加载功能。解释标签页的数据结构设计,包括标题、路由信息和缓存策略。记录组件的事件处理系统,包括标签点击、右键菜单和拖拽重排序功能。提供标签页的生命周期管理,包括组件缓存、内存优化和性能监控。包含标签页主题定制、图标配置和动态内容渲染的最佳实践。解释与路由系统的集成方式和状态同步机制。","parent_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","order":1,"progress_status":"completed","dependent_files":"frontend/src/components/TabsView.vue","gmt_create":"2026-06-30T14:05:28.623089+08:00","gmt_modified":"2026-06-30T14:35:27.886573+08:00","raw_data":"WikiEncrypted:IBinykhefIyOgdnJDAiniV5kOUee0Xx6UXvrXwmKcQxxhEd32Oxf4/sXerzkozjdwLiRd78FiQyVCsTFnq2ZoJjCPvvphk/28Fyp6jERf6Sd62RGVBf+T/ddf1qyYMGlXTIT63FLUN8lGKH7HE33fo//zcEAInyKuCfcAnUKtGhK/6GYF5OQOK8iu3hTREMVLLGnL+nviHGzi/OieF9xzRK6Q7v1xKhCFPVw7G7pKGvEqIAXkIuI+gtduk+6amkK8DTLEeFc7kADsRYiiGxbnbCwDskX4qqKASfyrXfwkcH6erxtW03zOc0xXxRooa98xza6bb0a8AuGRLxpr39QpjXFHHSkoQOfBajABJjr8Dc2g4/Owp/iz3w2DmuHDD3n/B/iWYgr6mvt3RyCN7WugYmLcAHydpYFY03KrqgMoG6Z++VclV/+iLE/hhCWVXZwOvZExFa1/Nm3L/kQ+lvH/Ok4DwK2s2mjZIJfjmMEbvvPBDip57GwOAh/DEUOz8xDHSc/z3kHBhO8c2gfI+QxQTDodO1T3sDQNvDzNXnOsiGHEa8MFXwnRqOOJdjXpI/V0SeRqH+VF2QLUL0H0zkIRmUfKDToJpYdryAc+g8C/437bvmIINo0hk9dNxyk6OJDyil3WbGVKZty2trCmX+SSkvThP1sjhsXb3A4lCaln+NxaFM2pwSzOI2FrAI/3udagiuCFzkHXVAbL3kW/sByyca+mxh2x0XmZnIacn1rN3mzAbZQw0GomBv3D9BdLhokGDFcRbw0wBF8/CKZIQ2LXwJSliiHSUIxZBPFwOlfuDQLwPZwafFjFgx/iVezVLOrtprdilrMg1icikSwQ2uomd5k/4o4X2RhtHBwVEBnng/I2OnKpp7hx9jW6qnRgl73qL/weon9zfXHb5cIhwqTENIhOakxfLNkPuVZUK+yV5j8hhnf4TSFJur40kvfWrFH8ooRZjxZLVRGEqph6t49E53tpiLKAnc7PCkGqlVdBstHvud1Mi9WyXlP8CHOoDFinYsPol2IYws0Wz58mTUZesjH7Ovtl/r7VUGNRE+V5VOhW3H2ws00vNLRzrCQfstfuwZt7dDBHlJziXNvdgav+pfU3tAHaonl7W+6IJAygI7B1LZ7oTRxEV4fl7vl2G8suLJXZO7UsiezZ0gxqvkzvWkebI3amABggi6vI+xrlr0=","layer_level":2},{"id":"c8151791-2f8d-4e1e-8139-b0cf921ef002","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"登录页面","description":"login-page","prompt":"创建登录页面的详细文档。全面介绍用户身份验证的实现机制,包括登录表单设计、字段验证、提交处理和响应处理。详细说明JWT令牌的获取、存储和刷新机制,以及登录状态的持久化管理。记录登录页面的安全措施,包括密码加密传输、防暴力破解和会话管理。解释登录成功后的路由跳转、权限检查和用户信息初始化流程。提供登录页面的错误处理、用户体验优化和移动端适配的实现细节。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":1,"progress_status":"completed","dependent_files":"frontend/src/views/login/index.vue,frontend/src/api/auth.js,frontend/src/utils/auth.js","gmt_create":"2026-06-30T14:05:55.602587+08:00","gmt_modified":"2026-06-30T14:36:20.147272+08:00","raw_data":"WikiEncrypted:gVtFIob7WtU/DhLIhhPauHe+OU+v+Wmk6re9yMmllcXpiZ1pp7hfIQRNzw2djMi3kdxg1YOiyCoxBtvZze4FF6edaCgUjs2MTu+j6AA0Iy0cXORNHgcTdEiY29qq3iIiQbohHFi2yVwhY/RbmzBe7lwJOZe9tZJo+9aBXmZXSPQue+eGhVi8nfNwLBVZ8kr2w+IM0Le/0DzLcsNPWWHKW9gEnqOL9qJ2uRnJOeBfYIQm/RFJj6Arc9HTRD2rHKpLgeXT0/7uDlcrcVOeMQgI0MN4e5IsSMOS4i0V8i0QeaOnTMFe1e4ITmzsKBkTM3HbZ1l9Tud2Kc9vwBSxc71qfQSzN6PU2Lg3Aey6Hyu91q0cx/QlQLD9hjPLUl+/LeHHG0eHqrgL7KtiH7e32lisXRG1TYhCgOaOHWCL/heEb3WzujrCLosb3D7MsF/wENRWQGAQTgULpo9tmTHO5PQYppvv0bzI29cZtI53vlNiklobVJr7tvhTy/Ogd57XQ8bYMtnir8CxJnzDZcTSiyutWBKqV1X1lZOAyG+kC+aaRW/C7OYV4ek9b4dwf0XRsWvwr9GNgjIKC4IvOT+MYq8f+lbUllzOJdecNYg/6EvBmc3lESxNAVHxcKCYkpsfwV1pkQKTA8mk0s+6LysznP0NCo0/Wkd7s6eyrR5hNxhX1dI/D3SFOxC18N7Jb1XQTy2olb3oNn3HdurobkjeMAngSA7nxtsFpdVcdX3SqxyouWIMYKCNmLQjxKTUrx7OWx4ylXm4zZnlvaCsuj7hDBp/zdcCNQpVDN0sTMyI3rzj3Xnd9ULyRuTFS7dJzarbaHqSuN4ZVx3pRYSNWmOrrCKKAy2lG2ee8ojCkWtwcykJh9uC6Isdq+OzIY86g6fwtww3sF0b0tl7sLw81MfyakQfpqI09OHCiDHPtmwU1xVSJzriX6latrVG0pN2XqZ5MRWQy7nrzoCg8M6UHar+01QHp7FtE1F8IB7RTjIWNmVxfhgG5GBHk0+X39/mt+u9MCzS/DFWBVoXj2BXOJaos4NKYh8BDbTHC+HrYNlkD0wHs/yly/mlHyPrzMrv6n19GedMYDqebhvi0p2vS83tSPxoFf9tVJ3/0yZN3JuwAPQdGls=","layer_level":2},{"id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"系统架构","description":"architecture-design","prompt":"创建系统架构文档,描述高层设计和架构模式。详细说明前后端分离架构、MVC设计模式的应用、分层架构的实现。解释组件交互关系、数据流向和集成模式。文档化技术决策、权衡考虑和约束条件。包含基础设施需求、可扩展性考虑和部署拓扑。提供系统上下文图和组件分解图。解决横切关注点如安全性、监控和灾难恢复。记录技术栈、第三方依赖和版本兼容性。说明架构演进路线图和未来规划。","order":2,"progress_status":"completed","dependent_files":"backend/src/app.js,frontend/src/main.js,frontend/src/App.vue,backend/src/config/database.js,backend/src/config/redis.js","gmt_create":"2026-06-30T14:04:20.637577+08:00","gmt_modified":"2026-06-30T14:08:09.130141+08:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5QXmatSKh1iukhkKRz99kcWlEvnOwuqXvA4ZgQ6tN+ytovQp8yiqJicl84VZMQ0QFUpSuhdDKqqegwHVHT8m5Qe+hOlpJtwBJv6Gyfd5UzsnMpeYFRNXR8wbkeFBADir/QMuE5xA4w5GwYNyc4GbpnELQTPwTHgWWbWNxlgq3I5D9TCdlGhsRmZA6sOK//txRwki0pH+W5zMNr6nOdulmNq6y7jVc1uB2cnWdogeOMuaAeFHEES4nLloLAu6fZBcuZViwy6PppTyAmckkNr4DBsfUDF8AWA7Tc7/u9k2CUPbxxXn6EzWZLxfzJ8g2+MS5AGoHvdi1/l6Obw5LKcFw4fMrrziZ69qX8Y00Nb4OGTY7Ba9x8nTUpZR+ZQr8C2+b3ian2p5M/jX68T2veatBUXJdORnAdwyu+gsMTlFms2BIWpmJja/SPELEIIsiw02D+YpsgCBoWJwJytlJH/lNURd5C7p6eNTpZ8Ueot4a9kE3/6KkmeteZgfTGCtJVjgtLW3hCuAyhA5zfsNbKDGxNKwkAHaDmWR8R4jKKhAC0JCdk6GSYSbiXLYZG0yPMpDooJP8w3qo5IHgaintV0p4Y+wYwdLe0UJ74U9gCWnfTrlo2R93/rrWiZqe7Wwovt7bAEMnTmtbaWINVb+tXkN3kLfbyjbTHDxjIOc2AAOnFVRGIJpMt50+QEi5TYhA684wr1/vQOBZas07D/sUPjcvl/msZ4kjlgE+YwYMbKPSf9j302dqERpSJODBX9TN2I+B3pRvT8ziUFXF/xr6AsE4DXdyvCy/cCKvmIEp6gyrY78oSE+YwHefC0Cx0ltAwzDpm12AcAoA3YD0TwNDY8zH4cwXHu79zttcgTjZQaebPwhD8L8PbozbJ0lQWo8Tl5Onvbp8hOw6U57Z1U2W/ge1JupnAJt0tMnHek6EpKqkt0z/J2d4/Z5B1JNppZlK1nG+pnKNEfNY4h2m0ydoCRJCad5ccnFJYXhF9XP9vsx0RtqQoedeyfH7X8//4Iv3nVza2b7PZ184/TnYNqUmxItz3yos0ir0gAc+54SDzg0aJlzBs86JFQ9fSep6OJ44sUHkauivK0vBs8Wij0TSI8wUf43PFgjey+c54DZcvXNfsD1hh3PNHe0CRN/oMidSjGTPv6WOJIzp0KnAOn8GXb0kkhk7bpk8eYfe/8luyjlDyaA8QOxpZLfUtQWXtGv9+W4bxOtq8JG3gDpTI/PJ9UxhamLc3zHEgUg2FD0maAM+FBCVu51P66sXPu+fY+bIxalyw=="},{"id":"b47d7f83-5401-4a63-ade2-f087a2f61987","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"数据流设计","description":"data-flow-design","prompt":"创建数据流设计文档,详细说明系统中数据的流转过程和处理机制。解释从前端用户交互到后端数据持久化的完整数据路径。文档化API请求响应模式、数据验证流程和错误传播机制。说明缓存策略、数据同步和一致性保证方案。包含数据安全传输、加密存储和隐私保护措施。提供数据流监控、性能分析和故障排查指南。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","order":2,"progress_status":"completed","dependent_files":"backend/src/models/index.js,frontend/src/api/auth.js,backend/src/services/measurementStorage.js","gmt_create":"2026-06-30T14:04:44.766251+08:00","gmt_modified":"2026-06-30T14:23:25.133463+08:00","raw_data":"WikiEncrypted:PGdHQOrMWxh6s6galmzx6wcoMdYGcfWJlB+MVcSBUNBNKtizTGYmn04CYqWTHq18bpIkVhxruGAwYTOr3jZ71eCHIhmHK7mDbe3H2F258BwPHLGOZJH4+7MFqH3W33roxV3A0mBu2oaH8IeI2N8avzXHaJJypIkSAx9hq3JuRVRCDIeKY3X4NKu/U9NptL74JQm6A7p7Li2mkZiBFKle+4PW/yzuWaITp6kplQfvEI/KpRhmnMRsG3jGv9iyUUFWAGQatGlcpMa3GH4QFw3sBvBajjhTtLtzUczf5Spz1O9WdUbgYOPCpDQ77+Bihsdcy9JfQp4lINGc9Qyfb5uB4DQlnqYiPlbr9a3dDGb/dU073dMLOTbly0p8fq9pG4W7N4v/Qh8PKhHj3MylSLdIGBJUnAVMl5qxvwzxjojm6CXeNAkwfimh+yqf454XGxOTZIAU9k2R2h8YV42MLqjA33Hx50dU7ywv/LpeoPO+YkHYLdJWVag51oeU0dV76GEofIYoyk36dpcxNf9tYMnzovlJz1d32pHkZiEtsRL0hfFpnpiBClN9Eb2M7eXf3h8covZFJVsAMVZ9mruy2FWZoE+Vy70yUrtgKhd+OG9WissVZfI/yqj0Yt2Wsrr1loH4IN2vTs2O8PRfGR+udMBY1TGPS+H1IyXIEa9Q8MGdAQ6PdO/m+9Mecxv3VDjgAPF0c6iiLgP6TWteu3Z/Q9X08FkR307C0YSiy1/W+edhxIveTqz9IG72msKc9KnHpMPW+i/DnIp8sMz0xDt1HKJeWnmP8rVDjGddCRuMdlYI1JTCfO4D+UnLhjf5mrmxD4Oto9HiMMdaM7vcYGorb90OikVE7+bXXS7QBK1eDyLElOaFNMH+fXRZY7dX05PCWloKC0wLxKcyNwDyheNdKuQfCQW/N9u3S+jQqInJWi+fLqqQk1kZ9a8UaYcnCudScV6lmAOswt3fe/4VQQn6BPnOBma0DHTIh046TrqUeM+vxlM=","layer_level":1},{"id":"94ec54d4-0aa0-4e58-8e63-5ad6ddb6edbe","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号管理API","description":"models-api","prompt":"为型号管理API创建详细的RESTful API文档。记录型号CRUD操作的HTTP方法、URL模式、请求/响应模式和数据验证规则。包含型号列表查询、型号详情获取、型号创建、更新和删除接口的详细说明。提供型号参数配置的数据结构和验证规则。文档化型号与OTA固件的一对多关联关系和级联操作。包含型号搜索、过滤和排序功能的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":2,"progress_status":"completed","dependent_files":"backend/src/routes/models.js,backend/src/validators/model.js,backend/src/models/Model.js","gmt_create":"2026-06-30T14:04:55.155975+08:00","gmt_modified":"2026-06-30T14:23:05.599822+08:00","raw_data":"WikiEncrypted:bcjkcAe0RFiHL2SPRK7/uu85puYZIX+C2ex4+pzpdOn7cc1yaAAdUNe+7jLI7NvrHR5bm/2WUlZK6ZPtqzIQ5h0MnUhqrqNYJO2n9dYhyGDiNiCLvP7MtADJJoOS9141vtPVyHqN4otRLlyIifGGezJM1vWbuvIjzT3531HuZlQza3qam5PnHzCRxHpdpyS3eiqsaeCSEchsiEDJbUFvYr1KBaXa2ps4E3o7ic8vIuM/9QG22EqqaHhAY0z6biOMmr75iziBVtp1hd5dj+3s51Ve4h3Usic4VsaoBiWRXOdsvNvW/MOlXNkPJEW16bJHBbDpRUxnRtDnllNoDKyIQFv8JCEStTRG2IvVh2idTbw+IeD4K5s/j01K2awd6rxr+fctkw7X7fZhmmSgSrjT83he4gEUIomoKQeB3aFuNkb48nK2QwsvwuSOJ0hxMjItOlEALvBSS67btN8JKIx21hTuR7Mz1TKqrl4m0CuW9B+7j5Q4tjVckzV2Oe3SJkk35c9cay8fZMJyaia1kh3EzZYXlT/w5nSoPQTG0DCVTBHYEp1lzav7p3SLsENxTA8VO7WAwZNLCodOsbVRaxbZiys///S7wbk4U9Qu9CqxOnRaQnmzEgCcrtOtfPyGA5rgUFlnp8GNwGIpn+jn5KCwd/vNLDqxqpWWTPrirGgxvSfXcm8dT8PbNoJMLR0L+rzQGlTayzJq7FQcQBa8Dap8Jl04FxuJy7DupYAQKWdOd2Rh5LNLGErdQjv/vyVLIMsYvWYF+PtkNdSiES22Kx++X2TJyE28/tWA2ovQ/TV0iT3e0NK2YEyPEHpyobJAZo7XI3ItEM+ng22yzxz558FmLg3RTcVuI4OQ3b35JTeQtNU3Pg46YkBj1UWCHavm2CJPKcqi62KcsnHNWMb42y3EGVmaUdnFNOqZz/0JQvTftxV+pjzGj6CdxyaAneGCOUzKjMtvJJIRvc65DB4bOt5s62Aobzi4SlR4LUmmDeZky54cwkMcwrpNdCrvvGWdLoq+","layer_level":1},{"id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"页面组件","description":"page-components","prompt":"创建页面组件的详细文档,全面介绍各个功能页面的设计和实现。详细说明首页仪表板的数据展示、登录页面的身份验证、品牌管理页面的数据维护、型号管理页面的技术配置、OTA固件页面的版本控制、系统用户页面的权限管理、分享码日志页面的数据追踪等功能页面。记录每个页面的路由配置、数据获取方式、表单验证和用户交互流程。提供页面组件的状态管理、错误处理和加载状态的实现示例。解释页面间的导航关系和数据传递机制。","parent_id":"aa2583bf-2c6e-4792-b794-1563db547d08","order":2,"progress_status":"completed","dependent_files":"frontend/src/views/home/index.vue,frontend/src/views/login/index.vue,frontend/src/views/brand/index.vue,frontend/src/views/model/index.vue,frontend/src/views/ota/index.vue,frontend/src/views/system/users/index.vue,frontend/src/views/share-code/log.vue","gmt_create":"2026-06-30T14:05:00.060248+08:00","gmt_modified":"2026-06-30T14:24:27.142952+08:00","raw_data":"WikiEncrypted:olK3r0l78uP98ua79qDx7UWSmXb2E1v0sVKrAVzGYuIJHPAueEFJ7X5N2BSDrAuja5b8BTuELO8ubSNrSkgP/Z6rORQB8Z8doMfIZES0MEg18aBljdAOxOLzrDB089hOQpIseNeWKR8TXhStfC7+I83ha5LZRaJMoo3SuuqIzp3RkRQ7Do5v9wPCFg1iCbQYxnjwxm6zBRiSnHN3K9VmnziSCPrAqvYi0G80OkTVJZxFtRGsHzRduLx92WHhDfqsUqydlWWiPmv8K5I43pyYLMEgtXwCTysGp1UWrivekxLpUEkNAc506Rv8F3ZlL0VFyZUPT7bbz9ya0HADXvlAL2I0bLkJFkjPSUFTni2S4GtLHqH4cWROJC9y1Q9blmamNoYY1jJmJyU/NTSMC98Zqe86Efc6uTBDtHxQQX7u47icPzu9gG2J8JodxRFiQ+sVBNhbDm9gZUjKy+a9zXMBxeUGEi/CKi1o9KLgT7+q0gYw+vPb4NHgptzD95TSruRKHAi54z7oxcpJxKyvK170w75cV1bNR1nPVFvWJRzAVB/KKwlo3aLH5aXe4a27+tlLxjJ+pJyZxAv3WxfYqBc7yQQ1sROcMgpuAY+idES+OB+qeRzI2tSm39VjWsmEaq8xxLzlTEgOr7lyZnZ7jpasuYj/ZreCaq6541xuVsJoho8ADkSi8GB7Q/aWZl+UxNj0y4S/8MV8O68/sTSPREEN/QU6DMQsEYODNvz/U0qrzaIU+PBXXbfCJnxqAxYmvhELHwuy9/CUrSSaKC8ZciV+gtAlaV3Yvkfwx+855UxirdWJnEuk4lGX49tVCQG7VYE71gimwTKSsYviOMgmsyzZpUe+UN7UVNjGdW7ttWNYVtnaYua5cmOjtLBUGOrMwvlSeoxkJ5KRXf5Oa/COdfpa4d0fW0dVAtp1T0dTZWSbOk/lswh1YQUqgXj6DDw2qvpyIj2M3OzlFScFjbYizbh3JWD1vz9XxoQZ4C/G3nyi4PLVynnzu8hJrbBYcCb3Vsug5907YxaxmHr6zx+B2O+KaeiBw3vRa+EuQO4lJBH/diEjB1IKlCxZu8j3jcHMP+NLdTEKoAHodIpqhq9SOBjnvrWxzScLZDoU38ngtUQ2H7mSOif6BesJIxuGgMu8L/FRZr3+dLA6odcCvQLRAMXJAtmqmMPVEwJMQufl6WYvE4ZiIZ9sHvMxRAU7vS5cchHtzFte9/luCpsFv3X4xHw5hOmicjsJXCXIH2gXRoD32ZFbnorAo6WQ78LcrZU7jezn9PshnFoSmHH9FkYpd0Udn5J+uubjgRFNeF7inWmeH559LGe5OPLj1eZuQAcbWOy5WCMfC4GshplBJBu06rqv4nfGiMgtpER1L0lXIkxO06qqYWbcHRP4vaOSvprxHyh9iSL99YknTBb32b+dngtSCQ4Y+uxBZ2BOgLbu7KtS2wrf+611BYlSy3j9p7bpPZOxoZYQkvn4roAPOBpPa++5ezB6xMugHAWqPH2kkxrL+fc=","layer_level":1},{"id":"00a9d595-dc79-4ca4-8264-1c3f4a200a28","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"监控运维","description":"monitoring-operations","prompt":"创建监控运维文档,说明系统监控指标、日志管理和性能调优方法。包含Docker容器监控、服务健康检查、日志轮转配置和日志分析方法。提供性能监控指标定义、资源使用情况跟踪和异常告警设置。文档化服务重启、停止和重新部署的操作流程。包含备份策略、数据恢复方案和灾难恢复计划。提供运维脚本使用说明和自动化运维工具配置。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","order":2,"progress_status":"completed","dependent_files":"backend/src/config/logger.js,backend/restart.sh,backend/stop.sh","gmt_create":"2026-06-30T14:05:12.313816+08:00","gmt_modified":"2026-06-30T14:25:08.613907+08:00","raw_data":"WikiEncrypted:HL3VqGjXq8A3aGeLxAjVPqmSWC8Q8z+JISjcpFTl3Rl0A9XVAWpupiaS7EM/Upd2tazZmC4eQGSkervuf1jbMC7w061CAmhFQqOU+czssHD24JzzCW/dzhPQh4OdveHL1lgCBXcR5/EbIuduJDuUmEwJx8aPYEp49Cq2bRpWZ2xXxQ9geEW929vQ0xrspQFu0M2MJkvVnbxR/C1ZA/D+1XfRFtbxiW0x31u8IH0d8nAhLDViHT9HOYnEHPGBjRiTyLhwVlOqUTDNsooW+CtVaXaVamj+Zsvm1Qzfw2XF6Iwkggg0GMA3YkqEB9DFwhzkplZ9FS408azxIS7d4fS0fFXf5diJya6pNlSuA8Iq6y7g4uAB2AiIZJvG94W2dwa7z5qIY979LwHB4DepnmSDztn7ZiE5nt52n+/HGNVea+cOJHee4MvbrnaM3omg7CWLoZG/dawr+mNCxykZ1vRzxrqBbNIvQRMJ+HpOfKUKEho5u+FPTs3ukPlfGiElxzlSrtsP1WAcQFFsET8OsCEk5x6IUkuh1g4u0mqPQxFDojZEl0/RjIoOigi3cHQ14MLApz44bkfadHqnpAuoznkln9hllqFREbHcGqNbIgHnQHRzz4Be2IM/7wIIJIiGbHebHoTXQV+aHxHOWNV8sCBn9aUZRBa8BvZ3UNFtcqEZD+wrKlf8XoKsc1fvfavpnUQ5viCSMfPMK7jwDTGIrqLhf6PL3ibkfDqDFVvIx/FNNdYFfkX/8Cxs8zF79FyeiYx98Yx3rItEZJit0mVmV0SQziiDqTyirtN07F7kZBFSUjWFi/WfFDBGMw+60Qn5WjMW9AipX0KdrVuf85oZIeT3udpIrRencXCwvchZRJU+NJpAqr/6K675EVQ7ybxH7XNUGXCYyCdxqP3nqDQkRqxHZxWsWginc3n4kvhE+zpfTUOp6m5HsO64XllZ+wohWPyjrqJSkEw26JhJIH+eAL29MliX6XBYjvlgT/Vl+dlQMn69VEgVXBBA3BXTV7KzWDUKEtEOMqP6WNKauLQTYqHt53vRnAZvBL+x4IQlA2rXWIk=","layer_level":1},{"id":"72a24a80-f221-49da-88a8-83c0f49f4e9d","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号模型","description":"model-model","prompt":"创建Model模型的详细文档,包括型号基本信息、技术规格、参数配置等字段定义。说明型号与品牌的关联关系和数据验证规则。文档化型号的完整生命周期管理,包括创建、更新、删除操作。提供型号数据结构示例和实际应用场景。解释型号模型在OTA升级和固件管理中的作用。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":2,"progress_status":"completed","dependent_files":"backend/src/models/Model.js","gmt_create":"2026-06-30T14:05:22.624097+08:00","gmt_modified":"2026-06-30T14:24:50.789071+08:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTTxRACU8j2qQjGF3ZvWCBRJVg4ygFbHKJwjRB8JHwTktUDQXcECHhFbmE4gRs0t+1cAwN3sdIm9MktHpIRSSYNyl8It7CS8c7Kbko+KOWDiia/4OYzPp1+Ghybtt7VK0zyBQN81qZaR1/UW5X18q6Nd78fsI04PQzw6oOqgto+wxHPnrvKDggDY8SsvvZmncwmrzbsOP2VtJJcNhQMXg1u+soPYJPOBoZxHDWrDPjf0okt1vMMWF5R0WFQv+iUbzBJ8PErbw3ZK+lbHsFncbKAvyI5B3bNirWYLw+0rZkmGJFY1RqV8iitjYAx76OS6oCAYwl4rX538I0xqWuH1+rXHMZIE5YXahUiRCB/5a1f4dUO4hJj4DEeogkMGOhOjR9xYWKVFWpSaTMS5Yu2gt/9XRhRwTypJiHS8yXXsr18QOa+8Z3GlwtXVkca7zVxoDQBL+zxQqUvgAwmCfI/W4+30Diu6dAy8DD1t9TipBisUO/u/LCDNc8k7jxtqnktibaTrSNLQ5aCiRVMFO3S9qwK2gARGh/+/G4ja0DMwD92UpaDcbdghx95nsPmFLkYUNLQCPdANbyN9Em639BakRdlQ4BSEJ5hNgAv246ePTEWXdfRdqUyT0m3gSZWa5Mq32ZA7AH9Go029LdBNBnzy4uJ5sSSoCfIRhPWpD2NHqQrjZEv3tfeWG5i/sx676ZFqNKV2NW2upQSmBHwYVyYDDDoQLCcYEH4WmrHvFqb7nXYmv5zeJu9YvYEf1kdEAmrfV2yg==","layer_level":1},{"id":"93c96675-6099-4ed5-8f40-6a47b3050712","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号管理","description":"model-management","prompt":"为型号管理功能创建详细内容,深入解释型号CRUD操作、技术规格管理、测量数据存储的实现细节。包含来自实际代码库的具体示例,展示型号列表查询、详情查看、参数配置等功能。文档化型号验证器的配置选项、参数和返回值。解释与品牌模型的一对一关联、测量存储的使用场景。解决常见的型号管理问题如参数验证、数据一致性等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":2,"progress_status":"completed","dependent_files":"backend/src/routes/models.js,backend/src/validators/model.js,backend/src/models/Model.js,frontend/src/views/model/index.vue,backend/src/services/measurementStorage.js","gmt_create":"2026-06-30T14:05:25.897162+08:00","gmt_modified":"2026-06-30T14:26:44.046302+08:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTTxAyrO2oPW5FnBLfa9j0/NKm3J3s2Q3nFpNDceHQchIAJJY+Esm+kwKbYzPD7sJYvxwkqnm8241LNbU4VUDyMUdH7d6r03XfoF+3X6h0i/nYLsTYAwxBGsip7N4hLZ8pmSKbp3BnXji6UgQjF7/CgfgpNuHgBcS6Ttlr+r0mIQUQWfypIa7BMnm/b+kbCZ6KAxJE2lrnh/B54tDedeqh5AIcFVUgPEE1HfI+I2BKDbbUP6mr7xpRmRgRiKXp8Yu67KEi0BUQ+FZwLXrY1wGjxxfqx9SkDYvu86roCAryofG1eVaY0h4ewMz4SCGkf/SdMml462bXR/sV1zeIIVj1LYEgFOyzujC8mo24XFEyhSI/kPjejVr15vOSotQURQl0xlE2IFjLAFkHMaFQt2fOoF6BqtTfUng2T1ylI0/yJsicbJ9ClK7kiT5d07qaeITW47Lz+/vpzl4Z9SdPAz1tmpazg1IvId5r5npSaoHBeruslMdPktamlToVWKIFh8cao9LDql/Ac0A6n4bvp/Timq79TU8jI1ywBPc4iksAq/WvJllEhreDIo9ooiVo8TN9MarWoxp3sekBzpDLmM59ezqD5cSaL6NZ1GGoB2VInXcOD6FE5RVlRm8v95nL5c9dAh359XB0d2XQt0qL9kk2BTvzCvYluwMux4Q6uODwl4KOTA8wzsnduv4NBrs+0GVI0Lpe6Jzis4IhfbBlkw+qu4kA09IBnhW+VONArqmbMJdXC0ApM9coizPwpgT68V+vhd7yfAOKEdSVNdHU9vZq0CIyW6CNfpfS+jKHimw2Kzhaor0uLsTJi4cQQxXe7L7C4Yp0BcouZC/Ho+SuVmpF3lncKMdA8FsoA9mWEXfucDdM8kZXhQiOb5hDwuNrbj2WLnP6KdtzgeHwIDIaEItLgyf20R5Tczg4vLl/EpWHdC2xfURLEYcZQnSMyvicHCoWScmahBPG7V/Z7HAVdM7WVHJJ/Ie8TPLPx9jFbbPmFEhFLKlLIGFzlv+2FNk0dnPbSUE9JN1qXuzPPIZWqiKnaqMPNkBQF4ff2AZ8zr9rE1un4AAJyKw3CN/Bulad6OBAgA8tQ8OQauG4iPGQftBkGgmTrtpE4lAyxTxOlTgs6vAbglfBzjEp5MFc7o7BKyRcsp1dEZGj/ZhwMT0fyPYTjhoIfXV4r2YKMA23EhKXjVAsJmATLtBTrw5UDJ2Ge4PRxWFvsAT2G+8nsNh2NUvNG6TruybUm8Y5o8ifHmhHRgUDKUvjv5ksLTcv0TKEmwIWg8G37ovmuo0FAwOr1bvXK9utPucmZCGtPMxjLJPBmNpCDTAyc5AZONp3fMeWOU5cWG+DSiMlLU9llTtmGaseWrFc3JWp+lbkwzfLj4WmRElyxO8XHDw8f4TvpO/qeAqwig==","layer_level":1},{"id":"32dbace3-24e6-4a2d-9f87-83f2ec825b71","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"密码修改对话框","description":"change-password-dialog","prompt":"创建密码修改对话框的安全交互文档。详细说明密码强度验证规则,包括长度要求、字符类型和复杂度检查。解释表单验证流程,包括实时验证、错误提示和提交状态管理。记录密码修改的API调用流程,包括旧密码验证、新密码设置和错误处理机制。提供安全最佳实践,包括密码加密传输、防重放攻击和会话管理。包含用户体验优化,如密码可见性切换、自动完成和键盘导航支持。解释与认证系统的集成方式和权限验证机制。","parent_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","order":2,"progress_status":"completed","dependent_files":"frontend/src/components/ChangePasswordDialog.vue","gmt_create":"2026-06-30T14:05:28.623391+08:00","gmt_modified":"2026-06-30T14:36:50.062236+08:00","raw_data":"WikiEncrypted:MTGOV8yMPpR4TI1lgrJ8xG2DJaIBmdXRwPCl7oRCvXmCW21g6Vjoc2Fgt6nmmENvVQk6mZ+b48v5x7n1+0vaA7CHuGOaSKT1JpGPpRS/S04l+JJRC+zDXrImACBhSN+bAa09cBwSvWPWb3abEYtmKZTzRsib/uzjiZZSf1sPa82YEOr2t72Zm1OMMiqS8XA+qsZEzYiwLmiPLYFL+guO/3HaXe46Do0MMkKmltG7SdeWQpg0oka5yh6krSsT/W287f9JlYbkuaKE1DuvTnJQP+AnABLGN4UgZkrNvRu7pkJDAaUqmT59pSsjsT36NdrgsH/M1TPaMUk7joUnZc1IdIj085VEilPnS5PxTJEGHREbxVqxKR30C/5r6GnnzdXr/jrRhHs+UhBMOTdxtXGexuVx3aVzvCeBi3sRmGGNEzB7g7VsMJhc2HjCLYbeoIc2RP4XbivYLI4jkL908EQple4la3X3ggTZmmIRB8tzgdn2H/zDbaJ2ZCuI5cpzFamtwC2X6eLW2I90WLydSARo13ACzls4tu24apN25mQi0O/72z+V7bdoohJxqP+HlYsJ7MW2YFHCc18sKduLVLZsdqma8YQsXwV5EgYIhKAl3Mn0jCJvMHHA1q54m4MpedfXtyxUaV3Z/QbzKZiNGylMaUcTqeSxrwmB2Us4VdoHw89a2hUjp9fpAneq1lii4WlWygpjsZ/xGZPeEZNS2sLZLu2iV9btxVdJtjr14fDw8t817dq71safFgmrfgWmIwy4tBuQt+sUoYEHPBA/8RNuqyzxybwdhwFDxW8nUeyILFVyC0NFnS+jYQiYM4ffGs10mGWaO4Hw5gQWNFE0V2rXXTfx6xSF0eq/KXLoMuB8Pvey/AELPNiW8oveBlR903q+smsgrLd96oVR4kol5YN914XfzjM3kZBz/muAYVbsDBMKbEbczayPubwLm5zMFOuShES9MqJH/Jbzr9kcOugPx6sl3T8EMJGTuzlEnCi0Fc3Xukfm0wRx6j1iRYvbuyk51s+osNojspt1+OlIMIZDXtjf9XdL0wfoUql5ZRzDh3jNfbGv8VRxV6cKWIrlEiYphQre0T838CYjw4UVA3KOwWuvhCXU/fl0llYLZCCmfsyliuUVex+HGMwN4Djvkus4COjxzp4f2DByyquV0del9JCQZJ7XM1H0vW81c70BJuxUZjpLeZK0B46qiiAu1d+7","layer_level":2},{"id":"af7f747a-9be6-41c3-b091-4ee5901d8cc7","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌管理页面","description":"brand-management","prompt":"创建品牌管理页面的详细文档。全面介绍品牌数据的增删改查功能实现,包括品牌列表展示、搜索过滤、分页处理和批量操作。详细说明品牌表单的验证规则、数据绑定和提交流程,以及图片上传和预览功能。记录品牌管理的权限控制、数据同步和缓存策略。解释品牌关联数据的处理方式、级联删除和数据完整性保证。提供品牌管理页面的性能优化、用户体验改进和错误处理的最佳实践。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":2,"progress_status":"completed","dependent_files":"frontend/src/views/brand/index.vue,frontend/src/api/brand.js","gmt_create":"2026-06-30T14:05:55.602772+08:00","gmt_modified":"2026-06-30T14:37:33.764923+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLid0YsRsuFzxrKFl1UH2EDILD+4NmryAJ+q2oYZ42eaiuwvs0ff3fJrcmeJphvg6shRr3y/1Z6QIqf0SdVu8YJToiL52I9yI/YQ9QmrCLTmSJK1Xn0gikJy/Ur1L6mQ4487hhJQ5ETrEyG74ClVaJFLbUcjoZnico/zSQru9m462u4XEGzLdVl3wBitgKCowMgtQp8iOkg6zYEOvq+vQd5ZMUpRGtPDuGd5LGl/sCyJboNraB5fpHqavDpi5YE7ArXMWdq74EgB0tuJXFndniw/KReaPlNuLs4cZb5MnMb/Zk/FpXzVwYB4qeCuD7TTz94PbPh5lQUUSV1nN7I2Nl7KrP7WCumRo51Bsp0EgDTJ6Lv1FBBouTAIk6SOJy7c7pHKI2bVjdbYhok8sqJoO1zP8R0kKkzlWVqR1eqx3c7vZlMT4qGOrIZltbmw3MS0LlfxkOwLOAeA1wiOuMsyxRh0rW05bslECO6N6C5nvuooj2pIx4UaPhTHmavcOt1kHG9pMEPh2Fb6VZOpYFKDG2zyCIfnU3fVAoD7n68yLyuJHSMnM+EsWqLHsaBCFBaVOUW1k8eMzltfozTQzFUlpASncW1hCZDkH9eAByXunfMzj3cRR5ij6yv+rlMx6Kc8OJtIHMXfY5Uug4RoC41bw1Q5ApjCy7rRFRC3MXbXBQKnufuVAvtk6ldQ64s34dZG6Fs7AuX3T1VWSDjReGTa3JKhARtr2k1xtruRq5ugRY0wrRTCkAiW7nE3grXMt4101VFK4QE1jqRxjkRPVCz8B5lL5TUqxK8KFltj2NZEC24YU36Zz74rntRYqZwbl/pRQk6uP5TGiH3pw7xActW1I6ySnBBrJsUONt01juQ4Tqr7+S/JJbR/vkryj65Kc00zCRsbkeH0dXxmKUKB59e915AlLc0aQRlXRhTlfKUr7/IMAd0n9HGSSaKcRr69ijbll3opHfyRpZF/uF0kmh03HjEredmCzrYx9fGQUTANJX2HqoONB4ms4Qm0j2am+UjAvbBHU++SpwlZBkP1aR9KuMN4uKpX4tUjL8tDJRGW7ZU7W","layer_level":2},{"id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"数据库设计","description":"database-schema","prompt":"创建全面的数据模型文档,详细说明实体关系、字段定义和数据类型。文档化主键/外键、索引和约束条件。解释数据验证规则和业务规则。包含数据库模式图和示例数据。文档化数据访问模式、缓存策略和性能考虑。指定数据生命周期、保留策略和归档规则。包含数据迁移路径和版本管理。解决数据安全、隐私要求和访问控制。详细说明Brand、Model、Ota、DashboardUser、ShareCodeLog等核心实体的设计理念和关系映射。","order":3,"progress_status":"completed","dependent_files":"backend/src/models/index.js,backend/src/models/Brand.js,backend/src/models/Model.js,backend/src/models/Ota.js,backend/src/models/DashboardUser.js,backend/src/models/ShareCodeLog.js","gmt_create":"2026-06-30T14:04:20.637975+08:00","gmt_modified":"2026-06-30T14:10:45.950286+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV1T7LGtk0NNZTeyhAbQ+Kw6nKL19/84a+4Ky8TPQGUBAMv+/6dJGLjO+JY3ZnbVJix+JXTUe92A0fyeezyoI6zxn0BCAAx7GKkFkl72yB7LDQCZmuLQu265aq1IM9ARxC5hoRrKFrUfmial9RptFqCk8tXMOwlttvntP9DLL0Toiim2N8rxuTj3PZ3Sfi2OoqyGs9QmcT5sZkFv2MzdkRWxlRj+lggrQgwwCEi7PAKwJUu8fAL6D0HFdfQ/zGBjnr5HmJCLcdnczST1lLXFTpVqg2yA7ejV2oYI07mzPC8wxSIMZ3razM55hNHeD7TIu0h+AASYH/fMFx+BavsWSWVibAj0+GY3nVB1XGEdf8tKUxCt2tLkzmNC0ONaFrb1sH+u3/NACyBWp1XT485tAbYK8nfQIKYCsxMN3A/5DrVsuo/qHfopngN0j9+Ezecg/k9Tpmt1WNL6Q3XGKE+SH88eF9LePghhx2s0Cyeh8dtxlqwb3KvkFwy/T8YuSy4I5txe2e3KV4B+65RBbbnRPp9CU+X/MAW0EEPjUDUcpVTF1RrZp3uD2ugvmRoN4WNDuXqn+O+o02Vm53g6xy0ZAjX2BiUHbtGhP08k5nBf+6vc6Qw11ko3WnqZtpqJrpu2/pJm40NX/r3Gxcwc0lhxO3Q3EgDEQUNhM6kykwBc5roxz1NZn9gecFJ/vOtO/a9ekqeknKCjw+PYmE7nimMApPoaSzADSa7ZF41I10SWY3CWWqNFfZ8fs1kpjew0mcbEAcyHSEB6Lkt1zJclVbuowc/XC5n6bv4fqkK2/qfT4i/h1zQwLReqBxHagDNUFMA/qXsFwWWSsqOnBtOJV0SnMYqryPf8/tcUVYavxmkBnmXvABNj45AhkJX7xs9fc4CPoEHcxa3AyPkvXSy9v+LTqOitEoO4BOyQ+5o9KELKxVwWW6rA6wTuJK0VnDMTCO+sJoy15gNLfTN1KZORVVwPly7IRW7yO+mCCazqFfoXR477Kif4qeBnWPClMQFLaFJ+pEgvIJWYRUNfKcw4vc/EkyYYeA+Hd1FFr+O5DC0HXhUctk8lYt9MKtZH31RCBZFL95fvmg6+hlxpcnqGgPyYX3RhgESPLtQRADQH9MeBW9GkS7EJElfVnVsfTOAdmSos2AMVYslDP3x1z69CIk+639BSGgJNNyprE87PTRKUxY4eHCuVmALZYeo53/n0ryOP+Pm0RrLO2OoEdwDukBlzJqujjYntHapPf+BV9MDdrQJhuaaDPw+aEW6SkitZwp5cGi5x743nW5gBNH/3CtrEysupQXlFxxgAhYXnXVB7ruWNWK7EuH+8oIfmNMJ4080SwxT6REnUV87E1DChQd20pT7L"},{"id":"6cd96b12-bb94-4748-94a8-9ef9bf21aee0","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"集成模式","description":"integration-patterns","prompt":"创建集成模式文档,详细说明系统与外部服务和组件的集成策略。解释日志系统集成、文件上传服务和第三方API调用模式。文档化微服务间的通信协议、消息队列和事件驱动架构。说明缓存层集成、数据库连接池和资源管理策略。包含集成测试、监控告警和故障转移机制。提供集成点的配置管理、版本兼容性和升级策略。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","order":3,"progress_status":"completed","dependent_files":"backend/src/config/logger.js,backend/src/services/curveClient.js,scripts/upload.sh","gmt_create":"2026-06-30T14:04:44.766596+08:00","gmt_modified":"2026-06-30T14:27:35.809057+08:00","raw_data":"WikiEncrypted:0j4RRfWJQdenLQLpT+DwLY9h0ctWLZwu8+2HoqcoTgcS/p644+VTtfXH7/YdC+18sAix7E/U+9fJqjMUaBv3jH3dXtuWslLxziQhE0mAM6KzXiDK+XHdsDX+pH5TGGreF1MypynKLMokPfyvDKXXvDb/K/htq5rDIK7wn4efMGrpYrHlk26HkWjVSHgXWa8mSvCzhzivdxiPFSzM+bFHKmAil3znEHtkwMtneqShT9/7CHzIwjUUkq4PtBv4zoyd87sLPzIHBxV584WgWr+H9HiHl/rgXIpGmmyxvut6aE6Mc2v5WhKYnBXayO803+sO3YHI6rRIuv/B17E6Q0lLwA+1x9YcSWrwXv0cmDijT/4f8uMl7RC7jSivX0mlv6dFtsZu7V/TF5vyEVrzfMMxsr4VQjceTo4zW+y7QufDdnvlGRr+S0DFgAlt8IpDnp49wmm2oomoTmIRf3OkwdMZEIGJxUmtNR0zcvCIdBh1KA4TQxHOKFZFOt0qaC9wAFXB2mUD/v6im0DNwlC9lxd0YSEHf0ZvG7AFzBTCSu0s4BrXMKjBlQmvbYHIztwKEe+eQLwn+egVBK3fWzCesFrLhQolEWHZge33dHIVt/jl/VAu8cuAjZerwX5ma+nYjVDSkJpDBLFeII5+/XG1QGVnFeHRw8iHrmbFjioXBvDGm3JGK35cJYmKDpCNswcTS4czKP4q6iapCga0KZHCA25UqbmW7fFBBJBnLXJSnap5wZL2/cXVzzrMHq0DwVin4TCmhatx25HzI6WSkier3jGKtRxCBPDJy1i6AaUNVTQNQmf5WXG/3+KTgWXojmRlUQcRPCxOO+jVRiuENVql2W2CFOHb4PNkmO2ybwjNkuLawNXMRTVnDlyGmKOj6/8+1qv7NkG2VU3x7q5QRh4EOn1Xx5OL8wK3ZIo6YDtZQMJ6fAt1a/Q1V1P+xtU7nXtJrP94p+lh+S8as938vJI0ks+Th12f9lM8x2O0q3crMtXpfTiY5KECIAVrHQBXIgP9mDzicaW90vw0PhTRJL3zNVMp1g==","layer_level":1},{"id":"41e8823b-fa7a-4a80-809d-cf21088bdba2","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件API","description":"ota-api","prompt":"为OTA固件管理API创建完整的RESTful API文档。记录固件版本管理的HTTP方法、URL模式、请求/响应模式和文件上传处理。包含固件版本列表查询、固件详情获取、固件上传、更新和删除接口的详细说明。提供文件存储服务的配置和使用示例。文档化固件版本比较、强制更新策略和兼容性检查机制。包含固件下载、版本升级通知和错误处理的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":3,"progress_status":"completed","dependent_files":"backend/src/routes/ota.js,backend/src/validators/ota.js,backend/src/services/otaStorage.js","gmt_create":"2026-06-30T14:04:55.156101+08:00","gmt_modified":"2026-06-30T14:26:52.749254+08:00","raw_data":"WikiEncrypted:E/YLj/vjaxHA5L3+/DbcM/RrsyTj+zs2iY0gxO9VwkrctdJ181Ln0L3ooRB4LTne4VfMGKZQ6wlTj5N/X2kXcEukZ9Fut02Bs5XkjPHI+2fVI4RjZN0XzwIQaHtBgl8tPykchP+BDkn7x21JPxM4faRabHD4SQ8f5w6ZTPuozmHMS8B+EHb2T7KjC4DoC1RunkTRgUzQ00ZOlbAQ417Nl5iSzdfmRxQ4xxXxBHxg7QRNmHyXXkYgUat/sYwewRJ7vWadFGMWhqvlypgVFw2ueYVxtwoTgfWRW3xSbHeuJMn7RF/FWundtS5a3WwlcFzvmkpGXhXanm6EBmi/g1nlkr1I62+iPGsBnn/mYzTCs9N0yzg8pjYlkjWLhoYnWzFCcwNjWuOis5TkACe4F3Enn5/lHPaUacKkjRUmCsmyIV+YCfcShFNlf15kqHmAJzFnwpzDTA7n2GDkXwAcTZVUsDiGIo9HcXj42Nj+gmNBocNtwCrq1apaus8+xrRBA1usRtf2XK+beNgVY8HakOY03Q88Yn6RceXtZURlft7w094WixUJXMU2VtwSJLIC/MnKfNzse1s3D/QatR22ivu1UxhLoQwKTdXiOCyrSysBf5CmHP+PJmWexDMBbgw2op1BNhxGV8ENxuFPoq/jJ6AciXYGnhe0HLsQZu3DGhtOKX6bhA/ylWSAqpKAn9MxTvI3s8M/gDD7dKZnrafvi3SyEI58q46R6EEAayRfg7w8pX3mpdDt+O0t2eN96w52Fhh3VFn9jdhnWBnEVhm8E4C2cUIrmVa1SYlBUaC+2Fuf171p3d2LjtzevaIzC3KDVOtX8VCAJVzeLbpOrxd7bo2He6Tj1qG1ElYp329PfO5BbMt+FDxZXT89pJQbxxz6faNUwaVjAWzvfB2RGDuugJFagSKpW/HMZJWgQwWRdG1GJnqI2xu7KnVfTb+VK+QPbH+TOkLtxvZ34sq+Fe9xRTH6ffAgL3GVhFx17Byd1mIyFtAcAr8SadVmB18dr4jmgbxbP2EptnohyUwoYMfihQqTaA==","layer_level":1},{"id":"02f97459-8352-4fff-9216-8fcabb128d77","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"故障排除","description":"troubleshooting-faq","prompt":"创建故障排除和FAQ文档,收集和整理常见问题及其解决方案。包含前端页面空白、API请求失败、后端构建失败等典型问题的诊断步骤和修复方法。提供Docker相关问题、网络连接问题、数据库连接问题的排查指南。文档化日志分析方法、错误代码含义和调试技巧。包含性能问题诊断、内存泄漏检测和系统瓶颈分析。提供紧急情况下的快速恢复流程和回滚策略。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","order":3,"progress_status":"completed","dependent_files":"DEPLOY.md,backend/src/config/logger.js","gmt_create":"2026-06-30T14:05:12.313976+08:00","gmt_modified":"2026-06-30T14:28:16.989136+08:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0tuZET5JxbVXxA/4vFailoRiq8l6SCRMdp2PbHfZPheZsOCEHlBpUkVcsULRxIpKUNxtyrd+LvcQjieQsOib7J2aYZb0jdq6DIsuIi9OwAqdeUo2sZ7WFYO0MjrDHQbEi0Fshph1GHL9lpk4FW6QGVpOX6LlZSlzzcg12dQ/7lfGLDNbZmC+kujhPKYB8y+Qg9DI/RBQ2izmG4m7XYoA9vhnY3btZQDjWIgS571TStZN+2zXE5D5wxyq1xW8sfVZ5aoLYIpOUkLMXsZXRuxThU9QEIsRrWxkIjNZ+DYovCzw6LfTUmjulPUu6g1fGUvjvcoT/wPnkWfZ3G6dkEdl2FNK4YiCrP5dIB4B3Ce5xXB04QOtueqxEA0ky3S10aN1HSYiNKLbR870IYZ5PIh7MQS6IVZ/xNU59dvYs1yYgWQzaTkW6h/wP9Qn9DJK6QJ5DVvqn7nn7UX9cmZTZdcT+EZvg3leLG3nUxl+rMg5moRbt3A+XJT1dR13DsgLjPbPKZ4+nDWJghDjUIQZ99/91AZrw0kPKbFba8YYIeLw3/nhshLooOLS8HHpn1RIwSI5C4biKcdxCPRgDq7LZn0X1aDqrw96+lKqgEm6PjrwBIpvhmWlr49hWd9rom2ohJAa1vkvUioWyGjsohChizidHzag+5Yf0ktjenGomBjPQc0ENMHZVtWmb0PwqR/Aj9IYfdLU9XmIH5NXLlNKtnDGFvqJOmCkUY2CjoQ1zLqXwcQc5CIXmeV/dew+CZh+lzcp19HqYDyuRJJeUuBxtHHC1E2fNZWXAgpNogDVGUEEGAFCS75/yAGV+eZWApwi7P8EYbT8bEi+lkDzWOMRG3R7uHZ012uwytQCgcEAx89CPTQRdvwzuHQCehVV5of8lW29MsJcCKWqYEUbKm9xGdGHMMcALiJh3Iijn108J7RBXVDNLIpQWWYIP3jAufqY8lz7wi06ibX8LgPQdR69b+ZWDEJ9b7RGOf9xsem9kNHlcHExDfpPlIUeYCTnQ+UAvW3BnA==","layer_level":1},{"id":"92ff3472-40b9-4adf-82b2-faf5a4d4b158","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件模型","description":"ota-model","prompt":"创建Ota模型的详细文档,包括固件版本号、文件路径、强制更新标志、发布状态等关键字段。说明OTA升级的版本管理和发布策略。文档化固件文件的存储和访问机制。解释强制更新、可选更新等不同升级类型的实现方式。提供OTA升级流程的示例和错误处理机制。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":3,"progress_status":"completed","dependent_files":"backend/src/models/Ota.js","gmt_create":"2026-06-30T14:05:22.6246+08:00","gmt_modified":"2026-06-30T14:28:22.050373+08:00","raw_data":"WikiEncrypted:M3g6T5zNL2wYgwI+v2g1k9TI04v1ugoF7zKt9xQvyuZqaGjJRFmBqKV8Wmwm/3SJ9Qv4rq4MrNZm9Mosti7r0obMj+m4wfrTq8co2+WGKMrYflsRbFhqYh3bwnRVAtBUG+oE0xiunIHCkbP/vnG9SBSl9YG0F5IlWVZTiJo4o240+pE9i40J+V8UwXtMXUWVIsQrA45pmgpTn3LfGupDTWIZ32ZD7WlYT4iTdOOe4azDCok4I1Yvh5kjTJYmR6+IggUUDFRxpFqxUyRHUCPAOM+CBB2O8JGPXOsn3M+0GhQ745lCytF2fTMIBwfB95CvsjNL+uIdYn68JkatRsH7lCOQBVWlNM3zJLvpllaYyA0NAYmiDZ9v48O25B6goFiZqSRDq+5ZFHPYhtmEGQvhr6vG3K6UKm1/8MM+Vhj2ys55M2serDCbPBieNvEsFp96ehe/Hg11TRDvaRr+b/cBcNmtD9NulFxM9jS5RmzGOpHtlF0RiurSmlao+eaveVPhKnTINLe0tTYSBtsYc4K2uriWVijJ8XYIvSE/5W9k7yhooovbDmKhWzS1eY1LMTR6uVCGXR6QPj60pNUVRKuuLQYtR5Kir4n5gJLT4VyoOPy5ZfSx2zGEKDHVGxrqdHKxP17z6R3L4wh/TNCj0rYBxmsjekn63MFHY9+xRbzKwuqYjsBjp7MogvotIrInX1awMAsoaZ56ODV1c6oNA+DtlKfy4CHExNfu0v5zbz2siffwiRcjzPcLH03x81xKluRNRjtmC7uzOo6qUnRwlYOHLg==","layer_level":1},{"id":"6dc54635-13f8-4ae3-b3a7-54c65dea2997","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件管理","description":"ota-firmware-management","prompt":"为OTA固件管理功能创建详细内容,深入解释固件版本管理、文件上传下载、强制更新配置的实现细节。包含来自实际代码库的具体示例,展示固件版本列表、上传新版本、配置更新策略等功能。文档化OTA验证器的配置选项、参数和返回值。解释与型号模型的一对多关联、文件存储的使用场景。解决常见的OTA管理问题如版本冲突、文件完整性验证等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":3,"progress_status":"completed","dependent_files":"backend/src/models/BlackList.js,backend/src/routes/blacklist.js,frontend/src/views/blacklist/index.vue,backend/src/models/OtaTargetDevice.js,backend/src/routes/otaTargetDevice.js,frontend/src/views/ota-target-device/index.vue,frontend/src/views/ota/index.vue,backend/src/routes/ota.js,backend/src/validators/ota.js,backend/src/models/Ota.js,backend/src/services/otaStorage.js","gmt_create":"2026-06-30T14:05:25.897556+08:00","gmt_modified":"2026-06-30T18:39:56.546904+08:00","raw_data":"WikiEncrypted:xd9L+Z9CK+rU9nPZV+aXHWAC+ITudx4Vmx0ZKTalqXJh9lrnWNCrJ6gjfeCs+3xXwLzs23BTL7qcVvNIUwEHxkOC+w2ZMrQ1yevYg2/xv43z1QKbxDHD+DfzVy2ip3HR1VE9OTicG8Y/HrwMuTMoN01llNhSTwVedKRFFHYLaQputwV4j1HV3mE2NM0kpMMJn1mGpOGgHYkTKOf6tqPWkfrJftkYGx1L9B8VAvh2tDHYxfKVUf+kxMc+AJ6e8nWV0nJsF8w6NDE4XPlsgB8PrDcXB4ASY0z1XuH6EW9nukhO2d54uVAXQBHVvqMC52nn5dvSjoOBVkoPIfIQZPBNcjWk+QLBqGgywdvJ9GvCILSorIgIUwe7Ty7UysVETKO+/91YlQ8g3OsTfZrRfCBCzwFPOOevT8PB1+s7rRgEcoOXVJDID2u/DO0CxO8TwhloI164hCOS7Bh4vPIob5fjB7W8huW9amUvUHXZ/6WgYtLUCzryhX3j16thLsy1HpDNrrEsxvCsPF540QoEZOFeroPtzI+GmlQKrSXS3ZnK8JbSCDmIZXNldzQiCRKRrnTg6+H/CyxpFCwNE44a7aBwSEryvtFRCCkAu690Xxc41bR+0IdguhXyL2yKS05K/VaocMmau3zZdsEv9Trwv+7BiQsxDp+RYxV4krfwGfcMwovPo1wRrQx+e/CTjhudQ36biNfUOSLnANYK5dJX+lIojP8LoBeGchUcYSM0wC8WvzRyJ8LbsFdaMJpRJ++Eam+wCC4IlpEGGVD4zn26u+OgfVBG1us2bm3RtlXYiAgi1b147VL1clma7bxzYt+GggXoZ9uZ3acqLztxrQWMFbK5NHpavUjTA2IbEQnxiAnvarLySz7A5g7ZnvaGqScK0PXek5ReiM8Brhpl9VcOLbuPHdqdpOI2JRyKb4u5dvw3iFYey7NdMBbuoLCLn5kZ3RiOz0xPZhazE/nE0YYVGlLU/igXken5QeqmfFIeE5PsudWa4GmfsIyuDCj9uOsJd3dY8Dg6sdSc9bhGkO5HHtM+fuFI0mWS6jCPQBCcFbnHp/uRwOL+6HFcpDYLmSzPKRFbVqAIVLuk2dezAieYDmZEo51vbYm+IqAeA9I261+3vpU9mg76oCMnWHwHlW9tSWweGNXaYU6IIA8N6Ad7Enpw+tz9BKC491F/JmJMROXqeetf0Yvhj9MtizDZ2vxfMthqEFmqDh9qgCrzlx5bIWa5gWbzhOG3B9kUf0GuXPbPraZ0cAk1oS4dihI+/TIFsdVjG6QQE4q7qgi9I+y+TV0HFkbe1MDk1k6mV7KDnUCgDXqjlQqcW2XncgtpSDIlOgXoCP4aghJql8zJmkDf4JcaXJmvrcT5S0ZJw9awJbVtc9d/JraydK/GH1FbkzQ+cP3hDtu4AIQ1/CqUwGVLRfFuGAM6G7lb79gGQ5mGYPVUAsDu4Iz7A3l87Ed6u5WGgkryavn2WdkdqKC6Di06NnbvZ1MvGPjLQmR7Af/gfcsx1ggxM/fjEeeTcevJLcvJeI1VC8Bgz6qitzCpBuwZITivl19J8MdjQNcVNKdhnmhOph1ZKvh1NC0tc2dDH5hVwtR6XrHM3GG1bZqOsofFj202PPff2oIiyh2xhk1Xxttm97WNoHFfPQquJTLNnNutWO+weSGUezVbSAIHc15G2bGpUkBUZwILvadH67980GOkpZim35NFITgGV1Iu3/oAb4lV","layer_level":1},{"id":"748c8db9-9197-4c3b-ae1d-a6e51d058342","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号管理页面","description":"model-management","prompt":"创建型号管理页面的详细文档。全面介绍耳机型号的技术参数管理功能,包括型号列表、详细信息展示、参数配置和品牌关联。详细说明型号表单的数据结构、字段验证和复杂表单处理。记录型号与品牌的关联关系、级联数据管理和外键约束处理。解释型号参数的动态配置、数据格式验证和存储优化。提供型号管理页面的搜索过滤、排序功能和批量操作的实现方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":3,"progress_status":"completed","dependent_files":"frontend/src/views/model/index.vue,frontend/src/api/model.js","gmt_create":"2026-06-30T14:05:55.602966+08:00","gmt_modified":"2026-06-30T14:38:54.075872+08:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTTxAyrO2oPW5FnBLfa9j0/NKm3J3s2Q3nFpNDceHQchIA7qn1xYiWgntWVEgz+AljimoZFfM3LVrNE3kMQpRlr2skTY6uMKWNkql4Ag3cC0UTnPNlQvkWJwYOEmU10Jn89d7l77rUg8Nwxyqzn2zoYbPoCpCLqpS8KxOTLbtRa2QLL8voH5tzFwVkGGH+5a+agk+PV3DL5DT+IAFNnknZsll3MPRW5gOtSgjc/uNcO9KnUZqA7DVC9jnEKxUlUMLTAA6jEn4/+ouQ3rC1ZG9Myu9b6C5HXybXVNf8hq8XWA+JEhitA+WW+GMX7Wsdwuha6x2PffjCctS+KLLThiy9R5cyhREhzW5QP3dj3wPa2CF9RpqxSDa7oto2W4XCr9a4zPrHL6z0HaFwjqvDmtC8FrJRfW8EEDJA/ZHv9hFD2dZLrqt+gwCJljcCEMGoVFxUB9oAxAkSn9URKXY4E7NUB4cMSpv/FwDDziT6+nl5ES8Sgvp6nasY6IDTdCzghLBLPhde/EfQAM0So8dNb8+qG7cwAtM/HgHnwVd9Oze1BXt8OD/Vx/Ejew+SzBNnhiyKBp8cStpfDtRH8Q3aoAzcORSMIquP3z0lTGPcwCXthaosYwARfgY2rchDag8FYVyfX19M9NMXAIN6asqgomUyQJYWCU7FFB4R2EYF4IBwFnBqb242GVwsiJS+tyNEaDZr/y/BdFm4dhND8qqHybXRKA1yHa/1gQwU54HejhF7CdUEE6z0mAbJ+Jaxc9jQiG7MLTLoQHMOWW4DrqWrTvN2vSlFAn7ZGBMV7MGPwFJjEdNSd7Sflql7/BA9UoJr3HUjthBTJdSqLmF6lJMII5X1IyH6VzHYU93xrnUFqHrwuHymszjb/RAE/pC0kHfuCVSozcEUmusUI/7f2u14x9pbL2phEYOlWC6vHlp/7bhURZAnNr7HGk8hNmSqYv282J4g+i9F2R67Z+c/O85cA70RIWoL1dojsAOun+2qVy90nbbujCeG9BPmjEXI6DKaUC10VQ==","layer_level":2},{"id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"后端API文档","description":"backend-api","prompt":"为RESTful API创建完整的API文档。对于每个API端点,记录HTTP方法、URL模式、请求/响应模式和认证方法。包含认证系统API、品牌管理API、型号管理API、OTA固件API、用户管理API和分享码日志API的详细说明。提供协议特定示例、错误处理策略、安全考虑、速率限制和版本信息。文档化常见用例、客户端实现指南和性能优化技巧。包含API调用示例、参数说明和返回值格式。提供调试工具和监控方法。包含已弃用功能的迁移指南和向后兼容性说明。","order":4,"progress_status":"completed","dependent_files":"backend/src/routes/index.js,backend/src/routes/auth.js,backend/src/routes/brands.js,backend/src/routes/models.js,backend/src/routes/ota.js,backend/src/routes/users.js,backend/src/routes/shareCodeLogs.js","gmt_create":"2026-06-30T14:04:20.638264+08:00","gmt_modified":"2026-06-30T14:10:41.230618+08:00","raw_data":"WikiEncrypted:N3UbzwGjCC3xD6BrTM0cq1j04iiCHEqviOrAoLLUfGDtCxYctzqR2At1GtmCrwAkNRcHgUzXC/oU+pquLUAJyJG4QbY4uH8HShHwsSaBVDFWOUg5Yt9aKSem2W6e8/XsvBH+yP21CSU0WyXIunvAbMDWN2E2tdW6Wzy85z2Q/R5uQyWZgy2mpBkGdGtFA8tnpiTWGrll3lHHu51hSPp8fubLI6JOYB7Pcw5m81DnxNYl30Rt/HNSOzY2hn6YlxZZe6LYmbGYTHJFaQ+1mi9pLEDLwyAsd2NXDHCvcH5PyODvHQQiWusTZ2CJRbKqnQ29hlTXhH7vxfD6JA4CJLUr1IQO4O+sNaKIJM2yqvq9AtsVFlDiSbBbx0hHeupPxyxoyJrkbQ0YEnJYE8vcEVwUMFYBaA73AgBMVIgg7EIO6aoO1qtVQOCj8O6WC/bpRRG0VsKJKCG0cWJF2x1R0da2454d/mYk0E3sNIdLAYefmKn5znpcSVxPYUmIasm7sRHIngjfBQy3oRnj8iMwUo4jJVzUnK7+SXmAFMGJnkGsPff2MYZK1ziPEV2jaUxxsuLG+ZJVOkkPArausPuO+h0DzRYrD5rtNlQHj/M+VdBjK/fZjUHU1VYdsOAE1Owe/XiTW736BtdVxEahqzEy4KjCuHnbdYOecFSzuuJBu8+IlaAIS12uC5MPrhIyhcgnimmvjDGib+IlTsmikIQS8yj/M1+iuWVwDonBYGcgL/M4fnP9tsUdLa0iICT02XF5rsFc0k3qg8BcCd1qTG1LzSDn0OGKkrowiNxsp7if26Sm14qjk/kMrLV35NzhCrv6AE1YQGMD/Dw9P+dhQT+6f+GNG7vvKDnkf14/8gSVoiZsVqvGFSRbn+uscXceS5KZOfRVqzG+beWC5lBGoBu9NDft5xzAlWLF3xkgw3v7JBOOs53KoXfRuWlF4MjpF/L9Pi0K8Zdy4N1kOcHDKfzZTX19J7qHEHGfaKEhLP+EJzuy2zgGMtSYa9GSR8ku/SMuX6kyUbmmBRECqXb4ohzFJZVKEysRjplQzr9b6kLmHq3DOFdeYpQjJVFbehRbFgziE66TVVVeSbE7EuqOl3E7mVe0w7GgLODvHmOCTJFVMvcc3Ci5Fe9jWyomiNykvjfxv5+iLlDrwAGoXHYeu0dvl32TPy2yen6q+hOAxVtrIQh2efNFU7L9NmApvpdARKuQC9oYmvDtTYb3ifOXMRtdWJNUVz8DQCf8jo9QF/5mlamAcnhWOR/muhUCtnB+WZbireNw26SGG5yt5NZLrMJRjNxWgM/mQ/K47LoKgPimdSfBDApR6MRTXyI/wKP5Lxg+UYUGLapLKqHrfamPFlWtyAMER1HR+wzMaIU/5E66GbWmR2s9oQgJpWfELjIUlODtmHh8trWp1yzOUXksZH/Kooshmmse4XmZ9upGxeADqhi9sY2ReO9DJZcGZzy04R570EuL/pWLoXP7E9b406rBlQ+pGAtw/Lj+/nK1LkZFclvYsH4="},{"id":"b4054b83-f0cb-4b7e-9b3d-effc904a5686","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户管理API","description":"users-api","prompt":"为系统用户管理API创建详细的RESTful API文档。记录用户CRUD操作的HTTP方法、URL模式、请求/响应模式和权限控制机制。包含用户列表查询、用户详情获取、用户创建、更新和删除接口的详细说明。提供用户权限验证、角色管理和状态控制的实现指南。文档化用户密码重置、账户激活和权限分配的功能。包含批量用户操作和导入导出的实现示例。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":4,"progress_status":"completed","dependent_files":"backend/src/routes/users.js,backend/src/models/DashboardUser.js,backend/src/services/userBootstrap.js","gmt_create":"2026-06-30T14:04:55.156387+08:00","gmt_modified":"2026-06-30T14:30:22.110712+08:00","raw_data":"WikiEncrypted:pOan1y/G3TzMEng6wi54Vc5wz1mwLua9oaQGTUm9cssalr5g1toTPIfYljFY5WaWYpIfvMfcOIPjVC5YrZe6T0ZeXnIn6qFUeNFA9VkQiOd+eP8PI9TknxwVIlnH8jIbIwUHH+P6UkkSNKkoEQ1Dgy4tQyZQ/BwhCdLqQABUIXBPU5meJ+X6w0MX1tiAe3bz/ckrWZcMva22ulspZnMMC1Wk3aVoZim2mC/orMFko2LdLZbXjVX8uNiFeB8UyaHHY0eGKN3MEHmSchfVJBXzLJAuJlUXl365b+bzfvnnzO1j6LwNYJMluGW/Bm8YNNXxv/nIBbzYwvWGjn/7eXoSDSP8c2D1QpN1Vtejf68ju2Xll64t71U4ToaQ6nUYw5uqsUgZDj9zsGfOjV52J2RWSeXnUQ7cUo+WLL/4N/5+3+KBlnUUuc5rvgZ/SdfIBzoYoyeDi+IU/K8j1B2CXPKNjSY7YV929LeSJGbcYxEdA7eH0c0zY7gNqyy/28oMx0Drkn/jYuCiMnKuQHF05L3581zmgFITJkAamXJV087BZCHex0iiYzrB2yS3QXrUCRMa5YfiO3mhv7u6C5A1bzqtY1b2pX30yhhKw71FwAuA172/tw63XUnOXjQ3M38mTt5hhxI+Z27ySXPk7jZs6OQosySBxga+SW59BdQWICrvO0/Jr8CqbIQ4usht8J3plxZpAOasjahz4ung4eJEzGEngpdQmNouctQvHBWOSXzbubhIGXplonmBfLNDPRk81plmJsV/vS9cNjIOPCmHJxQAXdEExTKuqASOCeD02Q7iDS3H8lUuIkNaF2mqaGwJXYsGwglkH2PtJIPpV7OLPmu7BT1QM3Vx/EK6EgWK4AkX8njheLaiGDxuJ1ZboRwInEgTcPY7PBX/x6jg4JI0TnG7jozxFYvNGlQR8xCJZ4SXSGF5mUM2MerylFlNh4SvGysXSDbMoo9tzYOFrwN7HD8ao7wuyTqK5EauHRjJiy7DQ1xhkAR+8xbFglSPmyzymu4KVhXnBy+ad2/UhT1vc3j5G2I+My/soGEHQUDr4q6/0Jk=","layer_level":1},{"id":"7a728623-5bd2-48eb-80d9-0f253bc74123","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户模型","description":"user-model","prompt":"创建DashboardUser模型的详细文档,包括用户名、密码哈希、角色权限、状态管理等字段定义。说明用户认证和授权机制的实现。文档化密码加密、JWT令牌管理和会话控制。解释超级管理员和普通用户的权限差异。提供用户管理的完整操作流程和安全考虑。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":4,"progress_status":"completed","dependent_files":"backend/src/models/DashboardUser.js","gmt_create":"2026-06-30T14:05:22.624965+08:00","gmt_modified":"2026-06-30T14:30:58.467643+08:00","raw_data":"WikiEncrypted:piKNT601qxwAxFbFc+bbNzJoKRWjVA24DZgSuXUMKeYDI+Vpob6SIDpceCgG+l/ARXk22LQbqNrJSpxaw3lYcwfCs/ysy8OCLL5SJdUHJVrbRwBO9VCr7EM1ykzkC72RNFstSYAcnBFNhGMXw+lvldpEXlEqZE9WwOHqS96NXNWqbxrN5aNChpOr2Rclp1ATRSAz2nUS+IeeSx64uQOVL3aSyP9BxlRPnARz3KagI4h5xFbrFRmGOu+2fHjVv4mfGuyBi2m7BOAvsQRAReO4aLFcrb4Q4d/YoU05hkkDJCsF+uw1h2wLNYqLbKVPnnQ+vXJsPReY5PN1qLbXnK4SYp2DGFm9mcWTWJYYzE3plH87IhZQUyYfFFWSWzNA+oWacGaaij336n0rQ1emfUynmp20c5H12gaAdeJnKNtilwuveESCgjV+cpQeQFNPuSBymzN2EYIYg9aAesv2HK1H3PBo1BRPR8jsYXLLErgqgfSevZLVZGasl1cVMkdzhHd3jXywieDpMk0OiXw2TzVbfD/R59mDLQ/8RFFCxIY4Seg7wwXx+w9Nk4zHDmIGcT2ciMFdmomMHsiK9TT5/bl0pCM8PpQi8V/abMOyhNZqK2NO8mgxpys8XDLzN2vunY5DWeD1FwI9Do09XWWByBmvOhSAQnZp5IvO+Yc1FEzRSo4NHjxKOXDmFE6f4WRlmoKnttDNUMGRnE0MXXnbj33ztpBqhSkH2IHqEDWAYGb03f12CEM2q4RcTHO1fbB3ZAECoyGOC3pmIqTyin9JECRtDQ==","layer_level":1},{"id":"4d08f4ca-84f9-4f9c-8d9a-0983f78a7005","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户权限管理","description":"user-permission-management","prompt":"为用户权限管理功能创建详细内容,深入解释系统用户管理、权限分配、状态控制的实现细节。包含来自实际代码库的具体示例,展示用户列表管理、权限分配、用户状态控制等功能。文档化用户模型的配置选项、参数和返回值。解释超级管理员权限验证、用户引导初始化的使用场景。解决常见的权限管理问题如权限继承、状态同步等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":4,"progress_status":"completed","dependent_files":"backend/src/routes/users.js,backend/src/models/DashboardUser.js,backend/src/services/userBootstrap.js,frontend/src/views/system/users/index.vue","gmt_create":"2026-06-30T14:05:25.898001+08:00","gmt_modified":"2026-06-30T14:30:59.497744+08:00","raw_data":"WikiEncrypted:A2q6dsB1G5KaNgPAwP2ZpD/NNAqdMxLD500dNl3wstxRlsTO1UAX3pxjxaiFL3z0As1vXXbkbHu4vNUGPLAL5aQdvyDy/rpc97235R5NBNTdhWQsZBMstzLADK9pZc2FHGxl73wo/dEkASQtxoZ8c/HAPRkbzM7NeoD9dIYUm8IACZdB7XsWNk9eYgM1s+F7EamxXZeo9LRcbb/Y/YFKbxweyfSjWzXvXjvoJz8YZ3tGNPnZgwl5qgSc7Iqd/zEcwe9suFPVJyoHFnfJNUH/kaeWu8f/cHWsyJGasZNAaAwZBBs3yTizjbbGBQE3c3I9OoTx3e45q++1SKXw87o4e/05qmBvNeVZolDT9qztewrGf8fDjB1GqNNK4z78df0HVIaQFZhhhIFgSY47aR+4kMu5z6cAMD04SbGH/sGtdnmsA6r40hK+TgrjJ7YJEn5YDMV6ULhMS2AGgCAgoOoOaQAYdtp00rHL6DqxWP7Ayw/PrS1EGjonvJDwqy2YY4Wu06Ti9Sv/p3stKU6l6v600sAU/HYdfnDB8XXCaiCnr1aOXNMMzow2YRdFlIzdIuCnb20FmdM6scyabPlKwJ+Q0bqI1kP3t1AzsMWzBOu/hSduzKJtqJdugcKam/IQ9dK5dNWVHOLXVwDMONyaqpurXeP0qrftDRCgr7tfAe7T1F17lX6F8vAAFXSSGlwuyU3jsLTxYLSnIBOiSsa8RpX4QosLNkYfmULBdd3rabnHteIWLCeywBzzAZwJL9/1WtaxYZ6upIjMsLu6LvNaXz7d7tfg2XqQT5SckfhVnsfs7251aj+Xj1CmFmER0EUEKiMtS1VlphUcRYaWP3cwRjPgIItB7hTHnDqlj4l8pW6pQm9DFy4luQ83CJlsw/FEjW6lloK8XYhGAiGN0PR8dTYL0LzjOi7h9MbZ3uCqrW4Sus9kHxcVPN1Ubt6Pl3KOadbrS5pfUae8rpFVss4Dx4K00tLXLycXKmVHa5Ctl1Z5EhAHn6/G+a2oo9L9ymOTVHWuMrH7peksW83s4aykHZ+cX5kVMOf4+wmVmLlrnYNHZ/erqFhdMHJjX3WoWzfJ9JbFm6j3AL0Rr/+/gY0h2U5dGO/ioG+M11sSM0TnmIHFSvQ5BMA7LQKYm734RsnlDaNiR5GUtVCC4ZGa0Z8ijU4iHI2N9XnTa3R1UEQAqMMGE8eAg7Mhy+eieZyElZFJTkhPbbPE/T/rMkbtaGNqMan3KohQvlP8qX0Mtb4UOYnI8fd0RwahU3KVQYEEtwhMvf7LRH6zLOVlQjtT56TgSAPCkla0Co4fMEDZpLDuSPD972VDq5r4NnMIk0ZaPfNHWcTgD+pAIL7IDmO04KLJV0h9lEguVWpMWskakEkbQsD28FQ=","layer_level":1},{"id":"f23cd2ae-fcf4-445f-b8e9-b3382f277ae0","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件管理页面","description":"ota-management","prompt":"创建OTA固件管理页面的详细文档。全面介绍固件版本管理功能,包括固件上传、版本控制、强制更新配置和发布状态管理。详细说明固件文件的上传流程、格式验证、大小限制和存储策略。记录OTA版本的兼容性检查、更新策略配置和用户通知机制。解释固件下载统计、版本历史和回滚功能的实现。提供OTA管理页面的进度监控、错误处理和用户体验优化方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":4,"progress_status":"completed","dependent_files":"frontend/src/views/ota/index.vue,frontend/src/api/blacklist.js,frontend/src/api/otaTargetDevice.js,frontend/src/api/ota.js","gmt_create":"2026-06-30T14:05:55.603184+08:00","gmt_modified":"2026-06-30T18:39:29.639151+08:00","raw_data":"WikiEncrypted:xd9L+Z9CK+rU9nPZV+aXHWN/UvyEHGWdvdi/wL/SLAtsxjcusIK0geuW0ev94vFm/+ZZNy+ieVfnAfHGqmL17rwVengK5U+HuyndLcsd+vU8WWUYAcbMeIuhajT2ueakLuWMAOBjC7Qjnk00go13X96EUYEuiWmkoDFEuFYCUNlYB8K85tvNFMpVCY2Qqrx9nomuigjf1WFHD0TrRVrhs1NHGRazgaJy8rA9ZCQXZkYfZ1sQWyMvR2zhRCZmZQ1P+Ay/sZmld3IJZ1uHwC0AOC62fyj0Y1CRG00+FjGRJYmzRiiT1ovJN0FMKEQ4+ReupsiHFpHZwkDERurHDlQ13YRkt4OKVRbYHan2yeZ/pF8DmJl3lk4ibWGBVa/AktLpQH/cUYiwk1NNG954l10fIGdxJOmE9R5Pi8JImO5MVH/3QHkAqJa/MCaS9oCtKu7kTXs2P9M0FSG30V8RfUHetYe3HaVCRL4FaCWm8r4erR9/3gp/e6yyuYA0CbY7j3tlp+/1/Qvqix1yzELc5MNkA4qG9J8EJ9SuSeN/9+R8qgOGZGbVnV2pC2dDbJZPfqMV1V/gcaZi/XRILpuz+Wo4BeKwxqmOTBX1yXOjLGxipXmUgGC0BOGAhldPX6VRTqlAqgl69qQ6tDSa0NgINVjg4K/h87ey+LGxhLZd7rbOMhCivmOOOvoJQAIsUIqVDWOfr19PDz/w89QxoGa1I2HaQacuwqfN+/eZ9b6ipHhWRy8Z0HpwlxllW2H+GUfdUewZEsd9hxIcilDCkSqwTRsdHRksuOEht3C6AoEO6az767HSveBe9SkKa+U3nf2mOcXCYjN6ISB5WE1ClRdOJd0a39T4zLVebVbEAGGzWtGHNr5Zc0GN7UftAiggZrjBJtDnIDCqSnwlc9Oq8jUS+4jZVkVz264OhepVcchT8JSgeeQ/2KDCw34q3sZ6q1TAfhZRhL6vKdM3gz+/IABj7p7OUv8iC1Im5i7hS4CXHlicAxg9tl8507psv1ePxbDNRCoS6+OM2+od+U3ma8RFAWzdBsvaXF2GWl6SxLmvRUvfavdwCmxUBmqxscgH8Kim1FZfW4EARHkIl5QYIm19a4Y2B7iKW3iDH7pBzbJ3uyozZUk=","layer_level":2},{"id":"aa2583bf-2c6e-4792-b794-1563db547d08","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"前端组件","description":"frontend-components","prompt":"创建详细的UI组件文档,描述组件的视觉外观、行为和用户交互模式。记录props/属性、事件、插槽和自定义选项。包含使用示例和代码片段。提供响应式设计和无障碍访问合规性指南。记录组件状态、动画和过渡效果。包含样式自定义选项和主题支持。解决跨浏览器兼容性和性能优化。记录组件组合模式和与其他UI元素的集成。详细说明侧边栏Logo、标签页视图、布局组件和各个功能页面组件的设计和实现。","order":5,"progress_status":"completed","dependent_files":"frontend/src/components/SidebarLogo.vue,frontend/src/components/TabsView.vue,frontend/src/layout/index.vue,frontend/src/views/home/index.vue,frontend/src/views/login/index.vue,frontend/src/views/brand/index.vue,frontend/src/views/model/index.vue,frontend/src/views/ota/index.vue,frontend/src/views/system/users/index.vue,frontend/src/views/share-code/log.vue","gmt_create":"2026-06-30T14:04:20.638638+08:00","gmt_modified":"2026-06-30T14:11:17.430176+08:00","raw_data":"WikiEncrypted:rJ/rIw0gVau8jPGqKFBAsBQkxmdK9VEWEB6rlQ8V+1n3+8ehC1YI3uvDR9AKl6JkUxV+3U9CRiifnSLpQnnLCcDHafY0ujJqoG3mrKKLwcRefLIG97HCvpjj9xp4OJcObEYBvlH2pirjv5kfcD3coj+uej2+6It4OTgW2/0oKQer4Q7Jd3Xj3CROmzgzm1LeW9oHFyhqH7niUp8ounxYBAbQB6XdHwIaefNnUgBxo1FjRY5CB1LpLxEjRSkY9CBNS2Dfpl69BuhxVtiLlOBNsl22N9tUH0iPTEXk6TAQLd4Vb7QtJ8CCyPAtkpYnKU5QcfIO0Bcvp3MjVk52MPrRkpqhDzgLNq/58gj0RreavkJSyaecu5m5ingaM2ajsfwmWctlEFTbw7A7cpt15Z1RrVcJLo5T/4M0EFp2moBm1frk6hoO/SHg+ZmmZaSeN0CvbCvOu4VnNuh25cYO5dfRb5bD7aInrtFDRIEFVioUhtHbToaLmNbDxgYKC8jX0WO/lCgsNRyAqBMOVG9YywTcUyCao4ULaOYmT7bGHur1f7MHzT3Hcx7v+f5YDgtl7gIF3c37iMffA16fAhftd84iZA7DCWaR+x6ijSk6EVit7zN4bWFerdddsjBKgaNBH8WGTtsw4GmTfKcQ4lOr6kHuWwzvyJNbUAxVswCW7Kl7ofivxTaQwWtkjD8l6roq19h8uSRl7hqI2NFmLS/Mxuw5m9PNBlo3vptugDd5TAmLgLPkXnnPAHW5GBqe29HdNyEhU1vWTlQJu6TWrfVmeJrgLD7o4ciYSWBNzEJ0CMY19O60jiToNgpa2eBMrM6zgdhA9AdCdyk0sCCEGrNB18vMHFvtY96o/H+sVIVQsAsOoTx5sxOH0A2SJQX0NWZ270aO/huXZgV1r6rJV+iSPSpCAC4cXQ0EfI2bDDSzzWOSWezC2pwi8hfePFC64jC55cf1K03jW/4TH/MRixvP7PzBgDJ9WFTF5wLqV0IL6Rs/SDHnWnsbJ3+k2MGhSaMOncA89PGFNupdNbrk4x5luggzyTcc84zOUmn60WPhUrJZMAZfkkE4tKS1XRLUkHoxR/1WwL+VDZlaseEEFKZLWyNFBuGAscN09RzwicXS0WVW8CGZaAxZ8oMaydUMrZSqZMjVh7rFciLtXlbV2udQvIWE9dLuZVEGazVv+8BwkERKAXlPfl7VKo4Jpave0m0QS3JnRoK9RpQwsDXspauvY7XhvO4HvSwxXI1MFGjZBaqWEJCoEDzioluPgZ59mP+Zcf5AOw8qx+xLBLYVuJimxSmpplLeIcpRAD6GXIgXIpAQ0ZW629iB40UUtegO6jlZZMjEBNfW2h+7tArd5TmsR1GjBW04FHckaxFGn2sd8WOF1DbTN5g0lAkAKy/cGNjvEE1ZWKAKCGgv4IkAnme5huEBC2w9jqVDA6/cxoVNI1PqCHuZXtfmBqsygXhLj977b7lhgSMLm+ZyOl0F6tiopYxNMXhWjy1wCRXMPU7hHtqjeBok3Sb25XahZAuSPqzZ3MYjV4+PJHTejHONP9ch60/4uTU1ZmPSbYxlP3W91KjEOUHl4J79bUda7/K9+Fa84mMZvhiy1EOrsjAANGlQFE4+GAMHNdiLb69Zhc/CH0q2EaU="},{"id":"a6304333-66ad-4b0c-834f-a6a514069e3f","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志API","description":"share-code-logs-api","prompt":"为分享码日志API创建完整的RESTful API文档。记录分享码使用记录查询的HTTP方法、URL模式、请求/响应模式和数据统计功能。包含日志列表查询、日志详情获取、日志筛选和统计分析接口的详细说明。提供时间范围查询、用户筛选和设备类型的过滤条件。文档化日志数据的存储格式、查询优化和大数据量处理方案。包含日志导出、报表生成和趋势分析的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":5,"progress_status":"completed","dependent_files":"backend/src/routes/shareCodeLogs.js,backend/src/models/ShareCodeLog.js","gmt_create":"2026-06-30T14:04:55.156497+08:00","gmt_modified":"2026-06-30T14:32:04.002947+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOUGyGBdIMK4cf0QP9R1E4ivY78WzOdR/wvtMHeKsZOPO0asW2W/MvDKc2jNyZQ+LHngb47F7NF4YJSkCgZxByRVJgj10T4wWac0DckADW5AH88CZpVx4BBCtuW5KRlakkySQXJ0Vhm+mv0KwUrtthQTb+hq/5FeNYbS+kOr5euCqYQ6wwEmLbt10MSZp1WKWdfCf7X9KcgY2Io011J6+JnBsJnbbWDcnhkvMDFUdGk4GwKyEMiedTBkgb+39rNaRYcnJAsprHfzqiWCLqNoVAWgXLhDwpQo+Rj9Bju4u0x7yWdcWAVxIhjtS1HTrpnn7SF1fT+zQ9CwvBC1jdBr6zPv2EEfd9aDeDmF9fusxmxrz6O9t8G8p8DZU+16l6SzrO24RGp0ljE2hnue5SjY7K50OQ+9U35K/w+G/qOjEOt/Xm9AhDSALYcylw0X+3TFn0Dw17GvH6f/i4Rkt7qMYvBGYUby2TfoOMz8t6dGm1c9yflUtfXDVmMEwmVvMHLCRtuD5TyA5dQ/ZMntXUjliHSeS+A6CWlqs3JxRZ1RzMhrWSMPoLaP7KkI0jtFbNfasJ0Og/s0lvoq5QfTYeaB3SPAVOrEJCTUAk1WJBefCXaJLQJWM5BL41nZaNCLL5xFdD7vrcFofJoqf8rJdD76QntawCuPNY82NOq776fFPBqp80R5e0OAsB0SDbQ8ij7hs892TDLCAZD/uQpah7kDXRz3wpPMv5Fvw1Vx5dqBUU1Ft8O6oV36Svb9q7kzHN4uEsXSGmQqxigR/bDvMFj9wUMlwgWUOgeKVG3mvewBOFOO553ePEGez98IygIUSyEQH9u0EEnfXlX8Ctc1L/advVhMuLFfDBj9GSPmfqkcpEekoG2IhmUo15MFwKOmoR6YpBqaOeGU3M+ulhTXCdC/XVY/mQ+Tbruxlx4wSxvEVLqggywoVkMab3NqXnh2yrndnibentA5ka4iDfLNAT2NAPvzDWenmrtjYrZNRTiDoH4ZjahTBysR+ESqmTOnYPQcmU9ilGcP7Kf8y8xEndb3tWlBE=","layer_level":1},{"id":"e1d1f354-edc2-4c91-8d91-63d256dced21","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志模型","description":"share-code-log-model","prompt":"创建ShareCodeLog模型的详细文档,包括分享码生成、使用记录、时间戳、用户信息等字段设计。说明分享码的生成算法和唯一性保证。文档化日志记录的完整流程和数据追踪机制。解释分享码的生命周期管理和过期策略。提供日志查询和统计分析的功能说明。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":5,"progress_status":"completed","dependent_files":"backend/src/models/ShareCodeLog.js","gmt_create":"2026-06-30T14:05:22.625325+08:00","gmt_modified":"2026-06-30T14:32:46.410606+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOUGlhYbZc4czqT8CWfnD/TT0eAt7tg/OAA6mgsocPcmsvG2PVtH5KfyjJ18P9rTMPxOEyjU1Gec605uXe0T2Yc9Mio8lwWTXlLiR9CHDgdmESC5j1t2aKR8fRd/OqASPFvLiR0grE99PCeoM7ob/y5BtcgxZWjzfCnfZNCwnjfkkosGhR45PqgoCyAC2Bvm0kMJCqP4lVPKf04wOTjSbr4eSl32wo9TqavhtHLUKJhoU1BhZbZ6uV7Gmzaq1mQWqsX71L36aDcvYYmopGt7DE2LJksbYCFrrNBgRhFv+N43uZbN5WL7wVhpvK8O4TVwd0FOwp+aZ7iAbUL7tgjCR8xtXJS5q57NTemsro4PJNWVbllR6P5VHcrSDBmtHsa6L1bXDOBei3zTdzkwRq37T3c3mujEECBZ/+Mz/9ujMM0yIhcbbPT/YGEGDAiU/BRLBAOMuV3WWC2MQhqRkoipHvCj8loLpu05az/NRT/cd/X5gfi0y7vJvNz1FLlIiiUEZfQro7D7k5gwTCP6/FBmDYgfPSOCN8xZdyb7gHNanf1+Cqj69JaEgpM8cJM/v7a47fURXAUR+wy+lsKH+YapUusdACBBPvzGrGTJGzBX9gZVLFdPZFt35TATN0bywZa5At1ySd8SIj2B3St+GopTloe/mXlC4w6a5oi4MsUi1aQNJUFynSnhmsvMHTFxp20vLRYRzH2gO2ReFyg+ErSFjXFKLsd7zrW/lMF0PFW90/eb7fGWQwoQT/GJ8bv50VRjO84z4xEz6cvM/y2o4LjMcbv2elQDtp6lJ6TC2Z9jG61tVu","layer_level":1},{"id":"c6207e0a-6059-40f8-a27d-367356363cbf","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志管理","description":"share-code-log-management","prompt":"为分享码日志管理功能创建详细内容,深入解释分享码使用记录追踪、日志查询统计的实现细节。包含来自实际代码库的具体示例,展示日志列表查询、统计分析等功能。文档化分享码日志模型的配置选项、参数和返回值。解释日志记录的触发条件、查询过滤的使用场景。解决常见的日志管理问题如性能优化、数据清理等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":5,"progress_status":"completed","dependent_files":"backend/src/routes/shareCodeLogs.js,backend/src/models/ShareCodeLog.js,frontend/src/views/share-code/log.vue","gmt_create":"2026-06-30T14:05:25.898159+08:00","gmt_modified":"2026-06-30T14:33:14.029388+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOULG3Baig8xCTbO2Ahhfn4705w5gj8ZRYmh46RDQMtCZDcT2ci8E8rsm8C/ie07Z01SjriTUMDr+8A42/BBZb/vivf/I1Ur0WP4FZh/48LAYVnwRQ0GNifiKYZ6r/iL/jguQ3fWxzUE0M/+R6HIELC8yJAbp7rcQIITL2AxtPIlU2pCBK/DCcqQD+ZybcLujwZWxLN3sOZv7I9hqca2d8RAp0ZUgYqh+tSW9DGD0yS9XHY1QrXl7hsXfIgSTvVprJ8RT5HOeKTMeBxcM288vxkz1ghLqaMTAik+OQN0BzR56crsJmaCilWkrOAX9R2xm8hLfGTGTwdwv0P6fYaXu6VwOHBRDHoIHfGrImp4IIqNl/qAQnBVEIF90ZUdARF/K4lVsKi5QByQzHd4xlLllAAhTWwK9S7HsZZ7T9HP6og6LjL0bhFAv7f4lX1gq2+EcdF4EC/sLc6w4D+SdCSFgVU0xdT56IyK2HCqk+Oa3x3yOT6iwe5gfFarTyyXSrSV3RDHIGxTQjw5ZLgrseB4w/uQSPLjoDkZLP8d/jXwMcNr4bqp8w9PxWyrUNViTfQB/UvF0DUtxSE2j6+nUvqGdl8Ix1VA62otvJvJFAikk9gVFtOHg+3qSjX3bq++/RQqakUc0NNE5MChQJYL/ZUX+MsmET7zMf7f8n+x8AWQTkhv433TAIPxZDEO7EVVshX752wWI5rwX+6dwESN5VijNJl/emYmtP7TslKL6O12aJ/nVMD0zmRsBl2iHy0RZkN9eLWDa/pklLR/Oqz4Pm2r2Dd1lh8gU5sHdMMVYjz/g/hdk4KVkvOKz7kAFP0wHLPPzNiplQ18EUANo91+uz1Y5VdeODz9dktzaFqMjD1octmfT4pX5YAT/zhIQc9MsKjbHTAueD6bqZxj3x0qiZ9gh05gFbrskmk5q2ogQ/HzE3E4lrM6f2tYMv8KzXjP7yKEHcMOBJpO9dQZd5i7it8/RiUAHSb7Vti8AKU8Vw+TOV55DcDhFbK5P9y2qvuxqUldoMQK17B9wEx2nncwPjOJP5wXEELVSCNDm9Z29WK5LjvNExjGy7E61ilKE+rLRV8OMZoA5ighPPFXalAtu7mLH9y8P8lhjNfSKFoGWqPz0GeSGHgYiYIJ2uAMIsp8PabUEf93feQ4gaKPupXFYXWZQFV+XZOLHbet0vp6KH5TBD2X2fQHG4FVe4IHTI4T5kGOpx+ZDv3WPjRDrHHl+CCVCwlkaovZU1dGMSoUsss8uXaSH63mv5fUu9tAM01OquwkJLbg==","layer_level":1},{"id":"ff078afb-bb04-4600-b51d-5af48a6a6f06","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"系统用户管理页面","description":"system-users","prompt":"创建系统用户管理页面的详细文档。全面介绍用户权限管理功能,包括用户列表展示、角色分配、权限控制和状态管理。详细说明用户的增删改查操作、密码重置和权限验证机制。记录用户角色的定义、权限矩阵和访问控制策略。解释用户登录日志、活动监控和安全审计功能。提供用户管理页面的批量操作、搜索过滤和数据导出的实现方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":5,"progress_status":"completed","dependent_files":"frontend/src/views/system/users/index.vue,frontend/src/api/user.js","gmt_create":"2026-06-30T14:05:55.603342+08:00","gmt_modified":"2026-06-30T14:39:03.429018+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjBvJUaTQCtYwqrk1rWKWMXJ2ByhuPeDEe4J4aaVwd0GgkvyTIoPxLy0LzUPY8r27d/l3kXaZv/WIKLhXGNj4yqu/L9TGNhQd7PzwpK1IySbUybplyf6amFlUaZuCaMERjNdevMyzFYtpxg6ayafgmP7QZecNCYUUM3UDhFO+jU77Y3eONzUMc7vXH/eCT/Dc8cixl5LBJezboIymPfUKgJeIdetGX7IbiD8pL9tqiP3VV20ENuC361bvx5BHKgEgEz8r0ZRf+9GIa42eaVqFk9oS/OowsTalFP/WZp8IvsoQDgbxWtLfVja9CdwkAVvNFFoL92QsKVmMWwH4lC52GOFGmDtwWsWbsAQ7SC3FGCM9JqnaqrBk9L4OpLg7pbEGasp9n9YM4uL0i51ofbrskfLA7c5Ic8YWcfSq+YpP2Jfq2SfzWhkv6/69JsVm+ZeGECDYz/0BGLtJxuOHkE/X64/lMwm31m7RCbzrAT8s4fv70FYcrJ/e8ZTbBJJZ3nT1xOeu7NNolSYaUNRMKjj1f5XkM/bMio6syjKv3/sgDYeom2Z7KNC6qSiTtHSnUhR42TA/gepnPqFc654KQYnEbgtAxassS1rRCPSzZImnQue+Fm/xTdC7aQoeH7W9EGQhx9d/VKgE3DtmwgFfod4b9BL2E8Y+tjinaohB3LFSs0ywB30qKQeXZ0P5O00PShkYvMrnbrMgSYl9v1ikd2ca0x7UQMeS/9tanT+Nifwq7peDxs+vuwD8itOpOhe9lmEGyaunK3mOmMNU2qUP/IsFh7AG+0RI+ia2YOGLXRp/DAbZQOeiJotMpzzCetWsU2C7tkh4up/34yJu+PlIernbNrohRmq012Vk43bJsJuE/ozXHeWh2abw++XRn0rdJUXv4oHuxv/x/ou4BNRGgqxxLsK2sH44gu1qYF38dnjvjwos07VT3aeLuJQHfsrl3acgM+AniQul0Xzht3gFgcf88x++sScG3dMcqdCzRdr2YrFR","layer_level":2},{"id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"核心功能模块","description":"core-features","prompt":"为核心功能模块创建详细内容,深入解释实现细节、调用关系、接口、领域模型和使用模式。包含来自实际代码库的具体示例。文档化配置选项、参数和返回值。解释与其他组件的关系。解决常见问题及其解决方案。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。详细说明用户认证系统、品牌管理、型号管理、OTA固件管理、用户权限管理和分享码日志管理等核心功能的实现原理和使用方法。","order":6,"progress_status":"completed","dependent_files":"backend/src/middleware/auth.js,backend/src/services/userBootstrap.js,backend/src/validators/brand.js,backend/src/validators/model.js,backend/src/validators/ota.js,backend/src/utils/jwt.js,backend/src/utils/password.js","gmt_create":"2026-06-30T14:04:20.638906+08:00","gmt_modified":"2026-06-30T14:13:04.758812+08:00","raw_data":"WikiEncrypted:luoNp8LvFa7zGThvIT9T4gfD6KbzJyTAydbcRfVv0b71O04CYqWd+mhwOAKx5JsjRdElm0elYpXWbl1GcuBvfF0k/N/rYqIOGrNDyuFsYrr3vrPVHqwKfwIO8ii5FyJ9G2/CDKYKxfMvL5/eI5LLiI4dLJtQQ/EdXK+jGK6/3zTIZqdWj6UWzEW0mzY+65TLZKIQZsNDvuMmW4V+typo30j85XSOUpwUwj+/2P69d0p3/7KOTGhpxkQJpKwSS+Ou5oR7kyDTwjuBkFTeJYqyV4VYROOqBypa7dwYKe6Knr1LT+azHmTqixb1zXUPJQ6p979figgTjll32+b/GM+0T95z9Ds7J33B5KOsO0LOJ2cNLWiB+C528YQV0AHDkFf1mTE6bKTBGolo1fT4KVvufyT4JAn0aYmpJDe7tiniUE6tbKy3fen2CQn9ieLIOKFMeUBmDsDefoy1030Wnd5JzFcKgRtb87NRHcsiF5I+V+X2E2TlZUoJoBh2+PIAZYkxWcpXMD8Zpcfv17FAZo34dTydLS3wYxVC1tKcqor5qPs+woQNYAnvSCdaK3H0Hd9zIb2V13Yw4TRtaGR93SOAPzmuaylTjsqmJkhkPpPdL9RfBPI0NWsglIj0e7zkEcku4zGa6Hs0rFAUnvrmhf0fWTCe2cSQGsKT/x/At4Bbv1VXx/iJB5IG9L92sH9auvd3zPQzrXgvmZtIf5veeHTENNsFXlRqyHIlznBprPM1GVkTnIUQw7mmC+4Q/6jSl1Fv7xI6EG/1udBu/KeaPO67Hp8A1YNTf1ZspoQoSGsV4deaNlmJgBEN8AIyClPwel1TmRAOmWv+F7NI9qVhpN4XyaOA5Z3wLMRdd1TAxRzRXgbQWvO74iEk524UaIecqPr3oFFsE3HHj52svrYNQ4mHfD37w2y52cOqC/kcS+4oPBgecVMRLNK8zQe6TeyZZHyFxLrnPE3yPqPlVq908l/SlqwcGa2igXYfFHCVeaXwT6cPl+MscEbagyBiX4x1QnH/S6eX2dvxx0XY+44nhTYGW1tTBXetozbFeMqqAtV0XePJizOGsP3Lj2vFRJAHZ0N4cgNkiQhJ3KlyCoakiATQXJ/Ff/3M4frqDjOKNgpcGoZJVi8mS1gxHRzr2RdQoq+7KSMhmyGjVSrCbNN1TYIcbahutqBg+nR3vJ99qFoP53jpWwT8PrBP9LqIgRxcpoRf37MTX5j/d86fQw49ZGESGNenE5At8gBSjU2xnAIjZ+F33NfP8+Gz0UQ55JvwG8CjDXbe2noRsLFhkX2mEpZZURkUCUwgViZJht+EkhmoJGdb20nl7nQcUCRyeyH6+kS2RDlqP0MbMuZC3N8E2Cb6QEXiCy8cJTjg8OWpIOvFGO7W1FPwPDXlYJsM09Oo/VhFPx5ImU84OMMy2ku3T1pdBwi8FjXr1WPwwNmRTK4aqj4wrLgLiW5u7UXyrUQBDbS8o3sc5W2z0P8oFWcBaUYRtKmdryx/ogHWLuINkyfSUHAgkWx/keTw6SlEAPYdQGXbal3G4vO3aEnA4oCPhflkrg=="},{"id":"7272429b-c7fb-4bd8-9bd1-0093025d68b4","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"仪表板API","description":"dashboard-api","prompt":"为仪表板API创建详细的RESTful API文档。记录系统统计数据查询的HTTP方法、URL模式、请求/响应模式和数据聚合功能。包含品牌数量统计、型号分布情况、OTA更新状态和用户活跃度等指标的查询接口。提供数据聚合查询、时间序列分析和图表数据格式的实现指南。文档化缓存策略、性能优化和实时数据更新机制。包含自定义统计维度和数据导出功能的使用示例。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":6,"progress_status":"completed","dependent_files":"backend/src/routes/dashboard.js","gmt_create":"2026-06-30T14:04:55.156596+08:00","gmt_modified":"2026-06-30T14:34:26.686007+08:00","raw_data":"WikiEncrypted:rL6JaAWnwczCsZW+uBgt2MaU2Sf5hn65RLINj/MhHZqs/HaL1M/vKzdpRke4FGDeaqlgIkX0Vsq6pgMDhS1PLtsNQBQbbup3R7hfDCWHR7czvQfTQrqQOghuXOCS5RshiZIhSV5UutgR3IhtdYwYuC1cGrxnqubBTLaiNlwSkSCBwNnKv5wnHnP/kSTtGschyyeMxsR0xgLm93y19LUJxzQ35x+o+JHgNt7L1clDn1f2Q/ndGER8N5G6D30Ca4ktQc/XzBkD73s6Y6ATaZU4fF9lJjkb7Xouo6VBeWM/AWnZDx7lOLLIfGHZwEixsbqfV3DPFQnQ5ouP8ITf9zPIvOLqXdiBK/eE4w9o+KnoarDckNX5GdOib9xHogvsjnppRV6HPQAkLwj79jVPVWMDFLLrOA7s4nnSkQ2unS6yWJOH41xes7IM36ZsyWIWGoF/ZfncMR2vb1d6KRd6jKE7U1rWCkhwBMRCtJWteXsXljdFTmntEBDtsnylR8gDBvxw3yX85/iRQE3fgUnx1bzG1Csq7hyeTpYLzKCJGgsoGmXQcuPQy3kvG53RM8x3PLEYSYlDCNn77yDInY9vGLH3AEhP8HfRR/ZpbZtEbTEenKBq3Lpp9JNVMypx8WTiGDNr7Uox6UrnQJn77vaDePXLU9RL2zqzb/ft4ghSWgWkGdxcVZuueg+R6jh5VidCS/2lM4RB6CLZx8B4fjDo0lPC5qjbZfKjw3oBNOXus90NdOMlDs9sK5B5bdAy+xI12Ku3TaX9pvbhun/UkHYHxw/izxoU5pEPmr5H4iOsOOjz723tH+aqaoOA3SfDR3E9vWvd1I8qWQrmf409xaZfuoDpga88y+qC2speLpfqP5XDm76K0m5hvzZI5F54vflZN5TXb6GFYN7/9nNbsPZ4oBgYfPy3GhtEe/eoit9VkApe/PFsqnJ/5EEdU8SvT1wjGsczIvpTY4dSR5q8YpQL6lNH2Q==","layer_level":1},{"id":"830433a7-7370-479c-aa05-c21ff47b059e","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志页面","description":"share-code-log","prompt":"创建分享码日志页面的详细文档。全面介绍分享码使用记录的查询和分析功能,包括日志列表展示、时间筛选、用户搜索和统计分析。详细说明日志数据的格式化显示、分页加载和实时更新机制。记录分享码的生成规则、有效期管理和使用状态跟踪。解释日志查询的高级功能,包括条件筛选、数据导出和报表生成。提供分享码日志页面的性能优化、数据可视化和用户体验改进方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":6,"progress_status":"completed","dependent_files":"frontend/src/views/share-code/log.vue,frontend/src/api/shareCodeLog.js","gmt_create":"2026-06-30T14:05:55.603485+08:00","gmt_modified":"2026-06-30T14:40:47.220384+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOUKj5ui7aJNjWR2KaITM+ncU6ladAgr1aX4O1zoYG4BKYxYSLSuvZ2LqnWBJ2QqydzLeyBat1iN9bTXVMqMkgeJtkcSlNEEEBOpwdoKxUJii0pBbTaTPljEgvGCJAdvtM6yaGorC0QzbypPecbpVh3DAjgPtWtUIfgnh/GYXu7HMfEOLjMMyQuJypBLnNAvdE2xXmS/QoHf10Z8jKuZHUEbhw3ognUK++ZjIED7IEMXsM2HoDIWWy2lZE539AcsA9nkIOFMRa34TlykOLVIWGhN+H7uZGRqff0XX8Lwt5hNvL1a/3ZPm/zZJtFJRzY1PmfxyaUjEbF7KQMiGdKNAX1ycQenLZ/ynZX1xiEakxuX4S5qxospfzPGG27gDX8bJKL+3QoqYMxU/6AdnQ3DIox9pP4fapR3p3RYlpJRtSqqFEeeU0AUWmUNHPyBCPgHccE+XNZpISolk2Hln2oVX4yMeI9psNaMz1DpxYj4xlswa92pmvtFEAcryIpMdytbdeAPC2p6O1fyHRkNXdSzu513mdblf+dxvTQs9AEKnzH5IISdpT3oqa0TxsQIonzIXjfyPDQ23xC74ZjI+olJBdCnklVb77alqfTKijeVHqhz8E/oBRslPIuRrBTmbr4MUfnnGv4ABxmqo/MJdG1aSWK+VLXi2S9P5Yi5E/Wwu8H8cYl86z0TdwDM5Hl0l+X0abPVyDJOcHyVvz80tpUlxcC6G9Xz4/vjCq0xfqYtDV4NM2ClDyMsuxq67I9S6UOCBAZbHH5N3WOzgPrZNyfbeFUpydMKmMOgBh5GjkQ3Pz2D+83z+wBDSk8PV0mzk0Re6AqwtuTJtZLBFtavN7E0GJp1Bq+B9fOhkW73CxJvwqIx6freEb2JUkKP8CUVULlLyar8uKaRA6QH9uFiT1SJZkH1fc9CMBH3H/RzAhtB21FP4KFAVk/ha2CsflO9bdZVM3OkChSKQ3qPNzib6+R66ZevkbT7skK19HcLJO3Rr1NOP9tTy0Hy9THr5msllCLl7NDMQi1yiK5GSaztoHJr7ZWuX4FV7iAHww5fyqzLeaVFXK","layer_level":2},{"id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"部署与运维","description":"deployment-operations","prompt":"创建部署与运维文档,详细说明Docker容器化部署、环境配置和生产部署流程。包含容器编排配置、服务依赖关系和网络设置。提供部署脚本的使用说明和自动化部署流程。文档化环境变量配置、数据库连接设置和缓存配置。包含监控指标、日志管理和性能调优建议。提供故障排除指南、备份恢复策略和灾难恢复计划。说明CI/CD流程、版本发布和回滚策略。包含安全配置、防火墙设置和访问控制。","order":7,"progress_status":"completed","dependent_files":"backend/Dockerfile,frontend/Dockerfile,scripts/upload.sh,backend/restart.sh,backend/stop.sh,DEPLOY.md","gmt_create":"2026-06-30T14:04:20.639263+08:00","gmt_modified":"2026-06-30T14:12:37.808551+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w2XbjO+yyEmY3ONOjrL5GjA8+3c0QEcD9OcCVHu+1BW/N5NkoQV86wegqQ9ShX8iSQ2xYIaslcmoc/Kv5OAnUwWV3nuAw37SIDSnlfEVjxgdWIfKDpMe9ANqqSg43yyyS0j6a1ZNPv/lWSKJTBIXQlfQxEh97cKf/j/LT7ms4fDbTvmHrdkW/jEQefQD7MAtQ00jFlMbUkoCaGNftGOahpB8DxiKjvXF2XHkIBSB+ljy8IAN480duozYW3EHkn9BG5DRSK26AvZUAJe48qfnGYdQfTAGEglE/1Hn6EV/Nm/Lb8UvgmdnuBaKTUiZRNooEwAeDN9FVwpQ7worjnl8Wzo8Ngbl2o07Zf9fN+KcjkIURxsPmfGu9sD6V9l1RLWZ6dtbz4WoDiQPm5pDkI0VaVo0KZrYJVqQnyYHiGLgYtwhQ7nukY+LoRhX7Hvp89YdV9IhrLTE1jsDAeCRw579FnnAzgvBLN6zixDwRCyr3c/VerMICukg17xUZBvIhgXPW2oB8aKCvEWd1DoVOOwTTeSRGaBc3YL768bwg/fgb5nMcpkKKEG8oFTiD0WQgV1WrAWmdgqLUic6njl7DH/nPwtU4kvstO6ylEWrBJh8WjjnuFdwsNYNFOXm0yLRUDPlwltGbjmmrB5+TUJes5jh7PSvyD1XFtM0grPtQpYdIM5GZtNYa172rLsqEbW9ZLMORo0XYf0lxg0pNCmBI7/OgcsUnosbnfqoLleFwHsBwIR6IWox1cSj2a8ZP2DdIF1EkS1STU4kcntPhJg/MU6IAHZByl9NaNnPAT9fbjHNYrjgvAocunW1h/GGjsi8yIsr/MYBKQRMHt0Ebx6FyjCoTdVyEZBmj1Ln8n53VqlQUaTLOTlY/+PLW72ayeVV1dbw6nODIElixkXST6BfiyyzGX4NcPjHvrMEj0x7iuPn5XqyNW9cCnIYaLK1POgQXVHvC78pjRvPdQcV2ofQwNXhiUd3OqejjZKYOiXsozbPI2ZmCy/R1XmqKiDotFyd9coZZagRFDm+CP5hAAYjGnqmUIWlnx031QhinbQ19YgTQyPe91UfMnBMYE4piy3j0ar6hKLZHqUrpDdEZc5IhsPiIpVEuUWChMcy/y5JR+jvcKVuXqaFmjA9MVUhyp8t4AslTb+B3O4g1WLlMBmUN1HYwc9S1io68uObIzwvIOg0IF1WiR4jj+F6m4Pqw+Zd+Bvs8HEJ0br7bBtr39YNX1ya0Us="},{"id":"0545bd33-f65c-4e1f-b2cb-04bea825925d","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"开发指南","description":"development-guide","prompt":"创建开发指南,提供代码规范、开发流程和测试策略。包含项目结构说明、命名约定和编码标准。文档化开发环境配置、调试技巧和性能优化方法。提供Git工作流程、分支策略和代码审查指南。包含单元测试、集成测试和端到端测试的实施方法。说明依赖管理、版本控制和发布流程。提供常见开发问题的解决方案和最佳实践。包含团队协作规范和文档维护指南。","order":8,"progress_status":"completed","dependent_files":"frontend/vite.config.js,backend/src/config/env.js,backend/src/config/loadEnv.js,.gitignore,frontend/package.json,backend/package.json","gmt_create":"2026-06-30T14:04:20.639515+08:00","gmt_modified":"2026-06-30T14:13:05.375027+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9C/ucQxiwh0okVA48AmODs5RKNS8ZgNngqmnHSFcG/1UaJxx+3dUn+EkMTpYUsOg40oH68Nx1IqebKqiC8fCVx8Z5dT3AgUInNoQcVloeb4yQhs1Oufr9wTZo7fZfd2EizXXbLOV05/YLO/Bja3sQV4rbFZH21TOR2bzMC4+Bvh1azFozPC/ma5QkwfbGmawutVaO402XGO+5xnrsGCsVAQr2M8O409R1wh77/5lzca6ZD0OFo1iagqoMSEXyVx6XsW38aoy3TPa93+p8MSYGEXZKUGuo0U8H/GetcXMJ21wi60fPOQhiVg9ePRXxG8wnT9Q0YxxUIb7JWiGkDgtE0n5qcCo7xcA3FzYOZ2CH4OR+2LjRjmTWUU2SbXJ9jXKWnXP8HREN4oERnOXLRcGVAA7zHN3BIkCz7pscIxGQ+sNh+xZdhrgSBP4BqoZEnRQQlyDrqA29kJpJXZs60se4zqy3SRe8xpB8DiB6puJqsECj+osTyJFPENV14Gb/ixpNzHho1UY3Ohpt+Eabp6RG572PwSRkBaegUf5Y5MXeueFRfD4XghD+p9yS8u6aohyV378+hS80kvZnTWd2eiveVL7Q90v5DiOSQLApGbIV2G44IxEw2uIKsuWvffHT8JHO2RxJkitMMfOC+OSLMwph76bCPS+0hYM8kFgEl4xFyTGggt/JE3njsBxW49xeYZfnUYUDndPRxIWDFVT2WqUKup7aZQ4gUFcycaEH97G5lD1JgGQVGN5jGL2XjksL8EL2WrkZkj7Mkwlo03MFQYETI/wPTEqUdcsgFdXOCGMw34z5Pz2VlnNXn3faJcb/EmO700V9FtLl4sedrhQFfq8oyBIwwycQNtQGBdx2pfCJhjeLMKSeQ+BYoUxddVIpPoBdo0d4G4rrlK2BREXPCuyeH4dmB3rCPyTcWheDZtVLdid/MJwCujHV9jJVj3W5UTW5+pwkcBenKNyb/A0yYUqFDaylhA4Ff6dgxMUqeZiNfxGXORFKuNgQwd/4941XXqA/U0pX1uyPm8Z+ydGBmtScMw2cLtmWLFtUYA04OsqUWVaaX63Dvyr0OuohK8gSIX2m89KrHPV5hcCaH32WycKCi3zgSG+RfFLX9+I+LG0YQ2dcyRU5VVK4h1mkv4MRIqphyEjifJBweXHgmS8nP8kbRuPQfeM++y+1VPvUYwiTlHK48YW/H0Q/FLkXfQA6l3gVZA2jHJ5zPTJcbfY+3fRJr2g="}],"wiki_items":[{"catalog_id":"de69fb0c-330e-4831-813d-94fb958688da","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"817d80e4-81ba-4f8a-b0e2-85e99d8a73ef","gmt_create":"2026-06-30T14:07:37.609842+08:00","gmt_modified":"2026-06-30T14:07:37.615532+08:00"},{"catalog_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","title":"系统架构","description":"architecture-design","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","gmt_create":"2026-06-30T14:08:09.125669+08:00","gmt_modified":"2026-06-30T14:08:09.130252+08:00"},{"catalog_id":"dd61923f-65f8-4e98-85f4-0e0a0a649a27","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"190d3cad-a28e-4cf2-a8c7-64d953415cca","gmt_create":"2026-06-30T14:09:11.170718+08:00","gmt_modified":"2026-06-30T14:09:11.17433+08:00"},{"catalog_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","title":"后端API文档","description":"backend-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"1f4b6f57-25c5-444e-a943-d162d896dc21","gmt_create":"2026-06-30T14:10:41.226897+08:00","gmt_modified":"2026-06-30T14:10:41.230722+08:00"},{"catalog_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","title":"数据库设计","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","gmt_create":"2026-06-30T14:10:45.945099+08:00","gmt_modified":"2026-06-30T14:10:45.95039+08:00"},{"catalog_id":"aa2583bf-2c6e-4792-b794-1563db547d08","title":"前端组件","description":"frontend-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ed153077-3827-4586-8838-812707189c14","gmt_create":"2026-06-30T14:11:17.426266+08:00","gmt_modified":"2026-06-30T14:11:17.430273+08:00"},{"catalog_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","title":"部署与运维","description":"deployment-operations","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","gmt_create":"2026-06-30T14:12:37.804986+08:00","gmt_modified":"2026-06-30T14:12:37.808728+08:00"},{"catalog_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","title":"核心功能模块","description":"core-features","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","gmt_create":"2026-06-30T14:13:04.754131+08:00","gmt_modified":"2026-06-30T14:13:04.758965+08:00"},{"catalog_id":"0545bd33-f65c-4e1f-b2cb-04bea825925d","title":"开发指南","description":"development-guide","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"d7d400d2-aa83-47a2-b61a-55a62369b426","gmt_create":"2026-06-30T14:13:05.373036+08:00","gmt_modified":"2026-06-30T14:13:05.375096+08:00"},{"catalog_id":"bcc45977-c058-4033-b0b1-9fd4cd7f4443","title":"前端架构","description":"frontend-architecture","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"6b28e060-0be3-411e-8a94-3777d165d10e","gmt_create":"2026-06-30T14:14:52.873609+08:00","gmt_modified":"2026-06-30T14:14:52.878043+08:00"},{"catalog_id":"0f657e8b-77cb-4604-81cd-d3e921d28e21","title":"布局组件","description":"layout-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b6857b45-a960-4168-92dd-1edcf6567e47","gmt_create":"2026-06-30T14:15:24.293181+08:00","gmt_modified":"2026-06-30T14:15:24.2965+08:00"},{"catalog_id":"d34906db-4455-4481-9512-b29115655378","title":"认证系统API","description":"auth-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"7f894188-cf72-40a2-af95-f13ef3dd1f6e","gmt_create":"2026-06-30T14:15:47.975759+08:00","gmt_modified":"2026-06-30T14:15:47.98224+08:00"},{"catalog_id":"7f36202b-af69-4fc0-b62b-a57e415deb69","title":"部署指南","description":"deployment-guide","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"5ab55e3b-04bc-4e92-93f7-52bec7ad8dde","gmt_create":"2026-06-30T14:16:33.823992+08:00","gmt_modified":"2026-06-30T14:16:33.828188+08:00"},{"catalog_id":"1af0f0e8-0c53-41d7-a894-47d9cc19d4f9","title":"用户认证系统","description":"authentication-system","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"772c69b5-886e-48f6-bd11-faf8ca2155e8","gmt_create":"2026-06-30T14:17:38.562007+08:00","gmt_modified":"2026-06-30T14:17:38.563255+08:00"},{"catalog_id":"dbe5d77f-6f4d-476c-88cf-797b80a11a11","title":"实体关系设计","description":"entity-relationships","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"0efcac71-9db4-49c9-a660-690dcb97cd54","gmt_create":"2026-06-30T14:18:01.58459+08:00","gmt_modified":"2026-06-30T14:18:01.58743+08:00"},{"catalog_id":"5a3639b1-98bc-4bc7-a346-91ed56edd2af","title":"后端架构","description":"backend-architecture","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"941d72b1-8daa-4c53-bfeb-9a0b2aa0f43c","gmt_create":"2026-06-30T14:19:05.640846+08:00","gmt_modified":"2026-06-30T14:19:05.643035+08:00"},{"catalog_id":"779d6806-96dc-4c97-8cfb-15a3d7855bd1","title":"品牌管理API","description":"brands-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b66da3f2-6889-45dc-a824-2591d2f5f0f3","gmt_create":"2026-06-30T14:19:07.598117+08:00","gmt_modified":"2026-06-30T14:19:07.600914+08:00"},{"catalog_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","title":"业务组件","description":"business-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"2971fa4f-335a-4294-9668-0967b9047d66","gmt_create":"2026-06-30T14:19:27.851755+08:00","gmt_modified":"2026-06-30T14:19:27.855695+08:00"},{"catalog_id":"f96081f7-f508-41e2-bd45-a5b36a1ea114","title":"环境配置","description":"environment-config","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"62bcda0f-7c78-4109-9649-58bbf9fd68ae","gmt_create":"2026-06-30T14:21:11.821343+08:00","gmt_modified":"2026-06-30T14:21:11.825384+08:00"},{"catalog_id":"1e3d40bc-a833-4f35-891c-9dd96f09a1a3","title":"品牌管理","description":"brand-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"babe3ec0-01cb-43c3-93db-7e59cdccce68","gmt_create":"2026-06-30T14:21:25.618321+08:00","gmt_modified":"2026-06-30T14:21:25.623289+08:00"},{"catalog_id":"92f94141-482e-499c-bbc3-6101e70206ff","title":"品牌模型","description":"brand-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ef11f60f-47aa-41bf-8884-6d51bc9ae8ef","gmt_create":"2026-06-30T14:21:29.093976+08:00","gmt_modified":"2026-06-30T14:21:29.097382+08:00"},{"catalog_id":"94ec54d4-0aa0-4e58-8e63-5ad6ddb6edbe","title":"型号管理API","description":"models-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","gmt_create":"2026-06-30T14:23:05.595716+08:00","gmt_modified":"2026-06-30T14:23:05.599954+08:00"},{"catalog_id":"b47d7f83-5401-4a63-ade2-f087a2f61987","title":"数据流设计","description":"data-flow-design","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"c6f2cb24-ff10-4ae7-87c2-b23b9bbee033","gmt_create":"2026-06-30T14:23:25.129255+08:00","gmt_modified":"2026-06-30T14:23:25.133578+08:00"},{"catalog_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","title":"页面组件","description":"page-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"f0978b42-6f98-470e-922f-22dec2fac24d","gmt_create":"2026-06-30T14:24:27.13852+08:00","gmt_modified":"2026-06-30T14:24:27.143035+08:00"},{"catalog_id":"72a24a80-f221-49da-88a8-83c0f49f4e9d","title":"型号模型","description":"model-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"edd1d813-70d4-49de-9f9e-e3ebf7a68678","gmt_create":"2026-06-30T14:24:50.785915+08:00","gmt_modified":"2026-06-30T14:24:50.78921+08:00"},{"catalog_id":"00a9d595-dc79-4ca4-8264-1c3f4a200a28","title":"监控运维","description":"monitoring-operations","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"86f882d7-9e64-4c38-85e7-4782fd55fed2","gmt_create":"2026-06-30T14:25:08.609638+08:00","gmt_modified":"2026-06-30T14:25:08.61406+08:00"},{"catalog_id":"93c96675-6099-4ed5-8f40-6a47b3050712","title":"型号管理","description":"model-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"8d4422fd-bd93-431d-a97c-70b75f370f82","gmt_create":"2026-06-30T14:26:44.041445+08:00","gmt_modified":"2026-06-30T14:26:44.046413+08:00"},{"catalog_id":"41e8823b-fa7a-4a80-809d-cf21088bdba2","title":"OTA固件API","description":"ota-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"be7e1733-8c9e-4849-99b0-bab40fdf271e","gmt_create":"2026-06-30T14:26:52.74545+08:00","gmt_modified":"2026-06-30T14:26:52.749367+08:00"},{"catalog_id":"6cd96b12-bb94-4748-94a8-9ef9bf21aee0","title":"集成模式","description":"integration-patterns","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"4619dc3e-419f-435b-ba7c-e600e188743a","gmt_create":"2026-06-30T14:27:35.804293+08:00","gmt_modified":"2026-06-30T14:27:35.809224+08:00"},{"catalog_id":"02f97459-8352-4fff-9216-8fcabb128d77","title":"故障排除","description":"troubleshooting-faq","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ff04bd0e-99c4-481c-ac8c-3c1a6cae1fb5","gmt_create":"2026-06-30T14:28:16.984682+08:00","gmt_modified":"2026-06-30T14:28:16.989286+08:00"},{"catalog_id":"92ff3472-40b9-4adf-82b2-faf5a4d4b158","title":"OTA固件模型","description":"ota-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b2376dbd-002b-4469-8e6e-71748e46e7c2","gmt_create":"2026-06-30T14:28:22.047078+08:00","gmt_modified":"2026-06-30T14:28:22.050489+08:00"},{"catalog_id":"6dc54635-13f8-4ae3-b3a7-54c65dea2997","title":"OTA固件管理","description":"ota-firmware-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"da7627b0-17b7-42c7-a029-e357bc889416","gmt_create":"2026-06-30T14:29:32.814324+08:00","gmt_modified":"2026-06-30T18:39:56.546951+08:00"},{"catalog_id":"b4054b83-f0cb-4b7e-9b3d-effc904a5686","title":"用户管理API","description":"users-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"8f464fc9-6537-45fa-a0dd-eacdf742b5a1","gmt_create":"2026-06-30T14:30:22.103174+08:00","gmt_modified":"2026-06-30T14:30:22.110852+08:00"},{"catalog_id":"7a728623-5bd2-48eb-80d9-0f253bc74123","title":"用户模型","description":"user-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b5718a44-f452-496d-83c3-4e89b844c709","gmt_create":"2026-06-30T14:30:58.462691+08:00","gmt_modified":"2026-06-30T14:30:58.467737+08:00"},{"catalog_id":"4d08f4ca-84f9-4f9c-8d9a-0983f78a7005","title":"用户权限管理","description":"user-permission-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"100cbee2-f7a5-4cc9-83a3-900a4aacac7e","gmt_create":"2026-06-30T14:30:59.491588+08:00","gmt_modified":"2026-06-30T14:30:59.497862+08:00"},{"catalog_id":"a6304333-66ad-4b0c-834f-a6a514069e3f","title":"分享码日志API","description":"share-code-logs-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"77bc73e0-8709-4209-96e0-5522f9356b06","gmt_create":"2026-06-30T14:32:03.999307+08:00","gmt_modified":"2026-06-30T14:32:04.003175+08:00"},{"catalog_id":"e1d1f354-edc2-4c91-8d91-63d256dced21","title":"分享码日志模型","description":"share-code-log-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"539729a8-aa4b-40c6-bf3b-ec9f467f7717","gmt_create":"2026-06-30T14:32:46.405942+08:00","gmt_modified":"2026-06-30T14:32:46.410705+08:00"},{"catalog_id":"c6207e0a-6059-40f8-a27d-367356363cbf","title":"分享码日志管理","description":"share-code-log-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"cf1f3ceb-e3b1-4d5c-8353-f0ea4345414c","gmt_create":"2026-06-30T14:33:14.023031+08:00","gmt_modified":"2026-06-30T14:33:14.02952+08:00"},{"catalog_id":"8f0760f5-ef8b-43ef-8fd0-7c6d1f693193","title":"侧边栏Logo组件","description":"sidebar-logo-component","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"0e003133-7d1a-4708-8599-fc71707070d6","gmt_create":"2026-06-30T14:34:09.992825+08:00","gmt_modified":"2026-06-30T14:34:09.99631+08:00"},{"catalog_id":"7272429b-c7fb-4bd8-9bd1-0093025d68b4","title":"仪表板API","description":"dashboard-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"799ec9fc-088e-456c-8f93-72516adac3ac","gmt_create":"2026-06-30T14:34:26.68183+08:00","gmt_modified":"2026-06-30T14:34:26.686097+08:00"},{"catalog_id":"105cfe1d-aeeb-44c1-ac3b-6550f2c7a307","title":"首页仪表板","description":"home-page","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ad988472-7d0b-4076-86c8-f14661c5923d","gmt_create":"2026-06-30T14:35:15.427082+08:00","gmt_modified":"2026-06-30T14:35:15.43438+08:00"},{"catalog_id":"727c25ac-db22-4b34-9486-6fd6946f64f3","title":"标签页视图组件","description":"tabs-view-component","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"4b6d6abc-bfd2-48a5-9c5e-de89f278f887","gmt_create":"2026-06-30T14:35:27.880644+08:00","gmt_modified":"2026-06-30T14:35:27.886677+08:00"},{"catalog_id":"c8151791-2f8d-4e1e-8139-b0cf921ef002","title":"登录页面","description":"login-page","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"7eee30c6-7725-456b-8b43-35b5e4df7e99","gmt_create":"2026-06-30T14:36:20.14068+08:00","gmt_modified":"2026-06-30T14:36:20.14737+08:00"},{"catalog_id":"32dbace3-24e6-4a2d-9f87-83f2ec825b71","title":"密码修改对话框","description":"change-password-dialog","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"5b84c784-85d8-46e0-8972-e7816f6bd687","gmt_create":"2026-06-30T14:36:50.047707+08:00","gmt_modified":"2026-06-30T14:36:50.062351+08:00"},{"catalog_id":"af7f747a-9be6-41c3-b091-4ee5901d8cc7","title":"品牌管理页面","description":"brand-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"791c01a2-dea1-407b-948d-3e2da8cbebed","gmt_create":"2026-06-30T14:37:33.758372+08:00","gmt_modified":"2026-06-30T14:37:33.76504+08:00"},{"catalog_id":"748c8db9-9197-4c3b-ae1d-a6e51d058342","title":"型号管理页面","description":"model-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","gmt_create":"2026-06-30T14:38:54.071337+08:00","gmt_modified":"2026-06-30T14:38:54.075977+08:00"},{"catalog_id":"ff078afb-bb04-4600-b51d-5af48a6a6f06","title":"系统用户管理页面","description":"system-users","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"6003d293-f2aa-4c49-817a-c7fa652890ed","gmt_create":"2026-06-30T14:39:03.424765+08:00","gmt_modified":"2026-06-30T14:39:03.42914+08:00"},{"catalog_id":"f23cd2ae-fcf4-445f-b8e9-b3382f277ae0","title":"OTA固件管理页面","description":"ota-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","gmt_create":"2026-06-30T14:40:01.702004+08:00","gmt_modified":"2026-06-30T18:39:29.639208+08:00"},{"catalog_id":"830433a7-7370-479c-aa05-c21ff47b059e","title":"分享码日志页面","description":"share-code-log","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"73336201-a22f-4329-afc6-40fb5f00f4f1","gmt_create":"2026-06-30T14:40:47.216934+08:00","gmt_modified":"2026-06-30T14:40:47.220483+08:00"}],"wiki_overview":{"content":"\u003cblog\u003e\n\n# 耳机品牌与型号管理平台项目概述\n\n## 1. 项目介绍\n\n### 项目目的\n这是一个基于Vue 3 + Express的耳机品牌与型号管理平台,旨在为音频设备制造商和经销商提供完整的品牌、型号、OTA固件更新以及用户权限管理功能。\n\n### 核心目标\n- 提供统一的品牌和型号数据管理界面\n- 支持OTA固件升级管理和版本控制\n- 实现多用户权限体系和访问控制\n- 提供分享码日志追踪功能\n- 构建现代化的前后端分离架构\n\n### 目标用户\n- 音频设备厂商管理员\n- 技术支持人员\n- 系统维护人员\n\n## 2. 技术架构\n\n### 整体架构设计\n\n```mermaid\ngraph TB\n subgraph \"前端层 (Frontend)\"\n FE_Vue[Vue 3 应用]\n FE_Router[Vue Router]\n FE_API[API 请求封装]\n FE_Components[组件库]\n end\n \n subgraph \"后端层 (Backend)\"\n BE_Express[Express 框架]\n BE_Routes[路由模块]\n BE_Middleware[中间件]\n BE_Services[业务服务]\n end\n \n subgraph \"数据层 (Data Layer)\"\n DB_MySQL[MySQL 数据库]\n DB_Sequelize[Sequelize ORM]\n Cache_Redis[Redis 缓存]\n end\n \n subgraph \"基础设施\"\n Docker[Docker 容器化]\n Nginx[Nginx 反向代理]\n Env[环境配置]\n end\n \n FE_Vue --\u003e FE_Router\n FE_Vue --\u003e FE_API\n FE_API --\u003e BE_Express\n BE_Express --\u003e BE_Routes\n BE_Express --\u003e BE_Middleware\n BE_Routes --\u003e BE_Services\n BE_Services --\u003e DB_Sequelize\n DB_Sequelize --\u003e DB_MySQL\n BE_Services --\u003e Cache_Redis\n BE_Express --\u003e Nginx\n Nginx --\u003e FE_Vue\n Docker --\u003e BE_Express\n Docker --\u003e FE_Vue\n```\n\n### 核心设计模式\n- **MVC架构**: 后端采用经典的模型-视图-控制器模式\n- **分层架构**: 清晰的业务逻辑分层,便于维护和扩展\n- **中间件模式**: 统一的请求处理流程\n- **依赖注入**: 通过模块化设计实现松耦合\n\n## 3. 关键实现\n\n### 主要入口点\n\n#### 后端入口\n- **入口文件**: `backend/src/app.js` - 应用程序主入口,配置中间件、路由和数据库连接\n- **配置文件**: `backend/src/config/database.js` - 数据库连接配置,支持环境变量\n- **路由聚合**: `backend/src/routes/index.js` - 所有路由模块的统一导入和导出\n\n#### 前端入口 \n- **应用入口**: `frontend/src/main.js` - Vue应用初始化,配置Element Plus和路由\n- **应用根组件**: `frontend/src/App.vue` - 根组件模板\n- **路由配置**: `frontend/src/router/index.js` - 路由定义和导航守卫\n\n### 核心模块\n\n#### 数据模型 (Models)\n```mermaid\nerDiagram\n BRAND ||--o{ MODEL : \"包含\"\n MODEL ||--o{ OTA : \"支持\"\n BRAND ||--|| DASHBOARD_USER : \"管理\"\n \n BRAND {\n int id PK\n string name\n }\n \n MODEL {\n int id PK\n int brand_id FK\n string name\n string description\n }\n \n OTA {\n int id PK\n int model_id FK\n string version\n string file_path\n datetime create_time\n }\n \n DASHBOARD_USER {\n int id PK\n string username\n string password_hash\n boolean is_super_admin\n int status\n }\n```\n\n#### API 路由结构\n```mermaid\ngraph TD\n Auth[认证路由] --\u003e Login[用户登录]\n Auth --\u003e Profile[用户信息]\n Auth --\u003e Password[修改密码]\n \n Brands[品牌路由] --\u003e BrandList[品牌列表]\n Brands --\u003e BrandCRUD[品牌增删改查]\n \n Models[型号路由] --\u003e ModelList[型号列表]\n Models --\u003e ModelCRUD[型号增删改查]\n \n OTA[OTA路由] --\u003e OTAList[OTA列表]\n OTA --\u003e OTACRUD[OTA增删改查]\n \n Users[用户路由] --\u003e UserList[用户列表]\n Users --\u003e UserCRUD[用户增删改查]\n \n Dashboard[仪表板路由] --\u003e Stats[统计信息]\n Dashboard --\u003e Reports[报表生成]\n```\n\n### 配置管理\n\n#### 环境配置\n- **Docker Compose**: `docker-compose.yml` - 容器化部署配置,包含前后端服务和网络设置\n- **开发配置**: `frontend/vite.config.js` - Vite构建工具配置,支持代理和别名\n- **包管理**: 使用pnpm作为包管理器,支持工作空间\n\n#### 数据库配置\n- **ORM配置**: `backend/src/config/database.js` - Sequelize ORM配置\n- **Redis缓存**: `backend/src/config/redis.js` - Redis连接配置\n- **日志系统**: `backend/src/config/logger.js` - Winston日志配置\n\n### 外部依赖\n\n#### 后端依赖\n```mermaid\ngraph LR\n Express[Express 4.21] --\u003e Middleware[中间件生态]\n Sequelize[Sequelize 6.37] --\u003e MySQL[MySQL2 3.11]\n JWT[jsonwebtoken 9.0] --\u003e Auth[认证系统]\n Axios[Axios 1.7] --\u003e HTTP[HTTP客户端]\n Zod[3.23] --\u003e Validation[数据验证]\n AWS[aws-sdk 3.650] --\u003e S3[对象存储]\n Redis[ioredis 5.6] --\u003e Cache[缓存系统]\n```\n\n#### 前端依赖\n```mermaid\ngraph LR\n Vue[Vu3 3.3.4] --\u003e Composition[组合式API]\n Router[Vue Router 4.2.4] --\u003e Navigation[路由导航]\n ElementPlus[Element Plus 2.3.14] --\u003e UI[UI组件库]\n Axios[Axios 1.5.0] --\u003e HTTP[HTTP通信]\n Icons[图标库] --\u003e Components[图标组件]\n```\n\n### 集成点\n\n#### API 接口设计\n```mermaid\nsequenceDiagram\n participant Client as 前端客户端\n participant Auth as 认证接口\n participant User as 用户接口\n participant Data as 数据接口\n \n Client-\u003e\u003e+Auth: POST /api/auth/login\n Auth--\u003e\u003e-Client: 返回JWT令牌\n \n Client-\u003e\u003e+User: GET /api/auth/me\n User--\u003e\u003e-Client: 返回用户信息\n \n Client-\u003e\u003e+Data: GET /api/brands\n Data--\u003e\u003e-Client: 返回品牌数据\n \n Client-\u003e\u003e+Data: POST /api/models\n Data--\u003e\u003e-Client: 返回创建结果\n```\n\n## 4. 核心功能\n\n### 功能概览\n\n#### 用户认证系统\n- **登录认证**: 基于JWT的无状态认证\n- **权限控制**: 支持超级管理员和普通用户的权限区分\n- **密码安全**: 密码哈希存储和验证\n\n#### 品牌管理系统\n- **品牌维护**: 品牌的增删改查操作\n- **品牌关联**: 与型号的多对一关系管理\n- **数据验证**: 基于Zod的输入验证\n\n#### 型号管理功能\n- **型号列表**: 支持分页和搜索\n- **型号详情**: 包含详细的技术规格\n- **OTA关联**: 与固件更新的关联管理\n\n#### OTA固件管理\n- **版本控制**: 固件版本管理和发布\n- **文件上传**: 支持固件文件的上传和存储\n- **更新推送**: 向设备推送固件更新\n\n### 功能架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 未登录\n 未登录 --\u003e 登录中: 用户输入凭据\n 登录中 --\u003e 已登录: 认证成功\n 登录中 --\u003e 未登录: 认证失败\n \n 已登录 --\u003e 品牌管理: 管理员权限\n 已登录 --\u003e 型号管理: 普通用户权限\n 已登录 --\u003e OTA管理: 技术支持权限\n \n 品牌管理 --\u003e 数据库操作: CRUD操作\n 型号管理 --\u003e 数据库操作: CRUD操作\n OTA管理 --\u003e 文件上传: 固件上传\n \n 已登录 --\u003e 修改密码: 用户操作\n 修改密码 --\u003e 已登录: 更新成功\n \n 已登录 --\u003e 退出登录: 用户操作\n 退出登录 --\u003e 未登录: 清除会话\n```\n\n### 实现亮点\n\n#### 响应式设计\n- **组件化开发**: 基于Vue 3 Composition API的组件化架构\n- **状态管理**: 结合Vue Router实现的单页应用体验\n- **主题系统**: 支持暗色主题切换\n\n#### 开发体验\n- **热重载**: Vite提供的快速开发服务器\n- **TypeScript支持**: 良好的类型安全保障\n- **代码分割**: 按需加载优化性能\n\n#### 生产部署\n- **容器化**: Docker支持一键部署\n- **反向代理**: Nginx配置优化静态资源服务\n- **环境隔离**: 支持开发、测试、生产多环境配置\n\n## 5. 总结与建议\n\n### 项目优势\n1. **架构清晰**: 前后端分离,职责明确\n2. **技术栈现代**: Vue 3 + Express + MySQL的成熟技术组合\n3. **可扩展性强**: 模块化设计便于功能扩展\n4. **部署友好**: Docker化部署简化运维\n\n### 改进建议\n1. **增加单元测试**: 补充前端和后端的测试覆盖率\n2. **完善文档**: 添加详细的API文档和开发指南\n3. **监控告警**: 集成应用性能监控和错误追踪\n4. **安全加固**: 增强CSRF防护和API限流机制\n\n### 下一步计划\n1. 实现完整的用户权限管理\n2. 添加数据导入导出功能\n3. 优化移动端适配\n4. 集成自动化测试和CI/CD流水线\n\n---\n\n**Sources:**\n- [README.md](README.md)\n- [backend/package.json](backend/package.json)\n- [frontend/package.json](frontend/package.json)\n- [backend/src/app.js](backend/src/app.js)\n- [backend/src/config/database.js](backend/src/config/database.js)\n- [backend/src/models/index.js](backend/src/models/index.js)\n- [backend/src/routes/index.js](backend/src/routes/index.js)\n- [frontend/src/main.js](frontend/src/main.js)\n- [frontend/src/App.vue](frontend/src/App.vue)\n- [docker-compose.yml](docker-compose.yml)\n- [frontend/vite.config.js](frontend/vite.config.js)\n- [backend/src/models/Brand.js](backend/src/models/Brand.js)\n- [backend/src/routes/auth.js](backend/src/routes/auth.js)\n- [frontend/src/router/index.js](frontend/src/router/index.js)\n- [frontend/src/api/auth.js](frontend/src/api/auth.js)\n\n\u003c/blog\u003e","gmt_create":"2026-06-30T14:01:22.420851+08:00","gmt_modified":"2026-06-30T14:01:22.420851+08:00","id":"f0295b72-1b14-4146-868c-8a0c307045c3","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-06-30T13:59:47.635503+08:00","gmt_modified":"2026-06-30T13:59:47.635503+08:00","id":"60f4194d-74f4-49d9-ae65-220e9f5829cc","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414"},"wiki_repo":{"id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"dashboard","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── .pnpm-store/v11/\\n│ ├── files/\\n│ │ ├── 00/\\n│ │ ├── 01/\\n│ │ ├── 02/\\n│ │ ├── 03/\\n│ │ ├── 04/\\n│ │ ├── 05/\\n│ │ ├── 06/\\n│ │ ├── 07/\\n│ │ ├── 08/\\n│ │ ├── 09/\\n│ │ ├── 0a/\\n│ │ ├── 0b/\\n│ │ ├── 0c/\\n│ │ ├── 0d/\\n│ │ ├── 0e/\\n│ │ ├── 0f/\\n│ │ ├── 10/\\n│ │ ├── 11/\\n│ │ ├── 12/\\n│ │ ├── 13/\\n│ │ ├── 14/\\n│ │ ├── 15/\\n│ │ ├── 16/\\n│ │ ├── 17/\\n│ │ ├── 18/\\n│ │ ├── 19/\\n│ │ ├── 1a/\\n│ │ ├── 1b/\\n│ │ ├── 1c/\\n│ │ ├── 1d/\\n│ │ ├── 1e/\\n│ │ ├── 1f/\\n│ │ ├── 20/\\n│ │ ├── 21/\\n│ │ ├── 22/\\n│ │ ├── 23/\\n│ │ ├── 24/\\n│ │ ├── 25/\\n│ │ ├── 26/\\n│ │ ├── 27/\\n│ │ ├── 28/\\n│ │ ├── 29/\\n│ │ ├── 2a/\\n│ │ ├── 2b/\\n│ │ ├── 2c/\\n│ │ ├── 2d/\\n│ │ ├── 2e/\\n│ │ ├── 2f/\\n│ │ ├── 30/\\n│ │ ├── 31/\\n│ │ ├── 32/\\n│ │ ├── 33/\\n│ │ ├── 34/\\n│ │ ├── 35/\\n│ │ ├── 36/\\n│ │ ├── 37/\\n│ │ ├── 38/\\n│ │ ├── 39/\\n│ │ ├── 3a/\\n│ │ ├── 3b/\\n│ │ ├── 3c/\\n│ │ ├── 3d/\\n│ │ ├── 3e/\\n│ │ ├── 3f/\\n│ │ ├── 40/\\n│ │ ├── 41/\\n│ │ ├── 42/\\n│ │ ├── 43/\\n│ │ ├── 44/\\n│ │ ├── 45/\\n│ │ ├── 46/\\n│ │ ├── 47/\\n│ │ ├── 48/\\n│ │ ├── 49/\\n│ │ ├── 4a/\\n│ │ ├── 4b/\\n│ │ ├── 4c/\\n│ │ ├── 4d/\\n│ │ ├── 4e/\\n│ │ ├── 4f/\\n│ │ ├── 50/\\n│ │ ├── 51/\\n│ │ ├── 52/\\n│ │ ├── 53/\\n│ │ ├── 54/\\n│ │ ├── 55/\\n│ │ ├── 56/\\n│ │ ├── 57/\\n│ │ ├── 58/\\n│ │ ├── 59/\\n│ │ ├── 5a/\\n│ │ ├── 5b/\\n│ │ ├── 5c/\\n│ │ ├── 5d/\\n│ │ ├── 5e/\\n│ │ ├── 5f/\\n│ │ ├── 60/\\n│ │ ├── 61/\\n│ │ ├── 62/\\n│ │ ├── 63/\\n│ │ ├── 64/\\n│ │ ├── 65/\\n│ │ ├── 66/\\n│ │ ├── 67/\\n│ │ ├── 68/\\n│ │ ├── 69/\\n│ │ ├── 6a/\\n│ │ ├── 6b/\\n│ │ ├── 6c/\\n│ │ ├── 6d/\\n│ │ ├── 6e/\\n│ │ ├── 6f/\\n│ │ ├── 70/\\n│ │ ├── 71/\\n│ │ ├── 72/\\n│ │ ├── 73/\\n│ │ ├── 74/\\n│ │ ├── 75/\\n│ │ ├── 76/\\n│ │ ├── 77/\\n│ │ ├── 78/\\n│ │ ├── 79/\\n│ │ ├── 7a/\\n│ │ ├── 7b/\\n│ │ ├── 7c/\\n│ │ ├── 7d/\\n│ │ ├── 7e/\\n│ │ ├── 7f/\\n│ │ ├── 80/\\n│ │ ├── 81/\\n│ │ ├── 82/\\n│ │ ├── 83/\\n│ │ ├── 84/\\n│ │ ├── 85/\\n│ │ ├── 86/\\n│ │ ├── 87/\\n│ │ ├── 88/\\n│ │ ├── 89/\\n│ │ ├── 8a/\\n│ │ ├── 8b/\\n│ │ ├── 8c/\\n│ │ ├── 8d/\\n│ │ ├── 8e/\\n│ │ ├── 8f/\\n│ │ ├── 90/\\n│ │ ├── 91/\\n│ │ ├── 92/\\n│ │ ├── 93/\\n│ │ ├── 94/\\n│ │ ├── 95/\\n│ │ ├── 96/\\n│ │ ├── 97/\\n│ │ ├── 98/\\n│ │ ├── 99/\\n│ │ ├── 9a/\\n│ │ ├── 9b/\\n│ │ ├── 9c/\\n│ │ ├── 9d/\\n│ │ ├── 9e/\\n│ │ ├── 9f/\\n│ │ ├── a0/\\n│ │ ├── a1/\\n│ │ ├── a2/\\n│ │ ├── a3/\\n│ │ ├── a4/\\n│ │ ├── a5/\\n│ │ ├── a6/\\n│ │ ├── a7/\\n│ │ ├── a8/\\n│ │ ├── a9/\\n│ │ ├── aa/\\n│ │ ├── ab/\\n│ │ ├── ac/\\n│ │ ├── ad/\\n│ │ ├── ae/\\n│ │ ├── af/\\n│ │ ├── b0/\\n│ │ ├── b1/\\n│ │ ├── b2/\\n│ │ ├── b3/\\n│ │ ├── b4/\\n│ │ ├── b5/\\n│ │ ├── b6/\\n│ │ ├── b7/\\n│ │ ├── b8/\\n│ │ ├── b9/\\n│ │ ├── ba/\\n│ │ ├── bb/\\n│ │ ├── bc/\\n│ │ ├── bd/\\n│ │ ├── be/\\n│ │ ├── bf/\\n│ │ ├── c0/\\n│ │ ├── c1/\\n│ │ ├── c2/\\n│ │ ├── c3/\\n│ │ ├── c4/\\n│ │ ├── c5/\\n│ │ ├── c6/\\n│ │ ├── c7/\\n│ │ ├── c8/\\n│ │ ├── c9/\\n│ │ ├── ca/\\n│ │ ├── cb/\\n│ │ ├── cc/\\n│ │ ├── cd/\\n│ │ ├── ce/\\n│ │ ├── cf/\\n│ │ ├── d0/\\n│ │ ├── d1/\\n│ │ ├── d2/\\n│ │ ├── d3/\\n│ │ ├── d4/\\n│ │ ├── d5/\\n│ │ ├── d6/\\n│ │ ├── d7/\\n│ │ ├── d8/\\n│ │ ├── d9/\\n│ │ ├── da/\\n│ │ ├── db/\\n│ │ ├── dc/\\n│ │ ├── dd/\\n│ │ ├── de/\\n│ │ ├── df/\\n│ │ ├── e0/\\n│ │ ├── e1/\\n│ │ ├── e2/\\n│ │ ├── e3/\\n│ │ ├── e4/\\n│ │ ├── e5/\\n│ │ ├── e6/\\n│ │ ├── e7/\\n│ │ ├── e8/\\n│ │ ├── e9/\\n│ │ ├── ea/\\n│ │ ├── eb/\\n│ │ ├── ec/\\n│ │ ├── ed/\\n│ │ ├── ee/\\n│ │ ├── ef/\\n│ │ ├── f0/\\n│ │ ├── f1/\\n│ │ ├── f2/\\n│ │ ├── f3/\\n│ │ ├── f4/\\n│ │ ├── f5/\\n│ │ ├── f6/\\n│ │ ├── f7/\\n│ │ ├── f8/\\n│ │ ├── f9/\\n│ │ ├── fa/\\n│ │ ├── fb/\\n│ │ ├── fc/\\n│ │ ├── fd/\\n│ │ ├── fe/\\n│ │ └── ff/\\n│ └── projects/7abbab685605e7ae627cb6fc4a2315b1/\\n│ └── package.json\\n├── backend/\\n│ ├── src/\\n│ │ ├── config/\\n│ │ │ ├── database.js\\n│ │ │ ├── env.js\\n│ │ │ ├── loadEnv.js\\n│ │ │ ├── logger.js\\n│ │ │ └── redis.js\\n│ │ ├── middleware/\\n│ │ │ ├── auth.js\\n│ │ │ └── bodyLimit.js\\n│ │ ├── models/\\n│ │ │ ├── Brand.js\\n│ │ │ ├── DashboardUser.js\\n│ │ │ ├── Model.js\\n│ │ │ ├── Ota.js\\n│ │ │ ├── ShareCodeLog.js\\n│ │ │ └── index.js\\n│ │ ├── routes/\\n│ │ │ ├── auth.js\\n│ │ │ ├── brands.js\\n│ │ │ ├── dashboard.js\\n│ │ │ ├── index.js\\n│ │ │ ├── models.js\\n│ │ │ ├── ota.js\\n│ │ │ ├── shareCodeLogs.js\\n│ │ │ └── users.js\\n│ │ ├── services/\\n│ │ │ ├── curveClient.js\\n│ │ │ ├── eqCacheStorage.js\\n│ │ │ ├── measurementStorage.js\\n│ │ │ ├── otaStorage.js\\n│ │ │ └── userBootstrap.js\\n│ │ ├── utils/\\n│ │ │ ├── jwt.js\\n│ │ │ ├── password.js\\n│ │ │ └── response.js\\n│ │ ├── validators/\\n│ │ │ ├── brand.js\\n│ │ │ ├── model.js\\n│ │ │ └── ota.js\\n│ │ └── app.js\\n│ ├── .gitignore\\n│ ├── Dockerfile\\n│ ├── README.md\\n│ ├── package.json\\n│ ├── pnpm-lock.yaml\\n│ ├── restart.sh\\n│ ├── start.sh\\n│ └── stop.sh\\n├── frontend/\\n│ ├── public/\\n│ ├── src/\\n│ │ ├── api/\\n│ │ │ ├── auth.js\\n│ │ │ ├── brand.js\\n│ │ │ ├── dashboard.js\\n│ │ │ ├── model.js\\n│ │ │ ├── ota.js\\n│ │ │ ├── shareCodeLog.js\\n│ │ │ └── user.js\\n│ │ ├── components/\\n│ │ │ ├── ChangePasswordDialog.vue\\n│ │ │ ├── SidebarLogo.vue\\n│ │ │ └── TabsView.vue\\n│ │ ├── layout/\\n│ │ │ └── index.vue\\n│ │ ├── router/\\n│ │ │ └── index.js\\n│ │ ├── styles/\\n│ │ │ └── lux-theme.css\\n│ │ ├── utils/\\n│ │ │ ├── auth.js\\n│ │ │ ├── request.js\\n│ │ │ └── tabs.js\\n│ │ ├── views/\\n│ │ │ ├── brand/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── home/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── login/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── model/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── ota/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── share-code/\\n│ │ │ │ └── log.vue\\n│ │ │ └── system/users/\\n│ │ │ └── index.vue\\n│ │ ├── App.vue\\n│ │ └── main.js\\n│ ├── .gitignore\\n│ ├── Dockerfile\\n│ ├── README.md\\n│ ├── build-and-deploy.bat\\n│ ├── index.html\\n│ ├── install.bat\\n│ ├── nginx.conf\\n│ ├── package-lock.json\\n│ ├── package.json\\n│ ├── pnpm-lock.yaml\\n│ ├── pnpm-workspace.yaml\\n│ ├── start.bat\\n│ └── vite.config.js\\n├── scripts/\\n│ └── upload.sh\\n├── .gitignore\\n├── DEPLOY.md\\n├── README.md\\n└── docker-compose.yml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted:17Xjeq1nUM3ZtzeaKMgxqhJuLMWwB2z1/Jlj1FqkaS0ggT6TbP2GlrPkAvnugUvh/i3oXkVZoIcunGAIUNq/6Oz7A06yvc0QIP65HrRB6X+ulxrHKV2hJ6+dQriITZCkEnoDec3juyB5/PQkX1DzoFWW1ligHy938YvwJGKNcrmE5W7GYpekfCKq+FvXEYaYdIXEWgp54LYWN33EQnwnCZJCRWIGeNvFrSBFebbLTb8TUntgbWKcb9a/tl0Z208htI8/QuOJK5G7MjMg6h/JxAeJGHjwA92E+VHcbtSA/qCuu1WM9Wk6vRz/PYwpSDFt3+3iHMJ1WTBhN9RtMyTynHayw1OfgLCUIS1N24rPXpuIAZsphCCpCzmGPZ8ybDGIAag/NYzSMC8FR54+sZ/c0UZiQa4za5uifjKYK5Wy6sY4kMliWlXd+1NxBQM2i50Lcc5TVB8fpeV5Wbz0hWXXFlCzYEEkWYFECBQSl8e6LQW3EeX8oheqH5q/Syf0flDAf7F3wl47GKgatJpdwxRDXE+63V4ldg8MPMu6JWqJsooFG+itc+yiaFqefswBHi/8HDRh/xKv0qzpV3HP1SNrpyq34Fg45IKYmu+FubD2p2BMyzI3tQZRrCXq2KzlC6nS56TCMh4AuR7qHtHu0SkfMZb1QbDb0xng1g3IC+GC+mKQ5d0dGTWi8ObFyVunW1I6bKhbYWIN68nTf72fd/QbKCCf7heeybb8bIvT+/R6ECmijGDeUZl/iZS663ykIkBrbfkfIX3PpFAwPVl3zD0DFj6DCGVokrOCcb+FiLzRqQqlR6Eo4eS8pJznsZGrG8OJTuolVyI+pfJnHhAMOue5iPweb2w0gfjFyUrMlI9k3srtWcPldv1q7MuVoHJkQ6zbDmWQHQCR1RdLagBuHjzfCWI5rv/jPgPZy3J1O6ZmF7kL/gfKHHkje4BlcYVdTw9sS11LAJaMtAIFUd9HxULZFsn0o+C6L7C365cvebkkm6CMVZMALiJ0Gb3MlC0mbIxzewI60daDpbbqOc/5u/WJBRjvHfVXUsdRMiEns4RBlw+CnI777Cb3xZyRdBxib3vSkGdnBqO43afTIq04mX/3e4dmZD4m0laNdPMqAmflRUOnLF6MQqLQ5eb0ZOKBlKs/kF6oAFRhN6VH8RroyCsLm8LkXkwzdLpF2rNKxj4raAYACQJfjYsyRnaJN8fgQxvGfyxX2aWtovjMe7t3eB0fg5VIyASWBAZ3kYtK6ImvXyPaGUq2p7PjTAnxibO8QPlkqZaCWrFrfqaE7fKciwM9QiHlQnWbadPN/xsqJlwENUfLNAJdLtLu2knkj7eCJcJHYD/sy+cirpDlgjoTYrAdTX3dCnm8CRS5t+AwVGoEfgRbx23ygyX5/jB47O6c6L3OFhK1x4jOm1zFqL7JQiPQVE9adP366Hhye+nvweC49arV+8aE6PnvDuuj61doZcQe7n4Oq8bqsF7o9d98njeKm6EYXPLQHWc9kiE8a9iqD1Pav39P668HnLPdxyZNUeQbxzvCLiZx/8x1V5q7L2UpOUsSslKT2/vIlxVUqq4u5UdkzWAgmW5SdkyEagynyWhW+y3oO4ov5yv0zehMOx//8uVvij5kEYsQUFx62r6KeCk+WRl/C8MsC7tCXFqkT1S+b8mgfIfaXG7jDtN9ZCRmXHn4j7W5JYFyctIBJoSA2jPdUNRypZWYi2n47DwQb+xJkbfo7JWgikcK4LKIKHs81loR2ST7wpt/8kRnfdelCFGcMSt2BrkHzCd+AZFx1XrwUcEmRuUAuolQ3TkOXUDPNPlg/Xzqaqf2Xl3EP9ektQ1nY97GtNrHm35i8odtTb5g21s0Jvunmnq0Jo3hNdp6Dty1ngmu/RntjzS4UFFKEdkj1MVl7OAUoBu2RK2tzRJP9Cm3UgknzFjyedWtAwn2qVbNc/IWrhb8uJMb+WBZok/5V++UoOZPEjqkXby2qul/4r5RWErbq5i/ulyJfS3g5qynaNmhFxzPzo23OEOLC6WRQboc5rvbMuCK2j043BNjdCuTVk9mVqGxr8YnIF6Wx0EJzpJCxkoDy4dY3SVuETJDlaNpQLSws4eHToShEoB56NozdIvN42U0UeazGCZJKMthgBtbw6g0GFourp1Yx3+XK4/ORVv8Cl1AbduH8fX7xx7uXIkhsSvc2UGBkFhxqiOdMjwjj6jcBI1zMkO5MykTyFXZx5sfqDtjrQCuH3dKq1FrdkGLPL2NfPtaFHWmpufnlc9HjeH7jRknwOHWfxsr06lNOg4PkhoKPucPbrz8K7Ekee0CBcoN8X2WoJl4rc8qPgOYFZ3GtRPJchEA66NMj/K6s2DnyGla+7B6westNr35hOm2H83YSoPznoPX3qANtTo1zZGTVxrmTPI/caxG+hS+Qs6r8lzmXsLsyFSdmf3uoezV9xNn18747hW1a0wLUBx9Az5l1SiIDMc3t7rQXsOctp9DtNogv+6V9L6PpeLqKmiAzVfTX1mmOBrX3c/u1Egs23NuxyhlNpzxYmVrfhuk2r4kHIdn7hpKkmBRZ/ausIi6erNB71c9bsqZcYxMmE/LGKL0Vdis0PMkjgRqhtVDgN5oDzxk/1V5rgVDvv55TLrqRGHclVSVn4f2l+ZP7IklCqhxOA+mBVxiEb2BxVAt0kv0P9vFwClQzX1WVnKmNoQcykXuJiYfAasJLjS1S1QXkBZhF3tDPMvgT7sCX9uTsn/kWKZUiwJXxDgsfmd4IDIBeaBNEtIdzNp5TMFb48vvn53O8bDqHGEaYrNAusigrRMEN28Pj2oB3GPxpNts9qgZ4UAOal5Gjg5FPsNkm7QrDTad8dQO3cGUPyeFxE4ZRG5vSa94ezCzHzhvLjP9QTxVHL4I/pZ3l6NuL/qNen/JM/LAwJPBSfagqS1OoBB+jJDubfwN5/arqsf8I4x+20TInuP8ZoYRPuBboIljFrdnSyPg0phc9hRmxGxv+fGQHz9VavhSFeuItkJltnzCQ+HcZP13nO9q/xZDm3rOYwUR4OpDAQDEEp4hWlKh6NzIeCDMVn6fAjKrAasQsRne5Vdqz2Y8NEQybta46BSwFprQQpe7mBWYhtvO51aygNixIdDXL1C3t9KG73w2KtsnQEh2G56ShyFz1C0iN3XRKTvS4WBE4l8daXLnFlzPDxHeE1QpYtfOxlKnVkmS94dTPGk2jEyo+dT/OOL/sJfzK4vjNQtWdQJrI/RL1Qy3AIFhJnfRtitoVp6dcmRW68w/8CkKSIBGIw6fEyt5z0PjIbNolgrgXAfJSPLNzx+J3HDiMaCldUUgqnBCoHPe4OD9N64zAbSKfnAeJ6HMk+ctWTgrR++17LcxeqTvlmC61D4Aqmb5npdsn0Z7XZ4aNbv6fzCwgdAQXjM3z4gIEMMYA4gVQ+Y3QiW2+UC3NW95fwk9kD5GUOTtvbbiIVFcBpV5tMtnWAyykZX5Fy7n4jKE2Gp/Bn8YsNHLW4rnI9zpmTuRDrU19YzhAOnegwssAGF1JEolpuAD9RDrVP+4catq+xCJBlqyfpDWyIl2/rpJPUXucXwFUHKTEYuznU9tkN7gOn6AdVlpliOu3l/hSVfnphgS5+WL8AN2cFjJFENEKiAimM0kyOZCCApW+RF/5B+JLmSfWTN4yMmeXcMZRov/1KfX0WEfPCgsbJ8NHDrCW51IlQz5Df/rzNFCbWDQgqBppyRknpJ6iAam7c9QHxvEFRH8YUQjOGAYfVz824/hoCkmL3eIgR6YCo4CTKUegn8C7zwRFSGWTlLb6LHUwad2qVRlUdynyIFK1YJuKI4ntadpNbfBwiPw1hgHJgRZUQebrbaKe9DaAy0FpKmM8NP/ez9/OiN+5HniORSAQvLhBkj1Gs66e98Ajdm1sdwvv1Ao39zmZWzZvFy1VDkCtxIwYfMTtVl6SnpPv2bRP/kw3NlBZupKmAGtwV8IFXMnPQvrSVFU8XmaSGy7Rt9Hq6pY/F0Nq5PmKYHJyz0KZE7gs+cxlbcH331WQKCPgXTuMjptqsgE0QLjN6k0LmuT0fgEhPUv0DYzEkdr4cKdbKP6MM4UKIuYI+hRGxzkuMzZ103bIHA2SsSmRLWLN6qM5s0msiJ5hQpCHbALgLfR4naGJ+EdomPZGI/ZLxGRx3IaptcfLc0RuLYJWV31EgMSkVeFmleotUCCCQNjHqCx1CVKRzmZNEitzZa5xbBDyhwBjHCASjzn5c132PL4yyLiA1wo3wBzSAIhmoQV6ftwy1gPO8NeQut/eg5vlD/0KaDKn8PQYa+RNjp+4jUju3IAYvREH3M3BckXONvv4v25Mrg1vGYqbRoAUFrLJSfrKsUY6P6C/MYjTdfy7GhOpzhUfMySRz3HBBlgN6Qw0sxAVILSg5UmPibl7z/v1HyZyI0qhy0xE9peVooglrQN9qWi7ZZ355HRpxlxjVehK8vY9tPEbWzEp7yhvektJEywC4JWTx/5n1Jpb4oSL6IG4/6hOoVsIURptvw7XrOkO5j8U6pnGKLMHJ6jeKzacksHFnuwtsT7J7981y/7Ll9jgdkvqv/jVzmkrIPvpSxDzI1nz5IXuBDxi0OX2yqXebXVGACguTgwRVGm+dKljgkupBiNuaK5DylC8Y8af+ZfWmOWMhfws9ok4EdL10ItJXbJD1jtNkihutAR9zYc2CU5wI/v+mXUZpBQ5gmCN/xS9pkHruUQd6moZ04MOIqPZWp92x+sMvvuN+0X2LnePUNFWTrMWq1vskBjPG7RYcnJcicr2s2QC6JH4OSMLrokUDWVFiLewOn9ivE4tPU4qTCvlx+zrlKYpHQBPtvyhteL084JBRnUbce6dMWsyqLBTSmvjcE6tmUkYyyndeVoohCobdWwDWQXo5dJHuZgkVKl2//Wx7i+NcTXr5Wqk2r2mUoU3OvLkIgIsV3oJCBn50TaXZ/BUJyISq+pKaeBy0kCczoajmVdnPSMKlmNNL+QILq/oFC68SDvzB6NjnP1m9cjnfTX2VkD8BklLFNDEz0th2lPPwux8y1EfGsSmDg1dtaZ6CItY3FeS+SOg0h0lPg6GgJnXPFUzyfew7LMFMTEWkt2k94dMtbwDs9GHDaRFP1bHLrGiPpO9rHv9eyo4AsJugVHNhxd5cqVyHtRLhMAgoqbaSdiwDv1hd9wxYjvFqv71H4JsIY4YxHZirSC9nhuKbtpFmK7dHt5nKd1c50PlI5srvmZ7FlLIOGn+uWRMVin5/QcFeqqDA90WLvHw4ZY+uhEIxjkuRfrYENNLoDo00XTkxNWcIfoxYcGbjb03wcwJxLLpTxGQG4dxneZYsGVRG9xz+DPnM/lPZA+LilTLBJSYx7glPmqjoZm9kxiRaVCB41qV5zwPHHxA4hFLky+Y0PehlF8ZBvxn7JGUds4tUEEOkP5VbrnM6Q7+Vn85kSsRKaPVkooK9KFDUYyvoygE9ZbXZL8AZTEZ3Pyk9OSbDWN8XA+IZFqll58ZGaVJjUTLYMIBBzS8Y68Ba7lJXxlt6ul0NlVE0C1RYv4Coz+J40r++GF92UKjEMeLrLVyTEOBnMtlCHaTyYn6oLKUqXFRAdg2MA/Bl710aXosYl8k6q4YJWs8geoB9J3Bgz3GCEZgHEJMrTph8mO1aUxEkb6yvgCcsrighOh65ntxu7G2IxF/9agllU6SpKVYLm1FdlRP32lHvRoObDgl6mcRFeetYwiQeGLB/jVAjBaDMvMKzGpGXhrp8FJVKRnntqtz0FrqU53H218/GSav3+/MW9nXr+etdnnwjcXWrerxgnnfjwciIuKh3iDscNhFoUuh/ghSp48WpBmQ+Dgo7jp9q7xup6kTeFzVav8Z12gzgMFfNXi1QAONZ6yP4twIyr8lUDFUrTEJWNXcWXIrCC4HGfB15c3JsDKwANSwHG84gkIKmMaVoVufh5JsLpgrz377dQbHmk9JExOzaidks3BcaqNCLtny47xqgo9vAkOvL/C4uzS8T19TyCjx45s9ChatNCYwOXqxXHVw0jdUCJpsCN2DHK3cDqq3NblLsDRvnrb3s7eSSdkTE3MIEFcCbsA5IsZ61IDGoKKcjXh1ojFr1k9OB2vXqh2zu4x95OUnaRRVp40fTZ65i9OQ/eeaq1jfpRTbGyXbTqj/yIYaUucImq6knKC6g8cjIn3AnvrLSMRsKvgHw9Bce54x0hoNFKLB+LExZnZPGk9+OwRlwdpxtm49S+tqiLAbKDZI3xQfRPDB0uxj+FTuGwMXexS1ahnmUEWHfSnHKU+WLFWp4cd5tgEzoZfFuWu4HE/MI231QmZVJCUFjubedhh4zi0w2VxcUpSKzNVAat/Gx2deBisq/sJK+FUI6g17OTIjsqtCwQcucsY1rFkRmdXnkzEKjWHK6oJTzsXBsU+GCq+SzLohuh/2UTS8KO6oFOAVB/TIi+058rCke1oSui9ra76YcBvMuU0W1gquus90OMv5MVXTHt0f/d5l6JaSkqk05MFVraTKA9x3WWHfbiRA5JPSaPOiYnLktRqAbwqqEj7vbLilstc01zXyNtbos6hXPzV3qaOoQUxFnl0XU2G8jSHa57xL8SQ5CDUOuaVyWk60J3nhCdHTEGCvyHkAo/NsckFQTNPaG09Tj6mcj8VG0iPVkT0o+XNifpyCw+nAtuqIBT//UHBIXIVWJ0/GWScRadUfLJVx669uz787LlxcwqH29C2rGqz9eITogGATQjMCECcMf8T5ACVQojTJbelhQXyFrqvGevmZ8ms8vlrd8DayNzcLd20lR89ztc0VoFkiw1tQG+VD7R2OceOcc0ThpYqUiEkkzPKRZ3+5IFzCU14sHDm3Cv3cNpHCPgwTZCHiHExHNKEVRLyd9G70GAeazQWBE2q2h+1N0dr4KsO3lAe9roJ376CVpmFyHZVNRJyRAklEMq/TsG8bXadooOJEfRY141lrcFe2arALHcIRnTzwTfMrgCD9qXV0HeM6aCf38x6Tfk2Q5x9IHB+DH0cxB1+pxloRda0JDNdMVmLB3hHup8rpFqurwNC9cX37BdQm4Y8Mfv2id25x48AFov++sfdmWkSNmQENz4fO/fm1PhjhCYa1M6q8J8NawdpWgCebqKhw2qNdmBjYA54O1ylTcaml/uXS4pCn33Gm4hl91BUm01MTf9ZLB2yDh2yfoohXlqwHSVZwYBT0S1EB1QwwioGD9Nft3ACPGqSO46Ls4kVV1hmwthbAA8PmPtOEjPmy7hVX0UkfdWMmhqcy4IIcIHHM+D9nK2xnXIAjjWdBcQMZlMulg5fnQlV2PLU5hJXdlW0nCVERv+Buz6Da167J3ro5rbJmfqHS3YWApQIfKIkRWyt+9BwMJNGLPrtOx3peiGFsiZpZgUtxJHLbZCdzU6Qgdb00IyCMnqC0FELc8AkcBGmTIN+V/husP8w7xKgTA9co5rAaH478+OsNf9tpfL7E6WNmg6EtgDgnqsvTBZCgjvLOO0mI0bSOuBq4G6MA5cAZMrat8rLp1TWGt/q+Cw8CXEnrjA9tmRbTOBBc3iG20skW0dr7dBSR2AB11391U+0b3jQkCb5PgWI3208PeYTuel1D8zC8s2J6to6IwnujnKuPNqjQlEx4s46bumC0zr831bPELPr5y+Qn1sn8ryz6k4Y32er77FuBsrrrECyDSaplfNRn6anYJ+xo8bqTXopxmsiaukDZef7LnUw5ASUj8i5H/oOkytBEafi2go5PgY95VDW1NTaEX1KzR0M2ViX8LWmTlFLkmxw/MNbKcYz6rh6xelQq0WQdaaLGcOGmK3smG+ava5l1eTF4ozID1JoELSPcLdK/3Y0b5r603mEBaFAfOR95z9VFXsZ7CUa+PqTIrlC+LJ34CWIFnBrpnmUE/deYOOEZ7NrT9Nr9nRz56/Ly3PGhuAUd2tiuOwCAgEzzGdmPLM6s/Lx2kyXS40WVfeP+h/Z8bwcwRAcSYpI+Khy9lNTUws6VeHrX/rFDbJG1SkjzJscZDM9C8BaMPTB0tJ7sEQovkciKG7UwZELtiaZj+WKROkACtYJ+E+97p6Y6TVOAI80RLB6T8W6ApdbL9YC2JzmGbA8fGHIbL7lOkzZlBSrvyTU+vxGgIvxRES11dyBsKWZqHlhZbOOMtYMSWqZubZbbc5tG9mV2DKLT7oQhdMwjbzHFe06O7j3bAqr2ren1BzkbgXLSTMcwpYVaeE2+6URLLTUngboKFBoUjIzvDxaFN4NFkb8LcMHBciZ6i2lAtHmnnN+fZPtxzRJTuUsukPq8zUO4pGAFEtHIiEdxrw0+Vy0Yxho3xc4RC11gKuYzZ6fN7616CEEJjYkM4mHl/fj6Un315COHRxEAchaxzNHJ8W/ib91SvtL3rvJxzpNc4rC1BXdQekAmufhksxCfQpRcpDuC0YkUPXLsBAEkhn16jTl1ZSEVi6llp6kQ4yG/mncDKwv0J55WlO0PJeRXx/OeB6KYnNF0LboSujydXLaLvWN2Eqvz1YEysPo27dRAesCC/fbx5q9P74WLciUXckHDN3L+zV2KkpSAMSXnm3mt5IB9tzFByA+0uinNMUPQMKskhvBLR1GLZBEdvnGpMILQ80aDJafbKSomRQTqFVMSYIpFnAHHee+YAQKINyPr6OGd9efQZwdaPAcMMbJ2EQ+a2Z1KQYBH7r0ZZicq5Bxm+IeULPl3JKTL59I+1g8fjMsZqgs8pQ2vyk290OKKAcLO0cE3h+XUQQfqH1rg+8vlEb5ao1UWWxsl+PtXD+ugoqhsOE2RboAOTt5V89dtz2pslhxDmnQk0W1PHKqMm/183K994qZE2N7kT1S0ETxaKG0IPSfFFBewsCFuoRT1oJ+b6ZNDwzH3vRNlSaPAwQFoVsoR9UDn0ZzaGz8+r2epae9DfiFlFiLLUgI3evKiTUybmaTh5qNn/v/MqlBknyC7anIDztsq7CsoZXDN+sQkidW6PK8Vjo15iu6EdP5j5drX1U2EvSd/X8jWOMo8waWeUmY7DX14dQszyKuXRK793zpol7wyMKxTL5KFUP2wryC276ZY/nf8YpW0UAi6L+agRLEfFLyNDuZWEAxDK+fqah5ybspL7LAs+IobHsYVl7pmvN8VW+b3uJROymqlRe7eEeGDfu6EmDAHp+Ct3/9JCD9tJQgZYwnn13Q2v92VBD7K3tF3mOG0SP889Xxn7ZSJEJbVou8xze2RgSH4k4THCCcVmfYHVPcs/M5aZk/ujWJGGCTRIrwG5vJ+tBahEUfzah/5yP/tHcI1na0WH+CjfSCeDHOYl5LMkVtnZJNwBkoXzL5A8E8msOMhnyhYMcsWZwv/vsOaRyGtwrOOlySEWiYmBhM+cJSpolsAxNZVA6sDsO7k6LJ+LhnPrXPOn73jrej+gyo9N71kOFsPLmcvsMWd3wCAZrV8yKX0/G+PUJtLkJXdk9eqCFNfdqzpLMMs//pshpNFXpaUtAtihl3Q7Bni+VRxba9I0dSd6JxnivvnHYyqToNPRCHAnecCR6wJ5HBvs3fDLTq5v80+7bzVZPdYLz7jPUjl/eA3YlBg2YoV+R9K0So4mMCCGO/+FOHdjHVFD3cUrtaqrHv5xm0pW2tbQdiFb8/mUJRo0HtYzuUVqJEJcQpkiiSFdjoccBdJhOCWA0o4ntcs9XvXXFEDza5PRoP51YNr/PZ0p4zx4q4Ytx6zftAJvDfhJAEPJ+VIPfiNhMQhvwFIEq92PegUCYOdeBOWthy5pxT2pAGGYlDLnc815+7Ic2NIzdK3+biv2mlRur6x3whnWC/Air0dIYwo59nvo1rjzJrXO5HIGxNpbTGhgD4Jd8f1hO5WkExQzVY4mH8/vpPgd57L3dEKHA3yRIkiiIxm8dbmUM0+tWyzR+gKmskI0xe7KZjH6gFQfz5TWEDMaAgd5dHFtTaSwbjiFBdMWV0s+8cODpJbgnbx5motgi++J5EyXJtwu7jQ3C9HGxRiFB2RnFGEaaI1VOurDXvXtydCnabbZl10kaHOoVWVSUoig1hVzzVoQx+VRE9NMrHWvPkauF0YALLy64cHNPyDCAvJjBzERByBVfAMsYojAzOCyDdV/j68x/aI8jSYmm7NDv8Dq008UJ9LxQP2uLTeekIPkQoZ0TCNLVdVSOFoJ837zTpA6drfmYT8nGDjhOGasmnO1HPPomMZltyXMvE72SHdUHrITYzHYDPJ/8IcwneHvw3L9BDCvkFeVjLw1rzQxbUA5XRt1nueWsbypLgcVNKrlwhb9XpR71pIAnXBzkockUa/1ssnZZPQhdZ7he+Oyttmoe78A8+QgM3hEMXxbHtQBa4uGeAZhovDJS/7Ph4NCjxIRdz26VdCvoE0LUNEA1tT3qZ2KPqlK9ulWOIwu04T/4rKYuuy4qu0F0Axr7Wz7gIQI2Sl4HUHXJMCmFI4LWmurDX9mgufrbrhw/ZGbwGrF0t3Rh/F7LNIrEHHJNvWRnAaYQUZXROPGeoMG7pO60ggg5R8wM605ApCqvVuV6qAaTbElViL1IZmahy152IdPAafiG87OGwyQUfNxs0DSgNzN985mb4wKFnWaPvyZ3vlwUA13cq29XhtzGGbFVKKvGeGIPk7S6aD9F5w3X4DePo6dpt+Batt6uyvhjfRk+5QME5uSfV8Wa44gZcqKWmLxuvzCXg048dw4WP7DCQRKvLPfwlRqd3Sn2TZCp4BkxzlRCLVKgXjLnr0EKtUb8Jb9tkQLT1sFTWS5tzU9GgO44pLH8p/yzzKPEtMxrixRtvK2LKR5NRVXa7vxt8448/PJEDO/I1cfw53VCxo6wWnvXMylo20xfN9dVewx9MKVvmlFfmbe25hsxYbtHoLHWfyATJsAwyuPyjoaEjlRMAwacKN/8qroaIH5vv0R1JrIx28oHJoArByc6xJKvEUpmBQgWcpsrkS47S0A4JXiMDEgurBsbxDuIfhhi6OtwLBKVU4Irhu1S+MFGRwnOGAYlnHdq8sozqtOPfkCDvTH/PfPc2iXRGBAxomJ4mBAnbb1KXzHbc7RvhKDqymIfklRgfc5qfxZOyp3P8TLK1NzpsnTdM3HdfN92JZFyhuPnWACjRs3xDrJMdzxZpqW87SVd0ZWq8MMeIR8Z2IFOrWNUfo0OnFJV34/jjnYdGZMNKD2NuzqB5WivTyHRaJwD7UJtv8mK8lMqy0Y8F/O1LgEl8ThfBSSQqgEebKMFJXwAW+QbXH+GlVqrrC9937QQMHUXdtbPqvvlUDUtrqGvSlvudS4Robfs6RzQxP6WVIGC+8njGp7qXG+fM95/m1CNYcW7zYD2cK7KBzBKf77TDv46oj6hsE+l1QAoQHw0o7tuWXBB16LgLkxvEuQ88Iva2FaTcT7KA0N8GMx8pRkK3YENyO5Y7Qcb7Bb4EJ1RkjsbgS0tyR3I49GzU1w892namX2Ard1fOkrg4U3PDb0+sY9bRu0lXDaCGfAKL8I43cXsimG/RtFMrTOIRbC2Oe9nsAHt0rhXgq1JQvU4RbtndWpt3fHEFVj6wTDCfX6zI0dteBnu2DlpGHXAHS0tMJ+269y4OOTpl4USvu1JHFGUAdCuJ4VkxWdcrR77OmcvpyJ+C3o7M29WnjTuUmpvUxc+UPAgyPYN2mY+xG40+/qUg+E/hk2MM48seqSnUaAPDMlyyvnSIwQm+a5GV2sGRk8AkIaB5WpmbSid1+6W4zj7MOGLI8l9U5Z184+yZHKoQicR0N2S4+madsLmwa3Hz2FNVJe/UFmLfjW/K2K7WYDfHwY2vwXCnoGY8gT42HLzNiHq3MYIPl1AzyF2AwSQPGb8c/Fa0Bo3iiaTr7O1xXJtsrvEpKxVOgJCEMecMT4XluKlbGwV0uIZed8oTDGrJNr7035XEIf2ttf/E48RoqmMnsx+Wt9Cqumm3TQPfviFLd0kS5WgYW0U3TNkvuM7ww+ck8csgvMQVyMeQSPNoUWts7WwMIq4sPm19J4TsNIoibpqXtK5HhzfLSTWJL9t8F73+pnTzO9PttG9ikwhb3Lkjktj7x0Si+vgCm4wkrJL80LyFcZiwJvNAdzWYUowqzf+Q6m6Effbg6NX+2x68dm/N5AYd7eUDrnhrnAvLdRRRae7Xrs5rP94HKpmfyKSgGVt+DLnZLiMwXuwSd9YwKdqdvzkHq/51y+/3ykc9F+pkdJeVzuHthbesGnuFhyNPKBHB4h/ToHlfowg3jDQz/UaRBXzTQJ7WpgFKfeYRYww/XgA03XTR2X00aTxkzvcWZBOfQWZxMtnnzJYzDq67T5zO0mKv46tVEjAzfBCg332rL3E8EE14yEg0Btssyn4YD7sotbfEv+vuek6ZAy6SYfeAzIDE+rHTwCi5/X65izZJYK/98g1vefswd3h/hMStSwyktqniYgMvfM9rhIxh29jX0qqMWDCNUcVNQCTSmodaqYntxUGP/K2aZH6lMu1z8358g6smB77eO2PZ1cviN8qw3uPYjhW7YcAdXIOMYHV51se9Du8EfmGR9YK8Dr93g0Z/ah64LZKBFquAh+ke+A3jOoj85ZYn31VETfaV7JKQbC9J5mJm3zsz+gI8IFzrqbSyWTRtFfiibxI5lmfgDMoulJK61LDgcuArSdigutV7pvU4mxhNt4GIhLUBMMiOQ1j25o0Jxlv2vRpEa9vu+ZZ7lkLFOeh72G5eEif5oOdlCC/OQwGi6iSXj71sjtuwAjWrvg7hdwouvMZ7tJ/LzI2NjkRMGW/sjK2mYfH6yyCgL0rvnC8nHMOVYep0SnMa8BvTaOnrofi4oh+sqC6r3BoCFn8rx1pNmdoLw8mr1MTHoO1Na98L12iwMdICirh7sX1l5tO88Ra5BEwAPPBLsbw3zsM6cs6r7GydLuCeZMkH5lzFxl/cCajwVqeWm6ef1yuqDSnxaq1dr5cFY9NjyuMpg1ZF/VikFrba+9bnw2JS5Ptr7GVmiG5aUyEw79R3YymCElO1dzaLAu5uzaUiUKWxKFCPvVi5RK4zpadANcPSevHnoerYt+25bmZ1C2Ad6H6ALm682rRswO+ewyLWqvYz9ROkPiXtXdxGKjpv3uORfYDcsCjFMgI27kNG6a3p5nk4j7ILDlZ6S0P8t/V3KAkiYo+C0TW9mx4TTvPZ6HgGDJscOcgcXI1hMv8n1Uw4Tx1KrFi5FRO6eBqe4Qg52HlRFw/5EkiRAECL+L0NqOV5w9HmMPWrHSGhOEulNY57Uk3R1HasMQOQhEAypweVH47iPyBtzpdGwDPEmgQZRN3zkVQBYw+Uug6d8xh6L3wvMd7Jved7+yPqAwUUW6MxxFj8Vtuxw7EHulvOU+3gae/k1zD0Ty5BNnggwxcVcA54Yf3Xwncp62qPbeAjRd708IAy4lm0qc7T7hXTHTA0dUr2uAMY+02GdFvI7IMosv52d+Y+vbxfSFxaHc5o0C+kG5gAhK8ypVNEdbeVnSD5STYRHnN5hloPh3ZaZRTM7oCTEvfnws2qfJlX38mUwR+Mq92nHOosE2m0Y9C7SZSyzEHc8Gos/abVs7/pnJ9AMsduLkF8uG1KPaGUL0j4qmAOpOUjXFeSb6TeisLSGQEvthhv6hq0ytSOMGaMI6oA9y9zTyQfQv/askPaEt4y+zSpImC11bQTgB+iLkUPpZu03hltt0Le59yhQcHIduwdGG0/nuDpvLz8TqNN1404ObghoqFlZq9mNPQagjuyB3C3saSYvy7npPmYq+vTEY6NI8Nwr0xdCGnBBMvYqKw/DlXIjnX4ugJ+M11V7X72Vmi/JmhqCUuqJXGIWzlAVmpbQLdgltvpljf7h1N9BVObdI8FqBkBj0hYfBsDOm/vz6n1rJbwtHZiCuEEihGhAOtGNoov7JWCebJRDV3ZSUpBfeCWIGbjlQNeJZF3nBj/tpWNSA4AyCuU2IkSRQj/68UsljqLskkO78xuywll/LS5S8tXilXqlWYKIRxtaT5iNYiqubiAzlJSENuCuOFzSywlSWt0CU/wOTJDk3+zfYXGyJbh4bKqBbcweKJHE3rb3BMvBbEbqfArA8wsldOczxs113SZ4nqT+wXlh5HWWHdfouuvWD0JqZ9n5isoC6xJRSvDEdEFNqdhl2hZezrskzCo3TkRKFBy9gI1+V4R5La+nvOTBCy+BW9HM5b4v6wF6TGJ9eZSSezM9wGEng9ukSt1mrg1UOkmbw62XC7x82UnUXd9cCuKvM7OLOk0HgsCQx1cOoc8GTg1dJps0AGQ07FIYrbobuTGpxALRxr2j7hCHzHFv0bWR92ttY5oZSAA3mGe4OgZzsVscOg9ivK82WPKSzrphEaqCpUcM2qg/J93pvjFPDxJq3XhNIFjWJ9dGJyDhVGIqAoZ4zUGYbL9mty6Nf/+6NcQAUvTam7EVkyPEdB4gtfz4KFxB6jy8hGC6wlOqTbopsV0IRUpobAeArpkGMi5cnPHFyybxaXCXa+PFOG3MVKjWBbZEEiVD5d6c5HqN+VgNBLC6Ia8o7lczCd0hwyZET0O4zFDeulgq+j5zSxOWby8JofxMxB99eNTfsq5/+BzPSPd8Yo+Bz3ES9qXTFIUGIG8df0XT2kQBvZm6YP9R3n8ofgiauWnoKW51PbEd9lQPMQcaLnb2FN5tQDdmBJhbV4EwcG3CSH81eVvWJvg6hfNdzH4LKksNKJ3gtiYbeA1DoBAtoPD8cjUrgJ3xkS1SVXpAwbdzJDGyslFu7AZMGBudBUubOMma6JvrWA/wFcl3g7Mw/AZ2lOdkaBf81z42DjOTBT6roTYZUpkan/4vJpRK0+aCccaEuQohWv1eXiosh2fRXssXobyiwLGfnirvjbe2b4N5JjUvYwMVFP/ywPKjBGU9XVoAn6Mnr5UszqCwaeD/2MO7Ubx+VvP1VJaSex7HA+3j+hzni+EtFFbo2T8RI4aneiqh8aDLmAUiXncQhd/OlFQTebmiLZWnwtd6zOKyfKLBx7zFj42zxKL1/Elrq3i8+V62JIq5/0Lxgw2hJ3pdqKScwqdoLLKV1ILQV2IESubQOUdEvXwZdteoLWBFY/PsQ3wiHKPBdJYfiXFKW2Ihg/lN7lsFzNbSH/yXh0FCoGwaKJ5UsOOAi3VwGFgnQl7ZfKAoMH3Tfkdyi0xKAMbCoB8RNGpCIa502uosAnHfOaWXmI0rqHgr6bxNQU=","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"864040f45b60387fcdbf9439e8922c639da1a093","last_commit_update":"2026-06-30T18:39:57.135847+08:00","gmt_create":"2026-06-02T14:43:54.575428+08:00","gmt_modified":"2026-06-30T18:39:57.135847+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"main\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.4.0\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"2ba6ee170718db40d0a0c1e0e271ab8c","path":"frontend/src/views/ota/index.vue","line_range":"1-1003","gmt_create":"2026-06-30T18:39:29.609311+08:00","gmt_modified":"2026-06-30T18:39:29.609311+08:00"},{"id":"3e935f654a28968186e9260f2c5035c7","path":"frontend/src/api/ota.js","line_range":"1-68","gmt_create":"2026-06-30T18:39:29.609615+08:00","gmt_modified":"2026-06-30T18:39:29.609615+08:00"},{"id":"edbb69e747bbcd76dd1bc3a361ebf7c0","path":"frontend/src/api/blacklist.js","line_range":"1-57","gmt_create":"2026-06-30T18:39:29.609775+08:00","gmt_modified":"2026-06-30T18:39:29.609775+08:00"},{"id":"4e817a7f3bd90bb9e57c6a2e9009380f","path":"frontend/src/api/otaTargetDevice.js","line_range":"1-57","gmt_create":"2026-06-30T18:39:29.609938+08:00","gmt_modified":"2026-06-30T18:39:29.609938+08:00"},{"id":"72de55f3f022487777e9ad301c9d942b","path":"backend/src/routes/blacklist.js","line_range":"1-223","gmt_create":"2026-06-30T18:39:29.610091+08:00","gmt_modified":"2026-06-30T18:39:29.610091+08:00"},{"id":"ba9810388706ac5ffb0156f74ada8b88","path":"backend/src/routes/otaTargetDevice.js","line_range":"1-248","gmt_create":"2026-06-30T18:39:29.610237+08:00","gmt_modified":"2026-06-30T18:39:29.610237+08:00"},{"id":"f3b38dfd34a76e0d2e62a863fca301a8","path":"frontend/src/views/ota/index.vue","line_range":"420-831","gmt_create":"2026-06-30T18:39:29.611431+08:00","gmt_modified":"2026-06-30T18:39:29.611431+08:00"},{"id":"ae7ce676a4f649c15d0490bbb2954cfe","path":"frontend/src/api/ota.js","line_range":"13-67","gmt_create":"2026-06-30T18:39:29.611582+08:00","gmt_modified":"2026-06-30T18:39:29.611583+08:00"},{"id":"859ba4011a4720ad0ad431545e144986","path":"frontend/src/api/blacklist.js","line_range":"12-56","gmt_create":"2026-06-30T18:39:29.611724+08:00","gmt_modified":"2026-06-30T18:39:29.611724+08:00"},{"id":"c910f65a89648ecf30c84b77b136ad70","path":"frontend/src/api/otaTargetDevice.js","line_range":"12-55","gmt_create":"2026-06-30T18:39:29.611869+08:00","gmt_modified":"2026-06-30T18:39:29.611869+08:00"},{"id":"c042223cf0aa5b2e59be1747923b4baf","path":"frontend/src/api/ota.js","line_range":"13-49","gmt_create":"2026-06-30T18:39:29.612183+08:00","gmt_modified":"2026-06-30T18:39:29.612183+08:00"},{"id":"b1e9d90908a2a5e3d545ca0cf2c86769","path":"backend/src/routes/ota.js","line_range":"24-268","gmt_create":"2026-06-30T18:39:29.612679+08:00","gmt_modified":"2026-06-30T18:39:29.612679+08:00"},{"id":"aae8712924efab58e019d0c963576781","path":"backend/src/routes/blacklist.js","line_range":"96-139","gmt_create":"2026-06-30T18:39:29.612821+08:00","gmt_modified":"2026-06-30T18:39:29.612821+08:00"},{"id":"fb9daf52780951bc4b93f14b1fcfa8f1","path":"backend/src/routes/otaTargetDevice.js","line_range":"96-139","gmt_create":"2026-06-30T18:39:29.612979+08:00","gmt_modified":"2026-06-30T18:39:29.612979+08:00"},{"id":"23aa29b61d1387fca0530a0a1e57e27f","path":"backend/src/routes/ota.js","line_range":"1-292","gmt_create":"2026-06-30T18:39:29.613104+08:00","gmt_modified":"2026-06-30T18:39:29.613104+08:00"},{"id":"e6f541a0af8390b3610d1e380a8d3236","path":"backend/src/models/Ota.js","line_range":"4-94","gmt_create":"2026-06-30T18:39:29.61355+08:00","gmt_modified":"2026-06-30T18:39:29.61355+08:00"},{"id":"4aad83e3e76ccc16e5b91d801ab1b278","path":"backend/src/models/BlackList.js","line_range":"5-36","gmt_create":"2026-06-30T18:39:29.613684+08:00","gmt_modified":"2026-06-30T18:39:29.613684+08:00"},{"id":"54c99704b8bcabdfe63adda9c4392452","path":"backend/src/models/OtaTargetDevice.js","line_range":"5-37","gmt_create":"2026-06-30T18:39:29.613824+08:00","gmt_modified":"2026-06-30T18:39:29.613824+08:00"},{"id":"b7c66d1bc7887a6132dc3acbf6421a5d","path":"backend/src/models/Ota.js","line_range":"1-97","gmt_create":"2026-06-30T18:39:29.613982+08:00","gmt_modified":"2026-06-30T18:39:29.613982+08:00"},{"id":"058bc5c3e018c854b5cf42905abd45d7","path":"backend/src/models/BlackList.js","line_range":"1-36","gmt_create":"2026-06-30T18:39:29.614129+08:00","gmt_modified":"2026-06-30T18:39:29.614129+08:00"},{"id":"3830639d0b7444aa8a1cf3c80d4eef7e","path":"backend/src/models/OtaTargetDevice.js","line_range":"1-37","gmt_create":"2026-06-30T18:39:29.614371+08:00","gmt_modified":"2026-06-30T18:39:29.614371+08:00"},{"id":"be497152bcedca75299e4c2521c11859","path":"backend/src/services/otaStorage.js","line_range":"46-103","gmt_create":"2026-06-30T18:39:29.614741+08:00","gmt_modified":"2026-06-30T18:39:29.614741+08:00"},{"id":"af76fcd4277eeb577f573e21de923bbf","path":"backend/src/config/env.js","line_range":"1-13","gmt_create":"2026-06-30T18:39:29.614989+08:00","gmt_modified":"2026-06-30T18:39:29.614989+08:00"},{"id":"b8c21c93e526039c96f1df526ebdcafe","path":"backend/src/services/otaStorage.js","line_range":"1-113","gmt_create":"2026-06-30T18:39:29.615206+08:00","gmt_modified":"2026-06-30T18:39:29.615206+08:00"},{"id":"424dfd038ca84be6195b08d7032a1235","path":"backend/src/routes/ota.js","line_range":"68-102","gmt_create":"2026-06-30T18:39:29.61565+08:00","gmt_modified":"2026-06-30T18:39:29.61565+08:00"},{"id":"2fc67d9140f7c12759a5188eb6f9b204","path":"frontend/src/views/ota/index.vue","line_range":"305-338","gmt_create":"2026-06-30T18:39:29.615816+08:00","gmt_modified":"2026-06-30T18:39:29.615816+08:00"},{"id":"e3a6003c52bf8b8487bb1b8709da6b4b","path":"backend/src/utils/response.js","line_range":"1-25","gmt_create":"2026-06-30T18:39:29.615973+08:00","gmt_modified":"2026-06-30T18:39:29.615973+08:00"},{"id":"cabe1728acba4dab25a86b5788412e46","path":"backend/src/routes/ota.js","line_range":"25-66","gmt_create":"2026-06-30T18:39:29.616135+08:00","gmt_modified":"2026-06-30T18:39:29.616135+08:00"},{"id":"45f0756fae3928b75883500a5006f7f0","path":"frontend/src/views/ota/index.vue","line_range":"645-734","gmt_create":"2026-06-30T18:39:29.616292+08:00","gmt_modified":"2026-06-30T18:39:29.616292+08:00"},{"id":"f2e521eddcaa25c62a309d5b0af997fa","path":"backend/src/routes/blacklist.js","line_range":"96-204","gmt_create":"2026-06-30T18:39:29.616595+08:00","gmt_modified":"2026-06-30T18:39:29.616595+08:00"},{"id":"6b7ea701575cf98b6ee3431f68ad5649","path":"frontend/src/views/ota/index.vue","line_range":"736-817","gmt_create":"2026-06-30T18:39:29.61672+08:00","gmt_modified":"2026-06-30T18:39:29.61672+08:00"},{"id":"506ecfb839ed7fb3f4199ade7e4b6a64","path":"backend/src/routes/otaTargetDevice.js","line_range":"96-208","gmt_create":"2026-06-30T18:39:29.617009+08:00","gmt_modified":"2026-06-30T18:39:29.617009+08:00"},{"id":"7a5ae98472bdc4806472d50e6b88c997","path":"frontend/src/utils/request.js","line_range":"1-72","gmt_create":"2026-06-30T18:39:29.617154+08:00","gmt_modified":"2026-06-30T18:39:29.617154+08:00"},{"id":"69c930f997042246d4e17369ede6f826","path":"frontend/src/router/index.js","line_range":"1-91","gmt_create":"2026-06-30T18:39:29.617278+08:00","gmt_modified":"2026-06-30T18:39:29.617278+08:00"},{"id":"6b61c60063d41432a3cc1ac4d1699181","path":"frontend/src/utils/request.js","line_range":"44-69","gmt_create":"2026-06-30T18:39:29.619097+08:00","gmt_modified":"2026-06-30T18:39:29.619097+08:00"},{"id":"752be7590bb954b39e5a8f41ce8811eb","path":"backend/src/routes/blacklist.js","line_range":"159-183","gmt_create":"2026-06-30T18:39:29.619239+08:00","gmt_modified":"2026-06-30T18:39:29.619239+08:00"},{"id":"4daa6ac2900ccb8c9fd7142d0ecdd298","path":"backend/src/routes/otaTargetDevice.js","line_range":"142-208","gmt_create":"2026-06-30T18:39:29.619362+08:00","gmt_modified":"2026-06-30T18:39:29.619362+08:00"},{"id":"e22545d86c6efa26c57aea0e355a57f6","path":"DEPLOY.md","line_range":"226-256","gmt_create":"2026-06-30T18:39:29.619502+08:00","gmt_modified":"2026-06-30T18:39:29.619502+08:00"},{"id":"05900505c40339d0cc93870281600479","path":"backend/src/models/BlackList.js","line_range":"1-37","gmt_create":"2026-06-30T18:39:56.520893+08:00","gmt_modified":"2026-06-30T18:39:56.520893+08:00"},{"id":"921d509d2d71df1e2bace1390640482a","path":"backend/src/models/OtaTargetDevice.js","line_range":"1-38","gmt_create":"2026-06-30T18:39:56.521018+08:00","gmt_modified":"2026-06-30T18:39:56.521018+08:00"},{"id":"149a41cdd5807ad4f666e9eb2463fa68","path":"frontend/src/views/ota/index.vue","line_range":"1-628","gmt_create":"2026-06-30T18:39:56.521152+08:00","gmt_modified":"2026-06-30T18:39:56.521152+08:00"},{"id":"771e33c2a04ba5eb1a504cf7aa1e9c36","path":"frontend/src/views/blacklist/index.vue","line_range":"1-381","gmt_create":"2026-06-30T18:39:56.521272+08:00","gmt_modified":"2026-06-30T18:39:56.521272+08:00"},{"id":"f23242497ee4dc9ed490a1d09d0d3d91","path":"frontend/src/views/ota-target-device/index.vue","line_range":"1-386","gmt_create":"2026-06-30T18:39:56.521399+08:00","gmt_modified":"2026-06-30T18:39:56.521399+08:00"},{"id":"0c0ca507fcaf2164af19adf77eaf72e8","path":"backend/src/validators/ota.js","line_range":"1-36","gmt_create":"2026-06-30T18:39:56.523127+08:00","gmt_modified":"2026-06-30T18:39:56.523127+08:00"},{"id":"420851439a300cff8b7fa324589ce87a","path":"backend/src/validators/blacklist.js","line_range":"1-14","gmt_create":"2026-06-30T18:39:56.52326+08:00","gmt_modified":"2026-06-30T18:39:56.52326+08:00"},{"id":"e92ce9787ed66ea4dd0821e0c8f28d8a","path":"backend/src/validators/otaTargetDevice.js","line_range":"1-14","gmt_create":"2026-06-30T18:39:56.523384+08:00","gmt_modified":"2026-06-30T18:39:56.523384+08:00"},{"id":"0696a947e8ffd03fd403809f77673c55","path":"backend/src/routes/ota.js","line_range":"24-66","gmt_create":"2026-06-30T18:39:56.523678+08:00","gmt_modified":"2026-06-30T18:39:56.523678+08:00"},{"id":"0f5328f2be7159ab2f533662f8992b10","path":"frontend/src/views/ota/index.vue","line_range":"384-412","gmt_create":"2026-06-30T18:39:56.524074+08:00","gmt_modified":"2026-06-30T18:39:56.524075+08:00"},{"id":"b6918b1988464553531aec983ea27b7d","path":"backend/src/models/BlackList.js","line_range":"5-32","gmt_create":"2026-06-30T18:39:56.524325+08:00","gmt_modified":"2026-06-30T18:39:56.524326+08:00"},{"id":"59e0c0eb304ea8fbb7145bc038c8fdf6","path":"backend/src/models/OtaTargetDevice.js","line_range":"5-33","gmt_create":"2026-06-30T18:39:56.524448+08:00","gmt_modified":"2026-06-30T18:39:56.524448+08:00"},{"id":"0991eb53c8fe806cf46decab5e748f75","path":"backend/src/services/otaStorage.js","line_range":"72-103","gmt_create":"2026-06-30T18:39:56.525119+08:00","gmt_modified":"2026-06-30T18:39:56.525119+08:00"},{"id":"a826e77f133d3db11e600f30b88f4e9a","path":"backend/src/validators/ota.js","line_range":"3-35","gmt_create":"2026-06-30T18:39:56.525629+08:00","gmt_modified":"2026-06-30T18:39:56.525629+08:00"},{"id":"4a33d32c1578fd612d900aa17246d8c2","path":"backend/src/validators/blacklist.js","line_range":"3-11","gmt_create":"2026-06-30T18:39:56.525734+08:00","gmt_modified":"2026-06-30T18:39:56.525734+08:00"},{"id":"4660c7ce6daeb3f765d39856dcf95f6f","path":"backend/src/validators/otaTargetDevice.js","line_range":"3-11","gmt_create":"2026-06-30T18:39:56.525836+08:00","gmt_modified":"2026-06-30T18:39:56.525836+08:00"},{"id":"7467dc2e2d22c93c63fa6342b2e08541","path":"frontend/src/views/ota/index.vue","line_range":"420-579","gmt_create":"2026-06-30T18:39:56.526564+08:00","gmt_modified":"2026-06-30T18:39:56.526564+08:00"},{"id":"4b5baf2b8dcd8468722cd31868c794b2","path":"frontend/src/views/ota/index.vue","line_range":"645-683","gmt_create":"2026-06-30T18:39:56.526669+08:00","gmt_modified":"2026-06-30T18:39:56.526669+08:00"},{"id":"20e79ab592f63eb9d23c0d563d5f5202","path":"backend/src/routes/blacklist.js","line_range":"16-71","gmt_create":"2026-06-30T18:39:56.527902+08:00","gmt_modified":"2026-06-30T18:39:56.527902+08:00"},{"id":"07afcaa71195b3d86386dcde14973a8d","path":"backend/src/routes/blacklist.js","line_range":"96-131","gmt_create":"2026-06-30T18:39:56.527997+08:00","gmt_modified":"2026-06-30T18:39:56.527997+08:00"},{"id":"2a5364613dbf0723f2e2a64affabb065","path":"frontend/src/views/blacklist/index.vue","line_range":"144-346","gmt_create":"2026-06-30T18:39:56.528097+08:00","gmt_modified":"2026-06-30T18:39:56.528097+08:00"},{"id":"12ad7a8b54f39c0717843220f341d59e","path":"backend/src/routes/otaTargetDevice.js","line_range":"16-71","gmt_create":"2026-06-30T18:39:56.528805+08:00","gmt_modified":"2026-06-30T18:39:56.528805+08:00"},{"id":"585261a6626a815d8f5f83b91a086eb9","path":"frontend/src/views/ota-target-device/index.vue","line_range":"144-351","gmt_create":"2026-06-30T18:39:56.529026+08:00","gmt_modified":"2026-06-30T18:39:56.529026+08:00"},{"id":"2a0437737a8daf4655f00caae7549a06","path":"backend/package.json","line_range":"11-24","gmt_create":"2026-06-30T18:39:56.529846+08:00","gmt_modified":"2026-06-30T18:39:56.529846+08:00"},{"id":"f0cfbce84fd69ea625e215367d5da707","path":"backend/package.json","line_range":"1-29","gmt_create":"2026-06-30T18:39:56.529954+08:00","gmt_modified":"2026-06-30T18:39:56.529954+08:00"},{"id":"fad5c52b0517044faace96133c6e570c","path":"backend/src/routes/ota.js","line_range":"174-181","gmt_create":"2026-06-30T18:39:56.530168+08:00","gmt_modified":"2026-06-30T18:39:56.530168+08:00"},{"id":"f62834891fb8675fbb1dcb6654b186e9","path":"backend/src/services/otaStorage.js","line_range":"95-98","gmt_create":"2026-06-30T18:39:56.530261+08:00","gmt_modified":"2026-06-30T18:39:56.530261+08:00"},{"id":"0c387969b601239a31cb0c672ef3c116","path":"backend/src/routes/blacklist.js","line_range":"108-112","gmt_create":"2026-06-30T18:39:56.530365+08:00","gmt_modified":"2026-06-30T18:39:56.530365+08:00"},{"id":"406e308cbdb4112d67f61a82a8118e9f","path":"backend/src/routes/otaTargetDevice.js","line_range":"108-112","gmt_create":"2026-06-30T18:39:56.530464+08:00","gmt_modified":"2026-06-30T18:39:56.530464+08:00"},{"id":"5d1069f11e2153ac8cd75f26c10256a2","path":"backend/src/routes/models.js","line_range":"1-659","gmt_create":"2026-07-01T17:22:10.342072+08:00","gmt_modified":"2026-07-01T17:22:10.342072+08:00"},{"id":"024c49b177309c95a9a6487c0c70ff28","path":"backend/src/models/Model.js","line_range":"1-53","gmt_create":"2026-07-01T17:22:10.342533+08:00","gmt_modified":"2026-07-01T17:22:10.342533+08:00"},{"id":"ed0beaf535b1c935f72da53c93cefd99","path":"backend/src/validators/model.js","line_range":"1-22","gmt_create":"2026-07-01T17:22:10.342848+08:00","gmt_modified":"2026-07-01T17:22:10.342848+08:00"},{"id":"b4d5cb8d79f05ea0bc1f56f20380f226","path":"backend/src/middleware/auth.js","line_range":"1-36","gmt_create":"2026-07-01T17:22:10.343354+08:00","gmt_modified":"2026-07-01T17:22:10.343354+08:00"},{"id":"d71cf669f581f1e2e6b7956768cf07e5","path":"frontend/src/api/model.js","line_range":"1-165","gmt_create":"2026-07-01T17:22:10.343696+08:00","gmt_modified":"2026-07-01T17:22:10.343696+08:00"},{"id":"2f44ab11354520681821b18c70b28ea5","path":"backend/src/services/squiglink.js","line_range":"1-322","gmt_create":"2026-07-01T17:22:10.344219+08:00","gmt_modified":"2026-07-01T17:22:10.344219+08:00"},{"id":"dfde97c120aa759be08496d7a1217bb5","path":"frontend/src/views/model/components/ModelFormDialog.vue","line_range":"1-555","gmt_create":"2026-07-01T17:22:10.344388+08:00","gmt_modified":"2026-07-01T17:22:10.344388+08:00"},{"id":"8ff91c81b391966d61e25fb150388eda","path":"backend/src/routes/models.js","line_range":"133-181","gmt_create":"2026-07-01T17:22:10.34633+08:00","gmt_modified":"2026-07-01T17:22:10.34633+08:00"},{"id":"f84073b86f81ac8811492a2bdf880f16","path":"backend/src/models/Model.js","line_range":"4-50","gmt_create":"2026-07-01T17:22:10.346534+08:00","gmt_modified":"2026-07-01T17:22:10.346534+08:00"},{"id":"9e84158ca8a0ddb6b5e5b73eb1bbe846","path":"backend/src/validators/model.js","line_range":"3-19","gmt_create":"2026-07-01T17:22:10.346772+08:00","gmt_modified":"2026-07-01T17:22:10.346772+08:00"},{"id":"5a517afeab7c85f15e321f8de509c92e","path":"backend/src/middleware/auth.js","line_range":"3-26","gmt_create":"2026-07-01T17:22:10.34715+08:00","gmt_modified":"2026-07-01T17:22:10.34715+08:00"},{"id":"61cdcff725a5d9f851c84d3976b11ad9","path":"frontend/src/api/model.js","line_range":"13-165","gmt_create":"2026-07-01T17:22:10.347537+08:00","gmt_modified":"2026-07-01T17:22:10.347537+08:00"},{"id":"242fa36bc833a990fae50c7bb09ed4e1","path":"frontend/src/views/model/components/ModelFormDialog.vue","line_range":"158-464","gmt_create":"2026-07-01T17:22:10.347891+08:00","gmt_modified":"2026-07-01T17:22:10.347891+08:00"},{"id":"198c9bc987125a8c495d5f4f4c719320","path":"backend/src/routes/models.js","line_range":"307-369","gmt_create":"2026-07-01T17:22:10.348046+08:00","gmt_modified":"2026-07-01T17:22:10.348046+08:00"},{"id":"00a6cc74394f2292cdbdb135e0050bfd","path":"backend/src/services/squiglink.js","line_range":"261-310","gmt_create":"2026-07-01T17:22:10.348542+08:00","gmt_modified":"2026-07-01T17:22:10.348542+08:00"},{"id":"cbc5a1c920943391c4b4c7dbb4969e02","path":"backend/src/routes/models.js","line_range":"280-304","gmt_create":"2026-07-01T17:22:10.350467+08:00","gmt_modified":"2026-07-01T17:22:10.350467+08:00"},{"id":"0e96d580b4b0d85ad3a0856f9ced77c5","path":"backend/src/routes/models.js","line_range":"371-437","gmt_create":"2026-07-01T17:22:10.351067+08:00","gmt_modified":"2026-07-01T17:22:10.351067+08:00"},{"id":"64d9a6b9e0dbb15b4433b936b9d9b682","path":"backend/src/validators/model.js","line_range":"3-10","gmt_create":"2026-07-01T17:22:10.351242+08:00","gmt_modified":"2026-07-01T17:22:10.351242+08:00"},{"id":"534ccf5ed9895fd2357c6072d2c32641","path":"backend/src/routes/models.js","line_range":"439-526","gmt_create":"2026-07-01T17:22:10.351714+08:00","gmt_modified":"2026-07-01T17:22:10.351714+08:00"},{"id":"1403db1a8eb57f752df3491c038670b7","path":"backend/src/validators/model.js","line_range":"12-19","gmt_create":"2026-07-01T17:22:10.351852+08:00","gmt_modified":"2026-07-01T17:22:10.351852+08:00"},{"id":"e19c5be696ebceb651e9886682335c3f","path":"backend/src/routes/models.js","line_range":"528-554","gmt_create":"2026-07-01T17:22:10.352321+08:00","gmt_modified":"2026-07-01T17:22:10.352321+08:00"},{"id":"fd1c352115895c20befbd57b21dafffd","path":"backend/src/routes/models.js","line_range":"136-157","gmt_create":"2026-07-01T17:22:10.352801+08:00","gmt_modified":"2026-07-01T17:22:10.352801+08:00"},{"id":"a4a868fe5625e468464edb2a81e0ed65","path":"backend/src/models/Ota.js","line_range":"44-48","gmt_create":"2026-07-01T17:22:10.353108+08:00","gmt_modified":"2026-07-01T17:22:10.353108+08:00"},{"id":"9bfda1a77caaecb96fe646e1a5c4e657","path":"backend/src/routes/models.js","line_range":"556-656","gmt_create":"2026-07-01T17:22:10.353419+08:00","gmt_modified":"2026-07-01T17:22:10.353419+08:00"},{"id":"d204119d78e9a20507f2e6eb59c81b14","path":"backend/src/routes/models.js","line_range":"246-278","gmt_create":"2026-07-01T17:22:10.353724+08:00","gmt_modified":"2026-07-01T17:22:10.353724+08:00"},{"id":"6e56ed4dbe173e0e7ce80c50d006cb83","path":"backend/src/routes/models.js","line_range":"183-244","gmt_create":"2026-07-01T17:22:10.353858+08:00","gmt_modified":"2026-07-01T17:22:10.353858+08:00"},{"id":"12f724b0903cc7296821075f94c9dea7","path":"backend/src/routes/models.js","line_range":"314-317","gmt_create":"2026-07-01T17:22:10.355774+08:00","gmt_modified":"2026-07-01T17:22:10.355774+08:00"},{"id":"07839d356726d441504dc3560722db44","path":"backend/src/routes/models.js","line_range":"322-325","gmt_create":"2026-07-01T17:22:10.356108+08:00","gmt_modified":"2026-07-01T17:22:10.356109+08:00"},{"id":"0dbf7e568890732ca55dfc5752a318a6","path":"backend/src/routes/models.js","line_range":"450-455","gmt_create":"2026-07-01T17:22:10.356297+08:00","gmt_modified":"2026-07-01T17:22:10.356297+08:00"},{"id":"81ee91090f768174f1659cd02a399b89","path":"backend/src/services/squiglink.js","line_range":"33-47","gmt_create":"2026-07-01T17:22:10.356502+08:00","gmt_modified":"2026-07-01T17:22:10.356502+08:00"},{"id":"09fd0e7623c9b52e7f95307aba3cdebf","path":"frontend/src/views/model/index.vue","line_range":"1-533","gmt_create":"2026-07-01T17:22:40.376442+08:00","gmt_modified":"2026-07-01T17:22:40.376442+08:00"},{"id":"b336306edfffe78cac04ddcd9b87bee3","path":"frontend/src/views/model/composables/useModelList.js","line_range":"1-191","gmt_create":"2026-07-01T17:22:40.376544+08:00","gmt_modified":"2026-07-01T17:22:40.376545+08:00"},{"id":"bd284e26c3e22bbca32421b5f77648ef","path":"frontend/src/views/model/components/CsvViewerDialog.vue","line_range":"1-50","gmt_create":"2026-07-01T17:22:40.376769+08:00","gmt_modified":"2026-07-01T17:22:40.376769+08:00"},{"id":"2046b9f43ac9963df7a7ca533f925569","path":"frontend/src/views/model/components/EqCacheDialog.vue","line_range":"1-306","gmt_create":"2026-07-01T17:22:40.376869+08:00","gmt_modified":"2026-07-01T17:22:40.376869+08:00"},{"id":"779a4d88246e9e5a241ae01c15f899ab","path":"frontend/src/views/model/components/PushProgressDialog.vue","line_range":"1-303","gmt_create":"2026-07-01T17:22:40.376999+08:00","gmt_modified":"2026-07-01T17:22:40.376999+08:00"},{"id":"bbf439d580ed3a878deb4fd7de944a94","path":"frontend/src/views/model/components/PushViewDialog.vue","line_range":"1-60","gmt_create":"2026-07-01T17:22:40.377097+08:00","gmt_modified":"2026-07-01T17:22:40.377097+08:00"},{"id":"fc4fba8eb72f3b41fef570b38f6dfefe","path":"frontend/src/views/model/index.vue","line_range":"227-434","gmt_create":"2026-07-01T17:22:40.37845+08:00","gmt_modified":"2026-07-01T17:22:40.37845+08:00"},{"id":"c0a672fcaa00c517fd9ea3d997173397","path":"frontend/src/views/model/composables/useModelList.js","line_range":"31-191","gmt_create":"2026-07-01T17:22:40.378563+08:00","gmt_modified":"2026-07-01T17:22:40.378563+08:00"},{"id":"d16b984e320d42203d368669cfe2382b","path":"frontend/src/api/model.js","line_range":"157-165","gmt_create":"2026-07-01T17:22:40.378803+08:00","gmt_modified":"2026-07-01T17:22:40.378803+08:00"},{"id":"c6701de4962c3a2734181c3f0e1b78f6","path":"backend/src/routes/models.js","line_range":"307-499","gmt_create":"2026-07-01T17:22:40.379698+08:00","gmt_modified":"2026-07-01T17:22:40.379698+08:00"},{"id":"47737e52532225879b5095908c4b0039","path":"frontend/src/views/model/components/ModelFormDialog.vue","line_range":"196-214","gmt_create":"2026-07-01T17:22:40.380708+08:00","gmt_modified":"2026-07-01T17:22:40.380708+08:00"},{"id":"1a50c2ac7c5e4e096904af2e683b5ec7","path":"backend/src/models/Brand.js","line_range":"1-23","gmt_create":"2026-07-01T17:22:40.380815+08:00","gmt_modified":"2026-07-01T17:22:40.380815+08:00"},{"id":"ae9b4c727fe0313173a4bcea57fef546","path":"backend/src/routes/brands.js","line_range":"1-147","gmt_create":"2026-07-01T17:22:40.38095+08:00","gmt_modified":"2026-07-01T17:22:40.38095+08:00"},{"id":"35d43a834ee00c7ae341f64ea7306dcd","path":"frontend/src/views/model/composables/useModelList.js","line_range":"18-27","gmt_create":"2026-07-01T17:22:40.381054+08:00","gmt_modified":"2026-07-01T17:22:40.381054+08:00"},{"id":"bab25856d9ae1e6dcc3c9df2c6461ca5","path":"frontend/src/views/model/composables/useModelList.js","line_range":"87-111","gmt_create":"2026-07-01T17:22:40.381163+08:00","gmt_modified":"2026-07-01T17:22:40.381163+08:00"},{"id":"7fdad247ff48969f27ee8d30e3ba5b65","path":"frontend/src/views/model/index.vue","line_range":"402-428","gmt_create":"2026-07-01T17:22:40.381395+08:00","gmt_modified":"2026-07-01T17:22:40.381395+08:00"},{"id":"80992fa9ba0696155e1f48200125fba9","path":"frontend/src/views/model/components/PushProgressDialog.vue","line_range":"117-195","gmt_create":"2026-07-01T17:22:40.381504+08:00","gmt_modified":"2026-07-01T17:22:40.381504+08:00"},{"id":"c72d4a5b5b663d05ac8229b5b4c69991","path":"frontend/src/api/model.js","line_range":"128-150","gmt_create":"2026-07-01T17:22:40.381611+08:00","gmt_modified":"2026-07-01T17:22:40.381612+08:00"},{"id":"84d41a039a6a9937d7d02c54a5e72751","path":"backend/src/routes/models.js","line_range":"466-566","gmt_create":"2026-07-01T17:22:40.381721+08:00","gmt_modified":"2026-07-01T17:22:40.381721+08:00"},{"id":"ddaccee59b978ba3a64b134b57255142","path":"backend/src/routes/models.js","line_range":"59-68","gmt_create":"2026-07-01T17:22:40.382223+08:00","gmt_modified":"2026-07-01T17:22:40.382223+08:00"},{"id":"ddabd54034f5691c635f64015008129b","path":"backend/src/services/measurementStorage.js","line_range":"48-108","gmt_create":"2026-07-01T17:22:40.382335+08:00","gmt_modified":"2026-07-01T17:22:40.382335+08:00"},{"id":"dfbdd0655d2d61b5105701e421492cb1","path":"backend/src/services/eqCacheStorage.js","line_range":"24-66","gmt_create":"2026-07-01T17:22:40.382567+08:00","gmt_modified":"2026-07-01T17:22:40.382567+08:00"},{"id":"f80a45c0052388537b0d6844b2c9e8e3","path":"frontend/src/views/model/components/ModelFormDialog.vue","line_range":"233-265","gmt_create":"2026-07-01T17:22:40.382803+08:00","gmt_modified":"2026-07-01T17:22:40.382803+08:00"},{"id":"4f76bc7594c6e53c87d2b21c18e1593a","path":"backend/src/services/squiglink.js","line_range":"33-48","gmt_create":"2026-07-01T17:22:40.384083+08:00","gmt_modified":"2026-07-01T17:22:40.384083+08:00"},{"id":"dc3af50d3fc111fa0921b37470c23966","path":"frontend/src/utils/request.js","line_range":"27-69","gmt_create":"2026-07-01T17:22:40.384193+08:00","gmt_modified":"2026-07-01T17:22:40.384193+08:00"},{"id":"ee7461b868a07b5f3e3636d8001b1089","path":"backend/src/routes/brands.js","line_range":"59-81","gmt_create":"2026-07-01T17:22:40.384296+08:00","gmt_modified":"2026-07-01T17:22:40.384296+08:00"},{"id":"5913b9dcd61bbee07d5a150062d40315","path":"backend/src/routes/models.js","line_range":"371-499","gmt_create":"2026-07-01T17:22:40.3844+08:00","gmt_modified":"2026-07-01T17:22:40.3844+08:00"},{"id":"d620d05fda07f9cbe1556d0f76a8153f","path":"backend/src/services/measurementStorage.js","line_range":"87-108","gmt_create":"2026-07-01T17:22:40.384504+08:00","gmt_modified":"2026-07-01T17:22:40.384504+08:00"},{"id":"f1abdfd8be7fea194c1ce39bf66c78e3","path":"backend/src/services/eqCacheStorage.js","line_range":"47-66","gmt_create":"2026-07-01T17:22:40.38461+08:00","gmt_modified":"2026-07-01T17:22:40.38461+08:00"},{"id":"e87b014e53bbb73ea5bbd7b6fedb1ee0","path":"frontend/src/api/brand.js","line_range":"1-66","gmt_create":"2026-07-01T17:22:40.384977+08:00","gmt_modified":"2026-07-01T17:22:40.384977+08:00"},{"id":"6568412fa665c4b795868c6e9875778f","path":"backend/src/routes/models.js","line_range":"133-659","gmt_create":"2026-07-01T17:22:40.385185+08:00","gmt_modified":"2026-07-01T17:22:40.385185+08:00"},{"id":"8012c36338dce0daecc34c940e5fc443","path":"backend/src/routes/brands.js","line_range":"14-147","gmt_create":"2026-07-01T17:22:40.385291+08:00","gmt_modified":"2026-07-01T17:22:40.385291+08:00"},{"id":"941d6ec9925d0313ebdac30637d5e7de","path":"frontend/src/views/model/index.vue","line_range":"1-1226","gmt_create":"2026-07-01T17:22:44.384106+08:00","gmt_modified":"2026-07-01T17:22:44.384106+08:00"},{"id":"186655fbb53a1180e274c0a224e447ec","path":"backend/src/services/measurementStorage.js","line_range":"1-115","gmt_create":"2026-07-01T17:22:44.38516+08:00","gmt_modified":"2026-07-01T17:22:44.38516+08:00"},{"id":"7098281c5dbbd726581ec631c48cb7ff","path":"backend/src/services/eqCacheStorage.js","line_range":"1-73","gmt_create":"2026-07-01T17:22:44.385385+08:00","gmt_modified":"2026-07-01T17:22:44.385385+08:00"},{"id":"ff3c31b3cf3083faac2e9d22bd1046dc","path":"backend/src/services/curveClient.js","line_range":"1-147","gmt_create":"2026-07-01T17:22:44.385554+08:00","gmt_modified":"2026-07-01T17:22:44.385554+08:00"},{"id":"3ea5cb6fe4688701d6312a31ea523b18","path":"backend/src/services/measurementStorage.js","line_range":"61-108","gmt_create":"2026-07-01T17:22:44.389823+08:00","gmt_modified":"2026-07-01T17:22:44.389823+08:00"},{"id":"c777cf18a4b1f608a14488db3258817d","path":"backend/src/services/curveClient.js","line_range":"81-138","gmt_create":"2026-07-01T17:22:44.390218+08:00","gmt_modified":"2026-07-01T17:22:44.390219+08:00"},{"id":"4169091aeab80fcee72321116328a8b2","path":"frontend/src/views/model/index.vue","line_range":"714-1063","gmt_create":"2026-07-01T17:22:44.39038+08:00","gmt_modified":"2026-07-01T17:22:44.39038+08:00"},{"id":"6eacbd3b5ec60fff27a96a9101159648","path":"frontend/src/views/model/index.vue","line_range":"226-250","gmt_create":"2026-07-01T17:22:44.391757+08:00","gmt_modified":"2026-07-01T17:22:44.391757+08:00"},{"id":"56d7be38c99608e1cf9141127c60a1bd","path":"backend/src/routes/models.js","line_range":"307-335","gmt_create":"2026-07-01T17:22:44.392035+08:00","gmt_modified":"2026-07-01T17:22:44.392035+08:00"},{"id":"c571c3ca3eb98348a89378f8d58ffa5c","path":"backend/src/services/measurementStorage.js","line_range":"48-79","gmt_create":"2026-07-01T17:22:44.392163+08:00","gmt_modified":"2026-07-01T17:22:44.392163+08:00"},{"id":"6d9ac3485459b97d549f73fa18ea4efe","path":"backend/src/routes/models.js","line_range":"183-278","gmt_create":"2026-07-01T17:22:44.392771+08:00","gmt_modified":"2026-07-01T17:22:44.392772+08:00"},{"id":"e1a454e430f59ec87fc68cffc768037a","path":"backend/src/routes/models.js","line_range":"466-514","gmt_create":"2026-07-01T17:22:44.393206+08:00","gmt_modified":"2026-07-01T17:22:44.393206+08:00"},{"id":"907380346a61a6c644cdaefa5165c9bd","path":"backend/src/routes/models.js","line_range":"516-566","gmt_create":"2026-07-01T17:22:44.393329+08:00","gmt_modified":"2026-07-01T17:22:44.393329+08:00"},{"id":"17a4406c6c25ec6cdfd2d8ffe0b73e9c","path":"frontend/src/views/model/index.vue","line_range":"1117-1220","gmt_create":"2026-07-01T17:22:44.393603+08:00","gmt_modified":"2026-07-01T17:22:44.393603+08:00"},{"id":"726a6f97e2aeafee47b271e07e8bab86","path":"backend/src/services/squiglink.js","line_range":"148-207","gmt_create":"2026-07-01T17:22:44.40202+08:00","gmt_modified":"2026-07-01T17:22:44.40202+08:00"},{"id":"7257d8ea1f17cf7e6ffde19988e437dc","path":"backend/src/services/squiglink.js","line_range":"216-247","gmt_create":"2026-07-01T17:22:44.402185+08:00","gmt_modified":"2026-07-01T17:22:44.402185+08:00"},{"id":"c27046a2ebb06326e9d6b99eed8a9d94","path":"frontend/src/views/model/components/ModelFormDialog.vue","line_range":"16-46","gmt_create":"2026-07-01T17:22:44.40259+08:00","gmt_modified":"2026-07-01T17:22:44.40259+08:00"},{"id":"e83b1d21fe3ccb7ac2f4d82bb148bc78","path":"frontend/src/views/model/components/ModelFormDialog.vue","line_range":"289-332","gmt_create":"2026-07-01T17:22:44.402715+08:00","gmt_modified":"2026-07-01T17:22:44.402715+08:00"},{"id":"e8dde18df2307dc1b7b00c3e9546ed83","path":"frontend/src/api/model.js","line_range":"152-165","gmt_create":"2026-07-01T17:22:44.402831+08:00","gmt_modified":"2026-07-01T17:22:44.402831+08:00"},{"id":"d18e23566fd59e80c9f7eec016ef89ab","path":"backend/src/routes/models.js","line_range":"312-317","gmt_create":"2026-07-01T17:22:44.406038+08:00","gmt_modified":"2026-07-01T17:22:44.406038+08:00"},{"id":"bc3c55f1edd18bca0da26fb9aa065f87","path":"backend/src/routes/models.js","line_range":"320-325","gmt_create":"2026-07-01T17:22:44.406138+08:00","gmt_modified":"2026-07-01T17:22:44.406138+08:00"},{"id":"e358b7cff088dfd34df41cc908c799c8","path":"backend/src/routes/models.js","line_range":"255-258","gmt_create":"2026-07-01T17:22:44.406249+08:00","gmt_modified":"2026-07-01T17:22:44.40625+08:00"}],"knowledge_relations":[{"id":2781,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"6b28e060-0be3-411e-8a94-3777d165d10e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e 6b28e060-0be3-411e-8a94-3777d165d10e","gmt_create":"2026-06-30T14:40:47.271887+08:00","gmt_modified":"2026-06-30T14:40:47.271887+08:00"},{"id":2782,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"941d72b1-8daa-4c53-bfeb-9a0b2aa0f43c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e 941d72b1-8daa-4c53-bfeb-9a0b2aa0f43c","gmt_create":"2026-06-30T14:40:47.272516+08:00","gmt_modified":"2026-06-30T14:40:47.272516+08:00"},{"id":2783,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"c6f2cb24-ff10-4ae7-87c2-b23b9bbee033","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e c6f2cb24-ff10-4ae7-87c2-b23b9bbee033","gmt_create":"2026-06-30T14:40:47.272798+08:00","gmt_modified":"2026-06-30T14:40:47.272798+08:00"},{"id":2784,"source_id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","target_id":"4619dc3e-419f-435b-ba7c-e600e188743a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2b5fd78d-2407-4ccc-8807-9bb05c0a687e -\u003e 4619dc3e-419f-435b-ba7c-e600e188743a","gmt_create":"2026-06-30T14:40:47.272953+08:00","gmt_modified":"2026-06-30T14:40:47.272953+08:00"},{"id":2785,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"7f894188-cf72-40a2-af95-f13ef3dd1f6e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 7f894188-cf72-40a2-af95-f13ef3dd1f6e","gmt_create":"2026-06-30T14:40:47.273394+08:00","gmt_modified":"2026-06-30T14:40:47.273394+08:00"},{"id":2786,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"b66da3f2-6889-45dc-a824-2591d2f5f0f3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e b66da3f2-6889-45dc-a824-2591d2f5f0f3","gmt_create":"2026-06-30T14:40:47.273688+08:00","gmt_modified":"2026-06-30T14:40:47.273688+08:00"},{"id":2788,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"be7e1733-8c9e-4849-99b0-bab40fdf271e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e be7e1733-8c9e-4849-99b0-bab40fdf271e","gmt_create":"2026-06-30T14:40:47.274328+08:00","gmt_modified":"2026-06-30T14:40:47.274328+08:00"},{"id":2789,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"8f464fc9-6537-45fa-a0dd-eacdf742b5a1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 8f464fc9-6537-45fa-a0dd-eacdf742b5a1","gmt_create":"2026-06-30T14:40:47.274458+08:00","gmt_modified":"2026-06-30T14:40:47.274458+08:00"},{"id":2790,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"77bc73e0-8709-4209-96e0-5522f9356b06","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 77bc73e0-8709-4209-96e0-5522f9356b06","gmt_create":"2026-06-30T14:40:47.274632+08:00","gmt_modified":"2026-06-30T14:40:47.274632+08:00"},{"id":2791,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"799ec9fc-088e-456c-8f93-72516adac3ac","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 799ec9fc-088e-456c-8f93-72516adac3ac","gmt_create":"2026-06-30T14:40:47.274784+08:00","gmt_modified":"2026-06-30T14:40:47.274784+08:00"},{"id":2792,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"0efcac71-9db4-49c9-a660-690dcb97cd54","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e 0efcac71-9db4-49c9-a660-690dcb97cd54","gmt_create":"2026-06-30T14:40:47.275136+08:00","gmt_modified":"2026-06-30T14:40:47.275136+08:00"},{"id":2793,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"ef11f60f-47aa-41bf-8884-6d51bc9ae8ef","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e ef11f60f-47aa-41bf-8884-6d51bc9ae8ef","gmt_create":"2026-06-30T14:40:47.275339+08:00","gmt_modified":"2026-06-30T14:40:47.275339+08:00"},{"id":2794,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"edd1d813-70d4-49de-9f9e-e3ebf7a68678","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e edd1d813-70d4-49de-9f9e-e3ebf7a68678","gmt_create":"2026-06-30T14:40:47.27546+08:00","gmt_modified":"2026-06-30T14:40:47.27546+08:00"},{"id":2795,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"b2376dbd-002b-4469-8e6e-71748e46e7c2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e b2376dbd-002b-4469-8e6e-71748e46e7c2","gmt_create":"2026-06-30T14:40:47.275789+08:00","gmt_modified":"2026-06-30T14:40:47.275789+08:00"},{"id":2796,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"b5718a44-f452-496d-83c3-4e89b844c709","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e b5718a44-f452-496d-83c3-4e89b844c709","gmt_create":"2026-06-30T14:40:47.276097+08:00","gmt_modified":"2026-06-30T14:40:47.276097+08:00"},{"id":2797,"source_id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","target_id":"539729a8-aa4b-40c6-bf3b-ec9f467f7717","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 4553d9a4-e0e6-4bc3-b285-ecc6df9dc822 -\u003e 539729a8-aa4b-40c6-bf3b-ec9f467f7717","gmt_create":"2026-06-30T14:40:47.276606+08:00","gmt_modified":"2026-06-30T14:40:47.276606+08:00"},{"id":2798,"source_id":"ed153077-3827-4586-8838-812707189c14","target_id":"b6857b45-a960-4168-92dd-1edcf6567e47","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ed153077-3827-4586-8838-812707189c14 -\u003e b6857b45-a960-4168-92dd-1edcf6567e47","gmt_create":"2026-06-30T14:40:47.277101+08:00","gmt_modified":"2026-06-30T14:40:47.277101+08:00"},{"id":2799,"source_id":"ed153077-3827-4586-8838-812707189c14","target_id":"2971fa4f-335a-4294-9668-0967b9047d66","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ed153077-3827-4586-8838-812707189c14 -\u003e 2971fa4f-335a-4294-9668-0967b9047d66","gmt_create":"2026-06-30T14:40:47.277268+08:00","gmt_modified":"2026-06-30T14:40:47.277268+08:00"},{"id":2800,"source_id":"ed153077-3827-4586-8838-812707189c14","target_id":"f0978b42-6f98-470e-922f-22dec2fac24d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ed153077-3827-4586-8838-812707189c14 -\u003e f0978b42-6f98-470e-922f-22dec2fac24d","gmt_create":"2026-06-30T14:40:47.277627+08:00","gmt_modified":"2026-06-30T14:40:47.277627+08:00"},{"id":2801,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"5ab55e3b-04bc-4e92-93f7-52bec7ad8dde","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e 5ab55e3b-04bc-4e92-93f7-52bec7ad8dde","gmt_create":"2026-06-30T14:40:47.277787+08:00","gmt_modified":"2026-06-30T14:40:47.277787+08:00"},{"id":2802,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"62bcda0f-7c78-4109-9649-58bbf9fd68ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e 62bcda0f-7c78-4109-9649-58bbf9fd68ae","gmt_create":"2026-06-30T14:40:47.27822+08:00","gmt_modified":"2026-06-30T14:40:47.27822+08:00"},{"id":2803,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"86f882d7-9e64-4c38-85e7-4782fd55fed2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e 86f882d7-9e64-4c38-85e7-4782fd55fed2","gmt_create":"2026-06-30T14:40:47.278376+08:00","gmt_modified":"2026-06-30T14:40:47.278376+08:00"},{"id":2804,"source_id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","target_id":"ff04bd0e-99c4-481c-ac8c-3c1a6cae1fb5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c45b2f5f-49f8-4c8d-b489-44b4c6800e99 -\u003e ff04bd0e-99c4-481c-ac8c-3c1a6cae1fb5","gmt_create":"2026-06-30T14:40:47.278503+08:00","gmt_modified":"2026-06-30T14:40:47.278503+08:00"},{"id":2805,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"772c69b5-886e-48f6-bd11-faf8ca2155e8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e 772c69b5-886e-48f6-bd11-faf8ca2155e8","gmt_create":"2026-06-30T14:40:47.278654+08:00","gmt_modified":"2026-06-30T14:40:47.278654+08:00"},{"id":2806,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"babe3ec0-01cb-43c3-93db-7e59cdccce68","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e babe3ec0-01cb-43c3-93db-7e59cdccce68","gmt_create":"2026-06-30T14:40:47.278828+08:00","gmt_modified":"2026-06-30T14:40:47.278828+08:00"},{"id":2809,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"100cbee2-f7a5-4cc9-83a3-900a4aacac7e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e 100cbee2-f7a5-4cc9-83a3-900a4aacac7e","gmt_create":"2026-06-30T14:40:47.279419+08:00","gmt_modified":"2026-06-30T14:40:47.279419+08:00"},{"id":2810,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"cf1f3ceb-e3b1-4d5c-8353-f0ea4345414c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e cf1f3ceb-e3b1-4d5c-8353-f0ea4345414c","gmt_create":"2026-06-30T14:40:47.279584+08:00","gmt_modified":"2026-06-30T14:40:47.279584+08:00"},{"id":2811,"source_id":"2971fa4f-335a-4294-9668-0967b9047d66","target_id":"0e003133-7d1a-4708-8599-fc71707070d6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2971fa4f-335a-4294-9668-0967b9047d66 -\u003e 0e003133-7d1a-4708-8599-fc71707070d6","gmt_create":"2026-06-30T14:40:47.280345+08:00","gmt_modified":"2026-06-30T14:40:47.280346+08:00"},{"id":2812,"source_id":"2971fa4f-335a-4294-9668-0967b9047d66","target_id":"4b6d6abc-bfd2-48a5-9c5e-de89f278f887","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2971fa4f-335a-4294-9668-0967b9047d66 -\u003e 4b6d6abc-bfd2-48a5-9c5e-de89f278f887","gmt_create":"2026-06-30T14:40:47.280628+08:00","gmt_modified":"2026-06-30T14:40:47.280628+08:00"},{"id":2813,"source_id":"2971fa4f-335a-4294-9668-0967b9047d66","target_id":"5b84c784-85d8-46e0-8972-e7816f6bd687","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2971fa4f-335a-4294-9668-0967b9047d66 -\u003e 5b84c784-85d8-46e0-8972-e7816f6bd687","gmt_create":"2026-06-30T14:40:47.280745+08:00","gmt_modified":"2026-06-30T14:40:47.280745+08:00"},{"id":2814,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"ad988472-7d0b-4076-86c8-f14661c5923d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e ad988472-7d0b-4076-86c8-f14661c5923d","gmt_create":"2026-06-30T14:40:47.281057+08:00","gmt_modified":"2026-06-30T14:40:47.281057+08:00"},{"id":2815,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"7eee30c6-7725-456b-8b43-35b5e4df7e99","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 7eee30c6-7725-456b-8b43-35b5e4df7e99","gmt_create":"2026-06-30T14:40:47.281191+08:00","gmt_modified":"2026-06-30T14:40:47.281191+08:00"},{"id":2816,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"791c01a2-dea1-407b-948d-3e2da8cbebed","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 791c01a2-dea1-407b-948d-3e2da8cbebed","gmt_create":"2026-06-30T14:40:47.281365+08:00","gmt_modified":"2026-06-30T14:40:47.281365+08:00"},{"id":2818,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"6003d293-f2aa-4c49-817a-c7fa652890ed","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 6003d293-f2aa-4c49-817a-c7fa652890ed","gmt_create":"2026-06-30T14:40:47.28164+08:00","gmt_modified":"2026-06-30T14:40:47.28164+08:00"},{"id":2820,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"73336201-a22f-4329-afc6-40fb5f00f4f1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 73336201-a22f-4329-afc6-40fb5f00f4f1","gmt_create":"2026-06-30T14:40:47.281894+08:00","gmt_modified":"2026-06-30T14:40:47.281894+08:00"},{"id":3274,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"fc2d0cc85e5f2565c3105cbe0584903a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Ota.js","gmt_create":"2026-06-30T18:39:29.619553+08:00","gmt_modified":"2026-06-30T18:39:29.619553+08:00"},{"id":3275,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ba84445ce5118798ce7d0da4ecb4d5e2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/ota.js","gmt_create":"2026-06-30T18:39:29.62003+08:00","gmt_modified":"2026-06-30T18:39:29.62003+08:00"},{"id":3276,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"a15b46bcf0be7bfbc82e57adca5be630","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/otaStorage.js","gmt_create":"2026-06-30T18:39:29.620188+08:00","gmt_modified":"2026-06-30T18:39:29.620188+08:00"},{"id":3277,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4bb9a8c7ac3763db0746ff90788525b6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/ota/index.vue","gmt_create":"2026-06-30T18:39:29.620355+08:00","gmt_modified":"2026-06-30T18:39:29.620355+08:00"},{"id":3278,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"29e96dbf4d3d8f6e116ec620bbf504ad","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/ota.js","gmt_create":"2026-06-30T18:39:29.620492+08:00","gmt_modified":"2026-06-30T18:39:29.620492+08:00"},{"id":3279,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"5ceb781f55bf90055f3005880d06ee2a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/blacklist.js","gmt_create":"2026-06-30T18:39:29.620631+08:00","gmt_modified":"2026-06-30T18:39:29.620631+08:00"},{"id":3280,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"5973b5959029669ade01898821960785","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.62078+08:00","gmt_modified":"2026-06-30T18:39:29.62078+08:00"},{"id":3281,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"a84967d9d3088fba02de385738e7ca27","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/BlackList.js","gmt_create":"2026-06-30T18:39:29.620917+08:00","gmt_modified":"2026-06-30T18:39:29.620918+08:00"},{"id":3282,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4ca379f147f6f1da710371999e08dc24","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/OtaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.621051+08:00","gmt_modified":"2026-06-30T18:39:29.621051+08:00"},{"id":3283,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"71a563f23b46da0255a6400402bbfa05","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/blacklist.js","gmt_create":"2026-06-30T18:39:29.62129+08:00","gmt_modified":"2026-06-30T18:39:29.62129+08:00"},{"id":3284,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ea6e178b2f0bdcefe2ae8800166453d5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.621469+08:00","gmt_modified":"2026-06-30T18:39:29.621469+08:00"},{"id":3285,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"30f836e18a6bf9cbcf650e5884375a93","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/utils/response.js","gmt_create":"2026-06-30T18:39:29.621631+08:00","gmt_modified":"2026-06-30T18:39:29.621631+08:00"},{"id":3286,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"2a04b070bd67fc5059bb504232687d64","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/config/env.js","gmt_create":"2026-06-30T18:39:29.621776+08:00","gmt_modified":"2026-06-30T18:39:29.621776+08:00"},{"id":3287,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"34fcf7aeb55a9c0224c554fc48545063","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/utils/request.js","gmt_create":"2026-06-30T18:39:29.621971+08:00","gmt_modified":"2026-06-30T18:39:29.621971+08:00"},{"id":3288,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"08b8d17e3c09b326687a7bca6789507a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/router/index.js","gmt_create":"2026-06-30T18:39:29.622133+08:00","gmt_modified":"2026-06-30T18:39:29.622133+08:00"},{"id":3289,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"0c25a991664c34b2b36ce3aeed80f4da","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DEPLOY.md","gmt_create":"2026-06-30T18:39:29.622343+08:00","gmt_modified":"2026-06-30T18:39:29.622343+08:00"},{"id":3290,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"2ba6ee170718db40d0a0c1e0e271ab8c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#1-1003","gmt_create":"2026-06-30T18:39:29.622527+08:00","gmt_modified":"2026-06-30T18:39:29.622528+08:00"},{"id":3291,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"2ba6ee170718db40d0a0c1e0e271ab8c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-1003","gmt_create":"2026-06-30T18:39:29.622724+08:00","gmt_modified":"2026-06-30T18:39:29.622724+08:00"},{"id":3292,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"3e935f654a28968186e9260f2c5035c7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#1-68","gmt_create":"2026-06-30T18:39:29.622902+08:00","gmt_modified":"2026-06-30T18:39:29.622902+08:00"},{"id":3293,"source_id":"29e96dbf4d3d8f6e116ec620bbf504ad","target_id":"3e935f654a28968186e9260f2c5035c7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-68","gmt_create":"2026-06-30T18:39:29.623031+08:00","gmt_modified":"2026-06-30T18:39:29.623031+08:00"},{"id":3294,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"edbb69e747bbcd76dd1bc3a361ebf7c0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/blacklist.js#1-57","gmt_create":"2026-06-30T18:39:29.623251+08:00","gmt_modified":"2026-06-30T18:39:29.623251+08:00"},{"id":3295,"source_id":"5ceb781f55bf90055f3005880d06ee2a","target_id":"edbb69e747bbcd76dd1bc3a361ebf7c0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-06-30T18:39:29.623384+08:00","gmt_modified":"2026-06-30T18:39:29.623384+08:00"},{"id":3296,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4e817a7f3bd90bb9e57c6a2e9009380f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/otaTargetDevice.js#1-57","gmt_create":"2026-06-30T18:39:29.623559+08:00","gmt_modified":"2026-06-30T18:39:29.623559+08:00"},{"id":3297,"source_id":"5973b5959029669ade01898821960785","target_id":"4e817a7f3bd90bb9e57c6a2e9009380f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-06-30T18:39:29.623688+08:00","gmt_modified":"2026-06-30T18:39:29.623688+08:00"},{"id":3298,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"72de55f3f022487777e9ad301c9d942b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#1-223","gmt_create":"2026-06-30T18:39:29.623918+08:00","gmt_modified":"2026-06-30T18:39:29.623918+08:00"},{"id":3299,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"72de55f3f022487777e9ad301c9d942b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-223","gmt_create":"2026-06-30T18:39:29.624048+08:00","gmt_modified":"2026-06-30T18:39:29.624048+08:00"},{"id":3300,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ba9810388706ac5ffb0156f74ada8b88","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#1-248","gmt_create":"2026-06-30T18:39:29.624221+08:00","gmt_modified":"2026-06-30T18:39:29.624221+08:00"},{"id":3301,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"ba9810388706ac5ffb0156f74ada8b88","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-248","gmt_create":"2026-06-30T18:39:29.62434+08:00","gmt_modified":"2026-06-30T18:39:29.62434+08:00"},{"id":3302,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"f3b38dfd34a76e0d2e62a863fca301a8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#420-831","gmt_create":"2026-06-30T18:39:29.625105+08:00","gmt_modified":"2026-06-30T18:39:29.625105+08:00"},{"id":3303,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"f3b38dfd34a76e0d2e62a863fca301a8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 420-831","gmt_create":"2026-06-30T18:39:29.625218+08:00","gmt_modified":"2026-06-30T18:39:29.625218+08:00"},{"id":3304,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"ae7ce676a4f649c15d0490bbb2954cfe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#13-67","gmt_create":"2026-06-30T18:39:29.625427+08:00","gmt_modified":"2026-06-30T18:39:29.625427+08:00"},{"id":3305,"source_id":"29e96dbf4d3d8f6e116ec620bbf504ad","target_id":"ae7ce676a4f649c15d0490bbb2954cfe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-67","gmt_create":"2026-06-30T18:39:29.625541+08:00","gmt_modified":"2026-06-30T18:39:29.625541+08:00"},{"id":3306,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"859ba4011a4720ad0ad431545e144986","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/blacklist.js#12-56","gmt_create":"2026-06-30T18:39:29.625693+08:00","gmt_modified":"2026-06-30T18:39:29.625693+08:00"},{"id":3307,"source_id":"5ceb781f55bf90055f3005880d06ee2a","target_id":"859ba4011a4720ad0ad431545e144986","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-56","gmt_create":"2026-06-30T18:39:29.625828+08:00","gmt_modified":"2026-06-30T18:39:29.625828+08:00"},{"id":3308,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"c910f65a89648ecf30c84b77b136ad70","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/otaTargetDevice.js#12-55","gmt_create":"2026-06-30T18:39:29.625982+08:00","gmt_modified":"2026-06-30T18:39:29.625982+08:00"},{"id":3309,"source_id":"5973b5959029669ade01898821960785","target_id":"c910f65a89648ecf30c84b77b136ad70","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-55","gmt_create":"2026-06-30T18:39:29.626098+08:00","gmt_modified":"2026-06-30T18:39:29.626098+08:00"},{"id":3310,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"c042223cf0aa5b2e59be1747923b4baf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#13-49","gmt_create":"2026-06-30T18:39:29.626374+08:00","gmt_modified":"2026-06-30T18:39:29.626374+08:00"},{"id":3311,"source_id":"29e96dbf4d3d8f6e116ec620bbf504ad","target_id":"c042223cf0aa5b2e59be1747923b4baf","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-49","gmt_create":"2026-06-30T18:39:29.626551+08:00","gmt_modified":"2026-06-30T18:39:29.626551+08:00"},{"id":3312,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"b1e9d90908a2a5e3d545ca0cf2c86769","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#24-268","gmt_create":"2026-06-30T18:39:29.626904+08:00","gmt_modified":"2026-06-30T18:39:29.626904+08:00"},{"id":3313,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"b1e9d90908a2a5e3d545ca0cf2c86769","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-268","gmt_create":"2026-06-30T18:39:29.627017+08:00","gmt_modified":"2026-06-30T18:39:29.627017+08:00"},{"id":3314,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"aae8712924efab58e019d0c963576781","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#96-139","gmt_create":"2026-06-30T18:39:29.627222+08:00","gmt_modified":"2026-06-30T18:39:29.627222+08:00"},{"id":3315,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"aae8712924efab58e019d0c963576781","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-139","gmt_create":"2026-06-30T18:39:29.627488+08:00","gmt_modified":"2026-06-30T18:39:29.627488+08:00"},{"id":3316,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"fb9daf52780951bc4b93f14b1fcfa8f1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#96-139","gmt_create":"2026-06-30T18:39:29.627693+08:00","gmt_modified":"2026-06-30T18:39:29.627693+08:00"},{"id":3317,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"fb9daf52780951bc4b93f14b1fcfa8f1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-139","gmt_create":"2026-06-30T18:39:29.627822+08:00","gmt_modified":"2026-06-30T18:39:29.627822+08:00"},{"id":3318,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"23aa29b61d1387fca0530a0a1e57e27f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#1-292","gmt_create":"2026-06-30T18:39:29.628032+08:00","gmt_modified":"2026-06-30T18:39:29.628032+08:00"},{"id":3319,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"23aa29b61d1387fca0530a0a1e57e27f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-292","gmt_create":"2026-06-30T18:39:29.628183+08:00","gmt_modified":"2026-06-30T18:39:29.628183+08:00"},{"id":3320,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"e6f541a0af8390b3610d1e380a8d3236","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#4-94","gmt_create":"2026-06-30T18:39:29.628646+08:00","gmt_modified":"2026-06-30T18:39:29.628646+08:00"},{"id":3321,"source_id":"fc2d0cc85e5f2565c3105cbe0584903a","target_id":"e6f541a0af8390b3610d1e380a8d3236","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 4-94","gmt_create":"2026-06-30T18:39:29.628773+08:00","gmt_modified":"2026-06-30T18:39:29.628773+08:00"},{"id":3322,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4aad83e3e76ccc16e5b91d801ab1b278","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#5-36","gmt_create":"2026-06-30T18:39:29.628938+08:00","gmt_modified":"2026-06-30T18:39:29.628938+08:00"},{"id":3323,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"4aad83e3e76ccc16e5b91d801ab1b278","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-36","gmt_create":"2026-06-30T18:39:29.629078+08:00","gmt_modified":"2026-06-30T18:39:29.629078+08:00"},{"id":3324,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"54c99704b8bcabdfe63adda9c4392452","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#5-37","gmt_create":"2026-06-30T18:39:29.62924+08:00","gmt_modified":"2026-06-30T18:39:29.62924+08:00"},{"id":3325,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"54c99704b8bcabdfe63adda9c4392452","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-37","gmt_create":"2026-06-30T18:39:29.629354+08:00","gmt_modified":"2026-06-30T18:39:29.629354+08:00"},{"id":3326,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#1-97","gmt_create":"2026-06-30T18:39:29.629506+08:00","gmt_modified":"2026-06-30T18:39:29.629506+08:00"},{"id":3327,"source_id":"fc2d0cc85e5f2565c3105cbe0584903a","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-97","gmt_create":"2026-06-30T18:39:29.629647+08:00","gmt_modified":"2026-06-30T18:39:29.629647+08:00"},{"id":3328,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"058bc5c3e018c854b5cf42905abd45d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#1-36","gmt_create":"2026-06-30T18:39:29.629815+08:00","gmt_modified":"2026-06-30T18:39:29.629815+08:00"},{"id":3329,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"058bc5c3e018c854b5cf42905abd45d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-36","gmt_create":"2026-06-30T18:39:29.629939+08:00","gmt_modified":"2026-06-30T18:39:29.629939+08:00"},{"id":3330,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"3830639d0b7444aa8a1cf3c80d4eef7e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#1-37","gmt_create":"2026-06-30T18:39:29.630118+08:00","gmt_modified":"2026-06-30T18:39:29.630118+08:00"},{"id":3331,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"3830639d0b7444aa8a1cf3c80d4eef7e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-37","gmt_create":"2026-06-30T18:39:29.633252+08:00","gmt_modified":"2026-06-30T18:39:29.633252+08:00"},{"id":3332,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"be497152bcedca75299e4c2521c11859","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#46-103","gmt_create":"2026-06-30T18:39:29.633431+08:00","gmt_modified":"2026-06-30T18:39:29.633431+08:00"},{"id":3333,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"be497152bcedca75299e4c2521c11859","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 46-103","gmt_create":"2026-06-30T18:39:29.633531+08:00","gmt_modified":"2026-06-30T18:39:29.633531+08:00"},{"id":3334,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"af76fcd4277eeb577f573e21de923bbf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/config/env.js#1-13","gmt_create":"2026-06-30T18:39:29.633724+08:00","gmt_modified":"2026-06-30T18:39:29.633724+08:00"},{"id":3335,"source_id":"2a04b070bd67fc5059bb504232687d64","target_id":"af76fcd4277eeb577f573e21de923bbf","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-13","gmt_create":"2026-06-30T18:39:29.633843+08:00","gmt_modified":"2026-06-30T18:39:29.633843+08:00"},{"id":3336,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"b8c21c93e526039c96f1df526ebdcafe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#1-113","gmt_create":"2026-06-30T18:39:29.633998+08:00","gmt_modified":"2026-06-30T18:39:29.633998+08:00"},{"id":3337,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"b8c21c93e526039c96f1df526ebdcafe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-113","gmt_create":"2026-06-30T18:39:29.634119+08:00","gmt_modified":"2026-06-30T18:39:29.634119+08:00"},{"id":3338,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"424dfd038ca84be6195b08d7032a1235","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#68-102","gmt_create":"2026-06-30T18:39:29.634371+08:00","gmt_modified":"2026-06-30T18:39:29.634371+08:00"},{"id":3339,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"424dfd038ca84be6195b08d7032a1235","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 68-102","gmt_create":"2026-06-30T18:39:29.63449+08:00","gmt_modified":"2026-06-30T18:39:29.63449+08:00"},{"id":3340,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"2fc67d9140f7c12759a5188eb6f9b204","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#305-338","gmt_create":"2026-06-30T18:39:29.634627+08:00","gmt_modified":"2026-06-30T18:39:29.634627+08:00"},{"id":3341,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"2fc67d9140f7c12759a5188eb6f9b204","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 305-338","gmt_create":"2026-06-30T18:39:29.634747+08:00","gmt_modified":"2026-06-30T18:39:29.634747+08:00"},{"id":3342,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/utils/response.js#1-25","gmt_create":"2026-06-30T18:39:29.63491+08:00","gmt_modified":"2026-06-30T18:39:29.63491+08:00"},{"id":3343,"source_id":"30f836e18a6bf9cbcf650e5884375a93","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-25","gmt_create":"2026-06-30T18:39:29.635031+08:00","gmt_modified":"2026-06-30T18:39:29.635031+08:00"},{"id":3344,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"cabe1728acba4dab25a86b5788412e46","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#25-66","gmt_create":"2026-06-30T18:39:29.635187+08:00","gmt_modified":"2026-06-30T18:39:29.635187+08:00"},{"id":3345,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"cabe1728acba4dab25a86b5788412e46","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-66","gmt_create":"2026-06-30T18:39:29.635325+08:00","gmt_modified":"2026-06-30T18:39:29.635325+08:00"},{"id":3346,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"45f0756fae3928b75883500a5006f7f0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#645-734","gmt_create":"2026-06-30T18:39:29.635489+08:00","gmt_modified":"2026-06-30T18:39:29.635489+08:00"},{"id":3347,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"45f0756fae3928b75883500a5006f7f0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 645-734","gmt_create":"2026-06-30T18:39:29.635587+08:00","gmt_modified":"2026-06-30T18:39:29.635587+08:00"},{"id":3348,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"f2e521eddcaa25c62a309d5b0af997fa","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#96-204","gmt_create":"2026-06-30T18:39:29.635812+08:00","gmt_modified":"2026-06-30T18:39:29.635812+08:00"},{"id":3349,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"f2e521eddcaa25c62a309d5b0af997fa","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-204","gmt_create":"2026-06-30T18:39:29.635929+08:00","gmt_modified":"2026-06-30T18:39:29.635929+08:00"},{"id":3350,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"6b7ea701575cf98b6ee3431f68ad5649","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#736-817","gmt_create":"2026-06-30T18:39:29.636087+08:00","gmt_modified":"2026-06-30T18:39:29.636087+08:00"},{"id":3351,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"6b7ea701575cf98b6ee3431f68ad5649","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 736-817","gmt_create":"2026-06-30T18:39:29.636205+08:00","gmt_modified":"2026-06-30T18:39:29.636205+08:00"},{"id":3352,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"506ecfb839ed7fb3f4199ade7e4b6a64","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#96-208","gmt_create":"2026-06-30T18:39:29.636418+08:00","gmt_modified":"2026-06-30T18:39:29.636418+08:00"},{"id":3353,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"506ecfb839ed7fb3f4199ade7e4b6a64","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-208","gmt_create":"2026-06-30T18:39:29.636531+08:00","gmt_modified":"2026-06-30T18:39:29.636531+08:00"},{"id":3354,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"7a5ae98472bdc4806472d50e6b88c997","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/utils/request.js#1-72","gmt_create":"2026-06-30T18:39:29.636691+08:00","gmt_modified":"2026-06-30T18:39:29.636691+08:00"},{"id":3355,"source_id":"34fcf7aeb55a9c0224c554fc48545063","target_id":"7a5ae98472bdc4806472d50e6b88c997","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-72","gmt_create":"2026-06-30T18:39:29.636799+08:00","gmt_modified":"2026-06-30T18:39:29.6368+08:00"},{"id":3356,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"69c930f997042246d4e17369ede6f826","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/router/index.js#1-91","gmt_create":"2026-06-30T18:39:29.636927+08:00","gmt_modified":"2026-06-30T18:39:29.636927+08:00"},{"id":3357,"source_id":"08b8d17e3c09b326687a7bca6789507a","target_id":"69c930f997042246d4e17369ede6f826","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-91","gmt_create":"2026-06-30T18:39:29.637036+08:00","gmt_modified":"2026-06-30T18:39:29.637036+08:00"},{"id":3358,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"6b61c60063d41432a3cc1ac4d1699181","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/utils/request.js#44-69","gmt_create":"2026-06-30T18:39:29.638051+08:00","gmt_modified":"2026-06-30T18:39:29.638051+08:00"},{"id":3359,"source_id":"34fcf7aeb55a9c0224c554fc48545063","target_id":"6b61c60063d41432a3cc1ac4d1699181","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 44-69","gmt_create":"2026-06-30T18:39:29.638209+08:00","gmt_modified":"2026-06-30T18:39:29.638209+08:00"},{"id":3360,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"752be7590bb954b39e5a8f41ce8811eb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#159-183","gmt_create":"2026-06-30T18:39:29.638353+08:00","gmt_modified":"2026-06-30T18:39:29.638353+08:00"},{"id":3361,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"752be7590bb954b39e5a8f41ce8811eb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 159-183","gmt_create":"2026-06-30T18:39:29.638443+08:00","gmt_modified":"2026-06-30T18:39:29.638443+08:00"},{"id":3362,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"4daa6ac2900ccb8c9fd7142d0ecdd298","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#142-208","gmt_create":"2026-06-30T18:39:29.638592+08:00","gmt_modified":"2026-06-30T18:39:29.638592+08:00"},{"id":3363,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"4daa6ac2900ccb8c9fd7142d0ecdd298","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 142-208","gmt_create":"2026-06-30T18:39:29.638702+08:00","gmt_modified":"2026-06-30T18:39:29.638702+08:00"},{"id":3364,"source_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","target_id":"e22545d86c6efa26c57aea0e355a57f6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DEPLOY.md#226-256","gmt_create":"2026-06-30T18:39:29.638841+08:00","gmt_modified":"2026-06-30T18:39:29.638841+08:00"},{"id":3365,"source_id":"0c25a991664c34b2b36ce3aeed80f4da","target_id":"e22545d86c6efa26c57aea0e355a57f6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 226-256","gmt_create":"2026-06-30T18:39:29.638935+08:00","gmt_modified":"2026-06-30T18:39:29.638935+08:00"},{"id":3366,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"fc2d0cc85e5f2565c3105cbe0584903a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Ota.js","gmt_create":"2026-06-30T18:39:56.530513+08:00","gmt_modified":"2026-06-30T18:39:56.530513+08:00"},{"id":3367,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"a84967d9d3088fba02de385738e7ca27","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/BlackList.js","gmt_create":"2026-06-30T18:39:56.530752+08:00","gmt_modified":"2026-06-30T18:39:56.530752+08:00"},{"id":3368,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4ca379f147f6f1da710371999e08dc24","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/OtaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.530901+08:00","gmt_modified":"2026-06-30T18:39:56.530901+08:00"},{"id":3369,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"ba84445ce5118798ce7d0da4ecb4d5e2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/ota.js","gmt_create":"2026-06-30T18:39:56.531051+08:00","gmt_modified":"2026-06-30T18:39:56.531051+08:00"},{"id":3370,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"71a563f23b46da0255a6400402bbfa05","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/blacklist.js","gmt_create":"2026-06-30T18:39:56.531158+08:00","gmt_modified":"2026-06-30T18:39:56.531158+08:00"},{"id":3371,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"ea6e178b2f0bdcefe2ae8800166453d5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.531315+08:00","gmt_modified":"2026-06-30T18:39:56.531315+08:00"},{"id":3372,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"a15b46bcf0be7bfbc82e57adca5be630","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/otaStorage.js","gmt_create":"2026-06-30T18:39:56.531436+08:00","gmt_modified":"2026-06-30T18:39:56.531436+08:00"},{"id":3373,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"99aa92df5b8c8412119e9b3cb015f8c4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/ota.js","gmt_create":"2026-06-30T18:39:56.531564+08:00","gmt_modified":"2026-06-30T18:39:56.531564+08:00"},{"id":3374,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0d26d3961441eb708b69c96f1ed1f7b7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/blacklist.js","gmt_create":"2026-06-30T18:39:56.531677+08:00","gmt_modified":"2026-06-30T18:39:56.531677+08:00"},{"id":3375,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"8a4e619bfb6be9c463274f96a2dcb5a0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.531828+08:00","gmt_modified":"2026-06-30T18:39:56.531828+08:00"},{"id":3376,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"30f836e18a6bf9cbcf650e5884375a93","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/utils/response.js","gmt_create":"2026-06-30T18:39:56.531932+08:00","gmt_modified":"2026-06-30T18:39:56.531932+08:00"},{"id":3377,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"2a04b070bd67fc5059bb504232687d64","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/config/env.js","gmt_create":"2026-06-30T18:39:56.53205+08:00","gmt_modified":"2026-06-30T18:39:56.53205+08:00"},{"id":3378,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"cb4575c8c79b7b9f6ffdac43c2369b95","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/config/database.js","gmt_create":"2026-06-30T18:39:56.532162+08:00","gmt_modified":"2026-06-30T18:39:56.532162+08:00"},{"id":3379,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4bb9a8c7ac3763db0746ff90788525b6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/ota/index.vue","gmt_create":"2026-06-30T18:39:56.532265+08:00","gmt_modified":"2026-06-30T18:39:56.532265+08:00"},{"id":3380,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0eb021ef791f4679788fe98caea23e31","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/blacklist/index.vue","gmt_create":"2026-06-30T18:39:56.532386+08:00","gmt_modified":"2026-06-30T18:39:56.532386+08:00"},{"id":3381,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"cc4227daf4f2b37377be96fcc492e509","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/ota-target-device/index.vue","gmt_create":"2026-06-30T18:39:56.532524+08:00","gmt_modified":"2026-06-30T18:39:56.532524+08:00"},{"id":3382,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"29e96dbf4d3d8f6e116ec620bbf504ad","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/ota.js","gmt_create":"2026-06-30T18:39:56.53265+08:00","gmt_modified":"2026-06-30T18:39:56.53265+08:00"},{"id":3383,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"5ceb781f55bf90055f3005880d06ee2a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/blacklist.js","gmt_create":"2026-06-30T18:39:56.532804+08:00","gmt_modified":"2026-06-30T18:39:56.532804+08:00"},{"id":3384,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"5973b5959029669ade01898821960785","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.532906+08:00","gmt_modified":"2026-06-30T18:39:56.532906+08:00"},{"id":3385,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"23aa29b61d1387fca0530a0a1e57e27f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#1-292","gmt_create":"2026-06-30T18:39:56.53307+08:00","gmt_modified":"2026-06-30T18:39:56.53307+08:00"},{"id":3386,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"72de55f3f022487777e9ad301c9d942b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#1-223","gmt_create":"2026-06-30T18:39:56.533275+08:00","gmt_modified":"2026-06-30T18:39:56.533275+08:00"},{"id":3387,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"ba9810388706ac5ffb0156f74ada8b88","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#1-248","gmt_create":"2026-06-30T18:39:56.533479+08:00","gmt_modified":"2026-06-30T18:39:56.533479+08:00"},{"id":3388,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#1-97","gmt_create":"2026-06-30T18:39:56.533642+08:00","gmt_modified":"2026-06-30T18:39:56.533642+08:00"},{"id":3389,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"05900505c40339d0cc93870281600479","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#1-37","gmt_create":"2026-06-30T18:39:56.533836+08:00","gmt_modified":"2026-06-30T18:39:56.533836+08:00"},{"id":3390,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"05900505c40339d0cc93870281600479","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-37","gmt_create":"2026-06-30T18:39:56.533939+08:00","gmt_modified":"2026-06-30T18:39:56.533939+08:00"},{"id":3391,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"921d509d2d71df1e2bace1390640482a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#1-38","gmt_create":"2026-06-30T18:39:56.534096+08:00","gmt_modified":"2026-06-30T18:39:56.534096+08:00"},{"id":3392,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"921d509d2d71df1e2bace1390640482a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-38","gmt_create":"2026-06-30T18:39:56.534213+08:00","gmt_modified":"2026-06-30T18:39:56.534213+08:00"},{"id":3393,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"149a41cdd5807ad4f666e9eb2463fa68","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#1-628","gmt_create":"2026-06-30T18:39:56.534352+08:00","gmt_modified":"2026-06-30T18:39:56.534352+08:00"},{"id":3394,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"149a41cdd5807ad4f666e9eb2463fa68","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-628","gmt_create":"2026-06-30T18:39:56.534456+08:00","gmt_modified":"2026-06-30T18:39:56.534456+08:00"},{"id":3395,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"771e33c2a04ba5eb1a504cf7aa1e9c36","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/blacklist/index.vue#1-381","gmt_create":"2026-06-30T18:39:56.53458+08:00","gmt_modified":"2026-06-30T18:39:56.53458+08:00"},{"id":3396,"source_id":"0eb021ef791f4679788fe98caea23e31","target_id":"771e33c2a04ba5eb1a504cf7aa1e9c36","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-381","gmt_create":"2026-06-30T18:39:56.534732+08:00","gmt_modified":"2026-06-30T18:39:56.534732+08:00"},{"id":3397,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"f23242497ee4dc9ed490a1d09d0d3d91","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota-target-device/index.vue#1-386","gmt_create":"2026-06-30T18:39:56.534886+08:00","gmt_modified":"2026-06-30T18:39:56.534886+08:00"},{"id":3398,"source_id":"cc4227daf4f2b37377be96fcc492e509","target_id":"f23242497ee4dc9ed490a1d09d0d3d91","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-386","gmt_create":"2026-06-30T18:39:56.535014+08:00","gmt_modified":"2026-06-30T18:39:56.535014+08:00"},{"id":3399,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"b8c21c93e526039c96f1df526ebdcafe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#1-113","gmt_create":"2026-06-30T18:39:56.535896+08:00","gmt_modified":"2026-06-30T18:39:56.535896+08:00"},{"id":3400,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0c0ca507fcaf2164af19adf77eaf72e8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/ota.js#1-36","gmt_create":"2026-06-30T18:39:56.53607+08:00","gmt_modified":"2026-06-30T18:39:56.53607+08:00"},{"id":3401,"source_id":"99aa92df5b8c8412119e9b3cb015f8c4","target_id":"0c0ca507fcaf2164af19adf77eaf72e8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-36","gmt_create":"2026-06-30T18:39:56.536174+08:00","gmt_modified":"2026-06-30T18:39:56.536174+08:00"},{"id":3402,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"420851439a300cff8b7fa324589ce87a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/blacklist.js#1-14","gmt_create":"2026-06-30T18:39:56.536294+08:00","gmt_modified":"2026-06-30T18:39:56.536294+08:00"},{"id":3403,"source_id":"0d26d3961441eb708b69c96f1ed1f7b7","target_id":"420851439a300cff8b7fa324589ce87a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-14","gmt_create":"2026-06-30T18:39:56.536388+08:00","gmt_modified":"2026-06-30T18:39:56.536388+08:00"},{"id":3404,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e92ce9787ed66ea4dd0821e0c8f28d8a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/otaTargetDevice.js#1-14","gmt_create":"2026-06-30T18:39:56.536524+08:00","gmt_modified":"2026-06-30T18:39:56.536524+08:00"},{"id":3405,"source_id":"8a4e619bfb6be9c463274f96a2dcb5a0","target_id":"e92ce9787ed66ea4dd0821e0c8f28d8a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-14","gmt_create":"2026-06-30T18:39:56.536607+08:00","gmt_modified":"2026-06-30T18:39:56.536607+08:00"},{"id":3406,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0696a947e8ffd03fd403809f77673c55","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#24-66","gmt_create":"2026-06-30T18:39:56.536822+08:00","gmt_modified":"2026-06-30T18:39:56.536822+08:00"},{"id":3407,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"0696a947e8ffd03fd403809f77673c55","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-66","gmt_create":"2026-06-30T18:39:56.536933+08:00","gmt_modified":"2026-06-30T18:39:56.536933+08:00"},{"id":3408,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"424dfd038ca84be6195b08d7032a1235","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#68-102","gmt_create":"2026-06-30T18:39:56.537069+08:00","gmt_modified":"2026-06-30T18:39:56.53707+08:00"},{"id":3409,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"be497152bcedca75299e4c2521c11859","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#46-103","gmt_create":"2026-06-30T18:39:56.537221+08:00","gmt_modified":"2026-06-30T18:39:56.537221+08:00"},{"id":3410,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0f5328f2be7159ab2f533662f8992b10","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#384-412","gmt_create":"2026-06-30T18:39:56.537364+08:00","gmt_modified":"2026-06-30T18:39:56.537364+08:00"},{"id":3411,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"0f5328f2be7159ab2f533662f8992b10","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 384-412","gmt_create":"2026-06-30T18:39:56.537465+08:00","gmt_modified":"2026-06-30T18:39:56.537465+08:00"},{"id":3412,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e6f541a0af8390b3610d1e380a8d3236","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#4-94","gmt_create":"2026-06-30T18:39:56.537604+08:00","gmt_modified":"2026-06-30T18:39:56.537604+08:00"},{"id":3413,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"b6918b1988464553531aec983ea27b7d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/BlackList.js#5-32","gmt_create":"2026-06-30T18:39:56.537774+08:00","gmt_modified":"2026-06-30T18:39:56.537774+08:00"},{"id":3414,"source_id":"a84967d9d3088fba02de385738e7ca27","target_id":"b6918b1988464553531aec983ea27b7d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-32","gmt_create":"2026-06-30T18:39:56.537912+08:00","gmt_modified":"2026-06-30T18:39:56.537912+08:00"},{"id":3415,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"59e0c0eb304ea8fbb7145bc038c8fdf6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/OtaTargetDevice.js#5-33","gmt_create":"2026-06-30T18:39:56.538023+08:00","gmt_modified":"2026-06-30T18:39:56.538023+08:00"},{"id":3416,"source_id":"4ca379f147f6f1da710371999e08dc24","target_id":"59e0c0eb304ea8fbb7145bc038c8fdf6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-33","gmt_create":"2026-06-30T18:39:56.538117+08:00","gmt_modified":"2026-06-30T18:39:56.538117+08:00"},{"id":3417,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0991eb53c8fe806cf46decab5e748f75","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#72-103","gmt_create":"2026-06-30T18:39:56.538566+08:00","gmt_modified":"2026-06-30T18:39:56.538566+08:00"},{"id":3418,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"0991eb53c8fe806cf46decab5e748f75","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 72-103","gmt_create":"2026-06-30T18:39:56.538694+08:00","gmt_modified":"2026-06-30T18:39:56.538694+08:00"},{"id":3419,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"a826e77f133d3db11e600f30b88f4e9a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/ota.js#3-35","gmt_create":"2026-06-30T18:39:56.539109+08:00","gmt_modified":"2026-06-30T18:39:56.539109+08:00"},{"id":3420,"source_id":"99aa92df5b8c8412119e9b3cb015f8c4","target_id":"a826e77f133d3db11e600f30b88f4e9a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-35","gmt_create":"2026-06-30T18:39:56.53922+08:00","gmt_modified":"2026-06-30T18:39:56.53922+08:00"},{"id":3421,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4a33d32c1578fd612d900aa17246d8c2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/blacklist.js#3-11","gmt_create":"2026-06-30T18:39:56.539329+08:00","gmt_modified":"2026-06-30T18:39:56.539329+08:00"},{"id":3422,"source_id":"0d26d3961441eb708b69c96f1ed1f7b7","target_id":"4a33d32c1578fd612d900aa17246d8c2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-11","gmt_create":"2026-06-30T18:39:56.539438+08:00","gmt_modified":"2026-06-30T18:39:56.539438+08:00"},{"id":3423,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4660c7ce6daeb3f765d39856dcf95f6f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/otaTargetDevice.js#3-11","gmt_create":"2026-06-30T18:39:56.539551+08:00","gmt_modified":"2026-06-30T18:39:56.539551+08:00"},{"id":3424,"source_id":"8a4e619bfb6be9c463274f96a2dcb5a0","target_id":"4660c7ce6daeb3f765d39856dcf95f6f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-11","gmt_create":"2026-06-30T18:39:56.53963+08:00","gmt_modified":"2026-06-30T18:39:56.53963+08:00"},{"id":3425,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/utils/response.js#1-25","gmt_create":"2026-06-30T18:39:56.539736+08:00","gmt_modified":"2026-06-30T18:39:56.539736+08:00"},{"id":3426,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"7467dc2e2d22c93c63fa6342b2e08541","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#420-579","gmt_create":"2026-06-30T18:39:56.540181+08:00","gmt_modified":"2026-06-30T18:39:56.540181+08:00"},{"id":3427,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"7467dc2e2d22c93c63fa6342b2e08541","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 420-579","gmt_create":"2026-06-30T18:39:56.540259+08:00","gmt_modified":"2026-06-30T18:39:56.540259+08:00"},{"id":3428,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4b5baf2b8dcd8468722cd31868c794b2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota/index.vue#645-683","gmt_create":"2026-06-30T18:39:56.540384+08:00","gmt_modified":"2026-06-30T18:39:56.540384+08:00"},{"id":3429,"source_id":"4bb9a8c7ac3763db0746ff90788525b6","target_id":"4b5baf2b8dcd8468722cd31868c794b2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 645-683","gmt_create":"2026-06-30T18:39:56.540462+08:00","gmt_modified":"2026-06-30T18:39:56.540462+08:00"},{"id":3430,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"3e935f654a28968186e9260f2c5035c7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/ota.js#1-68","gmt_create":"2026-06-30T18:39:56.540837+08:00","gmt_modified":"2026-06-30T18:39:56.540837+08:00"},{"id":3431,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"edbb69e747bbcd76dd1bc3a361ebf7c0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/blacklist.js#1-57","gmt_create":"2026-06-30T18:39:56.540981+08:00","gmt_modified":"2026-06-30T18:39:56.540981+08:00"},{"id":3432,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"4e817a7f3bd90bb9e57c6a2e9009380f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/otaTargetDevice.js#1-57","gmt_create":"2026-06-30T18:39:56.541105+08:00","gmt_modified":"2026-06-30T18:39:56.541105+08:00"},{"id":3433,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"20e79ab592f63eb9d23c0d563d5f5202","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#16-71","gmt_create":"2026-06-30T18:39:56.541459+08:00","gmt_modified":"2026-06-30T18:39:56.541459+08:00"},{"id":3434,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"20e79ab592f63eb9d23c0d563d5f5202","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-71","gmt_create":"2026-06-30T18:39:56.541542+08:00","gmt_modified":"2026-06-30T18:39:56.541542+08:00"},{"id":3435,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"07afcaa71195b3d86386dcde14973a8d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#96-131","gmt_create":"2026-06-30T18:39:56.541674+08:00","gmt_modified":"2026-06-30T18:39:56.541674+08:00"},{"id":3436,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"07afcaa71195b3d86386dcde14973a8d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-131","gmt_create":"2026-06-30T18:39:56.541757+08:00","gmt_modified":"2026-06-30T18:39:56.541757+08:00"},{"id":3437,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"2a5364613dbf0723f2e2a64affabb065","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/blacklist/index.vue#144-346","gmt_create":"2026-06-30T18:39:56.543701+08:00","gmt_modified":"2026-06-30T18:39:56.543701+08:00"},{"id":3438,"source_id":"0eb021ef791f4679788fe98caea23e31","target_id":"2a5364613dbf0723f2e2a64affabb065","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 144-346","gmt_create":"2026-06-30T18:39:56.54385+08:00","gmt_modified":"2026-06-30T18:39:56.54385+08:00"},{"id":3439,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"12ad7a8b54f39c0717843220f341d59e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#16-71","gmt_create":"2026-06-30T18:39:56.544322+08:00","gmt_modified":"2026-06-30T18:39:56.544322+08:00"},{"id":3440,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"12ad7a8b54f39c0717843220f341d59e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-71","gmt_create":"2026-06-30T18:39:56.544408+08:00","gmt_modified":"2026-06-30T18:39:56.544408+08:00"},{"id":3441,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"fb9daf52780951bc4b93f14b1fcfa8f1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#96-139","gmt_create":"2026-06-30T18:39:56.544514+08:00","gmt_modified":"2026-06-30T18:39:56.544514+08:00"},{"id":3442,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"585261a6626a815d8f5f83b91a086eb9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/ota-target-device/index.vue#144-351","gmt_create":"2026-06-30T18:39:56.544644+08:00","gmt_modified":"2026-06-30T18:39:56.544644+08:00"},{"id":3443,"source_id":"cc4227daf4f2b37377be96fcc492e509","target_id":"585261a6626a815d8f5f83b91a086eb9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 144-351","gmt_create":"2026-06-30T18:39:56.54475+08:00","gmt_modified":"2026-06-30T18:39:56.54475+08:00"},{"id":3444,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/package.json","gmt_create":"2026-06-30T18:39:56.545256+08:00","gmt_modified":"2026-06-30T18:39:56.545256+08:00"},{"id":3445,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"2a0437737a8daf4655f00caae7549a06","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/package.json#11-24","gmt_create":"2026-06-30T18:39:56.545352+08:00","gmt_modified":"2026-06-30T18:39:56.545352+08:00"},{"id":3446,"source_id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","target_id":"2a0437737a8daf4655f00caae7549a06","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-24","gmt_create":"2026-06-30T18:39:56.545472+08:00","gmt_modified":"2026-06-30T18:39:56.545472+08:00"},{"id":3447,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"f0cfbce84fd69ea625e215367d5da707","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/package.json#1-29","gmt_create":"2026-06-30T18:39:56.545601+08:00","gmt_modified":"2026-06-30T18:39:56.545601+08:00"},{"id":3448,"source_id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","target_id":"f0cfbce84fd69ea625e215367d5da707","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-29","gmt_create":"2026-06-30T18:39:56.545688+08:00","gmt_modified":"2026-06-30T18:39:56.545688+08:00"},{"id":3449,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"af76fcd4277eeb577f573e21de923bbf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/config/env.js#1-13","gmt_create":"2026-06-30T18:39:56.545882+08:00","gmt_modified":"2026-06-30T18:39:56.545882+08:00"},{"id":3450,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"fad5c52b0517044faace96133c6e570c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/ota.js#174-181","gmt_create":"2026-06-30T18:39:56.546044+08:00","gmt_modified":"2026-06-30T18:39:56.546044+08:00"},{"id":3451,"source_id":"ba84445ce5118798ce7d0da4ecb4d5e2","target_id":"fad5c52b0517044faace96133c6e570c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 174-181","gmt_create":"2026-06-30T18:39:56.546129+08:00","gmt_modified":"2026-06-30T18:39:56.546129+08:00"},{"id":3452,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"f62834891fb8675fbb1dcb6654b186e9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/otaStorage.js#95-98","gmt_create":"2026-06-30T18:39:56.546273+08:00","gmt_modified":"2026-06-30T18:39:56.546273+08:00"},{"id":3453,"source_id":"a15b46bcf0be7bfbc82e57adca5be630","target_id":"f62834891fb8675fbb1dcb6654b186e9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 95-98","gmt_create":"2026-06-30T18:39:56.546352+08:00","gmt_modified":"2026-06-30T18:39:56.546353+08:00"},{"id":3454,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"0c387969b601239a31cb0c672ef3c116","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/blacklist.js#108-112","gmt_create":"2026-06-30T18:39:56.546458+08:00","gmt_modified":"2026-06-30T18:39:56.546458+08:00"},{"id":3455,"source_id":"71a563f23b46da0255a6400402bbfa05","target_id":"0c387969b601239a31cb0c672ef3c116","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 108-112","gmt_create":"2026-06-30T18:39:56.546538+08:00","gmt_modified":"2026-06-30T18:39:56.546538+08:00"},{"id":3456,"source_id":"da7627b0-17b7-42c7-a029-e357bc889416","target_id":"406e308cbdb4112d67f61a82a8118e9f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/otaTargetDevice.js#108-112","gmt_create":"2026-06-30T18:39:56.546662+08:00","gmt_modified":"2026-06-30T18:39:56.546662+08:00"},{"id":3457,"source_id":"ea6e178b2f0bdcefe2ae8800166453d5","target_id":"406e308cbdb4112d67f61a82a8118e9f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 108-112","gmt_create":"2026-06-30T18:39:56.546751+08:00","gmt_modified":"2026-06-30T18:39:56.546751+08:00"},{"id":3458,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"da7627b0-17b7-42c7-a029-e357bc889416","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e da7627b0-17b7-42c7-a029-e357bc889416","gmt_create":"2026-06-30T18:39:57.127914+08:00","gmt_modified":"2026-06-30T18:39:57.127915+08:00"},{"id":3459,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 7d8f2ef6-290d-4952-b59c-a1d95af0d438","gmt_create":"2026-06-30T18:39:57.129556+08:00","gmt_modified":"2026-06-30T18:39:57.129556+08:00"},{"id":3460,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"de74851040d304248e26c1db406458af","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/models.js","gmt_create":"2026-07-01T17:22:10.356569+08:00","gmt_modified":"2026-07-01T17:22:10.356569+08:00"},{"id":3461,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"387b55f69fa15c066ce97e930d49fca8","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Model.js","gmt_create":"2026-07-01T17:22:10.357791+08:00","gmt_modified":"2026-07-01T17:22:10.357791+08:00"},{"id":3462,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"d82c987a9b76c3f9e87e628925cae2d7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/model.js","gmt_create":"2026-07-01T17:22:10.358273+08:00","gmt_modified":"2026-07-01T17:22:10.358273+08:00"},{"id":3463,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"30f836e18a6bf9cbcf650e5884375a93","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/utils/response.js","gmt_create":"2026-07-01T17:22:10.358447+08:00","gmt_modified":"2026-07-01T17:22:10.358447+08:00"},{"id":3464,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"c22be0eccf069bf7f87f09ef49070f8d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/middleware/auth.js","gmt_create":"2026-07-01T17:22:10.35865+08:00","gmt_modified":"2026-07-01T17:22:10.35865+08:00"},{"id":3465,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"2d86c0a8ef372bffb82991d44412c989","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/model.js","gmt_create":"2026-07-01T17:22:10.358974+08:00","gmt_modified":"2026-07-01T17:22:10.358974+08:00"},{"id":3466,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"fc2d0cc85e5f2565c3105cbe0584903a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Ota.js","gmt_create":"2026-07-01T17:22:10.359263+08:00","gmt_modified":"2026-07-01T17:22:10.359263+08:00"},{"id":3467,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"ba84445ce5118798ce7d0da4ecb4d5e2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/ota.js","gmt_create":"2026-07-01T17:22:10.359529+08:00","gmt_modified":"2026-07-01T17:22:10.359529+08:00"},{"id":3468,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"d5e6b65d89b66c08d62b4c6fc5812f22","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/squiglink.js","gmt_create":"2026-07-01T17:22:10.359671+08:00","gmt_modified":"2026-07-01T17:22:10.359671+08:00"},{"id":3469,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"0d51eea570b0976e572f9c35721fa5e6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/ModelFormDialog.vue","gmt_create":"2026-07-01T17:22:10.3599+08:00","gmt_modified":"2026-07-01T17:22:10.3599+08:00"},{"id":3470,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"5d1069f11e2153ac8cd75f26c10256a2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#1-659","gmt_create":"2026-07-01T17:22:10.360738+08:00","gmt_modified":"2026-07-01T17:22:10.360738+08:00"},{"id":3471,"source_id":"de74851040d304248e26c1db406458af","target_id":"5d1069f11e2153ac8cd75f26c10256a2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-659","gmt_create":"2026-07-01T17:22:10.360873+08:00","gmt_modified":"2026-07-01T17:22:10.360873+08:00"},{"id":3472,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"024c49b177309c95a9a6487c0c70ff28","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Model.js#1-53","gmt_create":"2026-07-01T17:22:10.361471+08:00","gmt_modified":"2026-07-01T17:22:10.361471+08:00"},{"id":3473,"source_id":"387b55f69fa15c066ce97e930d49fca8","target_id":"024c49b177309c95a9a6487c0c70ff28","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-53","gmt_create":"2026-07-01T17:22:10.361729+08:00","gmt_modified":"2026-07-01T17:22:10.361729+08:00"},{"id":3474,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"ed0beaf535b1c935f72da53c93cefd99","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#1-22","gmt_create":"2026-07-01T17:22:10.362028+08:00","gmt_modified":"2026-07-01T17:22:10.362028+08:00"},{"id":3475,"source_id":"d82c987a9b76c3f9e87e628925cae2d7","target_id":"ed0beaf535b1c935f72da53c93cefd99","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-22","gmt_create":"2026-07-01T17:22:10.362339+08:00","gmt_modified":"2026-07-01T17:22:10.362339+08:00"},{"id":3476,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"e3a6003c52bf8b8487bb1b8709da6b4b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/utils/response.js#1-25","gmt_create":"2026-07-01T17:22:10.362969+08:00","gmt_modified":"2026-07-01T17:22:10.362969+08:00"},{"id":3477,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"b4d5cb8d79f05ea0bc1f56f20380f226","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/middleware/auth.js#1-36","gmt_create":"2026-07-01T17:22:10.363176+08:00","gmt_modified":"2026-07-01T17:22:10.363176+08:00"},{"id":3478,"source_id":"c22be0eccf069bf7f87f09ef49070f8d","target_id":"b4d5cb8d79f05ea0bc1f56f20380f226","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-36","gmt_create":"2026-07-01T17:22:10.363485+08:00","gmt_modified":"2026-07-01T17:22:10.363485+08:00"},{"id":3479,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"d71cf669f581f1e2e6b7956768cf07e5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#1-165","gmt_create":"2026-07-01T17:22:10.363773+08:00","gmt_modified":"2026-07-01T17:22:10.363773+08:00"},{"id":3480,"source_id":"2d86c0a8ef372bffb82991d44412c989","target_id":"d71cf669f581f1e2e6b7956768cf07e5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-165","gmt_create":"2026-07-01T17:22:10.363919+08:00","gmt_modified":"2026-07-01T17:22:10.363919+08:00"},{"id":3481,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"b7c66d1bc7887a6132dc3acbf6421a5d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#1-97","gmt_create":"2026-07-01T17:22:10.364292+08:00","gmt_modified":"2026-07-01T17:22:10.364292+08:00"},{"id":3482,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"2f44ab11354520681821b18c70b28ea5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#1-322","gmt_create":"2026-07-01T17:22:10.364488+08:00","gmt_modified":"2026-07-01T17:22:10.364488+08:00"},{"id":3483,"source_id":"d5e6b65d89b66c08d62b4c6fc5812f22","target_id":"2f44ab11354520681821b18c70b28ea5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-322","gmt_create":"2026-07-01T17:22:10.364603+08:00","gmt_modified":"2026-07-01T17:22:10.364603+08:00"},{"id":3484,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"dfde97c120aa759be08496d7a1217bb5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#1-555","gmt_create":"2026-07-01T17:22:10.364775+08:00","gmt_modified":"2026-07-01T17:22:10.364775+08:00"},{"id":3485,"source_id":"0d51eea570b0976e572f9c35721fa5e6","target_id":"dfde97c120aa759be08496d7a1217bb5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-555","gmt_create":"2026-07-01T17:22:10.364915+08:00","gmt_modified":"2026-07-01T17:22:10.364915+08:00"},{"id":3486,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"8ff91c81b391966d61e25fb150388eda","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#133-181","gmt_create":"2026-07-01T17:22:10.366249+08:00","gmt_modified":"2026-07-01T17:22:10.366249+08:00"},{"id":3487,"source_id":"de74851040d304248e26c1db406458af","target_id":"8ff91c81b391966d61e25fb150388eda","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 133-181","gmt_create":"2026-07-01T17:22:10.366406+08:00","gmt_modified":"2026-07-01T17:22:10.366406+08:00"},{"id":3488,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"f84073b86f81ac8811492a2bdf880f16","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Model.js#4-50","gmt_create":"2026-07-01T17:22:10.366583+08:00","gmt_modified":"2026-07-01T17:22:10.366583+08:00"},{"id":3489,"source_id":"387b55f69fa15c066ce97e930d49fca8","target_id":"f84073b86f81ac8811492a2bdf880f16","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 4-50","gmt_create":"2026-07-01T17:22:10.3667+08:00","gmt_modified":"2026-07-01T17:22:10.3667+08:00"},{"id":3490,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"9e84158ca8a0ddb6b5e5b73eb1bbe846","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#3-19","gmt_create":"2026-07-01T17:22:10.366902+08:00","gmt_modified":"2026-07-01T17:22:10.366902+08:00"},{"id":3491,"source_id":"d82c987a9b76c3f9e87e628925cae2d7","target_id":"9e84158ca8a0ddb6b5e5b73eb1bbe846","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-19","gmt_create":"2026-07-01T17:22:10.367214+08:00","gmt_modified":"2026-07-01T17:22:10.367214+08:00"},{"id":3492,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"5a517afeab7c85f15e321f8de509c92e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/middleware/auth.js#3-26","gmt_create":"2026-07-01T17:22:10.367472+08:00","gmt_modified":"2026-07-01T17:22:10.367472+08:00"},{"id":3493,"source_id":"c22be0eccf069bf7f87f09ef49070f8d","target_id":"5a517afeab7c85f15e321f8de509c92e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-26","gmt_create":"2026-07-01T17:22:10.367609+08:00","gmt_modified":"2026-07-01T17:22:10.367609+08:00"},{"id":3494,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"61cdcff725a5d9f851c84d3976b11ad9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#13-165","gmt_create":"2026-07-01T17:22:10.367902+08:00","gmt_modified":"2026-07-01T17:22:10.367902+08:00"},{"id":3495,"source_id":"2d86c0a8ef372bffb82991d44412c989","target_id":"61cdcff725a5d9f851c84d3976b11ad9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-165","gmt_create":"2026-07-01T17:22:10.368179+08:00","gmt_modified":"2026-07-01T17:22:10.368179+08:00"},{"id":3496,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"242fa36bc833a990fae50c7bb09ed4e1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#158-464","gmt_create":"2026-07-01T17:22:10.368329+08:00","gmt_modified":"2026-07-01T17:22:10.368329+08:00"},{"id":3497,"source_id":"0d51eea570b0976e572f9c35721fa5e6","target_id":"242fa36bc833a990fae50c7bb09ed4e1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 158-464","gmt_create":"2026-07-01T17:22:10.368465+08:00","gmt_modified":"2026-07-01T17:22:10.368465+08:00"},{"id":3498,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"198c9bc987125a8c495d5f4f4c719320","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#307-369","gmt_create":"2026-07-01T17:22:10.368628+08:00","gmt_modified":"2026-07-01T17:22:10.368628+08:00"},{"id":3499,"source_id":"de74851040d304248e26c1db406458af","target_id":"198c9bc987125a8c495d5f4f4c719320","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 307-369","gmt_create":"2026-07-01T17:22:10.368924+08:00","gmt_modified":"2026-07-01T17:22:10.368924+08:00"},{"id":3500,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"00a6cc74394f2292cdbdb135e0050bfd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#261-310","gmt_create":"2026-07-01T17:22:10.369249+08:00","gmt_modified":"2026-07-01T17:22:10.369249+08:00"},{"id":3501,"source_id":"d5e6b65d89b66c08d62b4c6fc5812f22","target_id":"00a6cc74394f2292cdbdb135e0050bfd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 261-310","gmt_create":"2026-07-01T17:22:10.369407+08:00","gmt_modified":"2026-07-01T17:22:10.369407+08:00"},{"id":3502,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"cbc5a1c920943391c4b4c7dbb4969e02","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#280-304","gmt_create":"2026-07-01T17:22:10.370662+08:00","gmt_modified":"2026-07-01T17:22:10.370662+08:00"},{"id":3503,"source_id":"de74851040d304248e26c1db406458af","target_id":"cbc5a1c920943391c4b4c7dbb4969e02","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 280-304","gmt_create":"2026-07-01T17:22:10.370832+08:00","gmt_modified":"2026-07-01T17:22:10.370832+08:00"},{"id":3504,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"0e96d580b4b0d85ad3a0856f9ced77c5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#371-437","gmt_create":"2026-07-01T17:22:10.371205+08:00","gmt_modified":"2026-07-01T17:22:10.371205+08:00"},{"id":3505,"source_id":"de74851040d304248e26c1db406458af","target_id":"0e96d580b4b0d85ad3a0856f9ced77c5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 371-437","gmt_create":"2026-07-01T17:22:10.371375+08:00","gmt_modified":"2026-07-01T17:22:10.371375+08:00"},{"id":3506,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"64d9a6b9e0dbb15b4433b936b9d9b682","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#3-10","gmt_create":"2026-07-01T17:22:10.371516+08:00","gmt_modified":"2026-07-01T17:22:10.371516+08:00"},{"id":3507,"source_id":"d82c987a9b76c3f9e87e628925cae2d7","target_id":"64d9a6b9e0dbb15b4433b936b9d9b682","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-10","gmt_create":"2026-07-01T17:22:10.371643+08:00","gmt_modified":"2026-07-01T17:22:10.371643+08:00"},{"id":3508,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"534ccf5ed9895fd2357c6072d2c32641","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#439-526","gmt_create":"2026-07-01T17:22:10.372013+08:00","gmt_modified":"2026-07-01T17:22:10.372013+08:00"},{"id":3509,"source_id":"de74851040d304248e26c1db406458af","target_id":"534ccf5ed9895fd2357c6072d2c32641","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 439-526","gmt_create":"2026-07-01T17:22:10.37231+08:00","gmt_modified":"2026-07-01T17:22:10.37231+08:00"},{"id":3510,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"1403db1a8eb57f752df3491c038670b7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#12-19","gmt_create":"2026-07-01T17:22:10.372589+08:00","gmt_modified":"2026-07-01T17:22:10.372589+08:00"},{"id":3511,"source_id":"d82c987a9b76c3f9e87e628925cae2d7","target_id":"1403db1a8eb57f752df3491c038670b7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-19","gmt_create":"2026-07-01T17:22:10.37272+08:00","gmt_modified":"2026-07-01T17:22:10.37272+08:00"},{"id":3512,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"e19c5be696ebceb651e9886682335c3f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#528-554","gmt_create":"2026-07-01T17:22:10.373047+08:00","gmt_modified":"2026-07-01T17:22:10.373048+08:00"},{"id":3513,"source_id":"de74851040d304248e26c1db406458af","target_id":"e19c5be696ebceb651e9886682335c3f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 528-554","gmt_create":"2026-07-01T17:22:10.373219+08:00","gmt_modified":"2026-07-01T17:22:10.373219+08:00"},{"id":3514,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"fd1c352115895c20befbd57b21dafffd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#136-157","gmt_create":"2026-07-01T17:22:10.37353+08:00","gmt_modified":"2026-07-01T17:22:10.37353+08:00"},{"id":3515,"source_id":"de74851040d304248e26c1db406458af","target_id":"fd1c352115895c20befbd57b21dafffd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 136-157","gmt_create":"2026-07-01T17:22:10.373649+08:00","gmt_modified":"2026-07-01T17:22:10.373649+08:00"},{"id":3516,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"a4a868fe5625e468464edb2a81e0ed65","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Ota.js#44-48","gmt_create":"2026-07-01T17:22:10.373847+08:00","gmt_modified":"2026-07-01T17:22:10.373847+08:00"},{"id":3517,"source_id":"fc2d0cc85e5f2565c3105cbe0584903a","target_id":"a4a868fe5625e468464edb2a81e0ed65","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 44-48","gmt_create":"2026-07-01T17:22:10.373943+08:00","gmt_modified":"2026-07-01T17:22:10.373943+08:00"},{"id":3518,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"9bfda1a77caaecb96fe646e1a5c4e657","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#556-656","gmt_create":"2026-07-01T17:22:10.374341+08:00","gmt_modified":"2026-07-01T17:22:10.374341+08:00"},{"id":3519,"source_id":"de74851040d304248e26c1db406458af","target_id":"9bfda1a77caaecb96fe646e1a5c4e657","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 556-656","gmt_create":"2026-07-01T17:22:10.374511+08:00","gmt_modified":"2026-07-01T17:22:10.374511+08:00"},{"id":3520,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"d204119d78e9a20507f2e6eb59c81b14","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#246-278","gmt_create":"2026-07-01T17:22:10.374726+08:00","gmt_modified":"2026-07-01T17:22:10.374726+08:00"},{"id":3521,"source_id":"de74851040d304248e26c1db406458af","target_id":"d204119d78e9a20507f2e6eb59c81b14","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 246-278","gmt_create":"2026-07-01T17:22:10.374817+08:00","gmt_modified":"2026-07-01T17:22:10.374817+08:00"},{"id":3522,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"6e56ed4dbe173e0e7ce80c50d006cb83","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#183-244","gmt_create":"2026-07-01T17:22:10.374964+08:00","gmt_modified":"2026-07-01T17:22:10.374964+08:00"},{"id":3523,"source_id":"de74851040d304248e26c1db406458af","target_id":"6e56ed4dbe173e0e7ce80c50d006cb83","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 183-244","gmt_create":"2026-07-01T17:22:10.375214+08:00","gmt_modified":"2026-07-01T17:22:10.375214+08:00"},{"id":3524,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"12f724b0903cc7296821075f94c9dea7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#314-317","gmt_create":"2026-07-01T17:22:10.376298+08:00","gmt_modified":"2026-07-01T17:22:10.376298+08:00"},{"id":3525,"source_id":"de74851040d304248e26c1db406458af","target_id":"12f724b0903cc7296821075f94c9dea7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 314-317","gmt_create":"2026-07-01T17:22:10.376414+08:00","gmt_modified":"2026-07-01T17:22:10.376414+08:00"},{"id":3526,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"07839d356726d441504dc3560722db44","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#322-325","gmt_create":"2026-07-01T17:22:10.376564+08:00","gmt_modified":"2026-07-01T17:22:10.376564+08:00"},{"id":3527,"source_id":"de74851040d304248e26c1db406458af","target_id":"07839d356726d441504dc3560722db44","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 322-325","gmt_create":"2026-07-01T17:22:10.376762+08:00","gmt_modified":"2026-07-01T17:22:10.376762+08:00"},{"id":3528,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"0dbf7e568890732ca55dfc5752a318a6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#450-455","gmt_create":"2026-07-01T17:22:10.376912+08:00","gmt_modified":"2026-07-01T17:22:10.376912+08:00"},{"id":3529,"source_id":"de74851040d304248e26c1db406458af","target_id":"0dbf7e568890732ca55dfc5752a318a6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 450-455","gmt_create":"2026-07-01T17:22:10.377006+08:00","gmt_modified":"2026-07-01T17:22:10.377006+08:00"},{"id":3530,"source_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","target_id":"81ee91090f768174f1659cd02a399b89","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#33-47","gmt_create":"2026-07-01T17:22:10.388128+08:00","gmt_modified":"2026-07-01T17:22:10.388128+08:00"},{"id":3531,"source_id":"d5e6b65d89b66c08d62b4c6fc5812f22","target_id":"81ee91090f768174f1659cd02a399b89","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 33-47","gmt_create":"2026-07-01T17:22:10.388552+08:00","gmt_modified":"2026-07-01T17:22:10.388552+08:00"},{"id":3532,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d2ea644c6ce017e7fa5719f8dc3b2162","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/index.vue","gmt_create":"2026-07-01T17:22:40.385335+08:00","gmt_modified":"2026-07-01T17:22:40.385335+08:00"},{"id":3533,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d1931152858f662828e1f616637bf7c1","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/composables/useModelList.js","gmt_create":"2026-07-01T17:22:40.385759+08:00","gmt_modified":"2026-07-01T17:22:40.385759+08:00"},{"id":3534,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"0d51eea570b0976e572f9c35721fa5e6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/ModelFormDialog.vue","gmt_create":"2026-07-01T17:22:40.385927+08:00","gmt_modified":"2026-07-01T17:22:40.385927+08:00"},{"id":3535,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"3a38f5cb99e9c74ac72f7fdb85a68c44","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/CsvViewerDialog.vue","gmt_create":"2026-07-01T17:22:40.386094+08:00","gmt_modified":"2026-07-01T17:22:40.386094+08:00"},{"id":3536,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"e7043a827f136d1ac2e5dbd1d328712c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/EqCacheDialog.vue","gmt_create":"2026-07-01T17:22:40.386223+08:00","gmt_modified":"2026-07-01T17:22:40.386223+08:00"},{"id":3537,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"f05f0f2d2810725d79b63a122d02f104","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/PushProgressDialog.vue","gmt_create":"2026-07-01T17:22:40.386425+08:00","gmt_modified":"2026-07-01T17:22:40.386425+08:00"},{"id":3538,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"8d94303e4c3a8e363f3ac76cf489cd33","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/PushViewDialog.vue","gmt_create":"2026-07-01T17:22:40.386539+08:00","gmt_modified":"2026-07-01T17:22:40.386539+08:00"},{"id":3539,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"2d86c0a8ef372bffb82991d44412c989","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/model.js","gmt_create":"2026-07-01T17:22:40.386974+08:00","gmt_modified":"2026-07-01T17:22:40.386974+08:00"},{"id":3540,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"de74851040d304248e26c1db406458af","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/models.js","gmt_create":"2026-07-01T17:22:40.38752+08:00","gmt_modified":"2026-07-01T17:22:40.387521+08:00"},{"id":3541,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"387b55f69fa15c066ce97e930d49fca8","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Model.js","gmt_create":"2026-07-01T17:22:40.387747+08:00","gmt_modified":"2026-07-01T17:22:40.387747+08:00"},{"id":3542,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d82c987a9b76c3f9e87e628925cae2d7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/model.js","gmt_create":"2026-07-01T17:22:40.387861+08:00","gmt_modified":"2026-07-01T17:22:40.387861+08:00"},{"id":3543,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"3c92914c0d677b2f5ce5e244c4057020","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/brand.js","gmt_create":"2026-07-01T17:22:40.387963+08:00","gmt_modified":"2026-07-01T17:22:40.387963+08:00"},{"id":3544,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"8888802098bf9d46f77f4bb95811e62a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Brand.js","gmt_create":"2026-07-01T17:22:40.388066+08:00","gmt_modified":"2026-07-01T17:22:40.388066+08:00"},{"id":3545,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"8d10949b317a4f03e8624b7f4ce46d77","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/brands.js","gmt_create":"2026-07-01T17:22:40.388205+08:00","gmt_modified":"2026-07-01T17:22:40.388205+08:00"},{"id":3546,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"16acd73277fffb69b4ee4eee82fe6b9e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/measurementStorage.js","gmt_create":"2026-07-01T17:22:40.388548+08:00","gmt_modified":"2026-07-01T17:22:40.388548+08:00"},{"id":3547,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"27717884cd8566480cffa4947e7fa6c5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/eqCacheStorage.js","gmt_create":"2026-07-01T17:22:40.388785+08:00","gmt_modified":"2026-07-01T17:22:40.388785+08:00"},{"id":3548,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d5e6b65d89b66c08d62b4c6fc5812f22","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/squiglink.js","gmt_create":"2026-07-01T17:22:40.389298+08:00","gmt_modified":"2026-07-01T17:22:40.389298+08:00"},{"id":3549,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"34fcf7aeb55a9c0224c554fc48545063","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/utils/request.js","gmt_create":"2026-07-01T17:22:40.389544+08:00","gmt_modified":"2026-07-01T17:22:40.389544+08:00"},{"id":3550,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"08b8d17e3c09b326687a7bca6789507a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/router/index.js","gmt_create":"2026-07-01T17:22:40.389645+08:00","gmt_modified":"2026-07-01T17:22:40.389645+08:00"},{"id":3551,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"09fd0e7623c9b52e7f95307aba3cdebf","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#1-533","gmt_create":"2026-07-01T17:22:40.389778+08:00","gmt_modified":"2026-07-01T17:22:40.389778+08:00"},{"id":3552,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"09fd0e7623c9b52e7f95307aba3cdebf","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-533","gmt_create":"2026-07-01T17:22:40.389914+08:00","gmt_modified":"2026-07-01T17:22:40.389914+08:00"},{"id":3553,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"b336306edfffe78cac04ddcd9b87bee3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/composables/useModelList.js#1-191","gmt_create":"2026-07-01T17:22:40.390089+08:00","gmt_modified":"2026-07-01T17:22:40.390089+08:00"},{"id":3554,"source_id":"d1931152858f662828e1f616637bf7c1","target_id":"b336306edfffe78cac04ddcd9b87bee3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-191","gmt_create":"2026-07-01T17:22:40.390417+08:00","gmt_modified":"2026-07-01T17:22:40.390417+08:00"},{"id":3555,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"dfde97c120aa759be08496d7a1217bb5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#1-555","gmt_create":"2026-07-01T17:22:40.390765+08:00","gmt_modified":"2026-07-01T17:22:40.390765+08:00"},{"id":3556,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"bd284e26c3e22bbca32421b5f77648ef","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/CsvViewerDialog.vue#1-50","gmt_create":"2026-07-01T17:22:40.391298+08:00","gmt_modified":"2026-07-01T17:22:40.391298+08:00"},{"id":3557,"source_id":"3a38f5cb99e9c74ac72f7fdb85a68c44","target_id":"bd284e26c3e22bbca32421b5f77648ef","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-50","gmt_create":"2026-07-01T17:22:40.391417+08:00","gmt_modified":"2026-07-01T17:22:40.391417+08:00"},{"id":3558,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"2046b9f43ac9963df7a7ca533f925569","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/EqCacheDialog.vue#1-306","gmt_create":"2026-07-01T17:22:40.391729+08:00","gmt_modified":"2026-07-01T17:22:40.391729+08:00"},{"id":3559,"source_id":"e7043a827f136d1ac2e5dbd1d328712c","target_id":"2046b9f43ac9963df7a7ca533f925569","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-306","gmt_create":"2026-07-01T17:22:40.391979+08:00","gmt_modified":"2026-07-01T17:22:40.391979+08:00"},{"id":3560,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"779a4d88246e9e5a241ae01c15f899ab","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/PushProgressDialog.vue#1-303","gmt_create":"2026-07-01T17:22:40.392263+08:00","gmt_modified":"2026-07-01T17:22:40.392263+08:00"},{"id":3561,"source_id":"f05f0f2d2810725d79b63a122d02f104","target_id":"779a4d88246e9e5a241ae01c15f899ab","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-303","gmt_create":"2026-07-01T17:22:40.392369+08:00","gmt_modified":"2026-07-01T17:22:40.392369+08:00"},{"id":3562,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"bbf439d580ed3a878deb4fd7de944a94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/PushViewDialog.vue#1-60","gmt_create":"2026-07-01T17:22:40.392841+08:00","gmt_modified":"2026-07-01T17:22:40.392841+08:00"},{"id":3563,"source_id":"8d94303e4c3a8e363f3ac76cf489cd33","target_id":"bbf439d580ed3a878deb4fd7de944a94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-60","gmt_create":"2026-07-01T17:22:40.393141+08:00","gmt_modified":"2026-07-01T17:22:40.393141+08:00"},{"id":3564,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"5d1069f11e2153ac8cd75f26c10256a2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#1-659","gmt_create":"2026-07-01T17:22:40.393992+08:00","gmt_modified":"2026-07-01T17:22:40.393992+08:00"},{"id":3565,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d71cf669f581f1e2e6b7956768cf07e5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#1-165","gmt_create":"2026-07-01T17:22:40.394888+08:00","gmt_modified":"2026-07-01T17:22:40.394888+08:00"},{"id":3566,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"fc4fba8eb72f3b41fef570b38f6dfefe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#227-434","gmt_create":"2026-07-01T17:22:40.395297+08:00","gmt_modified":"2026-07-01T17:22:40.395297+08:00"},{"id":3567,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"fc4fba8eb72f3b41fef570b38f6dfefe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 227-434","gmt_create":"2026-07-01T17:22:40.395672+08:00","gmt_modified":"2026-07-01T17:22:40.395672+08:00"},{"id":3568,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"c0a672fcaa00c517fd9ea3d997173397","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/composables/useModelList.js#31-191","gmt_create":"2026-07-01T17:22:40.395794+08:00","gmt_modified":"2026-07-01T17:22:40.395794+08:00"},{"id":3569,"source_id":"d1931152858f662828e1f616637bf7c1","target_id":"c0a672fcaa00c517fd9ea3d997173397","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 31-191","gmt_create":"2026-07-01T17:22:40.39607+08:00","gmt_modified":"2026-07-01T17:22:40.39607+08:00"},{"id":3570,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"242fa36bc833a990fae50c7bb09ed4e1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#158-464","gmt_create":"2026-07-01T17:22:40.396418+08:00","gmt_modified":"2026-07-01T17:22:40.396418+08:00"},{"id":3571,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d16b984e320d42203d368669cfe2382b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#157-165","gmt_create":"2026-07-01T17:22:40.396679+08:00","gmt_modified":"2026-07-01T17:22:40.396679+08:00"},{"id":3572,"source_id":"2d86c0a8ef372bffb82991d44412c989","target_id":"d16b984e320d42203d368669cfe2382b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 157-165","gmt_create":"2026-07-01T17:22:40.396783+08:00","gmt_modified":"2026-07-01T17:22:40.396783+08:00"},{"id":3573,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"198c9bc987125a8c495d5f4f4c719320","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#307-369","gmt_create":"2026-07-01T17:22:40.397452+08:00","gmt_modified":"2026-07-01T17:22:40.397452+08:00"},{"id":3574,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"00a6cc74394f2292cdbdb135e0050bfd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#261-310","gmt_create":"2026-07-01T17:22:40.39795+08:00","gmt_modified":"2026-07-01T17:22:40.39795+08:00"},{"id":3575,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"c6701de4962c3a2734181c3f0e1b78f6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#307-499","gmt_create":"2026-07-01T17:22:40.398776+08:00","gmt_modified":"2026-07-01T17:22:40.398776+08:00"},{"id":3576,"source_id":"de74851040d304248e26c1db406458af","target_id":"c6701de4962c3a2734181c3f0e1b78f6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 307-499","gmt_create":"2026-07-01T17:22:40.399152+08:00","gmt_modified":"2026-07-01T17:22:40.399152+08:00"},{"id":3577,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"024c49b177309c95a9a6487c0c70ff28","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Model.js#1-53","gmt_create":"2026-07-01T17:22:40.399981+08:00","gmt_modified":"2026-07-01T17:22:40.399981+08:00"},{"id":3578,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"ed0beaf535b1c935f72da53c93cefd99","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#1-22","gmt_create":"2026-07-01T17:22:40.40069+08:00","gmt_modified":"2026-07-01T17:22:40.40069+08:00"},{"id":3579,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"47737e52532225879b5095908c4b0039","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#196-214","gmt_create":"2026-07-01T17:22:40.401185+08:00","gmt_modified":"2026-07-01T17:22:40.401185+08:00"},{"id":3580,"source_id":"0d51eea570b0976e572f9c35721fa5e6","target_id":"47737e52532225879b5095908c4b0039","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 196-214","gmt_create":"2026-07-01T17:22:40.401371+08:00","gmt_modified":"2026-07-01T17:22:40.401371+08:00"},{"id":3581,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"1a50c2ac7c5e4e096904af2e683b5ec7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Brand.js#1-23","gmt_create":"2026-07-01T17:22:40.401956+08:00","gmt_modified":"2026-07-01T17:22:40.401956+08:00"},{"id":3582,"source_id":"8888802098bf9d46f77f4bb95811e62a","target_id":"1a50c2ac7c5e4e096904af2e683b5ec7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-23","gmt_create":"2026-07-01T17:22:40.40216+08:00","gmt_modified":"2026-07-01T17:22:40.40216+08:00"},{"id":3583,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"ae9b4c727fe0313173a4bcea57fef546","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/brands.js#1-147","gmt_create":"2026-07-01T17:22:40.402501+08:00","gmt_modified":"2026-07-01T17:22:40.402501+08:00"},{"id":3584,"source_id":"8d10949b317a4f03e8624b7f4ce46d77","target_id":"ae9b4c727fe0313173a4bcea57fef546","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-147","gmt_create":"2026-07-01T17:22:40.402827+08:00","gmt_modified":"2026-07-01T17:22:40.402827+08:00"},{"id":3585,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"35d43a834ee00c7ae341f64ea7306dcd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/composables/useModelList.js#18-27","gmt_create":"2026-07-01T17:22:40.403197+08:00","gmt_modified":"2026-07-01T17:22:40.403197+08:00"},{"id":3586,"source_id":"d1931152858f662828e1f616637bf7c1","target_id":"35d43a834ee00c7ae341f64ea7306dcd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-27","gmt_create":"2026-07-01T17:22:40.403296+08:00","gmt_modified":"2026-07-01T17:22:40.403296+08:00"},{"id":3587,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"bab25856d9ae1e6dcc3c9df2c6461ca5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/composables/useModelList.js#87-111","gmt_create":"2026-07-01T17:22:40.403504+08:00","gmt_modified":"2026-07-01T17:22:40.403504+08:00"},{"id":3588,"source_id":"d1931152858f662828e1f616637bf7c1","target_id":"bab25856d9ae1e6dcc3c9df2c6461ca5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 87-111","gmt_create":"2026-07-01T17:22:40.403829+08:00","gmt_modified":"2026-07-01T17:22:40.403829+08:00"},{"id":3589,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"8ff91c81b391966d61e25fb150388eda","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#133-181","gmt_create":"2026-07-01T17:22:40.404323+08:00","gmt_modified":"2026-07-01T17:22:40.404323+08:00"},{"id":3590,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"7fdad247ff48969f27ee8d30e3ba5b65","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#402-428","gmt_create":"2026-07-01T17:22:40.404857+08:00","gmt_modified":"2026-07-01T17:22:40.404857+08:00"},{"id":3591,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"7fdad247ff48969f27ee8d30e3ba5b65","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 402-428","gmt_create":"2026-07-01T17:22:40.405211+08:00","gmt_modified":"2026-07-01T17:22:40.405211+08:00"},{"id":3592,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"80992fa9ba0696155e1f48200125fba9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/PushProgressDialog.vue#117-195","gmt_create":"2026-07-01T17:22:40.405541+08:00","gmt_modified":"2026-07-01T17:22:40.405541+08:00"},{"id":3593,"source_id":"f05f0f2d2810725d79b63a122d02f104","target_id":"80992fa9ba0696155e1f48200125fba9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 117-195","gmt_create":"2026-07-01T17:22:40.405642+08:00","gmt_modified":"2026-07-01T17:22:40.405642+08:00"},{"id":3594,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"c72d4a5b5b663d05ac8229b5b4c69991","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#128-150","gmt_create":"2026-07-01T17:22:40.405988+08:00","gmt_modified":"2026-07-01T17:22:40.405988+08:00"},{"id":3595,"source_id":"2d86c0a8ef372bffb82991d44412c989","target_id":"c72d4a5b5b663d05ac8229b5b4c69991","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 128-150","gmt_create":"2026-07-01T17:22:40.406417+08:00","gmt_modified":"2026-07-01T17:22:40.406417+08:00"},{"id":3596,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"84d41a039a6a9937d7d02c54a5e72751","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#466-566","gmt_create":"2026-07-01T17:22:40.40679+08:00","gmt_modified":"2026-07-01T17:22:40.40679+08:00"},{"id":3597,"source_id":"de74851040d304248e26c1db406458af","target_id":"84d41a039a6a9937d7d02c54a5e72751","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 466-566","gmt_create":"2026-07-01T17:22:40.40701+08:00","gmt_modified":"2026-07-01T17:22:40.40701+08:00"},{"id":3598,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"ddaccee59b978ba3a64b134b57255142","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#59-68","gmt_create":"2026-07-01T17:22:40.407555+08:00","gmt_modified":"2026-07-01T17:22:40.407555+08:00"},{"id":3599,"source_id":"de74851040d304248e26c1db406458af","target_id":"ddaccee59b978ba3a64b134b57255142","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 59-68","gmt_create":"2026-07-01T17:22:40.407904+08:00","gmt_modified":"2026-07-01T17:22:40.407904+08:00"},{"id":3600,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"ddabd54034f5691c635f64015008129b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/measurementStorage.js#48-108","gmt_create":"2026-07-01T17:22:40.408268+08:00","gmt_modified":"2026-07-01T17:22:40.408268+08:00"},{"id":3601,"source_id":"16acd73277fffb69b4ee4eee82fe6b9e","target_id":"ddabd54034f5691c635f64015008129b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-108","gmt_create":"2026-07-01T17:22:40.408456+08:00","gmt_modified":"2026-07-01T17:22:40.408456+08:00"},{"id":3602,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"dfbdd0655d2d61b5105701e421492cb1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/eqCacheStorage.js#24-66","gmt_create":"2026-07-01T17:22:40.408966+08:00","gmt_modified":"2026-07-01T17:22:40.408966+08:00"},{"id":3603,"source_id":"27717884cd8566480cffa4947e7fa6c5","target_id":"dfbdd0655d2d61b5105701e421492cb1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-66","gmt_create":"2026-07-01T17:22:40.40927+08:00","gmt_modified":"2026-07-01T17:22:40.40927+08:00"},{"id":3604,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"f80a45c0052388537b0d6844b2c9e8e3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#233-265","gmt_create":"2026-07-01T17:22:40.40979+08:00","gmt_modified":"2026-07-01T17:22:40.40979+08:00"},{"id":3605,"source_id":"0d51eea570b0976e572f9c35721fa5e6","target_id":"f80a45c0052388537b0d6844b2c9e8e3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 233-265","gmt_create":"2026-07-01T17:22:40.409975+08:00","gmt_modified":"2026-07-01T17:22:40.409975+08:00"},{"id":3606,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"69c930f997042246d4e17369ede6f826","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/router/index.js#1-91","gmt_create":"2026-07-01T17:22:40.411142+08:00","gmt_modified":"2026-07-01T17:22:40.411142+08:00"},{"id":3607,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"7a5ae98472bdc4806472d50e6b88c997","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/utils/request.js#1-72","gmt_create":"2026-07-01T17:22:40.411424+08:00","gmt_modified":"2026-07-01T17:22:40.411424+08:00"},{"id":3608,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"4f76bc7594c6e53c87d2b21c18e1593a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#33-48","gmt_create":"2026-07-01T17:22:40.411769+08:00","gmt_modified":"2026-07-01T17:22:40.411769+08:00"},{"id":3609,"source_id":"d5e6b65d89b66c08d62b4c6fc5812f22","target_id":"4f76bc7594c6e53c87d2b21c18e1593a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 33-48","gmt_create":"2026-07-01T17:22:40.412097+08:00","gmt_modified":"2026-07-01T17:22:40.412098+08:00"},{"id":3610,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"dc3af50d3fc111fa0921b37470c23966","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/utils/request.js#27-69","gmt_create":"2026-07-01T17:22:40.412206+08:00","gmt_modified":"2026-07-01T17:22:40.412206+08:00"},{"id":3611,"source_id":"34fcf7aeb55a9c0224c554fc48545063","target_id":"dc3af50d3fc111fa0921b37470c23966","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 27-69","gmt_create":"2026-07-01T17:22:40.412655+08:00","gmt_modified":"2026-07-01T17:22:40.412655+08:00"},{"id":3612,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"ee7461b868a07b5f3e3636d8001b1089","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/brands.js#59-81","gmt_create":"2026-07-01T17:22:40.413041+08:00","gmt_modified":"2026-07-01T17:22:40.413041+08:00"},{"id":3613,"source_id":"8d10949b317a4f03e8624b7f4ce46d77","target_id":"ee7461b868a07b5f3e3636d8001b1089","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 59-81","gmt_create":"2026-07-01T17:22:40.413318+08:00","gmt_modified":"2026-07-01T17:22:40.413318+08:00"},{"id":3614,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"5913b9dcd61bbee07d5a150062d40315","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#371-499","gmt_create":"2026-07-01T17:22:40.413506+08:00","gmt_modified":"2026-07-01T17:22:40.413506+08:00"},{"id":3615,"source_id":"de74851040d304248e26c1db406458af","target_id":"5913b9dcd61bbee07d5a150062d40315","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 371-499","gmt_create":"2026-07-01T17:22:40.413811+08:00","gmt_modified":"2026-07-01T17:22:40.413811+08:00"},{"id":3616,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"d620d05fda07f9cbe1556d0f76a8153f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/measurementStorage.js#87-108","gmt_create":"2026-07-01T17:22:40.413929+08:00","gmt_modified":"2026-07-01T17:22:40.413929+08:00"},{"id":3617,"source_id":"16acd73277fffb69b4ee4eee82fe6b9e","target_id":"d620d05fda07f9cbe1556d0f76a8153f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 87-108","gmt_create":"2026-07-01T17:22:40.414103+08:00","gmt_modified":"2026-07-01T17:22:40.414103+08:00"},{"id":3618,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"f1abdfd8be7fea194c1ce39bf66c78e3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/eqCacheStorage.js#47-66","gmt_create":"2026-07-01T17:22:40.414385+08:00","gmt_modified":"2026-07-01T17:22:40.414385+08:00"},{"id":3619,"source_id":"27717884cd8566480cffa4947e7fa6c5","target_id":"f1abdfd8be7fea194c1ce39bf66c78e3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 47-66","gmt_create":"2026-07-01T17:22:40.414561+08:00","gmt_modified":"2026-07-01T17:22:40.414561+08:00"},{"id":3620,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"e87b014e53bbb73ea5bbd7b6fedb1ee0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/brand.js#1-66","gmt_create":"2026-07-01T17:22:40.414861+08:00","gmt_modified":"2026-07-01T17:22:40.414861+08:00"},{"id":3621,"source_id":"3c92914c0d677b2f5ce5e244c4057020","target_id":"e87b014e53bbb73ea5bbd7b6fedb1ee0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-66","gmt_create":"2026-07-01T17:22:40.415314+08:00","gmt_modified":"2026-07-01T17:22:40.415314+08:00"},{"id":3622,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"6568412fa665c4b795868c6e9875778f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#133-659","gmt_create":"2026-07-01T17:22:40.415616+08:00","gmt_modified":"2026-07-01T17:22:40.415616+08:00"},{"id":3623,"source_id":"de74851040d304248e26c1db406458af","target_id":"6568412fa665c4b795868c6e9875778f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 133-659","gmt_create":"2026-07-01T17:22:40.415841+08:00","gmt_modified":"2026-07-01T17:22:40.415841+08:00"},{"id":3624,"source_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","target_id":"8012c36338dce0daecc34c940e5fc443","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/brands.js#14-147","gmt_create":"2026-07-01T17:22:40.416042+08:00","gmt_modified":"2026-07-01T17:22:40.416042+08:00"},{"id":3625,"source_id":"8d10949b317a4f03e8624b7f4ce46d77","target_id":"8012c36338dce0daecc34c940e5fc443","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-147","gmt_create":"2026-07-01T17:22:40.416211+08:00","gmt_modified":"2026-07-01T17:22:40.416211+08:00"},{"id":3626,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"387b55f69fa15c066ce97e930d49fca8","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Model.js","gmt_create":"2026-07-01T17:22:44.407266+08:00","gmt_modified":"2026-07-01T17:22:44.407266+08:00"},{"id":3627,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"8888802098bf9d46f77f4bb95811e62a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/models/Brand.js","gmt_create":"2026-07-01T17:22:44.407474+08:00","gmt_modified":"2026-07-01T17:22:44.407474+08:00"},{"id":3628,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"d82c987a9b76c3f9e87e628925cae2d7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/validators/model.js","gmt_create":"2026-07-01T17:22:44.407626+08:00","gmt_modified":"2026-07-01T17:22:44.407626+08:00"},{"id":3629,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"de74851040d304248e26c1db406458af","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/routes/models.js","gmt_create":"2026-07-01T17:22:44.407743+08:00","gmt_modified":"2026-07-01T17:22:44.407743+08:00"},{"id":3630,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"d5e6b65d89b66c08d62b4c6fc5812f22","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/squiglink.js","gmt_create":"2026-07-01T17:22:44.40785+08:00","gmt_modified":"2026-07-01T17:22:44.40785+08:00"},{"id":3631,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"16acd73277fffb69b4ee4eee82fe6b9e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/measurementStorage.js","gmt_create":"2026-07-01T17:22:44.407955+08:00","gmt_modified":"2026-07-01T17:22:44.407955+08:00"},{"id":3632,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"27717884cd8566480cffa4947e7fa6c5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/eqCacheStorage.js","gmt_create":"2026-07-01T17:22:44.408101+08:00","gmt_modified":"2026-07-01T17:22:44.408101+08:00"},{"id":3633,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"65741f66e633d4e5aedac59d5f27af4e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/src/services/curveClient.js","gmt_create":"2026-07-01T17:22:44.408209+08:00","gmt_modified":"2026-07-01T17:22:44.408209+08:00"},{"id":3634,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"d2ea644c6ce017e7fa5719f8dc3b2162","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/index.vue","gmt_create":"2026-07-01T17:22:44.408321+08:00","gmt_modified":"2026-07-01T17:22:44.408321+08:00"},{"id":3635,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"0d51eea570b0976e572f9c35721fa5e6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/views/model/components/ModelFormDialog.vue","gmt_create":"2026-07-01T17:22:44.408444+08:00","gmt_modified":"2026-07-01T17:22:44.408444+08:00"},{"id":3636,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"2d86c0a8ef372bffb82991d44412c989","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/src/api/model.js","gmt_create":"2026-07-01T17:22:44.408547+08:00","gmt_modified":"2026-07-01T17:22:44.408547+08:00"},{"id":3637,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"941d6ec9925d0313ebdac30637d5e7de","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#1-1226","gmt_create":"2026-07-01T17:22:44.408704+08:00","gmt_modified":"2026-07-01T17:22:44.408704+08:00"},{"id":3638,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"941d6ec9925d0313ebdac30637d5e7de","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-1226","gmt_create":"2026-07-01T17:22:44.408825+08:00","gmt_modified":"2026-07-01T17:22:44.408825+08:00"},{"id":3639,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"d71cf669f581f1e2e6b7956768cf07e5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#1-165","gmt_create":"2026-07-01T17:22:44.409046+08:00","gmt_modified":"2026-07-01T17:22:44.409046+08:00"},{"id":3640,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"5d1069f11e2153ac8cd75f26c10256a2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#1-659","gmt_create":"2026-07-01T17:22:44.409232+08:00","gmt_modified":"2026-07-01T17:22:44.409232+08:00"},{"id":3641,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"024c49b177309c95a9a6487c0c70ff28","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Model.js#1-53","gmt_create":"2026-07-01T17:22:44.409438+08:00","gmt_modified":"2026-07-01T17:22:44.409438+08:00"},{"id":3642,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"ed0beaf535b1c935f72da53c93cefd99","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#1-22","gmt_create":"2026-07-01T17:22:44.409604+08:00","gmt_modified":"2026-07-01T17:22:44.409604+08:00"},{"id":3643,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"186655fbb53a1180e274c0a224e447ec","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/measurementStorage.js#1-115","gmt_create":"2026-07-01T17:22:44.409771+08:00","gmt_modified":"2026-07-01T17:22:44.409771+08:00"},{"id":3644,"source_id":"16acd73277fffb69b4ee4eee82fe6b9e","target_id":"186655fbb53a1180e274c0a224e447ec","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-115","gmt_create":"2026-07-01T17:22:44.40987+08:00","gmt_modified":"2026-07-01T17:22:44.40987+08:00"},{"id":3645,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"7098281c5dbbd726581ec631c48cb7ff","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/eqCacheStorage.js#1-73","gmt_create":"2026-07-01T17:22:44.410006+08:00","gmt_modified":"2026-07-01T17:22:44.410006+08:00"},{"id":3646,"source_id":"27717884cd8566480cffa4947e7fa6c5","target_id":"7098281c5dbbd726581ec631c48cb7ff","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-73","gmt_create":"2026-07-01T17:22:44.410107+08:00","gmt_modified":"2026-07-01T17:22:44.410107+08:00"},{"id":3647,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"ff3c31b3cf3083faac2e9d22bd1046dc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/curveClient.js#1-147","gmt_create":"2026-07-01T17:22:44.410236+08:00","gmt_modified":"2026-07-01T17:22:44.410236+08:00"},{"id":3648,"source_id":"65741f66e633d4e5aedac59d5f27af4e","target_id":"ff3c31b3cf3083faac2e9d22bd1046dc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-147","gmt_create":"2026-07-01T17:22:44.410346+08:00","gmt_modified":"2026-07-01T17:22:44.410346+08:00"},{"id":3649,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"2f44ab11354520681821b18c70b28ea5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#1-322","gmt_create":"2026-07-01T17:22:44.410494+08:00","gmt_modified":"2026-07-01T17:22:44.410494+08:00"},{"id":3650,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"1a50c2ac7c5e4e096904af2e683b5ec7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/models/Brand.js#1-23","gmt_create":"2026-07-01T17:22:44.410693+08:00","gmt_modified":"2026-07-01T17:22:44.410693+08:00"},{"id":3651,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"6568412fa665c4b795868c6e9875778f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#133-659","gmt_create":"2026-07-01T17:22:44.411955+08:00","gmt_modified":"2026-07-01T17:22:44.411955+08:00"},{"id":3652,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"00a6cc74394f2292cdbdb135e0050bfd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#261-310","gmt_create":"2026-07-01T17:22:44.412644+08:00","gmt_modified":"2026-07-01T17:22:44.412644+08:00"},{"id":3653,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"3ea5cb6fe4688701d6312a31ea523b18","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/measurementStorage.js#61-108","gmt_create":"2026-07-01T17:22:44.412822+08:00","gmt_modified":"2026-07-01T17:22:44.412822+08:00"},{"id":3654,"source_id":"16acd73277fffb69b4ee4eee82fe6b9e","target_id":"3ea5cb6fe4688701d6312a31ea523b18","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 61-108","gmt_create":"2026-07-01T17:22:44.412923+08:00","gmt_modified":"2026-07-01T17:22:44.412923+08:00"},{"id":3655,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"dfbdd0655d2d61b5105701e421492cb1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/eqCacheStorage.js#24-66","gmt_create":"2026-07-01T17:22:44.413092+08:00","gmt_modified":"2026-07-01T17:22:44.413092+08:00"},{"id":3656,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"c777cf18a4b1f608a14488db3258817d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/curveClient.js#81-138","gmt_create":"2026-07-01T17:22:44.413259+08:00","gmt_modified":"2026-07-01T17:22:44.413259+08:00"},{"id":3657,"source_id":"65741f66e633d4e5aedac59d5f27af4e","target_id":"c777cf18a4b1f608a14488db3258817d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 81-138","gmt_create":"2026-07-01T17:22:44.413403+08:00","gmt_modified":"2026-07-01T17:22:44.413403+08:00"},{"id":3658,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"4169091aeab80fcee72321116328a8b2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#714-1063","gmt_create":"2026-07-01T17:22:44.41352+08:00","gmt_modified":"2026-07-01T17:22:44.41352+08:00"},{"id":3659,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"4169091aeab80fcee72321116328a8b2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 714-1063","gmt_create":"2026-07-01T17:22:44.413605+08:00","gmt_modified":"2026-07-01T17:22:44.413605+08:00"},{"id":3660,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"61cdcff725a5d9f851c84d3976b11ad9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#13-165","gmt_create":"2026-07-01T17:22:44.413749+08:00","gmt_modified":"2026-07-01T17:22:44.413749+08:00"},{"id":3661,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"6eacbd3b5ec60fff27a96a9101159648","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#226-250","gmt_create":"2026-07-01T17:22:44.414449+08:00","gmt_modified":"2026-07-01T17:22:44.414449+08:00"},{"id":3662,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"6eacbd3b5ec60fff27a96a9101159648","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 226-250","gmt_create":"2026-07-01T17:22:44.414544+08:00","gmt_modified":"2026-07-01T17:22:44.414544+08:00"},{"id":3663,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"ddaccee59b978ba3a64b134b57255142","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#59-68","gmt_create":"2026-07-01T17:22:44.414657+08:00","gmt_modified":"2026-07-01T17:22:44.414657+08:00"},{"id":3664,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"56d7be38c99608e1cf9141127c60a1bd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#307-335","gmt_create":"2026-07-01T17:22:44.414796+08:00","gmt_modified":"2026-07-01T17:22:44.414796+08:00"},{"id":3665,"source_id":"de74851040d304248e26c1db406458af","target_id":"56d7be38c99608e1cf9141127c60a1bd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 307-335","gmt_create":"2026-07-01T17:22:44.414975+08:00","gmt_modified":"2026-07-01T17:22:44.414975+08:00"},{"id":3666,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"c571c3ca3eb98348a89378f8d58ffa5c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/measurementStorage.js#48-79","gmt_create":"2026-07-01T17:22:44.415094+08:00","gmt_modified":"2026-07-01T17:22:44.415094+08:00"},{"id":3667,"source_id":"16acd73277fffb69b4ee4eee82fe6b9e","target_id":"c571c3ca3eb98348a89378f8d58ffa5c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-79","gmt_create":"2026-07-01T17:22:44.415199+08:00","gmt_modified":"2026-07-01T17:22:44.415199+08:00"},{"id":3668,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"6d9ac3485459b97d549f73fa18ea4efe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#183-278","gmt_create":"2026-07-01T17:22:44.41557+08:00","gmt_modified":"2026-07-01T17:22:44.41557+08:00"},{"id":3669,"source_id":"de74851040d304248e26c1db406458af","target_id":"6d9ac3485459b97d549f73fa18ea4efe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 183-278","gmt_create":"2026-07-01T17:22:44.415697+08:00","gmt_modified":"2026-07-01T17:22:44.415697+08:00"},{"id":3670,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"d620d05fda07f9cbe1556d0f76a8153f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/measurementStorage.js#87-108","gmt_create":"2026-07-01T17:22:44.415896+08:00","gmt_modified":"2026-07-01T17:22:44.415896+08:00"},{"id":3671,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"e1a454e430f59ec87fc68cffc768037a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#466-514","gmt_create":"2026-07-01T17:22:44.416235+08:00","gmt_modified":"2026-07-01T17:22:44.416235+08:00"},{"id":3672,"source_id":"de74851040d304248e26c1db406458af","target_id":"e1a454e430f59ec87fc68cffc768037a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 466-514","gmt_create":"2026-07-01T17:22:44.416321+08:00","gmt_modified":"2026-07-01T17:22:44.416321+08:00"},{"id":3673,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"907380346a61a6c644cdaefa5165c9bd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#516-566","gmt_create":"2026-07-01T17:22:44.416442+08:00","gmt_modified":"2026-07-01T17:22:44.416443+08:00"},{"id":3674,"source_id":"de74851040d304248e26c1db406458af","target_id":"907380346a61a6c644cdaefa5165c9bd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 516-566","gmt_create":"2026-07-01T17:22:44.41653+08:00","gmt_modified":"2026-07-01T17:22:44.41653+08:00"},{"id":3675,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"17a4406c6c25ec6cdfd2d8ffe0b73e9c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/index.vue#1117-1220","gmt_create":"2026-07-01T17:22:44.416733+08:00","gmt_modified":"2026-07-01T17:22:44.416733+08:00"},{"id":3676,"source_id":"d2ea644c6ce017e7fa5719f8dc3b2162","target_id":"17a4406c6c25ec6cdfd2d8ffe0b73e9c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1117-1220","gmt_create":"2026-07-01T17:22:44.41683+08:00","gmt_modified":"2026-07-01T17:22:44.41683+08:00"},{"id":3677,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"726a6f97e2aeafee47b271e07e8bab86","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#148-207","gmt_create":"2026-07-01T17:22:44.417407+08:00","gmt_modified":"2026-07-01T17:22:44.417407+08:00"},{"id":3678,"source_id":"d5e6b65d89b66c08d62b4c6fc5812f22","target_id":"726a6f97e2aeafee47b271e07e8bab86","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 148-207","gmt_create":"2026-07-01T17:22:44.417521+08:00","gmt_modified":"2026-07-01T17:22:44.417521+08:00"},{"id":3679,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"7257d8ea1f17cf7e6ffde19988e437dc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/services/squiglink.js#216-247","gmt_create":"2026-07-01T17:22:44.417739+08:00","gmt_modified":"2026-07-01T17:22:44.417739+08:00"},{"id":3680,"source_id":"d5e6b65d89b66c08d62b4c6fc5812f22","target_id":"7257d8ea1f17cf7e6ffde19988e437dc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 216-247","gmt_create":"2026-07-01T17:22:44.417865+08:00","gmt_modified":"2026-07-01T17:22:44.417865+08:00"},{"id":3681,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"198c9bc987125a8c495d5f4f4c719320","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#307-369","gmt_create":"2026-07-01T17:22:44.41809+08:00","gmt_modified":"2026-07-01T17:22:44.41809+08:00"},{"id":3682,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"c27046a2ebb06326e9d6b99eed8a9d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#16-46","gmt_create":"2026-07-01T17:22:44.418246+08:00","gmt_modified":"2026-07-01T17:22:44.418246+08:00"},{"id":3683,"source_id":"0d51eea570b0976e572f9c35721fa5e6","target_id":"c27046a2ebb06326e9d6b99eed8a9d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-46","gmt_create":"2026-07-01T17:22:44.418351+08:00","gmt_modified":"2026-07-01T17:22:44.418351+08:00"},{"id":3684,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"e83b1d21fe3ccb7ac2f4d82bb148bc78","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#289-332","gmt_create":"2026-07-01T17:22:44.418496+08:00","gmt_modified":"2026-07-01T17:22:44.418497+08:00"},{"id":3685,"source_id":"0d51eea570b0976e572f9c35721fa5e6","target_id":"e83b1d21fe3ccb7ac2f4d82bb148bc78","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 289-332","gmt_create":"2026-07-01T17:22:44.418602+08:00","gmt_modified":"2026-07-01T17:22:44.418603+08:00"},{"id":3686,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"e8dde18df2307dc1b7b00c3e9546ed83","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/api/model.js#152-165","gmt_create":"2026-07-01T17:22:44.418748+08:00","gmt_modified":"2026-07-01T17:22:44.418748+08:00"},{"id":3687,"source_id":"2d86c0a8ef372bffb82991d44412c989","target_id":"e8dde18df2307dc1b7b00c3e9546ed83","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 152-165","gmt_create":"2026-07-01T17:22:44.418852+08:00","gmt_modified":"2026-07-01T17:22:44.418852+08:00"},{"id":3688,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"dfde97c120aa759be08496d7a1217bb5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/src/views/model/components/ModelFormDialog.vue#1-555","gmt_create":"2026-07-01T17:22:44.419046+08:00","gmt_modified":"2026-07-01T17:22:44.419046+08:00"},{"id":3689,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"9e84158ca8a0ddb6b5e5b73eb1bbe846","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/validators/model.js#3-19","gmt_create":"2026-07-01T17:22:44.420649+08:00","gmt_modified":"2026-07-01T17:22:44.420649+08:00"},{"id":3690,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"d18e23566fd59e80c9f7eec016ef89ab","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#312-317","gmt_create":"2026-07-01T17:22:44.420836+08:00","gmt_modified":"2026-07-01T17:22:44.420836+08:00"},{"id":3691,"source_id":"de74851040d304248e26c1db406458af","target_id":"d18e23566fd59e80c9f7eec016ef89ab","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 312-317","gmt_create":"2026-07-01T17:22:44.420917+08:00","gmt_modified":"2026-07-01T17:22:44.420917+08:00"},{"id":3692,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"bc3c55f1edd18bca0da26fb9aa065f87","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#320-325","gmt_create":"2026-07-01T17:22:44.421028+08:00","gmt_modified":"2026-07-01T17:22:44.421028+08:00"},{"id":3693,"source_id":"de74851040d304248e26c1db406458af","target_id":"bc3c55f1edd18bca0da26fb9aa065f87","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 320-325","gmt_create":"2026-07-01T17:22:44.421129+08:00","gmt_modified":"2026-07-01T17:22:44.421129+08:00"},{"id":3694,"source_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","target_id":"e358b7cff088dfd34df41cc908c799c8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/src/routes/models.js#255-258","gmt_create":"2026-07-01T17:22:44.421238+08:00","gmt_modified":"2026-07-01T17:22:44.421238+08:00"},{"id":3695,"source_id":"de74851040d304248e26c1db406458af","target_id":"e358b7cff088dfd34df41cc908c799c8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 255-258","gmt_create":"2026-07-01T17:22:44.421334+08:00","gmt_modified":"2026-07-01T17:22:44.421334+08:00"},{"id":3696,"source_id":"1f4b6f57-25c5-444e-a943-d162d896dc21","target_id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1f4b6f57-25c5-444e-a943-d162d896dc21 -\u003e 799e02d2-8358-41a1-9f8e-114f8ac00eae","gmt_create":"2026-07-01T17:22:44.990632+08:00","gmt_modified":"2026-07-01T17:22:44.990632+08:00"},{"id":3697,"source_id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","target_id":"8d4422fd-bd93-431d-a97c-70b75f370f82","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d4cb0c3c-97e9-449f-8918-f1c01e7e3561 -\u003e 8d4422fd-bd93-431d-a97c-70b75f370f82","gmt_create":"2026-07-01T17:22:44.991762+08:00","gmt_modified":"2026-07-01T17:22:44.991762+08:00"},{"id":3698,"source_id":"f0978b42-6f98-470e-922f-22dec2fac24d","target_id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f0978b42-6f98-470e-922f-22dec2fac24d -\u003e 9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","gmt_create":"2026-07-01T17:22:44.993138+08:00","gmt_modified":"2026-07-01T17:22:44.993138+08:00"}],"source_files":[{"id":"fc2d0cc85e5f2565c3105cbe0584903a","path":"backend/src/models/Ota.js","filename":"Ota.js","gmt_create":"2026-06-30T18:39:29.607957+08:00","gmt_modified":"2026-06-30T18:39:29.607957+08:00"},{"id":"ba84445ce5118798ce7d0da4ecb4d5e2","path":"backend/src/routes/ota.js","filename":"ota.js","gmt_create":"2026-06-30T18:39:29.608112+08:00","gmt_modified":"2026-06-30T18:39:29.608112+08:00"},{"id":"a15b46bcf0be7bfbc82e57adca5be630","path":"backend/src/services/otaStorage.js","filename":"otaStorage.js","gmt_create":"2026-06-30T18:39:29.608175+08:00","gmt_modified":"2026-06-30T18:39:29.608175+08:00"},{"id":"4bb9a8c7ac3763db0746ff90788525b6","path":"frontend/src/views/ota/index.vue","filename":"index.vue","gmt_create":"2026-06-30T18:39:29.608241+08:00","gmt_modified":"2026-06-30T18:39:29.608241+08:00"},{"id":"29e96dbf4d3d8f6e116ec620bbf504ad","path":"frontend/src/api/ota.js","filename":"ota.js","gmt_create":"2026-06-30T18:39:29.608321+08:00","gmt_modified":"2026-06-30T18:39:29.608321+08:00"},{"id":"5ceb781f55bf90055f3005880d06ee2a","path":"frontend/src/api/blacklist.js","filename":"blacklist.js","gmt_create":"2026-06-30T18:39:29.608385+08:00","gmt_modified":"2026-06-30T18:39:29.608385+08:00"},{"id":"5973b5959029669ade01898821960785","path":"frontend/src/api/otaTargetDevice.js","filename":"otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.608452+08:00","gmt_modified":"2026-06-30T18:39:29.608452+08:00"},{"id":"a84967d9d3088fba02de385738e7ca27","path":"backend/src/models/BlackList.js","filename":"BlackList.js","gmt_create":"2026-06-30T18:39:29.60851+08:00","gmt_modified":"2026-06-30T18:39:29.60851+08:00"},{"id":"4ca379f147f6f1da710371999e08dc24","path":"backend/src/models/OtaTargetDevice.js","filename":"OtaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.608568+08:00","gmt_modified":"2026-06-30T18:39:29.608568+08:00"},{"id":"71a563f23b46da0255a6400402bbfa05","path":"backend/src/routes/blacklist.js","filename":"blacklist.js","gmt_create":"2026-06-30T18:39:29.608628+08:00","gmt_modified":"2026-06-30T18:39:29.608628+08:00"},{"id":"ea6e178b2f0bdcefe2ae8800166453d5","path":"backend/src/routes/otaTargetDevice.js","filename":"otaTargetDevice.js","gmt_create":"2026-06-30T18:39:29.608683+08:00","gmt_modified":"2026-06-30T18:39:29.608683+08:00"},{"id":"30f836e18a6bf9cbcf650e5884375a93","path":"backend/src/utils/response.js","filename":"response.js","gmt_create":"2026-06-30T18:39:29.60874+08:00","gmt_modified":"2026-06-30T18:39:29.608741+08:00"},{"id":"2a04b070bd67fc5059bb504232687d64","path":"backend/src/config/env.js","filename":"env.js","gmt_create":"2026-06-30T18:39:29.60883+08:00","gmt_modified":"2026-06-30T18:39:29.60883+08:00"},{"id":"34fcf7aeb55a9c0224c554fc48545063","path":"frontend/src/utils/request.js","filename":"request.js","gmt_create":"2026-06-30T18:39:29.608908+08:00","gmt_modified":"2026-06-30T18:39:29.608908+08:00"},{"id":"08b8d17e3c09b326687a7bca6789507a","path":"frontend/src/router/index.js","filename":"index.js","gmt_create":"2026-06-30T18:39:29.608963+08:00","gmt_modified":"2026-06-30T18:39:29.608963+08:00"},{"id":"0c25a991664c34b2b36ce3aeed80f4da","path":"DEPLOY.md","filename":"DEPLOY.md","gmt_create":"2026-06-30T18:39:29.60902+08:00","gmt_modified":"2026-06-30T18:39:29.60902+08:00"},{"id":"99aa92df5b8c8412119e9b3cb015f8c4","path":"backend/src/validators/ota.js","filename":"ota.js","gmt_create":"2026-06-30T18:39:56.519241+08:00","gmt_modified":"2026-06-30T18:39:56.519241+08:00"},{"id":"0d26d3961441eb708b69c96f1ed1f7b7","path":"backend/src/validators/blacklist.js","filename":"blacklist.js","gmt_create":"2026-06-30T18:39:56.519295+08:00","gmt_modified":"2026-06-30T18:39:56.519295+08:00"},{"id":"8a4e619bfb6be9c463274f96a2dcb5a0","path":"backend/src/validators/otaTargetDevice.js","filename":"otaTargetDevice.js","gmt_create":"2026-06-30T18:39:56.519437+08:00","gmt_modified":"2026-06-30T18:39:56.519437+08:00"},{"id":"cb4575c8c79b7b9f6ffdac43c2369b95","path":"backend/src/config/database.js","filename":"database.js","gmt_create":"2026-06-30T18:39:56.519757+08:00","gmt_modified":"2026-06-30T18:39:56.519757+08:00"},{"id":"0eb021ef791f4679788fe98caea23e31","path":"frontend/src/views/blacklist/index.vue","filename":"index.vue","gmt_create":"2026-06-30T18:39:56.519888+08:00","gmt_modified":"2026-06-30T18:39:56.519889+08:00"},{"id":"cc4227daf4f2b37377be96fcc492e509","path":"frontend/src/views/ota-target-device/index.vue","filename":"index.vue","gmt_create":"2026-06-30T18:39:56.519934+08:00","gmt_modified":"2026-06-30T18:39:56.519934+08:00"},{"id":"e6564dcd4fbbe8e0f9673967ec4ce3a7","path":"backend/package.json","filename":"package.json","gmt_create":"2026-06-30T18:39:56.529813+08:00","gmt_modified":"2026-06-30T18:39:56.529813+08:00"},{"id":"de74851040d304248e26c1db406458af","path":"backend/src/routes/models.js","filename":"models.js","gmt_create":"2026-07-01T17:22:10.340556+08:00","gmt_modified":"2026-07-01T17:22:10.340556+08:00"},{"id":"387b55f69fa15c066ce97e930d49fca8","path":"backend/src/models/Model.js","filename":"Model.js","gmt_create":"2026-07-01T17:22:10.341127+08:00","gmt_modified":"2026-07-01T17:22:10.341127+08:00"},{"id":"d82c987a9b76c3f9e87e628925cae2d7","path":"backend/src/validators/model.js","filename":"model.js","gmt_create":"2026-07-01T17:22:10.341223+08:00","gmt_modified":"2026-07-01T17:22:10.341223+08:00"},{"id":"c22be0eccf069bf7f87f09ef49070f8d","path":"backend/src/middleware/auth.js","filename":"auth.js","gmt_create":"2026-07-01T17:22:10.341486+08:00","gmt_modified":"2026-07-01T17:22:10.341486+08:00"},{"id":"2d86c0a8ef372bffb82991d44412c989","path":"frontend/src/api/model.js","filename":"model.js","gmt_create":"2026-07-01T17:22:10.341564+08:00","gmt_modified":"2026-07-01T17:22:10.341564+08:00"},{"id":"d5e6b65d89b66c08d62b4c6fc5812f22","path":"backend/src/services/squiglink.js","filename":"squiglink.js","gmt_create":"2026-07-01T17:22:10.341849+08:00","gmt_modified":"2026-07-01T17:22:10.341849+08:00"},{"id":"0d51eea570b0976e572f9c35721fa5e6","path":"frontend/src/views/model/components/ModelFormDialog.vue","filename":"ModelFormDialog.vue","gmt_create":"2026-07-01T17:22:10.341909+08:00","gmt_modified":"2026-07-01T17:22:10.34191+08:00"},{"id":"d2ea644c6ce017e7fa5719f8dc3b2162","path":"frontend/src/views/model/index.vue","filename":"index.vue","gmt_create":"2026-07-01T17:22:40.374761+08:00","gmt_modified":"2026-07-01T17:22:40.374761+08:00"},{"id":"d1931152858f662828e1f616637bf7c1","path":"frontend/src/views/model/composables/useModelList.js","filename":"useModelList.js","gmt_create":"2026-07-01T17:22:40.374835+08:00","gmt_modified":"2026-07-01T17:22:40.374835+08:00"},{"id":"3a38f5cb99e9c74ac72f7fdb85a68c44","path":"frontend/src/views/model/components/CsvViewerDialog.vue","filename":"CsvViewerDialog.vue","gmt_create":"2026-07-01T17:22:40.374977+08:00","gmt_modified":"2026-07-01T17:22:40.374977+08:00"},{"id":"e7043a827f136d1ac2e5dbd1d328712c","path":"frontend/src/views/model/components/EqCacheDialog.vue","filename":"EqCacheDialog.vue","gmt_create":"2026-07-01T17:22:40.375017+08:00","gmt_modified":"2026-07-01T17:22:40.375017+08:00"},{"id":"f05f0f2d2810725d79b63a122d02f104","path":"frontend/src/views/model/components/PushProgressDialog.vue","filename":"PushProgressDialog.vue","gmt_create":"2026-07-01T17:22:40.375054+08:00","gmt_modified":"2026-07-01T17:22:40.375055+08:00"},{"id":"8d94303e4c3a8e363f3ac76cf489cd33","path":"frontend/src/views/model/components/PushViewDialog.vue","filename":"PushViewDialog.vue","gmt_create":"2026-07-01T17:22:40.37534+08:00","gmt_modified":"2026-07-01T17:22:40.37534+08:00"},{"id":"3c92914c0d677b2f5ce5e244c4057020","path":"frontend/src/api/brand.js","filename":"brand.js","gmt_create":"2026-07-01T17:22:40.375633+08:00","gmt_modified":"2026-07-01T17:22:40.375633+08:00"},{"id":"8888802098bf9d46f77f4bb95811e62a","path":"backend/src/models/Brand.js","filename":"Brand.js","gmt_create":"2026-07-01T17:22:40.375862+08:00","gmt_modified":"2026-07-01T17:22:40.375862+08:00"},{"id":"8d10949b317a4f03e8624b7f4ce46d77","path":"backend/src/routes/brands.js","filename":"brands.js","gmt_create":"2026-07-01T17:22:40.37608+08:00","gmt_modified":"2026-07-01T17:22:40.37608+08:00"},{"id":"16acd73277fffb69b4ee4eee82fe6b9e","path":"backend/src/services/measurementStorage.js","filename":"measurementStorage.js","gmt_create":"2026-07-01T17:22:40.376118+08:00","gmt_modified":"2026-07-01T17:22:40.376118+08:00"},{"id":"27717884cd8566480cffa4947e7fa6c5","path":"backend/src/services/eqCacheStorage.js","filename":"eqCacheStorage.js","gmt_create":"2026-07-01T17:22:40.376158+08:00","gmt_modified":"2026-07-01T17:22:40.376158+08:00"},{"id":"65741f66e633d4e5aedac59d5f27af4e","path":"backend/src/services/curveClient.js","filename":"curveClient.js","gmt_create":"2026-07-01T17:22:44.383305+08:00","gmt_modified":"2026-07-01T17:22:44.383305+08:00"}],"wiki_catalogs":[{"id":"dd61923f-65f8-4e98-85f4-0e0a0a649a27","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"项目概述","description":"project-overview","prompt":"为耳机品牌与型号管理平台创建全面的项目概述内容。详细介绍项目的目标、核心功能和技术架构。解释系统的主要用途:品牌管理、型号配置、OTA固件升级、用户权限管理和分享码日志追踪。描述前后端分离架构,包括Vue 3前端和Express后端的技术组合。说明项目的业务价值和应用场景。提供快速开始指南,包括系统要求、安装步骤和基本使用方法。使用与代码库一致的术语,为初学者提供概念性概述,同时为有经验的开发者提供技术细节。","progress_status":"completed","dependent_files":"README.md,DEPLOY.md,docker-compose.yml","gmt_create":"2026-06-30T14:04:20.633103+08:00","gmt_modified":"2026-06-30T14:09:11.174236+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wV7ojrH0+b4JMz5OewwhBN1ELEwwkQElYbXolx+YIQM0o2FbBtwH/qJtog2gIHchdNwll6Nf1h+JmY9opyg7JsQs/7cTSSrfUmluAQwFCDAvmu/tGmL3XeCzrrmkOI88h7pvsgL2niGJR0xRh4Lglcxbrr0NK4gOQ45RwQchyzpGTB8IiO3XRTcNftONnEzDiJzVODyKOjZe52ws6XblEwu77xu3aef4IAzXLIbyoTb10Z/ue/QVjfqwkoEB9u5ciW4cJImri5dT+xVeLMwEADbmq8MbYy3QkUi4lCv+02P52HSrp5PmR0p110l5NRD3wnUyJ4H3excBt4DYq/WkTlWRnu7SL4FLbChfDRXox0FZjbrSrmstSyjrqOQs0i+3DWG1cAoapA34zEKMkiP2oxZKPn+7VEJ/X8+B7JhsqroKmAs/NykYkyA78uoY/rRIZzhCoDGERQV+E21xUWuvlE/M6M9LjVSnEkBww9yRnijToD6+usihE9d0zbv3MzXNqNqaye4++Ko+2iPoV2eV7lIQXwMto7c2DhmZGyJ5OEE45X826wBdjL/sO1X1QPuglr4HEFXnds8hBA4bPAqVmgptC8bfkf03XDZOL4nlmljZN+Kip5CAYgR9K5mKRD8ZS9gGT6ieJ0jbcHoo6kysaXa+jBICwzeAEQzmvxq2JqEukLdcKXOrZ0CgeeU8SADva7E+gvKzvS/4Zrbv5UEM8NkYcqeX4k9ERuVUjy5J96C0S2GCNR5OPStfW2tKkrorTKngImbE1l0f1/FI2ZhI5sSjUkzAZIKFeXBJpA1hZSNME+E+UIJ+RvcsprmVx62wG1PlwMBeEhu/9cGBj+i+qI6uAlGdhybWAqGSSxsLwdqCiwQEcylelO7fNlSrnz7amb1JuqBfUynCEzpnlNkv6l9jioHXV/fnJIOihiNh7v6/AMwtMvmSnr/j1oUAuJQuDAW149PMRpTre8XUtulayHzPj4ZY7R+4VpHR5kmYcTNmUnCf7Q26XVU6NLlv9Qu/gvQ2TPuGOKCs579fz3jbJC6rn+mQXlkz+vQFu2x4MrUvomEqqCVV9lv7ORQqVPJuJCH5onWcX84PFxIMq38bqGCQ="},{"id":"bcc45977-c058-4033-b0b1-9fd4cd7f4443","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"前端架构","description":"frontend-architecture","prompt":"创建前端架构文档,详细说明Vue 3单页应用的整体架构设计。解释Composition API的使用模式、组件层次结构、路由配置和状态管理策略。文档化Vite构建工具的配置和优化方案。说明前端与后端API的交互模式、错误处理机制和性能优化策略。包含组件通信模式、依赖管理和打包部署流程。提供前端开发环境配置和调试指南。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","progress_status":"completed","dependent_files":"frontend/src/main.js,frontend/src/App.vue,frontend/src/router/index.js,frontend/vite.config.js","gmt_create":"2026-06-30T14:04:44.763098+08:00","gmt_modified":"2026-06-30T14:14:52.87794+08:00","raw_data":"WikiEncrypted:rJ/rIw0gVau8jPGqKFBAsMR2XDSFypkKHZQ6YBOgiEB18etPNKW/AKXxDO5P260N8cfR8zM/FPLMKEziA2ENAEHVfReiRH5pH+fgWYT+2jYTA7RQlp0TufhpU942Hkc/ujxUhYq+V3QzFALbuwWzvx0UL8Xl+TN5xmZ1UNdZO71Qogp53zx2hXdFdKaPDrr4z+LIar4k3xztnrU6feh8nqiV6INc8alIAN875sC2qpjIyq5wlayKyIdU0M+5DXjHjuV+3QmKO4f+JccdKivcFYhs66YKXadO78U+Sx6jpT0RqNqSmB5SNJLPpp6YbwEYtig2YvqVxHgh+FtviAJo+3aiePQw/TkCYVV02sx3HchcKY17yohkf/cGQMfHWKjBC7ZyuuD2WOHobXyyVuIuHVDKntJ2SjXdR7GaQPDZaxSWpeHYcn0+Z1hICSDDP4TfjuXCKtOx01urOs4lYqZsN2SPy3LljUhl9H5uWpEV3VH/LPqTWQ6MdLG8aye4mMcCsw57e+goYu3oRkRf7qvVOAVztMhQTkCgcUPkiPfB+YdqPMMp430Bqr55/AYFsFD2GmYltN+8OgBqLdislp5mudOEF8uE6Awfn0xbNJNePcUD1+Esx+V+RGIXYVMeRXcagKyoftiqtJy7zjwWBmr/oTG428St7QGB+Yha7dSK7y6WiOZjdDUs5Jm354mpkojurMNDW9Pw3s7Rt24W3JHN+Z8iSUq9+Cr2kaQyNT4G8XaqIe0s8pFYoGeAeYcZvyolp+0ZZ6pAH3tyuVe8hrE+3+/x/dOKV5WsDc7Jul/RY0qtkjt39mvXPzbxtMbwGhahGz0xRVYJMlhMkcN/dqJI4Jj0QtNULaonjkU/joC8aUC2Vfa8MFrpfwSTVytGIrfPAvxbxMYgPvqi8KSjqjV5lpDGUcYA+DMgqLOv7mPVrPBosl5m0J5Fitt9KmR1j2OOr77AyteAWJcBvK/idJN48LdNVtAYqErjTGb16luVO1yW9sDX8VXCKzUPBQ8boXaJ","layer_level":1},{"id":"d34906db-4455-4481-9512-b29115655378","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"认证系统API","description":"auth-api","prompt":"为认证系统API创建详细的RESTful API文档。记录用户登录、登出、密码修改等认证相关接口的HTTP方法、URL模式、请求/响应模式和认证方法。包含JWT令牌生成、验证和刷新机制的详细说明。提供认证中间件的使用示例和错误处理策略。文档化密码加密、令牌过期处理和安全最佳实践。包含常见的认证场景、客户端实现指南和调试技巧。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","progress_status":"completed","dependent_files":"backend/src/routes/auth.js,backend/src/middleware/auth.js,backend/src/utils/jwt.js,backend/src/utils/password.js","gmt_create":"2026-06-30T14:04:55.151403+08:00","gmt_modified":"2026-06-30T14:15:47.981318+08:00","raw_data":"WikiEncrypted:I6KYYMxpAemyHFwJy5bny+FhLrJAxcHi9isgLCIR7jKgk+RtRRSImYeiedSZDcwnIMYAtWgsiGag9xYiTBcpIby59MhEIf69Ge8Ey272sEwv4rLKoaCbet71KAMUN4denOOfuaKbrwbXK0Y6FbehkE+pCWtq6ubo7or5Tl+PIwwX3Vha0M9C0aYlIBIXgML+2LymHuPdeYf/f+yy7ivDCl4nIRTcM9C82jpKialSDtNyDOeJKcvnuY7WboeTuADzL6A5fX/baERJkVBnSdbIynmMfReneVt5JAopJ+2NyT22CaFtr2L3C+DKZ74FDaU6iC/85eg42OZ2JgeBZXiffstckEhj2B8H2dLfxGDmQUebrfF6cqty5biCE3zW8cU1QI3+bPdfGaoUhj5xFzd437cjGI+IAkNffhuBei52tU9+6Uyp/Ym7bEGnUpxwS1OOijeLKUstO9d9z5MAs5Ip5+HVcliUeAVujyIwd76cvmbhnuaspCX23T55qAvLoTJKWmDBZaKzPE6hCpNAHPfq9b7tOLID4W0tvfFPZnzGWsZK4LhJHC3i/qAGdXsXDc/JijZ7xvhJMYqJMxcoZ4hdtAdv1YjL98AOd++9n9H0hDplAqDf638QwPeaKC6ogkEw5LCWjJFC3FbT+FvpZTxN7RRHFPVNndBrtwSEJR/6/EfA6+9lpuWMXHNhL2Hl4GsMybpXzg4+AihB6Xy9GPv5kkG1enLqgCaaQJ1blr2eb9rUYLvCkQMW+DRqPPQxfniLGGB5WuUkzxn/NzDZ++XhFvmvW6s0+TPiCNMxhx55Jd+O1ta0CeYAptKYmjSJmlT2XDRO/aqedoSZyzYc3L9gtYD4V6FRBsTtOKLyB22oei614ORfyRcALpx0q5/EeyLHYVN0UM2Xsh5n08o9+mCzjkPjSVfG9NIIBhGUTEj1i4dKxB4vM4hLk3x9i8HdfoZ6f4+3iHGqQtHSFId685Izyli748sL55omKo8e0lizEKTrYd5W2vZUviHInfD/D2cIfwRtRBEksNW/6ycVp+dc33cqX6BIN1uwL7uMBhCJyrLl9TbEaEDKPHaGmi4jx9W+","layer_level":1},{"id":"0f657e8b-77cb-4604-81cd-d3e921d28e21","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"布局组件","description":"layout-components","prompt":"创建布局组件的详细文档,重点描述主布局组件的设计架构和实现细节。详细说明布局组件如何组织页面结构,包括侧边栏、头部导航、内容区域的布局方式。记录布局组件的props配置、插槽使用和响应式设计实现。提供布局切换、主题适配和移动端适配的具体示例。解释布局组件与其他页面组件的集成方式和数据流向。包含布局定制化选项和样式覆盖方法。","parent_id":"aa2583bf-2c6e-4792-b794-1563db547d08","progress_status":"completed","dependent_files":"frontend/src/layout/index.vue","gmt_create":"2026-06-30T14:05:00.056535+08:00","gmt_modified":"2026-06-30T14:15:24.296404+08:00","raw_data":"WikiEncrypted:x3LcpLCzT0KOPxd1xeYY3c7iq48qz+WPAPm3x7MWgVl9Ka0y39BYIpkYIXIwXtcEkjLNRqcKoI34Ay7VLfvIoeNd0L9KiPW38nGEktOH2kdRoWStqgftHHDZZMeM3wTiHozP2mtq/BrgXkFbslneMaOqL0jcIeyYsEzK3XOf2IWybFopdsfudEA64erTFyD7rwb4i8M4/OQlv/7phzTi6ud+DXkigQ4QxPbXoU8Pb60EBp1eZghvTXVMFb5rlp+3kbG8uerYS+ciu/fjCScjFieZOug+uuHKkFaFYBj8Za7rmsWg02byP4r8E5yKIzSPDy+NZcyXTRKFGHYtNCtj4aueEWW2oLGYR0/nYHoeMgwdpaKxBg9Ye0gbrAr9gQvUxrzpwdRrUEUmPdp4oTmO1+y7PWruf0IGT+IA7KRfCxZ03rVNE1s6b72zwuUdEps8hXGWIMTqoYJYcYh57cVQj9l1O153yZRu3x4+GhgBW3fblpCW+bEz14xJrftnR/Qve4y83EkfHuQurRD/YlwaAXS6/Wd0aG06MsRzr2xJPgKjLVxTtAsdz5BI8ksED+Rpxs+vKy/CDOvvIUhAx1A0xnzRxDB+ZCR+u/EilCFFyqqqZyWB90BOY5jlYG9Ci2wONLki4Vjgwz6irpTnjyAwev4wTO/8aLJVBupWUqU5MB6mAreomYWt8GYTQqybbkozb5cbV5rNhZTZql0EV7u9+K4mxe4913Os4q+mI5AbzsqzM16xKoV94kRhPaiubGHpXhh9bVmMFx1DyDRVXPlu1zbbRnGMgbH1bIp5FdYRH38HFuxpXMeHfBmyWq2CIVOuMgJQZ+WFbqZPfHN+LjcAOYmhW/MnaBS3TKjqR/3lHriai1eaX6gHyHcqjUCh/6/IwJ311KB5KiG74iE+EWk1a16r+k5oTkTOUMNGX7YnwoVLs+kVHv1fnD14Rwf3OBrXEKFkNyWE9mPL5SV18Yedhg==","layer_level":1},{"id":"7f36202b-af69-4fc0-b62b-a57e415deb69","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"部署指南","description":"deployment-guide","prompt":"创建详细的部署指南文档,涵盖首次部署、本地构建上传、更新部署等完整流程。详细说明服务器准备工作、目录结构创建、环境变量配置步骤。包含Docker Compose配置说明、服务端口映射和网络设置。提供上传脚本使用方法、手动rsync上传方式和构建启动命令。文档化健康检查、服务验证和常见部署问题解决方案。包含生产环境安全配置建议和最佳实践。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","progress_status":"completed","dependent_files":"DEPLOY.md,docker-compose.yml,scripts/upload.sh","gmt_create":"2026-06-30T14:05:12.310696+08:00","gmt_modified":"2026-06-30T14:16:33.828055+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3wxq1Ie83+Lf6EMuycQSN7s3NFV5ooa3Scq2B9C67gTKq2J61WmIo8uwzopEI3o+rxz7q0fBEeW1pmj3Z5yCZzfN7Q3gteOOQtgoQ9YkE4gpYcO2aDGkpGrIWWNjjQ7GyOJYn8FGR2f/tSJ7yy/HcDn5d2NMrcqrwu4CX5Gvyd5xJmIYcuVjpKRByATlNCS1zM5hEwvlL73AQR2eSztdK0b5QNmGctlhqTgf/bfJABgos38mVZQzbH7O9ocFFyJUbFu6uhqIefp9TJkdsbvU1uMF0d4ZiOsIuQb0iFW9suvsoVwvoTRh4P2mAHkIgDv1aQoO66lJ5hTpWGKjuTRoBV+UETV62ofFoNftmlPOqxy+OikSbYqZh3VfJHAM/gj/ehoEfHSCQXl+YPs6HmF0O72rArAXK0t95ls3PNrQO9l0dAP9L1/TwQrroJcZP2FGM7uiesHanN3jdTNXwgBD3l9gUOzOGl/15A7bXkqFfom4mPjqe6+/6cyxTQzxI7oAwU5654D+GtFcAXw7zvEMq0cOeDIeMUocxBNVpRf8SIpWDCB5fuZth/RVBCE29a0lazqZfhtrvKoROmw9go1mbNtfu0GYtrWHuz3BkMaVCGKKYV2TENB8j91AHzomcbKh1sWaWOVzi2XZUHTcZNhOW7Ob8mCxLNxbYWc+goUyiGyu6fI8rJcq69+Eq6MdAlDb8H23H7TSYkPWwvoiI4SRihEX+kEcVRlZgcxYloixMRqcfAirLSbzDrUxdyL+A636HqHK5wbrXT01hUSqhqmuXcDl1jUYIcSZaaS2GdN5sPNr/tfAEvV/QuZx8OV18PJa1uc0WRgGiX/0qbXAJL9l9rZEPkjjNf1X4S/9PNYbQ7y4YCSa1ug33vS9PYtl3eNOvb8aXrgcYnFnrkCIa/XOtmTrizRBLEyjVMUkRb20GAfpUamYhWVOkVmvOU+OtWeD85PtY9aYy61msYID323pMp14=","layer_level":1},{"id":"dbe5d77f-6f4d-476c-88cf-797b80a11a11","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"实体关系设计","description":"entity-relationships","prompt":"创建详细的实体关系设计文档,说明Brand、Model、Ota之间的关联关系和映射策略。文档化一对一、一对多关系的实现方式,包括外键约束、级联操作和数据完整性保证。解释ORM模型间的关联定义,包括hasMany、belongsTo、hasOne等关系映射。提供实体关系图和实际的数据流向示例。说明关系查询的最佳实践和性能优化策略。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","progress_status":"completed","dependent_files":"backend/src/models/index.js,backend/src/models/Brand.js,backend/src/models/Model.js,backend/src/models/Ota.js","gmt_create":"2026-06-30T14:05:22.620322+08:00","gmt_modified":"2026-06-30T14:18:01.587347+08:00","raw_data":"WikiEncrypted:WnER6MhWFG6N6U3R1m3zi9/PE7USWRBJSA4m5rdVd0roBuaFoWjKznz76Q8kOGO4tNwaCSIDcUIRQho0AHAeCEii3WPT3hVXrhQQYjEzvKo6SYnxMHFyoqyC8KkItViNO7QMqwUXCOqIqkKYJbtN9Sajekq73kPvPqvY8BHSNnqfwmaK1orPvHIjh8Q37172/jp+exIQ+FflmU+mfYsQJ0KuorznohYsQIf3qlfg8KiwSW0u0L8K99eblOKDbNN7MYtC9qf0iFzdGSOSwR4u5r4gtdCB7SAZCvwuy+HaSOgXF4oQDX+STWKFSq2xGuZf3y54WkpwBnQtNhvzIQLDsBrIlz9tHbHjMaQwU3a8HTu8JTO3mYJ3BTiKKC+jsgxGTxRRRTQ9PhQo1waFlJnCSVsR+m30u2zHgq9G3gwORjBImo9vcEDistxC+xSWMBsfJzWlXUhx5EjJYrZ1oHpgxmUGyLoTlfCJvJoNqs+vQLDuVZ6jd6juOPkJ7sanKd4TlWRy4lLmetztJb8ZAKPP6R4RV0YcU4IV3Lr/Tm0KzcHdb84aWPsI0EgbfUkJAWjCOieqWTHBE3qfwchsJYJqR3RrOuH+/OgRl1A6P/5XR2tG4/LwC5N356o2YR38E4icxdWGirKniBpii3TVWrqGEkWMsUbRenNq6PCyT/kcGEb1Mn+/c4b1Rb80dNweaNWDSOLmHQFMvwtgxh48I7NXGBAprbcEP+kwn8U6cf+oo+LDgHKyTDMssoP+fUOnruX6Eq9vx3pklQUfost9b2918rL+L5N9/tKoCpCmXHMgjuEE94T77bU7dXpcCRjh6dza/rLHJfo9rcOESul7Y0UthoahAetOF8CRzabuRNfSA3+/EgpkViiYcAqUOfJO9prMaKspC6udBaqAb8GX20oPvVBnGdehFhjW6ZNUKwhOOyBRpudc+qhvrCn14VSOV60QyhfWkkOtqy6adpmbqDfDn/boGiahg8EgnrKUin0NLy9vZH/v3RdDSgNXAhCHJng3as9wGB02Lo7l/LIlX0/+Pw==","layer_level":1},{"id":"1af0f0e8-0c53-41d7-a894-47d9cc19d4f9","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户认证系统","description":"authentication-system","prompt":"为用户认证系统创建详细内容,深入解释JWT认证机制、密码加密解密、中间件验证流程的实现细节。包含来自实际代码库的具体示例,展示用户登录、令牌生成、权限验证、超级管理员权限检查等功能。文档化认证中间件的配置选项、参数和返回值。解释与路由系统、前端认证状态管理的关系。解决常见的认证问题如令牌过期、权限不足等场景。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","progress_status":"completed","dependent_files":"backend/src/middleware/auth.js,backend/src/utils/jwt.js,backend/src/utils/password.js,backend/src/routes/auth.js,frontend/src/views/login/index.vue,frontend/src/utils/auth.js","gmt_create":"2026-06-30T14:05:25.89264+08:00","gmt_modified":"2026-06-30T14:17:38.563207+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBLXlO/kfAAqZjShpoDF/LwxjObF9jWClg1BjbeyHIZSgS1kW1/rwYWDBEsAU51nyKaMjqaYMMCeAu0tGWpZIc0izGBmzwh6bfOUHboVu8bTGN57x7Ig4dNdDghiUoJkJKQX4Ys9KTK8TqI3fswjZz8hglaQGl4NeRcIcMv/X6D2PrvWe1qVFdZ0SPTExOhFw3RHcXIB6SwncZI+aMeqX09v6wHL4Cp5stm7AWL+txJygRSaQYujDcE62s9wfDJweKf/BQ/zTEigEdc5GbzkMnf5NFxmbi8jVDO7wUEofR5O+0G7fH1Wf3oAZBMkevD8TNGju735s+O957j0f4XKsnnX9lsLIvYZtW3hwTKNBeBoujNYJuApW03clJesocX3Wf8ww8m1IO2jArAjxNy5Kz5feFkFhHiCG8MEacgHT8kg3E7ZzxyNGQ9qNkHcWapTIQs0bhq055rPjXYps6gxDBnOgFKy8B8vJf6NOsu03pfZ3uD3dNNqpYwGSW0z6lGvHkDJd2fJxAFHPmnmL4angdyPotlYsK94FpYGrRt1S9x1phZ9rGSahcTUMsqDcT9Yf+KRzNIDRSVSA32KNeKkIlJ7KkS/Wm0jraxDEOETgabNiprZu9IQc2rO+qgL11sXS2ztPP5P+se2fpoWR4kk1uiZ47ZmEOozxu4PiysCNnQaMA8ANHI+wEeZnkX2tQbrDymKi+ns1ZC695WMnYfGVqqzW7ztwv6hcCxyg1h0cCTV85FVN56EYr/FayPkYHDGEZZVV5ZUDvhVDpwyR3SbeAFQjsbJ0kKXLG89LTiuNzGgRwI4aA6bxge2JglaT1f+mtyXbZSnfdajBzphQGhsXB18VE2IXqwfYJigbP5F/u+e6mB7sN63cqVRQ1ydNmvawS0ojJpoUdPJp746BGGnKgHcDOaskuD4puwZFDNJVLFQql+zdoIL74vkQKXIqKhlm4hvnkOFZ06ODxcJWJqQNMT4gzixw0eo6Edc3t7Gz3J/XGJn+Lm4JoYBdAk0PmDWtQqqAjKqm9ftEqhlBb/nAlZxetLWvyg1railkNORM+louiBsqTKmMqeuxFGvIMxTWvlU0z1uFTBuzUgVEKqUJRQL7XYgPhEQngiJN01Bm3XHt2zKUINah98fqoWiyyAHyX0v/dIbaMiyXnzSIZLIBWZDZL/N1ypvWw8ffozNBXfZhGhoE0OUp+tItqNmnVsYGvwtU1dFJK3ZuLGGkiqACmSRg+oIqURaokDzn4B10iFNXdloxmOHr7bgSoCjlSjyXfECCg+t9GlrWtFGusJSHzWiRdg6rJ9Rd1iTeSafPGd1AD2mZ1bTOdXmS6IT2utJkj4CIc2gIkIpnlTql1NbuOfDA4NTL+t/649wrNxdl/tfq2+8LlsB48ND80XGMdAuipGWEYynvogLDZguqmDXtxMo=","layer_level":1},{"id":"8f0760f5-ef8b-43ef-8fd0-7c6d1f693193","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"侧边栏Logo组件","description":"sidebar-logo-component","prompt":"创建侧边栏Logo组件的详细文档。深入解释SVG图形设计的实现原理,包括渐变色定义、阴影效果和动画过渡。详细说明collapsed属性的作用机制和响应式布局适配。记录组件的CSS样式体系,包括Flex布局、动画过渡和响应式断点。提供在不同侧边栏状态下的使用示例,包括展开和折叠两种模式的视觉差异。解释无障碍访问设计,如aria-hidden属性的使用。包含性能优化建议和自定义样式的扩展方法。","parent_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","progress_status":"completed","dependent_files":"frontend/src/components/SidebarLogo.vue","gmt_create":"2026-06-30T14:05:28.622668+08:00","gmt_modified":"2026-06-30T14:34:09.996181+08:00","raw_data":"WikiEncrypted:fV4HuQ/J1++1YCiBadzlA/Ad9WGt57Xw0P0O4e1aWBZ8j7ewAMLGa30PoRyFOz3WPxWhYzFV771iPkiUIngbYLg/7p5O4HeDzmBW51nlwAWF6h03zUwo1BVzYo/fjr3K/vHHffvWiWcvf6+/Pi/zO1p95ifW1RHBzkGDc4cbtCFnI4TExB7L8RgFPd4xt6LWCmL98hBAGxxSmeVmm2WQY1xGJjqXhRpxokLo77b3Ez1EWub03MklHAlEi4JLgZCXeG0AZMzGl2EApA0orVb+k1nPHohU/sYPxOP1g77oqTo0L6eRrJYqLVzXM4dPj6cJPfoiL1VO/2KqEXmJqEEcvA8tI8Vv7fNcUxexyGaVLP6NrOdFw7GfunFw5t/QC4hNv3P7MI8EUJYJ/PidrenCXzv2FJL9zWw9IsaJbDglurckMqQQka4/AwPlhiPqUP3v9KzvsSqKogDiv94Gx6K87tIpDsodProyn5dx5GKnJIQRuNQYX1lpPTVqMQ2OlAD5KvAnp1VHGyVMPixJgwRLl/SX/Y/mmbAA3QAZC3s3LJSW/Hh6OogBVuThelQoKNB2/rPZ/yEgXcFUj+H9At4yNojzuBdqqMakOsrfs/1WsYmEsUXZ/HgLkCJR2T6jL0BiRhXisXcj5fbzxADw26kbKBhW/suo/JwIzITcMgr+B+vwdmIYlROk2zRWQTcSVdtpdouiZLy50KNTRIQYgqiiE7nEL/p885dM13alTVH7cRjdXV993ONl6tRfBQnS9o2VAa9B/IoHSXQjblj73awUecvCir7Ougv3SPoE8GPBJakIDBiVOGlcooQQjVelDtXjn5zyuz6cLPIZF9rqakHJT7KHTZrM2+Wi+TKoGF4IR0mEcinmwEe+JNRIkItConCqwWx3Ekz+kabb7E1CpVm1yA8794xHHJtDSak71A7IL0KO7cUUC0tFTuy+c5W/vuZfoZX4oiO0lX2SvlQGYkguIQWABQjuuCjerUkGgiScVohUoSA1vJVnraaSNsC3edoxL+W4+juGOZytBN0HGZS0U6a1asEka7fODrK/yhDNJ2XKz7+pcu4DwgRtUHUM26FEG84uR2EBgZRiuI2c7YA9Ag==","layer_level":2},{"id":"105cfe1d-aeeb-44c1-ac3b-6550f2c7a307","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"首页仪表板","description":"home-page","prompt":"创建首页仪表板页面的详细文档。全面介绍首页的功能布局和数据展示机制,包括欢迎信息显示、快捷入口卡片、今日新增统计等核心组件。详细说明首页的数据获取流程,包括getTodayStats API调用、数据格式解析和状态管理。记录首页的响应式布局设计、样式定制和用户体验优化。解释快捷入口的配置方式、路由跳转机制和用户交互行为。提供首页组件的生命周期管理、错误处理和性能优化的最佳实践。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","progress_status":"completed","dependent_files":"frontend/src/views/home/index.vue,frontend/src/api/dashboard.js","gmt_create":"2026-06-30T14:05:55.602204+08:00","gmt_modified":"2026-06-30T14:35:15.434226+08:00","raw_data":"WikiEncrypted:l84AvQDvM6QBXs3c27I7iRN2eqIKPqqnLN0fpl6W1NXbpSYLO1ugdN9q3vfdxcOimx9t9/zu6SUc26bwQ+elEbS+I0PRYDRL4shhpb72Ma/Ng8alFtrqEXILpNlDWRs9AoWzQ2KDmoixk2jOewMEH3JllHtJ8DUYUZNp06dby1l7BRtvY2mOkugkoAohYAjj4QyuCm4GXiALmsr7NFR3LC3O0kqbZE21xaDZXflITmtjSkBHJVQtkVH23ciBJVtJx7Co85atOo33DVRVlrOhEJtgP3suOSOLawlRAo6EcizG7y3pDIU5ypo7B8YRrtllA0l35kDhk3pyDTN1sj7bajT9y2fIinJVq2T/AOLyueKRKMFNLrzr1chgaXuxLhiVRpeHk7C325h3AGYYJ9+6Xtr9kmA5H4Ebjk+2sk2YLVBogzJelsdYQqCiBDGzCxN0BAVpEtw7J50eZ+XDVbOY7JUC16j0oiXukJycIku1pthhJUplqc3HiyebwYVuxfxWdM+2IV0+/ic+3NzpGhu19jpGFUZnSD4NLtTW6QCHZMn4FcScTwzn3/5byoDiy6M6RaM3JFXc1XjuZySnsFKAO/Bo/PgZMmoaNUj+gHQTBOhFflMX2DlPEpj+q5NpHNyY11SKV61o7RWYW8r4F9r22VlfvDnLPI2PEvkX4bjKEBeR3vYrx7FpVdNWkqK9JpVWewynEwDS7csRjVfkc43fe6xYto8zEDV1/AjQdPOhSQHP3UOztX3pS7sBLJq/2N8sWJqG+YrGE6N8mVAmjm4/i1jR1vP9HaW3cqoo4fYDacBXqFkEIyqDicgLUVe2+pCWp5Lek0ENTV1TmLovw2a8dsooOU6GQMozpayiXhtI+WzwZxtXAFHTaVyHFJiWYMOOH1xDFV/IfD54CHmfO9/W/bjOZnxKeS/jSJygbW1/5U3jX84UX1n/gqGOsSnO4SKJDEQbdK6PB4+9ounpuIITKPmk7KMn27m//tj8HPjx3W9lenipUy68iqVbiEUqz+/Ty0SFO87eWJGkvXE/HqepzBh5V7XvutH4Y3F0V+GKn9MYQrquYT8PrsUhfk8cZdXdsq28aDUYUl+B4Q35nG0gew==","layer_level":2},{"id":"de69fb0c-330e-4831-813d-94fb958688da","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"快速开始","description":"getting-started","prompt":"创建详细的快速开始指南,帮助开发者快速搭建和运行项目。包含完整的环境要求说明(Node.js、MySQL、Redis等)、依赖安装步骤、数据库初始化过程、环境变量配置和启动命令。提供Docker容器化部署的完整流程,包括镜像构建和容器启动。包含常见安装问题的解决方案和故障排除提示。提供基本的使用示例,展示如何添加第一个品牌、创建型号和进行OTA更新。确保内容对初学者友好,同时提供足够的技术细节。","order":1,"progress_status":"completed","dependent_files":"backend/package.json,frontend/package.json,backend/start.sh,frontend/install.bat,docker-compose.yml","gmt_create":"2026-06-30T14:04:20.637065+08:00","gmt_modified":"2026-06-30T14:07:37.615397+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRS4I2JpxuOJTz8eCWMUZ1Uyzl3ct5rsyIFu8fuwdbAeggGoVlXxfRcT82rVraC1rlaQRGO5kgcNTJgIeZDa7KIJzJReW1AF2gOcg85NxmyD2QBPU20jUQG8tQZgyOekDGEvFa7bKU1UDQLDNO4yVWuGIsKgfV/whNAizKl0ZZaZ+9iWM2XXBDA9sLrXZQD7fyzUl3elNmWx830Y5ju+KudGoo33Kt/Zp5fVC96xUUwKGcGwH9ptvzXwJy6/w/sF3x8vbGuLrEvc3DHTShxmj7sNOi9NQlkBUDWrQbl44wQC9NfLJYbEHG5mWaT3bFotTFxn/bxdbAce7P9osAkl9SDqVly0X70YjXY4Axe0EdO80cCfQwynIN+uONKc2K+DcTIjJYXIK+dE5l1LUWXxSAWbsgxjnTgTeRqS/RJ7U/LwV6x3M+O42mw7d57H8byAPhaALheFipMQM2Xxemr8LmrCaU/OyB1Zt7NSjO9icOjS7ce0KBJMehTWPQn27B6NBZIwT5MvbL+9Y57TJzYRoPUaywWNeNl20CsE3D7BPdkNz7cT3NEYSTghAfeU0vF120Z/28Pq15ZxBRmIDF6obYSk8NJLSGbOIxYm6QWdJ5c/NnktUQ5V+LKFEgPFSF3HFzIEpolqTpuA30n3Ok0tdZgrCKqqreZOg8uMZPai73OsMcEfntY83IyMpmxd6KNmaZW06B/uk7VOvC6T0wpPksXFRSXonlh0fgnFt4o3fusophHFTQTcpWeBSacU8y2fSx8X6q2zYQj4H/czf/7ijEyOhGFRdm08Eir3Y7kYYFI8hQBfVdDOZ6gFQ5HkQME0ktc5JOWoaqNYrVpVidXpLQ5YMhsh4lHao/nOxWraq/zC3qxrIikrUW0zchTI/h3Jd0fDHMhC2t+Lkbztk3oZ2oCcejCqLBcLrv9ZfkdOxCD+Z4bOao7gjk7dTngaflTdhV8wLJ2RV5IeB0U5YTPVdBfo2VZ3Z5lwdr2Uul/0kxsFfvLfAHgvs+X4oxWle5XW5cu8PoSaCj/pLYjR+/CZ7mtEZLCWj4gas0xmYzqylOaFjIk5cGaAQiW9aRrb4nL6YWK0IH8tum/o61yMkXp4rm6cC3lDsToPthqlHlAoziWtZLPsvc9z6zXUwW38sIA9pz1Q=="},{"id":"5a3639b1-98bc-4bc7-a346-91ed56edd2af","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"后端架构","description":"backend-architecture","prompt":"创建后端架构文档,详细说明Express应用的架构设计和实现。解释MVC模式的具体实现、中间件体系和路由组织结构。文档化数据库连接管理、Redis缓存策略和日志系统配置。说明认证授权机制、错误处理和请求限制策略。包含API版本管理、安全防护和性能优化方案。提供后端服务的启动流程、健康检查和监控配置。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","order":1,"progress_status":"completed","dependent_files":"backend/src/app.js,backend/src/config/database.js,backend/src/config/redis.js,backend/src/middleware/auth.js","gmt_create":"2026-06-30T14:04:44.765806+08:00","gmt_modified":"2026-06-30T14:19:05.642968+08:00","raw_data":"WikiEncrypted:N3UbzwGjCC3xD6BrTM0cq8Y9ccVoDb9n1FwE8c3MNy31fwp7itn1eN/9SBNHQuzqn4Z/E95mV5akFaXhbd+x3Hbeb8Lp+QkTMOKfZNQyKojFvMb3nIaA+mV48tDXDWEqxrlhh4JpRydgTIGrd8n1WR3CjiMs1OtPA6kBQSdqoDuuhqzpLQF8idz+njTnv94/o/48fQBsI6bG1frzakIYWOtViLMUk+plRMY5j0337M+sVWAzgVAFVqgiBfjrTGY6V5DqUqCh8xE5q7CAvBRDT1Jmo2M8F60+ejp31MVUAg6xRp6POj/W3ik2qnAYOVweqNiTiYyns3uz+8l5xceif6+1JZOepuVFsY2Temglybru9Gz2+d+3AJpuvKT5LjJnJ+BMF0P3sGW2ATh6rsJJIu6u7uWn4yr6rsZZYNqdEQW+qWwkT97SWLMa1xtsuNiR3+QKu13kqysVkXG4H/394AJwDoljAoFMTzOsbUlUkY6QrOsx6LagWGbhXIqFrRfDWnSMkE81wWy3pcgFETEzQIaN+xAjV/skriEvn2clKJ6c4DNKTiS/iLu+5T3UPOXO2kbKzPwVqlxhU0xGZ1Pq2RodxcdD2f0abxDz3g0Wx97q+SQUyHL/KmFznoAq7YvBwKc0bWAQXkc1FvmZ6XGHyxoO2JyrbzZOMumcj3gZ6Zxc4nUPXKPoKXDL7unysWj4JDOcJhSB+hGDKjckKvvLLeDFShiGN/JjptjQMBiU39yfOom3FOP/vM/S9QSF3WNTopdDHkSmlh7dZWtHUE/z4TL3fYmzT3iFsTj4yjeoP3+Yx51P+Hz/3jrBPpT92jRo66eNc3GuySe1DeaXPT1YWdIr7S3r5T1r/ojXI4tcYdNj/LkmB+pLLsIvvosu/ETHXLP4L+Brr+mJWjJGSSz7IzsH4UlQFwh0nY8tbkO6UsTnmZY7PQhOHvuLVCOQ3qaLfKU2LxfMTm8oDj/lbOxS9/1KKy/W99UmrkMvhardyA1Y8SqsnkPCXZqFkn7POOgOaIY2vWUs+L4PKd829ZApvZMyukooOwm4NhCvWOp33xo=","layer_level":1},{"id":"779d6806-96dc-4c97-8cfb-15a3d7855bd1","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌管理API","description":"brands-api","prompt":"为品牌管理API创建完整的RESTful API文档。记录品牌CRUD操作的HTTP方法、URL模式、请求/响应模式和数据验证规则。包含品牌列表查询、单个品牌获取、品牌创建、更新和删除接口的详细说明。提供Zod验证器的使用示例和自定义验证规则。文档化品牌与型号的一对一关联关系和数据完整性约束。包含批量操作、分页查询和排序选项的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":1,"progress_status":"completed","dependent_files":"backend/src/routes/brands.js,backend/src/validators/brand.js,backend/src/models/Brand.js","gmt_create":"2026-06-30T14:04:55.154207+08:00","gmt_modified":"2026-06-30T14:19:07.600812+08:00","raw_data":"WikiEncrypted:hJ5e919a6La3vBIeYsDd9H+qoMODEBAlmCzG+cWkGRu78NaFDIi9qITlXW3zUicltUTnty1k0aVuLDmUbWYsq2DQkP84kMUHXEpA6OcQtQQW2b0L3hPiCNJb4ZQrqvo1LXEBjkme7wbSkleJI63o/kaE8846oeYE4AMgjWxEbV54Z95lxWs7OlwO2sCsNbqRc5wR/o7amP61MJ/lKWn8nNLrexqAUu50qeYGngpuqV3zogarV6D9+HK54itBZ/ncQ/+9a/lhzLkb54iR5IcRDOqaVetAPcB7FKWOIWyMYRgn/APHz0vu/Ow/jvrk2IP5VdQBYSzAFPe3odHJBhc53XJToyo3J/RoBJdKTAdLlVolDpTzg9VKOFbCd0ua1syW8RDmRR8CDnzPdnm2/KJn2+vYfnnvQvdbENcsjaVhdZ5GPJSf43fyJOJLXx8L2QjtqQdv69AtBDyTBsnmFqRUG6WKDHnA3WtZJZQ796EgvORbPOAecIhV0hLlvUyUJBOrM4v2ZMmc5RZ+ukl5ruR2PxQRNJRVk5f8BDNoylYtTWow9gb4r9ii7/TP7NjRI37TxCOkatlA10cnKD/24jXu6MRyocnYPVbHAT72NR7srRVXBcqMwlwiK2LCPVG71hlvmt7NiIB+pNCWB8s+qWHNpfV4kmmg9+458bGJdycQgVa4Mb42lqASsqANfZRC0xMGO4JM+Gns7T3vtPmAqjDJB8tZrkZ2p0dnvSBGpkYiLm68HLUpIXD2YldMCbY9ymtkJB6gBWWBUutBXeTQ++SyBn+qRICWqKCnVWYK0rfrYWa76HfOU0xfjpR9sVWFqXvhtkMBd67yy00PkaTUrvIFUq769fpn6KWDb99I8cHWnLIj556iiITHC7TpEqPSdbdkvssbuU0oj7RqG+UAFQWmP5fu2c2dBkaPoaqTfzdrJ4EufHQc+W2V0jZLzdrztAbbrXMIlcSdnIVZcM/yV5kGv89D64a9AfWx3h+b4uVFgMRhqFlACt0/36RwQeI2ZJTp","layer_level":1},{"id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"业务组件","description":"business-components","prompt":"创建业务组件的综合文档,详细说明通用业务组件的设计理念和实现方式。重点介绍侧边栏Logo组件的品牌展示功能、标签页视图组件的页面导航能力、密码修改对话框的安全交互设计。记录每个组件的props接口、事件回调、插槽配置和样式定制选项。提供组件在不同场景下的使用示例和最佳实践。解释组件间的协作关系和状态管理。包含组件的可访问性设计和性能优化建议。","parent_id":"aa2583bf-2c6e-4792-b794-1563db547d08","order":1,"progress_status":"completed","dependent_files":"frontend/src/components/SidebarLogo.vue,frontend/src/components/TabsView.vue,frontend/src/components/ChangePasswordDialog.vue","gmt_create":"2026-06-30T14:05:00.059997+08:00","gmt_modified":"2026-06-30T14:19:27.855603+08:00","raw_data":"WikiEncrypted:mHLzoBKW/ak+KVdbda4A2f7qh44idx3e5sYOKq4y/WJWBVlKxvfsgrfR5kwEoK+5YZtxFpGvHzwX4IOH+DawEmhTwQMjQgMBCcPS53RmGaHOSgU0nKq03Su0/WZVgYDJfX5EkUz6h2rTPEOvq5PXUInOMgSH6UvRdohktfTAFkzFd7S1FTK58sVzdGQozq7wI1koDtSWO/SNpO4Ee8fMt6DTqQ90rTnMbEPKLcOrCDgBxPksoF4AwVmDiOWy6KkShCEKg5p6r82/HoJV2qfYNRVng+LVbIRQN/zKlyM4YEjleh+mVPfQG9melNixR3cJRG3orSswQpSogfZRK8Bo+TO29dCbmXI9Mg5k9sGaNAq2jbK1UKrydX+oZeXgh1B5BSCmOo6BWUzJqDsP9IX3WZ4YYVL08TTVYxPFyLEuNn34DiKMnez9L3SfJSnMIoqN7ClMC6kQ9CccZ6/1deguTXM4M/nzN1SSJuOFkMC4DjWRStbyZPfqHkfhcEG+DW7eaIurD4brX7qVwpAIDEp+HrF4YB/rpvFHpbpqob5nWRmQN6HzhmXSIBVTDNlvO7PuFOz5bARPKE7RKFrgOc2cFBVLCny0niJuaZXDcspCDEjkKMe/W6KijLPgVdFJ319wQi6WwIpUYQEwwRICmXrDU8UXRluSrnbmkI46ju45vwGnf4ZkUgPQhrtrxxqbDjr3wHgQtU9m0G4JzNonUKrVsTmom54Hx2VWzLxdXVlK1T8uszT0ZI2wtEAFmM+maRys0ZM/v6yzw7S4lK6LI76u9HmAWuPDpalJjO66kRoPPqFHGP12HnREYBCpiyzVDOsMKLP+nC9RJxVJyDqINcMIEQ/cvMqQYtNOCoV8uC4xqdOLLw69jWdiOw30qNnb3DwC64POHfTIjLTuZLWorchvBthVfmMzwqrolaR3VHUVgR/m5h9XEGlzXTqA6znkpkA1TjOTmf6YAAGAQ+Zt0IuWfA18ulyPt6eyriUUPdL4oJqBk5XXy45O8tb73hyaJ09bw6OBSdGlDdIsNotjVXwyfFkMEutcpmMT0v9MKTugGcSfEHSUwMnJkFKSB/PL+vn4zUky0vkjG6dUA1kerjwmjSaNZ7vkhCbbP8OFylL15gHQfCdOMb0AOCZTdEob06yof4MSnaXqMF6dufxLdbwOuqCfJUkhi2qwT7TxlBIB+CQ=","layer_level":1},{"id":"f96081f7-f508-41e2-bd45-a5b36a1ea114","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"环境配置","description":"environment-config","prompt":"创建环境配置文档,详细说明所有环境变量的作用和配置方法。包含数据库连接配置、JWT认证配置、Redis缓存配置、S3存储配置、Meilisearch搜索引擎配置等。提供不同环境(开发、测试、生产)的配置差异说明。文档化敏感信息的安全存储方式、配置文件的版本控制策略。包含配置验证方法、常见配置错误和解决办法。提供配置模板和示例文件说明。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","order":1,"progress_status":"completed","dependent_files":"backend/src/config/env.js,backend/src/config/loadEnv.js,.env.example","gmt_create":"2026-06-30T14:05:12.313659+08:00","gmt_modified":"2026-06-30T14:21:11.825296+08:00","raw_data":"WikiEncrypted:mJFb0eo+82adP8NAeq7d4IIa0ji7BfhWd+tPu7r6OpR4X+XfqeclnD20MHCexQtgFzeY+udCFgwSLYPDydN5R8BNpcJBbveVhePMQWOVKGSx4DICe20Yr3Mg9nlLB9FGlGjUc9Y2pTff0xrwHFSfFG9wRb0k2bAg/j1gbq1g3pZxabmYCBYxTPF026U732n/Ksmolpy1y/q6x9P2vurlaRpr34CvTfVkEYogh6YTLfmAhzHfbr4sP+eShuvQDEHYmhRjzMwhYz18NBjgpMKUbE/pndwBftVShR24efIAv/BElGFzh4ocX9Ye4v5tKSBg10FekOLemFoJ8pOCG+BGhsRKs9n51fBFLOmmhXaTFC3SHhG9AITLshuN0sb92me0NMFI7NrhNuNKzc2UHDUgDyF4Vafg9YZgHju8PxlEwOs1BaPCOk0xYsp3DW0oVsG+AwBQvlvriYibLy7tghBmipp4c6l/pSiJCmGjW0JwUul9lVwbeyMAjsVBJp2ZXwzI9IKB/NXvEH/JyDft3X6uxO5VqdujNwKyJ8t8zvrApsSX4vMXO5+2SnxXAGudlLDTLmP6ozej4/197Za0ickFHWFjLPGNZDXv3dGVJfV+YiyL6wDXurvpHfhX09eVn4DP5NLwrzRsggp5XJR9ojLxzMggtxIbLdbx4xTBkRXRiJflCuRSm12Jrt6+U42gs8umQx0/uQSOJX44A0jxVep0MZK5QMIH7oq4jDqBV685QyNKxM4+IDM/E7zWDh9V8U92lhe3mOm4mqolgFJPfEzZaFsi9hOqp+9ZaAPAlXj3DJCXdSDfa8hNtfgjKJ4UgqP/2ESnAZhrUisYaQnfAMUBQKau+qwn+CnUsXOKcJkQNSoaXdvyBbAr18gNn3wK7A0viPPO1OCMf9E0Za9ghsyaTQ0q5kZuNukjWX1iQbG9QZ3TTkxZOzgSpuC9sndRmv6DY9AWL3TaupI10Ec52w4hOZe9TAcM1iN38mHBSSAf8r1qp1rGeo4bV3v8ONIokVkJP/lLXskyXy8PWwyNyN6yE1CfFAh5xxnrjnHNHYgYz9c=","layer_level":1},{"id":"92f94141-482e-499c-bbc3-6101e70206ff","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌模型","description":"brand-model","prompt":"创建Brand模型的详细文档,包括字段定义、数据类型、验证规则和业务含义。说明品牌名称、描述、创建时间等字段的设计考虑。文档化品牌数据的增删改查操作和相关业务逻辑。提供品牌数据的示例和使用场景。解释品牌模型在系统中的作用和与其他模型的关系。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":1,"progress_status":"completed","dependent_files":"backend/src/models/Brand.js","gmt_create":"2026-06-30T14:05:22.62391+08:00","gmt_modified":"2026-06-30T14:21:29.097262+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLlbJ7FPFod4dQS4C2jIEy1Vi+RWBmbRp3cvvlClyElpjY248hN/8uxj/oZc1cBilbx0tRCgx4EXGhbWT0bKPV9CClQk3EyAIvWkjw2qBl1GwoIZaoQbh/lDf7iSv+CjumSc5MqVDv7FeDuoB4BYvqSFuX6/sw/v3wTqRwaKX6wLQyS1j8HSrt/0T9Q28vNhc5WBAPNUs3PzlHBfFfWZpG8H8gVCRsqX5tOhfgNie/doVHGT9Gl74pC4sOjSrm4gseL4GAP1i/34P2j8wpFWOK0PHIrEDdLFB/nl4AmiN3z3GOflyzR8heQlB3L74kyUKX3oVFyL8nei3KJoV9pUbYJJztTdKAUC4USkpOWF2LYTf166CAIIyLuvpGUJmRkxZ9T6fpTbIZ0tWkizC09RvdiaDW1+cjDQhj6Ij23KebNfpMuYYTUkiKJPqASQ9/+A7uNZ43ntzVnopgTzXzDun3QBC7j4m+iF5DLSWdqS3XyRpanF50CvdYz5Px9oLvusDbKohVWQ6zxGf+ZZTXOL5+eTO/qQ3TKNuJA3mkzSqU/zzIodqLG3oFObroU6JLMHgFwXp2OggflULj5njivqDgj90U47CQExGFS8JnCl0dPuxiblN18wZf2ANfUg0IvnU5rAmQ/gz+dtummkOEouqZxCglWdsNKdTIkRWEkDBecIe9oGWuMX8RiWHLnL/Y3EvgSPRu8DkD/n6hbQQPpIrGV7Jf7CIPfqWg8/6VZose+vNR+n9JFdOEU7Q6X9OK8lAsw==","layer_level":1},{"id":"1e3d40bc-a833-4f35-891c-9dd96f09a1a3","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌管理","description":"brand-management","prompt":"为品牌管理功能创建详细内容,深入解释品牌CRUD操作、数据验证规则、缓存策略的实现细节。包含来自实际代码库的具体示例,展示品牌列表查询、新增编辑、删除操作等功能。文档化品牌验证器的配置选项、参数和返回值。解释与型号模型的关联关系、缓存存储的使用场景。解决常见的品牌管理问题如重复品牌、关联删除等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":1,"progress_status":"completed","dependent_files":"backend/src/routes/brands.js,backend/src/validators/brand.js,backend/src/models/Brand.js,frontend/src/views/brand/index.vue,backend/src/services/eqCacheStorage.js","gmt_create":"2026-06-30T14:05:25.896897+08:00","gmt_modified":"2026-06-30T14:21:25.623188+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLid0YsRsuFzxrKFl1UH2EDILD+4NmryAJ+q2oYZ42eaiz44GIk6X8OFlUAZ3K10FBvMN69Ne06Y6iVCy+4xZdAsUGmydXuI9LOupHeDUaC3pvkOjqp3EZ4xOBXToKexD3sJwOHDJUYBWddck1pKB+BpUmpIGWGulvtKNd7rUuuNXGGexSoT2k/+fD8cfS96290Who+jupUypdef/VVLQ+SMm9fS7HoCYxsUJ9tvcR9HLpcihb2gc09v40WXl2RSPF2VOKqtBB6T3R/UTcCJV4p8ISn8geesslxEYyvMaCyHxZrZvjir3/r7oVAAh3KAOE+Nx4JTX1AQd1M8iUlzVaup2ZB8XvjcIj9/TKMdIL3PhNerpdIgsAQ8lwCNMPriXoMoZx0MzlaX5d0D7vEbujs1W/0zu4BgcnCjJtUdvCB+34DyEDjZVd5vEPpMDJyN4KZq0V2zz6XEIXr/SWlY7yRweOhgMAw/2UmV15PZmnHQQIsspcBtED/4LZY8sngC1o50KUM+1PQNQamViqAlGCHXBAR7Cj3E+QvjOBSfAVtc7OPeHToJFTO7XdM8xdMMjkRCdrmB8zJ6XSDish3MLo+tv5fNdSlOF8ZFqklGbV+DaphtWW1k3t13oFWP+IjkbW3xwsA8akuLoG+cXEctO4Uq0VFfoiwI8sfioOV/hJo6y06miVzTDvjdjk2vZ50V8j2qsw3eXt2N4bX4b2I/BjLZzItZdmHID3ExYBmo+VjPOmBXQGuZdhG3wTGSRtD7Phhsd0G6umdHsRVF74ih8xOWkjG4+8dj9F6mnmWm7nn84+bv+Es0fsCjoeqagYkgvIU63p9y/FEcjSTEEdHqZ/0qKXA8S1xyEHzPMmW4LjN8jwyNryVJPl2LOI75aXNvdeoMbfPs9qH5u6SeX8rw6TvD6XwAb28N8ehKfUVwJFEY7PkCn3ROnsjFquwaBd+DjPpH3CY7TdpGqGBuP5a+0z72JVUfnjXKn2oKTR35QRVAhdnXk/st1N3eu8SXBHgx2XHzEB4JAnu1nWqNOr0d5Mn9OVFDqOJ6GD37xh0oQvgefNcxCxgURt08010ZPDFx0TvUMLh2g+plGTyUqDgekPLtY93lC9TEtV4x92OjUub4JRNaGBlHVTUaC/pi2JUS/QYcfOPvjYMa7TgyxylESgrt7jf4+lZOJzAOmJSKScT22E+S1o0omg1Imd7YyAt5QFJwBS8Zm25xjGROuORqURPWRYfToJMKQYjB905rLMlW7JS8VHBVaqUp6R+S4827muvsDVj/opXiMkSLPllSH2AwfVfT8AASFSzz66kvjkmYy","layer_level":1},{"id":"727c25ac-db22-4b34-9486-6fd6946f64f3","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"标签页视图组件","description":"tabs-view-component","prompt":"创建标签页视图组件的综合文档。详细说明标签页的状态管理机制,包括激活状态、关闭操作和重新加载功能。解释标签页的数据结构设计,包括标题、路由信息和缓存策略。记录组件的事件处理系统,包括标签点击、右键菜单和拖拽重排序功能。提供标签页的生命周期管理,包括组件缓存、内存优化和性能监控。包含标签页主题定制、图标配置和动态内容渲染的最佳实践。解释与路由系统的集成方式和状态同步机制。","parent_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","order":1,"progress_status":"completed","dependent_files":"frontend/src/components/TabsView.vue","gmt_create":"2026-06-30T14:05:28.623089+08:00","gmt_modified":"2026-06-30T14:35:27.886573+08:00","raw_data":"WikiEncrypted:IBinykhefIyOgdnJDAiniV5kOUee0Xx6UXvrXwmKcQxxhEd32Oxf4/sXerzkozjdwLiRd78FiQyVCsTFnq2ZoJjCPvvphk/28Fyp6jERf6Sd62RGVBf+T/ddf1qyYMGlXTIT63FLUN8lGKH7HE33fo//zcEAInyKuCfcAnUKtGhK/6GYF5OQOK8iu3hTREMVLLGnL+nviHGzi/OieF9xzRK6Q7v1xKhCFPVw7G7pKGvEqIAXkIuI+gtduk+6amkK8DTLEeFc7kADsRYiiGxbnbCwDskX4qqKASfyrXfwkcH6erxtW03zOc0xXxRooa98xza6bb0a8AuGRLxpr39QpjXFHHSkoQOfBajABJjr8Dc2g4/Owp/iz3w2DmuHDD3n/B/iWYgr6mvt3RyCN7WugYmLcAHydpYFY03KrqgMoG6Z++VclV/+iLE/hhCWVXZwOvZExFa1/Nm3L/kQ+lvH/Ok4DwK2s2mjZIJfjmMEbvvPBDip57GwOAh/DEUOz8xDHSc/z3kHBhO8c2gfI+QxQTDodO1T3sDQNvDzNXnOsiGHEa8MFXwnRqOOJdjXpI/V0SeRqH+VF2QLUL0H0zkIRmUfKDToJpYdryAc+g8C/437bvmIINo0hk9dNxyk6OJDyil3WbGVKZty2trCmX+SSkvThP1sjhsXb3A4lCaln+NxaFM2pwSzOI2FrAI/3udagiuCFzkHXVAbL3kW/sByyca+mxh2x0XmZnIacn1rN3mzAbZQw0GomBv3D9BdLhokGDFcRbw0wBF8/CKZIQ2LXwJSliiHSUIxZBPFwOlfuDQLwPZwafFjFgx/iVezVLOrtprdilrMg1icikSwQ2uomd5k/4o4X2RhtHBwVEBnng/I2OnKpp7hx9jW6qnRgl73qL/weon9zfXHb5cIhwqTENIhOakxfLNkPuVZUK+yV5j8hhnf4TSFJur40kvfWrFH8ooRZjxZLVRGEqph6t49E53tpiLKAnc7PCkGqlVdBstHvud1Mi9WyXlP8CHOoDFinYsPol2IYws0Wz58mTUZesjH7Ovtl/r7VUGNRE+V5VOhW3H2ws00vNLRzrCQfstfuwZt7dDBHlJziXNvdgav+pfU3tAHaonl7W+6IJAygI7B1LZ7oTRxEV4fl7vl2G8suLJXZO7UsiezZ0gxqvkzvWkebI3amABggi6vI+xrlr0=","layer_level":2},{"id":"c8151791-2f8d-4e1e-8139-b0cf921ef002","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"登录页面","description":"login-page","prompt":"创建登录页面的详细文档。全面介绍用户身份验证的实现机制,包括登录表单设计、字段验证、提交处理和响应处理。详细说明JWT令牌的获取、存储和刷新机制,以及登录状态的持久化管理。记录登录页面的安全措施,包括密码加密传输、防暴力破解和会话管理。解释登录成功后的路由跳转、权限检查和用户信息初始化流程。提供登录页面的错误处理、用户体验优化和移动端适配的实现细节。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":1,"progress_status":"completed","dependent_files":"frontend/src/views/login/index.vue,frontend/src/api/auth.js,frontend/src/utils/auth.js","gmt_create":"2026-06-30T14:05:55.602587+08:00","gmt_modified":"2026-06-30T14:36:20.147272+08:00","raw_data":"WikiEncrypted:gVtFIob7WtU/DhLIhhPauHe+OU+v+Wmk6re9yMmllcXpiZ1pp7hfIQRNzw2djMi3kdxg1YOiyCoxBtvZze4FF6edaCgUjs2MTu+j6AA0Iy0cXORNHgcTdEiY29qq3iIiQbohHFi2yVwhY/RbmzBe7lwJOZe9tZJo+9aBXmZXSPQue+eGhVi8nfNwLBVZ8kr2w+IM0Le/0DzLcsNPWWHKW9gEnqOL9qJ2uRnJOeBfYIQm/RFJj6Arc9HTRD2rHKpLgeXT0/7uDlcrcVOeMQgI0MN4e5IsSMOS4i0V8i0QeaOnTMFe1e4ITmzsKBkTM3HbZ1l9Tud2Kc9vwBSxc71qfQSzN6PU2Lg3Aey6Hyu91q0cx/QlQLD9hjPLUl+/LeHHG0eHqrgL7KtiH7e32lisXRG1TYhCgOaOHWCL/heEb3WzujrCLosb3D7MsF/wENRWQGAQTgULpo9tmTHO5PQYppvv0bzI29cZtI53vlNiklobVJr7tvhTy/Ogd57XQ8bYMtnir8CxJnzDZcTSiyutWBKqV1X1lZOAyG+kC+aaRW/C7OYV4ek9b4dwf0XRsWvwr9GNgjIKC4IvOT+MYq8f+lbUllzOJdecNYg/6EvBmc3lESxNAVHxcKCYkpsfwV1pkQKTA8mk0s+6LysznP0NCo0/Wkd7s6eyrR5hNxhX1dI/D3SFOxC18N7Jb1XQTy2olb3oNn3HdurobkjeMAngSA7nxtsFpdVcdX3SqxyouWIMYKCNmLQjxKTUrx7OWx4ylXm4zZnlvaCsuj7hDBp/zdcCNQpVDN0sTMyI3rzj3Xnd9ULyRuTFS7dJzarbaHqSuN4ZVx3pRYSNWmOrrCKKAy2lG2ee8ojCkWtwcykJh9uC6Isdq+OzIY86g6fwtww3sF0b0tl7sLw81MfyakQfpqI09OHCiDHPtmwU1xVSJzriX6latrVG0pN2XqZ5MRWQy7nrzoCg8M6UHar+01QHp7FtE1F8IB7RTjIWNmVxfhgG5GBHk0+X39/mt+u9MCzS/DFWBVoXj2BXOJaos4NKYh8BDbTHC+HrYNlkD0wHs/yly/mlHyPrzMrv6n19GedMYDqebhvi0p2vS83tSPxoFf9tVJ3/0yZN3JuwAPQdGls=","layer_level":2},{"id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"系统架构","description":"architecture-design","prompt":"创建系统架构文档,描述高层设计和架构模式。详细说明前后端分离架构、MVC设计模式的应用、分层架构的实现。解释组件交互关系、数据流向和集成模式。文档化技术决策、权衡考虑和约束条件。包含基础设施需求、可扩展性考虑和部署拓扑。提供系统上下文图和组件分解图。解决横切关注点如安全性、监控和灾难恢复。记录技术栈、第三方依赖和版本兼容性。说明架构演进路线图和未来规划。","order":2,"progress_status":"completed","dependent_files":"backend/src/app.js,frontend/src/main.js,frontend/src/App.vue,backend/src/config/database.js,backend/src/config/redis.js","gmt_create":"2026-06-30T14:04:20.637577+08:00","gmt_modified":"2026-06-30T14:08:09.130141+08:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5QXmatSKh1iukhkKRz99kcWlEvnOwuqXvA4ZgQ6tN+ytovQp8yiqJicl84VZMQ0QFUpSuhdDKqqegwHVHT8m5Qe+hOlpJtwBJv6Gyfd5UzsnMpeYFRNXR8wbkeFBADir/QMuE5xA4w5GwYNyc4GbpnELQTPwTHgWWbWNxlgq3I5D9TCdlGhsRmZA6sOK//txRwki0pH+W5zMNr6nOdulmNq6y7jVc1uB2cnWdogeOMuaAeFHEES4nLloLAu6fZBcuZViwy6PppTyAmckkNr4DBsfUDF8AWA7Tc7/u9k2CUPbxxXn6EzWZLxfzJ8g2+MS5AGoHvdi1/l6Obw5LKcFw4fMrrziZ69qX8Y00Nb4OGTY7Ba9x8nTUpZR+ZQr8C2+b3ian2p5M/jX68T2veatBUXJdORnAdwyu+gsMTlFms2BIWpmJja/SPELEIIsiw02D+YpsgCBoWJwJytlJH/lNURd5C7p6eNTpZ8Ueot4a9kE3/6KkmeteZgfTGCtJVjgtLW3hCuAyhA5zfsNbKDGxNKwkAHaDmWR8R4jKKhAC0JCdk6GSYSbiXLYZG0yPMpDooJP8w3qo5IHgaintV0p4Y+wYwdLe0UJ74U9gCWnfTrlo2R93/rrWiZqe7Wwovt7bAEMnTmtbaWINVb+tXkN3kLfbyjbTHDxjIOc2AAOnFVRGIJpMt50+QEi5TYhA684wr1/vQOBZas07D/sUPjcvl/msZ4kjlgE+YwYMbKPSf9j302dqERpSJODBX9TN2I+B3pRvT8ziUFXF/xr6AsE4DXdyvCy/cCKvmIEp6gyrY78oSE+YwHefC0Cx0ltAwzDpm12AcAoA3YD0TwNDY8zH4cwXHu79zttcgTjZQaebPwhD8L8PbozbJ0lQWo8Tl5Onvbp8hOw6U57Z1U2W/ge1JupnAJt0tMnHek6EpKqkt0z/J2d4/Z5B1JNppZlK1nG+pnKNEfNY4h2m0ydoCRJCad5ccnFJYXhF9XP9vsx0RtqQoedeyfH7X8//4Iv3nVza2b7PZ184/TnYNqUmxItz3yos0ir0gAc+54SDzg0aJlzBs86JFQ9fSep6OJ44sUHkauivK0vBs8Wij0TSI8wUf43PFgjey+c54DZcvXNfsD1hh3PNHe0CRN/oMidSjGTPv6WOJIzp0KnAOn8GXb0kkhk7bpk8eYfe/8luyjlDyaA8QOxpZLfUtQWXtGv9+W4bxOtq8JG3gDpTI/PJ9UxhamLc3zHEgUg2FD0maAM+FBCVu51P66sXPu+fY+bIxalyw=="},{"id":"b47d7f83-5401-4a63-ade2-f087a2f61987","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"数据流设计","description":"data-flow-design","prompt":"创建数据流设计文档,详细说明系统中数据的流转过程和处理机制。解释从前端用户交互到后端数据持久化的完整数据路径。文档化API请求响应模式、数据验证流程和错误传播机制。说明缓存策略、数据同步和一致性保证方案。包含数据安全传输、加密存储和隐私保护措施。提供数据流监控、性能分析和故障排查指南。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","order":2,"progress_status":"completed","dependent_files":"backend/src/models/index.js,frontend/src/api/auth.js,backend/src/services/measurementStorage.js","gmt_create":"2026-06-30T14:04:44.766251+08:00","gmt_modified":"2026-06-30T14:23:25.133463+08:00","raw_data":"WikiEncrypted:PGdHQOrMWxh6s6galmzx6wcoMdYGcfWJlB+MVcSBUNBNKtizTGYmn04CYqWTHq18bpIkVhxruGAwYTOr3jZ71eCHIhmHK7mDbe3H2F258BwPHLGOZJH4+7MFqH3W33roxV3A0mBu2oaH8IeI2N8avzXHaJJypIkSAx9hq3JuRVRCDIeKY3X4NKu/U9NptL74JQm6A7p7Li2mkZiBFKle+4PW/yzuWaITp6kplQfvEI/KpRhmnMRsG3jGv9iyUUFWAGQatGlcpMa3GH4QFw3sBvBajjhTtLtzUczf5Spz1O9WdUbgYOPCpDQ77+Bihsdcy9JfQp4lINGc9Qyfb5uB4DQlnqYiPlbr9a3dDGb/dU073dMLOTbly0p8fq9pG4W7N4v/Qh8PKhHj3MylSLdIGBJUnAVMl5qxvwzxjojm6CXeNAkwfimh+yqf454XGxOTZIAU9k2R2h8YV42MLqjA33Hx50dU7ywv/LpeoPO+YkHYLdJWVag51oeU0dV76GEofIYoyk36dpcxNf9tYMnzovlJz1d32pHkZiEtsRL0hfFpnpiBClN9Eb2M7eXf3h8covZFJVsAMVZ9mruy2FWZoE+Vy70yUrtgKhd+OG9WissVZfI/yqj0Yt2Wsrr1loH4IN2vTs2O8PRfGR+udMBY1TGPS+H1IyXIEa9Q8MGdAQ6PdO/m+9Mecxv3VDjgAPF0c6iiLgP6TWteu3Z/Q9X08FkR307C0YSiy1/W+edhxIveTqz9IG72msKc9KnHpMPW+i/DnIp8sMz0xDt1HKJeWnmP8rVDjGddCRuMdlYI1JTCfO4D+UnLhjf5mrmxD4Oto9HiMMdaM7vcYGorb90OikVE7+bXXS7QBK1eDyLElOaFNMH+fXRZY7dX05PCWloKC0wLxKcyNwDyheNdKuQfCQW/N9u3S+jQqInJWi+fLqqQk1kZ9a8UaYcnCudScV6lmAOswt3fe/4VQQn6BPnOBma0DHTIh046TrqUeM+vxlM=","layer_level":1},{"id":"94ec54d4-0aa0-4e58-8e63-5ad6ddb6edbe","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号管理API","description":"models-api","prompt":"为型号管理API创建详细的RESTful API文档。记录型号CRUD操作的HTTP方法、URL模式、请求/响应模式和数据验证规则。包含型号列表查询、型号详情获取、型号创建、更新和删除接口的详细说明。提供型号参数配置的数据结构和验证规则。文档化型号与OTA固件的一对多关联关系和级联操作。包含型号搜索、过滤和排序功能的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":2,"progress_status":"completed","dependent_files":"backend/src/routes/models.js,backend/src/services/squiglink.js,frontend/src/api/model.js,backend/src/validators/model.js,backend/src/models/Model.js","gmt_create":"2026-06-30T14:04:55.155975+08:00","gmt_modified":"2026-07-01T17:22:10.388756+08:00","raw_data":"WikiEncrypted:hinoA9w2BNFayyHNiFt8gmTbUVUOzWUcXGR6R9te2oFvkH8c6kQ5iIFbAKknf/qo79rliTtO2QawiRHdi0gm/CRBXlJ0YYHfSJN+MrPK3gboTbepraUKOBH5bHq1pjWQLd58TMneV9nLD8qM0wi8KxeEYqjkIRyg7lg/2aNZVGDVTPfsEj9spm1d5wlYTn64in5t8zBHPHtFbh3EQksh3ywQTYOLH/qtKL0p4P1Rik+t908XW1TqxoQa7zveHKBkFvcw8h06giaCLAcjlEyaAkpZJPvaqfVi7rSe1PxnYMg9LcRrNryzmnHONt7EM3TStOa6uuTCNpwagQlGD0FYz1vF3cfPYIazFJKwGsgylrI/C0dVGf7C0YIKsBjJ91jwzPmacR/F2cJ+MPpdqwsSy1Zi7Pk4qzJ+HIjgtzPt4Q+jdKjQh8R48m/m/kPBjmMFGfI/TqtBG/QCr9HO4DkvLOXm04VFs6Qh2XVoq+pol7VA/gMoUJfjp7d5TGH9hPyqa0mw/7FM20x5veWvuAgR49CaEvOxKgZ5YbXz8fd8C3Zi90FlQD22ntkFCbngm9rXMgdlQqLDcpzH/dxPGGSwfmzaFFY2p9MtN26GUQMdywzRwb5c1kLPYvDp+JNFFwN6QLH22hEU1X1scU48lcKtlKEoOLtJhB6IMacAVojkx30mkAXyLxAd7x6MtAuF8pEMbKTdrvN9JLkTVNGmC6U3Hv4bkaQ6qkvRa71+Ua5r9A9P4rdtb81BlOMvTLTh2zpy4HsnEiCDZt2pfesKF3jxKRbypYQPcOfSR+pkoYcpJUHddhDLKhNmLbvrDPqO7ojol5tT7FouHCBA/8GCf3ccwJsMG1iM84R7MF7jWrzHse1z6I2K+OK3yVGrkH4tvScKKM4LkcZEZqvMGTbh7Nx1wF/T+NSWeUfOP1AEcLflsn1E6JOIyuzB5gX16TT6hWIOIikzlh5E3c8E99uUViVI2ZiikeypLzfgrM7MEDIdq6eF8riFzf9QRLXZ/1A/NmhknKTdqRIu5HAdiWGnRAzIxHEvyofCtiUpEGTCjebP9EWscm0S1vW+AEAc4KU+akVypAKt1ypF7atKS3in9odTSw==","layer_level":1},{"id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"页面组件","description":"page-components","prompt":"创建页面组件的详细文档,全面介绍各个功能页面的设计和实现。详细说明首页仪表板的数据展示、登录页面的身份验证、品牌管理页面的数据维护、型号管理页面的技术配置、OTA固件页面的版本控制、系统用户页面的权限管理、分享码日志页面的数据追踪等功能页面。记录每个页面的路由配置、数据获取方式、表单验证和用户交互流程。提供页面组件的状态管理、错误处理和加载状态的实现示例。解释页面间的导航关系和数据传递机制。","parent_id":"aa2583bf-2c6e-4792-b794-1563db547d08","order":2,"progress_status":"completed","dependent_files":"frontend/src/views/home/index.vue,frontend/src/views/login/index.vue,frontend/src/views/brand/index.vue,frontend/src/views/model/index.vue,frontend/src/views/ota/index.vue,frontend/src/views/system/users/index.vue,frontend/src/views/share-code/log.vue","gmt_create":"2026-06-30T14:05:00.060248+08:00","gmt_modified":"2026-06-30T14:24:27.142952+08:00","raw_data":"WikiEncrypted:olK3r0l78uP98ua79qDx7UWSmXb2E1v0sVKrAVzGYuIJHPAueEFJ7X5N2BSDrAuja5b8BTuELO8ubSNrSkgP/Z6rORQB8Z8doMfIZES0MEg18aBljdAOxOLzrDB089hOQpIseNeWKR8TXhStfC7+I83ha5LZRaJMoo3SuuqIzp3RkRQ7Do5v9wPCFg1iCbQYxnjwxm6zBRiSnHN3K9VmnziSCPrAqvYi0G80OkTVJZxFtRGsHzRduLx92WHhDfqsUqydlWWiPmv8K5I43pyYLMEgtXwCTysGp1UWrivekxLpUEkNAc506Rv8F3ZlL0VFyZUPT7bbz9ya0HADXvlAL2I0bLkJFkjPSUFTni2S4GtLHqH4cWROJC9y1Q9blmamNoYY1jJmJyU/NTSMC98Zqe86Efc6uTBDtHxQQX7u47icPzu9gG2J8JodxRFiQ+sVBNhbDm9gZUjKy+a9zXMBxeUGEi/CKi1o9KLgT7+q0gYw+vPb4NHgptzD95TSruRKHAi54z7oxcpJxKyvK170w75cV1bNR1nPVFvWJRzAVB/KKwlo3aLH5aXe4a27+tlLxjJ+pJyZxAv3WxfYqBc7yQQ1sROcMgpuAY+idES+OB+qeRzI2tSm39VjWsmEaq8xxLzlTEgOr7lyZnZ7jpasuYj/ZreCaq6541xuVsJoho8ADkSi8GB7Q/aWZl+UxNj0y4S/8MV8O68/sTSPREEN/QU6DMQsEYODNvz/U0qrzaIU+PBXXbfCJnxqAxYmvhELHwuy9/CUrSSaKC8ZciV+gtAlaV3Yvkfwx+855UxirdWJnEuk4lGX49tVCQG7VYE71gimwTKSsYviOMgmsyzZpUe+UN7UVNjGdW7ttWNYVtnaYua5cmOjtLBUGOrMwvlSeoxkJ5KRXf5Oa/COdfpa4d0fW0dVAtp1T0dTZWSbOk/lswh1YQUqgXj6DDw2qvpyIj2M3OzlFScFjbYizbh3JWD1vz9XxoQZ4C/G3nyi4PLVynnzu8hJrbBYcCb3Vsug5907YxaxmHr6zx+B2O+KaeiBw3vRa+EuQO4lJBH/diEjB1IKlCxZu8j3jcHMP+NLdTEKoAHodIpqhq9SOBjnvrWxzScLZDoU38ngtUQ2H7mSOif6BesJIxuGgMu8L/FRZr3+dLA6odcCvQLRAMXJAtmqmMPVEwJMQufl6WYvE4ZiIZ9sHvMxRAU7vS5cchHtzFte9/luCpsFv3X4xHw5hOmicjsJXCXIH2gXRoD32ZFbnorAo6WQ78LcrZU7jezn9PshnFoSmHH9FkYpd0Udn5J+uubjgRFNeF7inWmeH559LGe5OPLj1eZuQAcbWOy5WCMfC4GshplBJBu06rqv4nfGiMgtpER1L0lXIkxO06qqYWbcHRP4vaOSvprxHyh9iSL99YknTBb32b+dngtSCQ4Y+uxBZ2BOgLbu7KtS2wrf+611BYlSy3j9p7bpPZOxoZYQkvn4roAPOBpPa++5ezB6xMugHAWqPH2kkxrL+fc=","layer_level":1},{"id":"00a9d595-dc79-4ca4-8264-1c3f4a200a28","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"监控运维","description":"monitoring-operations","prompt":"创建监控运维文档,说明系统监控指标、日志管理和性能调优方法。包含Docker容器监控、服务健康检查、日志轮转配置和日志分析方法。提供性能监控指标定义、资源使用情况跟踪和异常告警设置。文档化服务重启、停止和重新部署的操作流程。包含备份策略、数据恢复方案和灾难恢复计划。提供运维脚本使用说明和自动化运维工具配置。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","order":2,"progress_status":"completed","dependent_files":"backend/src/config/logger.js,backend/restart.sh,backend/stop.sh","gmt_create":"2026-06-30T14:05:12.313816+08:00","gmt_modified":"2026-06-30T14:25:08.613907+08:00","raw_data":"WikiEncrypted:HL3VqGjXq8A3aGeLxAjVPqmSWC8Q8z+JISjcpFTl3Rl0A9XVAWpupiaS7EM/Upd2tazZmC4eQGSkervuf1jbMC7w061CAmhFQqOU+czssHD24JzzCW/dzhPQh4OdveHL1lgCBXcR5/EbIuduJDuUmEwJx8aPYEp49Cq2bRpWZ2xXxQ9geEW929vQ0xrspQFu0M2MJkvVnbxR/C1ZA/D+1XfRFtbxiW0x31u8IH0d8nAhLDViHT9HOYnEHPGBjRiTyLhwVlOqUTDNsooW+CtVaXaVamj+Zsvm1Qzfw2XF6Iwkggg0GMA3YkqEB9DFwhzkplZ9FS408azxIS7d4fS0fFXf5diJya6pNlSuA8Iq6y7g4uAB2AiIZJvG94W2dwa7z5qIY979LwHB4DepnmSDztn7ZiE5nt52n+/HGNVea+cOJHee4MvbrnaM3omg7CWLoZG/dawr+mNCxykZ1vRzxrqBbNIvQRMJ+HpOfKUKEho5u+FPTs3ukPlfGiElxzlSrtsP1WAcQFFsET8OsCEk5x6IUkuh1g4u0mqPQxFDojZEl0/RjIoOigi3cHQ14MLApz44bkfadHqnpAuoznkln9hllqFREbHcGqNbIgHnQHRzz4Be2IM/7wIIJIiGbHebHoTXQV+aHxHOWNV8sCBn9aUZRBa8BvZ3UNFtcqEZD+wrKlf8XoKsc1fvfavpnUQ5viCSMfPMK7jwDTGIrqLhf6PL3ibkfDqDFVvIx/FNNdYFfkX/8Cxs8zF79FyeiYx98Yx3rItEZJit0mVmV0SQziiDqTyirtN07F7kZBFSUjWFi/WfFDBGMw+60Qn5WjMW9AipX0KdrVuf85oZIeT3udpIrRencXCwvchZRJU+NJpAqr/6K675EVQ7ybxH7XNUGXCYyCdxqP3nqDQkRqxHZxWsWginc3n4kvhE+zpfTUOp6m5HsO64XllZ+wohWPyjrqJSkEw26JhJIH+eAL29MliX6XBYjvlgT/Vl+dlQMn69VEgVXBBA3BXTV7KzWDUKEtEOMqP6WNKauLQTYqHt53vRnAZvBL+x4IQlA2rXWIk=","layer_level":1},{"id":"72a24a80-f221-49da-88a8-83c0f49f4e9d","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号模型","description":"model-model","prompt":"创建Model模型的详细文档,包括型号基本信息、技术规格、参数配置等字段定义。说明型号与品牌的关联关系和数据验证规则。文档化型号的完整生命周期管理,包括创建、更新、删除操作。提供型号数据结构示例和实际应用场景。解释型号模型在OTA升级和固件管理中的作用。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":2,"progress_status":"completed","dependent_files":"backend/src/models/Model.js","gmt_create":"2026-06-30T14:05:22.624097+08:00","gmt_modified":"2026-06-30T14:24:50.789071+08:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTTxRACU8j2qQjGF3ZvWCBRJVg4ygFbHKJwjRB8JHwTktUDQXcECHhFbmE4gRs0t+1cAwN3sdIm9MktHpIRSSYNyl8It7CS8c7Kbko+KOWDiia/4OYzPp1+Ghybtt7VK0zyBQN81qZaR1/UW5X18q6Nd78fsI04PQzw6oOqgto+wxHPnrvKDggDY8SsvvZmncwmrzbsOP2VtJJcNhQMXg1u+soPYJPOBoZxHDWrDPjf0okt1vMMWF5R0WFQv+iUbzBJ8PErbw3ZK+lbHsFncbKAvyI5B3bNirWYLw+0rZkmGJFY1RqV8iitjYAx76OS6oCAYwl4rX538I0xqWuH1+rXHMZIE5YXahUiRCB/5a1f4dUO4hJj4DEeogkMGOhOjR9xYWKVFWpSaTMS5Yu2gt/9XRhRwTypJiHS8yXXsr18QOa+8Z3GlwtXVkca7zVxoDQBL+zxQqUvgAwmCfI/W4+30Diu6dAy8DD1t9TipBisUO/u/LCDNc8k7jxtqnktibaTrSNLQ5aCiRVMFO3S9qwK2gARGh/+/G4ja0DMwD92UpaDcbdghx95nsPmFLkYUNLQCPdANbyN9Em639BakRdlQ4BSEJ5hNgAv246ePTEWXdfRdqUyT0m3gSZWa5Mq32ZA7AH9Go029LdBNBnzy4uJ5sSSoCfIRhPWpD2NHqQrjZEv3tfeWG5i/sx676ZFqNKV2NW2upQSmBHwYVyYDDDoQLCcYEH4WmrHvFqb7nXYmv5zeJu9YvYEf1kdEAmrfV2yg==","layer_level":1},{"id":"93c96675-6099-4ed5-8f40-6a47b3050712","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号管理","description":"model-management","prompt":"为型号管理功能创建详细内容,深入解释型号CRUD操作、技术规格管理、测量数据存储的实现细节。包含来自实际代码库的具体示例,展示型号列表查询、详情查看、参数配置等功能。文档化型号验证器的配置选项、参数和返回值。解释与品牌模型的一对一关联、测量存储的使用场景。解决常见的型号管理问题如参数验证、数据一致性等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":2,"progress_status":"completed","dependent_files":"backend/src/services/squiglink.js,backend/src/routes/models.js,frontend/src/views/model/components/CsvViewerDialog.vue,frontend/src/views/model/components/ModelFormDialog.vue,backend/src/validators/model.js,backend/src/models/Model.js,frontend/src/views/model/index.vue,backend/src/services/measurementStorage.js","gmt_create":"2026-06-30T14:05:25.897162+08:00","gmt_modified":"2026-07-01T17:22:44.422061+08:00","raw_data":"WikiEncrypted:hinoA9w2BNFayyHNiFt8gsNnGgVQtSSaVbeN1bzqvc4tbra1QEj8CSWfOVVgrIjCfl+rrXPfoyahNVQ8N2A/R9KL3g9TYMVRZZSS0TXcWyEdAHEcVYq3VEGpN1EMCQvUAKhB9cQXBwiIAYz7p5UXkXd/5BDTgIlMqetV6UxG3bvW2msb02YqCXn1CJpp8h53GAZMQMhtOWMmcHzUEzZMNa0Z7oq4Whiv6DGVi+eIRnMosZDQPDqcjVHu4ulL8OIgcNQfZNT83NcSO4g96lqa4rPo+KXJawWt/P7qCQLE/TVhUFjhsD4UGfVTBCFUUTPZniELgoFRrSuo1t0+uYG3l5CoFBMOww9m8AFz4b1mt9uCdgmiyp3mAhfDAPH0cKZ3n9fS4NraUHBRI1/U4FV4FOg060EIpneUrLHZ/bt4+iVpjQEeObtfRWjja0iGrVGvZT7Qi0mSUlONGrQzqdh1O5SYcEVKOY34WF9s7MBTMFRXP4luWngk0KLf2q2mgrCWulnLHebyiPUh1gQc/pi8wrDmV9+E/TLRiAyPLlkbFiFJLmbwazNFYCD+8+fyxbythOFYjAPN0miNA4X2RluXoaXP7sIRsAZ8yPlLeTiwOpgRJb7YZ9ZFVIZSlMMxylBrgeYWgVnH5Y3ZUKqGCh8DUrQ4jwBnreYwVmlV8cu+QgIuPCzc7dR9MQsKpF+gpQqy7unnu5O8RxfZvJ8wOwXgYIiuF+ERSLyuyyqHL/MEvw5S30bXceRNnbp5GHgkoTUDrDOFGN4Zr7e+huqGoH3nei/1p9KNbXyJiW3Y3TsNrKbqCnCuGh8w+6pqFtYllmY18RuWzRVpwsC6+GowZIk+c82/c3U5wZdWHthv2Ev0/p0GZLf/nsXHD8NecVDKW176txDSVjj0H3lkPx84+hOboVIprBpOHQC421zzR3+vCVOOkUbi3kALsOWtXc8+6ooVRH98h7UJ4xlaBnFGtb71EsgmKsVZVMw8+m+7On885syB5JDPAe7njtM5oZ0Itxe32AyeQBpNWA2X+u/zvPgYR62iQwVaRyKUveCHNDs9Mc6awFPX+M7KCR7SUleY/0K0dTd5fdaqycqZc+XY3rwKtpMHADDh9U8skECDKxV1fL0GBYnfiTqww9aZcaZZqYquPaxS0gR59nnljEwng7HabZk+EPvvCwbIYb62Uqn/Ghkywok12jp5Kxjs6aICsiTse4JgzD2zE4rOleyUE2aurVLzC6NA/0D9gD3IGQJpN7KXIZThByfp6Pqd6KtobaPuR9H/AfAvecOBDbQkyw8jDM7PLX5Sz1AuPCGlI+Npxgu0pkPa+P7FTBcjaLKM1vJ2l5juXWdw5KAn+rw15HOKC6f4egoICLBuGddC8hmhelDpQiY6zm80pfCMytFqJynIQJ44dC48svYL8J3tvPfG8XVGYsQVAyIlwcRN0mrX8NCbR/rkQ/wnk695GxkLVGvOKIkEayBufu2IgiluoXlxCM7hzJ2IhnMQWXNuaX+ZUFy+vVt7gwPGpCSwLvYaz2ddgmeKhHoi2waU10CWCfphEAr87b0+7etzytuWP9ugJ7s7fTFf4xFAH21VvLtFLa7kR/jPN5gspIg5y2bIeF68ng==","layer_level":1},{"id":"32dbace3-24e6-4a2d-9f87-83f2ec825b71","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"密码修改对话框","description":"change-password-dialog","prompt":"创建密码修改对话框的安全交互文档。详细说明密码强度验证规则,包括长度要求、字符类型和复杂度检查。解释表单验证流程,包括实时验证、错误提示和提交状态管理。记录密码修改的API调用流程,包括旧密码验证、新密码设置和错误处理机制。提供安全最佳实践,包括密码加密传输、防重放攻击和会话管理。包含用户体验优化,如密码可见性切换、自动完成和键盘导航支持。解释与认证系统的集成方式和权限验证机制。","parent_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","order":2,"progress_status":"completed","dependent_files":"frontend/src/components/ChangePasswordDialog.vue","gmt_create":"2026-06-30T14:05:28.623391+08:00","gmt_modified":"2026-06-30T14:36:50.062236+08:00","raw_data":"WikiEncrypted:MTGOV8yMPpR4TI1lgrJ8xG2DJaIBmdXRwPCl7oRCvXmCW21g6Vjoc2Fgt6nmmENvVQk6mZ+b48v5x7n1+0vaA7CHuGOaSKT1JpGPpRS/S04l+JJRC+zDXrImACBhSN+bAa09cBwSvWPWb3abEYtmKZTzRsib/uzjiZZSf1sPa82YEOr2t72Zm1OMMiqS8XA+qsZEzYiwLmiPLYFL+guO/3HaXe46Do0MMkKmltG7SdeWQpg0oka5yh6krSsT/W287f9JlYbkuaKE1DuvTnJQP+AnABLGN4UgZkrNvRu7pkJDAaUqmT59pSsjsT36NdrgsH/M1TPaMUk7joUnZc1IdIj085VEilPnS5PxTJEGHREbxVqxKR30C/5r6GnnzdXr/jrRhHs+UhBMOTdxtXGexuVx3aVzvCeBi3sRmGGNEzB7g7VsMJhc2HjCLYbeoIc2RP4XbivYLI4jkL908EQple4la3X3ggTZmmIRB8tzgdn2H/zDbaJ2ZCuI5cpzFamtwC2X6eLW2I90WLydSARo13ACzls4tu24apN25mQi0O/72z+V7bdoohJxqP+HlYsJ7MW2YFHCc18sKduLVLZsdqma8YQsXwV5EgYIhKAl3Mn0jCJvMHHA1q54m4MpedfXtyxUaV3Z/QbzKZiNGylMaUcTqeSxrwmB2Us4VdoHw89a2hUjp9fpAneq1lii4WlWygpjsZ/xGZPeEZNS2sLZLu2iV9btxVdJtjr14fDw8t817dq71safFgmrfgWmIwy4tBuQt+sUoYEHPBA/8RNuqyzxybwdhwFDxW8nUeyILFVyC0NFnS+jYQiYM4ffGs10mGWaO4Hw5gQWNFE0V2rXXTfx6xSF0eq/KXLoMuB8Pvey/AELPNiW8oveBlR903q+smsgrLd96oVR4kol5YN914XfzjM3kZBz/muAYVbsDBMKbEbczayPubwLm5zMFOuShES9MqJH/Jbzr9kcOugPx6sl3T8EMJGTuzlEnCi0Fc3Xukfm0wRx6j1iRYvbuyk51s+osNojspt1+OlIMIZDXtjf9XdL0wfoUql5ZRzDh3jNfbGv8VRxV6cKWIrlEiYphQre0T838CYjw4UVA3KOwWuvhCXU/fl0llYLZCCmfsyliuUVex+HGMwN4Djvkus4COjxzp4f2DByyquV0del9JCQZJ7XM1H0vW81c70BJuxUZjpLeZK0B46qiiAu1d+7","layer_level":2},{"id":"af7f747a-9be6-41c3-b091-4ee5901d8cc7","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"品牌管理页面","description":"brand-management","prompt":"创建品牌管理页面的详细文档。全面介绍品牌数据的增删改查功能实现,包括品牌列表展示、搜索过滤、分页处理和批量操作。详细说明品牌表单的验证规则、数据绑定和提交流程,以及图片上传和预览功能。记录品牌管理的权限控制、数据同步和缓存策略。解释品牌关联数据的处理方式、级联删除和数据完整性保证。提供品牌管理页面的性能优化、用户体验改进和错误处理的最佳实践。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":2,"progress_status":"completed","dependent_files":"frontend/src/views/brand/index.vue,frontend/src/api/brand.js","gmt_create":"2026-06-30T14:05:55.602772+08:00","gmt_modified":"2026-06-30T14:37:33.764923+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLid0YsRsuFzxrKFl1UH2EDILD+4NmryAJ+q2oYZ42eaiuwvs0ff3fJrcmeJphvg6shRr3y/1Z6QIqf0SdVu8YJToiL52I9yI/YQ9QmrCLTmSJK1Xn0gikJy/Ur1L6mQ4487hhJQ5ETrEyG74ClVaJFLbUcjoZnico/zSQru9m462u4XEGzLdVl3wBitgKCowMgtQp8iOkg6zYEOvq+vQd5ZMUpRGtPDuGd5LGl/sCyJboNraB5fpHqavDpi5YE7ArXMWdq74EgB0tuJXFndniw/KReaPlNuLs4cZb5MnMb/Zk/FpXzVwYB4qeCuD7TTz94PbPh5lQUUSV1nN7I2Nl7KrP7WCumRo51Bsp0EgDTJ6Lv1FBBouTAIk6SOJy7c7pHKI2bVjdbYhok8sqJoO1zP8R0kKkzlWVqR1eqx3c7vZlMT4qGOrIZltbmw3MS0LlfxkOwLOAeA1wiOuMsyxRh0rW05bslECO6N6C5nvuooj2pIx4UaPhTHmavcOt1kHG9pMEPh2Fb6VZOpYFKDG2zyCIfnU3fVAoD7n68yLyuJHSMnM+EsWqLHsaBCFBaVOUW1k8eMzltfozTQzFUlpASncW1hCZDkH9eAByXunfMzj3cRR5ij6yv+rlMx6Kc8OJtIHMXfY5Uug4RoC41bw1Q5ApjCy7rRFRC3MXbXBQKnufuVAvtk6ldQ64s34dZG6Fs7AuX3T1VWSDjReGTa3JKhARtr2k1xtruRq5ugRY0wrRTCkAiW7nE3grXMt4101VFK4QE1jqRxjkRPVCz8B5lL5TUqxK8KFltj2NZEC24YU36Zz74rntRYqZwbl/pRQk6uP5TGiH3pw7xActW1I6ySnBBrJsUONt01juQ4Tqr7+S/JJbR/vkryj65Kc00zCRsbkeH0dXxmKUKB59e915AlLc0aQRlXRhTlfKUr7/IMAd0n9HGSSaKcRr69ijbll3opHfyRpZF/uF0kmh03HjEredmCzrYx9fGQUTANJX2HqoONB4ms4Qm0j2am+UjAvbBHU++SpwlZBkP1aR9KuMN4uKpX4tUjL8tDJRGW7ZU7W","layer_level":2},{"id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"数据库设计","description":"database-schema","prompt":"创建全面的数据模型文档,详细说明实体关系、字段定义和数据类型。文档化主键/外键、索引和约束条件。解释数据验证规则和业务规则。包含数据库模式图和示例数据。文档化数据访问模式、缓存策略和性能考虑。指定数据生命周期、保留策略和归档规则。包含数据迁移路径和版本管理。解决数据安全、隐私要求和访问控制。详细说明Brand、Model、Ota、DashboardUser、ShareCodeLog等核心实体的设计理念和关系映射。","order":3,"progress_status":"completed","dependent_files":"backend/src/models/index.js,backend/src/models/Brand.js,backend/src/models/Model.js,backend/src/models/Ota.js,backend/src/models/DashboardUser.js,backend/src/models/ShareCodeLog.js","gmt_create":"2026-06-30T14:04:20.637975+08:00","gmt_modified":"2026-06-30T14:10:45.950286+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV1T7LGtk0NNZTeyhAbQ+Kw6nKL19/84a+4Ky8TPQGUBAMv+/6dJGLjO+JY3ZnbVJix+JXTUe92A0fyeezyoI6zxn0BCAAx7GKkFkl72yB7LDQCZmuLQu265aq1IM9ARxC5hoRrKFrUfmial9RptFqCk8tXMOwlttvntP9DLL0Toiim2N8rxuTj3PZ3Sfi2OoqyGs9QmcT5sZkFv2MzdkRWxlRj+lggrQgwwCEi7PAKwJUu8fAL6D0HFdfQ/zGBjnr5HmJCLcdnczST1lLXFTpVqg2yA7ejV2oYI07mzPC8wxSIMZ3razM55hNHeD7TIu0h+AASYH/fMFx+BavsWSWVibAj0+GY3nVB1XGEdf8tKUxCt2tLkzmNC0ONaFrb1sH+u3/NACyBWp1XT485tAbYK8nfQIKYCsxMN3A/5DrVsuo/qHfopngN0j9+Ezecg/k9Tpmt1WNL6Q3XGKE+SH88eF9LePghhx2s0Cyeh8dtxlqwb3KvkFwy/T8YuSy4I5txe2e3KV4B+65RBbbnRPp9CU+X/MAW0EEPjUDUcpVTF1RrZp3uD2ugvmRoN4WNDuXqn+O+o02Vm53g6xy0ZAjX2BiUHbtGhP08k5nBf+6vc6Qw11ko3WnqZtpqJrpu2/pJm40NX/r3Gxcwc0lhxO3Q3EgDEQUNhM6kykwBc5roxz1NZn9gecFJ/vOtO/a9ekqeknKCjw+PYmE7nimMApPoaSzADSa7ZF41I10SWY3CWWqNFfZ8fs1kpjew0mcbEAcyHSEB6Lkt1zJclVbuowc/XC5n6bv4fqkK2/qfT4i/h1zQwLReqBxHagDNUFMA/qXsFwWWSsqOnBtOJV0SnMYqryPf8/tcUVYavxmkBnmXvABNj45AhkJX7xs9fc4CPoEHcxa3AyPkvXSy9v+LTqOitEoO4BOyQ+5o9KELKxVwWW6rA6wTuJK0VnDMTCO+sJoy15gNLfTN1KZORVVwPly7IRW7yO+mCCazqFfoXR477Kif4qeBnWPClMQFLaFJ+pEgvIJWYRUNfKcw4vc/EkyYYeA+Hd1FFr+O5DC0HXhUctk8lYt9MKtZH31RCBZFL95fvmg6+hlxpcnqGgPyYX3RhgESPLtQRADQH9MeBW9GkS7EJElfVnVsfTOAdmSos2AMVYslDP3x1z69CIk+639BSGgJNNyprE87PTRKUxY4eHCuVmALZYeo53/n0ryOP+Pm0RrLO2OoEdwDukBlzJqujjYntHapPf+BV9MDdrQJhuaaDPw+aEW6SkitZwp5cGi5x743nW5gBNH/3CtrEysupQXlFxxgAhYXnXVB7ruWNWK7EuH+8oIfmNMJ4080SwxT6REnUV87E1DChQd20pT7L"},{"id":"6cd96b12-bb94-4748-94a8-9ef9bf21aee0","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"集成模式","description":"integration-patterns","prompt":"创建集成模式文档,详细说明系统与外部服务和组件的集成策略。解释日志系统集成、文件上传服务和第三方API调用模式。文档化微服务间的通信协议、消息队列和事件驱动架构。说明缓存层集成、数据库连接池和资源管理策略。包含集成测试、监控告警和故障转移机制。提供集成点的配置管理、版本兼容性和升级策略。","parent_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","order":3,"progress_status":"completed","dependent_files":"backend/src/config/logger.js,backend/src/services/curveClient.js,scripts/upload.sh","gmt_create":"2026-06-30T14:04:44.766596+08:00","gmt_modified":"2026-06-30T14:27:35.809057+08:00","raw_data":"WikiEncrypted:0j4RRfWJQdenLQLpT+DwLY9h0ctWLZwu8+2HoqcoTgcS/p644+VTtfXH7/YdC+18sAix7E/U+9fJqjMUaBv3jH3dXtuWslLxziQhE0mAM6KzXiDK+XHdsDX+pH5TGGreF1MypynKLMokPfyvDKXXvDb/K/htq5rDIK7wn4efMGrpYrHlk26HkWjVSHgXWa8mSvCzhzivdxiPFSzM+bFHKmAil3znEHtkwMtneqShT9/7CHzIwjUUkq4PtBv4zoyd87sLPzIHBxV584WgWr+H9HiHl/rgXIpGmmyxvut6aE6Mc2v5WhKYnBXayO803+sO3YHI6rRIuv/B17E6Q0lLwA+1x9YcSWrwXv0cmDijT/4f8uMl7RC7jSivX0mlv6dFtsZu7V/TF5vyEVrzfMMxsr4VQjceTo4zW+y7QufDdnvlGRr+S0DFgAlt8IpDnp49wmm2oomoTmIRf3OkwdMZEIGJxUmtNR0zcvCIdBh1KA4TQxHOKFZFOt0qaC9wAFXB2mUD/v6im0DNwlC9lxd0YSEHf0ZvG7AFzBTCSu0s4BrXMKjBlQmvbYHIztwKEe+eQLwn+egVBK3fWzCesFrLhQolEWHZge33dHIVt/jl/VAu8cuAjZerwX5ma+nYjVDSkJpDBLFeII5+/XG1QGVnFeHRw8iHrmbFjioXBvDGm3JGK35cJYmKDpCNswcTS4czKP4q6iapCga0KZHCA25UqbmW7fFBBJBnLXJSnap5wZL2/cXVzzrMHq0DwVin4TCmhatx25HzI6WSkier3jGKtRxCBPDJy1i6AaUNVTQNQmf5WXG/3+KTgWXojmRlUQcRPCxOO+jVRiuENVql2W2CFOHb4PNkmO2ybwjNkuLawNXMRTVnDlyGmKOj6/8+1qv7NkG2VU3x7q5QRh4EOn1Xx5OL8wK3ZIo6YDtZQMJ6fAt1a/Q1V1P+xtU7nXtJrP94p+lh+S8as938vJI0ks+Th12f9lM8x2O0q3crMtXpfTiY5KECIAVrHQBXIgP9mDzicaW90vw0PhTRJL3zNVMp1g==","layer_level":1},{"id":"41e8823b-fa7a-4a80-809d-cf21088bdba2","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件API","description":"ota-api","prompt":"为OTA固件管理API创建完整的RESTful API文档。记录固件版本管理的HTTP方法、URL模式、请求/响应模式和文件上传处理。包含固件版本列表查询、固件详情获取、固件上传、更新和删除接口的详细说明。提供文件存储服务的配置和使用示例。文档化固件版本比较、强制更新策略和兼容性检查机制。包含固件下载、版本升级通知和错误处理的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":3,"progress_status":"completed","dependent_files":"backend/src/routes/ota.js,backend/src/validators/ota.js,backend/src/services/otaStorage.js","gmt_create":"2026-06-30T14:04:55.156101+08:00","gmt_modified":"2026-06-30T14:26:52.749254+08:00","raw_data":"WikiEncrypted:E/YLj/vjaxHA5L3+/DbcM/RrsyTj+zs2iY0gxO9VwkrctdJ181Ln0L3ooRB4LTne4VfMGKZQ6wlTj5N/X2kXcEukZ9Fut02Bs5XkjPHI+2fVI4RjZN0XzwIQaHtBgl8tPykchP+BDkn7x21JPxM4faRabHD4SQ8f5w6ZTPuozmHMS8B+EHb2T7KjC4DoC1RunkTRgUzQ00ZOlbAQ417Nl5iSzdfmRxQ4xxXxBHxg7QRNmHyXXkYgUat/sYwewRJ7vWadFGMWhqvlypgVFw2ueYVxtwoTgfWRW3xSbHeuJMn7RF/FWundtS5a3WwlcFzvmkpGXhXanm6EBmi/g1nlkr1I62+iPGsBnn/mYzTCs9N0yzg8pjYlkjWLhoYnWzFCcwNjWuOis5TkACe4F3Enn5/lHPaUacKkjRUmCsmyIV+YCfcShFNlf15kqHmAJzFnwpzDTA7n2GDkXwAcTZVUsDiGIo9HcXj42Nj+gmNBocNtwCrq1apaus8+xrRBA1usRtf2XK+beNgVY8HakOY03Q88Yn6RceXtZURlft7w094WixUJXMU2VtwSJLIC/MnKfNzse1s3D/QatR22ivu1UxhLoQwKTdXiOCyrSysBf5CmHP+PJmWexDMBbgw2op1BNhxGV8ENxuFPoq/jJ6AciXYGnhe0HLsQZu3DGhtOKX6bhA/ylWSAqpKAn9MxTvI3s8M/gDD7dKZnrafvi3SyEI58q46R6EEAayRfg7w8pX3mpdDt+O0t2eN96w52Fhh3VFn9jdhnWBnEVhm8E4C2cUIrmVa1SYlBUaC+2Fuf171p3d2LjtzevaIzC3KDVOtX8VCAJVzeLbpOrxd7bo2He6Tj1qG1ElYp329PfO5BbMt+FDxZXT89pJQbxxz6faNUwaVjAWzvfB2RGDuugJFagSKpW/HMZJWgQwWRdG1GJnqI2xu7KnVfTb+VK+QPbH+TOkLtxvZ34sq+Fe9xRTH6ffAgL3GVhFx17Byd1mIyFtAcAr8SadVmB18dr4jmgbxbP2EptnohyUwoYMfihQqTaA==","layer_level":1},{"id":"02f97459-8352-4fff-9216-8fcabb128d77","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"故障排除","description":"troubleshooting-faq","prompt":"创建故障排除和FAQ文档,收集和整理常见问题及其解决方案。包含前端页面空白、API请求失败、后端构建失败等典型问题的诊断步骤和修复方法。提供Docker相关问题、网络连接问题、数据库连接问题的排查指南。文档化日志分析方法、错误代码含义和调试技巧。包含性能问题诊断、内存泄漏检测和系统瓶颈分析。提供紧急情况下的快速恢复流程和回滚策略。","parent_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","order":3,"progress_status":"completed","dependent_files":"DEPLOY.md,backend/src/config/logger.js","gmt_create":"2026-06-30T14:05:12.313976+08:00","gmt_modified":"2026-06-30T14:28:16.989136+08:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0tuZET5JxbVXxA/4vFailoRiq8l6SCRMdp2PbHfZPheZsOCEHlBpUkVcsULRxIpKUNxtyrd+LvcQjieQsOib7J2aYZb0jdq6DIsuIi9OwAqdeUo2sZ7WFYO0MjrDHQbEi0Fshph1GHL9lpk4FW6QGVpOX6LlZSlzzcg12dQ/7lfGLDNbZmC+kujhPKYB8y+Qg9DI/RBQ2izmG4m7XYoA9vhnY3btZQDjWIgS571TStZN+2zXE5D5wxyq1xW8sfVZ5aoLYIpOUkLMXsZXRuxThU9QEIsRrWxkIjNZ+DYovCzw6LfTUmjulPUu6g1fGUvjvcoT/wPnkWfZ3G6dkEdl2FNK4YiCrP5dIB4B3Ce5xXB04QOtueqxEA0ky3S10aN1HSYiNKLbR870IYZ5PIh7MQS6IVZ/xNU59dvYs1yYgWQzaTkW6h/wP9Qn9DJK6QJ5DVvqn7nn7UX9cmZTZdcT+EZvg3leLG3nUxl+rMg5moRbt3A+XJT1dR13DsgLjPbPKZ4+nDWJghDjUIQZ99/91AZrw0kPKbFba8YYIeLw3/nhshLooOLS8HHpn1RIwSI5C4biKcdxCPRgDq7LZn0X1aDqrw96+lKqgEm6PjrwBIpvhmWlr49hWd9rom2ohJAa1vkvUioWyGjsohChizidHzag+5Yf0ktjenGomBjPQc0ENMHZVtWmb0PwqR/Aj9IYfdLU9XmIH5NXLlNKtnDGFvqJOmCkUY2CjoQ1zLqXwcQc5CIXmeV/dew+CZh+lzcp19HqYDyuRJJeUuBxtHHC1E2fNZWXAgpNogDVGUEEGAFCS75/yAGV+eZWApwi7P8EYbT8bEi+lkDzWOMRG3R7uHZ012uwytQCgcEAx89CPTQRdvwzuHQCehVV5of8lW29MsJcCKWqYEUbKm9xGdGHMMcALiJh3Iijn108J7RBXVDNLIpQWWYIP3jAufqY8lz7wi06ibX8LgPQdR69b+ZWDEJ9b7RGOf9xsem9kNHlcHExDfpPlIUeYCTnQ+UAvW3BnA==","layer_level":1},{"id":"92ff3472-40b9-4adf-82b2-faf5a4d4b158","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件模型","description":"ota-model","prompt":"创建Ota模型的详细文档,包括固件版本号、文件路径、强制更新标志、发布状态等关键字段。说明OTA升级的版本管理和发布策略。文档化固件文件的存储和访问机制。解释强制更新、可选更新等不同升级类型的实现方式。提供OTA升级流程的示例和错误处理机制。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":3,"progress_status":"completed","dependent_files":"backend/src/models/Ota.js","gmt_create":"2026-06-30T14:05:22.6246+08:00","gmt_modified":"2026-06-30T14:28:22.050373+08:00","raw_data":"WikiEncrypted:M3g6T5zNL2wYgwI+v2g1k9TI04v1ugoF7zKt9xQvyuZqaGjJRFmBqKV8Wmwm/3SJ9Qv4rq4MrNZm9Mosti7r0obMj+m4wfrTq8co2+WGKMrYflsRbFhqYh3bwnRVAtBUG+oE0xiunIHCkbP/vnG9SBSl9YG0F5IlWVZTiJo4o240+pE9i40J+V8UwXtMXUWVIsQrA45pmgpTn3LfGupDTWIZ32ZD7WlYT4iTdOOe4azDCok4I1Yvh5kjTJYmR6+IggUUDFRxpFqxUyRHUCPAOM+CBB2O8JGPXOsn3M+0GhQ745lCytF2fTMIBwfB95CvsjNL+uIdYn68JkatRsH7lCOQBVWlNM3zJLvpllaYyA0NAYmiDZ9v48O25B6goFiZqSRDq+5ZFHPYhtmEGQvhr6vG3K6UKm1/8MM+Vhj2ys55M2serDCbPBieNvEsFp96ehe/Hg11TRDvaRr+b/cBcNmtD9NulFxM9jS5RmzGOpHtlF0RiurSmlao+eaveVPhKnTINLe0tTYSBtsYc4K2uriWVijJ8XYIvSE/5W9k7yhooovbDmKhWzS1eY1LMTR6uVCGXR6QPj60pNUVRKuuLQYtR5Kir4n5gJLT4VyoOPy5ZfSx2zGEKDHVGxrqdHKxP17z6R3L4wh/TNCj0rYBxmsjekn63MFHY9+xRbzKwuqYjsBjp7MogvotIrInX1awMAsoaZ56ODV1c6oNA+DtlKfy4CHExNfu0v5zbz2siffwiRcjzPcLH03x81xKluRNRjtmC7uzOo6qUnRwlYOHLg==","layer_level":1},{"id":"6dc54635-13f8-4ae3-b3a7-54c65dea2997","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件管理","description":"ota-firmware-management","prompt":"为OTA固件管理功能创建详细内容,深入解释固件版本管理、文件上传下载、强制更新配置的实现细节。包含来自实际代码库的具体示例,展示固件版本列表、上传新版本、配置更新策略等功能。文档化OTA验证器的配置选项、参数和返回值。解释与型号模型的一对多关联、文件存储的使用场景。解决常见的OTA管理问题如版本冲突、文件完整性验证等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":3,"progress_status":"completed","dependent_files":"backend/src/models/BlackList.js,backend/src/routes/blacklist.js,frontend/src/views/blacklist/index.vue,backend/src/models/OtaTargetDevice.js,backend/src/routes/otaTargetDevice.js,frontend/src/views/ota-target-device/index.vue,frontend/src/views/ota/index.vue,backend/src/routes/ota.js,backend/src/validators/ota.js,backend/src/models/Ota.js,backend/src/services/otaStorage.js","gmt_create":"2026-06-30T14:05:25.897556+08:00","gmt_modified":"2026-06-30T18:39:56.546904+08:00","raw_data":"WikiEncrypted:xd9L+Z9CK+rU9nPZV+aXHWAC+ITudx4Vmx0ZKTalqXJh9lrnWNCrJ6gjfeCs+3xXwLzs23BTL7qcVvNIUwEHxkOC+w2ZMrQ1yevYg2/xv43z1QKbxDHD+DfzVy2ip3HR1VE9OTicG8Y/HrwMuTMoN01llNhSTwVedKRFFHYLaQputwV4j1HV3mE2NM0kpMMJn1mGpOGgHYkTKOf6tqPWkfrJftkYGx1L9B8VAvh2tDHYxfKVUf+kxMc+AJ6e8nWV0nJsF8w6NDE4XPlsgB8PrDcXB4ASY0z1XuH6EW9nukhO2d54uVAXQBHVvqMC52nn5dvSjoOBVkoPIfIQZPBNcjWk+QLBqGgywdvJ9GvCILSorIgIUwe7Ty7UysVETKO+/91YlQ8g3OsTfZrRfCBCzwFPOOevT8PB1+s7rRgEcoOXVJDID2u/DO0CxO8TwhloI164hCOS7Bh4vPIob5fjB7W8huW9amUvUHXZ/6WgYtLUCzryhX3j16thLsy1HpDNrrEsxvCsPF540QoEZOFeroPtzI+GmlQKrSXS3ZnK8JbSCDmIZXNldzQiCRKRrnTg6+H/CyxpFCwNE44a7aBwSEryvtFRCCkAu690Xxc41bR+0IdguhXyL2yKS05K/VaocMmau3zZdsEv9Trwv+7BiQsxDp+RYxV4krfwGfcMwovPo1wRrQx+e/CTjhudQ36biNfUOSLnANYK5dJX+lIojP8LoBeGchUcYSM0wC8WvzRyJ8LbsFdaMJpRJ++Eam+wCC4IlpEGGVD4zn26u+OgfVBG1us2bm3RtlXYiAgi1b147VL1clma7bxzYt+GggXoZ9uZ3acqLztxrQWMFbK5NHpavUjTA2IbEQnxiAnvarLySz7A5g7ZnvaGqScK0PXek5ReiM8Brhpl9VcOLbuPHdqdpOI2JRyKb4u5dvw3iFYey7NdMBbuoLCLn5kZ3RiOz0xPZhazE/nE0YYVGlLU/igXken5QeqmfFIeE5PsudWa4GmfsIyuDCj9uOsJd3dY8Dg6sdSc9bhGkO5HHtM+fuFI0mWS6jCPQBCcFbnHp/uRwOL+6HFcpDYLmSzPKRFbVqAIVLuk2dezAieYDmZEo51vbYm+IqAeA9I261+3vpU9mg76oCMnWHwHlW9tSWweGNXaYU6IIA8N6Ad7Enpw+tz9BKC491F/JmJMROXqeetf0Yvhj9MtizDZ2vxfMthqEFmqDh9qgCrzlx5bIWa5gWbzhOG3B9kUf0GuXPbPraZ0cAk1oS4dihI+/TIFsdVjG6QQE4q7qgi9I+y+TV0HFkbe1MDk1k6mV7KDnUCgDXqjlQqcW2XncgtpSDIlOgXoCP4aghJql8zJmkDf4JcaXJmvrcT5S0ZJw9awJbVtc9d/JraydK/GH1FbkzQ+cP3hDtu4AIQ1/CqUwGVLRfFuGAM6G7lb79gGQ5mGYPVUAsDu4Iz7A3l87Ed6u5WGgkryavn2WdkdqKC6Di06NnbvZ1MvGPjLQmR7Af/gfcsx1ggxM/fjEeeTcevJLcvJeI1VC8Bgz6qitzCpBuwZITivl19J8MdjQNcVNKdhnmhOph1ZKvh1NC0tc2dDH5hVwtR6XrHM3GG1bZqOsofFj202PPff2oIiyh2xhk1Xxttm97WNoHFfPQquJTLNnNutWO+weSGUezVbSAIHc15G2bGpUkBUZwILvadH67980GOkpZim35NFITgGV1Iu3/oAb4lV","layer_level":1},{"id":"748c8db9-9197-4c3b-ae1d-a6e51d058342","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"型号管理页面","description":"型号管理页面","prompt":"创建型号管理页面的详细文档。全面介绍耳机型号的技术参数管理功能,包括型号列表、详细信息展示、参数配置和品牌关联。详细说明型号表单的数据结构、字段验证和复杂表单处理。记录型号与品牌的关联关系、级联数据管理和外键约束处理。解释型号参数的动态配置、数据格式验证和存储优化。提供型号管理页面的搜索过滤、排序功能和批量操作的实现方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":3,"progress_status":"completed","dependent_files":"frontend/src/views/model/index.vue,frontend/src/views/model/components/CsvViewerDialog.vue,frontend/src/views/model/components/EqCacheDialog.vue,frontend/src/views/model/components/ModelFormDialog.vue,frontend/src/views/model/components/PushProgressDialog.vue,frontend/src/views/model/components/PushViewDialog.vue,frontend/src/views/model/composables/useModelList.js,frontend/src/api/model.js","gmt_create":"2026-06-30T14:05:55.602966+08:00","gmt_modified":"2026-07-01T17:22:40.416508+08:00","raw_data":"WikiEncrypted:hinoA9w2BNFayyHNiFt8ggSfSPmTP6/fXMKhmsk+tmF1NfJ/H9kFDbThrIYMnkiz2GNsBvNyZwgk+XAMnBFnd9X1BgPKtXUsnbhbDwITwXNeRP0EKjJ9nbXgmMAYeM3VRtJxxWhE0RbcOFt3SCIBQ6jcdhWJc0jxZqgzHh/9BbhXbbFE87VnsMKYDgOiXckXxgM4RZthxXjlcCTv34quZRyP7/JIgew5WTIAcAVU7/oxdTtgTXpDSTBi3YlxGP2P8kr4MdIIUtXDdOrv6k+AXF09CAL/RdJ1SKgzL/CAs0/T6PXeIgzlrfZyncAoTl+N/lpatZg0ZqhuNOK+HuVYzzcH/kL+LZLXfY3jTQuW1drx5nU3yfxNPmB7xb/dKdNzEeITmytp9lTldmuQvYx9JqOU73z/+XvAnp4EK6JD5fpDL0Z2WchHoERAEQENOUpko73scQqeB13q0/DP5P6lsulD6nN+v3sD3156L8D9kiCcNRTb6y+Bgi4+ghN/cZAicKRk/qZM37YcTfSS3DI1jY90y3XKa601dWFskywNH6iXPHo7OVrMo+LzC38354PJ6dDJ7EzV8cjUcvS08bIG+cfYXGILMWedU4K36XY1trx+S3mVyIk/m7IKoDZCCEptVPOqv/xAQ0oaGt+ddu2mYSeL+kOA708Ot5B/Gb+qvUy8KwvRb8x8azbdUPvVPfonxgco9Gwn8iHtp4n8b5kXZM1IBvhQYtpbCt8KlNy4+KfoovSp/8r7Nq6XwwoE7nYIIZlcUwjkCCF5pZGDN7/dD980IFiZ6A73Q9P15tThAe1sUTgUnBv+/ALtlx3UVq3EC/sN1E9cvo/r0zxqRW7foboyIBociExx1KhXUrXnemmnxVdFcgE2dDxUcRsJqaG5sujXtamLAflH8/+rGY8rwwGIptU7g9p0BxXULUBkLjUl7xDTE6/9IB4wzGrwWNaf/ibjpxUWUjAHZlCUpwjCH9oQNE1F2BKvtx1CY+ffkUjS4V/JJuyz6Q32uJF1OIqw1RFHtDMhlv2BetwIWUKp8EXDkBmRCYAc/tKImrkeBelKe6Xt25CxMXyesKVrJXDRgbwwGdA5a7JvXttMwr6xYSzPZJldoYn6gI5GC3Ex8tW0oQBla86XWqC/aETjTWNs989QooSxgwvyAt9oWx7HA38fw28oYhvekA/niPysdB5861Cx/sPi8svRLo8eGFV9nVeYZI46o5uTOfwBW2lWVNdBxAM3ZvBRD6ZInFoieoGnbcnIxDcDUTvW/CmCTt0xiKuLF1f0ZBqHMCwf954B9uLg18NX1PZrR/jIBwJ3sgYTt099Q+bMm37lGPu5jeZM927iZ4+QC0UJLd7nIrLUlskoZ5FVZ/5NX5v5m8S5fpGyYrqxWmT8rKidjs1FKz3dAkfkqYQmFZnE9NTnjw8cqvkq+Bwo0GIbBJKz/OsoFKpehDL2TFWuX91XWKoNNLZ+suFl8Q94sbFQqrIzczjmQA==","layer_level":2},{"id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"后端API文档","description":"backend-api","prompt":"为RESTful API创建完整的API文档。对于每个API端点,记录HTTP方法、URL模式、请求/响应模式和认证方法。包含认证系统API、品牌管理API、型号管理API、OTA固件API、用户管理API和分享码日志API的详细说明。提供协议特定示例、错误处理策略、安全考虑、速率限制和版本信息。文档化常见用例、客户端实现指南和性能优化技巧。包含API调用示例、参数说明和返回值格式。提供调试工具和监控方法。包含已弃用功能的迁移指南和向后兼容性说明。","order":4,"progress_status":"completed","dependent_files":"backend/src/routes/index.js,backend/src/routes/auth.js,backend/src/routes/brands.js,backend/src/routes/models.js,backend/src/routes/ota.js,backend/src/routes/users.js,backend/src/routes/shareCodeLogs.js","gmt_create":"2026-06-30T14:04:20.638264+08:00","gmt_modified":"2026-06-30T14:10:41.230618+08:00","raw_data":"WikiEncrypted:N3UbzwGjCC3xD6BrTM0cq1j04iiCHEqviOrAoLLUfGDtCxYctzqR2At1GtmCrwAkNRcHgUzXC/oU+pquLUAJyJG4QbY4uH8HShHwsSaBVDFWOUg5Yt9aKSem2W6e8/XsvBH+yP21CSU0WyXIunvAbMDWN2E2tdW6Wzy85z2Q/R5uQyWZgy2mpBkGdGtFA8tnpiTWGrll3lHHu51hSPp8fubLI6JOYB7Pcw5m81DnxNYl30Rt/HNSOzY2hn6YlxZZe6LYmbGYTHJFaQ+1mi9pLEDLwyAsd2NXDHCvcH5PyODvHQQiWusTZ2CJRbKqnQ29hlTXhH7vxfD6JA4CJLUr1IQO4O+sNaKIJM2yqvq9AtsVFlDiSbBbx0hHeupPxyxoyJrkbQ0YEnJYE8vcEVwUMFYBaA73AgBMVIgg7EIO6aoO1qtVQOCj8O6WC/bpRRG0VsKJKCG0cWJF2x1R0da2454d/mYk0E3sNIdLAYefmKn5znpcSVxPYUmIasm7sRHIngjfBQy3oRnj8iMwUo4jJVzUnK7+SXmAFMGJnkGsPff2MYZK1ziPEV2jaUxxsuLG+ZJVOkkPArausPuO+h0DzRYrD5rtNlQHj/M+VdBjK/fZjUHU1VYdsOAE1Owe/XiTW736BtdVxEahqzEy4KjCuHnbdYOecFSzuuJBu8+IlaAIS12uC5MPrhIyhcgnimmvjDGib+IlTsmikIQS8yj/M1+iuWVwDonBYGcgL/M4fnP9tsUdLa0iICT02XF5rsFc0k3qg8BcCd1qTG1LzSDn0OGKkrowiNxsp7if26Sm14qjk/kMrLV35NzhCrv6AE1YQGMD/Dw9P+dhQT+6f+GNG7vvKDnkf14/8gSVoiZsVqvGFSRbn+uscXceS5KZOfRVqzG+beWC5lBGoBu9NDft5xzAlWLF3xkgw3v7JBOOs53KoXfRuWlF4MjpF/L9Pi0K8Zdy4N1kOcHDKfzZTX19J7qHEHGfaKEhLP+EJzuy2zgGMtSYa9GSR8ku/SMuX6kyUbmmBRECqXb4ohzFJZVKEysRjplQzr9b6kLmHq3DOFdeYpQjJVFbehRbFgziE66TVVVeSbE7EuqOl3E7mVe0w7GgLODvHmOCTJFVMvcc3Ci5Fe9jWyomiNykvjfxv5+iLlDrwAGoXHYeu0dvl32TPy2yen6q+hOAxVtrIQh2efNFU7L9NmApvpdARKuQC9oYmvDtTYb3ifOXMRtdWJNUVz8DQCf8jo9QF/5mlamAcnhWOR/muhUCtnB+WZbireNw26SGG5yt5NZLrMJRjNxWgM/mQ/K47LoKgPimdSfBDApR6MRTXyI/wKP5Lxg+UYUGLapLKqHrfamPFlWtyAMER1HR+wzMaIU/5E66GbWmR2s9oQgJpWfELjIUlODtmHh8trWp1yzOUXksZH/Kooshmmse4XmZ9upGxeADqhi9sY2ReO9DJZcGZzy04R570EuL/pWLoXP7E9b406rBlQ+pGAtw/Lj+/nK1LkZFclvYsH4="},{"id":"b4054b83-f0cb-4b7e-9b3d-effc904a5686","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户管理API","description":"users-api","prompt":"为系统用户管理API创建详细的RESTful API文档。记录用户CRUD操作的HTTP方法、URL模式、请求/响应模式和权限控制机制。包含用户列表查询、用户详情获取、用户创建、更新和删除接口的详细说明。提供用户权限验证、角色管理和状态控制的实现指南。文档化用户密码重置、账户激活和权限分配的功能。包含批量用户操作和导入导出的实现示例。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":4,"progress_status":"completed","dependent_files":"backend/src/routes/users.js,backend/src/models/DashboardUser.js,backend/src/services/userBootstrap.js","gmt_create":"2026-06-30T14:04:55.156387+08:00","gmt_modified":"2026-06-30T14:30:22.110712+08:00","raw_data":"WikiEncrypted:pOan1y/G3TzMEng6wi54Vc5wz1mwLua9oaQGTUm9cssalr5g1toTPIfYljFY5WaWYpIfvMfcOIPjVC5YrZe6T0ZeXnIn6qFUeNFA9VkQiOd+eP8PI9TknxwVIlnH8jIbIwUHH+P6UkkSNKkoEQ1Dgy4tQyZQ/BwhCdLqQABUIXBPU5meJ+X6w0MX1tiAe3bz/ckrWZcMva22ulspZnMMC1Wk3aVoZim2mC/orMFko2LdLZbXjVX8uNiFeB8UyaHHY0eGKN3MEHmSchfVJBXzLJAuJlUXl365b+bzfvnnzO1j6LwNYJMluGW/Bm8YNNXxv/nIBbzYwvWGjn/7eXoSDSP8c2D1QpN1Vtejf68ju2Xll64t71U4ToaQ6nUYw5uqsUgZDj9zsGfOjV52J2RWSeXnUQ7cUo+WLL/4N/5+3+KBlnUUuc5rvgZ/SdfIBzoYoyeDi+IU/K8j1B2CXPKNjSY7YV929LeSJGbcYxEdA7eH0c0zY7gNqyy/28oMx0Drkn/jYuCiMnKuQHF05L3581zmgFITJkAamXJV087BZCHex0iiYzrB2yS3QXrUCRMa5YfiO3mhv7u6C5A1bzqtY1b2pX30yhhKw71FwAuA172/tw63XUnOXjQ3M38mTt5hhxI+Z27ySXPk7jZs6OQosySBxga+SW59BdQWICrvO0/Jr8CqbIQ4usht8J3plxZpAOasjahz4ung4eJEzGEngpdQmNouctQvHBWOSXzbubhIGXplonmBfLNDPRk81plmJsV/vS9cNjIOPCmHJxQAXdEExTKuqASOCeD02Q7iDS3H8lUuIkNaF2mqaGwJXYsGwglkH2PtJIPpV7OLPmu7BT1QM3Vx/EK6EgWK4AkX8njheLaiGDxuJ1ZboRwInEgTcPY7PBX/x6jg4JI0TnG7jozxFYvNGlQR8xCJZ4SXSGF5mUM2MerylFlNh4SvGysXSDbMoo9tzYOFrwN7HD8ao7wuyTqK5EauHRjJiy7DQ1xhkAR+8xbFglSPmyzymu4KVhXnBy+ad2/UhT1vc3j5G2I+My/soGEHQUDr4q6/0Jk=","layer_level":1},{"id":"7a728623-5bd2-48eb-80d9-0f253bc74123","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户模型","description":"user-model","prompt":"创建DashboardUser模型的详细文档,包括用户名、密码哈希、角色权限、状态管理等字段定义。说明用户认证和授权机制的实现。文档化密码加密、JWT令牌管理和会话控制。解释超级管理员和普通用户的权限差异。提供用户管理的完整操作流程和安全考虑。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":4,"progress_status":"completed","dependent_files":"backend/src/models/DashboardUser.js","gmt_create":"2026-06-30T14:05:22.624965+08:00","gmt_modified":"2026-06-30T14:30:58.467643+08:00","raw_data":"WikiEncrypted:piKNT601qxwAxFbFc+bbNzJoKRWjVA24DZgSuXUMKeYDI+Vpob6SIDpceCgG+l/ARXk22LQbqNrJSpxaw3lYcwfCs/ysy8OCLL5SJdUHJVrbRwBO9VCr7EM1ykzkC72RNFstSYAcnBFNhGMXw+lvldpEXlEqZE9WwOHqS96NXNWqbxrN5aNChpOr2Rclp1ATRSAz2nUS+IeeSx64uQOVL3aSyP9BxlRPnARz3KagI4h5xFbrFRmGOu+2fHjVv4mfGuyBi2m7BOAvsQRAReO4aLFcrb4Q4d/YoU05hkkDJCsF+uw1h2wLNYqLbKVPnnQ+vXJsPReY5PN1qLbXnK4SYp2DGFm9mcWTWJYYzE3plH87IhZQUyYfFFWSWzNA+oWacGaaij336n0rQ1emfUynmp20c5H12gaAdeJnKNtilwuveESCgjV+cpQeQFNPuSBymzN2EYIYg9aAesv2HK1H3PBo1BRPR8jsYXLLErgqgfSevZLVZGasl1cVMkdzhHd3jXywieDpMk0OiXw2TzVbfD/R59mDLQ/8RFFCxIY4Seg7wwXx+w9Nk4zHDmIGcT2ciMFdmomMHsiK9TT5/bl0pCM8PpQi8V/abMOyhNZqK2NO8mgxpys8XDLzN2vunY5DWeD1FwI9Do09XWWByBmvOhSAQnZp5IvO+Yc1FEzRSo4NHjxKOXDmFE6f4WRlmoKnttDNUMGRnE0MXXnbj33ztpBqhSkH2IHqEDWAYGb03f12CEM2q4RcTHO1fbB3ZAECoyGOC3pmIqTyin9JECRtDQ==","layer_level":1},{"id":"4d08f4ca-84f9-4f9c-8d9a-0983f78a7005","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"用户权限管理","description":"user-permission-management","prompt":"为用户权限管理功能创建详细内容,深入解释系统用户管理、权限分配、状态控制的实现细节。包含来自实际代码库的具体示例,展示用户列表管理、权限分配、用户状态控制等功能。文档化用户模型的配置选项、参数和返回值。解释超级管理员权限验证、用户引导初始化的使用场景。解决常见的权限管理问题如权限继承、状态同步等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":4,"progress_status":"completed","dependent_files":"backend/src/routes/users.js,backend/src/models/DashboardUser.js,backend/src/services/userBootstrap.js,frontend/src/views/system/users/index.vue","gmt_create":"2026-06-30T14:05:25.898001+08:00","gmt_modified":"2026-06-30T14:30:59.497744+08:00","raw_data":"WikiEncrypted:A2q6dsB1G5KaNgPAwP2ZpD/NNAqdMxLD500dNl3wstxRlsTO1UAX3pxjxaiFL3z0As1vXXbkbHu4vNUGPLAL5aQdvyDy/rpc97235R5NBNTdhWQsZBMstzLADK9pZc2FHGxl73wo/dEkASQtxoZ8c/HAPRkbzM7NeoD9dIYUm8IACZdB7XsWNk9eYgM1s+F7EamxXZeo9LRcbb/Y/YFKbxweyfSjWzXvXjvoJz8YZ3tGNPnZgwl5qgSc7Iqd/zEcwe9suFPVJyoHFnfJNUH/kaeWu8f/cHWsyJGasZNAaAwZBBs3yTizjbbGBQE3c3I9OoTx3e45q++1SKXw87o4e/05qmBvNeVZolDT9qztewrGf8fDjB1GqNNK4z78df0HVIaQFZhhhIFgSY47aR+4kMu5z6cAMD04SbGH/sGtdnmsA6r40hK+TgrjJ7YJEn5YDMV6ULhMS2AGgCAgoOoOaQAYdtp00rHL6DqxWP7Ayw/PrS1EGjonvJDwqy2YY4Wu06Ti9Sv/p3stKU6l6v600sAU/HYdfnDB8XXCaiCnr1aOXNMMzow2YRdFlIzdIuCnb20FmdM6scyabPlKwJ+Q0bqI1kP3t1AzsMWzBOu/hSduzKJtqJdugcKam/IQ9dK5dNWVHOLXVwDMONyaqpurXeP0qrftDRCgr7tfAe7T1F17lX6F8vAAFXSSGlwuyU3jsLTxYLSnIBOiSsa8RpX4QosLNkYfmULBdd3rabnHteIWLCeywBzzAZwJL9/1WtaxYZ6upIjMsLu6LvNaXz7d7tfg2XqQT5SckfhVnsfs7251aj+Xj1CmFmER0EUEKiMtS1VlphUcRYaWP3cwRjPgIItB7hTHnDqlj4l8pW6pQm9DFy4luQ83CJlsw/FEjW6lloK8XYhGAiGN0PR8dTYL0LzjOi7h9MbZ3uCqrW4Sus9kHxcVPN1Ubt6Pl3KOadbrS5pfUae8rpFVss4Dx4K00tLXLycXKmVHa5Ctl1Z5EhAHn6/G+a2oo9L9ymOTVHWuMrH7peksW83s4aykHZ+cX5kVMOf4+wmVmLlrnYNHZ/erqFhdMHJjX3WoWzfJ9JbFm6j3AL0Rr/+/gY0h2U5dGO/ioG+M11sSM0TnmIHFSvQ5BMA7LQKYm734RsnlDaNiR5GUtVCC4ZGa0Z8ijU4iHI2N9XnTa3R1UEQAqMMGE8eAg7Mhy+eieZyElZFJTkhPbbPE/T/rMkbtaGNqMan3KohQvlP8qX0Mtb4UOYnI8fd0RwahU3KVQYEEtwhMvf7LRH6zLOVlQjtT56TgSAPCkla0Co4fMEDZpLDuSPD972VDq5r4NnMIk0ZaPfNHWcTgD+pAIL7IDmO04KLJV0h9lEguVWpMWskakEkbQsD28FQ=","layer_level":1},{"id":"f23cd2ae-fcf4-445f-b8e9-b3382f277ae0","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"OTA固件管理页面","description":"ota-management","prompt":"创建OTA固件管理页面的详细文档。全面介绍固件版本管理功能,包括固件上传、版本控制、强制更新配置和发布状态管理。详细说明固件文件的上传流程、格式验证、大小限制和存储策略。记录OTA版本的兼容性检查、更新策略配置和用户通知机制。解释固件下载统计、版本历史和回滚功能的实现。提供OTA管理页面的进度监控、错误处理和用户体验优化方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":4,"progress_status":"completed","dependent_files":"frontend/src/views/ota/index.vue,frontend/src/api/blacklist.js,frontend/src/api/otaTargetDevice.js,frontend/src/api/ota.js","gmt_create":"2026-06-30T14:05:55.603184+08:00","gmt_modified":"2026-06-30T18:39:29.639151+08:00","raw_data":"WikiEncrypted:xd9L+Z9CK+rU9nPZV+aXHWN/UvyEHGWdvdi/wL/SLAtsxjcusIK0geuW0ev94vFm/+ZZNy+ieVfnAfHGqmL17rwVengK5U+HuyndLcsd+vU8WWUYAcbMeIuhajT2ueakLuWMAOBjC7Qjnk00go13X96EUYEuiWmkoDFEuFYCUNlYB8K85tvNFMpVCY2Qqrx9nomuigjf1WFHD0TrRVrhs1NHGRazgaJy8rA9ZCQXZkYfZ1sQWyMvR2zhRCZmZQ1P+Ay/sZmld3IJZ1uHwC0AOC62fyj0Y1CRG00+FjGRJYmzRiiT1ovJN0FMKEQ4+ReupsiHFpHZwkDERurHDlQ13YRkt4OKVRbYHan2yeZ/pF8DmJl3lk4ibWGBVa/AktLpQH/cUYiwk1NNG954l10fIGdxJOmE9R5Pi8JImO5MVH/3QHkAqJa/MCaS9oCtKu7kTXs2P9M0FSG30V8RfUHetYe3HaVCRL4FaCWm8r4erR9/3gp/e6yyuYA0CbY7j3tlp+/1/Qvqix1yzELc5MNkA4qG9J8EJ9SuSeN/9+R8qgOGZGbVnV2pC2dDbJZPfqMV1V/gcaZi/XRILpuz+Wo4BeKwxqmOTBX1yXOjLGxipXmUgGC0BOGAhldPX6VRTqlAqgl69qQ6tDSa0NgINVjg4K/h87ey+LGxhLZd7rbOMhCivmOOOvoJQAIsUIqVDWOfr19PDz/w89QxoGa1I2HaQacuwqfN+/eZ9b6ipHhWRy8Z0HpwlxllW2H+GUfdUewZEsd9hxIcilDCkSqwTRsdHRksuOEht3C6AoEO6az767HSveBe9SkKa+U3nf2mOcXCYjN6ISB5WE1ClRdOJd0a39T4zLVebVbEAGGzWtGHNr5Zc0GN7UftAiggZrjBJtDnIDCqSnwlc9Oq8jUS+4jZVkVz264OhepVcchT8JSgeeQ/2KDCw34q3sZ6q1TAfhZRhL6vKdM3gz+/IABj7p7OUv8iC1Im5i7hS4CXHlicAxg9tl8507psv1ePxbDNRCoS6+OM2+od+U3ma8RFAWzdBsvaXF2GWl6SxLmvRUvfavdwCmxUBmqxscgH8Kim1FZfW4EARHkIl5QYIm19a4Y2B7iKW3iDH7pBzbJ3uyozZUk=","layer_level":2},{"id":"aa2583bf-2c6e-4792-b794-1563db547d08","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"前端组件","description":"frontend-components","prompt":"创建详细的UI组件文档,描述组件的视觉外观、行为和用户交互模式。记录props/属性、事件、插槽和自定义选项。包含使用示例和代码片段。提供响应式设计和无障碍访问合规性指南。记录组件状态、动画和过渡效果。包含样式自定义选项和主题支持。解决跨浏览器兼容性和性能优化。记录组件组合模式和与其他UI元素的集成。详细说明侧边栏Logo、标签页视图、布局组件和各个功能页面组件的设计和实现。","order":5,"progress_status":"completed","dependent_files":"frontend/src/components/SidebarLogo.vue,frontend/src/components/TabsView.vue,frontend/src/layout/index.vue,frontend/src/views/home/index.vue,frontend/src/views/login/index.vue,frontend/src/views/brand/index.vue,frontend/src/views/model/index.vue,frontend/src/views/ota/index.vue,frontend/src/views/system/users/index.vue,frontend/src/views/share-code/log.vue","gmt_create":"2026-06-30T14:04:20.638638+08:00","gmt_modified":"2026-06-30T14:11:17.430176+08:00","raw_data":"WikiEncrypted:rJ/rIw0gVau8jPGqKFBAsBQkxmdK9VEWEB6rlQ8V+1n3+8ehC1YI3uvDR9AKl6JkUxV+3U9CRiifnSLpQnnLCcDHafY0ujJqoG3mrKKLwcRefLIG97HCvpjj9xp4OJcObEYBvlH2pirjv5kfcD3coj+uej2+6It4OTgW2/0oKQer4Q7Jd3Xj3CROmzgzm1LeW9oHFyhqH7niUp8ounxYBAbQB6XdHwIaefNnUgBxo1FjRY5CB1LpLxEjRSkY9CBNS2Dfpl69BuhxVtiLlOBNsl22N9tUH0iPTEXk6TAQLd4Vb7QtJ8CCyPAtkpYnKU5QcfIO0Bcvp3MjVk52MPrRkpqhDzgLNq/58gj0RreavkJSyaecu5m5ingaM2ajsfwmWctlEFTbw7A7cpt15Z1RrVcJLo5T/4M0EFp2moBm1frk6hoO/SHg+ZmmZaSeN0CvbCvOu4VnNuh25cYO5dfRb5bD7aInrtFDRIEFVioUhtHbToaLmNbDxgYKC8jX0WO/lCgsNRyAqBMOVG9YywTcUyCao4ULaOYmT7bGHur1f7MHzT3Hcx7v+f5YDgtl7gIF3c37iMffA16fAhftd84iZA7DCWaR+x6ijSk6EVit7zN4bWFerdddsjBKgaNBH8WGTtsw4GmTfKcQ4lOr6kHuWwzvyJNbUAxVswCW7Kl7ofivxTaQwWtkjD8l6roq19h8uSRl7hqI2NFmLS/Mxuw5m9PNBlo3vptugDd5TAmLgLPkXnnPAHW5GBqe29HdNyEhU1vWTlQJu6TWrfVmeJrgLD7o4ciYSWBNzEJ0CMY19O60jiToNgpa2eBMrM6zgdhA9AdCdyk0sCCEGrNB18vMHFvtY96o/H+sVIVQsAsOoTx5sxOH0A2SJQX0NWZ270aO/huXZgV1r6rJV+iSPSpCAC4cXQ0EfI2bDDSzzWOSWezC2pwi8hfePFC64jC55cf1K03jW/4TH/MRixvP7PzBgDJ9WFTF5wLqV0IL6Rs/SDHnWnsbJ3+k2MGhSaMOncA89PGFNupdNbrk4x5luggzyTcc84zOUmn60WPhUrJZMAZfkkE4tKS1XRLUkHoxR/1WwL+VDZlaseEEFKZLWyNFBuGAscN09RzwicXS0WVW8CGZaAxZ8oMaydUMrZSqZMjVh7rFciLtXlbV2udQvIWE9dLuZVEGazVv+8BwkERKAXlPfl7VKo4Jpave0m0QS3JnRoK9RpQwsDXspauvY7XhvO4HvSwxXI1MFGjZBaqWEJCoEDzioluPgZ59mP+Zcf5AOw8qx+xLBLYVuJimxSmpplLeIcpRAD6GXIgXIpAQ0ZW629iB40UUtegO6jlZZMjEBNfW2h+7tArd5TmsR1GjBW04FHckaxFGn2sd8WOF1DbTN5g0lAkAKy/cGNjvEE1ZWKAKCGgv4IkAnme5huEBC2w9jqVDA6/cxoVNI1PqCHuZXtfmBqsygXhLj977b7lhgSMLm+ZyOl0F6tiopYxNMXhWjy1wCRXMPU7hHtqjeBok3Sb25XahZAuSPqzZ3MYjV4+PJHTejHONP9ch60/4uTU1ZmPSbYxlP3W91KjEOUHl4J79bUda7/K9+Fa84mMZvhiy1EOrsjAANGlQFE4+GAMHNdiLb69Zhc/CH0q2EaU="},{"id":"a6304333-66ad-4b0c-834f-a6a514069e3f","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志API","description":"share-code-logs-api","prompt":"为分享码日志API创建完整的RESTful API文档。记录分享码使用记录查询的HTTP方法、URL模式、请求/响应模式和数据统计功能。包含日志列表查询、日志详情获取、日志筛选和统计分析接口的详细说明。提供时间范围查询、用户筛选和设备类型的过滤条件。文档化日志数据的存储格式、查询优化和大数据量处理方案。包含日志导出、报表生成和趋势分析的实现指南。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":5,"progress_status":"completed","dependent_files":"backend/src/routes/shareCodeLogs.js,backend/src/models/ShareCodeLog.js","gmt_create":"2026-06-30T14:04:55.156497+08:00","gmt_modified":"2026-06-30T14:32:04.002947+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOUGyGBdIMK4cf0QP9R1E4ivY78WzOdR/wvtMHeKsZOPO0asW2W/MvDKc2jNyZQ+LHngb47F7NF4YJSkCgZxByRVJgj10T4wWac0DckADW5AH88CZpVx4BBCtuW5KRlakkySQXJ0Vhm+mv0KwUrtthQTb+hq/5FeNYbS+kOr5euCqYQ6wwEmLbt10MSZp1WKWdfCf7X9KcgY2Io011J6+JnBsJnbbWDcnhkvMDFUdGk4GwKyEMiedTBkgb+39rNaRYcnJAsprHfzqiWCLqNoVAWgXLhDwpQo+Rj9Bju4u0x7yWdcWAVxIhjtS1HTrpnn7SF1fT+zQ9CwvBC1jdBr6zPv2EEfd9aDeDmF9fusxmxrz6O9t8G8p8DZU+16l6SzrO24RGp0ljE2hnue5SjY7K50OQ+9U35K/w+G/qOjEOt/Xm9AhDSALYcylw0X+3TFn0Dw17GvH6f/i4Rkt7qMYvBGYUby2TfoOMz8t6dGm1c9yflUtfXDVmMEwmVvMHLCRtuD5TyA5dQ/ZMntXUjliHSeS+A6CWlqs3JxRZ1RzMhrWSMPoLaP7KkI0jtFbNfasJ0Og/s0lvoq5QfTYeaB3SPAVOrEJCTUAk1WJBefCXaJLQJWM5BL41nZaNCLL5xFdD7vrcFofJoqf8rJdD76QntawCuPNY82NOq776fFPBqp80R5e0OAsB0SDbQ8ij7hs892TDLCAZD/uQpah7kDXRz3wpPMv5Fvw1Vx5dqBUU1Ft8O6oV36Svb9q7kzHN4uEsXSGmQqxigR/bDvMFj9wUMlwgWUOgeKVG3mvewBOFOO553ePEGez98IygIUSyEQH9u0EEnfXlX8Ctc1L/advVhMuLFfDBj9GSPmfqkcpEekoG2IhmUo15MFwKOmoR6YpBqaOeGU3M+ulhTXCdC/XVY/mQ+Tbruxlx4wSxvEVLqggywoVkMab3NqXnh2yrndnibentA5ka4iDfLNAT2NAPvzDWenmrtjYrZNRTiDoH4ZjahTBysR+ESqmTOnYPQcmU9ilGcP7Kf8y8xEndb3tWlBE=","layer_level":1},{"id":"e1d1f354-edc2-4c91-8d91-63d256dced21","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志模型","description":"share-code-log-model","prompt":"创建ShareCodeLog模型的详细文档,包括分享码生成、使用记录、时间戳、用户信息等字段设计。说明分享码的生成算法和唯一性保证。文档化日志记录的完整流程和数据追踪机制。解释分享码的生命周期管理和过期策略。提供日志查询和统计分析的功能说明。","parent_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","order":5,"progress_status":"completed","dependent_files":"backend/src/models/ShareCodeLog.js","gmt_create":"2026-06-30T14:05:22.625325+08:00","gmt_modified":"2026-06-30T14:32:46.410606+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOUGlhYbZc4czqT8CWfnD/TT0eAt7tg/OAA6mgsocPcmsvG2PVtH5KfyjJ18P9rTMPxOEyjU1Gec605uXe0T2Yc9Mio8lwWTXlLiR9CHDgdmESC5j1t2aKR8fRd/OqASPFvLiR0grE99PCeoM7ob/y5BtcgxZWjzfCnfZNCwnjfkkosGhR45PqgoCyAC2Bvm0kMJCqP4lVPKf04wOTjSbr4eSl32wo9TqavhtHLUKJhoU1BhZbZ6uV7Gmzaq1mQWqsX71L36aDcvYYmopGt7DE2LJksbYCFrrNBgRhFv+N43uZbN5WL7wVhpvK8O4TVwd0FOwp+aZ7iAbUL7tgjCR8xtXJS5q57NTemsro4PJNWVbllR6P5VHcrSDBmtHsa6L1bXDOBei3zTdzkwRq37T3c3mujEECBZ/+Mz/9ujMM0yIhcbbPT/YGEGDAiU/BRLBAOMuV3WWC2MQhqRkoipHvCj8loLpu05az/NRT/cd/X5gfi0y7vJvNz1FLlIiiUEZfQro7D7k5gwTCP6/FBmDYgfPSOCN8xZdyb7gHNanf1+Cqj69JaEgpM8cJM/v7a47fURXAUR+wy+lsKH+YapUusdACBBPvzGrGTJGzBX9gZVLFdPZFt35TATN0bywZa5At1ySd8SIj2B3St+GopTloe/mXlC4w6a5oi4MsUi1aQNJUFynSnhmsvMHTFxp20vLRYRzH2gO2ReFyg+ErSFjXFKLsd7zrW/lMF0PFW90/eb7fGWQwoQT/GJ8bv50VRjO84z4xEz6cvM/y2o4LjMcbv2elQDtp6lJ6TC2Z9jG61tVu","layer_level":1},{"id":"c6207e0a-6059-40f8-a27d-367356363cbf","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志管理","description":"share-code-log-management","prompt":"为分享码日志管理功能创建详细内容,深入解释分享码使用记录追踪、日志查询统计的实现细节。包含来自实际代码库的具体示例,展示日志列表查询、统计分析等功能。文档化分享码日志模型的配置选项、参数和返回值。解释日志记录的触发条件、查询过滤的使用场景。解决常见的日志管理问题如性能优化、数据清理等。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。","parent_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","order":5,"progress_status":"completed","dependent_files":"backend/src/routes/shareCodeLogs.js,backend/src/models/ShareCodeLog.js,frontend/src/views/share-code/log.vue","gmt_create":"2026-06-30T14:05:25.898159+08:00","gmt_modified":"2026-06-30T14:33:14.029388+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOULG3Baig8xCTbO2Ahhfn4705w5gj8ZRYmh46RDQMtCZDcT2ci8E8rsm8C/ie07Z01SjriTUMDr+8A42/BBZb/vivf/I1Ur0WP4FZh/48LAYVnwRQ0GNifiKYZ6r/iL/jguQ3fWxzUE0M/+R6HIELC8yJAbp7rcQIITL2AxtPIlU2pCBK/DCcqQD+ZybcLujwZWxLN3sOZv7I9hqca2d8RAp0ZUgYqh+tSW9DGD0yS9XHY1QrXl7hsXfIgSTvVprJ8RT5HOeKTMeBxcM288vxkz1ghLqaMTAik+OQN0BzR56crsJmaCilWkrOAX9R2xm8hLfGTGTwdwv0P6fYaXu6VwOHBRDHoIHfGrImp4IIqNl/qAQnBVEIF90ZUdARF/K4lVsKi5QByQzHd4xlLllAAhTWwK9S7HsZZ7T9HP6og6LjL0bhFAv7f4lX1gq2+EcdF4EC/sLc6w4D+SdCSFgVU0xdT56IyK2HCqk+Oa3x3yOT6iwe5gfFarTyyXSrSV3RDHIGxTQjw5ZLgrseB4w/uQSPLjoDkZLP8d/jXwMcNr4bqp8w9PxWyrUNViTfQB/UvF0DUtxSE2j6+nUvqGdl8Ix1VA62otvJvJFAikk9gVFtOHg+3qSjX3bq++/RQqakUc0NNE5MChQJYL/ZUX+MsmET7zMf7f8n+x8AWQTkhv433TAIPxZDEO7EVVshX752wWI5rwX+6dwESN5VijNJl/emYmtP7TslKL6O12aJ/nVMD0zmRsBl2iHy0RZkN9eLWDa/pklLR/Oqz4Pm2r2Dd1lh8gU5sHdMMVYjz/g/hdk4KVkvOKz7kAFP0wHLPPzNiplQ18EUANo91+uz1Y5VdeODz9dktzaFqMjD1octmfT4pX5YAT/zhIQc9MsKjbHTAueD6bqZxj3x0qiZ9gh05gFbrskmk5q2ogQ/HzE3E4lrM6f2tYMv8KzXjP7yKEHcMOBJpO9dQZd5i7it8/RiUAHSb7Vti8AKU8Vw+TOV55DcDhFbK5P9y2qvuxqUldoMQK17B9wEx2nncwPjOJP5wXEELVSCNDm9Z29WK5LjvNExjGy7E61ilKE+rLRV8OMZoA5ighPPFXalAtu7mLH9y8P8lhjNfSKFoGWqPz0GeSGHgYiYIJ2uAMIsp8PabUEf93feQ4gaKPupXFYXWZQFV+XZOLHbet0vp6KH5TBD2X2fQHG4FVe4IHTI4T5kGOpx+ZDv3WPjRDrHHl+CCVCwlkaovZU1dGMSoUsss8uXaSH63mv5fUu9tAM01OquwkJLbg==","layer_level":1},{"id":"ff078afb-bb04-4600-b51d-5af48a6a6f06","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"系统用户管理页面","description":"system-users","prompt":"创建系统用户管理页面的详细文档。全面介绍用户权限管理功能,包括用户列表展示、角色分配、权限控制和状态管理。详细说明用户的增删改查操作、密码重置和权限验证机制。记录用户角色的定义、权限矩阵和访问控制策略。解释用户登录日志、活动监控和安全审计功能。提供用户管理页面的批量操作、搜索过滤和数据导出的实现方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":5,"progress_status":"completed","dependent_files":"frontend/src/views/system/users/index.vue,frontend/src/api/user.js","gmt_create":"2026-06-30T14:05:55.603342+08:00","gmt_modified":"2026-06-30T14:39:03.429018+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjBvJUaTQCtYwqrk1rWKWMXJ2ByhuPeDEe4J4aaVwd0GgkvyTIoPxLy0LzUPY8r27d/l3kXaZv/WIKLhXGNj4yqu/L9TGNhQd7PzwpK1IySbUybplyf6amFlUaZuCaMERjNdevMyzFYtpxg6ayafgmP7QZecNCYUUM3UDhFO+jU77Y3eONzUMc7vXH/eCT/Dc8cixl5LBJezboIymPfUKgJeIdetGX7IbiD8pL9tqiP3VV20ENuC361bvx5BHKgEgEz8r0ZRf+9GIa42eaVqFk9oS/OowsTalFP/WZp8IvsoQDgbxWtLfVja9CdwkAVvNFFoL92QsKVmMWwH4lC52GOFGmDtwWsWbsAQ7SC3FGCM9JqnaqrBk9L4OpLg7pbEGasp9n9YM4uL0i51ofbrskfLA7c5Ic8YWcfSq+YpP2Jfq2SfzWhkv6/69JsVm+ZeGECDYz/0BGLtJxuOHkE/X64/lMwm31m7RCbzrAT8s4fv70FYcrJ/e8ZTbBJJZ3nT1xOeu7NNolSYaUNRMKjj1f5XkM/bMio6syjKv3/sgDYeom2Z7KNC6qSiTtHSnUhR42TA/gepnPqFc654KQYnEbgtAxassS1rRCPSzZImnQue+Fm/xTdC7aQoeH7W9EGQhx9d/VKgE3DtmwgFfod4b9BL2E8Y+tjinaohB3LFSs0ywB30qKQeXZ0P5O00PShkYvMrnbrMgSYl9v1ikd2ca0x7UQMeS/9tanT+Nifwq7peDxs+vuwD8itOpOhe9lmEGyaunK3mOmMNU2qUP/IsFh7AG+0RI+ia2YOGLXRp/DAbZQOeiJotMpzzCetWsU2C7tkh4up/34yJu+PlIernbNrohRmq012Vk43bJsJuE/ozXHeWh2abw++XRn0rdJUXv4oHuxv/x/ou4BNRGgqxxLsK2sH44gu1qYF38dnjvjwos07VT3aeLuJQHfsrl3acgM+AniQul0Xzht3gFgcf88x++sScG3dMcqdCzRdr2YrFR","layer_level":2},{"id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"核心功能模块","description":"core-features","prompt":"为核心功能模块创建详细内容,深入解释实现细节、调用关系、接口、领域模型和使用模式。包含来自实际代码库的具体示例。文档化配置选项、参数和返回值。解释与其他组件的关系。解决常见问题及其解决方案。使内容对初学者易于理解,同时为有经验的开发者提供足够的技术深度。详细说明用户认证系统、品牌管理、型号管理、OTA固件管理、用户权限管理和分享码日志管理等核心功能的实现原理和使用方法。","order":6,"progress_status":"completed","dependent_files":"backend/src/middleware/auth.js,backend/src/services/userBootstrap.js,backend/src/validators/brand.js,backend/src/validators/model.js,backend/src/validators/ota.js,backend/src/utils/jwt.js,backend/src/utils/password.js","gmt_create":"2026-06-30T14:04:20.638906+08:00","gmt_modified":"2026-06-30T14:13:04.758812+08:00","raw_data":"WikiEncrypted:luoNp8LvFa7zGThvIT9T4gfD6KbzJyTAydbcRfVv0b71O04CYqWd+mhwOAKx5JsjRdElm0elYpXWbl1GcuBvfF0k/N/rYqIOGrNDyuFsYrr3vrPVHqwKfwIO8ii5FyJ9G2/CDKYKxfMvL5/eI5LLiI4dLJtQQ/EdXK+jGK6/3zTIZqdWj6UWzEW0mzY+65TLZKIQZsNDvuMmW4V+typo30j85XSOUpwUwj+/2P69d0p3/7KOTGhpxkQJpKwSS+Ou5oR7kyDTwjuBkFTeJYqyV4VYROOqBypa7dwYKe6Knr1LT+azHmTqixb1zXUPJQ6p979figgTjll32+b/GM+0T95z9Ds7J33B5KOsO0LOJ2cNLWiB+C528YQV0AHDkFf1mTE6bKTBGolo1fT4KVvufyT4JAn0aYmpJDe7tiniUE6tbKy3fen2CQn9ieLIOKFMeUBmDsDefoy1030Wnd5JzFcKgRtb87NRHcsiF5I+V+X2E2TlZUoJoBh2+PIAZYkxWcpXMD8Zpcfv17FAZo34dTydLS3wYxVC1tKcqor5qPs+woQNYAnvSCdaK3H0Hd9zIb2V13Yw4TRtaGR93SOAPzmuaylTjsqmJkhkPpPdL9RfBPI0NWsglIj0e7zkEcku4zGa6Hs0rFAUnvrmhf0fWTCe2cSQGsKT/x/At4Bbv1VXx/iJB5IG9L92sH9auvd3zPQzrXgvmZtIf5veeHTENNsFXlRqyHIlznBprPM1GVkTnIUQw7mmC+4Q/6jSl1Fv7xI6EG/1udBu/KeaPO67Hp8A1YNTf1ZspoQoSGsV4deaNlmJgBEN8AIyClPwel1TmRAOmWv+F7NI9qVhpN4XyaOA5Z3wLMRdd1TAxRzRXgbQWvO74iEk524UaIecqPr3oFFsE3HHj52svrYNQ4mHfD37w2y52cOqC/kcS+4oPBgecVMRLNK8zQe6TeyZZHyFxLrnPE3yPqPlVq908l/SlqwcGa2igXYfFHCVeaXwT6cPl+MscEbagyBiX4x1QnH/S6eX2dvxx0XY+44nhTYGW1tTBXetozbFeMqqAtV0XePJizOGsP3Lj2vFRJAHZ0N4cgNkiQhJ3KlyCoakiATQXJ/Ff/3M4frqDjOKNgpcGoZJVi8mS1gxHRzr2RdQoq+7KSMhmyGjVSrCbNN1TYIcbahutqBg+nR3vJ99qFoP53jpWwT8PrBP9LqIgRxcpoRf37MTX5j/d86fQw49ZGESGNenE5At8gBSjU2xnAIjZ+F33NfP8+Gz0UQ55JvwG8CjDXbe2noRsLFhkX2mEpZZURkUCUwgViZJht+EkhmoJGdb20nl7nQcUCRyeyH6+kS2RDlqP0MbMuZC3N8E2Cb6QEXiCy8cJTjg8OWpIOvFGO7W1FPwPDXlYJsM09Oo/VhFPx5ImU84OMMy2ku3T1pdBwi8FjXr1WPwwNmRTK4aqj4wrLgLiW5u7UXyrUQBDbS8o3sc5W2z0P8oFWcBaUYRtKmdryx/ogHWLuINkyfSUHAgkWx/keTw6SlEAPYdQGXbal3G4vO3aEnA4oCPhflkrg=="},{"id":"7272429b-c7fb-4bd8-9bd1-0093025d68b4","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"仪表板API","description":"dashboard-api","prompt":"为仪表板API创建详细的RESTful API文档。记录系统统计数据查询的HTTP方法、URL模式、请求/响应模式和数据聚合功能。包含品牌数量统计、型号分布情况、OTA更新状态和用户活跃度等指标的查询接口。提供数据聚合查询、时间序列分析和图表数据格式的实现指南。文档化缓存策略、性能优化和实时数据更新机制。包含自定义统计维度和数据导出功能的使用示例。","parent_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","order":6,"progress_status":"completed","dependent_files":"backend/src/routes/dashboard.js","gmt_create":"2026-06-30T14:04:55.156596+08:00","gmt_modified":"2026-06-30T14:34:26.686007+08:00","raw_data":"WikiEncrypted:rL6JaAWnwczCsZW+uBgt2MaU2Sf5hn65RLINj/MhHZqs/HaL1M/vKzdpRke4FGDeaqlgIkX0Vsq6pgMDhS1PLtsNQBQbbup3R7hfDCWHR7czvQfTQrqQOghuXOCS5RshiZIhSV5UutgR3IhtdYwYuC1cGrxnqubBTLaiNlwSkSCBwNnKv5wnHnP/kSTtGschyyeMxsR0xgLm93y19LUJxzQ35x+o+JHgNt7L1clDn1f2Q/ndGER8N5G6D30Ca4ktQc/XzBkD73s6Y6ATaZU4fF9lJjkb7Xouo6VBeWM/AWnZDx7lOLLIfGHZwEixsbqfV3DPFQnQ5ouP8ITf9zPIvOLqXdiBK/eE4w9o+KnoarDckNX5GdOib9xHogvsjnppRV6HPQAkLwj79jVPVWMDFLLrOA7s4nnSkQ2unS6yWJOH41xes7IM36ZsyWIWGoF/ZfncMR2vb1d6KRd6jKE7U1rWCkhwBMRCtJWteXsXljdFTmntEBDtsnylR8gDBvxw3yX85/iRQE3fgUnx1bzG1Csq7hyeTpYLzKCJGgsoGmXQcuPQy3kvG53RM8x3PLEYSYlDCNn77yDInY9vGLH3AEhP8HfRR/ZpbZtEbTEenKBq3Lpp9JNVMypx8WTiGDNr7Uox6UrnQJn77vaDePXLU9RL2zqzb/ft4ghSWgWkGdxcVZuueg+R6jh5VidCS/2lM4RB6CLZx8B4fjDo0lPC5qjbZfKjw3oBNOXus90NdOMlDs9sK5B5bdAy+xI12Ku3TaX9pvbhun/UkHYHxw/izxoU5pEPmr5H4iOsOOjz723tH+aqaoOA3SfDR3E9vWvd1I8qWQrmf409xaZfuoDpga88y+qC2speLpfqP5XDm76K0m5hvzZI5F54vflZN5TXb6GFYN7/9nNbsPZ4oBgYfPy3GhtEe/eoit9VkApe/PFsqnJ/5EEdU8SvT1wjGsczIvpTY4dSR5q8YpQL6lNH2Q==","layer_level":1},{"id":"830433a7-7370-479c-aa05-c21ff47b059e","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"分享码日志页面","description":"share-code-log","prompt":"创建分享码日志页面的详细文档。全面介绍分享码使用记录的查询和分析功能,包括日志列表展示、时间筛选、用户搜索和统计分析。详细说明日志数据的格式化显示、分页加载和实时更新机制。记录分享码的生成规则、有效期管理和使用状态跟踪。解释日志查询的高级功能,包括条件筛选、数据导出和报表生成。提供分享码日志页面的性能优化、数据可视化和用户体验改进方案。","parent_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","order":6,"progress_status":"completed","dependent_files":"frontend/src/views/share-code/log.vue,frontend/src/api/shareCodeLog.js","gmt_create":"2026-06-30T14:05:55.603485+08:00","gmt_modified":"2026-06-30T14:40:47.220384+08:00","raw_data":"WikiEncrypted:Vv0H16AayoBzPxX7ZlaOUKj5ui7aJNjWR2KaITM+ncU6ladAgr1aX4O1zoYG4BKYxYSLSuvZ2LqnWBJ2QqydzLeyBat1iN9bTXVMqMkgeJtkcSlNEEEBOpwdoKxUJii0pBbTaTPljEgvGCJAdvtM6yaGorC0QzbypPecbpVh3DAjgPtWtUIfgnh/GYXu7HMfEOLjMMyQuJypBLnNAvdE2xXmS/QoHf10Z8jKuZHUEbhw3ognUK++ZjIED7IEMXsM2HoDIWWy2lZE539AcsA9nkIOFMRa34TlykOLVIWGhN+H7uZGRqff0XX8Lwt5hNvL1a/3ZPm/zZJtFJRzY1PmfxyaUjEbF7KQMiGdKNAX1ycQenLZ/ynZX1xiEakxuX4S5qxospfzPGG27gDX8bJKL+3QoqYMxU/6AdnQ3DIox9pP4fapR3p3RYlpJRtSqqFEeeU0AUWmUNHPyBCPgHccE+XNZpISolk2Hln2oVX4yMeI9psNaMz1DpxYj4xlswa92pmvtFEAcryIpMdytbdeAPC2p6O1fyHRkNXdSzu513mdblf+dxvTQs9AEKnzH5IISdpT3oqa0TxsQIonzIXjfyPDQ23xC74ZjI+olJBdCnklVb77alqfTKijeVHqhz8E/oBRslPIuRrBTmbr4MUfnnGv4ABxmqo/MJdG1aSWK+VLXi2S9P5Yi5E/Wwu8H8cYl86z0TdwDM5Hl0l+X0abPVyDJOcHyVvz80tpUlxcC6G9Xz4/vjCq0xfqYtDV4NM2ClDyMsuxq67I9S6UOCBAZbHH5N3WOzgPrZNyfbeFUpydMKmMOgBh5GjkQ3Pz2D+83z+wBDSk8PV0mzk0Re6AqwtuTJtZLBFtavN7E0GJp1Bq+B9fOhkW73CxJvwqIx6freEb2JUkKP8CUVULlLyar8uKaRA6QH9uFiT1SJZkH1fc9CMBH3H/RzAhtB21FP4KFAVk/ha2CsflO9bdZVM3OkChSKQ3qPNzib6+R66ZevkbT7skK19HcLJO3Rr1NOP9tTy0Hy9THr5msllCLl7NDMQi1yiK5GSaztoHJr7ZWuX4FV7iAHww5fyqzLeaVFXK","layer_level":2},{"id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"部署与运维","description":"deployment-operations","prompt":"创建部署与运维文档,详细说明Docker容器化部署、环境配置和生产部署流程。包含容器编排配置、服务依赖关系和网络设置。提供部署脚本的使用说明和自动化部署流程。文档化环境变量配置、数据库连接设置和缓存配置。包含监控指标、日志管理和性能调优建议。提供故障排除指南、备份恢复策略和灾难恢复计划。说明CI/CD流程、版本发布和回滚策略。包含安全配置、防火墙设置和访问控制。","order":7,"progress_status":"completed","dependent_files":"backend/Dockerfile,frontend/Dockerfile,scripts/upload.sh,backend/restart.sh,backend/stop.sh,DEPLOY.md","gmt_create":"2026-06-30T14:04:20.639263+08:00","gmt_modified":"2026-06-30T14:12:37.808551+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w2XbjO+yyEmY3ONOjrL5GjA8+3c0QEcD9OcCVHu+1BW/N5NkoQV86wegqQ9ShX8iSQ2xYIaslcmoc/Kv5OAnUwWV3nuAw37SIDSnlfEVjxgdWIfKDpMe9ANqqSg43yyyS0j6a1ZNPv/lWSKJTBIXQlfQxEh97cKf/j/LT7ms4fDbTvmHrdkW/jEQefQD7MAtQ00jFlMbUkoCaGNftGOahpB8DxiKjvXF2XHkIBSB+ljy8IAN480duozYW3EHkn9BG5DRSK26AvZUAJe48qfnGYdQfTAGEglE/1Hn6EV/Nm/Lb8UvgmdnuBaKTUiZRNooEwAeDN9FVwpQ7worjnl8Wzo8Ngbl2o07Zf9fN+KcjkIURxsPmfGu9sD6V9l1RLWZ6dtbz4WoDiQPm5pDkI0VaVo0KZrYJVqQnyYHiGLgYtwhQ7nukY+LoRhX7Hvp89YdV9IhrLTE1jsDAeCRw579FnnAzgvBLN6zixDwRCyr3c/VerMICukg17xUZBvIhgXPW2oB8aKCvEWd1DoVOOwTTeSRGaBc3YL768bwg/fgb5nMcpkKKEG8oFTiD0WQgV1WrAWmdgqLUic6njl7DH/nPwtU4kvstO6ylEWrBJh8WjjnuFdwsNYNFOXm0yLRUDPlwltGbjmmrB5+TUJes5jh7PSvyD1XFtM0grPtQpYdIM5GZtNYa172rLsqEbW9ZLMORo0XYf0lxg0pNCmBI7/OgcsUnosbnfqoLleFwHsBwIR6IWox1cSj2a8ZP2DdIF1EkS1STU4kcntPhJg/MU6IAHZByl9NaNnPAT9fbjHNYrjgvAocunW1h/GGjsi8yIsr/MYBKQRMHt0Ebx6FyjCoTdVyEZBmj1Ln8n53VqlQUaTLOTlY/+PLW72ayeVV1dbw6nODIElixkXST6BfiyyzGX4NcPjHvrMEj0x7iuPn5XqyNW9cCnIYaLK1POgQXVHvC78pjRvPdQcV2ofQwNXhiUd3OqejjZKYOiXsozbPI2ZmCy/R1XmqKiDotFyd9coZZagRFDm+CP5hAAYjGnqmUIWlnx031QhinbQ19YgTQyPe91UfMnBMYE4piy3j0ar6hKLZHqUrpDdEZc5IhsPiIpVEuUWChMcy/y5JR+jvcKVuXqaFmjA9MVUhyp8t4AslTb+B3O4g1WLlMBmUN1HYwc9S1io68uObIzwvIOg0IF1WiR4jj+F6m4Pqw+Zd+Bvs8HEJ0br7bBtr39YNX1ya0Us="},{"id":"0545bd33-f65c-4e1f-b2cb-04bea825925d","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"开发指南","description":"development-guide","prompt":"创建开发指南,提供代码规范、开发流程和测试策略。包含项目结构说明、命名约定和编码标准。文档化开发环境配置、调试技巧和性能优化方法。提供Git工作流程、分支策略和代码审查指南。包含单元测试、集成测试和端到端测试的实施方法。说明依赖管理、版本控制和发布流程。提供常见开发问题的解决方案和最佳实践。包含团队协作规范和文档维护指南。","order":8,"progress_status":"completed","dependent_files":"frontend/vite.config.js,backend/src/config/env.js,backend/src/config/loadEnv.js,.gitignore,frontend/package.json,backend/package.json","gmt_create":"2026-06-30T14:04:20.639515+08:00","gmt_modified":"2026-06-30T14:13:05.375027+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9C/ucQxiwh0okVA48AmODs5RKNS8ZgNngqmnHSFcG/1UaJxx+3dUn+EkMTpYUsOg40oH68Nx1IqebKqiC8fCVx8Z5dT3AgUInNoQcVloeb4yQhs1Oufr9wTZo7fZfd2EizXXbLOV05/YLO/Bja3sQV4rbFZH21TOR2bzMC4+Bvh1azFozPC/ma5QkwfbGmawutVaO402XGO+5xnrsGCsVAQr2M8O409R1wh77/5lzca6ZD0OFo1iagqoMSEXyVx6XsW38aoy3TPa93+p8MSYGEXZKUGuo0U8H/GetcXMJ21wi60fPOQhiVg9ePRXxG8wnT9Q0YxxUIb7JWiGkDgtE0n5qcCo7xcA3FzYOZ2CH4OR+2LjRjmTWUU2SbXJ9jXKWnXP8HREN4oERnOXLRcGVAA7zHN3BIkCz7pscIxGQ+sNh+xZdhrgSBP4BqoZEnRQQlyDrqA29kJpJXZs60se4zqy3SRe8xpB8DiB6puJqsECj+osTyJFPENV14Gb/ixpNzHho1UY3Ohpt+Eabp6RG572PwSRkBaegUf5Y5MXeueFRfD4XghD+p9yS8u6aohyV378+hS80kvZnTWd2eiveVL7Q90v5DiOSQLApGbIV2G44IxEw2uIKsuWvffHT8JHO2RxJkitMMfOC+OSLMwph76bCPS+0hYM8kFgEl4xFyTGggt/JE3njsBxW49xeYZfnUYUDndPRxIWDFVT2WqUKup7aZQ4gUFcycaEH97G5lD1JgGQVGN5jGL2XjksL8EL2WrkZkj7Mkwlo03MFQYETI/wPTEqUdcsgFdXOCGMw34z5Pz2VlnNXn3faJcb/EmO700V9FtLl4sedrhQFfq8oyBIwwycQNtQGBdx2pfCJhjeLMKSeQ+BYoUxddVIpPoBdo0d4G4rrlK2BREXPCuyeH4dmB3rCPyTcWheDZtVLdid/MJwCujHV9jJVj3W5UTW5+pwkcBenKNyb/A0yYUqFDaylhA4Ff6dgxMUqeZiNfxGXORFKuNgQwd/4941XXqA/U0pX1uyPm8Z+ydGBmtScMw2cLtmWLFtUYA04OsqUWVaaX63Dvyr0OuohK8gSIX2m89KrHPV5hcCaH32WycKCi3zgSG+RfFLX9+I+LG0YQ2dcyRU5VVK4h1mkv4MRIqphyEjifJBweXHgmS8nP8kbRuPQfeM++y+1VPvUYwiTlHK48YW/H0Q/FLkXfQA6l3gVZA2jHJ5zPTJcbfY+3fRJr2g="}],"wiki_items":[{"catalog_id":"de69fb0c-330e-4831-813d-94fb958688da","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"817d80e4-81ba-4f8a-b0e2-85e99d8a73ef","gmt_create":"2026-06-30T14:07:37.609842+08:00","gmt_modified":"2026-06-30T14:07:37.615532+08:00"},{"catalog_id":"70ba09ee-60a3-41f9-bdda-3cb904cb26de","title":"系统架构","description":"architecture-design","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"2b5fd78d-2407-4ccc-8807-9bb05c0a687e","gmt_create":"2026-06-30T14:08:09.125669+08:00","gmt_modified":"2026-06-30T14:08:09.130252+08:00"},{"catalog_id":"dd61923f-65f8-4e98-85f4-0e0a0a649a27","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"190d3cad-a28e-4cf2-a8c7-64d953415cca","gmt_create":"2026-06-30T14:09:11.170718+08:00","gmt_modified":"2026-06-30T14:09:11.17433+08:00"},{"catalog_id":"7e9246a0-207e-47e8-bc26-b9d36ae6f2f8","title":"后端API文档","description":"backend-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"1f4b6f57-25c5-444e-a943-d162d896dc21","gmt_create":"2026-06-30T14:10:41.226897+08:00","gmt_modified":"2026-06-30T14:10:41.230722+08:00"},{"catalog_id":"0bb34dac-0e1a-4cce-b41d-0194eda77f79","title":"数据库设计","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"4553d9a4-e0e6-4bc3-b285-ecc6df9dc822","gmt_create":"2026-06-30T14:10:45.945099+08:00","gmt_modified":"2026-06-30T14:10:45.95039+08:00"},{"catalog_id":"aa2583bf-2c6e-4792-b794-1563db547d08","title":"前端组件","description":"frontend-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ed153077-3827-4586-8838-812707189c14","gmt_create":"2026-06-30T14:11:17.426266+08:00","gmt_modified":"2026-06-30T14:11:17.430273+08:00"},{"catalog_id":"a3ddc4e4-116f-4781-ba9f-17c85c85396e","title":"部署与运维","description":"deployment-operations","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"c45b2f5f-49f8-4c8d-b489-44b4c6800e99","gmt_create":"2026-06-30T14:12:37.804986+08:00","gmt_modified":"2026-06-30T14:12:37.808728+08:00"},{"catalog_id":"08dd4c40-3fd3-476c-bcca-4c8687a8d863","title":"核心功能模块","description":"core-features","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"d4cb0c3c-97e9-449f-8918-f1c01e7e3561","gmt_create":"2026-06-30T14:13:04.754131+08:00","gmt_modified":"2026-06-30T14:13:04.758965+08:00"},{"catalog_id":"0545bd33-f65c-4e1f-b2cb-04bea825925d","title":"开发指南","description":"development-guide","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"d7d400d2-aa83-47a2-b61a-55a62369b426","gmt_create":"2026-06-30T14:13:05.373036+08:00","gmt_modified":"2026-06-30T14:13:05.375096+08:00"},{"catalog_id":"bcc45977-c058-4033-b0b1-9fd4cd7f4443","title":"前端架构","description":"frontend-architecture","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"6b28e060-0be3-411e-8a94-3777d165d10e","gmt_create":"2026-06-30T14:14:52.873609+08:00","gmt_modified":"2026-06-30T14:14:52.878043+08:00"},{"catalog_id":"0f657e8b-77cb-4604-81cd-d3e921d28e21","title":"布局组件","description":"layout-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b6857b45-a960-4168-92dd-1edcf6567e47","gmt_create":"2026-06-30T14:15:24.293181+08:00","gmt_modified":"2026-06-30T14:15:24.2965+08:00"},{"catalog_id":"d34906db-4455-4481-9512-b29115655378","title":"认证系统API","description":"auth-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"7f894188-cf72-40a2-af95-f13ef3dd1f6e","gmt_create":"2026-06-30T14:15:47.975759+08:00","gmt_modified":"2026-06-30T14:15:47.98224+08:00"},{"catalog_id":"7f36202b-af69-4fc0-b62b-a57e415deb69","title":"部署指南","description":"deployment-guide","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"5ab55e3b-04bc-4e92-93f7-52bec7ad8dde","gmt_create":"2026-06-30T14:16:33.823992+08:00","gmt_modified":"2026-06-30T14:16:33.828188+08:00"},{"catalog_id":"1af0f0e8-0c53-41d7-a894-47d9cc19d4f9","title":"用户认证系统","description":"authentication-system","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"772c69b5-886e-48f6-bd11-faf8ca2155e8","gmt_create":"2026-06-30T14:17:38.562007+08:00","gmt_modified":"2026-06-30T14:17:38.563255+08:00"},{"catalog_id":"dbe5d77f-6f4d-476c-88cf-797b80a11a11","title":"实体关系设计","description":"entity-relationships","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"0efcac71-9db4-49c9-a660-690dcb97cd54","gmt_create":"2026-06-30T14:18:01.58459+08:00","gmt_modified":"2026-06-30T14:18:01.58743+08:00"},{"catalog_id":"5a3639b1-98bc-4bc7-a346-91ed56edd2af","title":"后端架构","description":"backend-architecture","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"941d72b1-8daa-4c53-bfeb-9a0b2aa0f43c","gmt_create":"2026-06-30T14:19:05.640846+08:00","gmt_modified":"2026-06-30T14:19:05.643035+08:00"},{"catalog_id":"779d6806-96dc-4c97-8cfb-15a3d7855bd1","title":"品牌管理API","description":"brands-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b66da3f2-6889-45dc-a824-2591d2f5f0f3","gmt_create":"2026-06-30T14:19:07.598117+08:00","gmt_modified":"2026-06-30T14:19:07.600914+08:00"},{"catalog_id":"eb78ed75-b786-4b43-ba43-58a5ea8a23a6","title":"业务组件","description":"business-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"2971fa4f-335a-4294-9668-0967b9047d66","gmt_create":"2026-06-30T14:19:27.851755+08:00","gmt_modified":"2026-06-30T14:19:27.855695+08:00"},{"catalog_id":"f96081f7-f508-41e2-bd45-a5b36a1ea114","title":"环境配置","description":"environment-config","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"62bcda0f-7c78-4109-9649-58bbf9fd68ae","gmt_create":"2026-06-30T14:21:11.821343+08:00","gmt_modified":"2026-06-30T14:21:11.825384+08:00"},{"catalog_id":"1e3d40bc-a833-4f35-891c-9dd96f09a1a3","title":"品牌管理","description":"brand-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"babe3ec0-01cb-43c3-93db-7e59cdccce68","gmt_create":"2026-06-30T14:21:25.618321+08:00","gmt_modified":"2026-06-30T14:21:25.623289+08:00"},{"catalog_id":"92f94141-482e-499c-bbc3-6101e70206ff","title":"品牌模型","description":"brand-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ef11f60f-47aa-41bf-8884-6d51bc9ae8ef","gmt_create":"2026-06-30T14:21:29.093976+08:00","gmt_modified":"2026-06-30T14:21:29.097382+08:00"},{"catalog_id":"94ec54d4-0aa0-4e58-8e63-5ad6ddb6edbe","title":"型号管理API","description":"models-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"799e02d2-8358-41a1-9f8e-114f8ac00eae","gmt_create":"2026-06-30T14:23:05.595716+08:00","gmt_modified":"2026-07-01T17:22:10.388812+08:00"},{"catalog_id":"b47d7f83-5401-4a63-ade2-f087a2f61987","title":"数据流设计","description":"data-flow-design","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"c6f2cb24-ff10-4ae7-87c2-b23b9bbee033","gmt_create":"2026-06-30T14:23:25.129255+08:00","gmt_modified":"2026-06-30T14:23:25.133578+08:00"},{"catalog_id":"f00798b7-c49f-4260-b9c1-d1ee413b030a","title":"页面组件","description":"page-components","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"f0978b42-6f98-470e-922f-22dec2fac24d","gmt_create":"2026-06-30T14:24:27.13852+08:00","gmt_modified":"2026-06-30T14:24:27.143035+08:00"},{"catalog_id":"72a24a80-f221-49da-88a8-83c0f49f4e9d","title":"型号模型","description":"model-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"edd1d813-70d4-49de-9f9e-e3ebf7a68678","gmt_create":"2026-06-30T14:24:50.785915+08:00","gmt_modified":"2026-06-30T14:24:50.78921+08:00"},{"catalog_id":"00a9d595-dc79-4ca4-8264-1c3f4a200a28","title":"监控运维","description":"monitoring-operations","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"86f882d7-9e64-4c38-85e7-4782fd55fed2","gmt_create":"2026-06-30T14:25:08.609638+08:00","gmt_modified":"2026-06-30T14:25:08.61406+08:00"},{"catalog_id":"93c96675-6099-4ed5-8f40-6a47b3050712","title":"型号管理","description":"model-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"8d4422fd-bd93-431d-a97c-70b75f370f82","gmt_create":"2026-06-30T14:26:44.041445+08:00","gmt_modified":"2026-07-01T17:22:44.422114+08:00"},{"catalog_id":"41e8823b-fa7a-4a80-809d-cf21088bdba2","title":"OTA固件API","description":"ota-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"be7e1733-8c9e-4849-99b0-bab40fdf271e","gmt_create":"2026-06-30T14:26:52.74545+08:00","gmt_modified":"2026-06-30T14:26:52.749367+08:00"},{"catalog_id":"6cd96b12-bb94-4748-94a8-9ef9bf21aee0","title":"集成模式","description":"integration-patterns","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"4619dc3e-419f-435b-ba7c-e600e188743a","gmt_create":"2026-06-30T14:27:35.804293+08:00","gmt_modified":"2026-06-30T14:27:35.809224+08:00"},{"catalog_id":"02f97459-8352-4fff-9216-8fcabb128d77","title":"故障排除","description":"troubleshooting-faq","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ff04bd0e-99c4-481c-ac8c-3c1a6cae1fb5","gmt_create":"2026-06-30T14:28:16.984682+08:00","gmt_modified":"2026-06-30T14:28:16.989286+08:00"},{"catalog_id":"92ff3472-40b9-4adf-82b2-faf5a4d4b158","title":"OTA固件模型","description":"ota-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b2376dbd-002b-4469-8e6e-71748e46e7c2","gmt_create":"2026-06-30T14:28:22.047078+08:00","gmt_modified":"2026-06-30T14:28:22.050489+08:00"},{"catalog_id":"6dc54635-13f8-4ae3-b3a7-54c65dea2997","title":"OTA固件管理","description":"ota-firmware-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"da7627b0-17b7-42c7-a029-e357bc889416","gmt_create":"2026-06-30T14:29:32.814324+08:00","gmt_modified":"2026-06-30T18:39:56.546951+08:00"},{"catalog_id":"b4054b83-f0cb-4b7e-9b3d-effc904a5686","title":"用户管理API","description":"users-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"8f464fc9-6537-45fa-a0dd-eacdf742b5a1","gmt_create":"2026-06-30T14:30:22.103174+08:00","gmt_modified":"2026-06-30T14:30:22.110852+08:00"},{"catalog_id":"7a728623-5bd2-48eb-80d9-0f253bc74123","title":"用户模型","description":"user-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"b5718a44-f452-496d-83c3-4e89b844c709","gmt_create":"2026-06-30T14:30:58.462691+08:00","gmt_modified":"2026-06-30T14:30:58.467737+08:00"},{"catalog_id":"4d08f4ca-84f9-4f9c-8d9a-0983f78a7005","title":"用户权限管理","description":"user-permission-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"100cbee2-f7a5-4cc9-83a3-900a4aacac7e","gmt_create":"2026-06-30T14:30:59.491588+08:00","gmt_modified":"2026-06-30T14:30:59.497862+08:00"},{"catalog_id":"a6304333-66ad-4b0c-834f-a6a514069e3f","title":"分享码日志API","description":"share-code-logs-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"77bc73e0-8709-4209-96e0-5522f9356b06","gmt_create":"2026-06-30T14:32:03.999307+08:00","gmt_modified":"2026-06-30T14:32:04.003175+08:00"},{"catalog_id":"e1d1f354-edc2-4c91-8d91-63d256dced21","title":"分享码日志模型","description":"share-code-log-model","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"539729a8-aa4b-40c6-bf3b-ec9f467f7717","gmt_create":"2026-06-30T14:32:46.405942+08:00","gmt_modified":"2026-06-30T14:32:46.410705+08:00"},{"catalog_id":"c6207e0a-6059-40f8-a27d-367356363cbf","title":"分享码日志管理","description":"share-code-log-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"cf1f3ceb-e3b1-4d5c-8353-f0ea4345414c","gmt_create":"2026-06-30T14:33:14.023031+08:00","gmt_modified":"2026-06-30T14:33:14.02952+08:00"},{"catalog_id":"8f0760f5-ef8b-43ef-8fd0-7c6d1f693193","title":"侧边栏Logo组件","description":"sidebar-logo-component","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"0e003133-7d1a-4708-8599-fc71707070d6","gmt_create":"2026-06-30T14:34:09.992825+08:00","gmt_modified":"2026-06-30T14:34:09.99631+08:00"},{"catalog_id":"7272429b-c7fb-4bd8-9bd1-0093025d68b4","title":"仪表板API","description":"dashboard-api","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"799ec9fc-088e-456c-8f93-72516adac3ac","gmt_create":"2026-06-30T14:34:26.68183+08:00","gmt_modified":"2026-06-30T14:34:26.686097+08:00"},{"catalog_id":"105cfe1d-aeeb-44c1-ac3b-6550f2c7a307","title":"首页仪表板","description":"home-page","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"ad988472-7d0b-4076-86c8-f14661c5923d","gmt_create":"2026-06-30T14:35:15.427082+08:00","gmt_modified":"2026-06-30T14:35:15.43438+08:00"},{"catalog_id":"727c25ac-db22-4b34-9486-6fd6946f64f3","title":"标签页视图组件","description":"tabs-view-component","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"4b6d6abc-bfd2-48a5-9c5e-de89f278f887","gmt_create":"2026-06-30T14:35:27.880644+08:00","gmt_modified":"2026-06-30T14:35:27.886677+08:00"},{"catalog_id":"c8151791-2f8d-4e1e-8139-b0cf921ef002","title":"登录页面","description":"login-page","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"7eee30c6-7725-456b-8b43-35b5e4df7e99","gmt_create":"2026-06-30T14:36:20.14068+08:00","gmt_modified":"2026-06-30T14:36:20.14737+08:00"},{"catalog_id":"32dbace3-24e6-4a2d-9f87-83f2ec825b71","title":"密码修改对话框","description":"change-password-dialog","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"5b84c784-85d8-46e0-8972-e7816f6bd687","gmt_create":"2026-06-30T14:36:50.047707+08:00","gmt_modified":"2026-06-30T14:36:50.062351+08:00"},{"catalog_id":"af7f747a-9be6-41c3-b091-4ee5901d8cc7","title":"品牌管理页面","description":"brand-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"791c01a2-dea1-407b-948d-3e2da8cbebed","gmt_create":"2026-06-30T14:37:33.758372+08:00","gmt_modified":"2026-06-30T14:37:33.76504+08:00"},{"catalog_id":"748c8db9-9197-4c3b-ae1d-a6e51d058342","title":"型号管理页面","description":"model-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"9f2c6c14-12ae-48cc-a1ee-fe703cd12a1a","gmt_create":"2026-06-30T14:38:54.071337+08:00","gmt_modified":"2026-07-01T17:22:40.416555+08:00"},{"catalog_id":"ff078afb-bb04-4600-b51d-5af48a6a6f06","title":"系统用户管理页面","description":"system-users","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"6003d293-f2aa-4c49-817a-c7fa652890ed","gmt_create":"2026-06-30T14:39:03.424765+08:00","gmt_modified":"2026-06-30T14:39:03.42914+08:00"},{"catalog_id":"f23cd2ae-fcf4-445f-b8e9-b3382f277ae0","title":"OTA固件管理页面","description":"ota-management","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"7d8f2ef6-290d-4952-b59c-a1d95af0d438","gmt_create":"2026-06-30T14:40:01.702004+08:00","gmt_modified":"2026-06-30T18:39:29.639208+08:00"},{"catalog_id":"830433a7-7370-479c-aa05-c21ff47b059e","title":"分享码日志页面","description":"share-code-log","extend":"{}","progress_status":"completed","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","reference_count":0,"id":"73336201-a22f-4329-afc6-40fb5f00f4f1","gmt_create":"2026-06-30T14:40:47.216934+08:00","gmt_modified":"2026-06-30T14:40:47.220483+08:00"}],"wiki_overview":{"content":"\u003cblog\u003e\n\n# 耳机品牌与型号管理平台项目概述\n\n## 1. 项目介绍\n\n### 项目目的\n这是一个基于Vue 3 + Express的耳机品牌与型号管理平台,旨在为音频设备制造商和经销商提供完整的品牌、型号、OTA固件更新以及用户权限管理功能。\n\n### 核心目标\n- 提供统一的品牌和型号数据管理界面\n- 支持OTA固件升级管理和版本控制\n- 实现多用户权限体系和访问控制\n- 提供分享码日志追踪功能\n- 构建现代化的前后端分离架构\n\n### 目标用户\n- 音频设备厂商管理员\n- 技术支持人员\n- 系统维护人员\n\n## 2. 技术架构\n\n### 整体架构设计\n\n```mermaid\ngraph TB\n subgraph \"前端层 (Frontend)\"\n FE_Vue[Vue 3 应用]\n FE_Router[Vue Router]\n FE_API[API 请求封装]\n FE_Components[组件库]\n end\n \n subgraph \"后端层 (Backend)\"\n BE_Express[Express 框架]\n BE_Routes[路由模块]\n BE_Middleware[中间件]\n BE_Services[业务服务]\n end\n \n subgraph \"数据层 (Data Layer)\"\n DB_MySQL[MySQL 数据库]\n DB_Sequelize[Sequelize ORM]\n Cache_Redis[Redis 缓存]\n end\n \n subgraph \"基础设施\"\n Docker[Docker 容器化]\n Nginx[Nginx 反向代理]\n Env[环境配置]\n end\n \n FE_Vue --\u003e FE_Router\n FE_Vue --\u003e FE_API\n FE_API --\u003e BE_Express\n BE_Express --\u003e BE_Routes\n BE_Express --\u003e BE_Middleware\n BE_Routes --\u003e BE_Services\n BE_Services --\u003e DB_Sequelize\n DB_Sequelize --\u003e DB_MySQL\n BE_Services --\u003e Cache_Redis\n BE_Express --\u003e Nginx\n Nginx --\u003e FE_Vue\n Docker --\u003e BE_Express\n Docker --\u003e FE_Vue\n```\n\n### 核心设计模式\n- **MVC架构**: 后端采用经典的模型-视图-控制器模式\n- **分层架构**: 清晰的业务逻辑分层,便于维护和扩展\n- **中间件模式**: 统一的请求处理流程\n- **依赖注入**: 通过模块化设计实现松耦合\n\n## 3. 关键实现\n\n### 主要入口点\n\n#### 后端入口\n- **入口文件**: `backend/src/app.js` - 应用程序主入口,配置中间件、路由和数据库连接\n- **配置文件**: `backend/src/config/database.js` - 数据库连接配置,支持环境变量\n- **路由聚合**: `backend/src/routes/index.js` - 所有路由模块的统一导入和导出\n\n#### 前端入口 \n- **应用入口**: `frontend/src/main.js` - Vue应用初始化,配置Element Plus和路由\n- **应用根组件**: `frontend/src/App.vue` - 根组件模板\n- **路由配置**: `frontend/src/router/index.js` - 路由定义和导航守卫\n\n### 核心模块\n\n#### 数据模型 (Models)\n```mermaid\nerDiagram\n BRAND ||--o{ MODEL : \"包含\"\n MODEL ||--o{ OTA : \"支持\"\n BRAND ||--|| DASHBOARD_USER : \"管理\"\n \n BRAND {\n int id PK\n string name\n }\n \n MODEL {\n int id PK\n int brand_id FK\n string name\n string description\n }\n \n OTA {\n int id PK\n int model_id FK\n string version\n string file_path\n datetime create_time\n }\n \n DASHBOARD_USER {\n int id PK\n string username\n string password_hash\n boolean is_super_admin\n int status\n }\n```\n\n#### API 路由结构\n```mermaid\ngraph TD\n Auth[认证路由] --\u003e Login[用户登录]\n Auth --\u003e Profile[用户信息]\n Auth --\u003e Password[修改密码]\n \n Brands[品牌路由] --\u003e BrandList[品牌列表]\n Brands --\u003e BrandCRUD[品牌增删改查]\n \n Models[型号路由] --\u003e ModelList[型号列表]\n Models --\u003e ModelCRUD[型号增删改查]\n \n OTA[OTA路由] --\u003e OTAList[OTA列表]\n OTA --\u003e OTACRUD[OTA增删改查]\n \n Users[用户路由] --\u003e UserList[用户列表]\n Users --\u003e UserCRUD[用户增删改查]\n \n Dashboard[仪表板路由] --\u003e Stats[统计信息]\n Dashboard --\u003e Reports[报表生成]\n```\n\n### 配置管理\n\n#### 环境配置\n- **Docker Compose**: `docker-compose.yml` - 容器化部署配置,包含前后端服务和网络设置\n- **开发配置**: `frontend/vite.config.js` - Vite构建工具配置,支持代理和别名\n- **包管理**: 使用pnpm作为包管理器,支持工作空间\n\n#### 数据库配置\n- **ORM配置**: `backend/src/config/database.js` - Sequelize ORM配置\n- **Redis缓存**: `backend/src/config/redis.js` - Redis连接配置\n- **日志系统**: `backend/src/config/logger.js` - Winston日志配置\n\n### 外部依赖\n\n#### 后端依赖\n```mermaid\ngraph LR\n Express[Express 4.21] --\u003e Middleware[中间件生态]\n Sequelize[Sequelize 6.37] --\u003e MySQL[MySQL2 3.11]\n JWT[jsonwebtoken 9.0] --\u003e Auth[认证系统]\n Axios[Axios 1.7] --\u003e HTTP[HTTP客户端]\n Zod[3.23] --\u003e Validation[数据验证]\n AWS[aws-sdk 3.650] --\u003e S3[对象存储]\n Redis[ioredis 5.6] --\u003e Cache[缓存系统]\n```\n\n#### 前端依赖\n```mermaid\ngraph LR\n Vue[Vu3 3.3.4] --\u003e Composition[组合式API]\n Router[Vue Router 4.2.4] --\u003e Navigation[路由导航]\n ElementPlus[Element Plus 2.3.14] --\u003e UI[UI组件库]\n Axios[Axios 1.5.0] --\u003e HTTP[HTTP通信]\n Icons[图标库] --\u003e Components[图标组件]\n```\n\n### 集成点\n\n#### API 接口设计\n```mermaid\nsequenceDiagram\n participant Client as 前端客户端\n participant Auth as 认证接口\n participant User as 用户接口\n participant Data as 数据接口\n \n Client-\u003e\u003e+Auth: POST /api/auth/login\n Auth--\u003e\u003e-Client: 返回JWT令牌\n \n Client-\u003e\u003e+User: GET /api/auth/me\n User--\u003e\u003e-Client: 返回用户信息\n \n Client-\u003e\u003e+Data: GET /api/brands\n Data--\u003e\u003e-Client: 返回品牌数据\n \n Client-\u003e\u003e+Data: POST /api/models\n Data--\u003e\u003e-Client: 返回创建结果\n```\n\n## 4. 核心功能\n\n### 功能概览\n\n#### 用户认证系统\n- **登录认证**: 基于JWT的无状态认证\n- **权限控制**: 支持超级管理员和普通用户的权限区分\n- **密码安全**: 密码哈希存储和验证\n\n#### 品牌管理系统\n- **品牌维护**: 品牌的增删改查操作\n- **品牌关联**: 与型号的多对一关系管理\n- **数据验证**: 基于Zod的输入验证\n\n#### 型号管理功能\n- **型号列表**: 支持分页和搜索\n- **型号详情**: 包含详细的技术规格\n- **OTA关联**: 与固件更新的关联管理\n\n#### OTA固件管理\n- **版本控制**: 固件版本管理和发布\n- **文件上传**: 支持固件文件的上传和存储\n- **更新推送**: 向设备推送固件更新\n\n### 功能架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 未登录\n 未登录 --\u003e 登录中: 用户输入凭据\n 登录中 --\u003e 已登录: 认证成功\n 登录中 --\u003e 未登录: 认证失败\n \n 已登录 --\u003e 品牌管理: 管理员权限\n 已登录 --\u003e 型号管理: 普通用户权限\n 已登录 --\u003e OTA管理: 技术支持权限\n \n 品牌管理 --\u003e 数据库操作: CRUD操作\n 型号管理 --\u003e 数据库操作: CRUD操作\n OTA管理 --\u003e 文件上传: 固件上传\n \n 已登录 --\u003e 修改密码: 用户操作\n 修改密码 --\u003e 已登录: 更新成功\n \n 已登录 --\u003e 退出登录: 用户操作\n 退出登录 --\u003e 未登录: 清除会话\n```\n\n### 实现亮点\n\n#### 响应式设计\n- **组件化开发**: 基于Vue 3 Composition API的组件化架构\n- **状态管理**: 结合Vue Router实现的单页应用体验\n- **主题系统**: 支持暗色主题切换\n\n#### 开发体验\n- **热重载**: Vite提供的快速开发服务器\n- **TypeScript支持**: 良好的类型安全保障\n- **代码分割**: 按需加载优化性能\n\n#### 生产部署\n- **容器化**: Docker支持一键部署\n- **反向代理**: Nginx配置优化静态资源服务\n- **环境隔离**: 支持开发、测试、生产多环境配置\n\n## 5. 总结与建议\n\n### 项目优势\n1. **架构清晰**: 前后端分离,职责明确\n2. **技术栈现代**: Vue 3 + Express + MySQL的成熟技术组合\n3. **可扩展性强**: 模块化设计便于功能扩展\n4. **部署友好**: Docker化部署简化运维\n\n### 改进建议\n1. **增加单元测试**: 补充前端和后端的测试覆盖率\n2. **完善文档**: 添加详细的API文档和开发指南\n3. **监控告警**: 集成应用性能监控和错误追踪\n4. **安全加固**: 增强CSRF防护和API限流机制\n\n### 下一步计划\n1. 实现完整的用户权限管理\n2. 添加数据导入导出功能\n3. 优化移动端适配\n4. 集成自动化测试和CI/CD流水线\n\n---\n\n**Sources:**\n- [README.md](README.md)\n- [backend/package.json](backend/package.json)\n- [frontend/package.json](frontend/package.json)\n- [backend/src/app.js](backend/src/app.js)\n- [backend/src/config/database.js](backend/src/config/database.js)\n- [backend/src/models/index.js](backend/src/models/index.js)\n- [backend/src/routes/index.js](backend/src/routes/index.js)\n- [frontend/src/main.js](frontend/src/main.js)\n- [frontend/src/App.vue](frontend/src/App.vue)\n- [docker-compose.yml](docker-compose.yml)\n- [frontend/vite.config.js](frontend/vite.config.js)\n- [backend/src/models/Brand.js](backend/src/models/Brand.js)\n- [backend/src/routes/auth.js](backend/src/routes/auth.js)\n- [frontend/src/router/index.js](frontend/src/router/index.js)\n- [frontend/src/api/auth.js](frontend/src/api/auth.js)\n\n\u003c/blog\u003e","gmt_create":"2026-06-30T14:01:22.420851+08:00","gmt_modified":"2026-06-30T14:01:22.420851+08:00","id":"f0295b72-1b14-4146-868c-8a0c307045c3","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-06-30T13:59:47.635503+08:00","gmt_modified":"2026-06-30T13:59:47.635503+08:00","id":"60f4194d-74f4-49d9-ae65-220e9f5829cc","repo_id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414"},"wiki_repo":{"id":"8836b2d0-e4ff-4f3c-b5c9-e5b0659fd414","name":"dashboard","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── .pnpm-store/v11/\\n│ ├── files/\\n│ │ ├── 00/\\n│ │ ├── 01/\\n│ │ ├── 02/\\n│ │ ├── 03/\\n│ │ ├── 04/\\n│ │ ├── 05/\\n│ │ ├── 06/\\n│ │ ├── 07/\\n│ │ ├── 08/\\n│ │ ├── 09/\\n│ │ ├── 0a/\\n│ │ ├── 0b/\\n│ │ ├── 0c/\\n│ │ ├── 0d/\\n│ │ ├── 0e/\\n│ │ ├── 0f/\\n│ │ ├── 10/\\n│ │ ├── 11/\\n│ │ ├── 12/\\n│ │ ├── 13/\\n│ │ ├── 14/\\n│ │ ├── 15/\\n│ │ ├── 16/\\n│ │ ├── 17/\\n│ │ ├── 18/\\n│ │ ├── 19/\\n│ │ ├── 1a/\\n│ │ ├── 1b/\\n│ │ ├── 1c/\\n│ │ ├── 1d/\\n│ │ ├── 1e/\\n│ │ ├── 1f/\\n│ │ ├── 20/\\n│ │ ├── 21/\\n│ │ ├── 22/\\n│ │ ├── 23/\\n│ │ ├── 24/\\n│ │ ├── 25/\\n│ │ ├── 26/\\n│ │ ├── 27/\\n│ │ ├── 28/\\n│ │ ├── 29/\\n│ │ ├── 2a/\\n│ │ ├── 2b/\\n│ │ ├── 2c/\\n│ │ ├── 2d/\\n│ │ ├── 2e/\\n│ │ ├── 2f/\\n│ │ ├── 30/\\n│ │ ├── 31/\\n│ │ ├── 32/\\n│ │ ├── 33/\\n│ │ ├── 34/\\n│ │ ├── 35/\\n│ │ ├── 36/\\n│ │ ├── 37/\\n│ │ ├── 38/\\n│ │ ├── 39/\\n│ │ ├── 3a/\\n│ │ ├── 3b/\\n│ │ ├── 3c/\\n│ │ ├── 3d/\\n│ │ ├── 3e/\\n│ │ ├── 3f/\\n│ │ ├── 40/\\n│ │ ├── 41/\\n│ │ ├── 42/\\n│ │ ├── 43/\\n│ │ ├── 44/\\n│ │ ├── 45/\\n│ │ ├── 46/\\n│ │ ├── 47/\\n│ │ ├── 48/\\n│ │ ├── 49/\\n│ │ ├── 4a/\\n│ │ ├── 4b/\\n│ │ ├── 4c/\\n│ │ ├── 4d/\\n│ │ ├── 4e/\\n│ │ ├── 4f/\\n│ │ ├── 50/\\n│ │ ├── 51/\\n│ │ ├── 52/\\n│ │ ├── 53/\\n│ │ ├── 54/\\n│ │ ├── 55/\\n│ │ ├── 56/\\n│ │ ├── 57/\\n│ │ ├── 58/\\n│ │ ├── 59/\\n│ │ ├── 5a/\\n│ │ ├── 5b/\\n│ │ ├── 5c/\\n│ │ ├── 5d/\\n│ │ ├── 5e/\\n│ │ ├── 5f/\\n│ │ ├── 60/\\n│ │ ├── 61/\\n│ │ ├── 62/\\n│ │ ├── 63/\\n│ │ ├── 64/\\n│ │ ├── 65/\\n│ │ ├── 66/\\n│ │ ├── 67/\\n│ │ ├── 68/\\n│ │ ├── 69/\\n│ │ ├── 6a/\\n│ │ ├── 6b/\\n│ │ ├── 6c/\\n│ │ ├── 6d/\\n│ │ ├── 6e/\\n│ │ ├── 6f/\\n│ │ ├── 70/\\n│ │ ├── 71/\\n│ │ ├── 72/\\n│ │ ├── 73/\\n│ │ ├── 74/\\n│ │ ├── 75/\\n│ │ ├── 76/\\n│ │ ├── 77/\\n│ │ ├── 78/\\n│ │ ├── 79/\\n│ │ ├── 7a/\\n│ │ ├── 7b/\\n│ │ ├── 7c/\\n│ │ ├── 7d/\\n│ │ ├── 7e/\\n│ │ ├── 7f/\\n│ │ ├── 80/\\n│ │ ├── 81/\\n│ │ ├── 82/\\n│ │ ├── 83/\\n│ │ ├── 84/\\n│ │ ├── 85/\\n│ │ ├── 86/\\n│ │ ├── 87/\\n│ │ ├── 88/\\n│ │ ├── 89/\\n│ │ ├── 8a/\\n│ │ ├── 8b/\\n│ │ ├── 8c/\\n│ │ ├── 8d/\\n│ │ ├── 8e/\\n│ │ ├── 8f/\\n│ │ ├── 90/\\n│ │ ├── 91/\\n│ │ ├── 92/\\n│ │ ├── 93/\\n│ │ ├── 94/\\n│ │ ├── 95/\\n│ │ ├── 96/\\n│ │ ├── 97/\\n│ │ ├── 98/\\n│ │ ├── 99/\\n│ │ ├── 9a/\\n│ │ ├── 9b/\\n│ │ ├── 9c/\\n│ │ ├── 9d/\\n│ │ ├── 9e/\\n│ │ ├── 9f/\\n│ │ ├── a0/\\n│ │ ├── a1/\\n│ │ ├── a2/\\n│ │ ├── a3/\\n│ │ ├── a4/\\n│ │ ├── a5/\\n│ │ ├── a6/\\n│ │ ├── a7/\\n│ │ ├── a8/\\n│ │ ├── a9/\\n│ │ ├── aa/\\n│ │ ├── ab/\\n│ │ ├── ac/\\n│ │ ├── ad/\\n│ │ ├── ae/\\n│ │ ├── af/\\n│ │ ├── b0/\\n│ │ ├── b1/\\n│ │ ├── b2/\\n│ │ ├── b3/\\n│ │ ├── b4/\\n│ │ ├── b5/\\n│ │ ├── b6/\\n│ │ ├── b7/\\n│ │ ├── b8/\\n│ │ ├── b9/\\n│ │ ├── ba/\\n│ │ ├── bb/\\n│ │ ├── bc/\\n│ │ ├── bd/\\n│ │ ├── be/\\n│ │ ├── bf/\\n│ │ ├── c0/\\n│ │ ├── c1/\\n│ │ ├── c2/\\n│ │ ├── c3/\\n│ │ ├── c4/\\n│ │ ├── c5/\\n│ │ ├── c6/\\n│ │ ├── c7/\\n│ │ ├── c8/\\n│ │ ├── c9/\\n│ │ ├── ca/\\n│ │ ├── cb/\\n│ │ ├── cc/\\n│ │ ├── cd/\\n│ │ ├── ce/\\n│ │ ├── cf/\\n│ │ ├── d0/\\n│ │ ├── d1/\\n│ │ ├── d2/\\n│ │ ├── d3/\\n│ │ ├── d4/\\n│ │ ├── d5/\\n│ │ ├── d6/\\n│ │ ├── d7/\\n│ │ ├── d8/\\n│ │ ├── d9/\\n│ │ ├── da/\\n│ │ ├── db/\\n│ │ ├── dc/\\n│ │ ├── dd/\\n│ │ ├── de/\\n│ │ ├── df/\\n│ │ ├── e0/\\n│ │ ├── e1/\\n│ │ ├── e2/\\n│ │ ├── e3/\\n│ │ ├── e4/\\n│ │ ├── e5/\\n│ │ ├── e6/\\n│ │ ├── e7/\\n│ │ ├── e8/\\n│ │ ├── e9/\\n│ │ ├── ea/\\n│ │ ├── eb/\\n│ │ ├── ec/\\n│ │ ├── ed/\\n│ │ ├── ee/\\n│ │ ├── ef/\\n│ │ ├── f0/\\n│ │ ├── f1/\\n│ │ ├── f2/\\n│ │ ├── f3/\\n│ │ ├── f4/\\n│ │ ├── f5/\\n│ │ ├── f6/\\n│ │ ├── f7/\\n│ │ ├── f8/\\n│ │ ├── f9/\\n│ │ ├── fa/\\n│ │ ├── fb/\\n│ │ ├── fc/\\n│ │ ├── fd/\\n│ │ ├── fe/\\n│ │ └── ff/\\n│ └── projects/7abbab685605e7ae627cb6fc4a2315b1/\\n│ └── package.json\\n├── backend/\\n│ ├── src/\\n│ │ ├── config/\\n│ │ │ ├── database.js\\n│ │ │ ├── env.js\\n│ │ │ ├── loadEnv.js\\n│ │ │ ├── logger.js\\n│ │ │ └── redis.js\\n│ │ ├── middleware/\\n│ │ │ ├── auth.js\\n│ │ │ └── bodyLimit.js\\n│ │ ├── models/\\n│ │ │ ├── Brand.js\\n│ │ │ ├── DashboardUser.js\\n│ │ │ ├── Model.js\\n│ │ │ ├── Ota.js\\n│ │ │ ├── ShareCodeLog.js\\n│ │ │ └── index.js\\n│ │ ├── routes/\\n│ │ │ ├── auth.js\\n│ │ │ ├── brands.js\\n│ │ │ ├── dashboard.js\\n│ │ │ ├── index.js\\n│ │ │ ├── models.js\\n│ │ │ ├── ota.js\\n│ │ │ ├── shareCodeLogs.js\\n│ │ │ └── users.js\\n│ │ ├── services/\\n│ │ │ ├── curveClient.js\\n│ │ │ ├── eqCacheStorage.js\\n│ │ │ ├── measurementStorage.js\\n│ │ │ ├── otaStorage.js\\n│ │ │ └── userBootstrap.js\\n│ │ ├── utils/\\n│ │ │ ├── jwt.js\\n│ │ │ ├── password.js\\n│ │ │ └── response.js\\n│ │ ├── validators/\\n│ │ │ ├── brand.js\\n│ │ │ ├── model.js\\n│ │ │ └── ota.js\\n│ │ └── app.js\\n│ ├── .gitignore\\n│ ├── Dockerfile\\n│ ├── README.md\\n│ ├── package.json\\n│ ├── pnpm-lock.yaml\\n│ ├── restart.sh\\n│ ├── start.sh\\n│ └── stop.sh\\n├── frontend/\\n│ ├── public/\\n│ ├── src/\\n│ │ ├── api/\\n│ │ │ ├── auth.js\\n│ │ │ ├── brand.js\\n│ │ │ ├── dashboard.js\\n│ │ │ ├── model.js\\n│ │ │ ├── ota.js\\n│ │ │ ├── shareCodeLog.js\\n│ │ │ └── user.js\\n│ │ ├── components/\\n│ │ │ ├── ChangePasswordDialog.vue\\n│ │ │ ├── SidebarLogo.vue\\n│ │ │ └── TabsView.vue\\n│ │ ├── layout/\\n│ │ │ └── index.vue\\n│ │ ├── router/\\n│ │ │ └── index.js\\n│ │ ├── styles/\\n│ │ │ └── lux-theme.css\\n│ │ ├── utils/\\n│ │ │ ├── auth.js\\n│ │ │ ├── request.js\\n│ │ │ └── tabs.js\\n│ │ ├── views/\\n│ │ │ ├── brand/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── home/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── login/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── model/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── ota/\\n│ │ │ │ └── index.vue\\n│ │ │ ├── share-code/\\n│ │ │ │ └── log.vue\\n│ │ │ └── system/users/\\n│ │ │ └── index.vue\\n│ │ ├── App.vue\\n│ │ └── main.js\\n│ ├── .gitignore\\n│ ├── Dockerfile\\n│ ├── README.md\\n│ ├── build-and-deploy.bat\\n│ ├── index.html\\n│ ├── install.bat\\n│ ├── nginx.conf\\n│ ├── package-lock.json\\n│ ├── package.json\\n│ ├── pnpm-lock.yaml\\n│ ├── pnpm-workspace.yaml\\n│ ├── start.bat\\n│ └── vite.config.js\\n├── scripts/\\n│ └── upload.sh\\n├── .gitignore\\n├── DEPLOY.md\\n├── README.md\\n└── docker-compose.yml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"e2577ff6619512d1dbf8263467060650b0182fcd","last_commit_update":"2026-07-01T17:22:44.998712+08:00","gmt_create":"2026-06-02T14:43:54.575428+08:00","gmt_modified":"2026-07-01T17:22:44.998712+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"main\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.4.0\"}"}} \ No newline at end of file diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..f92dc46 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,589 @@ +--- +version: alpha +name: Claude-design-analysis +description: A warm-canvas editorial interface for Anthropic's Claude product. The system anchors on a tinted cream canvas with serif display headlines, warm coral CTAs, and dark navy product surfaces (code editor mockups, model showcase cards). Brand voltage comes from the cream/coral pairing — deliberately warm and humanist where most AI brands use cool blue + slate. Type voice runs a slab-serif display ("Copernicus" / Tiempos Headline) for h1/h2 and a humanist sans for body. The signature Anthropic black-radial-spike mark anchors the wordmark. + +colors: + primary: "#cc785c" + primary-active: "#a9583e" + primary-disabled: "#e6dfd8" + ink: "#141413" + body: "#3d3d3a" + body-strong: "#252523" + muted: "#6c6a64" + muted-soft: "#8e8b82" + hairline: "#e6dfd8" + hairline-soft: "#ebe6df" + canvas: "#faf9f5" + surface-soft: "#f5f0e8" + surface-card: "#efe9de" + surface-cream-strong: "#e8e0d2" + surface-dark: "#181715" + surface-dark-elevated: "#252320" + surface-dark-soft: "#1f1e1b" + on-primary: "#ffffff" + on-dark: "#faf9f5" + on-dark-soft: "#a09d96" + accent-teal: "#5db8a6" + accent-amber: "#e8a55a" + success: "#5db872" + warning: "#d4a017" + error: "#c64545" + +typography: + display-xl: + fontFamily: "Copernicus, Tiempos Headline, serif" + fontSize: 64px + fontWeight: 400 + lineHeight: 1.05 + letterSpacing: -1.5px + display-lg: + fontFamily: "Copernicus, Tiempos Headline, serif" + fontSize: 48px + fontWeight: 400 + lineHeight: 1.1 + letterSpacing: -1px + display-md: + fontFamily: "Copernicus, Tiempos Headline, serif" + fontSize: 36px + fontWeight: 400 + lineHeight: 1.15 + letterSpacing: -0.5px + display-sm: + fontFamily: "Copernicus, Tiempos Headline, serif" + fontSize: 28px + fontWeight: 400 + lineHeight: 1.2 + letterSpacing: -0.3px + title-lg: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 22px + fontWeight: 500 + lineHeight: 1.3 + letterSpacing: 0 + title-md: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 18px + fontWeight: 500 + lineHeight: 1.4 + letterSpacing: 0 + title-sm: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 16px + fontWeight: 500 + lineHeight: 1.4 + letterSpacing: 0 + body-md: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 16px + fontWeight: 400 + lineHeight: 1.55 + letterSpacing: 0 + body-sm: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 14px + fontWeight: 400 + lineHeight: 1.55 + letterSpacing: 0 + caption: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 13px + fontWeight: 500 + lineHeight: 1.4 + letterSpacing: 0 + caption-uppercase: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 12px + fontWeight: 500 + lineHeight: 1.4 + letterSpacing: 1.5px + code: + fontFamily: "JetBrains Mono, ui-monospace, monospace" + fontSize: 14px + fontWeight: 400 + lineHeight: 1.6 + letterSpacing: 0 + button: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 14px + fontWeight: 500 + lineHeight: 1 + letterSpacing: 0 + nav-link: + fontFamily: "StyreneB, Inter, sans-serif" + fontSize: 14px + fontWeight: 500 + lineHeight: 1.4 + letterSpacing: 0 + +rounded: + xs: 4px + sm: 6px + md: 8px + lg: 12px + xl: 16px + pill: 9999px + full: 9999px + +spacing: + xxs: 4px + xs: 8px + sm: 12px + md: 16px + lg: 24px + xl: 32px + xxl: 48px + section: 96px + +components: + button-primary: + backgroundColor: "{colors.primary}" + textColor: "{colors.on-primary}" + typography: "{typography.button}" + rounded: "{rounded.md}" + padding: 12px 20px + height: 40px + button-primary-active: + backgroundColor: "{colors.primary-active}" + textColor: "{colors.on-primary}" + rounded: "{rounded.md}" + button-primary-disabled: + backgroundColor: "{colors.primary-disabled}" + textColor: "{colors.muted}" + rounded: "{rounded.md}" + button-secondary: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.button}" + rounded: "{rounded.md}" + padding: 12px 20px + height: 40px + button-secondary-on-dark: + backgroundColor: "{colors.surface-dark-elevated}" + textColor: "{colors.on-dark}" + typography: "{typography.button}" + rounded: "{rounded.md}" + padding: 12px 20px + button-text-link: + backgroundColor: transparent + textColor: "{colors.ink}" + typography: "{typography.button}" + button-icon-circular: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + rounded: "{rounded.full}" + size: 36px + text-link: + backgroundColor: transparent + textColor: "{colors.primary}" + typography: "{typography.body-md}" + top-nav: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.nav-link}" + height: 64px + hero-band: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.display-xl}" + padding: 96px + hero-illustration-card: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + rounded: "{rounded.xl}" + feature-card: + backgroundColor: "{colors.surface-card}" + textColor: "{colors.ink}" + typography: "{typography.title-md}" + rounded: "{rounded.lg}" + padding: 32px + product-mockup-card-dark: + backgroundColor: "{colors.surface-dark}" + textColor: "{colors.on-dark}" + typography: "{typography.title-md}" + rounded: "{rounded.lg}" + padding: 32px + code-window-card: + backgroundColor: "{colors.surface-dark}" + textColor: "{colors.on-dark}" + typography: "{typography.code}" + rounded: "{rounded.lg}" + padding: 24px + model-comparison-card: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.title-md}" + rounded: "{rounded.lg}" + padding: 32px + pricing-tier-card: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.title-lg}" + rounded: "{rounded.lg}" + padding: 32px + pricing-tier-card-featured: + backgroundColor: "{colors.surface-dark}" + textColor: "{colors.on-dark}" + typography: "{typography.title-lg}" + rounded: "{rounded.lg}" + padding: 32px + callout-card-coral: + backgroundColor: "{colors.primary}" + textColor: "{colors.on-primary}" + typography: "{typography.title-md}" + rounded: "{rounded.lg}" + padding: 32px + connector-tile: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.title-sm}" + rounded: "{rounded.lg}" + padding: 20px + text-input: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.body-md}" + rounded: "{rounded.md}" + padding: 10px 14px + height: 40px + text-input-focused: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + rounded: "{rounded.md}" + cookie-consent-card: + backgroundColor: "{colors.surface-dark}" + textColor: "{colors.on-dark}" + typography: "{typography.body-sm}" + rounded: "{rounded.lg}" + padding: 24px + category-tab: + backgroundColor: transparent + textColor: "{colors.muted}" + typography: "{typography.nav-link}" + padding: 8px 14px + rounded: "{rounded.md}" + category-tab-active: + backgroundColor: "{colors.surface-card}" + textColor: "{colors.ink}" + typography: "{typography.nav-link}" + rounded: "{rounded.md}" + badge-pill: + backgroundColor: "{colors.surface-card}" + textColor: "{colors.ink}" + typography: "{typography.caption}" + rounded: "{rounded.pill}" + padding: 4px 12px + badge-coral: + backgroundColor: "{colors.primary}" + textColor: "{colors.on-primary}" + typography: "{typography.caption-uppercase}" + rounded: "{rounded.pill}" + padding: 4px 12px + cta-band-coral: + backgroundColor: "{colors.primary}" + textColor: "{colors.on-primary}" + typography: "{typography.display-sm}" + rounded: "{rounded.lg}" + padding: 64px + cta-band-dark: + backgroundColor: "{colors.surface-dark}" + textColor: "{colors.on-dark}" + typography: "{typography.display-sm}" + rounded: "{rounded.lg}" + padding: 64px + footer: + backgroundColor: "{colors.surface-dark}" + textColor: "{colors.on-dark-soft}" + typography: "{typography.body-sm}" + padding: 64px +--- + +## Overview + +Claude.com is the warmest, most editorial interface in the AI-product category. The base atmosphere is a **tinted cream canvas** (`{colors.canvas}` — #faf9f5) — distinctly warm, deliberately not the cool gray-white that every other AI brand uses. Headlines run a **slab-serif display** ("Copernicus" / Tiempos Headline) at weight 400 with negative letter-spacing, paired with **StyreneB / Inter** body sans. The combination feels like a literary publication, not a SaaS marketing page. + +Brand voltage comes from the **cream + coral pairing** — coral (`{colors.primary}` — #cc785c) is the signature Anthropic accent, used on every primary CTA, on the brand wordmark, and on full-bleed callout cards. The coral is warm, slightly muted, never cyan/blue — a deliberate counter-positioning against OpenAI's cool slate, Google's saturated blue, and Microsoft's corporate cyan. + +The system has three surface modes that alternate page-by-page: +1. **Cream canvas** (`{colors.canvas}`) — default body floor +2. **Light cream cards** (`{colors.surface-card}`) — feature card backgrounds +3. **Dark navy product surfaces** (`{colors.surface-dark}`) — code editor mockups, model showcase cards, pre-footer CTAs, footer itself + +The dark surfaces are where Claude shows its product chrome — code blocks, terminal output, model comparison tables, agentic-flow diagrams. The cream-to-dark contrast is the page's pacing rhythm. + +**Key Characteristics:** +- Warm cream canvas (`{colors.canvas}` — #faf9f5) with dark warm-ink text (`{colors.ink}` — #141413). The brand's defining color choice. +- Coral primary CTA (`{colors.primary}` — #cc785c). Used scarcely on individual buttons, generously on full-bleed coral callout cards. +- Slab-serif display headlines via Copernicus / Tiempos Headline at weight 400 with negative letter-spacing. Pairs with humanist sans body for a literary editorial voice. +- Dark navy product mockup cards (`{colors.surface-dark}` — #181715) carrying code blocks, terminal panels, model comparison data — the brand shows the product chrome at scale rather than abstract marketing illustrations. +- Light cream feature cards (`{colors.surface-card}` — #efe9de) — slightly darker than canvas, used for content-driven feature explanations. +- Anthropic radial-spike mark — a small black asterisk-like glyph (4-spoke radial) — appears as the brand wordmark prefix and as a content marker. +- Border radius is hierarchical: `{rounded.md}` (8px) for buttons + inputs, `{rounded.lg}` (12px) for content + product cards, `{rounded.xl}` (16px) for the hero illustration container, `{rounded.pill}` for badges. +- Section rhythm `{spacing.section}` (96px) — modern-SaaS standard. Internal card padding stays generous at `{spacing.xl}` (32px). + +## Colors + +### Brand & Accent +- **Coral / Primary** (`{colors.primary}` — #cc785c): The signature Anthropic warm coral. Used on every primary CTA background, on full-bleed coral callout cards, on the brand wordmark accent. The most-recognized Anthropic color outside of the spike-mark logo. +- **Coral Active** (`{colors.primary-active}` — #a9583e): The press / hover-darker variant. +- **Coral Disabled** (`{colors.primary-disabled}` — #e6dfd8): A desaturated cream-tinted disabled state. +- **Accent Teal** (`{colors.accent-teal}` — #5db8a6): Used sparingly on secondary product surfaces (terminal status indicators, "active connection" dots in connectors page). +- **Accent Amber** (`{colors.accent-amber}` — #e8a55a): A small companion warm-tone used on category badges and inline highlights. + +### Surface +- **Canvas** (`{colors.canvas}` — #faf9f5): The default page floor. Tinted cream — warm, deliberately not pure white. +- **Surface Soft** (`{colors.surface-soft}` — #f5f0e8): Section dividers, very-soft band backgrounds. +- **Surface Card** (`{colors.surface-card}` — #efe9de): Feature cards, content cards. One step darker than canvas. +- **Surface Cream Strong** (`{colors.surface-cream-strong}` — #e8e0d2): A strongest-cream variant used on selected category tabs and emphasized section bands. +- **Surface Dark** (`{colors.surface-dark}` — #181715): Code editor mockups, model showcase cards, footer. The dominant dark surface. +- **Surface Dark Elevated** (`{colors.surface-dark-elevated}` — #252320): Elevated cards inside dark bands (settings panels in mockups). +- **Surface Dark Soft** (`{colors.surface-dark-soft}` — #1f1e1b): Slightly lighter dark, used for code block backgrounds inside larger dark cards. +- **Hairline** (`{colors.hairline}` — #e6dfd8): The 1px border tone on cream surfaces. Same hex as `{colors.primary-disabled}` — borders feel like one elevation step rather than ink lines. +- **Hairline Soft** (`{colors.hairline-soft}` — #ebe6df): Barely-visible divider used inside the same band. + +### Text +- **Ink** (`{colors.ink}` — #141413): All headlines and primary text. Warm dark, slightly off-pure-black. +- **Body Strong** (`{colors.body-strong}` — #252523): Emphasized paragraphs, lead text. +- **Body** (`{colors.body}` — #3d3d3a): Default running-text color. +- **Muted** (`{colors.muted}` — #6c6a64): Sub-headings, breadcrumbs, footer-adjacent secondary text. +- **Muted Soft** (`{colors.muted-soft}` — #8e8b82): Captions, fine-print, copyright lines. +- **On Primary** (`{colors.on-primary}` — #ffffff): Text on coral buttons. +- **On Dark** (`{colors.on-dark}` — #faf9f5): Cream-tinted white used on dark surfaces (echoes the canvas tone). +- **On Dark Soft** (`{colors.on-dark-soft}` — #a09d96): Footer body text, secondary labels in dark mockups. + +### Semantic +- **Success** (`{colors.success}` — #5db872): Green status dots, "available" indicators. +- **Warning** (`{colors.warning}` — #d4a017): Warning callouts (rare on marketing surfaces). +- **Error** (`{colors.error}` — #c64545): Validation errors. + +## Typography + +### Font Family +The system runs **Copernicus** (or **Tiempos Headline** as substitute) as the slab-serif display face for headlines, and **StyreneB** (or **Inter** as substitute) as the humanist sans for body, navigation, and UI labels. **JetBrains Mono** handles code blocks. The fallback stack walks `Tiempos Headline, Garamond, "Times New Roman", serif` for display and `Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif` for body. + +The display/body split is editorial: +- Copernicus serif (weight 400, negative tracking) → h1, h2, h3, hero display +- StyreneB sans (weight 400-500) → body, navigation, buttons, captions, labels +- JetBrains Mono → all code blocks and terminal text + +### Hierarchy + +| Token | Size | Weight | Line Height | Letter Spacing | Use | +|---|---|---|---|---|---| +| `{typography.display-xl}` | 64px | 400 | 1.05 | -1.5px | Homepage h1 ("Meet your thinking partner") — Copernicus serif | +| `{typography.display-lg}` | 48px | 400 | 1.1 | -1px | Section heads — Copernicus | +| `{typography.display-md}` | 36px | 400 | 1.15 | -0.5px | Sub-section heads, model names — Copernicus | +| `{typography.display-sm}` | 28px | 400 | 1.2 | -0.3px | Pricing tier names, callout headlines — Copernicus | +| `{typography.title-lg}` | 22px | 500 | 1.3 | 0 | Pricing plan size labels — StyreneB | +| `{typography.title-md}` | 18px | 500 | 1.4 | 0 | Feature card titles, intro paragraphs | +| `{typography.title-sm}` | 16px | 500 | 1.4 | 0 | Connector tile titles, list labels | +| `{typography.body-md}` | 16px | 400 | 1.55 | 0 | Default running-text — StyreneB | +| `{typography.body-sm}` | 14px | 400 | 1.55 | 0 | Footer body, fine-print | +| `{typography.caption}` | 13px | 500 | 1.4 | 0 | Badge labels, captions | +| `{typography.caption-uppercase}` | 12px | 500 | 1.4 | 1.5px | Category tags, "NEW" badges | +| `{typography.code}` | 14px | 400 | 1.6 | 0 | Code blocks — JetBrains Mono | +| `{typography.button}` | 14px | 500 | 1.0 | 0 | Standard button labels | +| `{typography.nav-link}` | 14px | 500 | 1.4 | 0 | Top-nav menu items | + +### Principles +Display sizes use weight 400 (regular), never bold. Negative letter-spacing (-0.3 to -1.5px) is essential — Copernicus without it reads as off-brand. The serif character is what gives Anthropic its literary, considered voice; switching to a sans-serif display would make Claude feel like every other AI tool. + +Body type stays at weight 400 for paragraphs, weight 500 for labels and emphasized phrases. The sans body is humanist (StyreneB) — never geometric. Inter is an acceptable substitute because of its similar humanist proportions; Helvetica or Arial would be too neutral and break the warm-editorial feel. + +### Note on Font Substitutes +If Copernicus / Tiempos Headline is unavailable, **Cormorant Garamond** at weight 500 with -0.02em letter-spacing is the closest open-source approximation. **EB Garamond** is a fallback. For StyreneB, **Inter** is the closest match — both are humanist sans designed for screen reading. **Söhne** is another close alternative if licensed. + +## Layout + +### Spacing System +- **Base unit:** 4px. +- **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px. +- **Section padding:** `{spacing.section}` (96px) — modern-SaaS rhythm. +- **Card internal padding:** `{spacing.xl}` (32px) for feature cards, pricing tier cards, model comparison cards; `{spacing.lg}` (24px) for code-window cards and connector tiles. +- **Callout / CTA bands:** `{spacing.xxl}` (48px) inside coral callout cards; 64px inside the larger dark CTA band. + +### Grid & Container +- **Max content width:** ~1200px centered. +- **Editorial body:** Single 12-column grid; hero often uses 6/6 split (h1 left, illustration right). +- **Feature card grids:** 3-up at desktop, 2-up at tablet, 1-up at mobile. +- **Connector tile grids:** 4-up or 6-up at desktop, 2-up at tablet, 1-up at mobile. +- **Pricing grid:** 3-up at desktop (Free / Pro / Team / Enterprise often), 1-up at mobile. + +### Whitespace Philosophy +The cream canvas + serif display + generous internal padding create an editorial pacing — Claude reads like a long-form magazine column rather than a marketing template. Whitespace between bands stays uniform at 96px; whitespace inside cards is generous (32px), letting type breathe. + +## Elevation & Depth + +| Level | Treatment | Use | +|---|---|---| +| Flat | No shadow, no border | Body sections, top nav, hero bands | +| Soft hairline | 1px `{colors.hairline}` border | Inputs, sub-nav, occasionally on cards | +| Cream card | `{colors.surface-card}` background — no shadow | Feature cards, content cards | +| Dark surface card | `{colors.surface-dark}` background — no shadow | Code editor mockups, model showcase cards | +| Subtle drop shadow | Faint shadow at low alpha | Hover-elevated states (the system uses `0 1px 3px rgba(20,20,19,0.08)` rarely) | + +The elevation philosophy is **color-block first, shadow rare**. Most depth comes from the cream-vs-dark surface contrast. Shadows are minimal. The dark surface mockups have their own internal product chrome (code editor scrollbars, line numbers, syntax highlighting) which adds detail without needing external shadows. + +### Decorative Depth +- The Anthropic spike-mark glyph (4-spoke radial asterisk) appears as a small black mark in the brand wordmark and inline as a content marker. +- Code editor mockups carry their own internal depth: syntax-highlighted text in muted blues / oranges / grays, line numbers in `{colors.muted-soft}`, status bars at the bottom in `{colors.surface-dark-elevated}`. +- Some hero illustrations use simple line-art with coral and dark-navy strokes on cream — minimal, hand-drawn-feeling, never photorealistic. + +## Shapes + +### Border Radius Scale + +| Token | Value | Use | +|---|---|---| +| `{rounded.xs}` | 4px | Reserved for badge accents and tiny dropdowns | +| `{rounded.sm}` | 6px | Small inline buttons, dropdown items | +| `{rounded.md}` | 8px | Standard CTA buttons, text inputs, category tabs | +| `{rounded.lg}` | 12px | Content cards (feature, pricing, code-window, model-comparison) | +| `{rounded.xl}` | 16px | Hero illustration container, the larger marquee components | +| `{rounded.pill}` | 9999px | Badge pills, "NEW" tags | +| `{rounded.full}` | 9999px / 50% | Avatar substitutes, icon buttons | + +### Photography & Illustrations +Claude's hero rarely uses photography. Instead it uses: +- Simple line-art illustrations with coral + dark-navy strokes on the cream canvas +- Code editor mockups (the dominant "hero" treatment on developer-focused pages) +- Terminal output mockups with monospace text on dark +- Model comparison cards (Opus / Sonnet / Haiku) with abstract geometric thumbnails + +When photography is used (rare — mostly testimonials), avatars crop to perfect circles at 40px diameter. + +## Components + +### Top Navigation + +**`top-nav`** — Cream nav bar pinned to the top of every page. 64px tall, `{colors.canvas}` background. Carries the Anthropic spike-mark + "Claude" wordmark at left, primary horizontal menu (Product, Solutions, Use Cases, Pricing, Research, Company) center-left, right-side cluster with "Sign in" text-link, "Try Claude" `{component.button-primary}` (coral). Menu items in `{typography.nav-link}` (StyreneB 14px / 500). + +### Buttons + +**`button-primary`** — The signature coral CTA. Background `{colors.primary}` (#cc785c), text `{colors.on-primary}` (white), type `{typography.button}` (StyreneB 14px / 500), padding 12px × 20px, height 40px, rounded `{rounded.md}` (8px). Active state `button-primary-active` darkens to `{colors.primary-active}` (#a9583e). + +**`button-secondary`** — Cream button with hairline outline. Background `{colors.canvas}`, text `{colors.ink}`, 1px hairline border, same padding + height + radius as primary. + +**`button-secondary-on-dark`** — Used over `{colors.surface-dark}` cards. Background `{colors.surface-dark-elevated}` (#252320), text `{colors.on-dark}`. Stays dark — the system never inverts to a light secondary on dark surfaces. + +**`button-text-link`** — Inline text button, no background. Used for "Sign in" in the top nav and inline CTA links. + +**`button-icon-circular`** — 36px circular icon button. Background `{colors.canvas}`, hairline border, ink-color icon. Used for carousel arrows, share, "view more". + +**`text-link`** — Inline body links in `{colors.primary}` (the coral). Underlined on press; the coral inline link is one of the system's most distinctive small details. + +### Cards & Containers + +**`hero-band`** — Cream-canvas hero with a 6-6 grid: h1 + sub-headline + button row on the left, hero illustration card or product mockup card on the right. Vertical padding `{spacing.section}` (96px). + +**`hero-illustration-card`** — A larger card holding the hero's right-side artifact — sometimes a coral-stroke line illustration on cream background, sometimes a dark code editor mockup. Background `{colors.canvas}` or `{colors.surface-dark}` depending on context, rounded `{rounded.xl}` (16px). + +**`feature-card`** — Used in 3-up feature grids. Background `{colors.surface-card}` (#efe9de — slightly darker cream), rounded `{rounded.lg}` (12px), internal padding `{spacing.xl}` (32px). Carries a small icon at top, an `{typography.title-md}` headline, and a body description in `{typography.body-md}`. + +**`product-mockup-card-dark`** — Dark navy card showing actual Claude product chrome (chat interface, code editor, agent controls). Background `{colors.surface-dark}`, rounded `{rounded.lg}`, internal padding `{spacing.xl}` (32px). Carries text labels in `{colors.on-dark}` and product UI fragments below. + +**`code-window-card`** — A specialized dark card showing a code editor with line numbers, syntax-highlighted code in `{typography.code}` (JetBrains Mono), and sometimes a "Run" button or terminal output panel below. Background `{colors.surface-dark}` with `{colors.surface-dark-soft}` for the inner code block, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). The signature visual element of Claude Code product pages. + +**`model-comparison-card`** — Used on the homepage's "Which problem are you up against?" section comparing Opus / Sonnet / Haiku. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, internal padding `{spacing.xl}` (32px). Carries the model name, a short capability blurb, and a `{component.text-link}` to learn more. + +**`pricing-tier-card`** — Standard tier card. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, padding `{spacing.xl}` (32px). Carries the plan name in `{typography.title-lg}` (StyreneB), price in `{typography.display-sm}` (Copernicus serif!), feature checklist in `{typography.body-md}`, and a `{component.button-primary}` at the bottom. + +**`pricing-tier-card-featured`** — The featured tier (typically "Pro" or "Team"). Background flips to `{colors.surface-dark}`, text inverts to `{colors.on-dark}`. The dark surface IS the featured-tier signal. + +**`callout-card-coral`** — A full-bleed coral card carrying a major call-to-action. Background `{colors.primary}` (#cc785c), text `{colors.on-primary}` (white), rounded `{rounded.lg}`, padding `{spacing.xxl}` (48px). The coral surface IS the voltage; the CTA inside uses an inverted button style (cream/canvas button on coral). + +**`connector-tile`** — Used on the connectors page's integration grid. Background `{colors.canvas}` with hairline border, rounded `{rounded.lg}`, padding 20px. Each tile carries a logo at top, a `{typography.title-sm}` connector name, and a short description. + +### Inputs & Forms + +**`text-input`** — Standard text input. Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-md}`, rounded `{rounded.md}` (8px), padding 10px × 14px, height 40px. 1px hairline border in `{colors.hairline}`. + +**`text-input-focused`** — Focus state. Border thickens or shifts to `{colors.primary}` (coral) for emphasis. Carries a 3px coral-at-15%-alpha outer ring. + +**`cookie-consent-card`** — Bottom-right floating dark cookie banner. Background `{colors.surface-dark}`, text `{colors.on-dark}`, rounded `{rounded.lg}`, padding `{spacing.lg}` (24px). One of the few places dark surface appears at small scale on cream pages. + +### Tags / Badges + +**`badge-pill`** — Small pill label used for category tags. Background `{colors.surface-card}`, text `{colors.ink}`, type `{typography.caption}` (13px / 500), rounded `{rounded.pill}`, padding 4px × 12px. + +**`badge-coral`** — Coral-fill badge for "NEW", "BETA", featured highlights. Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.caption-uppercase}` (12px / 500 / 1.5px tracking), rounded `{rounded.pill}`, padding 4px × 12px. + +### Tab / Filter + +**`category-tab`** + **`category-tab-active`** — Used in sub-nav rows on solutions / connectors pages. Inactive: transparent background, `{colors.muted}` text. Active: `{colors.surface-card}` background, `{colors.ink}` text. Padding 8px × 14px, rounded `{rounded.md}`. + +### CTA / Footer + +**`cta-band-coral`** — A pre-footer "Try Claude" CTA card. Full-width coral fill, white type, rounded `{rounded.lg}`, padding 64px. Carries an h2 in `{typography.display-sm}` (still serif!), a sub-line, and a cream-button CTA. + +**`cta-band-dark`** — Alternative pre-footer band on developer-focused pages. Background `{colors.surface-dark}`, text `{colors.on-dark}`, rounded `{rounded.lg}`, padding 64px. Often pairs with a code-window card. + +**`footer`** — Dark navy footer that closes every page. Background `{colors.surface-dark}` (#181715), text `{colors.on-dark-soft}`. 4-column link list at desktop covering Product / Company / Resources / Legal. Vertical padding 64px. The Anthropic spike-mark + "Anthropic" wordmark sits at the top in `{colors.on-dark}`. The footer never inverts. + +## Do's and Don'ts + +### Do +- Anchor every page on the cream canvas. Pure white reads as "any other AI tool"; the warm tint is the brand differentiator. +- Use Copernicus serif for every display headline. Pair with StyreneB sans body. Negative letter-spacing on display sizes is non-negotiable. +- Reserve `{colors.primary}` (coral) for primary CTAs and full-bleed `{component.callout-card-coral}` moments. Don't paint accent moments coral elsewhere. +- Use `{component.product-mockup-card-dark}` and `{component.code-window-card}` to show actual Claude product chrome. Don't paint marketing illustrations of code when you can show real code. +- Pair `{component.feature-card}` (cream) with `{component.product-mockup-card-dark}` (navy) in alternating bands. The cream-to-dark rhythm is the brand's pacing mechanism. +- Use the Anthropic spike-mark glyph as the brand wordmark prefix. Never invert the mark to white-on-dark within the wordmark itself. +- Apply `{spacing.section}` (96px) between major bands. + +### Don't +- Don't use cool grays or pure white for canvas. Cream is the brand. +- Don't bold serif display weight. Copernicus at 700 reads as bombastic; the system stays at 400. +- Don't use cool blue or saturated cyan as a brand accent. The coral is the brand voltage. +- Don't put coral everywhere. The coral is scarce on individual elements and generous only on full-bleed coral callout cards. +- Don't use Inter for display headlines. The serif character is the brand voice. +- Don't repeat the same surface mode in two consecutive bands. The pacing alternates: cream → cream-card → dark-mockup → cream → coral-callout → dark-footer. +- Don't add hover state styling beyond what the system already encodes — primary darkens on press; nothing else changes. + +## Responsive Behavior + +### Breakpoints + +| Name | Width | Key Changes | +|---|---|---| +| Mobile | < 768px | Hamburger nav; hero h1 64→32px; hero-illustration-card stacks below content; feature grids 1-up; connector tiles 2-up; pricing 1-up; footer 4 cols → 1 | +| Tablet | 768–1024px | Top nav stays horizontal but tightens; feature cards 2-up; connector tiles 3-up; pricing 2-up | +| Desktop | 1024–1440px | Full top-nav with all menu items; 3-up feature cards; 4-up or 6-up connector tiles; 3-up pricing tiers | +| Wide | > 1440px | Same as desktop with more outer breathing room; max content width caps at 1200px | + +### Touch Targets +- `{component.button-primary}` at minimum 40 × 40px. +- `{component.button-icon-circular}` at exactly 36 × 36 — slightly under WCAG 44 but visually centered. +- `{component.text-input}` height is 40px. +- Connector tile entire card area is tappable; effective tap area >> 44px. + +### Collapsing Strategy +- Top nav collapses to hamburger at < 768px; menu opens as a full-screen cream sheet. +- Hero band's 6-6 grid collapses to single-column on mobile — h1 + sub-head + buttons first, then the illustration / mockup card below. +- Feature grids reduce columns rather than scaling cards down. +- Pricing tier cards collapse 4 → 2 → 1; featured-tier dark surface stays visually distinct at every breakpoint. +- Code-window cards retain code legibility at every breakpoint by allowing horizontal scroll within the card rather than wrapping code lines. + +### Image Behavior +- Code blocks inside dark mockups stay at fixed font-size; horizontal scroll on mobile rather than wrapping. +- Hero illustrations scale proportionally; line-art strokes thin slightly on mobile. +- Avatar photos in testimonials crop to circles at every breakpoint. + +## Iteration Guide + +1. Focus on ONE component at a time. Reference its YAML key (`{component.feature-card}`, `{component.code-window-card}`). +2. Variants of an existing component (`-active`, `-disabled`, `-focused`) live as separate entries in `components:`. +3. Use `{token.refs}` everywhere — never inline hex. +4. Never document hover. Default and Active/Pressed states only. +5. Display headlines stay Copernicus serif 400 with negative tracking. Body stays StyreneB / Inter 400. The split is unbreakable. +6. Cream + coral + dark navy is the trinity. Don't introduce a fourth surface tone (no purple cards, no green sections). +7. When in doubt about emphasis: bigger Copernicus serif before bolder weight. + +## Known Gaps + +- Copernicus and StyreneB are licensed Anthropic typefaces and not available as public web fonts. Substitutes (Tiempos Headline / Cormorant Garamond / EB Garamond for serif; Inter / Söhne for sans) are documented in the typography section. +- The Anthropic radial-spike-mark is a brand glyph rendered as inline SVG; it's not formalized as a system token here. Treat it as a logo asset. +- Animation and transition timings (chat message reveal, code block typewriter effect on the homepage, agentic-flow diagram animations) are not in scope. +- Form validation states beyond `{component.text-input-focused}` are not extracted — error / success states would need a sign-up or feedback flow to confirm. +- The actual Claude product surface (claude.ai chat interface) shares some tokens with the marketing site but adds many product-specific components (chat bubbles, message tools, file upload chips, conversation history sidebar) that are out of scope for this marketing-surface document. +- The "agent" / "computer use" demo cards on certain pages display animated Claude controlling a browser — the static screenshot doesn't fully capture the animation chrome. diff --git a/backend/src/services/curveClient.js b/backend/src/services/curveClient.js index 11fd256..908f81c 100644 --- a/backend/src/services/curveClient.js +++ b/backend/src/services/curveClient.js @@ -5,7 +5,7 @@ const axios = require('axios'); const logger = require('../config/logger'); -const LUXSIN_CURVE_API_BASE = 'https://api.luxsin.com.cn/audio/getCurve'; +const LUXSIN_CURVE_API_BASE = process.env.CURVE_API_BASE_URL || 'https://api.luxsin.com.cn/audio/getCurve'; const CUSTOM_CHARS = 'KLMPQRSTUVWXYZABCGHdefIJjkNOlmnopqrstuvwxyzabcghiDEF34501289+67/'; const STANDARD_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; diff --git a/docker-compose.yml b/docker-compose.yml index 3ce7ea0..dba203e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,8 @@ services: logging: *default-logging networks: - audio-network + extra_hosts: + - "host.docker.internal:host-gateway" volumes: - /data/projects/source:/data/projects/source