Commit Graph

39 Commits

Author SHA1 Message Date
a548425923 fix(security): 文件列表 userId 隔离 + CAS 退出清 SSO
研读模块 /gpt/file/list 之前没强制按 userId 过滤,理论上枚举
knowledgeBaseId 能拿到他人文件元信息(虽然 download 那一步有 userId 校验
所以下不下来,但文件名/大小/上传时间会泄露)。

- FileController.listFile 强制注入 userId = getSysUserId()
- UploadFileMapper.xml BaseSelect 加 <if userId != null> 过滤分支

CAS 退出登录之前只清了本地 JWT,没调 CAS server logout,导致:
- 后端 Redis 里的 token 还在
- CAS server 的 SSO cookie 还在 → 再点"统一身份登录"立即静默登入
- 其他接 CAS 的系统也还能继续访问

新增 POST /app/api/logout:
- 删 Redis 里 LOGIN_TOKEN_KEY:{userId}:{sessionId}
- SecurityContextHolder.clearContext()
- 返回 casLogoutUrl(${serverLogout}?service=前端 login 页)

前端 Operates.vue quit() 改 async:先调 logout 拿 casLogoutUrl,
removeToken 后 window.location.href 跳过去,让 CAS 清 SSO cookie 再回 /login。

CasProperties 加回 serverLogout 字段(之前清理时删了,本次需要)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:34:48 +08:00
b83c540018 fix(cas): 接通 CAS 单点登录全链路 + 清理冗余配置
修复链上的 8 个真 bug:
1. UserDetail(UserVO,Set) 漏 setAuthorities → CAS token 构造抛 IllegalArgumentException
   修:CasUserDetailsService.buildGptUserDetail 手动补 empty authorities

2. frontEndUrl 写死内网 IP,localhost 隧道用户跳回时"无法访问此网站"
   修:CasUrlBuilder 用 X-Forwarded-Host / Host 动态拼 service URL

3. vite proxy 没配 /metalinfo/chat_web_backend,CAS 回跳 ticket 被前端路由吞
   修:加一条 proxy(rewrite 去 /metalinfo 前缀)+ X-Forwarded-Host 转发

4. ticket 校验 service URL 跟 entry point 不一致 → CAS server mismatch
   修:自定义 AuthenticationDetailsSource 用同一个动态 URL

5. sendRedirect URL 含 # 经容器编码成 %23,浏览器拿不到 hash → 404
   修:改用 query 参数(/metalinfo/?cas_token=xxx),前端 router beforeEach 拦截

6. CAS 登录后 HttpSession 残留,第二次访问 /cas/login 不触发 entryPoint → 落到
   DispatcherServlet → 找不到映射 → 404 Whitelabel
   修:SuccessHandler 完成后 invalidate session + clear SecurityContext

7. CAS 路径漏写 Redis token,JwtAuthenticationFilter 校验时 LOGIN_TOKEN_KEY 找不到
   → "token已失效" → 前端 axios interceptor 清 token 跳回 login
   修:SuccessHandler 同步写 redisUtils.set,与 LoginController.saveLoginLog 对齐

8. permission.ts 没拦 query 里的 cas_token,hash 路由下 location.search 取不到
   修:router beforeEach 优先消费 cas_token 再走 getSession

清理冗余:
- CasProperties 删 6 个未用字段(enabled/serverLogout/appLogout/appKey/
  appSecret/httpsFlag/frontEndUrl)
- application.yml 同步删,移除写死的 app-secret 等敏感字段
- 删外部 override 文件 chat_web_backend/config/application.yml
- casServiceProperties.setService 改占位符(实际不被读取,只满足
  ServiceProperties.afterPropertiesSet 的非空校验)
- 删 permission.ts 的 [CAS] [GUARD] debug log,保留 catch error 一条

新增:
- CasUrlBuilder 工具类:从请求动态解析 host/scheme,多个地方共用

UI:
- welcome 页面玻璃按钮 + 呼吸光晕/光感动画(用户自己调过,本次保留)
- App.vue:/welcome 路径不渲染 Operates 侧边栏

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:22:57 +08:00
cc54b24a77 feat(login): CASSIC 红金风登录页 + 玻璃按钮欢迎页
需求:
1. 默认访问 /metalinfo 未登录时跳到 CASSIC 风格登录页
2. 登录页支持两种模式: 账号密码登录 / 统一身份登录(CAS)
3. 登录成功跳转 /welcome (原蓝色登录页布局,但右侧表单换成玻璃风"立即体验"按钮)

变更:
- 新增 chat_web_front/src/views/welcome/index.vue
  - 复用现有蓝色 Waves + projectLogo + "聚尖端之力" 文案
  - 玻璃磨砂按钮(backdrop-filter blur),圆角胶囊 + 圆形箭头
  - 点击 → router.push('/chat')
- 重写 chat_web_front/src/views/login/index.vue
  - CASSIC 红金背景图(cassicLoginBg.jpg, 1920x1080 by /Users/jayliu/gangyan/ui)
  - "登录注册中心" 标题 + 红色短分隔条
  - 账号/密码/验证码 三段式表单 (el-icon User/Lock/Stamp)
  - "短信验证登录" 链接切换到 SMS 模式
  - 主红登录按钮 + 次级"统一身份登录(CASSIC)"白底红边按钮
  - 登录成功后 router.push('/welcome')
  - CAS 回调 cas_token 处理保留
- chat_web_front/src/router/index.ts:
  - / → 默认重定向改为 /welcome (原来到 /chat)
  - 新增 /welcome 路由
- 复制 ui/微信图片_20260423163044_262_1531.jpg 到
  src/assets/images/login/cassicLoginBg.jpg

未做:
- SMS 验证码后端接口 (loginByTel) 仅留前端倒计时占位
- 图形验证码后端 (showCaptcha 默认关)
- 老素材 loginBg.png 仍由 welcome 页使用,未删

测试:
- 访问 /metalinfo → 未登录跳 /login (CASSIC 红金)
- 账号密码登录 / CAS 登录 → 跳 /welcome
- /welcome 点"立即体验" → /chat
2026-05-07 16:17:10 +08:00
846380879b fix(langchain-chat): R1 思考过程显示 + 选题推荐放宽 + RAG 诊断日志
三个独立修复 / 排查:

1. R1 思考过程不显示
   - 根因: chat_test.py 等 <think> 开标签出现才进思考态,但 R1
     流式输出本来就在 reasoning 态启动,永远不出 <think>,所有
     reasoning 全部当 text 走到答案区
   - 修法: 引入 r1_thinking_done 状态机,默认在思考态,
     看到 </think> 切换;R1-70B 直连本地代理 deepseek-r1
     (官方 deepseek-reasoner 把 reasoning 放独立字段,旧版
     callback 取不到)
   - 结果验证: "1+1" → 269 think + 40 text,思考与答案正确分流

2. 选题推荐场景拒答 + chat 模板标记泄漏
   - 根因: prompt 写死了 "你只能回答有关选题推荐的问题"
     + 直接嵌入 <|im_start|>/<|im_end|> Qwen chat 标记
   - 修法: 改写 Topic Recommend Assistant prompt,删 chat 标记,
     行为准则改为"沾边查询用工具回答";agent_v2 增加 strip
     防守层
   - 结果验证: "钢铁行业研究重点方向" → agent 调工具,不再拒答

3. 知识库召回 0 排查(数据问题,未根治)
   - 根因: kb_config.py 把所有 KB(政策库/钢铁库/报告库等)
     都映射到 t_policy_total_bge_new_v2,但 Milvus 里根本没有
     这个 collection(实际只有 11 个 p_* 个人库 + 1 个
     t_journal_article_bge_v1)
   - 临时改: search_tool.py 加诊断日志 [RAG诊断] 输出每个 KB
     召回数;rag_search 内 for 循环里首个 KB 空就 return 的
     bug 改 continue
   - 待决策: kb_config 是否把默认 KB 映射到唯一存在的
     t_journal_article_bge_v1,或重建对应集合

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 15:44:05 +08:00
316def2145 feat(langchain-chat): LangGraph 重写 agent 内核
主要变化:
- 新增 agent_v2.py: 用 LangGraph create_react_agent + astream_events
  替代原 agent_chat_test 的 LLM step-routing 死循环
- 新增 tools_v2.py: 闭包工厂模式,每个请求按 uuid 生成工具列表,
  消除 toolinput 字符串拼 JSON 注入 uuid 的旧 hack
- chat_test.py:266-346: 删 11 次 count_process 重试外层和事件
  分发 spaghetti,换成 agent_run 单次调用 + 简单事件 dispatcher
- policy_fun_iast.py:168-187: 修 broken <think> filter
  老代码把 start_flag 设反了(看见 <think> 才开始 yield)导致
  非 think 模型 yield 不出任何内容;改为正确跳过 <think>...</think> 块

模型函数调用通过 langchain_openai.ChatOpenAI(不能用旧版
langchain_community.chat_models.ChatOpenAI,没有现代 tool calling)。
依赖: langgraph==0.0.49 + langchain-core==0.1.53(已在服务器装好)。

非 stream 分支保留旧 agent_chat_test 路径(极少触发,回归风险低)。
旧版回滚: git checkout backup/pre-langgraph

实测对比:
- 旧版 30-60s,答案 0 字(filter 卡死后展示 11 次重试)
- 新版 25-40s,答案完整(含工具调用、参考文献、推荐问题、摘要)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 15:20:00 +08:00
911f7adee6 checkpoint: 重写 langchain agent 前的快照
包含未合入 main 的工作:
- CAS 单点登录接入 (CasSecurityConfig + 4 个 CAS 类)
- LoginController 改 POST + body, 修 URL 密码暴露
- chat_test.py 修 texts→text typo
- 前端外部系统侧边栏 + login API POST
- gateway-nginx.conf

下一步: 从这个分支拉 feat/langgraph-rewrite 做 langchain-chat agent 重写
回滚点: git checkout backup/pre-langgraph

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 14:58:53 +08:00
f8e8017434 feat: 顶部 title + logo 配色 + 侧栏外部系统快捷入口
- index.html: 浏览器 title 改为"中国产业基础能力发展战略研究院战知大模型"
- properties.ts: 加 fullProjectName 字段,projectName 短名保留用于 footer
- title.svg / chatLogo.svg: 米字图标左下主笔染 #FF2500 红,其余 5 笔染 #636E77 灰,"战知"汉字保留默认黑色
- Operates.vue: 侧栏底部 user 头像上方新增 3 个浅蓝按钮风格外链入口(钢研门户/项目管理/数据中心),点击新窗口打开内网系统

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:51:09 +08:00
0c3a393d04 [运维] 接入内网 searxng + 清理启动脚本 + 修 log-trim 权限
搜索接口:

- duckduckgo_search.py / ZhipuSearchAPI.py 切换到内网 searxng (原 43.251.225.121 / 134.122.191.214 已失效)

启动脚本清理:

- 删除废弃 backend/ 目录 (与 chat_web_backend/ 编译产物 jar MD5 相同,仅是改名副本)

- 删除 start_all.sh 与 langchain-chat/{start,stop,stop_quick,shutdown_all,restart}.sh (被 scripts/*-restart.sh 覆盖)

- 删除 chat_web_backend/{start,test_mysql}.sh

修复:

- scripts/backend-restart.sh 对齐当前实际在跑的 chat_web_backend.jar (profile=dev)

- scripts/log-trim-daemon.sh 把 LOCK 移到 /tmp 按用户命名,修复非首次用户跑时的 Permission denied

新增:

- scripts/start-all.sh:一键启动入口,串联 mysql/redis/milvus/langchain/backend/frontend,含端口自检

- chat_web_backend/application-local.yml.archived:原 backend/ 下 yj profile 覆盖配置的归档备份

其他:

- .gitignore 忽略 scripts/pptist-deploy/PPTist/ (323M 第三方源码树)
2026-04-20 15:59:11 +08:00
279b104434 Merge pull request 'fix: 修改KGO搜索接口地址' (#1) from dev_albert into main
Reviewed-on: #1
2026-04-19 16:23:20 +00:00
8bb98dc2e1 fix: 修改KGO搜索接口地址 2026-04-19 23:46:08 +08:00
5eebcb5e83 fix: 工具反代路径冲突修复 + OCR改独立端口
- Stirling PDF: 用 context-path=/pdf 从应用层解决路径问题
- OCR: Vue Router history模式不兼容子路径,改回独立端口18083
- Lama Cleaner: 精确location匹配所有API(/model /inpaint等)
- PDF前端卡片路径从/spdf/改为/pdf/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 20:20:55 +08:00
5850d37c48 fix: 修复工具nginx反代路径冲突
- Stirling PDF: 使用 SERVER_SERVLET_CONTEXT_PATH=/pdf 从根本解决 base href 问题
- TrWebOCR: 用精确文件名 location 代替 sub_filter(后端 gzip 导致 sub_filter 不生效)
- Lama Cleaner: 同样用精确 location 匹配所有 API 路径(/model, /inpaint 等)
- PDF API 用 /api/v1/ 精确匹配,和 imgcompress 的 /api/ 不冲突
- OCR API 用 /api/tr-run/ 精确匹配

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 19:54:33 +08:00
570c0f3d61 fix: 工具广场统一18000端口 + 去除电量限制 + bot头像更新
nginx反代(tools-nginx.conf):
- 10个工具统一通过18000端口路径分发
- 解决/static/冲突(Lama精确匹配,其余给LibreTranslate)
- 解决/api/冲突(PDF用sub_filter改为/pdf-api/,/api/给imgcompress)
- Overleaf兜底处理所有未匹配的绝对路径
- 前端工具卡片统一走18000端口+路径

后端:
- 去除对话电量限制(validateUser中的num扣减逻辑)

前端:
- bot头像更新为战知logo(蓝底白字)
- LaTeX公式编辑器"复制为图片"改为"下载为图片"(解决跨域问题)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 19:28:23 +08:00
00a50858f8 fix: 调整侧边栏导航间距
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 20:39:13 +08:00
e1c3e550c3 feat: 用户管理模块
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 20:24:16 +08:00
6337af9481 feat: 新增4个工具(imgcompress/LamaCleaner/webp2jpg/Overleaf/LaTeX公式编辑器) + 应用广场布局优化
新增工具部署:
- imgcompress (端口18087) - 图片压缩、格式转换、AI抠图
- Lama Cleaner (端口18088) - AI图像擦除/去水印
- webp2jpg-online (端口18089) - 图片格式批量互转
- Overleaf (端口18090) - 在线LaTeX论文编辑器(docker-compose + MongoDB 8.0)
- LaTeX公式编辑器 (端口18091) - 纯前端KaTeX公式编辑

应用广场优化:
- 去掉tab切换,所有分类平铺展示
- CSS Grid自适应布局,一行可排3-4个卡片
- 重新分为4个分类:文档处理、图片处理、创作绘图、科研写作

其他:
- 更新 CLAUDE.md 项目配置文档
- PPTist AI后端优化prompt和流式输出格式

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 20:23:06 +08:00
108022cebd feat: 品牌升级(知冶→战知) + 应用工具广场重构 + 新增工具集成
品牌升级:
- 全站品牌从"知冶"更名为"战知"
- 更换 favicon、侧边栏 logo、登录页 logo
- 更新登录页标语和首页欢迎语

应用广场重构:
- 从后端数据库驱动改为前端静态配置,按分类 tab 展示
- 新增工具卡片 UI,支持 logo 图片和 emoji 图标

新增工具部署:
- Stirling PDF (端口18080) - PDF 处理工具箱
- Excalidraw (端口18081) - 手绘风格白板,集成 AI 绘图
- TrWebOCR (端口18083) - 中文离线 OCR
- LibreTranslate (端口18084) - 中英翻译引擎
- PPTist (端口18085) - 在线 PPT 编辑器
- PPTist AI 后端 (端口18086) - 对接 deepseek-v3 生成大纲/PPT/写作
- Excalidraw AI 代理 (端口18082) - 对接 deepseek-v3 生成 Mermaid 图

其他:
- 智能场景仅保留"选题推荐"
- vite 代理配置增加 /pdf/ 和 /draw/ 路由

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 17:24:51 +08:00
e1e5d4f30d [前端+后端+RAG] 检索范围切换(当前文件/整个知识库);联网搜索功能(SearXNG);搜索结果带网络链接;修复RAG检索source格式不匹配bug 2026-04-07 15:03:16 +08:00
a5110da4e8 [RAG] 全部LLM硬编码从deepseek-r1改为deepseek-v3;修复知识库问答source格式不匹配导致检索结果被丢弃 2026-04-07 15:03:16 +08:00
4e00a1b15e 更新 README.md 2026-04-07 07:01:56 +00:00
5dcb8771ed [前端+RAG] 异步上传+前端轮询自动刷新导读;PDF阅读模式合并行消除留白 2026-04-02 17:17:36 +08:00
ee7c4a73ed [RAG] 彻底改回同步上传(模型已换v3足够快),删除异步后台线程代码 2026-04-02 16:45:27 +08:00
46428b7936 [RAG] PDF阅读模式改用pdfplumber(文本+表格提取,干净HTML);修复ck_mysql_config导入 2026-04-02 16:18:59 +08:00
05e33d1d05 [前端+RAG] 修复:异步上传+MySQL回写导读;PDF切换detached(Uint8Array复制);对话工具栏遮挡;阅读模式空白 2026-04-02 14:59:17 +08:00
8b7e3a726b [前端+RAG] 恢复同步上传修复导读生成;用Uint8Array存PDF字节修复detached;CSS覆盖PDF阅读模式空白 2026-04-02 14:44:49 +08:00
7caf7cf66a [前端+RAG] 修复PDF ArrayBuffer detached;修复阅读模式右侧空白(覆盖PyMuPDF固定宽度) 2026-04-02 14:30:58 +08:00
379187f675 [前端+RAG] 添加PDF阅读模式切换(预览/笔记);改进PDF→HTML用get_text(html)保留格式;修复长文件名操作菜单不显示 2026-04-02 14:21:41 +08:00
5158753b94 [前端+RAG] 修复PDF文字重叠;上传异步化(LLM+向量化后台执行);摘要关键词模型改为deepseek-v3 2026-04-02 14:10:08 +08:00
0e25154468 [前端] 修复PDF加载:直接用axios获取arraybuffer,绕过blob处理问题 2026-04-02 13:39:45 +08:00
f273643011 [前端] 修复PDF加载:正确处理downloadFile返回的blob格式 2026-04-02 13:29:02 +08:00
f508a8b6b1 [前端+RAG] PDF原生渲染(pdfjs text layer);Excel列宽优化+水平滚动 2026-04-02 13:24:41 +08:00
200ccac9b9 [前端] 修复翻译按钮错位:去掉硬编码margin-left;修复对话框硬编码宽度 2026-04-02 13:06:08 +08:00
1e47bcab37 [前端] 新建文件夹按钮改为带文字的明显按钮 2026-04-02 13:03:48 +08:00
3427dcd39e [前端] checkbox改为批量删除模式才显示;修复搜索文件名时不展开文件夹的问题 2026-04-02 13:01:42 +08:00
0c7f2e83f8 [前端] 修复研读模块布局问题:统一圆角、Tab换行、拖拽改变大小、折叠面板、checkbox批量删除 2026-04-02 12:55:17 +08:00
a339757596 [前端] 研读模块改造为三栏布局:文件树+预览+问答 2026-04-02 12:01:27 +08:00
4355e45580 [文档] 更新README:项目介绍、架构、快速启动、目录结构 2026-04-02 11:37:53 +08:00
87e571d9ec [全量] 初始化项目代码、配置、文档及Agent协同harness 2026-04-02 11:36:05 +08:00
0553309cdf first commit 2026-04-02 11:01:28 +08:00