Files
eaiadminandClaude Code 14f303459e refactor: 后端仓库层收口(A1:课程/产品/素材)+ 收进工作区既有对象化重构
本提交含两部分。第一部分是本轮工作;第二部分是此前一直留在工作区、
从未提交的对象化重构,与第一部分在文件上互相咬合(internal/repository
整个包都是未跟踪状态,且 api 层已有文件引用它),无法拆成两个可编译的提交。

一、仓库层收口 A1 批(本轮工作)

把 api 层手写的 store.DB 查询收进具名仓库方法,只给真正获益的对象做方法,
不机械包裹全量。本批迁移 22 处裸查询(courses.go 9 / media.go 12 / products.go 1),
新增方法:

- MediaFileRepo.ListByBind / ListForAudit / MarkExtracted
- KnowledgeChunkRepo.CountByMediaFile
- ProductRepo.GetVisibleByID

两条业务口径改由仓库单点持有,避免各处手写漂移:
「只有 approved 素材出现在课程详情」与「已停用产品不在课程详情露出」。

修掉两个真实缺陷:
- ProductRepo.GetByID 缺 Where 条件。此前 GET /api/products/{id} 对任意 id 都返回
  第一条产品、对不存在的 id 返回 200,且 PUT /api/products/{id} 会覆盖第一条产品
  —— 数据损坏级。全仓扫描确认这是唯一一处同型写法。
- ProductRepo.Delete 写 status="deleted",而 DELETE 处理器文档与回包都声称
  "inactive",接口在说谎;管理员用 status=all 拉列表会看到前端不认识的状态。
  已对齐为 inactive(与 CourseRepo.Delete 一致)。

删除 8 个零调用且列名不存在的死方法(一调即 SQL 报错):
- media_file 上的 file_path / file_type / approval_status 三列并不存在,
  GetByPath / ListByType / UpdateStatus 全废
- knowledge_chunk 上的 space_id 列不存在(模型早已改为 knowledge_space_key),
  List / Total / ListBySpaceIDs / DeleteBySpace / SearchByVector 全废
取舍边界:能对当前 schema 跑通的死方法保留,跑不通的删或修。

CourseRepo.List 补齐 status=all 档(此前传给它会当作 status='all' 过滤出空列表)。
该方法此前零调用,现与产品列表语义对齐。

验证:go build ./... 与 go test ./... 全绿;另用真实 HTTP 请求验证 34 项
(课程 17 / 产品 3 / 素材 14),跑在数据库副本与独立 KB_DATA_DIR 上,
含 multipart 真上传 → 审批 → pdftotext 提取 → 分片入库的完整链路。

二、此前未提交的对象化重构(非本轮工作)

- 新增 internal/repository 仓库层、connectors、skills、specialists、xapps、jsonutil,
  model/task_record|task_run|task_artifact、api/task_runtime|action_definition|chat_message
- 删除 api/app_definition、connectors、my_app_center、notification、office_skill、
  export_docx|pptx|xlsx、official_account_* 等,随 XApp/Skill/Specialist/Connector
  可插拔打包方向(AR10/AR11)调整
- 资产目录归位:backend-go/knowledge_source → assets/knowledge/source、
  training_materials → assets/training/materials;README 内相对路径同步加深两级;
  deploy env 补 ASSET_ROOT_DIR 并改 KNOWLEDGE_SOURCE_DIR / TRAINING_MATERIALS_DIR
- 前端新增 skills/ specialists/ connectors/ xapps/ 目录与对应页面

验证:前端 npm run build 通过(7.26s)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-19 01:23:51 +08:00

89 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# eai_agentplatform EAI 数字员工平台(AI Agent Platform)
纯内网本地化的企业 AI 数字员工平台。
围绕数字员工(专员)、知识库底座、自动化工坊、考试评估与系统管理组织业务能力。
配套全局 AI 助手,提供答疑、知识查询、任务拆解与业务工具。
## 技术栈
| 层级 | 技术 |
|------|------|
| 前端 | Vue3 + Vite + Element Plus |
| 后端 | Go + Gin + GORM + SQLite(modernc 纯Go驱动) |
| 认证 | JWT(golang-jwt)+ bcrypt |
| 文档转换 | LibreOffice + pdftotext(裸进程) |
| AI 底座 | 内网 OpenAI 兼容接口(Ollama:LLM + bge-m3 embedding) |
| 部署 | 裸进程 + systemd + Clonezilla 整盘克隆,单二进制交付 |
## 目录结构
```
pj0235-eai_agentplatform-ubu/ # 工作区根(仓库根)
├── TOP_CODING_RULES.md # 编码与调试最高准则
├── start_dev_10231_10232.sh # 开发启动脚本
├── docs/ # 设计文档(项目级,与代码分离)
│ ├── 00_AI_Context/ # AI 协作上下文
│ ├── 01_System_Overall/ # 系统总览(SY 前缀)
│ ├── 02_Architecture/ # 架构设计(AR 前缀)
│ ├── 04_Backend/ # 后端设计与 API(BE 前缀)
│ ├── 06_Product_Lines/ # 产品线与前端设计(PL 前缀)
│ ├── 08_Design_Rules/ # UI/UX 设计规范(DR 前缀)
│ ├── PRD.md # 产品需求文档(V1.1)
│ ├── db_schema.md # 数据库 Schema
│ ├── api.md # API 文档
│ ├── deploy.md # 部署文档
│ ├── changelog.md # 变更日志
│ ├── eaisalestrain_app设计稿.md # 完整 PRD 中文原稿
│ └── 博昇产品与渠道合作表.md # 知识源权威数据
└── eai_agentplatform/ # 应用代码
├── backend-go/ # Go 后端(正式,唯一后端)
│ ├── cmd/ internal/ # Go 源码
│ ├── data/ # 运行时数据(db+media,git 忽略)
│ └── deploy/ # 交付物(systemd/env/清理脚本/DELIVERY.md)
├── assets/ # 内容资产层(运行时输入,不属于源码)
│ ├── knowledge/source/ # 知识源 Markdown
│ └── training/materials/ # 培训资料资产
├── frontend/ # 前端完整代码
├── CLAUDE.md # AI 协作锚点
├── PROJECT_STATE.md # 项目全局状态
└── .gitignore
```
## 新对话启动仪式(强制)
你是一个新对话,没有任何历史记忆。响应用户的任何请求**之前**,按顺序执行:
1. 确认你的角色:后端(backend)/ 前端(frontend)/ 全栈
2. 读 `PROJECT_STATE.md`(本目录)—— 项目当前全局状态与已拍板决策
3. 读 `../TOP_CODING_RULES.md`(工作区根)—— 编码与调试最高准则
完成以上步骤,才开始响应用户。
## 核心业务模块
| 模块 | 说明 |
|------|------|
| 公司介绍培训 | 纯阅读页面,可绑定 PPT/视频课件 |
| 产品知识 | 四大产品分类,固定字段(编号/佣金/规则等) |
| 产品销售培训 | 四大课程,话术/流程/异议处理 |
| 考试系统 | 自测(不限次/即时反馈)+ 正式考(永久存档) |
| AI PathCoach | 右侧常驻面板,自动上下文,3 个快捷按钮 |
| 知识管理【管理员】 | 素材审批,课件 CRUD,绑定课程/产品 |
| 系统管理【管理员】 | 用户管理,成绩查询,系统参数配置 |
| 内容管理【管理员】 | 产品/课程/题库的录入编辑 |
## 设计原则(强制执行)
- **100% 本地化部署**:不上云、无 OSS、无 MinIO、不依赖公网云服务
- **功能克制**:功能以业务价值为准、杜绝为加而加的冗余功能;权限保持精简(employee/admin 两级)
- **学情/成长为已决策边界(D18/D19)**:学员自助视角的学习档案/能力雷达、积分/排行榜、证书、部门学情统计均已拍板纳入;全站拒绝「社交社区/讨论区」类功能(D19)
- **审批前置**:所有上传素材必须审批通过才可生效、进入知识库、页面展示
- **视频仅预览**:MP4 不做转码、不做 ASR、不进 AI 知识库
- **混合检索**:AI 知识检索 = 向量(brute-force 余弦)+ 关键词兜底,数据量小无需 ANN 向量库
## AI 配置
- **LLM 适配器**:Go net/http 实现(无 openai SDK 依赖),支持 SSE 流式 + 非流式调用
- **配置优先级**:system_config 数据库表 → .env 文件,缺任何配置 Fail Fast 抛 501
- **知识检索**:混合检索(向量 brute-force + 关键词),embedding 走 Ollama bge-m3