# 选品中心系统 API 文档 ## 基础信息 - **项目名称**: 选品中心 (centerBook) - **Base URL**: `http://localhost:9009` - **API 版本**: v2.0 - **数据格式**: JSON - **字符编码**: UTF-8 - **基础技术栈**: Go 1.24 + Gin + Elasticsearch + MySQL + Redis --- ## 目录 - [通用说明](#通用说明) - [一、ES 图书搜索接口](#一es-图书搜索接口) - [二、ES 图书管理接口(新版 Controller)](#二es-图书管理接口新版-controller) - [三、ES 图书管理接口(旧版 Service)](#三es-图书管理接口旧版-service) - [四、API 监控接口](#四api-监控接口) - [五、ERP 接口](#五erp-接口) - [六、WebSocket](#六websocket) - [七、定价加密/解密接口(已注释)](#七定价加密解密接口已注释) - [八、SQL 健康监控接口(已注释)](#八sql-健康监控接口已注释) - [九、图书管理接口 MySQL 版(已注释)](#九图书管理接口-mysql-版已注释) - [附录:ESBook 完整字段说明](#附录esbook-完整字段说明) - [附录:通用错误码](#附录通用错误码) - [附录:curl 请求示例汇总](#附录curl-请求示例汇总) --- ## 通用说明 ### 成功响应格式 ```json { "code": 200, "message": "success", "data": { ... } } ``` ### 错误响应格式 ```json { "error": "错误描述", "details": "详细错误信息" } ``` ### 分页响应格式 ```json { "current_page": 1, "data": [...], "per_page": 10, "total": 100 } ``` ### 全局中间件 所有请求经过以下中间件处理: | 中间件 | 说明 | |--------|------| | **CORS** | 允许来源: `localhost:82`, `103.236.91.138:9009`, `test.centerbook.buzhiyushu.cn`, `centerbook.buzhiyushu.cn` | | **RequestAuditLogger** | 统一请求审计日志(记录 endpoint、URI、状态码、IP、UA、耗时) | | **NotFoundHandler** | 未匹配路由统一处理(记录 404 来源) | ### 响应字段说明 | 字段 | 说明 | |------|------| | `fix_price` | 定价,单位为 **分**(需除以 100 转换为元) | | `update_time` | 更新时间,Unix 时间戳(秒) | | `publication_time` | 出版时间,格式为 `2006-01` | | `page` | 页码,从 **1** 开始 | | `per_page` / `pageSize` | 每页数量,最大支持 **1000** | | `book_pic` | 图片对象,格式: `{"localPath": "", "pddPath": "http://..."}` | | `book_pic_s` | 小图对象,格式: `{"localPath": "", "pddResponse": "http://..."}` | --- ## 一、ES 图书搜索接口 ### 1.1 ISBN 模糊搜索 ``` GET /api/es/searchByISBNLike ``` **功能说明**: 根据 ISBN 进行模糊搜索,优先查 Redis,未命中则查询 ES,并异步从孔夫子抓取补充数据。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号(支持模糊匹配) | **响应示例**: ```json { "code": 200, "message": "success", "data": [ { "id": 123456, "book_name": "Go语言编程", "isbn": "9787111111111", "author": "作者名", "publisher": "清华大学出版社", "category": "图书/计算机/编程", "fix_price": 9900, "book_pic": {"localPath": "", "pddPath": "http://example.com/image.jpg"}, "book_pic_s": {"localPath": "", "pddResponse": "http://example.com/image_s.jpg"}, "sell_counts": 100, "buy_counts": 500, "day_sale_7": 10, "day_sale_15": 25, "day_sale_30": 60, "total_sale": 1000 } ] } ``` --- ### 1.2 ISBN 精确搜索 ``` GET /api/es/searchByISBN ``` **功能说明**: 根据 ISBN 精确查询图书信息,支持 Redis 缓存、数据库和外部 API 三级回退查询。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号(精确匹配) | **响应示例**: ```json { "code": 200, "message": "success", "data": { "id": 123456, "book_name": "Go语言编程", "isbn": "9787111111111", "author": "作者名", "publisher": "清华大学出版社", "fix_price": 9900, "book_pic": {"localPath": "", "pddPath": "http://example.com/image.jpg"}, "book_pic_s": {"localPath": "", "pddResponse": ""}, "sell_counts": 100, "buy_counts": 500, "day_sale_7": 10, "day_sale_15": 25, "day_sale_30": 60, "day_sale_180": 200, "day_sale_365": 800, "total_sale": 1000, "is_suit": 0, "is_illegal": 0, "is_return": 0, "update_time": "1705228800" }, "source": "es" } ``` > **数据来源说明**: `source` 字段标识数据来源,取值: `redis` / `database` / `external_api` / `es` --- ### 1.3 咸鱼商品下架回调搜索 ``` GET /api/es/searchByISBNByXyCallBack ``` **功能说明**: 为咸鱼(Xianyu)商品下架回调提供的 ISBN 精确搜索接口。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号 | **响应**: 同 [1.2 ISBN 精确搜索](#12-isbn-精确搜索) --- ### 1.4 PSI 系统搜索 ``` GET /api/es/searchByISBNtoPsi ``` **功能说明**: 为 PSI 系统提供的 ISBN 精确搜索接口,返回包含 `cat_id` (类目信息)的完整数据。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号 | **响应示例**: ```json { "code": 200, "message": "success", "data": { "id": 123456, "book_name": "Go语言编程", "isbn": "9787111111111", "cat_id": { "pin_duo_duo_cat_id": "12345", "kong_fu_zi_cat_id": "67890", "xian_yu_cat_id": "11121" }, "...": "..." } } ``` --- ### 1.5 书名搜索 ``` GET /api/es/searchByBookName ``` **功能说明**: 根据书名进行模糊搜索。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | book_name | string | 是 | 书名(支持模糊匹配) | | page | int | 否 | 页码,默认 1 | | size | int | 否 | 每页数量,默认 10 | **响应示例**: ```json { "code": 200, "message": "success", "data": [...], "count": 50 } ``` --- ### 1.6 全字段搜索 ``` GET /api/es/searchAll ``` **功能说明**: 在所有文本字段(书名、作者、ISBN、出版社等)中进行关键词搜索。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | q | string | 是 | 搜索关键词 | | page | int | 否 | 页码,默认 1 | | size | int | 否 | 每页数量,默认 10 | **响应示例**: ```json { "code": 200, "message": "success", "data": [...], "count": 100 } ``` --- ### 1.7 条件搜索图书基础信息(新版) ``` GET /api/es/getBookBaseInfoES ``` **功能说明**: 根据多条件查询 ES 图书信息(新版 Controller 重构版本)。支持精确匹配、范围查询、模糊搜索等。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | page | int | 否 | 页码,默认 1 | | pageSize / per_page | int | 否 | 每页数量,默认 10 | | saleSelect | string | 否 | 销量维度选择: `7`(7天), `15`, `30`, `60`, `90`, `180`, `365`, `0`(今年), `1`(去年) | | book_name | string | 否 | 书名(精确匹配) | | isbn | string | 否 | ISBN(精确匹配) | | author | string | 否 | 作者(精确匹配) | | category | string | 否 | 分类(模糊匹配) | | publisher | string | 否 | 出版社(精确匹配) | | publication_time | string | 否 | 出版时间范围,逗号分隔,如 `2000,2020` | | binding_layout | string | 否 | 装帧 | | fix_price | string | 否 | 定价范围,如 `1000,5000`(分为单位) | | isSuit | string | 否 | 是否套装: `0`(否), `1`(是) | | is_return | string | 否 | 是否驳回: `0`(否), `1`(是) | | is_filter | string | 否 | 过滤字段 | | book_pic | string | 否 | 是否有图: `0`(无图), `1`(有图) | | picType | string | 否 | 图片类型: `1`(官图), `2`(小图) | | buy_counts | string | 否 | 购买次数范围,如 `100,1000`(受 saleSelect 影响) | | sell_counts | string | 否 | 在售数量范围,如 `10,1000` | | day_sale_7 ~ day_sale_365 | string | 否 | 各维度销量范围 | | this_year_sale | string | 否 | 今年销量范围 | | last_year_sale | string | 否 | 去年销量范围 | | totalSale_range | string | 否 | 总销量范围 | | id | string | 否 | ES 文档 ID | | page_count | string | 否 | 页数 | | word_count | string | 否 | 字数 | | kongfz_categories | string | 否 | 孔夫子分类列表,多个用逗号分隔 | | kongfz_include | int8 | 否 | 是否涵盖: `1`(是), `2`(否) | | shopType | string | 否 | 店铺类型 | **响应示例**: ```json { "current_page": 1, "data": [ { "id": 123456, "book_name": "Go语言编程", "book_pic": {"localPath": "", "pddPath": "http://example.com/image.jpg"}, "book_pic_s": {"localPath": "", "pddResponse": ""}, "book_pic_b": "", "book_pic_w": {}, "book_def_pic": {"localPath": "", "pddPath": ""}, "isbn": "9787111111111", "author": "作者名", "category": "图书/计算机/编程", "publisher": "清华大学出版社", "publication_time": "2020-01", "binding_layout": "平装", "fix_price": 9900, "content": "图书简介内容", "is_suit": 0, "day_sale_7": 10, "day_sale_15": 25, "day_sale_30": 60, "day_sale_60": 120, "day_sale_90": 200, "day_sale_180": 400, "day_sale_365": 800, "this_year_sale": 50, "last_year_sale": 800, "total_sale": 1500, "buy_counts": 500, "sell_counts": 100, "book_pic_obj": {}, "book_pic_obj_s": {}, "update_time": "1705228800", "is_illegal": 0, "is_return": 0, "is_filter": "", "page_count": "300", "word_count": "200000", "book_format": "16", "other": {} } ], "per_page": 10, "total": 156 } ``` --- ### 1.8 批量获取图书基础信息 ``` GET /api/es/batchGetBookBaseInfoES ``` **功能说明**: 为核价软件提供的批量获取接口,根据条件批量查询 ES 图书信息。 **请求参数**: 同 [1.7](#17-条件搜索图书基础信息新版),增加以下参数: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbns | string | 否 | ISBN 列表,逗号分隔(最多 50 个) | **响应示例**: ```json { "code": 200, "message": "success", "data": [...], "count": 50 } ``` --- ### 1.9 多条件高级搜索 ``` GET /api/es/searchAdvanced ``` **功能说明**: 多条件 AND 逻辑高级搜索,所有参数同时参与过滤。 **请求参数**: 同 [1.7](#17-条件搜索图书基础信息新版) **响应**: 同 [1.7](#17-条件搜索图书基础信息新版) --- ### 1.10 ID 范围计数 ``` GET /api/es/countByIDRange ``` **功能说明**: 统计指定 ID 范围内的文档数量。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | minID | int | 是 | 最小 ID | | maxID | int | 是 | 最大 ID | **响应示例**: ```json { "code": 200, "minID": 1, "maxID": 100000, "count": 50000 } ``` --- ## 二、ES 图书管理接口(新版 Controller) ### 2.1 添加/更新图书 ``` POST /api/es/addBookToES ``` **功能说明**: 根据 ISBN 查询 ES 中是否存在,不存在则新增数据,存在则根据参数更新。同时同步数据到 Redis。 **请求体** (JSON): ```json { "book_name": "Go语言编程实战", "isbn": "9787111122222", "author": "作者名", "publisher": "出版社", "category": "图书/计算机/编程", "fix_price": 8900, "binding_layout": "平装", "publication_time": "2023-01", "content": "图书简介", "book_pic": { "localPath": "", "pddPath": "http://example.com/image.jpg" }, "book_pic_s": { "localPath": "", "pddResponse": "http://example.com/image_s.jpg" }, "is_suit": 0, "day_sale_7": 0, "day_sale_15": 0, "day_sale_30": 0, "day_sale_60": 0, "day_sale_90": 0, "day_sale_180": 0, "day_sale_365": 0, "this_year_sale": 0, "last_year_sale": 0, "total_sale": 0, "buy_counts": 0, "sell_counts": 0 } ``` **响应示例**: ```json { "data": { "id": 123457, "book_name": "Go语言编程实战", "isbn": "9787111122222", "...": "..." }, "source": "service" } ``` > `source` 字段: `es`(已存在,从 ES 返回) / `service`(新增插入) --- ### 2.2 更新图书字段 ``` POST /api/es/updateBookFieldsByISBN ``` **功能说明**: 根据 ISBN 通用更新图书字段,支持动态指定要更新的字段。 - data 中的所有字段(含 `is_suit`)都会更新到 v2 索引 - `is_suit=1` 时,额外将文档同步到 `books-from-mysql-v3` 索引(存在则覆盖,不存在则新增) - `is_suit=0` 时,额外从 `books-from-mysql-v3` 索引中删除该 ISBN 的文档 - 同步 Redis(db1),包含完整数据含 `cat_id` **请求体** (JSON): ```json { "isbn": "9787111111111", "data": { "fix_price": 8800, "author": "新作者名", "is_suit": 1 } } ``` **参数说明**: | 参数 | 位置 | 类型 | 必需 | 说明 | |------|------|------|------|------| | `isbn` | body | string | 是 | ISBN 号 | | `data` | body | object | 是 | 要更新的字段键值对 | | `data.is_suit` | body.data | int | 否 | 1→同步到v3,0→从v3删除,不传→不操作v3 | **响应示例**: ```json { "code": 200, "message": "success", "isbn": "9787111111111", "updated": 1, "fields_updated": 3, "updated_fields": ["fix_price", "author", "total_sale"] } ``` --- ### 2.3 更新商品分类 ``` POST /api/es/updateBookCatIdByISBN ``` **功能说明**: 根据 ISBN 更新商品分类字段(cat_id),支持拼多多、孔夫子、闲鱼三个平台的分类同时更新或只更新传入平台的分类。 **请求体** (JSON): ```json { "isbn": "9787111111111", "data": { "cat_id": { "pin_duo_duo_cat_id": "12345", "kong_fu_zi_cat_id": "67890", "xian_yu_cat_id": "11121" } } } ``` **响应示例**: ```json { "code": 200, "message": "success", "isbn": "9787111111111", "updated": 1, "fields_updated": 1, "updated_fields": ["cat_id"] } ``` --- ### 2.4 根据 ISBN 删除图书 ``` GET /api/es/DeleteBookByISBN ``` **功能说明**: 根据 ISBN 删除 ES 中的图书数据。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号 | **响应示例**: ```json { "code": 200, "message": "删除成功" } ``` --- ### 2.5 根据 ID 删除图书 ``` GET /api/es/DeleteBookByID ``` **功能说明**: 根据 ES 文档 ID 删除图书数据。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | id | string | 是 | ES 文档 ID | **响应示例**: ```json { "code": 200, "message": "删除成功", "data": { "id": "123456", "deleted": true } } ``` --- ## 三、ES 图书管理接口(旧版 Service) ### 3.1 更新在售数量(自动获取) ``` POST /api/es/updateSellCountsByISBN ``` **功能说明**: 根据 ISBN 调用 Tail 外部 API 获取在售数量并更新到 ES。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号 | **响应示例**: ```json { "code": 200, "message": "success", "data": { "isbn": "9787111111111", "on_sale_count": 150, "async": true } } ``` > `async: true` 表示操作为异步执行 --- ### 3.2 直接更新在售数量 ``` POST /api/es/updateSellCountsDirect ``` **功能说明**: 按入参直接更新在售数量到 ES。 **请求体** (JSON): ```json { "isbn": "9787111111111", "sell_counts": 100 } ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "isbn": "9787111111111", "sell_counts": 100, "async": true } } ``` --- ### 3.3 更新套装标记 ``` POST /api/es/updateBookSuitByISBN ``` **功能说明**: 根据 ISBN 自动判断书名是否包含套装关键字并更新 `is_suit` 字段。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号 | **响应示例**: ```json { "code": 200, "message": "success", "data": { "isbn": "9787111111111", "book_name": "Go语言编程(套装全三册)", "is_suit": 1, "updated": 1, "contains_suit_keyword": true } } ``` --- ### 3.4 完整插入图书 ``` POST /api/es/addBookFullToES ``` **功能说明**: 完整插入接口,支持所有 ESBook 字段,`book_name` 强制要求 string 类型。 **请求体** (JSON): ```json { "book_name": "Go语言编程", "isbn": "9787111111111", "author": "作者名", "publisher": "清华大学出版社", "category": "图书/计算机/编程", "publication_time": "2020-01", "binding_layout": "平装", "fix_price": 9900, "content": "图书简介内容", "is_suit": 0, "book_pic": {"localPath": "", "pddPath": "http://example.com/image.jpg"}, "book_pic_s": {"localPath": "", "pddResponse": "http://example.com/image_s.jpg"}, "book_pic_b": "", "book_pic_w": {}, "day_sale_7": 0, "day_sale_15": 0, "day_sale_30": 0, "day_sale_60": 0, "day_sale_90": 0, "day_sale_180": 0, "day_sale_365": 0, "this_year_sale": 0, "last_year_sale": 0, "total_sale": 0, "buy_counts": 0, "sell_counts": 0, "is_illegal": 0, "is_return": 0, "is_filter": "" } ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "id": 123457, "result": "created" } } ``` --- ### 3.5 批量插入图书 ``` POST /api/es/batchAddBookToES ``` **功能说明**: 批量插入多本图书到 ES,单次最多 100 本。 **请求体** (JSON): ```json { "books": [ { "book_name": "Go语言编程", "isbn": "9787111111111", "author": "作者1", "publisher": "出版社1", "fix_price": 9900 }, { "book_name": "Python实战", "isbn": "9787111133333", "author": "作者2", "publisher": "出版社2", "fix_price": 8900 } ] } ``` **响应示例**: ```json { "code": 200, "message": "批量插入完成", "data": { "total_count": 2, "success_count": 2, "failed_count": 0, "results": [ { "index": 0, "isbn": "9787111111111", "success": true, "document": "9787111111111" }, { "index": 1, "isbn": "9787111133333", "success": true, "document": "9787111133333" } ] } } ``` --- ### 3.6 检查图书是否存在 ``` GET /api/es/checkBookExists POST /api/es/checkBookExists ``` **功能说明**: 根据 ISBN 检查书籍是否在 ES 中存在,支持 GET 和 POST 两种方式。 **请求参数** (GET): | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isbn | string | 是 | ISBN 号 | **请求体** (POST): ```json { "isbn": "9787111111111" } ``` **响应示例**: ```json { "code": 200, "success": true, "data": { "exists": true, "isbn": "9787111111111", "book_id": "123456", "book_name": "Go语言编程", "message": "书籍存在" } } ``` --- ### 3.7 检查套装书 ``` GET /api/es/checkBookSuit ``` **功能说明**: 检查书名是否包含套装关键字(如"套装"、"全册"等)。 **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | bookName | string | 是 | 书名 | **响应示例**: ```json { "code": 200, "message": "success", "data": { "book_name": "Go语言编程(套装全三册)", "is_suit": true } } ``` --- ## 四、API 监控接口 > API 监控用于追踪 ES 和 Redis 调用的性能指标,支持实时统计和历史查询。 ### 4.1 获取指定 API 统计 ``` GET /api/api-monitor/stats ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | endpoint | string | 是 | 接口端点名称,如 `/api/es/searchByISBN` | **响应示例**: ```json { "status": "success", "data": { "endpoint": "/api/es/searchByISBN", "total_calls": 1500, "success_calls": 1490, "failed_calls": 10, "avg_duration_ms": 45.5, "max_duration_ms": 1200, "min_duration_ms": 5, "total_es_calls": 800, "total_redis_calls": 700, "qps": 2.5 }, "timestamp": "2025-01-14 10:30:00" } ``` --- ### 4.2 获取所有 API 统计 ``` GET /api/api-monitor/all-stats ``` **功能说明**: 获取所有被监控接口的统计信息,按接口名排序。 **响应示例**: ```json { "status": "success", "data": [ { "endpoint": "/api/es/searchByISBN", "total_calls": 1500, "...": "..." } ], "count": 5, "timestamp": "2025-01-14 10:30:00" } ``` --- ### 4.3 获取 ES 调用记录 ``` GET /api/api-monitor/es-calls ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | endpoint | string | 是 | 接口端点名称 | | page | int | 否 | 页码,默认 1 | | page_size | int | 否 | 每页数量,默认 50,最大 500 | **响应示例**: ```json { "status": "success", "data": { "calls": [ { "id": 1, "timestamp": "2025-01-14 10:30:00", "duration_ms": 35, "success": true, "operation": "search", "index": "books-from-mysql-v2", "query": "{...}" } ], "count": 50, "total": 800, "page": 1, "page_size": 50, "total_pages": 16 }, "timestamp": "2025-01-14 10:30:00" } ``` --- ### 4.4 获取 Redis 调用记录 ``` GET /api/api-monitor/redis-calls ``` **请求参数**: 同 [4.3](#43-获取-es-调用记录) **响应**: 同 [4.3](#43-获取-es-调用记录)(返回 Redis 调用记录) --- ### 4.5 获取调用详情 ``` GET /api/api-monitor/call-detail ``` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | endpoint | string | 是 | 接口端点名称 | | call_id | string | 是 | 调用记录 ID | | type | string | 是 | 调用类型: `es` 或 `redis` | **响应示例**: ```json { "status": "success", "data": { "id": 1, "type": "ES", "timestamp": "2025-01-14 10:30:00", "duration_ms": 35, "success": true, "error": "", "operation": "search", "key_or_index": "books-from-mysql-v2", "query": "{\"query\":{\"match\":{\"isbn\":\"...\"}}}", "request": "...", "response": "..." } } ``` --- ### 4.6 监控仪表板 ``` GET /api/api-monitor/dashboard ``` **功能说明**: 返回 HTML 格式的 API 监控仪表板页面,包含可视化统计数据。 **响应**: HTML 页面(`Content-Type: text/html`) --- ## 五、ERP 接口 ### 5.1 插入筛选集合 ``` POST /api/erp/insertFilterSet ``` **功能说明**: 插入 ERP 筛选集合数据。 **请求参数**: 通过 Query 参数传递 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | (各类参数) | - | - | 按 ERP 模块定义 | --- ## 六、WebSocket ### 6.1 WebSocket 连接 ``` GET /ws ``` **功能说明**: 升级 HTTP 连接为 WebSocket,用于实时消息推送。 **协议**: 支持文本消息通信,服务器端维护活跃客户端列表并支持广播。 --- ## 七、定价加密/解密接口(已注释) > ⚠️ 以下接口代码仍存在但路由已注释,未在线上启用。 ### 定价链接加密 ``` GET /pricingLink ``` ### 定价链接解密 ``` GET /pricingLinkDec ``` **加密方式**: RSA-OAEP + AES-256-GCM 混合加密 --- ## 八、SQL 健康监控接口(已注释) > ⚠️ 以下接口代码仍存在但路由已注释,未在线上启用。 ### 8.1 获取 SQL 统计 ``` GET /api/sql-health/stats ``` ### 8.2 获取最近 SQL 记录 ``` GET /api/sql-health/recent ``` **参数**: `limit`(默认 50,最大 500) ### 8.3 获取慢查询 ``` GET /api/sql-health/slow-queries ``` **参数**: `threshold`(阈值 ms,默认 1000) ### 8.4 获取失败查询 ``` GET /api/sql-health/failed-queries ``` ### 8.5 清除 SQL 记录 ``` POST /api/sql-health/clear ``` ### 8.6 SQL 监控仪表板 ``` GET /api/sql-health/dashboard ``` --- ## 九、图书管理接口 MySQL 版(已注释) > ⚠️ 以下接口基于 MySQL 数据库,所有路由已注释,功能已迁移至 ES。 | 方法 | 路径 | Handler 函数 | 说明 | |------|------|-------------|------| | GET | `/api/bookBase/getBookBaseInfo` | `GetBookBaseInfo` | 条件查询(含缓存) | | GET | `/api/bookBase/getRandomBookBaseInfo` | `GetRandomBookBaseInfo` | 随机查询 | | GET | `/api/bookBase/GetBookBaseInfoOptimized` | `GetBookBaseInfoOptimized` | 优化查询 | | GET | `/api/bookBase/getBookByISBN` | `GetBookByISBN` | ISBN 查询(Redis → MySQL → 外部API) | | GET | `/api/bookBase/getBookById` | `GetBookByID` | ID 查询 | | POST | `/api/bookBase/putBookBaseInfoToIll` | `SetBookBaseInfoToIll` | 批量设置违规(按ID) | | POST | `/api/bookBase/putBookBaseInfoToIllByISBN` | `SetBookBaseInfoToIllByISBN` | 批量设置违规(按ISBN) | | POST | `/api/bookBase/putBookBaseName` | `SetBookBaseInfoBookName` | 修改书名 | | POST | `/api/bookBase/addBookBaseInfo` | `InsertBaseInfo` | 新增图书(ISBN 去重) | | POST | `/api/bookBase/updateSales` | `UpdateSales` | 更新销量 | | GET | `/api/bookBase/getBookPicByISBN` | `GetBookPicByISBN` | 获取图片 | | POST | `/api/bookBase/uploadBookPic` | `UploadBookPic` | 上传图片 | | GET/POST | `/api/bookBase/getBookByIsbnXcx` | `getBookByIsbnXcx` | 小程序查询 | | GET | `/api/bookBase/deleterIsbn` | `exportISBNs` | 导出 ISBN 到 Excel | | GET | `/api/bookBase/updateBooks` | `updateBooks` | 批量更新图书 | --- ## 附录:ESBook 完整字段说明 ### 响应字段 (ESBookResponse) | 字段名 | 类型 | 说明 | |--------|------|------| | `id` | int64 | ES 文档 ID | | `book_name` | string | 书名 | | `isbn` | string | ISBN | | `author` | string | 作者 | | `publisher` | string | 出版社 | | `category` | string | 分类路径,如 `图书/计算机/编程` | | `publication_time` | string | 出版时间,格式化后为 `2006-01` | | `binding_layout` | string | 装帧(平装/精装) | | `fix_price` | float64 | 定价,单位:分 | | `content` | string | 内容简介 | | `book_pic` | object | 大图对象 `{localPath, pddPath}` | | `book_pic_s` | object | 小图对象 `{localPath, pddResponse}` | | `book_pic_b` | string | 大图地址 | | `book_pic_w` | object | 水印图对象 | | `book_def_pic` | object | 自制官图 `{localPath, pddPath}` | | `book_pic_obj` | object | 图片对象(扩展) | | `book_pic_obj_s` | object | 小图对象(扩展) | | `is_suit` | int | 是否套装: 0-否, 1-是 | | `is_illegal` | int | 是否非法 | | `is_return` | int | 是否驳回: 0-否, 1-是 | | `is_filter` | string | 过滤字段 | | `day_sale_7` ~ `day_sale_365` | int | 各维度天数销量 | | `this_year_sale` | int | 今年销量 | | `last_year_sale` | int | 去年销量 | | `total_sale` | int | 总销量 | | `buy_counts` | int64 | 购买次数 | | `sell_counts` | int64 | 在售/售卖次数 | | `page_count` | number/string | 页数 | | `word_count` | number/string | 字数 | | `book_format` | number/string | 开本 | | `update_time` | number/string | 更新时间戳 | | `cat_id` | object | 类目信息(仅 PSI 响应包含) | | `other` | object | 扩展字段 | ### 类目对象 (CatIdObject) | 字段名 | 类型 | 说明 | |--------|------|------| | `pin_duo_duo_cat_id` | string | 拼多多分类 ID | | `kong_fu_zi_cat_id` | string | 孔夫子分类 ID | | `xian_yu_cat_id` | string | 闲鱼分类 ID | --- ## 附录:通用错误码 | 错误码 | 说明 | |--------|------| | 200 | 成功 | | 400 | 请求参数错误(缺少必填参数、参数格式错误) | | 404 | 资源不存在(未找到指定数据) | | 500 | 服务器内部错误(数据库查询失败、ES 操作异常等) | ### 常见错误信息 | 错误信息 | 可能原因 | |---------|---------| | `ISBN不能为空` | 未提供 isbn 参数 | | `缺少 endpoint 参数` | 监控接口未指定接口名 | | `该接口暂无监控数据` | 指定的 endpoint 未被监控 | | `处理失败` / `更新失败` / `删除失败` | ES 操作异常或服务端错误 | --- ## 附录:curl 请求示例汇总 ```bash # ========== ES 搜索 ========== # ISBN 模糊搜索 curl "http://localhost:9009/api/es/searchByISBNLike?isbn=978711" # ISBN 精确搜索 curl "http://localhost:9009/api/es/searchByISBN?isbn=9787111111111" # 书名搜索 curl "http://localhost:9009/api/es/searchByBookName?book_name=Go语言&page=1&size=10" # 全字段搜索 curl "http://localhost:9009/api/es/searchAll?q=Go语言编程" # 条件搜索 curl "http://localhost:9009/api/es/getBookBaseInfoES?book_name=Go语言&page=1&pageSize=10" # 高级搜索 curl "http://localhost:9009/api/es/searchAdvanced?author=张三&publisher=清华大学出版社&page=1&pageSize=20" # ID 范围计数 curl "http://localhost:9009/api/es/countByIDRange?minID=1&maxID=100000" # ========== ES 图书管理 ========== # 添加/更新图书 curl -X POST "http://localhost:9009/api/es/addBookToES" \ -H "Content-Type: application/json" \ -d '{"book_name":"Go语言编程","isbn":"9787111111111","author":"作者名","publisher":"出版社","fix_price":9900}' # 更新图书字段(普通更新,不操作v3) curl -X POST "http://localhost:9009/api/es/updateBookFieldsByISBN" \ -H "Content-Type: application/json" \ -d '{"isbn":"9787111111111","data":{"fix_price":8800,"author":"新作者名"}}' # 更新图书字段(is_suit=1,同步到v3) curl -X POST "http://localhost:9009/api/es/updateBookFieldsByISBN" \ -H "Content-Type: application/json" \ -d '{"isbn":"9787111111111","data":{"fix_price":8800,"is_suit":1}}' # 更新图书字段(is_suit=0,从v3删除) curl -X POST "http://localhost:9009/api/es/updateBookFieldsByISBN" \ -H "Content-Type: application/json" \ -d '{"isbn":"9787111111111","data":{"fix_price":8800,"is_suit":0}}' # 更新类目 curl -X POST "http://localhost:9009/api/es/updateBookCatIdByISBN" \ -H "Content-Type: application/json" \ -d '{"isbn":"9787111111111","data":{"cat_id":{"pin_duo_duo_cat_id":"12345","kong_fu_zi_cat_id":"67890","xian_yu_cat_id":"11121"}}}' # 删除图书(按 ISBN) curl "http://localhost:9009/api/es/DeleteBookByISBN?isbn=9787111111111" # 删除图书(按 ID) curl "http://localhost:9009/api/es/DeleteBookByID?id=123456" # 完整插入 curl -X POST "http://localhost:9009/api/es/addBookFullToES" \ -H "Content-Type: application/json" \ -d '{"book_name":"Go语言编程","isbn":"9787111111111","author":"作者名","publisher":"出版社","fix_price":9900}' # 批量插入 curl -X POST "http://localhost:9009/api/es/batchAddBookToES" \ -H "Content-Type: application/json" \ -d '{"books":[{"book_name":"Go语言","isbn":"9787111111111","author":"作者1"},{"book_name":"Python","isbn":"9787111133333","author":"作者2"}]}' # 检查图书存在 curl "http://localhost:9009/api/es/checkBookExists?isbn=9787111111111" # 检查套装书 curl "http://localhost:9009/api/es/checkBookSuit?bookName=Go语言编程(套装)" # ========== 在售数量 ========== # 自动获取更新 curl -X POST "http://localhost:9009/api/es/updateSellCountsByISBN?isbn=9787111111111" # 直接更新 curl -X POST "http://localhost:9009/api/es/updateSellCountsDirect" \ -H "Content-Type: application/json" \ -d '{"isbn":"9787111111111","sell_counts":100}' # 更新套装标记 curl -X POST "http://localhost:9009/api/es/updateBookSuitByISBN?isbn=9787111111111" # ========== API 监控 ========== # 获取指定 API 统计 curl "http://localhost:9009/api/api-monitor/stats?endpoint=/api/es/searchByISBN" # 获取所有 API 统计 curl "http://localhost:9009/api/api-monitor/all-stats" # 获取 ES 调用记录 curl "http://localhost:9009/api/api-monitor/es-calls?endpoint=/api/es/searchByISBN&page=1&page_size=50" # 获取 Redis 调用记录 curl "http://localhost:9009/api/api-monitor/redis-calls?endpoint=/api/es/searchByISBN" # 获取调用详情 curl "http://localhost:9009/api/api-monitor/call-detail?endpoint=/api/es/searchByISBN&call_id=1&type=es" # 监控仪表板(浏览器访问) curl "http://localhost:9009/api/api-monitor/dashboard" ``` --- ## 更新日志 | 版本 | 日期 | 更新内容 | |------|------|---------| | v2.0 | 2025-06-13 | 全面重构,新增新版 Controller 接口、API 监控接口,统一响应格式说明 | | v1.0 | 2025-01-14 | 初始 API 文档 | --- **最后更新**: 2025-06-13