3
0

78 Коммитууд 5b1bc25b2d ... ea70467d21

Эзэн SHA1 Мессеж Огноо
  XieXing ea70467d21 Bugfix:TTSbug 3 сар өмнө
  XieXing b5da40438e Update:更新移动端样式 3 сар өмнө
  XieXing 0cb50df972 Update:更新移动端样式 3 сар өмнө
  XieXing 9d6cf98be6 新增积分系统 3 сар өмнө
  XieXing 0c59b148b4 新增积分系统 3 сар өмнө
  XieXing cdbe2644fe 新增积分系统 3 сар өмнө
  XieXing 15bbaa7581 新增积分系统 3 сар өмнө
  XieXing 406612015b 一系列更新 3 сар өмнө
  XieXing c4755e7444 Update:票据处理逻辑更新 3 сар өмнө
  XieXing a85a1c9b87 Update:票据处理逻辑更新 3 сар өмнө
  XieXing aa77c004bc Update:票据处理逻辑更新 3 сар өмнө
  XieXing 53521a4dc8 Update:更新readme 3 сар өмнө
  XieXing 129acdfae5 Update优化 3 сар өмнө
  XieXing e688fe1def Update优化 3 сар өмнө
  XieXing 9b8a3acf8e Update优化 3 сар өмнө
  XieXing eab4c87ad7 Update:更新环境隔离配置 3 сар өмнө
  XieXing 70485f2d03 Update:更新readme 3 сар өмнө
  XieXing fe2e919bb9 Update:更新readme 3 сар өмнө
  XieXing 40d09b21ea Update优化 3 сар өмнө
  XieXing ddde90ecbb Update优化 3 сар өмнө
  XieXing 7a03b1686b Update优化 3 сар өмнө
  XieXing cf732723ea Update:更新环境隔离配置 3 сар өмнө
  XieXing 0d5fdfa7e5 Update:更新readme 3 сар өмнө
  XieXing 61f639ca86 Update:更新readme 3 сар өмнө
  XieXing 0131886a08 Update:更新readme 3 сар өмнө
  XieXing 872e65e76e Update:更新环境隔离配置 3 сар өмнө
  XieXing 9395905662 Update:更新环境隔离配置 3 сар өмнө
  XieXing c384d63405 Update优化 3 сар өмнө
  XieXing a29845a134 Update优化 3 сар өмнө
  XieXing f3f314fa6d Update优化 3 сар өмнө
  XieXing 00f71da133 Update:更新readme 3 сар өмнө
  XieXing 1af041a802 Update:更新环境隔离配置 3 сар өмнө
  XieXing e128b53eb6 Update:系统重构 3 сар өмнө
  XieXing abe06aa146 Update:更新环境隔离配置 3 сар өмнө
  XieXing 87225f53d6 Update:更新readme 3 сар өмнө
  XieXing be06067c0e Update:更新readme 3 сар өмнө
  XieXing a9988428f6 Update 3 сар өмнө
  XieXing 29509f691e Update:更新环境隔离配置 3 сар өмнө
  XieXing 15cfdc7c32 Update:更新readme 3 сар өмнө
  XieXing 44178908eb Update:系统重构 3 сар өмнө
  XieXing 30aa542822 Update:更新.gitignore 3 сар өмнө
  XieXing 0621182867 Update:更新.gitignore 3 сар өмнө
  XieXing e788efef0f Update:配置文件分离 3 сар өмнө
  XieXing fa5c016ef6 bugfix 4 сар өмнө
  XieXing 5c55069f78 Update:项目重构 4 сар өмнө
  XieXing b707c817b7 Update:项目重构 4 сар өмнө
  XieXing efbeb6767c bugfix 4 сар өмнө
  XieXing 3c0e26a2c8 bugfix 4 сар өмнө
  XieXing d5ba664066 bugfix:补全index 4 сар өмнө
  XieXing a718204b97 bugfix:补全index 4 сар өмнө
  XieXing 8d2622765d bugfix:补全index 4 сар өмнө
  XieXing ff09a1f605 bugfix:补全index 4 сар өмнө
  XieXing fc332684a9 bugfix:补全index 4 сар өмнө
  XieXing 91fa7595ac bugfix:补全index 4 сар өмнө
  XieXing 4eac09e52b bugfix:补全index 4 сар өмнө
  XieXing e919f02b2f bugfix:补全index 4 сар өмнө
  XieXing 1d87be1bb2 bugfix:补全index 4 сар өмнө
  XieXing da4a16c1fc bugfix:补全index 4 сар өмнө
  XieXing b38720840c bugfix:补全index 4 сар өмнө
  XieXing fa8102f795 bugfix:补全index 4 сар өмнө
  XieXing 804fc99d5d bugfix:补全index 4 сар өмнө
  XieXing 6f566436ab bugfix:补全index 4 сар өмнө
  XieXing 49feb4934c bugfix:补全index 4 сар өмнө
  XieXing d7873cd66f bugfix:补全index 4 сар өмнө
  XieXing e72f283844 bugfix:补全index 4 сар өмнө
  XieXing 045ee8f4b9 bugfix:补全index 4 сар өмнө
  XieXing 6db10793d9 bugfix:补全index 4 сар өмнө
  XieXing 6e31018785 bugfix:补全index 4 сар өмнө
  XieXing d5053d2f01 bugfix:补全index 4 сар өмнө
  XieXing 0cb99f6dae bugfix:补全index 4 сар өмнө
  XieXing eb4565c4cc bugfix:补全index 4 сар өмнө
  XieXing 4277abe80d bugfix:补全index 4 сар өмнө
  XieXing 1810733e32 bugfix:补全index 4 сар өмнө
  XieXing 7c066f67fd bugfix:补全index 4 сар өмнө
  XieXing d019125538 bugfix:补全index 4 сар өмнө
  XieXing cbe97c04a7 bugfix:补全index 4 сар өмнө
  XieXing 63bc1923a5 bugfix:补全index 4 сар өмнө
  XieXing 4f7d6fb596 重构项目 4 сар өмнө
100 өөрчлөгдсөн 1107 нэмэгдсэн , 104 устгасан
  1. 48 3
      .gitignore
  2. 0 36
      README.en.md
  3. 88 65
      README.md
  4. 739 0
      api-docs.html
  5. 116 0
      build_release.sh
  6. 116 0
      build_test.sh
  7. BIN
      dist/assets/1-B36XbbwA.png
  8. BIN
      dist/assets/1-Bqw91QeI.png
  9. BIN
      dist/assets/1-BusD92L7.png
  10. BIN
      dist/assets/1-Dj1j5ddA.png
  11. BIN
      dist/assets/10-fqbnRryi.png
  12. BIN
      dist/assets/11-7l3W5DeQ.png
  13. BIN
      dist/assets/12-DEN8e9Vv.png
  14. BIN
      dist/assets/13-BL3zSFtZ.png
  15. BIN
      dist/assets/13-Bv7KwdLX.png
  16. BIN
      dist/assets/13-CcUgOE0U.png
  17. BIN
      dist/assets/15-5aSMwcYf.png
  18. BIN
      dist/assets/16-CdNGEq1M.png
  19. BIN
      dist/assets/18-2AEZNH7q.png
  20. BIN
      dist/assets/18-CEUBeFPE.png
  21. BIN
      dist/assets/19-DzDaxNt7.png
  22. BIN
      dist/assets/2-BidY8fbj.png
  23. BIN
      dist/assets/2-Cw3SUKtJ.png
  24. BIN
      dist/assets/2-DNbvF9Ja.jpg
  25. BIN
      dist/assets/2-G3awVIMi.png
  26. BIN
      dist/assets/2-dXZ0SRRr.png
  27. BIN
      dist/assets/20-CH9VEtNe.png
  28. BIN
      dist/assets/21-BTsblUui.png
  29. BIN
      dist/assets/22-PHJtTrlQ.png
  30. BIN
      dist/assets/26-BsA4Ghua.png
  31. BIN
      dist/assets/27-Dd_EQ7v1.png
  32. BIN
      dist/assets/29-B03QHNcz.png
  33. BIN
      dist/assets/3-DQsDb2Wr.png
  34. BIN
      dist/assets/3-N-JnaHAs.png
  35. BIN
      dist/assets/3-cYQ4_7jA.png
  36. BIN
      dist/assets/4-DHzSAirS.png
  37. BIN
      dist/assets/5-CIylGsDd.png
  38. BIN
      dist/assets/6-Bdy5I3eE.png
  39. BIN
      dist/assets/6-VAD6vh2A.png
  40. BIN
      dist/assets/6-XEd9sn-3.png
  41. BIN
      dist/assets/7-1jnTdOqk.png
  42. BIN
      dist/assets/7-CUlrfWWC.png
  43. BIN
      dist/assets/8-DzJOoBe0.png
  44. BIN
      dist/assets/9-C2owFl4j.png
  45. BIN
      dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2
  46. BIN
      dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff
  47. BIN
      dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf
  48. BIN
      dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf
  49. BIN
      dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff
  50. BIN
      dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2
  51. BIN
      dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff
  52. BIN
      dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2
  53. BIN
      dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf
  54. BIN
      dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf
  55. BIN
      dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff
  56. BIN
      dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2
  57. BIN
      dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf
  58. BIN
      dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2
  59. BIN
      dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff
  60. BIN
      dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2
  61. BIN
      dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff
  62. BIN
      dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf
  63. BIN
      dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2
  64. BIN
      dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf
  65. BIN
      dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff
  66. BIN
      dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf
  67. BIN
      dist/assets/KaTeX_Main-Italic-BMLOBm91.woff
  68. BIN
      dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2
  69. BIN
      dist/assets/KaTeX_Main-Regular-B22Nviop.woff2
  70. BIN
      dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff
  71. BIN
      dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf
  72. BIN
      dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf
  73. BIN
      dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2
  74. BIN
      dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff
  75. BIN
      dist/assets/KaTeX_Math-Italic-DA0__PXp.woff
  76. BIN
      dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf
  77. BIN
      dist/assets/KaTeX_Math-Italic-t53AETM-.woff2
  78. BIN
      dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf
  79. BIN
      dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2
  80. BIN
      dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff
  81. BIN
      dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2
  82. BIN
      dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff
  83. BIN
      dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf
  84. BIN
      dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf
  85. BIN
      dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff
  86. BIN
      dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2
  87. BIN
      dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf
  88. BIN
      dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2
  89. BIN
      dist/assets/KaTeX_Script-Regular-D5yQViql.woff
  90. BIN
      dist/assets/KaTeX_Size1-Regular-C195tn64.woff
  91. BIN
      dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf
  92. BIN
      dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2
  93. BIN
      dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf
  94. BIN
      dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2
  95. BIN
      dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff
  96. BIN
      dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff
  97. BIN
      dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf
  98. BIN
      dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff
  99. BIN
      dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf
  100. BIN
      dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2

+ 48 - 3
.gitignore

@@ -1,3 +1,48 @@
-node_modules
-./dist
-assets
+# General
+.DS_Store
+Thumbs.db
+.idea/
+.vscode/
+*.log
+nohup.out
+
+# Frontend
+node_modules/
+dist/
+.vite/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Backend Configuration (contains sensitive data)
+shudao-go-backend/conf/
+
+# Backend - Go Build Artifacts
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+*.out
+
+# Specific Backend Artifacts
+shudao-go-backend/shudao-go-backend
+shudao-go-backend/shudao-go-backend.tar.gz
+shudao-go-backend/shudao-chat-go
+shudao-go-backend/shudao-chat-go.tar.gz
+
+# Backend Copied Assets (from frontend build)
+shudao-go-backend/assets/
+shudao-go-backend/views/index.html
+
+#IDE file
+.kiro
+.cursor
+.vscode
+.trae
+.qoder
+.claude
+.code
+.augment
+.roo

+ 0 - 36
README.en.md

@@ -1,36 +0,0 @@
-# shudao-vue
-
-#### Description
-{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
-
-#### Software Architecture
-Software architecture description
-
-#### Installation
-
-1.  xxxx
-2.  xxxx
-3.  xxxx
-
-#### Instructions
-
-1.  xxxx
-2.  xxxx
-3.  xxxx
-
-#### Contribution
-
-1.  Fork the repository
-2.  Create Feat_xxx branch
-3.  Commit your code
-4.  Create Pull Request
-
-
-#### Gitee Feature
-
-1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
-2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
-3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
-4.  The most valuable open source project [GVP](https://gitee.com/gvp)
-5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
-6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 88 - 65
README.md

@@ -1,87 +1,110 @@
-## 部署与上线指南
+# 蜀道安全管理AI智能助手
 
 
-本文记录 shudao-chat 项目前后端在生产环境的标准交付流程,包括 Vue 前端打包、产物合入 Go 服务、Linux 下编译后端以及上传、运行服务的步骤。
+## 项目概述
 
 
----
+蜀道安全AI系统是为四川省蜀道投资集团打造的AI安全管理平台,提供AI问答、公文写作、培训PPT生成、试题生成、隐患检测等功能。
 
 
-### 1. 前端(Vue 3 + Vite)打包
+## 技术栈
 
 
-**环境准备**
-- Node.js ≥ 20.19(建议与 `package.json` 中的 engines 保持一致)
-- npm(或 pnpm / yarn,以下以 npm 为例)
-- 在国内网络可替换源:`npm config set registry https://registry.npmmirror.com`
+| 模块 | 技术 |
+|------|------|
+| 后端 | Go 1.24+, Beego v2, GORM, MySQL |
+| 前端 | Vue 3, Vite 7, Element Plus, Pinia |
+| AI | Qwen3, DeepSeek, YOLO |
+| 存储 | MinIO (S3), ChromaDB |
+
+## 环境说明
+
+| 环境 | 域名/IP | 说明 |
+|------|---------|------|
+| 本地 | localhost / 127.0.0.1 | 开发调试 |
+| 测试 | 172.16.29.101 | 内网测试 |
+| 生产 | aqai.shudaodsj.com | 正式环境 |
+
+## 快速开始
+
+### 1. 本地开发
 
 
-**打包流程**
 ```bash
 ```bash
-cd /path/to/shudao-chat(前端根目录)
+# 后端
+cd shudao-go-backend
+cp conf/app.conf.example conf/app.conf  # 首次需要
+bee run
+
+# 前端
+cd shudao-vue-frontend
 npm install
 npm install
-npm run build
+npm run dev
 ```
 ```
 
 
-执行完成后会在根目录生成 `dist/`,结构类似:
-```
-dist/
-  index.html
-  assets/
-    *.js
-    *.css
-    ...
-```
+访问 http://localhost:5173
+
+### 2. 一键打包部署
 
 
-### 2. 将前端产物放入 `shudao-chat-go`
-
-1. 备份旧版本(可选):
-   ```bash
-   cd shudao-chat-go
-   mv views/index.html views/index_$(date +%Y%m%d%H%M%S).html
-   mv assets assets_$(date +%Y%m%d%H%M%S)
-   ```
-2. 拷贝新的 `dist` 产物:
-   ```bash
-   # 回到前端根目录
-   cp dist/index.html shudao-chat-go/views/
-   rsync -av --delete dist/assets/ shudao-chat-go/assets/
-   ```
-   - `views/index.html` 会被 `controllers/frontend.go` 用作模版。
-   - `assets/` 目录被 `main.go` 中的 `beego.SetStaticPath("/assets", "assets")` 映射,前端静态资源必须放在这里。
-3. 若有 `dist` 中的其他静态目录(如 `public` 下复制出的 favicon 等),放入 `shudao-chat-go/static/`,Beego 已映射 `/static` 路径。
-
-### 3. 在本地编译 Linux 版后端
-
-**环境要求**
-- Go 1.24+(与 `go.mod` 中声明一致)
-- 已配置好 GOPROXY(如国内:`https://goproxy.cn,direct`)
-
-**编译命令**
 ```bash
 ```bash
-cd shudao-chat-go
-go mod download
-GOOS=linux GOARCH=amd64 go build -o bin/shudao-chat-go ./main.go
+# 测试环境
+./build_test.sh
 
 
-或者安装bee框架:(go env -w GOPROXY=https://goproxy.cn)//如果下面命令安装不成功先执行这条命令
-go install github.com/beego/bee/v2@latest
-然后运行:bee pack -be GOOS=linux
+# 生产环境
+./build_release.sh
 ```
 ```
 
 
-输出文件:压缩包:shudao-chat-go.tar.gz
+### 3. 服务器部署
 
 
-### 4. 打包并上传到服务器
-
-**上传方式(示例)**
 ```bash
 ```bash
-压缩包拖入/tmp/tmp
+# 上传部署包后
+tar -xzf shudao-go-backend.tar.gz
+cd shudao-go-backend
+nohup ./shudao-go-backend > nohup.out 2>&1 &
 ```
 ```
 
 
-### 5. 服务器部署与运行
-- cd /tmp
-- cd tmp
-- tar xvf shudao-chat-go.tar.gz
-- chmod +x shudao-chat-go
-- 找到进程:ps -ef | grep shudao-chat-go
-- 杀死进程:kill -9 1029395   # 将 12345 替换为你找到的实际PID
-- nohup ./shudao-chat-go & tail -f nohup.out #查看实时状态
+## 配置文件
+
+| 文件 | 说明 |
+|------|------|
+| `conf/app.conf` | 当前环境配置(gitignore) |
+| `conf/app.conf.test` | 测试环境模板 |
+| `conf/app.conf.prod` | 生产环境模板 |
+
+
+## 服务端口
 
 
+| 服务 | 端口 |
+|------|------|
+| 系统后端 | 22001 |
+| Nginx入口 | 22000 |
+| MySQL | 21000 |
+| 认证网关 | 28004 |
+| AI对话服务 | 28002 |
+| ChromaDB | 24000 |
+| AI模型 | 8000 |
+| YOLO | 18080 |
 
 
----
+## Nginx 代理配置
 
 
+```nginx
+location /apiv1 { proxy_pass http://127.0.0.1:22001; }
+location /chatwithai/ { proxy_pass http://127.0.0.1:28002/; }
+location /auth/ { proxy_pass http://127.0.0.1:28004/; }
+location /tts { proxy_pass http://172.16.29.101:22000; }
+```
+
+## 目录结构
 
 
+```
+├── shudao-go-backend/     # Go后端
+│   ├── conf/              # 配置文件
+│   ├── controllers/       # 控制器
+│   ├── models/            # 数据模型
+│   ├── utils/             # 工具函数
+│   └── main.go
+├── shudao-vue-frontend/   # Vue前端
+│   ├── src/
+│   │   ├── views/         # 页面组件
+│   │   ├── utils/         # 工具(apiConfig.js等)
+│   │   └── request/       # API请求
+│   └── vite.config.js
+├── build_release.sh       # 生产环境打包
+├── build_test.sh          # 测试环境打包
+└── nginx.conf             # Nginx配置参考
+```

+ 739 - 0
api-docs.html

@@ -0,0 +1,739 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>蜀道安全AI系统 - API接口文档</title>
+    <style>
+        * { margin: 0; padding: 0; box-sizing: border-box; }
+        body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #fafafa; color: #3b4151; }
+        .header { background: linear-gradient(135deg, #1f8a70 0%, #2d5a4a 100%); color: white; padding: 20px 30px; }
+        .header h1 { font-size: 28px; margin-bottom: 5px; }
+        .header p { opacity: 0.9; font-size: 14px; }
+        .container { max-width: 1800px; margin: 0 auto; padding: 20px; }
+        .api-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; }
+        .api-card { background: white; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.12); overflow: hidden; }
+        .api-card-header { padding: 12px 15px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid #eee; }
+        .method { padding: 4px 10px; border-radius: 4px; font-size: 11px; font-weight: 700; color: white; text-transform: uppercase; }
+        .method.get { background: #61affe; }
+        .method.post { background: #49cc90; }
+        .api-path { font-family: monospace; font-size: 13px; color: #3b4151; word-break: break-all; }
+        .api-card-body { padding: 12px 15px; }
+        .api-title { font-size: 14px; font-weight: 600; color: #3b4151; margin-bottom: 8px; }
+        .api-desc { font-size: 12px; color: #6b7280; line-height: 1.5; margin-bottom: 10px; }
+        .params-title { font-size: 11px; font-weight: 600; color: #1f8a70; margin-bottom: 5px; text-transform: uppercase; }
+        .param-item { font-size: 11px; color: #4b5563; padding: 3px 0; border-bottom: 1px dashed #e5e7eb; }
+        .param-item:last-child { border-bottom: none; }
+        .param-name { font-family: monospace; color: #1f8a70; font-weight: 500; }
+        .param-type { color: #9ca3af; font-size: 10px; }
+        .section-title { font-size: 18px; font-weight: 600; color: #1f8a70; margin: 25px 0 15px; padding-bottom: 8px; border-bottom: 2px solid #1f8a70; }
+        .tag { display: inline-block; padding: 2px 6px; background: #e0f2f1; color: #1f8a70; border-radius: 3px; font-size: 10px; margin-right: 5px; }
+        .response-tag { background: #fef3c7; color: #92400e; }
+        @media (max-width: 1200px) { .api-grid { grid-template-columns: repeat(2, 1fr); } }
+        @media (max-width: 768px) { .api-grid { grid-template-columns: 1fr; } }
+    </style>
+</head>
+<body>
+    <div class="header">
+        <h1>🛡️ 蜀道安全AI系统 API文档</h1>
+        <p>ShuDao SafeAI Backend API v1.0 | 基础路径: /apiv1</p>
+    </div>
+    <div class="container">
+
+        <!-- 认证接口 -->
+        <h2 class="section-title">🔐 认证接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/auth/local_login</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">本地登录</div>
+                    <div class="api-desc">用户名密码登录,返回JWT Token(需配置enable_local_login=true)</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">username</span> <span class="param-type">string</span> - 用户名</div>
+                    <div class="param-item"><span class="param-name">password</span> <span class="param-type">string</span> - 密码</div>
+                    <div class="params-title" style="margin-top:8px">响应</div>
+                    <div class="param-item"><span class="tag response-tag">200</span> token, userInfo</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- AI对话接口 -->
+        <h2 class="section-title">💬 AI对话接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/send_deepseek_message</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">发送DeepSeek消息</div>
+                    <div class="api-desc">发送消息到AI模型,支持安全培训PPT生成、AI写作等业务类型</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">message</span> <span class="param-type">string</span> - 用户消息</div>
+                    <div class="param-item"><span class="param-name">ai_conversation_id</span> <span class="param-type">uint64</span> - 对话ID(可选)</div>
+                    <div class="param-item"><span class="param-name">business_type</span> <span class="param-type">int</span> - 业务类型(1:安全培训,2:AI写作)</div>
+                    <div class="param-item"><span class="param-name">exam_name</span> <span class="param-type">string</span> - 考试名称(可选)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/stream/chat</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">流式聊天 (SSE)</div>
+                    <div class="api-desc">流式输出AI回复,支持RAG检索增强生成</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">message</span> <span class="param-type">string</span> - 用户消息</div>
+                    <div class="param-item"><span class="param-name">model</span> <span class="param-type">string</span> - 模型名称(可选)</div>
+                    <div class="params-title" style="margin-top:8px">响应</div>
+                    <div class="param-item"><span class="tag">SSE</span> text/event-stream</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/stream/chat-with-db</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">流式聊天(数据库集成)</div>
+                    <div class="api-desc">流式聊天并自动保存对话记录到数据库</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">message</span> <span class="param-type">string</span> - 用户消息</div>
+                    <div class="param-item"><span class="param-name">ai_conversation_id</span> <span class="param-type">uint64</span> - 对话ID</div>
+                    <div class="param-item"><span class="param-name">business_type</span> <span class="param-type">int</span> - 业务类型</div>
+                    <div class="param-item"><span class="param-name">online_search_content</span> <span class="param-type">string</span> - 联网搜索内容</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_history_record</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取历史记录</div>
+                    <div class="api-desc">获取当前用户的AI对话历史记录列表</div>
+                    <div class="params-title">请求参数</div>
+                    <div class="param-item">无参数,从Token获取用户ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/delete_conversation</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">删除对话</div>
+                    <div class="api-desc">删除指定的AI对话</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">ai_conversation_id</span> <span class="param-type">uint64</span> - 对话ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/delete_history_record</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">删除历史记录</div>
+                    <div class="api-desc">删除指定的历史记录</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">id</span> <span class="param-type">uint64</span> - 记录ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/intent_recognition</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">意图识别</div>
+                    <div class="api-desc">识别用户输入的意图类型</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">message</span> <span class="param-type">string</span> - 用户消息</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_chromadb_document</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取ChromaDB文档</div>
+                    <div class="api-desc">从向量数据库检索相关文档并生成回答</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">query</span> <span class="param-type">string</span> - 查询内容</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/guess_you_want</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">猜你想问</div>
+                    <div class="api-desc">根据上下文推荐相关问题</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">context</span> <span class="param-type">string</span> - 上下文内容</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_user_recommend_question</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">用户输入推荐问题</div>
+                    <div class="api-desc">用户输入时实时返回推荐问题</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">input</span> <span class="param-type">string</span> - 用户输入内容</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/online_search</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">联网搜索</div>
+                    <div class="api-desc">执行联网搜索获取实时信息</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">query</span> <span class="param-type">string</span> - 搜索关键词</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/save_online_search_result</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">保存联网搜索结果</div>
+                    <div class="api-desc">将联网搜索结果存入AIMessage表</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">content</span> <span class="param-type">string</span> - 搜索结果内容</div>
+                    <div class="param-item"><span class="param-name">ai_message_id</span> <span class="param-type">uint64</span> - 消息ID</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 考试相关接口 -->
+        <h2 class="section-title">📝 考试相关接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/exam/build_prompt</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">生成考试提示词</div>
+                    <div class="api-desc">根据考试配置生成AI提示词</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">exam_config</span> <span class="param-type">object</span> - 考试配置对象</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/exam/build_single_prompt</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">单题生成提示词</div>
+                    <div class="api-desc">为单个题目重新生成提示词</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">question_type</span> <span class="param-type">string</span> - 题目类型</div>
+                    <div class="param-item"><span class="param-name">context</span> <span class="param-type">string</span> - 上下文</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/re_modify_question</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">修改考试题目</div>
+                    <div class="api-desc">修改已生成的考试题目内容</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">ai_conversation_id</span> <span class="param-type">uint64</span> - 对话ID</div>
+                    <div class="param-item"><span class="param-name">content</span> <span class="param-type">string</span> - 新内容</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/re_produce_single_question</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">重新生成单题</div>
+                    <div class="api-desc">重新生成指定的单个考试题目</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">question_id</span> <span class="param-type">uint64</span> - 题目ID</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 隐患识别接口 -->
+        <h2 class="section-title">🔍 隐患识别接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/hazard</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">隐患识别</div>
+                    <div class="api-desc">使用YOLO模型识别图片中的安全隐患,返回标注后的图片</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">scene_name</span> <span class="param-type">string</span> - 场景名称(模型类型)</div>
+                    <div class="param-item"><span class="param-name">image</span> <span class="param-type">string</span> - 图片OSS链接</div>
+                    <div class="param-item"><span class="param-name">date</span> <span class="param-type">string</span> - 日期</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/save_step</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">保存步骤</div>
+                    <div class="api-desc">保存PPT生成步骤、JSON文件和封面图</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">ai_conversation_id</span> <span class="param-type">uint64</span> - 对话ID</div>
+                    <div class="param-item"><span class="param-name">step</span> <span class="param-type">int</span> - 步骤编号</div>
+                    <div class="param-item"><span class="param-name">ppt_json_url</span> <span class="param-type">string</span> - PPT JSON URL</div>
+                    <div class="param-item"><span class="param-name">cover_image</span> <span class="param-type">string</span> - 封面图URL</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_history_recognition_record</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取识别历史记录</div>
+                    <div class="api-desc">获取当前用户的隐患识别历史记录</div>
+                    <div class="params-title">请求参数</div>
+                    <div class="param-item">无参数,从Token获取用户ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_recognition_record_detail</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取识别记录详情</div>
+                    <div class="api-desc">获取指定识别记录的详细信息</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">recognition_record_id</span> <span class="param-type">int64</span> - 记录ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/delete_recognition_record</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">删除识别记录</div>
+                    <div class="api-desc">删除指定的隐患识别历史记录</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">id</span> <span class="param-type">uint64</span> - 记录ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/submit_evaluation</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">提交点评</div>
+                    <div class="api-desc">用户对识别结果提交点评反馈</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">id</span> <span class="param-type">uint</span> - 记录ID</div>
+                    <div class="param-item"><span class="param-name">scene_match</span> <span class="param-type">int</span> - 场景匹配度</div>
+                    <div class="param-item"><span class="param-name">tip_accuracy</span> <span class="param-type">int</span> - 提示准确度</div>
+                    <div class="param-item"><span class="param-name">effect_evaluation</span> <span class="param-type">int</span> - 效果评价</div>
+                    <div class="param-item"><span class="param-name">user_remark</span> <span class="param-type">string</span> - 用户备注</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_latest_recognition_record</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取最新识别记录</div>
+                    <div class="api-desc">查询用户最新的一条识别记录是否已点评</div>
+                    <div class="params-title">请求参数</div>
+                    <div class="param-item">无参数,从Token获取用户ID</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_third_scene_example_image</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取三级场景示例图</div>
+                    <div class="api-desc">获取隐患识别三级场景的正确和错误示例图</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">third_scene_name</span> <span class="param-type">string</span> - 三级场景名称</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- OSS文件上传接口 -->
+        <h2 class="section-title">📁 OSS文件上传接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/oss/upload</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取上传凭证</div>
+                    <div class="api-desc">生成S3预签名上传凭证,用于前端直传OSS</div>
+                    <div class="params-title">响应</div>
+                    <div class="param-item"><span class="param-name">url</span> - 上传地址</div>
+                    <div class="param-item"><span class="param-name">fields</span> - 签名字段</div>
+                    <div class="param-item"><span class="param-name">expire</span> - 过期时间</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/oss/shudao/upload_image</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">上传图片</div>
+                    <div class="api-desc">上传图片到OSS,自动压缩到200KB以下</div>
+                    <div class="params-title">请求参数 (FormData)</div>
+                    <div class="param-item"><span class="param-name">image</span> <span class="param-type">file</span> - 图片文件(≤10MB)</div>
+                    <div class="params-title" style="margin-top:8px">响应</div>
+                    <div class="param-item"><span class="param-name">fileUrl</span> - 代理访问URL</div>
+                    <div class="param-item"><span class="param-name">fileName</span> - 文件名</div>
+                    <div class="param-item"><span class="param-name">fileSize</span> - 文件大小</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/oss/shudao/upload_json</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">上传PPT JSON文件</div>
+                    <div class="api-desc">上传PPT配置JSON文件到OSS</div>
+                    <div class="params-title">请求参数 (FormData)</div>
+                    <div class="param-item"><span class="param-name">json</span> <span class="param-type">file</span> - JSON文件(≤50MB)</div>
+                    <div class="params-title" style="margin-top:8px">响应</div>
+                    <div class="param-item"><span class="param-name">fileUrl</span> - 代理访问URL</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/oss/parse</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">OSS代理解析</div>
+                    <div class="api-desc">代理转发OSS URL请求,解密并获取文件内容</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">url</span> <span class="param-type">string</span> - 加密的OSS URL</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 通用功能接口 -->
+        <h2 class="section-title">🔧 通用功能接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/recommend_question</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取推荐问题</div>
+                    <div class="api-desc">随机返回推荐问题列表</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">limit</span> <span class="param-type">int</span> - 数量(默认5)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_function_card</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取功能卡片</div>
+                    <div class="api-desc">随机返回4条功能卡片</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">function_type</span> <span class="param-type">int</span> - 类型(0:AI问答,1:安全培训)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_hot_question</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取热点问题</div>
+                    <div class="api-desc">随机返回4条热点问题</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">question_type</span> <span class="param-type">int</span> - 类型(0:AI问答,1:安全培训)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/submit_feedback</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">提交意见反馈</div>
+                    <div class="api-desc">用户提交意见反馈信息</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">content</span> <span class="param-type">string</span> - 反馈内容</div>
+                    <div class="param-item"><span class="param-name">contact</span> <span class="param-type">string</span> - 联系方式</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/like_and_dislike</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">点赞/踩</div>
+                    <div class="api-desc">对AI回复进行点赞或踩的反馈</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">id</span> <span class="param-type">uint</span> - 消息ID</div>
+                    <div class="param-item"><span class="param-name">user_feedback</span> <span class="param-type">int</span> - 反馈(1:赞,-1:踩)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_user_data_id</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取用户数据ID</div>
+                    <div class="api-desc">根据account_id获取用户数据主键ID</div>
+                    <div class="params-title">请求参数</div>
+                    <div class="param-item">无参数,从Token获取account_id</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 政策文件接口 -->
+        <h2 class="section-title">📄 政策文件接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_policy_file</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取政策文件列表</div>
+                    <div class="api-desc">分页获取政策文件列表,支持类型筛选和搜索</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">policy_type</span> <span class="param-type">int</span> - 政策类型(0:全部)</div>
+                    <div class="param-item"><span class="param-name">search</span> <span class="param-type">string</span> - 搜索关键词</div>
+                    <div class="param-item"><span class="param-name">page</span> <span class="param-type">int</span> - 页码</div>
+                    <div class="param-item"><span class="param-name">pageSize</span> <span class="param-type">int</span> - 每页数量</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/download_file</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">下载文件</div>
+                    <div class="api-desc">从OSS链接下载文件并返回给前端</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">pdf_oss_download_link</span> <span class="param-type">string</span> - OSS下载链接</div>
+                    <div class="param-item"><span class="param-name">file_name</span> <span class="param-type">string</span> - 自定义文件名(可选)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/policy_file_count</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">政策文件统计</div>
+                    <div class="api-desc">政策文件查看和下载次数+1</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">policy_file_id</span> <span class="param-type">int</span> - 政策文件ID</div>
+                    <div class="param-item"><span class="param-name">action_type</span> <span class="param-type">int</span> - 操作类型(1:查看,2:下载)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/get_file_link</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取文件链接</div>
+                    <div class="api-desc">根据文件名从数据库查找对应的OSS链接</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">file_name</span> <span class="param-type">string</span> - 文件名</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/knowledge/files/advanced-search</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">知识库高级搜索</div>
+                    <div class="api-desc">从ChromaDB向量数据库进行高级文件搜索</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">query_str</span> <span class="param-type">string</span> - 查询字符串</div>
+                    <div class="param-item"><span class="param-name">n_results</span> <span class="param-type">int</span> - 结果数量(默认50)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/save_ppt_outline</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">保存PPT大纲</div>
+                    <div class="api-desc">保存AI生成的PPT大纲内容</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">ai_conversation_id</span> <span class="param-type">uint64</span> - 对话ID</div>
+                    <div class="param-item"><span class="param-name">outline</span> <span class="param-type">string</span> - 大纲内容</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/save_edit_document</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">保存编辑文档</div>
+                    <div class="api-desc">AI写作保存编辑后的文档内容</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">ai_message_id</span> <span class="param-type">uint64</span> - 消息ID</div>
+                    <div class="param-item"><span class="param-name">content</span> <span class="param-type">string</span> - 文档内容</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 积分系统接口 -->
+        <h2 class="section-title">💰 积分系统接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/points/balance</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取积分余额</div>
+                    <div class="api-desc">获取当前用户的积分余额</div>
+                    <div class="params-title">请求参数</div>
+                    <div class="param-item">无参数,从Token获取用户ID</div>
+                    <div class="params-title" style="margin-top:8px">响应</div>
+                    <div class="param-item"><span class="param-name">points</span> - 积分余额</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/points/consume</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">消费积分</div>
+                    <div class="api-desc">消费积分下载文件(每次10积分)</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">file_name</span> <span class="param-type">string</span> - 文件名</div>
+                    <div class="param-item"><span class="param-name">file_url</span> <span class="param-type">string</span> - 文件URL</div>
+                    <div class="params-title" style="margin-top:8px">响应</div>
+                    <div class="param-item"><span class="param-name">new_balance</span> - 新余额</div>
+                    <div class="param-item"><span class="param-name">points_consumed</span> - 消费积分</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/points/history</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取消费记录</div>
+                    <div class="api-desc">分页获取用户的积分消费历史记录</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">page</span> <span class="param-type">int</span> - 页码(默认1)</div>
+                    <div class="param-item"><span class="param-name">pageSize</span> <span class="param-type">int</span> - 每页数量(默认10)</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 埋点记录接口 -->
+        <h2 class="section-title">📊 埋点记录接口</h2>
+        <div class="api-grid">
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/tracking/record</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">记录埋点数据</div>
+                    <div class="api-desc">记录用户行为埋点数据</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">api_path</span> <span class="param-type">string</span> - 接口路径</div>
+                    <div class="param-item"><span class="param-name">method</span> <span class="param-type">string</span> - 请求方法</div>
+                    <div class="param-item"><span class="param-name">extra_data</span> <span class="param-type">string</span> - 额外数据(可选)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/tracking/records</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取埋点记录</div>
+                    <div class="api-desc">分页获取埋点记录列表</div>
+                    <div class="params-title">请求参数 (Query)</div>
+                    <div class="param-item"><span class="param-name">user_id</span> <span class="param-type">int</span> - 用户ID(可选)</div>
+                    <div class="param-item"><span class="param-name">api_path</span> <span class="param-type">string</span> - 接口路径(可选)</div>
+                    <div class="param-item"><span class="param-name">page</span> <span class="param-type">int</span> - 页码(默认1)</div>
+                    <div class="param-item"><span class="param-name">page_size</span> <span class="param-type">int</span> - 每页数量(默认20)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method post">POST</span>
+                    <span class="api-path">/apiv1/tracking/api_mapping</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">添加接口映射</div>
+                    <div class="api-desc">添加接口路径到名称的映射关系</div>
+                    <div class="params-title">请求参数 (Body JSON)</div>
+                    <div class="param-item"><span class="param-name">api_path</span> <span class="param-type">string</span> - 接口路径</div>
+                    <div class="param-item"><span class="param-name">api_name</span> <span class="param-type">string</span> - 接口名称</div>
+                    <div class="param-item"><span class="param-name">api_desc</span> <span class="param-type">string</span> - 接口描述(可选)</div>
+                </div>
+            </div>
+            <div class="api-card">
+                <div class="api-card-header">
+                    <span class="method get">GET</span>
+                    <span class="api-path">/apiv1/tracking/api_mappings</span>
+                </div>
+                <div class="api-card-body">
+                    <div class="api-title">获取接口映射列表</div>
+                    <div class="api-desc">获取所有接口路径映射关系</div>
+                    <div class="params-title">请求参数</div>
+                    <div class="param-item">无参数</div>
+                </div>
+            </div>
+        </div>
+
+        <div style="text-align:center; padding:30px; color:#9ca3af; font-size:12px;">
+            <p>蜀道安全AI系统 API文档 v1.0 | 共 <strong>45</strong> 个接口</p>
+            <p>基础路径: <code>/apiv1</code> | 认证方式: JWT Token (Header: Authorization)</p>
+            <p>生成时间: 2024年12月</p>
+        </div>
+    </div>
+</body>
+</html>

+ 116 - 0
build_release.sh

@@ -0,0 +1,116 @@
+#!/bin/bash
+
+# 遇到错误立即退出
+set -e
+
+echo "========================================================"
+echo "      ShuDao SafeAI 生产环境一键部署脚本 (Linux)"
+echo "========================================================"
+echo ""
+
+# 设置路径变量
+ROOT_DIR=$(pwd)
+FRONTEND_DIR="$ROOT_DIR/shudao-vue-frontend"
+BACKEND_DIR="$ROOT_DIR/shudao-go-backend"
+DEPLOY_DIR="/opt/www/shudao-go-backend"
+SERVICE_NAME="shudao-go-backend"
+SERVICE_PORT=22001
+
+# 1. 前端构建
+echo "[1/8] 正在构建前端项目 (Vue)..."
+cd "$FRONTEND_DIR"
+npm run build
+if [ $? -ne 0 ]; then
+    echo "[ERROR] 前端构建失败!请检查错误信息。"
+    exit 1
+fi
+echo "[SUCCESS] 前端构建完成。"
+echo ""
+
+# 2. 清理后端旧资源
+echo "[2/8] 清理后端旧资源..."
+cd "$ROOT_DIR"
+rm -rf "$BACKEND_DIR/assets" 2>/dev/null || true
+rm -f "$BACKEND_DIR/views/index.html" 2>/dev/null || true
+echo "[SUCCESS] 清理完成。"
+echo ""
+
+# 3. 复制新资源
+echo "[3/8] 整合前端资源到后端..."
+mkdir -p "$BACKEND_DIR/assets"
+mkdir -p "$BACKEND_DIR/views"
+cp -r "$FRONTEND_DIR/dist/assets/"* "$BACKEND_DIR/assets/"
+cp "$FRONTEND_DIR/dist/index.html" "$BACKEND_DIR/views/index.html"
+echo "[SUCCESS] 资源整合完成。"
+echo ""
+
+# 4. 复制生产环境配置
+echo "[4/8] 复制生产环境配置..."
+mkdir -p "$BACKEND_DIR/conf"
+cp "$BACKEND_DIR/conf/app.conf.prod" "$BACKEND_DIR/conf/app.conf"
+echo "[SUCCESS] 配置文件已更新为生产环境。"
+echo ""
+
+# 5. 后端编译 (Linux amd64)
+echo "[5/8] 正在编译后端 (Target: Linux/amd64)..."
+cd "$BACKEND_DIR"
+GOOS=linux GOARCH=amd64 go build -o $SERVICE_NAME main.go
+if [ $? -ne 0 ]; then
+    echo "[ERROR] 后端编译失败!"
+    exit 1
+fi
+chmod +x $SERVICE_NAME
+echo "[SUCCESS] 后端编译完成。"
+echo ""
+
+# 6. 停止旧服务
+echo "[6/8] 停止旧服务..."
+pkill -f $SERVICE_NAME 2>/dev/null || true
+sleep 1
+# 确认服务已停止
+if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+    echo "[WARNING] 服务未完全停止,强制终止..."
+    pkill -9 -f $SERVICE_NAME 2>/dev/null || true
+    sleep 1
+fi
+echo "[SUCCESS] 旧服务已停止。"
+echo ""
+
+# 7. 部署到目标目录
+echo "[7/8] 部署到 $DEPLOY_DIR..."
+mkdir -p "$DEPLOY_DIR"
+cp "$BACKEND_DIR/$SERVICE_NAME" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/conf" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/assets" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/views" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/static" "$DEPLOY_DIR/" 2>/dev/null || true
+echo "[SUCCESS] 部署完成。"
+echo ""
+
+# 8. 启动新服务
+echo "[8/8] 启动新服务..."
+cd "$DEPLOY_DIR"
+nohup ./$SERVICE_NAME > nohup.out 2>&1 &
+sleep 3
+
+# 检查服务状态
+if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+    echo "[SUCCESS] 服务已启动!"
+    echo ""
+    echo "========================================================"
+    echo "              生产环境部署完成!"
+    echo "========================================================"
+    echo ""
+    echo "服务状态: 运行中"
+    echo "服务端口: $SERVICE_PORT"
+    echo "部署目录: $DEPLOY_DIR"
+    echo "日志文件: $DEPLOY_DIR/nohup.out"
+    echo ""
+    echo "查看日志: tail -f $DEPLOY_DIR/nohup.out"
+    echo ""
+else
+    echo "[ERROR] 服务启动失败!"
+    echo "请检查日志:"
+    tail -20 "$DEPLOY_DIR/nohup.out"
+    exit 1
+fi

+ 116 - 0
build_test.sh

@@ -0,0 +1,116 @@
+#!/bin/bash
+
+# 遇到错误立即退出
+set -e
+
+echo "========================================================"
+echo "      ShuDao SafeAI 测试环境一键部署脚本 (Linux)"
+echo "========================================================"
+echo ""
+
+# 设置路径变量
+ROOT_DIR=$(pwd)
+FRONTEND_DIR="$ROOT_DIR/shudao-vue-frontend"
+BACKEND_DIR="$ROOT_DIR/shudao-go-backend"
+DEPLOY_DIR="/opt/www/shudao-go-backend"
+SERVICE_NAME="shudao-go-backend"
+SERVICE_PORT=22001
+
+# 1. 前端构建
+echo "[1/8] 正在构建前端项目 (Vue)..."
+cd "$FRONTEND_DIR"
+npm run build
+if [ $? -ne 0 ]; then
+    echo "[ERROR] 前端构建失败!请检查错误信息。"
+    exit 1
+fi
+echo "[SUCCESS] 前端构建完成。"
+echo ""
+
+# 2. 清理后端旧资源
+echo "[2/8] 清理后端旧资源..."
+cd "$ROOT_DIR"
+rm -rf "$BACKEND_DIR/assets" 2>/dev/null || true
+rm -f "$BACKEND_DIR/views/index.html" 2>/dev/null || true
+echo "[SUCCESS] 清理完成。"
+echo ""
+
+# 3. 复制新资源
+echo "[3/8] 整合前端资源到后端..."
+mkdir -p "$BACKEND_DIR/assets"
+mkdir -p "$BACKEND_DIR/views"
+cp -r "$FRONTEND_DIR/dist/assets/"* "$BACKEND_DIR/assets/"
+cp "$FRONTEND_DIR/dist/index.html" "$BACKEND_DIR/views/index.html"
+echo "[SUCCESS] 资源整合完成。"
+echo ""
+
+# 4. 复制测试环境配置
+echo "[4/8] 复制测试环境配置..."
+mkdir -p "$BACKEND_DIR/conf"
+cp "$BACKEND_DIR/conf/app.conf.test" "$BACKEND_DIR/conf/app.conf"
+echo "[SUCCESS] 配置文件已更新为测试环境。"
+echo ""
+
+# 5. 后端编译 (Linux amd64)
+echo "[5/8] 正在编译后端 (Target: Linux/amd64)..."
+cd "$BACKEND_DIR"
+GOOS=linux GOARCH=amd64 go build -o $SERVICE_NAME main.go
+if [ $? -ne 0 ]; then
+    echo "[ERROR] 后端编译失败!"
+    exit 1
+fi
+chmod +x $SERVICE_NAME
+echo "[SUCCESS] 后端编译完成。"
+echo ""
+
+# 6. 停止旧服务
+echo "[6/8] 停止旧服务..."
+pkill -f $SERVICE_NAME 2>/dev/null || true
+sleep 1
+# 确认服务已停止
+if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+    echo "[WARNING] 服务未完全停止,强制终止..."
+    pkill -9 -f $SERVICE_NAME 2>/dev/null || true
+    sleep 1
+fi
+echo "[SUCCESS] 旧服务已停止。"
+echo ""
+
+# 7. 部署到目标目录
+echo "[7/8] 部署到 $DEPLOY_DIR..."
+mkdir -p "$DEPLOY_DIR"
+cp "$BACKEND_DIR/$SERVICE_NAME" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/conf" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/assets" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/views" "$DEPLOY_DIR/"
+cp -r "$BACKEND_DIR/static" "$DEPLOY_DIR/" 2>/dev/null || true
+echo "[SUCCESS] 部署完成。"
+echo ""
+
+# 8. 启动新服务
+echo "[8/8] 启动新服务..."
+cd "$DEPLOY_DIR"
+nohup ./$SERVICE_NAME > nohup.out 2>&1 &
+sleep 3
+
+# 检查服务状态
+if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+    echo "[SUCCESS] 服务已启动!"
+    echo ""
+    echo "========================================================"
+    echo "              测试环境部署完成!"
+    echo "========================================================"
+    echo ""
+    echo "服务状态: 运行中"
+    echo "服务端口: $SERVICE_PORT"
+    echo "部署目录: $DEPLOY_DIR"
+    echo "日志文件: $DEPLOY_DIR/nohup.out"
+    echo ""
+    echo "查看日志: tail -f $DEPLOY_DIR/nohup.out"
+    echo ""
+else
+    echo "[ERROR] 服务启动失败!"
+    echo "请检查日志:"
+    tail -20 "$DEPLOY_DIR/nohup.out"
+    exit 1
+fi

BIN
dist/assets/1-B36XbbwA.png


BIN
dist/assets/1-Bqw91QeI.png


BIN
dist/assets/1-BusD92L7.png


BIN
dist/assets/1-Dj1j5ddA.png


BIN
dist/assets/10-fqbnRryi.png


BIN
dist/assets/11-7l3W5DeQ.png


BIN
dist/assets/12-DEN8e9Vv.png


BIN
dist/assets/13-BL3zSFtZ.png


BIN
dist/assets/13-Bv7KwdLX.png


BIN
dist/assets/13-CcUgOE0U.png


BIN
dist/assets/15-5aSMwcYf.png


BIN
dist/assets/16-CdNGEq1M.png


BIN
dist/assets/18-2AEZNH7q.png


BIN
dist/assets/18-CEUBeFPE.png


BIN
dist/assets/19-DzDaxNt7.png


BIN
dist/assets/2-BidY8fbj.png


BIN
dist/assets/2-Cw3SUKtJ.png


BIN
dist/assets/2-DNbvF9Ja.jpg


BIN
dist/assets/2-G3awVIMi.png


BIN
dist/assets/2-dXZ0SRRr.png


BIN
dist/assets/20-CH9VEtNe.png


BIN
dist/assets/21-BTsblUui.png


BIN
dist/assets/22-PHJtTrlQ.png


BIN
dist/assets/26-BsA4Ghua.png


BIN
dist/assets/27-Dd_EQ7v1.png


BIN
dist/assets/29-B03QHNcz.png


BIN
dist/assets/3-DQsDb2Wr.png


BIN
dist/assets/3-N-JnaHAs.png


BIN
dist/assets/3-cYQ4_7jA.png


BIN
dist/assets/4-DHzSAirS.png


BIN
dist/assets/5-CIylGsDd.png


BIN
dist/assets/6-Bdy5I3eE.png


BIN
dist/assets/6-VAD6vh2A.png


BIN
dist/assets/6-XEd9sn-3.png


BIN
dist/assets/7-1jnTdOqk.png


BIN
dist/assets/7-CUlrfWWC.png


BIN
dist/assets/8-DzJOoBe0.png


BIN
dist/assets/9-C2owFl4j.png


BIN
dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2


BIN
dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff


BIN
dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf


BIN
dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf


BIN
dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff


BIN
dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2


BIN
dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff


BIN
dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2


BIN
dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf


BIN
dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf


BIN
dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff


BIN
dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2


BIN
dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf


BIN
dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2


BIN
dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff


BIN
dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2


BIN
dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff


BIN
dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf


BIN
dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2


BIN
dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf


BIN
dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff


BIN
dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf


BIN
dist/assets/KaTeX_Main-Italic-BMLOBm91.woff


BIN
dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2


BIN
dist/assets/KaTeX_Main-Regular-B22Nviop.woff2


BIN
dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff


BIN
dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf


BIN
dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf


BIN
dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2


BIN
dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff


BIN
dist/assets/KaTeX_Math-Italic-DA0__PXp.woff


BIN
dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf


BIN
dist/assets/KaTeX_Math-Italic-t53AETM-.woff2


BIN
dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf


BIN
dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2


BIN
dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff


BIN
dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2


BIN
dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff


BIN
dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf


BIN
dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf


BIN
dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff


BIN
dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2


BIN
dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf


BIN
dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2


BIN
dist/assets/KaTeX_Script-Regular-D5yQViql.woff


BIN
dist/assets/KaTeX_Size1-Regular-C195tn64.woff


BIN
dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf


BIN
dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2


BIN
dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf


BIN
dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2


BIN
dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff


BIN
dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff


BIN
dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf


BIN
dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff


BIN
dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf


BIN
dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно