From eab377985d6f9efd7cc8cfa68107676cca6de8ad Mon Sep 17 00:00:00 2001 From: zhouqi Date: Wed, 6 May 2026 16:19:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84dulizhan=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JoyHub_API接口文档.md | 20198 ++++++++++++++++ Log/run.log | 463 + .../接口/SZPurchase/ContractManage.py | 0 .../接口/SZPurchase/PurchaseOrderManage.py | 75 - .../接口/SZPurchase/PurchasePlanManage.py | 0 .../TestCase/接口/SZPurchase/__init__.py | 0 .../TestCase/接口/SZPurchase/index.py | 19 - dulizhan/test_case/run_tests.py | 4 +- zhyy/__init__.py | 0 .../BusinessKw/SZPurchase/ContractManage.py | 0 .../SZPurchase/PurchaseOrderManage.py | 97 - .../SZPurchase/PurchasePlanManage.py | 0 .../library/BusinessKw/SZPurchase/__init__.py | 0 .../PurchaseOrderManage.cpython-38.pyc | Bin 3594 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 145 -> 0 bytes .../__pycache__/index.cpython-38.pyc | Bin 3546 -> 0 bytes zhyy/library/BusinessKw/SZPurchase/index.py | 88 - .../BusinessKw/SZPurchase/purchase.ini | 2 - zhyy/library/BusinessKw/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 134 -> 0 bytes zhyy/library/CommonFun/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 133 -> 0 bytes .../__pycache__/asset_common.cpython-38.pyc | Bin 2304 -> 0 bytes .../contract_pair_check.cpython-38.pyc | Bin 8950 -> 0 bytes .../course_package_common.cpython-38.pyc | Bin 1323 -> 0 bytes .../__pycache__/env_check.cpython-38.pyc | Bin 3283 -> 0 bytes .../__pycache__/handle_aita.cpython-38.pyc | Bin 3934 -> 0 bytes .../handle_harmonyos.cpython-38.pyc | Bin 3031 -> 0 bytes .../__pycache__/handle_jenkins.cpython-38.pyc | Bin 6995 -> 0 bytes .../__pycache__/handle_jira.cpython-38.pyc | Bin 12659 -> 0 bytes .../__pycache__/handle_login.cpython-38.pyc | Bin 6564 -> 0 bytes .../__pycache__/handle_tools.cpython-38.pyc | Bin 5784 -> 0 bytes .../__pycache__/host_update.cpython-38.pyc | Bin 8310 -> 0 bytes .../statistical_function.cpython-38.pyc | Bin 3439 -> 0 bytes .../__pycache__/ubrd_now_time.cpython-38.pyc | Bin 2590 -> 0 bytes .../__pycache__/user_common.cpython-38.pyc | Bin 11528 -> 0 bytes .../__pycache__/user_message.cpython-38.pyc | Bin 1021 -> 0 bytes zhyy/library/CommonFun/asset_common.py | 57 - zhyy/library/CommonFun/contract_pair_check.py | 240 - .../CommonFun/course_package_common.py | 31 - zhyy/library/CommonFun/drawPicture.py | 31 - zhyy/library/CommonFun/env_check.ini | 7 - zhyy/library/CommonFun/env_check.py | 141 - zhyy/library/CommonFun/handle_aita.py | 141 - zhyy/library/CommonFun/handle_harmonyos.py | 105 - zhyy/library/CommonFun/handle_jenkins.py | 257 - zhyy/library/CommonFun/handle_jira.py | 331 - zhyy/library/CommonFun/handle_kibana.py | 45 - zhyy/library/CommonFun/handle_login.py | 204 - zhyy/library/CommonFun/handle_mq.py | 19 - zhyy/library/CommonFun/handle_picture.py | 56 - zhyy/library/CommonFun/handle_tools.py | 211 - zhyy/library/CommonFun/host_update.ini | 1 - zhyy/library/CommonFun/host_update.py | 263 - .../library/CommonFun/statistical_function.py | 142 - zhyy/library/CommonFun/ubrd_now_time.py | 64 - zhyy/library/CommonFun/user_common.py | 272 - zhyy/library/CommonFun/user_message.py | 20 - zhyy/library/Config/team_config.ini | 9 - zhyy/library/Config/xingxingchongzhi.xlsx | Bin 9423 -> 0 bytes zhyy/library/UpFile/classify.xlsx | Bin 12324 -> 0 bytes zhyy/library/UpFile/draw_user.xlsx | Bin 10271 -> 0 bytes zhyy/library/UpFile/tag.xlsx | Bin 10952 -> 0 bytes zhyy/library/UpFile/uploadstar.xlsx | Bin 9641 -> 0 bytes zhyy/library/ZZYYLogic/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 131 -> 0 bytes zhyy/library/ZZYYLogic/purchase_logic.py | 37 - zhyy/library/ZZYY_interface.py | 68 - zhyy/library/__init__.py | 134 - .../__pycache__/ZZYY_interface.cpython-38.pyc | Bin 3037 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 3417 -> 0 bytes zhyy/qa_helper/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 125 -> 0 bytes zhyy/qa_helper/common/__init__.py | 1 - .../__pycache__/__init__.cpython-38.pyc | Bin 132 -> 0 bytes .../common/__pycache__/order.cpython-38.pyc | Bin 5361 -> 0 bytes .../common/__pycache__/user.cpython-38.pyc | Bin 8429 -> 0 bytes zhyy/qa_helper/common/course_package.py | 337 - zhyy/qa_helper/common/order.py | 109 - zhyy/qa_helper/common/user.py | 208 - zhyy/test_case/JENKINS_SETUP.md | 190 - zhyy/test_case/Jenkinsfile | 175 - zhyy/test_case/README_JENKINS.md | 84 - zhyy/test_case/README_RUN_TESTS.md | 96 - .../test_case/Resource/AdapterKws/hh-qa.robot | 9 - zhyy/test_case/TestCase/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 134 -> 0 bytes .../test_sample.cpython-38-pytest-7.4.4.pyc | Bin 669 -> 0 bytes .../接口/SZPurchase/ContractManage.py | 0 .../接口/SZPurchase/PurchaseOrderManage.py | 75 - .../接口/SZPurchase/PurchasePlanManage.py | 0 .../TestCase/接口/SZPurchase/__init__.py | 0 .../ContractManage.cpython-38-pytest-7.4.4.pyc | Bin 161 -> 0 bytes ...chaseOrderManage.cpython-38-pytest-7.4.4.pyc | Bin 3674 -> 0 bytes ...rchasePlanManage.cpython-38-pytest-7.4.4.pyc | Bin 165 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 155 -> 0 bytes .../index.cpython-38-pytest-7.4.4.pyc | Bin 1249 -> 0 bytes .../TestCase/接口/SZPurchase/index.py | 19 - zhyy/test_case/TestCase/接口/__init__.py | 0 .../接口/__pycache__/__init__.cpython-38.pyc | Bin 144 -> 0 bytes .../conftest.cpython-38-pytest-7.4.4.pyc | Bin 564 -> 0 bytes zhyy/test_case/TestCase/接口/conftest.py | 14 - zhyy/test_case/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 125 -> 0 bytes zhyy/test_case/jenkins_build.bat | 44 - zhyy/test_case/jenkins_build.sh | 47 - zhyy/test_case/reports/allure-report/app.js | 60 - .../reports/allure-report/data/behaviors.csv | 4 - .../reports/allure-report/data/categories.csv | 0 .../reports/allure-report/data/suites.csv | 6 - .../reports/allure-report/favicon.ico | 1 - .../allure-report/plugins/behaviors/index.js | 150 - .../allure-report/plugins/packages/index.js | 88 - .../plugins/screen-diff/index.js | 97 - .../plugins/screen-diff/styles.css | 26 - .../reports/allure-report/styles.css | 6 - zhyy/test_case/run_all.bat | 7 - zhyy/test_case/run_purchase.bat | 7 - zhyy/test_case/run_tests.py | 230 - 119 files changed, 20663 insertions(+), 5259 deletions(-) create mode 100644 JoyHub_API接口文档.md delete mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/ContractManage.py delete mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py delete mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py delete mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/__init__.py delete mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/index.py delete mode 100644 zhyy/__init__.py delete mode 100644 zhyy/library/BusinessKw/SZPurchase/ContractManage.py delete mode 100644 zhyy/library/BusinessKw/SZPurchase/PurchaseOrderManage.py delete mode 100644 zhyy/library/BusinessKw/SZPurchase/PurchasePlanManage.py delete mode 100644 zhyy/library/BusinessKw/SZPurchase/__init__.py delete mode 100644 zhyy/library/BusinessKw/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38.pyc delete mode 100644 zhyy/library/BusinessKw/SZPurchase/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/library/BusinessKw/SZPurchase/__pycache__/index.cpython-38.pyc delete mode 100644 zhyy/library/BusinessKw/SZPurchase/index.py delete mode 100644 zhyy/library/BusinessKw/SZPurchase/purchase.ini delete mode 100644 zhyy/library/BusinessKw/__init__.py delete mode 100644 zhyy/library/BusinessKw/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__init__.py delete mode 100644 zhyy/library/CommonFun/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/asset_common.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/contract_pair_check.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/course_package_common.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/env_check.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/handle_aita.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/handle_harmonyos.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/handle_jenkins.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/handle_jira.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/handle_login.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/handle_tools.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/host_update.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/statistical_function.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/ubrd_now_time.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/user_common.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/__pycache__/user_message.cpython-38.pyc delete mode 100644 zhyy/library/CommonFun/asset_common.py delete mode 100644 zhyy/library/CommonFun/contract_pair_check.py delete mode 100644 zhyy/library/CommonFun/course_package_common.py delete mode 100644 zhyy/library/CommonFun/drawPicture.py delete mode 100644 zhyy/library/CommonFun/env_check.ini delete mode 100644 zhyy/library/CommonFun/env_check.py delete mode 100644 zhyy/library/CommonFun/handle_aita.py delete mode 100644 zhyy/library/CommonFun/handle_harmonyos.py delete mode 100644 zhyy/library/CommonFun/handle_jenkins.py delete mode 100644 zhyy/library/CommonFun/handle_jira.py delete mode 100644 zhyy/library/CommonFun/handle_kibana.py delete mode 100644 zhyy/library/CommonFun/handle_login.py delete mode 100644 zhyy/library/CommonFun/handle_mq.py delete mode 100644 zhyy/library/CommonFun/handle_picture.py delete mode 100644 zhyy/library/CommonFun/handle_tools.py delete mode 100644 zhyy/library/CommonFun/host_update.ini delete mode 100644 zhyy/library/CommonFun/host_update.py delete mode 100644 zhyy/library/CommonFun/statistical_function.py delete mode 100644 zhyy/library/CommonFun/ubrd_now_time.py delete mode 100644 zhyy/library/CommonFun/user_common.py delete mode 100644 zhyy/library/CommonFun/user_message.py delete mode 100644 zhyy/library/Config/team_config.ini delete mode 100644 zhyy/library/Config/xingxingchongzhi.xlsx delete mode 100644 zhyy/library/UpFile/classify.xlsx delete mode 100644 zhyy/library/UpFile/draw_user.xlsx delete mode 100644 zhyy/library/UpFile/tag.xlsx delete mode 100644 zhyy/library/UpFile/uploadstar.xlsx delete mode 100644 zhyy/library/ZZYYLogic/__init__.py delete mode 100644 zhyy/library/ZZYYLogic/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/library/ZZYYLogic/purchase_logic.py delete mode 100644 zhyy/library/ZZYY_interface.py delete mode 100644 zhyy/library/__init__.py delete mode 100644 zhyy/library/__pycache__/ZZYY_interface.cpython-38.pyc delete mode 100644 zhyy/library/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/qa_helper/__init__.py delete mode 100644 zhyy/qa_helper/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/qa_helper/common/__init__.py delete mode 100644 zhyy/qa_helper/common/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/qa_helper/common/__pycache__/order.cpython-38.pyc delete mode 100644 zhyy/qa_helper/common/__pycache__/user.cpython-38.pyc delete mode 100644 zhyy/qa_helper/common/course_package.py delete mode 100644 zhyy/qa_helper/common/order.py delete mode 100644 zhyy/qa_helper/common/user.py delete mode 100644 zhyy/test_case/JENKINS_SETUP.md delete mode 100644 zhyy/test_case/Jenkinsfile delete mode 100644 zhyy/test_case/README_JENKINS.md delete mode 100644 zhyy/test_case/README_RUN_TESTS.md delete mode 100644 zhyy/test_case/Resource/AdapterKws/hh-qa.robot delete mode 100644 zhyy/test_case/TestCase/__init__.py delete mode 100644 zhyy/test_case/TestCase/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/test_case/TestCase/__pycache__/test_sample.cpython-38-pytest-7.4.4.pyc delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/ContractManage.py delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/__init__.py delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/ContractManage.cpython-38-pytest-7.4.4.pyc delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38-pytest-7.4.4.pyc delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchasePlanManage.cpython-38-pytest-7.4.4.pyc delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/index.cpython-38-pytest-7.4.4.pyc delete mode 100644 zhyy/test_case/TestCase/接口/SZPurchase/index.py delete mode 100644 zhyy/test_case/TestCase/接口/__init__.py delete mode 100644 zhyy/test_case/TestCase/接口/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/test_case/TestCase/接口/__pycache__/conftest.cpython-38-pytest-7.4.4.pyc delete mode 100644 zhyy/test_case/TestCase/接口/conftest.py delete mode 100644 zhyy/test_case/__init__.py delete mode 100644 zhyy/test_case/__pycache__/__init__.cpython-38.pyc delete mode 100644 zhyy/test_case/jenkins_build.bat delete mode 100644 zhyy/test_case/jenkins_build.sh delete mode 100644 zhyy/test_case/reports/allure-report/app.js delete mode 100644 zhyy/test_case/reports/allure-report/data/behaviors.csv delete mode 100644 zhyy/test_case/reports/allure-report/data/categories.csv delete mode 100644 zhyy/test_case/reports/allure-report/data/suites.csv delete mode 100644 zhyy/test_case/reports/allure-report/favicon.ico delete mode 100644 zhyy/test_case/reports/allure-report/plugins/behaviors/index.js delete mode 100644 zhyy/test_case/reports/allure-report/plugins/packages/index.js delete mode 100644 zhyy/test_case/reports/allure-report/plugins/screen-diff/index.js delete mode 100644 zhyy/test_case/reports/allure-report/plugins/screen-diff/styles.css delete mode 100644 zhyy/test_case/reports/allure-report/styles.css delete mode 100644 zhyy/test_case/run_all.bat delete mode 100644 zhyy/test_case/run_purchase.bat delete mode 100644 zhyy/test_case/run_tests.py diff --git a/JoyHub_API接口文档.md b/JoyHub_API接口文档.md new file mode 100644 index 0000000..4a33d83 --- /dev/null +++ b/JoyHub_API接口文档.md @@ -0,0 +1,20198 @@ +# JoyHub API 接口文档 + +- 文档来源:https://joyhub-website-manager-api-dev.best-envision.com/v3/api-docs/all +- 标题:芋道快速开发平台 +- 描述:提供管理后台、用户 App 的所有功能 +- OpenAPI:3.1.0 +- 生成时间:2026-04-28 14:25:19 +- 接口数量:740 +- 分组数量:112 + +## 接口总览 + +| 分组 | 数量 | +| --- | ---: | +| C端 - APP版本 | 1 | +| C端 - FAQ | 2 | +| C端 - FAQ联系我们 | 1 | +| C端 - blog信息 | 3 | +| C端 - blog分类 | 1 | +| C端 - news分类 | 1 | +| C端 - news管理 | 3 | +| C端 - 二维码访问统计 | 2 | +| C端 - 产品 | 2 | +| C端 - 产品分类 | 1 | +| C端 - 产品结算 | 2 | +| C端 - 协议 | 2 | +| C端 - 合作联系 | 1 | +| C端 - 售后 | 4 | +| C端 - 售后政策 | 2 | +| C端 - 售后政策-品牌 | 2 | +| C端 - 国家信息 | 1 | +| C端 - 埋点 | 1 | +| C端 - 基础数据-说明(售后/运费说明,售后问题) | 2 | +| C端 - 我的订单 | 11 | +| C端 - 支付页产品推荐 | 1 | +| C端 - 文件存储 | 3 | +| C端 - 点赞记录 | 4 | +| C端 - 用户 | 1 | +| C端 - 积分结算 | 1 | +| C端 - 购物车 | 7 | +| c端 - Banner信息 | 2 | +| default-controller | 77 | +| pay-pal-payment-controller | 9 | +| pay-pal-webhook-controller | 1 | +| 用户 App - 地区 | 1 | +| 用户 App - 字典数据 | 1 | +| 用户 App - 租户 | 1 | +| 管理后台 - API 访问日志 | 2 | +| 管理后台 - API 错误日志 | 3 | +| 管理后台 - Banner管理 | 9 | +| 管理后台 - FAQ分类 | 8 | +| 管理后台 - FAQ数据 | 10 | +| 管理后台 - FAQ联系数据 | 9 | +| 管理后台 - LX 亚马逊FBA货件详情 | 9 | +| 管理后台 - LX 亚马逊店铺信息 | 9 | +| 管理后台 - OAuth2 客户端 | 6 | +| 管理后台 - OAuth2.0 令牌 | 3 | +| 管理后台 - OAuth2.0 授权 | 5 | +| 管理后台 - OAuth2.0 用户 | 2 | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | 9 | +| 管理后台 - Redis 监控 | 1 | +| 管理后台 - app版本号管理 | 9 | +| 管理后台 - blog分类 | 9 | +| 管理后台 - blog管理 | 10 | +| 管理后台 - news分类 | 9 | +| 管理后台 - news管理 | 10 | +| 管理后台 - 二维码 | 9 | +| 管理后台 - 产品 | 11 | +| 管理后台 - 产品分类 | 7 | +| 管理后台 - 产品属性 | 7 | +| 管理后台 - 产品属性值 | 6 | +| 管理后台 - 代码生成器 | 11 | +| 管理后台 - 协议 | 9 | +| 管理后台 - 参数配置 | 8 | +| 管理后台 - 合作联系数据 | 9 | +| 管理后台 - 售后 | 3 | +| 管理后台 - 售后政策 | 9 | +| 管理后台 - 售后政策-品牌 | 10 | +| 管理后台 - 国家信息 | 11 | +| 管理后台 - 地区 | 2 | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | 9 | +| 管理后台 - 字典数据 | 9 | +| 管理后台 - 字典类型 | 9 | +| 管理后台 - 学生 | 37 | +| 管理后台 - 定时任务 | 11 | +| 管理后台 - 定时任务日志 | 3 | +| 管理后台 - 岗位 | 9 | +| 管理后台 - 我的站内信 | 7 | +| 管理后台 - 折扣 | 13 | +| 管理后台 - 折扣数据 | 2 | +| 管理后台 - 操作日志 | 2 | +| 管理后台 - 支付页产品推荐 | 6 | +| 管理后台 - 数据源配置 | 6 | +| 管理后台 - 文件存储 | 7 | +| 管理后台 - 文件配置 | 8 | +| 管理后台 - 权限 | 5 | +| 管理后台 - 流量详情 | 2 | +| 管理后台 - 用户 | 14 | +| 管理后台 - 用户个人中心 | 3 | +| 管理后台 - 登录日志 | 2 | +| 管理后台 - 短信回调 | 4 | +| 管理后台 - 短信日志 | 2 | +| 管理后台 - 短信模板 | 8 | +| 管理后台 - 短信渠道 | 8 | +| 管理后台 - 示例分类 | 6 | +| 管理后台 - 示例联系人 | 7 | +| 管理后台 - 社交客户端 | 7 | +| 管理后台 - 社交用户 | 5 | +| 管理后台 - 租户 | 10 | +| 管理后台 - 租户套餐 | 8 | +| 管理后台 - 站内信模版 | 7 | +| 管理后台 - 联系我们数据 | 9 | +| 管理后台 - 菜单 | 8 | +| 管理后台 - 角色 | 9 | +| 管理后台 - 订单 | 6 | +| 管理后台 - 认证 | 11 | +| 管理后台 - 路由 | 9 | +| 管理后台 - 运费模板信息 | 8 | +| 管理后台 - 通知公告 | 7 | +| 管理后台 - 邮件日志 | 2 | +| 管理后台 - 邮件模版 | 9 | +| 管理后台 - 邮箱账号 | 8 | +| 管理后台 - 部门 | 8 | +| 管理后台 - 链接 | 7 | +| 管理后台 - 领星订单同步调试 | 3 | +| 管理后台 - 验证码 | 2 | + +## 接口清单 + +| 分组 | 方法 | 路径 | 名称 | operationId | +| --- | --- | --- | --- | --- | +| C端 - APP版本 | GET | `/web-api/jh/web/appversion/page` | 获取APP版本列表 | `WebAppversion_getAppversionPage` | +| C端 - FAQ | GET | `/web-api/jh/faq/cate-list` | 获得FAQ分类树 | `WebFaq_getFaqCateTree` | +| C端 - FAQ | GET | `/web-api/jh/faq/list` | 获得FAQ列表 | `WebFaq_getFaqList` | +| C端 - FAQ联系我们 | POST | `/web-api/jh/faq-contact-us/create` | 提交FAQ联系信息 | `WebFaqContactUs_createFaqContactUs` | +| C端 - blog信息 | GET | `/web-api/jh/blog/get-detail` | 获得blog详情 | `WebBlog_getBlog` | +| C端 - blog信息 | GET | `/web-api/jh/blog/get-next` | 获得blog下一条 | `WebBlog_getBlogNext` | +| C端 - blog信息 | GET | `/web-api/jh/blog/page` | 获得blog管理分页 | `WebBlog_getBlogPage` | +| C端 - blog分类 | GET | `/web-api/jh/blog-cate/list` | 获得blog分类列表 | `WebBlogCate_getBlogCateList` | +| C端 - news分类 | GET | `/web-api/jh/news-cate/list` | 获得news分类列表 | `WebNewsCate_getNewsCateList` | +| C端 - news管理 | GET | `/web-api/jh/news/get-detail` | 获得news详情 | `WebNews_getBlog` | +| C端 - news管理 | GET | `/web-api/jh/news/get-next` | 获得news下一条 | `WebNews_getBlogNext` | +| C端 - news管理 | GET | `/web-api/jh/news/page` | 获得news管理分页 | `WebNews_getBlogPage` | +| C端 - 二维码访问统计 | GET | `/web-api/jh/download-qrcode/get` | 获取二维码信息 | `WebDownloadQrcode_getByCode` | +| C端 - 二维码访问统计 | POST | `/web-api/jh/download-qrcode/increment` | 增加二维码访问/点击次数 | `WebDownloadQrcode_incrementCount` | +| C端 - 产品 | GET | `/web-api/jh/product/get` | 产品详情 | `WebProduct_getProduct` | +| C端 - 产品 | GET | `/web-api/jh/product/page` | 获得产品分页 | `WebProduct_getProductPage` | +| C端 - 产品分类 | GET | `/web-api/jh/product-cate/list` | 获得产品分类列表 | `WebProductCate_getProductCateList` | +| C端 - 产品结算 | GET | `/web-api/jh/settlement/points/settlement` | 获取积分结算信息 | `WebSettlement_getProductPointsSettlement` | +| C端 - 产品结算 | POST | `/web-api/jh/settlement/points/submit` | 纯积分结算提交订单 | `WebSettlement_submitProductPointsSettlement` | +| C端 - 协议 | GET | `/web-api/jh/agreement/get` | 获得协议 | `WebAgreement_getAgreement` | +| C端 - 协议 | GET | `/web-api/jh/agreement/page` | 获得协议分页 | `WebAgreement_getAgreementPage` | +| C端 - 合作联系 | POST | `/web-api/jh/cooperation/create` | 提交合作联系信息 | `WebCooperation_createCooperation` | +| C端 - 售后 | POST | `/web-api/jh/order-after-sale/create` | 提交售后 | `WebOrderAfterSale_createOrderAfterSale` | +| C端 - 售后 | GET | `/web-api/jh/order-after-sale/get` | 售后详情 | `WebOrderAfterSale_getOrderAfterSale` | +| C端 - 售后 | POST | `/web-api/jh/order-after-sale/sync-oa` | 同步oa售后数据 | `WebOrderAfterSale_syncOrderAfterSaleFromOA` | +| C端 - 售后 | POST | `/web-api/jh/order-after-sale/update` | 提供给OA接收售后信息变化 | `WebOrderAfterSale_updateOrderAfterSale` | +| C端 - 售后政策 | GET | `/web-api/jh/after-sales-policy/get` | 获得售后政策 | `WebAfterSalesPolicy_getAfterSalesPolicy` | +| C端 - 售后政策 | GET | `/web-api/jh/after-sales-policy/page` | 获得售后政策分页 | `WebAfterSalesPolicy_getAfterSalesPolicyPage` | +| C端 - 售后政策-品牌 | GET | `/web-api/jh/after-sales-brand/get` | 获得售后政策-品牌 | `WebAfterSalesBrand_getAfterSalesBrand` | +| C端 - 售后政策-品牌 | GET | `/web-api/jh/after-sales-brand/page` | 获得售后政策-品牌分页 | `WebAfterSalesBrand_getAfterSalesBrandPage` | +| C端 - 国家信息 | GET | `/web-api/jh/address-country/list` | 获取国家列表(启用状态) | `WebAddressCountry_getCountryList` | +| C端 - 埋点 | POST | `/web-api/jh/event-tracking/create` | 创建埋点记录 | `WebEventTracking_createEventTracking` | +| C端 - 基础数据-说明(售后/运费说明,售后问题) | GET | `/web-api/jh/article/get` | 获得基础数据-说明 | `WebArticle_getArticle` | +| C端 - 基础数据-说明(售后/运费说明,售后问题) | GET | `/web-api/jh/article/page` | 获得基础数据-说明分页 | `WebArticle_getArticlePage` | +| C端 - 我的订单 | PUT | `/web-api/jh/order/cancel` | 取消订单 | `ClientOrder_cancelOrder` | +| C端 - 我的订单 | GET | `/web-api/jh/order/capture` | 捕获订单 | `ClientOrder_captureOrder` | +| C端 - 我的订单 | POST | `/web-api/jh/order/change-shipping-amount` | 重新计算运费和总价 | `ClientOrder_changeShippingAmount` | +| C端 - 我的订单 | GET | `/web-api/jh/order/count` | 查询各状态订单数量 | `ClientOrder_getOrderCount` | +| C端 - 我的订单 | POST | `/web-api/jh/order/creat` | 创建订单 | `ClientOrder_creatOrder` | +| C端 - 我的订单 | GET | `/web-api/jh/order/export-excel` | 导出订单 Excel | `ClientOrder_exportOrderExcel` | +| C端 - 我的订单 | GET | `/web-api/jh/order/get` | 获得订单 | `ClientOrder_getOrder` | +| C端 - 我的订单 | GET | `/web-api/jh/order/order-item` | 支付成功页订单详情产品信息 | `ClientOrder_getOrderItemList` | +| C端 - 我的订单 | GET | `/web-api/jh/order/page` | 获得订单分页 | `ClientOrder_getOrderPage` | +| C端 - 我的订单 | PUT | `/web-api/jh/order/set-remark` | 设置订单备注 | `ClientOrder_updateOrderRemark` | +| C端 - 我的订单 | GET | `/web-api/jh/order/status` | 查询状态列表 | `ClientOrder_getStatus` | +| C端 - 支付页产品推荐 | GET | `/web-api/jh/product-payment-recommend/page` | 获得支付页产品推荐分页 | `WebProductPaymentRecommend_getProductPaymentRecommendPage` | +| C端 - 文件存储 | POST | `/web-api/infra/file/create` | 创建文件 | `AppFile_createFile` | +| C端 - 文件存储 | GET | `/web-api/infra/file/presigned-url` | 获取文件预签名地址(上传) | `AppFile_getFilePresignedUrl` | +| C端 - 文件存储 | POST | `/web-api/infra/file/upload` | 上传文件 | `AppFile_uploadFile` | +| C端 - 点赞记录 | POST | `/web-api/jh/like-info/create` | 创建点赞记录 | `LikeInfo_createLikeInfo` | +| C端 - 点赞记录 | POST | `/web-api/jh/like-info/delete` | 取消点赞 | `LikeInfo_deleteLikeInfo` | +| C端 - 点赞记录 | GET | `/web-api/jh/like-info/get` | 获得点赞记录 | `LikeInfo_getLikeInfo` | +| C端 - 点赞记录 | GET | `/web-api/jh/like-info/page` | 获得点赞记录分页 | `LikeInfo_getLikeInfoPage` | +| C端 - 用户 | GET | `/web-api/jh/client/get/point` | 查询当前用户积分 | `WebClient_getPoint` | +| C端 - 积分结算 | POST | `/web-api/jh/settle_points/estimated-calculation` | 积分商品检测计算积分价格 | `WebSettlePoints_estimatedCalculation` | +| C端 - 购物车 | POST | `/web-api/jh/shopping-cart/calculate` | 购物车计算 | `WebShoppingCart_calculate` | +| C端 - 购物车 | POST | `/web-api/jh/shopping-cart/calculate-shippingcost` | 单独计算运费 | `WebShoppingCart_calculateShippingcost` | +| C端 - 购物车 | POST | `/web-api/jh/shopping-cart/check` | 检测购物车产品列表数据 | `WebShoppingCart_checkShoppingCart` | +| C端 - 购物车 | POST | `/web-api/jh/shopping-cart/create` | 创建购物车 | `WebShoppingCart_createShoppingCart` | +| C端 - 购物车 | DELETE | `/web-api/jh/shopping-cart/delete-list` | 刪除 | `WebShoppingCart_deleteBlog` | +| C端 - 购物车 | GET | `/web-api/jh/shopping-cart/list` | 获得购物车列表 | `WebShoppingCart_getShoppingCart` | +| C端 - 购物车 | POST | `/web-api/jh/shopping-cart/update` | 更新购物车产品数量 | `WebShoppingCart_updateShoppingCart` | +| c端 - Banner信息 | GET | `/web-api/jh/banner/get` | 获得Banner管理 | `WebBanner_getBanner` | +| c端 - Banner信息 | GET | `/web-api/jh/banner/page` | 获得Banner管理分页 | `WebBanner_getBannerPage` | +| default-controller | DELETE | `/admin-api/ai/**` | | `Default_ai404_3` | +| default-controller | GET | `/admin-api/ai/**` | | `Default_ai404` | +| default-controller | HEAD | `/admin-api/ai/**` | | `Default_ai404_5` | +| default-controller | OPTIONS | `/admin-api/ai/**` | | `Default_ai404_6` | +| default-controller | PATCH | `/admin-api/ai/**` | | `Default_ai404_4` | +| default-controller | POST | `/admin-api/ai/**` | | `Default_ai404_1` | +| default-controller | PUT | `/admin-api/ai/**` | | `Default_ai404_2` | +| default-controller | DELETE | `/admin-api/bpm/**` | | `Default_bpm404_3` | +| default-controller | GET | `/admin-api/bpm/**` | | `Default_bpm404` | +| default-controller | HEAD | `/admin-api/bpm/**` | | `Default_bpm404_5` | +| default-controller | OPTIONS | `/admin-api/bpm/**` | | `Default_bpm404_6` | +| default-controller | PATCH | `/admin-api/bpm/**` | | `Default_bpm404_4` | +| default-controller | POST | `/admin-api/bpm/**` | | `Default_bpm404_1` | +| default-controller | PUT | `/admin-api/bpm/**` | | `Default_bpm404_2` | +| default-controller | DELETE | `/admin-api/crm/**` | | `Default_crm404_3` | +| default-controller | GET | `/admin-api/crm/**` | | `Default_crm404` | +| default-controller | HEAD | `/admin-api/crm/**` | | `Default_crm404_5` | +| default-controller | OPTIONS | `/admin-api/crm/**` | | `Default_crm404_6` | +| default-controller | PATCH | `/admin-api/crm/**` | | `Default_crm404_4` | +| default-controller | POST | `/admin-api/crm/**` | | `Default_crm404_1` | +| default-controller | PUT | `/admin-api/crm/**` | | `Default_crm404_2` | +| default-controller | DELETE | `/admin-api/erp/**` | | `Default_erp404_3` | +| default-controller | GET | `/admin-api/erp/**` | | `Default_erp404` | +| default-controller | HEAD | `/admin-api/erp/**` | | `Default_erp404_5` | +| default-controller | OPTIONS | `/admin-api/erp/**` | | `Default_erp404_6` | +| default-controller | PATCH | `/admin-api/erp/**` | | `Default_erp404_4` | +| default-controller | POST | `/admin-api/erp/**` | | `Default_erp404_1` | +| default-controller | PUT | `/admin-api/erp/**` | | `Default_erp404_2` | +| default-controller | DELETE | `/admin-api/iot/**` | | `Default_iot404_3` | +| default-controller | GET | `/admin-api/iot/**` | | `Default_iot404` | +| default-controller | HEAD | `/admin-api/iot/**` | | `Default_iot404_5` | +| default-controller | OPTIONS | `/admin-api/iot/**` | | `Default_iot404_6` | +| default-controller | PATCH | `/admin-api/iot/**` | | `Default_iot404_4` | +| default-controller | POST | `/admin-api/iot/**` | | `Default_iot404_1` | +| default-controller | PUT | `/admin-api/iot/**` | | `Default_iot404_2` | +| default-controller | DELETE | `/admin-api/mp/**` | | `Default_mp404_3` | +| default-controller | GET | `/admin-api/mp/**` | | `Default_mp404` | +| default-controller | HEAD | `/admin-api/mp/**` | | `Default_mp404_5` | +| default-controller | OPTIONS | `/admin-api/mp/**` | | `Default_mp404_6` | +| default-controller | PATCH | `/admin-api/mp/**` | | `Default_mp404_4` | +| default-controller | POST | `/admin-api/mp/**` | | `Default_mp404_1` | +| default-controller | PUT | `/admin-api/mp/**` | | `Default_mp404_2` | +| default-controller | DELETE | `/admin-api/pay/**` | | `Default_pay404_3` | +| default-controller | GET | `/admin-api/pay/**` | | `Default_pay404` | +| default-controller | HEAD | `/admin-api/pay/**` | | `Default_pay404_5` | +| default-controller | OPTIONS | `/admin-api/pay/**` | | `Default_pay404_6` | +| default-controller | PATCH | `/admin-api/pay/**` | | `Default_pay404_4` | +| default-controller | POST | `/admin-api/pay/**` | | `Default_pay404_1` | +| default-controller | PUT | `/admin-api/pay/**` | | `Default_pay404_2` | +| default-controller | DELETE | `/admin-api/product/**` | | `Default_mall404_17` | +| default-controller | GET | `/admin-api/product/**` | | `Default_mall404_14` | +| default-controller | HEAD | `/admin-api/product/**` | | `Default_mall404_19` | +| default-controller | OPTIONS | `/admin-api/product/**` | | `Default_mall404_20` | +| default-controller | PATCH | `/admin-api/product/**` | | `Default_mall404_18` | +| default-controller | POST | `/admin-api/product/**` | | `Default_mall404_15` | +| default-controller | PUT | `/admin-api/product/**` | | `Default_mall404_16` | +| default-controller | DELETE | `/admin-api/promotion/**` | | `Default_mall404_10` | +| default-controller | GET | `/admin-api/promotion/**` | | `Default_mall404_7` | +| default-controller | HEAD | `/admin-api/promotion/**` | | `Default_mall404_12` | +| default-controller | OPTIONS | `/admin-api/promotion/**` | | `Default_mall404_13` | +| default-controller | PATCH | `/admin-api/promotion/**` | | `Default_mall404_11` | +| default-controller | POST | `/admin-api/promotion/**` | | `Default_mall404_8` | +| default-controller | PUT | `/admin-api/promotion/**` | | `Default_mall404_9` | +| default-controller | DELETE | `/admin-api/report/**` | | `Default_report404_3` | +| default-controller | GET | `/admin-api/report/**` | | `Default_report404` | +| default-controller | HEAD | `/admin-api/report/**` | | `Default_report404_5` | +| default-controller | OPTIONS | `/admin-api/report/**` | | `Default_report404_6` | +| default-controller | PATCH | `/admin-api/report/**` | | `Default_report404_4` | +| default-controller | POST | `/admin-api/report/**` | | `Default_report404_1` | +| default-controller | PUT | `/admin-api/report/**` | | `Default_report404_2` | +| default-controller | DELETE | `/admin-api/trade/**` | | `Default_mall404_3` | +| default-controller | GET | `/admin-api/trade/**` | | `Default_mall404` | +| default-controller | HEAD | `/admin-api/trade/**` | | `Default_mall404_5` | +| default-controller | OPTIONS | `/admin-api/trade/**` | | `Default_mall404_6` | +| default-controller | PATCH | `/admin-api/trade/**` | | `Default_mall404_4` | +| default-controller | POST | `/admin-api/trade/**` | | `Default_mall404_1` | +| default-controller | PUT | `/admin-api/trade/**` | | `Default_mall404_2` | +| pay-pal-payment-controller | GET | `/admin-api/paypal/cancel` | | `PayPalPayment_cancel` | +| pay-pal-payment-controller | GET | `/admin-api/paypal/capture-order` | | `PayPalPayment_captureOrder` | +| pay-pal-payment-controller | POST | `/admin-api/paypal/create-order` | | `PayPalPayment_createOrder` | +| pay-pal-payment-controller | GET | `/admin-api/paypal/get-order` | | `PayPalPayment_getOrder` | +| pay-pal-payment-controller | GET | `/admin-api/paypal/get-refund` | | `PayPalPayment_getRefund` | +| pay-pal-payment-controller | POST | `/admin-api/paypal/refund-captured-payment` | | `PayPalPayment_refundCapturedPayment` | +| pay-pal-payment-controller | POST | `/admin-api/paypal/search-transaction` | | `PayPalPayment_searchTransaction` | +| pay-pal-payment-controller | GET | `/admin-api/paypal/success` | | `PayPalPayment_success` | +| pay-pal-payment-controller | POST | `/admin-api/paypal/track-order` | | `PayPalPayment_trackOrder` | +| pay-pal-webhook-controller | POST | `/admin-api/paypal/webhook/payment` | | `PayPalWebhook_receivePayPalWebhook` | +| 用户 App - 地区 | GET | `/app-api/system/area/tree` | 获得地区树 | `AppArea_getAreaTree` | +| 用户 App - 字典数据 | GET | `/app-api/system/dict-data/type` | 根据字典类型查询字典数据信息 | `AppDictData_getDictDataListByType` | +| 用户 App - 租户 | GET | `/app-api/system/tenant/get-by-website` | 使用域名,获得租户信息 | `AppTenant_getTenantByWebsite` | +| 管理后台 - API 访问日志 | GET | `/admin-api/infra/api-access-log/export-excel` | 导出API 访问日志 Excel | `ApiAccessLog_exportApiAccessLogExcel` | +| 管理后台 - API 访问日志 | GET | `/admin-api/infra/api-access-log/page` | 获得API 访问日志分页 | `ApiAccessLog_getApiAccessLogPage` | +| 管理后台 - API 错误日志 | GET | `/admin-api/infra/api-error-log/export-excel` | 导出 API 错误日志 Excel | `ApiErrorLog_exportApiErrorLogExcel` | +| 管理后台 - API 错误日志 | GET | `/admin-api/infra/api-error-log/page` | 获得 API 错误日志分页 | `ApiErrorLog_getApiErrorLogPage` | +| 管理后台 - API 错误日志 | PUT | `/admin-api/infra/api-error-log/update-status` | 更新 API 错误日志的状态 | `ApiErrorLog_updateApiErrorLogProcess` | +| 管理后台 - Banner管理 | POST | `/admin-api/jh/banner/create` | 创建Banner管理 | `Banner_createBanner` | +| 管理后台 - Banner管理 | DELETE | `/admin-api/jh/banner/delete` | 删除Banner管理 | `Banner_deleteBanner` | +| 管理后台 - Banner管理 | DELETE | `/admin-api/jh/banner/delete-list` | 批量删除Banner管理 | `Banner_deleteBannerList` | +| 管理后台 - Banner管理 | GET | `/admin-api/jh/banner/export-excel` | 导出Banner管理 Excel | `Banner_exportBannerExcel` | +| 管理后台 - Banner管理 | GET | `/admin-api/jh/banner/get` | 获得Banner管理 | `Banner_getBanner` | +| 管理后台 - Banner管理 | GET | `/admin-api/jh/banner/get-import-template` | 获得导入Banner管理模板 | `Banner_getImportTemplate` | +| 管理后台 - Banner管理 | POST | `/admin-api/jh/banner/import-excel` | 导入Banner管理Excel | `Banner_importBannerExcel` | +| 管理后台 - Banner管理 | GET | `/admin-api/jh/banner/page` | 获得Banner管理分页 | `Banner_getBannerPage` | +| 管理后台 - Banner管理 | PUT | `/admin-api/jh/banner/update` | 更新Banner管理 | `Banner_updateBanner` | +| 管理后台 - FAQ分类 | POST | `/admin-api/jh/faq-cate/create` | 创建FAQ分类 | `FaqCate_createFaqCate` | +| 管理后台 - FAQ分类 | DELETE | `/admin-api/jh/faq-cate/delete` | 删除FAQ分类 | `FaqCate_deleteFaqCate` | +| 管理后台 - FAQ分类 | GET | `/admin-api/jh/faq-cate/export-excel` | 导出FAQ分类 Excel | `FaqCate_exportFaqCateExcel` | +| 管理后台 - FAQ分类 | GET | `/admin-api/jh/faq-cate/get` | 获得FAQ分类 | `FaqCate_getFaqCate` | +| 管理后台 - FAQ分类 | GET | `/admin-api/jh/faq-cate/get-import-template` | 获得导入FAQ分类模板 | `FaqCate_getImportTemplate` | +| 管理后台 - FAQ分类 | POST | `/admin-api/jh/faq-cate/import-excel` | 导入FAQ分类Excel | `FaqCate_importFaqCateExcel` | +| 管理后台 - FAQ分类 | GET | `/admin-api/jh/faq-cate/list` | 获得FAQ分类列表 | `FaqCate_getFaqCateList` | +| 管理后台 - FAQ分类 | PUT | `/admin-api/jh/faq-cate/update` | 更新FAQ分类 | `FaqCate_updateFaqCate` | +| 管理后台 - FAQ数据 | GET | `/admin-api/jh/faq/cate-list` | 获得FAQ分类下拉列表 | `Faq_getFaqCateList` | +| 管理后台 - FAQ数据 | POST | `/admin-api/jh/faq/create` | 创建FAQ数据 | `Faq_createFaq` | +| 管理后台 - FAQ数据 | DELETE | `/admin-api/jh/faq/delete` | 删除FAQ数据 | `Faq_deleteFaq` | +| 管理后台 - FAQ数据 | DELETE | `/admin-api/jh/faq/delete-list` | 批量删除FAQ数据 | `Faq_deleteFaqList` | +| 管理后台 - FAQ数据 | GET | `/admin-api/jh/faq/export-excel` | 导出FAQ数据 Excel | `Faq_exportFaqExcel` | +| 管理后台 - FAQ数据 | GET | `/admin-api/jh/faq/get` | 获得FAQ数据 | `Faq_getFaq` | +| 管理后台 - FAQ数据 | GET | `/admin-api/jh/faq/get-import-template` | 获得导入FAQ数据模板 | `Faq_getImportTemplate` | +| 管理后台 - FAQ数据 | POST | `/admin-api/jh/faq/import-excel` | 导入FAQ数据Excel | `Faq_importFaqExcel` | +| 管理后台 - FAQ数据 | GET | `/admin-api/jh/faq/page` | 获得FAQ数据分页 | `Faq_getFaqPage` | +| 管理后台 - FAQ数据 | PUT | `/admin-api/jh/faq/update` | 更新FAQ数据 | `Faq_updateFaq` | +| 管理后台 - FAQ联系数据 | POST | `/admin-api/jh/faq-contact-us/create` | 创建FAQ联系数据 | `FaqContactUs_createFaqContactUs` | +| 管理后台 - FAQ联系数据 | DELETE | `/admin-api/jh/faq-contact-us/delete` | 删除FAQ联系数据 | `FaqContactUs_deleteFaqContactUs` | +| 管理后台 - FAQ联系数据 | DELETE | `/admin-api/jh/faq-contact-us/delete-list` | 批量删除FAQ联系数据 | `FaqContactUs_deleteFaqContactUsList` | +| 管理后台 - FAQ联系数据 | GET | `/admin-api/jh/faq-contact-us/export-excel` | 导出FAQ联系数据 Excel | `FaqContactUs_exportFaqContactUsExcel` | +| 管理后台 - FAQ联系数据 | GET | `/admin-api/jh/faq-contact-us/get` | 获得FAQ联系数据 | `FaqContactUs_getFaqContactUs` | +| 管理后台 - FAQ联系数据 | GET | `/admin-api/jh/faq-contact-us/get-import-template` | 获得导入FAQ联系数据模板 | `FaqContactUs_getImportTemplate` | +| 管理后台 - FAQ联系数据 | POST | `/admin-api/jh/faq-contact-us/import-excel` | 导入FAQ联系数据Excel | `FaqContactUs_importFaqContactUsExcel` | +| 管理后台 - FAQ联系数据 | GET | `/admin-api/jh/faq-contact-us/page` | 获得FAQ联系数据分页 | `FaqContactUs_getFaqContactUsPage` | +| 管理后台 - FAQ联系数据 | PUT | `/admin-api/jh/faq-contact-us/update` | 更新FAQ联系数据 | `FaqContactUs_updateFaqContactUs` | +| 管理后台 - LX 亚马逊FBA货件详情 | POST | `/admin-api/lx/fba-inbound-shipment-detail/create` | 创建LX 亚马逊FBA货件详情 | `LxFbaInboundShipmentDetail_createFbaInboundShipmentDetail` | +| 管理后台 - LX 亚马逊FBA货件详情 | DELETE | `/admin-api/lx/fba-inbound-shipment-detail/delete` | 删除LX 亚马逊FBA货件详情 | `LxFbaInboundShipmentDetail_deleteFbaInboundShipmentDetail` | +| 管理后台 - LX 亚马逊FBA货件详情 | DELETE | `/admin-api/lx/fba-inbound-shipment-detail/delete-list` | 批量删除LX 亚马逊FBA货件详情 | `LxFbaInboundShipmentDetail_deleteFbaInboundShipmentDetailList` | +| 管理后台 - LX 亚马逊FBA货件详情 | GET | `/admin-api/lx/fba-inbound-shipment-detail/export-excel` | 导出LX 亚马逊FBA货件详情 Excel | `LxFbaInboundShipmentDetail_exportFbaInboundShipmentDetailExcel` | +| 管理后台 - LX 亚马逊FBA货件详情 | GET | `/admin-api/lx/fba-inbound-shipment-detail/get` | 获得LX 亚马逊FBA货件详情 | `LxFbaInboundShipmentDetail_getFbaInboundShipmentDetail` | +| 管理后台 - LX 亚马逊FBA货件详情 | GET | `/admin-api/lx/fba-inbound-shipment-detail/get-import-template` | 获得导入LX 亚马逊FBA货件详情模板 | `LxFbaInboundShipmentDetail_getImportTemplate` | +| 管理后台 - LX 亚马逊FBA货件详情 | POST | `/admin-api/lx/fba-inbound-shipment-detail/import-excel` | 导入LX 亚马逊FBA货件详情Excel | `LxFbaInboundShipmentDetail_importFbaInboundShipmentDetailExcel` | +| 管理后台 - LX 亚马逊FBA货件详情 | GET | `/admin-api/lx/fba-inbound-shipment-detail/page` | 获得LX 亚马逊FBA货件详情分页 | `LxFbaInboundShipmentDetail_getFbaInboundShipmentDetailPage` | +| 管理后台 - LX 亚马逊FBA货件详情 | PUT | `/admin-api/lx/fba-inbound-shipment-detail/update` | 更新LX 亚马逊FBA货件详情 | `LxFbaInboundShipmentDetail_updateFbaInboundShipmentDetail` | +| 管理后台 - LX 亚马逊店铺信息 | POST | `/admin-api/lx/amazon-shop/create` | 创建LX 亚马逊店铺信息 | `LxAmazonShop_createAmazonShop` | +| 管理后台 - LX 亚马逊店铺信息 | DELETE | `/admin-api/lx/amazon-shop/delete` | 删除LX 亚马逊店铺信息 | `LxAmazonShop_deleteAmazonShop` | +| 管理后台 - LX 亚马逊店铺信息 | DELETE | `/admin-api/lx/amazon-shop/delete-list` | 批量删除LX 亚马逊店铺信息 | `LxAmazonShop_deleteAmazonShopList` | +| 管理后台 - LX 亚马逊店铺信息 | GET | `/admin-api/lx/amazon-shop/export-excel` | 导出LX 亚马逊店铺信息 Excel | `LxAmazonShop_exportAmazonShopExcel` | +| 管理后台 - LX 亚马逊店铺信息 | GET | `/admin-api/lx/amazon-shop/get` | 获得LX 亚马逊店铺信息 | `LxAmazonShop_getAmazonShop` | +| 管理后台 - LX 亚马逊店铺信息 | GET | `/admin-api/lx/amazon-shop/get-import-template` | 获得导入LX 亚马逊店铺信息模板 | `LxAmazonShop_getImportTemplate` | +| 管理后台 - LX 亚马逊店铺信息 | POST | `/admin-api/lx/amazon-shop/import-excel` | 导入LX 亚马逊店铺信息Excel | `LxAmazonShop_importAmazonShopExcel` | +| 管理后台 - LX 亚马逊店铺信息 | GET | `/admin-api/lx/amazon-shop/page` | 获得LX 亚马逊店铺信息分页 | `LxAmazonShop_getAmazonShopPage` | +| 管理后台 - LX 亚马逊店铺信息 | PUT | `/admin-api/lx/amazon-shop/update` | 更新LX 亚马逊店铺信息 | `LxAmazonShop_updateAmazonShop` | +| 管理后台 - OAuth2 客户端 | POST | `/admin-api/system/oauth2-client/create` | 创建 OAuth2 客户端 | `OAuth2Client_createOAuth2Client` | +| 管理后台 - OAuth2 客户端 | DELETE | `/admin-api/system/oauth2-client/delete` | 删除 OAuth2 客户端 | `OAuth2Client_deleteOAuth2Client` | +| 管理后台 - OAuth2 客户端 | DELETE | `/admin-api/system/oauth2-client/delete-list` | 批量删除 OAuth2 客户端 | `OAuth2Client_deleteOAuth2ClientList` | +| 管理后台 - OAuth2 客户端 | GET | `/admin-api/system/oauth2-client/get` | 获得 OAuth2 客户端 | `OAuth2Client_getOAuth2Client` | +| 管理后台 - OAuth2 客户端 | GET | `/admin-api/system/oauth2-client/page` | 获得 OAuth2 客户端分页 | `OAuth2Client_getOAuth2ClientPage` | +| 管理后台 - OAuth2 客户端 | PUT | `/admin-api/system/oauth2-client/update` | 更新 OAuth2 客户端 | `OAuth2Client_updateOAuth2Client` | +| 管理后台 - OAuth2.0 令牌 | DELETE | `/admin-api/system/oauth2-token/delete` | 删除访问令牌 | `OAuth2Token_deleteAccessToken` | +| 管理后台 - OAuth2.0 令牌 | DELETE | `/admin-api/system/oauth2-token/delete-list` | 批量删除访问令牌 | `OAuth2Token_deleteAccessTokenList` | +| 管理后台 - OAuth2.0 令牌 | GET | `/admin-api/system/oauth2-token/page` | 获得访问令牌分页 | `OAuth2Token_getAccessTokenPage` | +| 管理后台 - OAuth2.0 授权 | GET | `/admin-api/system/oauth2/authorize` | 获得授权信息 | `OAuth2Open_authorize` | +| 管理后台 - OAuth2.0 授权 | POST | `/admin-api/system/oauth2/authorize` | 申请授权 | `OAuth2Open_approveOrDeny` | +| 管理后台 - OAuth2.0 授权 | POST | `/admin-api/system/oauth2/check-token` | 校验访问令牌 | `OAuth2Open_checkToken` | +| 管理后台 - OAuth2.0 授权 | DELETE | `/admin-api/system/oauth2/token` | 删除访问令牌 | `OAuth2Open_revokeToken` | +| 管理后台 - OAuth2.0 授权 | POST | `/admin-api/system/oauth2/token` | 获得访问令牌 | `OAuth2Open_postAccessToken` | +| 管理后台 - OAuth2.0 用户 | GET | `/admin-api/system/oauth2/user/get` | 获得用户基本信息 | `OAuth2User_getUserInfo` | +| 管理后台 - OAuth2.0 用户 | PUT | `/admin-api/system/oauth2/user/update` | 更新用户基本信息 | `OAuth2User_updateUserInfo` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | POST | `/admin-api/paypal/webhook-idempotent/create` | 创建PayPal Webhook 幂等表(防重复处理) | `WebhookIdempotent_createWebhookIdempotent` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | DELETE | `/admin-api/paypal/webhook-idempotent/delete` | 删除PayPal Webhook 幂等表(防重复处理) | `WebhookIdempotent_deleteWebhookIdempotent` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | DELETE | `/admin-api/paypal/webhook-idempotent/delete-list` | 批量删除PayPal Webhook 幂等表(防重复处理) | `WebhookIdempotent_deleteWebhookIdempotentList` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | GET | `/admin-api/paypal/webhook-idempotent/export-excel` | 导出PayPal Webhook 幂等表(防重复处理) Excel | `WebhookIdempotent_exportWebhookIdempotentExcel` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | GET | `/admin-api/paypal/webhook-idempotent/get` | 获得PayPal Webhook 幂等表(防重复处理) | `WebhookIdempotent_getWebhookIdempotent` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | GET | `/admin-api/paypal/webhook-idempotent/get-import-template` | 获得导入PayPal Webhook 幂等表(防重复处理)模板 | `WebhookIdempotent_getImportTemplate` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | POST | `/admin-api/paypal/webhook-idempotent/import-excel` | 导入PayPal Webhook 幂等表(防重复处理)Excel | `WebhookIdempotent_importWebhookIdempotentExcel` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | GET | `/admin-api/paypal/webhook-idempotent/page` | 获得PayPal Webhook 幂等表(防重复处理)分页 | `WebhookIdempotent_getWebhookIdempotentPage` | +| 管理后台 - PayPal Webhook 幂等表(防重复处理) | PUT | `/admin-api/paypal/webhook-idempotent/update` | 更新PayPal Webhook 幂等表(防重复处理) | `WebhookIdempotent_updateWebhookIdempotent` | +| 管理后台 - Redis 监控 | GET | `/admin-api/infra/redis/get-monitor-info` | 获得 Redis 监控信息 | `Redis_getRedisMonitorInfo` | +| 管理后台 - app版本号管理 | POST | `/admin-api/jh/appversion/create` | 创建app版本号管理 | `Appversion_createAppversion` | +| 管理后台 - app版本号管理 | DELETE | `/admin-api/jh/appversion/delete` | 删除app版本号管理 | `Appversion_deleteAppversion` | +| 管理后台 - app版本号管理 | DELETE | `/admin-api/jh/appversion/delete-list` | 批量删除app版本号管理 | `Appversion_deleteAppversionList` | +| 管理后台 - app版本号管理 | GET | `/admin-api/jh/appversion/export-excel` | 导出app版本号管理 Excel | `Appversion_exportAppversionExcel` | +| 管理后台 - app版本号管理 | GET | `/admin-api/jh/appversion/get` | 获得app版本号管理 | `Appversion_getAppversion` | +| 管理后台 - app版本号管理 | GET | `/admin-api/jh/appversion/get-import-template` | 获得导入app版本号管理模板 | `Appversion_getImportTemplate` | +| 管理后台 - app版本号管理 | POST | `/admin-api/jh/appversion/import-excel` | 导入app版本号管理Excel | `Appversion_importAppversionExcel` | +| 管理后台 - app版本号管理 | GET | `/admin-api/jh/appversion/page` | 获得app版本号管理分页 | `Appversion_getAppversionPage` | +| 管理后台 - app版本号管理 | PUT | `/admin-api/jh/appversion/update` | 更新app版本号管理 | `Appversion_updateAppversion` | +| 管理后台 - blog分类 | POST | `/admin-api/jh/blog-cate/create` | 创建blog分类 | `BlogCate_createBlogCate` | +| 管理后台 - blog分类 | DELETE | `/admin-api/jh/blog-cate/delete` | 删除blog分类 | `BlogCate_deleteBlogCate` | +| 管理后台 - blog分类 | DELETE | `/admin-api/jh/blog-cate/delete-list` | 批量删除blog分类 | `BlogCate_deleteBlogCateList` | +| 管理后台 - blog分类 | GET | `/admin-api/jh/blog-cate/export-excel` | 导出blog分类 Excel | `BlogCate_exportBlogCateExcel` | +| 管理后台 - blog分类 | GET | `/admin-api/jh/blog-cate/get` | 获得blog分类 | `BlogCate_getBlogCate` | +| 管理后台 - blog分类 | GET | `/admin-api/jh/blog-cate/get-import-template` | 获得导入blog分类模板 | `BlogCate_getImportTemplate` | +| 管理后台 - blog分类 | POST | `/admin-api/jh/blog-cate/import-excel` | 导入blog分类Excel | `BlogCate_importBlogCateExcel` | +| 管理后台 - blog分类 | GET | `/admin-api/jh/blog-cate/page` | 获得blog分类分页 | `BlogCate_getBlogCatePage` | +| 管理后台 - blog分类 | PUT | `/admin-api/jh/blog-cate/update` | 更新blog分类 | `BlogCate_updateBlogCate` | +| 管理后台 - blog管理 | GET | `/admin-api/jh/blog/blog-cate-relation/list-by-blog-id` | 获得blog分类列表 | `Blog_getBlogCateRelationListByBlogId` | +| 管理后台 - blog管理 | POST | `/admin-api/jh/blog/create` | 创建blog管理 | `Blog_createBlog` | +| 管理后台 - blog管理 | DELETE | `/admin-api/jh/blog/delete` | 删除blog管理 | `Blog_deleteBlog` | +| 管理后台 - blog管理 | DELETE | `/admin-api/jh/blog/delete-list` | 批量删除blog管理 | `Blog_deleteBlogList` | +| 管理后台 - blog管理 | GET | `/admin-api/jh/blog/export-excel` | 导出blog管理 Excel | `Blog_exportBlogExcel` | +| 管理后台 - blog管理 | GET | `/admin-api/jh/blog/get` | 获得blog管理 | `Blog_getBlog` | +| 管理后台 - blog管理 | GET | `/admin-api/jh/blog/get-import-template` | 获得导入blog管理模板 | `Blog_getImportTemplate` | +| 管理后台 - blog管理 | POST | `/admin-api/jh/blog/import-excel` | 导入blog管理Excel | `Blog_importBlogExcel` | +| 管理后台 - blog管理 | GET | `/admin-api/jh/blog/page` | 获得blog管理分页 | `Blog_getBlogPage` | +| 管理后台 - blog管理 | PUT | `/admin-api/jh/blog/update` | 更新blog管理 | `Blog_updateBlog` | +| 管理后台 - news分类 | POST | `/admin-api/jh/news-cate/create` | 创建news分类 | `NewsCate_createNewsCate` | +| 管理后台 - news分类 | DELETE | `/admin-api/jh/news-cate/delete` | 删除news分类 | `NewsCate_deleteNewsCate` | +| 管理后台 - news分类 | DELETE | `/admin-api/jh/news-cate/delete-list` | 批量删除news分类 | `NewsCate_deleteNewsCateList` | +| 管理后台 - news分类 | GET | `/admin-api/jh/news-cate/export-excel` | 导出news分类 Excel | `NewsCate_exportNewsCateExcel` | +| 管理后台 - news分类 | GET | `/admin-api/jh/news-cate/get` | 获得news分类 | `NewsCate_getNewsCate` | +| 管理后台 - news分类 | GET | `/admin-api/jh/news-cate/get-import-template` | 获得导入news分类模板 | `NewsCate_getImportTemplate` | +| 管理后台 - news分类 | POST | `/admin-api/jh/news-cate/import-excel` | 导入news分类Excel | `NewsCate_importNewsCateExcel` | +| 管理后台 - news分类 | GET | `/admin-api/jh/news-cate/page` | 获得news分类分页 | `NewsCate_getNewsCatePage` | +| 管理后台 - news分类 | PUT | `/admin-api/jh/news-cate/update` | 更新news分类 | `NewsCate_updateNewsCate` | +| 管理后台 - news管理 | POST | `/admin-api/jh/news/create` | 创建news管理 | `News_createNews` | +| 管理后台 - news管理 | DELETE | `/admin-api/jh/news/delete` | 删除news管理 | `News_deleteNews` | +| 管理后台 - news管理 | DELETE | `/admin-api/jh/news/delete-list` | 批量删除news管理 | `News_deleteNewsList` | +| 管理后台 - news管理 | GET | `/admin-api/jh/news/export-excel` | 导出news管理 Excel | `News_exportNewsExcel` | +| 管理后台 - news管理 | GET | `/admin-api/jh/news/get` | 获得news管理 | `News_getNews` | +| 管理后台 - news管理 | GET | `/admin-api/jh/news/get-import-template` | 获得导入news管理模板 | `News_getImportTemplate` | +| 管理后台 - news管理 | POST | `/admin-api/jh/news/import-excel` | 导入news管理Excel | `News_importNewsExcel` | +| 管理后台 - news管理 | GET | `/admin-api/jh/news/news-cate-relation/list-by-news-id` | 获得news分类关联列表 | `News_getNewsCateRelationListByNewsId` | +| 管理后台 - news管理 | GET | `/admin-api/jh/news/page` | 获得news管理分页 | `News_getNewsPage` | +| 管理后台 - news管理 | PUT | `/admin-api/jh/news/update` | 更新news管理 | `News_updateNews` | +| 管理后台 - 二维码 | POST | `/admin-api/jh/download-qrcode/create` | 创建二维码 | `DownloadQrcode_createDownloadQrcode` | +| 管理后台 - 二维码 | DELETE | `/admin-api/jh/download-qrcode/delete` | 删除二维码 | `DownloadQrcode_deleteDownloadQrcode` | +| 管理后台 - 二维码 | DELETE | `/admin-api/jh/download-qrcode/delete-list` | 批量删除二维码 | `DownloadQrcode_deleteDownloadQrcodeList` | +| 管理后台 - 二维码 | GET | `/admin-api/jh/download-qrcode/export-excel` | 导出二维码 Excel | `DownloadQrcode_exportDownloadQrcodeExcel` | +| 管理后台 - 二维码 | GET | `/admin-api/jh/download-qrcode/get` | 获得二维码 | `DownloadQrcode_getDownloadQrcode` | +| 管理后台 - 二维码 | GET | `/admin-api/jh/download-qrcode/get-import-template` | 获得导入二维码模板 | `DownloadQrcode_getImportTemplate` | +| 管理后台 - 二维码 | POST | `/admin-api/jh/download-qrcode/import-excel` | 导入二维码Excel | `DownloadQrcode_importDownloadQrcodeExcel` | +| 管理后台 - 二维码 | GET | `/admin-api/jh/download-qrcode/page` | 获得二维码分页(含统计) | `DownloadQrcode_getDownloadQrcodePage` | +| 管理后台 - 二维码 | PUT | `/admin-api/jh/download-qrcode/update` | 更新二维码 | `DownloadQrcode_updateDownloadQrcode` | +| 管理后台 - 产品 | PUT | `/admin-api/jh/product/change-status` | 批量上下架产品 | `Product_updateProductStatus` | +| 管理后台 - 产品 | POST | `/admin-api/jh/product/create` | 创建产品 | `Product_createProduct` | +| 管理后台 - 产品 | DELETE | `/admin-api/jh/product/delete` | 删除产品 | `Product_deleteProduct` | +| 管理后台 - 产品 | DELETE | `/admin-api/jh/product/delete-list` | 批量删除产品 | `Product_deleteProductList` | +| 管理后台 - 产品 | GET | `/admin-api/jh/product/get` | 获得产品 | `Product_getProduct` | +| 管理后台 - 产品 | GET | `/admin-api/jh/product/page` | 获得产品分页 | `Product_getProductPage` | +| 管理后台 - 产品 | GET | `/admin-api/jh/product/product-attr/list-by-product-id` | 获得产品规格类型关联列表 | `Product_getProductAttrListByProductId` | +| 管理后台 - 产品 | GET | `/admin-api/jh/product/product-detail/list-by-product-id` | 获得产品详情列表 | `Product_getProductDetailListByProductId` | +| 管理后台 - 产品 | GET | `/admin-api/jh/product/product-sku/list-by-product-id` | 获得产品规格列表 | `Product_getProductSkuListByProductId` | +| 管理后台 - 产品 | GET | `/admin-api/jh/product/product/sku-list` | 获得产品及规格列表-优惠券中使用 | `Product_getProductSkuList` | +| 管理后台 - 产品 | PUT | `/admin-api/jh/product/update` | 更新产品 | `Product_updateProduct` | +| 管理后台 - 产品分类 | PUT | `/admin-api/jh/product-cate/change-status` | 修改产品分类启用/停用状态 | `ProductCate_updateProductCateStatus` | +| 管理后台 - 产品分类 | POST | `/admin-api/jh/product-cate/create` | 创建产品分类 | `ProductCate_createProductCate` | +| 管理后台 - 产品分类 | DELETE | `/admin-api/jh/product-cate/delete` | 删除产品分类 | `ProductCate_deleteProductCate` | +| 管理后台 - 产品分类 | DELETE | `/admin-api/jh/product-cate/delete-list` | 批量删除产品分类 | `ProductCate_deleteProductCateList` | +| 管理后台 - 产品分类 | GET | `/admin-api/jh/product-cate/get` | 获得产品分类 | `ProductCate_getProductCate` | +| 管理后台 - 产品分类 | GET | `/admin-api/jh/product-cate/page` | 获得产品分类分页 | `ProductCate_getProductCatePage` | +| 管理后台 - 产品分类 | PUT | `/admin-api/jh/product-cate/update` | 更新产品分类 | `ProductCate_updateProductCate` | +| 管理后台 - 产品属性 | PUT | `/admin-api/jh/product-attr-type/change-status` | 启用/停用产品属性状态 | `ProductAttrType_updateProductAttrTypeStatus` | +| 管理后台 - 产品属性 | POST | `/admin-api/jh/product-attr-type/create` | 创建产品属性 | `ProductAttrType_createProductAttrType` | +| 管理后台 - 产品属性 | DELETE | `/admin-api/jh/product-attr-type/delete` | 删除产品属性 | `ProductAttrType_deleteProductAttrType` | +| 管理后台 - 产品属性 | DELETE | `/admin-api/jh/product-attr-type/delete-list` | 批量删除产品属性 | `ProductAttrType_deleteProductAttrTypeList` | +| 管理后台 - 产品属性 | GET | `/admin-api/jh/product-attr-type/get` | 获得产品属性 | `ProductAttrType_getProductAttrType` | +| 管理后台 - 产品属性 | GET | `/admin-api/jh/product-attr-type/page` | 获得产品属性分页 | `ProductAttrType_getProductAttrTypePage` | +| 管理后台 - 产品属性 | PUT | `/admin-api/jh/product-attr-type/update` | 更新产品属性 | `ProductAttrType_updateProductAttrType` | +| 管理后台 - 产品属性值 | POST | `/admin-api/jh/product-attr-data/create` | 创建产品属性值 | `ProductAttrData_createProductAttrData` | +| 管理后台 - 产品属性值 | DELETE | `/admin-api/jh/product-attr-data/delete` | 删除产品属性值 | `ProductAttrData_deleteProductAttrData` | +| 管理后台 - 产品属性值 | DELETE | `/admin-api/jh/product-attr-data/delete-list` | 批量删除产品属性值 | `ProductAttrData_deleteProductAttrDataList` | +| 管理后台 - 产品属性值 | GET | `/admin-api/jh/product-attr-data/get` | 获得产品属性值 | `ProductAttrData_getProductAttrData` | +| 管理后台 - 产品属性值 | GET | `/admin-api/jh/product-attr-data/page` | 获得产品属性值分页 | `ProductAttrData_getProductAttrDataPage` | +| 管理后台 - 产品属性值 | PUT | `/admin-api/jh/product-attr-data/update` | 更新产品属性值 | `ProductAttrData_updateProductAttrData` | +| 管理后台 - 代码生成器 | POST | `/admin-api/infra/codegen/create-list` | 基于数据库的表结构,创建代码生成器的表和字段定义 | `Codegen_createCodegenList` | +| 管理后台 - 代码生成器 | GET | `/admin-api/infra/codegen/db/table/list` | 获得数据库自带的表定义列表 | `Codegen_getDatabaseTableList` | +| 管理后台 - 代码生成器 | DELETE | `/admin-api/infra/codegen/delete` | 删除数据库的表和字段定义 | `Codegen_deleteCodegen` | +| 管理后台 - 代码生成器 | DELETE | `/admin-api/infra/codegen/delete-list` | 批量删除数据库的表和字段定义 | `Codegen_deleteCodegenList` | +| 管理后台 - 代码生成器 | GET | `/admin-api/infra/codegen/detail` | 获得表和字段的明细 | `Codegen_getCodegenDetail` | +| 管理后台 - 代码生成器 | GET | `/admin-api/infra/codegen/download` | 下载生成代码 | `Codegen_downloadCodegen` | +| 管理后台 - 代码生成器 | GET | `/admin-api/infra/codegen/preview` | 预览生成代码 | `Codegen_previewCodegen` | +| 管理后台 - 代码生成器 | PUT | `/admin-api/infra/codegen/sync-from-db` | 基于数据库的表结构,同步数据库的表和字段定义 | `Codegen_syncCodegenFromDB` | +| 管理后台 - 代码生成器 | GET | `/admin-api/infra/codegen/table/list` | 获得表定义列表 | `Codegen_getCodegenTableList` | +| 管理后台 - 代码生成器 | GET | `/admin-api/infra/codegen/table/page` | 获得表定义分页 | `Codegen_getCodegenTablePage` | +| 管理后台 - 代码生成器 | PUT | `/admin-api/infra/codegen/update` | 更新数据库的表和字段定义 | `Codegen_updateCodegen` | +| 管理后台 - 协议 | POST | `/admin-api/jh/agreement/create` | 创建协议 | `Agreement_createAgreement` | +| 管理后台 - 协议 | DELETE | `/admin-api/jh/agreement/delete` | 删除协议 | `Agreement_deleteAgreement` | +| 管理后台 - 协议 | DELETE | `/admin-api/jh/agreement/delete-list` | 批量删除协议 | `Agreement_deleteAgreementList` | +| 管理后台 - 协议 | GET | `/admin-api/jh/agreement/export-excel` | 导出协议 Excel | `Agreement_exportAgreementExcel` | +| 管理后台 - 协议 | GET | `/admin-api/jh/agreement/get` | 获得协议 | `Agreement_getAgreement` | +| 管理后台 - 协议 | GET | `/admin-api/jh/agreement/get-import-template` | 获得导入协议模板 | `Agreement_getImportTemplate` | +| 管理后台 - 协议 | POST | `/admin-api/jh/agreement/import-excel` | 导入协议Excel | `Agreement_importAgreementExcel` | +| 管理后台 - 协议 | GET | `/admin-api/jh/agreement/page` | 获得协议分页 | `Agreement_getAgreementPage` | +| 管理后台 - 协议 | PUT | `/admin-api/jh/agreement/update` | 更新协议 | `Agreement_updateAgreement` | +| 管理后台 - 参数配置 | POST | `/admin-api/infra/config/create` | 创建参数配置 | `Config_createConfig` | +| 管理后台 - 参数配置 | DELETE | `/admin-api/infra/config/delete` | 删除参数配置 | `Config_deleteConfig` | +| 管理后台 - 参数配置 | DELETE | `/admin-api/infra/config/delete-list` | 批量删除参数配置 | `Config_deleteConfigList` | +| 管理后台 - 参数配置 | GET | `/admin-api/infra/config/export-excel` | 导出参数配置 | `Config_exportConfig` | +| 管理后台 - 参数配置 | GET | `/admin-api/infra/config/get` | 获得参数配置 | `Config_getConfig` | +| 管理后台 - 参数配置 | GET | `/admin-api/infra/config/get-value-by-key` | 根据参数键名查询参数值 | `Config_getConfigKey` | +| 管理后台 - 参数配置 | GET | `/admin-api/infra/config/page` | 获取参数配置分页 | `Config_getConfigPage` | +| 管理后台 - 参数配置 | PUT | `/admin-api/infra/config/update` | 修改参数配置 | `Config_updateConfig` | +| 管理后台 - 合作联系数据 | POST | `/admin-api/jh/cooperation/create` | 创建合作联系数据 | `Cooperation_createCooperation` | +| 管理后台 - 合作联系数据 | DELETE | `/admin-api/jh/cooperation/delete` | 删除合作联系数据 | `Cooperation_deleteCooperation` | +| 管理后台 - 合作联系数据 | DELETE | `/admin-api/jh/cooperation/delete-list` | 批量删除合作联系数据 | `Cooperation_deleteCooperationList` | +| 管理后台 - 合作联系数据 | GET | `/admin-api/jh/cooperation/export-excel` | 导出合作联系数据 Excel | `Cooperation_exportCooperationExcel` | +| 管理后台 - 合作联系数据 | GET | `/admin-api/jh/cooperation/get` | 获得合作联系数据 | `Cooperation_getCooperation` | +| 管理后台 - 合作联系数据 | GET | `/admin-api/jh/cooperation/get-import-template` | 获得导入合作联系数据模板 | `Cooperation_getImportTemplate` | +| 管理后台 - 合作联系数据 | POST | `/admin-api/jh/cooperation/import-excel` | 导入合作联系数据Excel | `Cooperation_importCooperationExcel` | +| 管理后台 - 合作联系数据 | GET | `/admin-api/jh/cooperation/page` | 获得合作联系数据分页 | `Cooperation_getCooperationPage` | +| 管理后台 - 合作联系数据 | PUT | `/admin-api/jh/cooperation/update` | 更新合作联系数据 | `Cooperation_updateCooperation` | +| 管理后台 - 售后 | GET | `/admin-api/jh/order-after-sale/export-excel` | 导出售后 Excel | `OrderAfterSale_exportOrderAfterSaleExcel` | +| 管理后台 - 售后 | GET | `/admin-api/jh/order-after-sale/get` | 获得售后 | `OrderAfterSale_getOrderAfterSale` | +| 管理后台 - 售后 | GET | `/admin-api/jh/order-after-sale/page` | 获得售后分页 | `OrderAfterSale_getOrderAfterSalePage` | +| 管理后台 - 售后政策 | POST | `/admin-api/jh/after-sales-policy/create` | 创建售后政策 | `AfterSalesPolicy_createAfterSalesPolicy` | +| 管理后台 - 售后政策 | DELETE | `/admin-api/jh/after-sales-policy/delete` | 删除售后政策 | `AfterSalesPolicy_deleteAfterSalesPolicy` | +| 管理后台 - 售后政策 | DELETE | `/admin-api/jh/after-sales-policy/delete-list` | 批量删除售后政策 | `AfterSalesPolicy_deleteAfterSalesPolicyList` | +| 管理后台 - 售后政策 | GET | `/admin-api/jh/after-sales-policy/export-excel` | 导出售后政策 Excel | `AfterSalesPolicy_exportAfterSalesPolicyExcel` | +| 管理后台 - 售后政策 | GET | `/admin-api/jh/after-sales-policy/get` | 获得售后政策 | `AfterSalesPolicy_getAfterSalesPolicy` | +| 管理后台 - 售后政策 | GET | `/admin-api/jh/after-sales-policy/get-import-template` | 获得导入售后政策模板 | `AfterSalesPolicy_getImportTemplate` | +| 管理后台 - 售后政策 | POST | `/admin-api/jh/after-sales-policy/import-excel` | 导入售后政策Excel | `AfterSalesPolicy_importAfterSalesPolicyExcel` | +| 管理后台 - 售后政策 | GET | `/admin-api/jh/after-sales-policy/page` | 获得售后政策分页 | `AfterSalesPolicy_getAfterSalesPolicyPage` | +| 管理后台 - 售后政策 | PUT | `/admin-api/jh/after-sales-policy/update` | 更新售后政策 | `AfterSalesPolicy_updateAfterSalesPolicy` | +| 管理后台 - 售后政策-品牌 | POST | `/admin-api/jh/after-sales-brand/create` | 创建售后政策-品牌 | `AfterSalesBrand_createAfterSalesBrand` | +| 管理后台 - 售后政策-品牌 | DELETE | `/admin-api/jh/after-sales-brand/delete` | 删除售后政策-品牌 | `AfterSalesBrand_deleteAfterSalesBrand` | +| 管理后台 - 售后政策-品牌 | DELETE | `/admin-api/jh/after-sales-brand/delete-list` | 批量删除售后政策-品牌 | `AfterSalesBrand_deleteAfterSalesBrandList` | +| 管理后台 - 售后政策-品牌 | GET | `/admin-api/jh/after-sales-brand/export-excel` | 导出售后政策-品牌 Excel | `AfterSalesBrand_exportAfterSalesBrandExcel` | +| 管理后台 - 售后政策-品牌 | GET | `/admin-api/jh/after-sales-brand/get` | 获得售后政策-品牌 | `AfterSalesBrand_getAfterSalesBrand` | +| 管理后台 - 售后政策-品牌 | GET | `/admin-api/jh/after-sales-brand/get-import-template` | 获得导入售后政策-品牌模板 | `AfterSalesBrand_getImportTemplate` | +| 管理后台 - 售后政策-品牌 | POST | `/admin-api/jh/after-sales-brand/import-excel` | 导入售后政策-品牌Excel | `AfterSalesBrand_importAfterSalesBrandExcel` | +| 管理后台 - 售后政策-品牌 | GET | `/admin-api/jh/after-sales-brand/list-available` | 获得可用的品牌列表 | `AfterSalesBrand_getAvailableBrandList` | +| 管理后台 - 售后政策-品牌 | GET | `/admin-api/jh/after-sales-brand/page` | 获得售后政策-品牌分页 | `AfterSalesBrand_getAfterSalesBrandPage` | +| 管理后台 - 售后政策-品牌 | PUT | `/admin-api/jh/after-sales-brand/update` | 更新售后政策-品牌 | `AfterSalesBrand_updateAfterSalesBrand` | +| 管理后台 - 国家信息 | POST | `/admin-api/jh/address-country/create` | 创建国家信息 | `AddressCountry_createAddressCountry` | +| 管理后台 - 国家信息 | DELETE | `/admin-api/jh/address-country/delete` | 删除国家信息 | `AddressCountry_deleteAddressCountry` | +| 管理后台 - 国家信息 | DELETE | `/admin-api/jh/address-country/delete-list` | 批量删除国家信息 | `AddressCountry_deleteAddressCountryList` | +| 管理后台 - 国家信息 | GET | `/admin-api/jh/address-country/export-excel` | 导出国家信息 Excel | `AddressCountry_exportAddressCountryExcel` | +| 管理后台 - 国家信息 | GET | `/admin-api/jh/address-country/get` | 获得国家信息 | `AddressCountry_getAddressCountry` | +| 管理后台 - 国家信息 | GET | `/admin-api/jh/address-country/get-import-template` | 获得导入国家信息模板 | `AddressCountry_getImportTemplate` | +| 管理后台 - 国家信息 | POST | `/admin-api/jh/address-country/import-excel` | 导入国家信息Excel | `AddressCountry_importAddressCountryExcel` | +| 管理后台 - 国家信息 | GET | `/admin-api/jh/address-country/options-for-shipping` | 获得运费规则国家下拉选项(弃用) | `AddressCountry_getOptionsForShipping` | +| 管理后台 - 国家信息 | GET | `/admin-api/jh/address-country/page` | 获得国家信息分页 | `AddressCountry_getAddressCountryPage` | +| 管理后台 - 国家信息 | PUT | `/admin-api/jh/address-country/update` | 更新国家信息 | `AddressCountry_updateAddressCountry` | +| 管理后台 - 国家信息 | PUT | `/admin-api/jh/address-country/update-status-list` | 批量更新国家信息状态 | `AddressCountry_updateAddressCountryStatusList` | +| 管理后台 - 地区 | GET | `/admin-api/system/area/get-by-ip` | 获得 IP 对应的地区名 | `Area_getAreaByIp` | +| 管理后台 - 地区 | GET | `/admin-api/system/area/tree` | 获得地区树 | `Area_getAreaTree` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | POST | `/admin-api/jh/article/create` | 创建基础数据-说明 | `Article_createArticle` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | DELETE | `/admin-api/jh/article/delete` | 删除基础数据-说明 | `Article_deleteArticle` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | DELETE | `/admin-api/jh/article/delete-list` | 批量删除基础数据-说明 | `Article_deleteArticleList` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | GET | `/admin-api/jh/article/export-excel` | 导出基础数据-说明 Excel | `Article_exportArticleExcel` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | GET | `/admin-api/jh/article/get` | 获得基础数据-说明 | `Article_getArticle` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | GET | `/admin-api/jh/article/get-import-template` | 获得导入基础数据-说明模板 | `Article_getImportTemplate` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | POST | `/admin-api/jh/article/import-excel` | 导入基础数据-说明Excel | `Article_importArticleExcel` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | GET | `/admin-api/jh/article/page` | 获得基础数据-说明分页 | `Article_getArticlePage` | +| 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) | PUT | `/admin-api/jh/article/update` | 更新基础数据-说明 | `Article_updateArticle` | +| 管理后台 - 字典数据 | POST | `/admin-api/system/dict-data/create` | 新增字典数据 | `DictData_createDictData` | +| 管理后台 - 字典数据 | DELETE | `/admin-api/system/dict-data/delete` | 删除字典数据 | `DictData_deleteDictData` | +| 管理后台 - 字典数据 | DELETE | `/admin-api/system/dict-data/delete-list` | 批量删除字典数据 | `DictData_deleteDictDataList` | +| 管理后台 - 字典数据 | GET | `/admin-api/system/dict-data/export-excel` | 导出字典数据 | `DictData_export` | +| 管理后台 - 字典数据 | GET | `/admin-api/system/dict-data/get` | /查询字典数据详细 | `DictData_getDictData` | +| 管理后台 - 字典数据 | GET | `/admin-api/system/dict-data/list-all-simple` | 获得全部字典数据列表 | `DictData_getSimpleDictDataList` | +| 管理后台 - 字典数据 | GET | `/admin-api/system/dict-data/page` | 获得字典类型的分页 | `DictData_getDictTypePage` | +| 管理后台 - 字典数据 | GET | `/admin-api/system/dict-data/simple-list` | 获得全部字典数据列表 | `DictData_getSimpleDictDataList_1` | +| 管理后台 - 字典数据 | PUT | `/admin-api/system/dict-data/update` | 修改字典数据 | `DictData_updateDictData` | +| 管理后台 - 字典类型 | POST | `/admin-api/system/dict-type/create` | 创建字典类型 | `DictType_createDictType` | +| 管理后台 - 字典类型 | DELETE | `/admin-api/system/dict-type/delete` | 删除字典类型 | `DictType_deleteDictType` | +| 管理后台 - 字典类型 | DELETE | `/admin-api/system/dict-type/delete-list` | 批量删除字典类型 | `DictType_deleteDictTypeList` | +| 管理后台 - 字典类型 | GET | `/admin-api/system/dict-type/export-excel` | 导出数据类型 | `DictType_export` | +| 管理后台 - 字典类型 | GET | `/admin-api/system/dict-type/get` | /查询字典类型详细 | `DictType_getDictType` | +| 管理后台 - 字典类型 | GET | `/admin-api/system/dict-type/list-all-simple` | 获得全部字典类型列表 | `DictType_getSimpleDictTypeList` | +| 管理后台 - 字典类型 | GET | `/admin-api/system/dict-type/page` | 获得字典类型的分页列表 | `DictType_pageDictTypes` | +| 管理后台 - 字典类型 | GET | `/admin-api/system/dict-type/simple-list` | 获得全部字典类型列表 | `DictType_getSimpleDictTypeList_1` | +| 管理后台 - 字典类型 | PUT | `/admin-api/system/dict-type/update` | 修改字典类型 | `DictType_updateDictType` | +| 管理后台 - 学生 | POST | `/admin-api/infra/demo03-student-erp/create` | 创建学生 | `Demo03StudentErp_createDemo03Student` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-erp/delete` | 删除学生 | `Demo03StudentErp_deleteDemo03Student` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-erp/delete-list` | 批量删除学生 | `Demo03StudentErp_deleteDemo03StudentList` | +| 管理后台 - 学生 | POST | `/admin-api/infra/demo03-student-erp/demo03-course/create` | 创建学生课程 | `Demo03StudentErp_createDemo03Course` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-erp/demo03-course/delete` | 删除学生课程 | `Demo03StudentErp_deleteDemo03Course` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-erp/demo03-course/delete-list` | 批量删除学生课程 | `Demo03StudentErp_deleteDemo03CourseList` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/demo03-course/get` | 获得学生课程 | `Demo03StudentErp_getDemo03Course` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/demo03-course/page` | 获得学生课程分页 | `Demo03StudentErp_getDemo03CoursePage` | +| 管理后台 - 学生 | PUT | `/admin-api/infra/demo03-student-erp/demo03-course/update` | 更新学生课程 | `Demo03StudentErp_updateDemo03Course` | +| 管理后台 - 学生 | POST | `/admin-api/infra/demo03-student-erp/demo03-grade/create` | 创建学生班级 | `Demo03StudentErp_createDemo03Grade` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-erp/demo03-grade/delete` | 删除学生班级 | `Demo03StudentErp_deleteDemo03Grade` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-erp/demo03-grade/delete-list` | 批量删除学生班级 | `Demo03StudentErp_deleteDemo03GradeList` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/demo03-grade/get` | 获得学生班级 | `Demo03StudentErp_getDemo03Grade` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/demo03-grade/page` | 获得学生班级分页 | `Demo03StudentErp_getDemo03GradePage` | +| 管理后台 - 学生 | PUT | `/admin-api/infra/demo03-student-erp/demo03-grade/update` | 更新学生班级 | `Demo03StudentErp_updateDemo03Grade` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/export-excel` | 导出学生 Excel | `Demo03StudentErp_exportDemo03StudentExcel` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/get` | 获得学生 | `Demo03StudentErp_getDemo03Student` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-erp/page` | 获得学生分页 | `Demo03StudentErp_getDemo03StudentPage` | +| 管理后台 - 学生 | PUT | `/admin-api/infra/demo03-student-erp/update` | 更新学生 | `Demo03StudentErp_updateDemo03Student` | +| 管理后台 - 学生 | POST | `/admin-api/infra/demo03-student-inner/create` | 创建学生 | `Demo03StudentInner_createDemo03Student` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-inner/delete` | 删除学生 | `Demo03StudentInner_deleteDemo03Student` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-inner/delete-list` | 批量删除学生 | `Demo03StudentInner_deleteDemo03StudentList` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-inner/demo03-course/list-by-student-id` | 获得学生课程列表 | `Demo03StudentInner_getDemo03CourseListByStudentId` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-inner/demo03-grade/get-by-student-id` | 获得学生班级 | `Demo03StudentInner_getDemo03GradeByStudentId` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-inner/export-excel` | 导出学生 Excel | `Demo03StudentInner_exportDemo03StudentExcel` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-inner/get` | 获得学生 | `Demo03StudentInner_getDemo03Student` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-inner/page` | 获得学生分页 | `Demo03StudentInner_getDemo03StudentPage` | +| 管理后台 - 学生 | PUT | `/admin-api/infra/demo03-student-inner/update` | 更新学生 | `Demo03StudentInner_updateDemo03Student` | +| 管理后台 - 学生 | POST | `/admin-api/infra/demo03-student-normal/create` | 创建学生 | `Demo03StudentNormal_createDemo03Student` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-normal/delete` | 删除学生 | `Demo03StudentNormal_deleteDemo03Student` | +| 管理后台 - 学生 | DELETE | `/admin-api/infra/demo03-student-normal/delete-list` | 批量删除学生 | `Demo03StudentNormal_deleteDemo03StudentList` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-normal/demo03-course/list-by-student-id` | 获得学生课程列表 | `Demo03StudentNormal_getDemo03CourseListByStudentId` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-normal/demo03-grade/get-by-student-id` | 获得学生班级 | `Demo03StudentNormal_getDemo03GradeByStudentId` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-normal/export-excel` | 导出学生 Excel | `Demo03StudentNormal_exportDemo03StudentExcel` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-normal/get` | 获得学生 | `Demo03StudentNormal_getDemo03Student` | +| 管理后台 - 学生 | GET | `/admin-api/infra/demo03-student-normal/page` | 获得学生分页 | `Demo03StudentNormal_getDemo03StudentPage` | +| 管理后台 - 学生 | PUT | `/admin-api/infra/demo03-student-normal/update` | 更新学生 | `Demo03StudentNormal_updateDemo03Student` | +| 管理后台 - 定时任务 | POST | `/admin-api/infra/job/create` | 创建定时任务 | `Job_createJob` | +| 管理后台 - 定时任务 | DELETE | `/admin-api/infra/job/delete` | 删除定时任务 | `Job_deleteJob` | +| 管理后台 - 定时任务 | DELETE | `/admin-api/infra/job/delete-list` | 批量删除定时任务 | `Job_deleteJobList` | +| 管理后台 - 定时任务 | GET | `/admin-api/infra/job/export-excel` | 导出定时任务 Excel | `Job_exportJobExcel` | +| 管理后台 - 定时任务 | GET | `/admin-api/infra/job/get` | 获得定时任务 | `Job_getJob` | +| 管理后台 - 定时任务 | GET | `/admin-api/infra/job/get_next_times` | 获得定时任务的下 n 次执行时间 | `Job_getJobNextTimes` | +| 管理后台 - 定时任务 | GET | `/admin-api/infra/job/page` | 获得定时任务分页 | `Job_getJobPage` | +| 管理后台 - 定时任务 | POST | `/admin-api/infra/job/sync` | 同步定时任务 | `Job_syncJob` | +| 管理后台 - 定时任务 | PUT | `/admin-api/infra/job/trigger` | 触发定时任务 | `Job_triggerJob` | +| 管理后台 - 定时任务 | PUT | `/admin-api/infra/job/update` | 更新定时任务 | `Job_updateJob` | +| 管理后台 - 定时任务 | PUT | `/admin-api/infra/job/update-status` | 更新定时任务的状态 | `Job_updateJobStatus` | +| 管理后台 - 定时任务日志 | GET | `/admin-api/infra/job-log/export-excel` | 导出定时任务日志 Excel | `JobLog_exportJobLogExcel` | +| 管理后台 - 定时任务日志 | GET | `/admin-api/infra/job-log/get` | 获得定时任务日志 | `JobLog_getJobLog` | +| 管理后台 - 定时任务日志 | GET | `/admin-api/infra/job-log/page` | 获得定时任务日志分页 | `JobLog_getJobLogPage` | +| 管理后台 - 岗位 | POST | `/admin-api/system/post/create` | 创建岗位 | `Post_createPost` | +| 管理后台 - 岗位 | DELETE | `/admin-api/system/post/delete` | 删除岗位 | `Post_deletePost` | +| 管理后台 - 岗位 | DELETE | `/admin-api/system/post/delete-list` | 批量删除岗位 | `Post_deletePostList` | +| 管理后台 - 岗位 | GET | `/admin-api/system/post/export-excel` | 岗位管理 | `Post_export` | +| 管理后台 - 岗位 | GET | `/admin-api/system/post/get` | 获得岗位信息 | `Post_getPost` | +| 管理后台 - 岗位 | GET | `/admin-api/system/post/list-all-simple` | 获取岗位全列表 | `Post_getSimplePostList` | +| 管理后台 - 岗位 | GET | `/admin-api/system/post/page` | 获得岗位分页列表 | `Post_getPostPage` | +| 管理后台 - 岗位 | GET | `/admin-api/system/post/simple-list` | 获取岗位全列表 | `Post_getSimplePostList_1` | +| 管理后台 - 岗位 | PUT | `/admin-api/system/post/update` | 修改岗位 | `Post_updatePost` | +| 管理后台 - 我的站内信 | GET | `/admin-api/system/notify-message/get` | 获得站内信 | `NotifyMessage_getNotifyMessage` | +| 管理后台 - 我的站内信 | GET | `/admin-api/system/notify-message/get-unread-count` | 获得当前用户的未读站内信数量 | `NotifyMessage_getUnreadNotifyMessageCount` | +| 管理后台 - 我的站内信 | GET | `/admin-api/system/notify-message/get-unread-list` | 获取当前用户的最新站内信列表,默认 10 条 | `NotifyMessage_getUnreadNotifyMessageList` | +| 管理后台 - 我的站内信 | GET | `/admin-api/system/notify-message/my-page` | 获得我的站内信分页 | `NotifyMessage_getMyMyNotifyMessagePage` | +| 管理后台 - 我的站内信 | GET | `/admin-api/system/notify-message/page` | 获得站内信分页 | `NotifyMessage_getNotifyMessagePage` | +| 管理后台 - 我的站内信 | PUT | `/admin-api/system/notify-message/update-all-read` | 标记所有站内信为已读 | `NotifyMessage_updateAllNotifyMessageRead` | +| 管理后台 - 我的站内信 | PUT | `/admin-api/system/notify-message/update-read` | 标记站内信为已读 | `NotifyMessage_updateNotifyMessageRead` | +| 管理后台 - 折扣 | PUT | `/admin-api/jh/discount/change-status` | 启用/停用 | `Discount_updateDiscountStatus` | +| 管理后台 - 折扣 | POST | `/admin-api/jh/discount/create` | 创建折扣 | `Discount_createDiscount` | +| 管理后台 - 折扣 | DELETE | `/admin-api/jh/discount/delete` | 删除折扣 | `Discount_deleteDiscount` | +| 管理后台 - 折扣 | DELETE | `/admin-api/jh/discount/delete-list` | 批量删除折扣 | `Discount_deleteDiscountList` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/discount-customer-cate/list-by-discount-id` | 获得折扣特定客户分类列表 | `Discount_getDiscountCustomerCateListByDiscountId` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/discount-customer/get_cate` | 获得APP客户分类 | `Discount_getDiscountCustomerCateList` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/discount-customer/get_customer` | 查询APP客户 | `Discount_getDiscountCustomerList` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/discount-customer/list-by-discount-id` | 获得折扣特定客户列表 | `Discount_getDiscountCustomerListByDiscountId` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/discount-product-cate/list-by-discount-id` | 获得折扣产品分类列表 | `Discount_getDiscountProductCateListByDiscountId` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/discount-product/list-by-discount-id` | 获得折扣产品列表 | `Discount_getDiscountProductListByDiscountId` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/get` | 获得折扣 | `Discount_getDiscount` | +| 管理后台 - 折扣 | GET | `/admin-api/jh/discount/page` | 获得折扣分页 | `Discount_getDiscountPage` | +| 管理后台 - 折扣 | PUT | `/admin-api/jh/discount/update` | 更新折扣 | `Discount_updateDiscount` | +| 管理后台 - 折扣数据 | GET | `/admin-api/jh/discount-usage-record/export-excel` | 导出折扣数据 Excel | `DiscountUsageRecord_exportDiscountUsageRecordExcel` | +| 管理后台 - 折扣数据 | GET | `/admin-api/jh/discount-usage-record/get-data` | 获取统计数据 | `DiscountUsageRecord_getDiscountUsageRecordStatisticPage` | +| 管理后台 - 操作日志 | GET | `/admin-api/system/operate-log/export-excel` | 导出操作日志 | `OperateLog_exportOperateLog` | +| 管理后台 - 操作日志 | GET | `/admin-api/system/operate-log/page` | 查看操作日志分页列表 | `OperateLog_pageOperateLog` | +| 管理后台 - 支付页产品推荐 | PUT | `/admin-api/jh/product-payment-recommend/change-rank-num` | 修改排序号 | `ProductPaymentRecommend_updateProductPaymentRecommend` | +| 管理后台 - 支付页产品推荐 | PUT | `/admin-api/jh/product-payment-recommend/change-status` | 修改推荐状态 | `ProductPaymentRecommend_getProductPaymentRecommend` | +| 管理后台 - 支付页产品推荐 | POST | `/admin-api/jh/product-payment-recommend/create` | 创建支付页产品推荐 | `ProductPaymentRecommend_createProductPaymentRecommend` | +| 管理后台 - 支付页产品推荐 | DELETE | `/admin-api/jh/product-payment-recommend/delete` | 删除支付页产品推荐 | `ProductPaymentRecommend_deleteProductPaymentRecommend` | +| 管理后台 - 支付页产品推荐 | DELETE | `/admin-api/jh/product-payment-recommend/delete-list` | 批量删除支付页产品推荐 | `ProductPaymentRecommend_deleteProductPaymentRecommendList` | +| 管理后台 - 支付页产品推荐 | GET | `/admin-api/jh/product-payment-recommend/page` | 获得支付页产品推荐分页 | `ProductPaymentRecommend_getProductPaymentRecommendPage` | +| 管理后台 - 数据源配置 | POST | `/admin-api/infra/data-source-config/create` | 创建数据源配置 | `DataSourceConfig_createDataSourceConfig` | +| 管理后台 - 数据源配置 | DELETE | `/admin-api/infra/data-source-config/delete` | 删除数据源配置 | `DataSourceConfig_deleteDataSourceConfig` | +| 管理后台 - 数据源配置 | DELETE | `/admin-api/infra/data-source-config/delete-list` | 批量删除数据源配置 | `DataSourceConfig_deleteDataSourceConfigList` | +| 管理后台 - 数据源配置 | GET | `/admin-api/infra/data-source-config/get` | 获得数据源配置 | `DataSourceConfig_getDataSourceConfig` | +| 管理后台 - 数据源配置 | GET | `/admin-api/infra/data-source-config/list` | 获得数据源配置列表 | `DataSourceConfig_getDataSourceConfigList` | +| 管理后台 - 数据源配置 | PUT | `/admin-api/infra/data-source-config/update` | 更新数据源配置 | `DataSourceConfig_updateDataSourceConfig` | +| 管理后台 - 文件存储 | POST | `/admin-api/infra/file/create` | 创建文件 | `File_createFile` | +| 管理后台 - 文件存储 | DELETE | `/admin-api/infra/file/delete` | 删除文件 | `File_deleteFile` | +| 管理后台 - 文件存储 | DELETE | `/admin-api/infra/file/delete-list` | 批量删除文件 | `File_deleteFileList` | +| 管理后台 - 文件存储 | GET | `/admin-api/infra/file/page` | 获得文件分页 | `File_getFilePage` | +| 管理后台 - 文件存储 | GET | `/admin-api/infra/file/presigned-url` | 获取文件预签名地址(上传) | `File_getFilePresignedUrl` | +| 管理后台 - 文件存储 | POST | `/admin-api/infra/file/upload` | 上传文件 | `File_uploadFile` | +| 管理后台 - 文件存储 | GET | `/admin-api/infra/file/{configId}/get/**` | 下载文件 | `File_getFileContent` | +| 管理后台 - 文件配置 | POST | `/admin-api/infra/file-config/create` | 创建文件配置 | `FileConfig_createFileConfig` | +| 管理后台 - 文件配置 | DELETE | `/admin-api/infra/file-config/delete` | 删除文件配置 | `FileConfig_deleteFileConfig` | +| 管理后台 - 文件配置 | DELETE | `/admin-api/infra/file-config/delete-list` | 批量删除文件配置 | `FileConfig_deleteFileConfigList` | +| 管理后台 - 文件配置 | GET | `/admin-api/infra/file-config/get` | 获得文件配置 | `FileConfig_getFileConfig` | +| 管理后台 - 文件配置 | GET | `/admin-api/infra/file-config/page` | 获得文件配置分页 | `FileConfig_getFileConfigPage` | +| 管理后台 - 文件配置 | GET | `/admin-api/infra/file-config/test` | 测试文件配置是否正确 | `FileConfig_testFileConfig` | +| 管理后台 - 文件配置 | PUT | `/admin-api/infra/file-config/update` | 更新文件配置 | `FileConfig_updateFileConfig` | +| 管理后台 - 文件配置 | PUT | `/admin-api/infra/file-config/update-master` | 更新文件配置为 Master | `FileConfig_updateFileConfigMaster` | +| 管理后台 - 权限 | POST | `/admin-api/system/permission/assign-role-data-scope` | 赋予角色数据权限 | `Permission_assignRoleDataScope` | +| 管理后台 - 权限 | POST | `/admin-api/system/permission/assign-role-menu` | 赋予角色菜单 | `Permission_assignRoleMenu` | +| 管理后台 - 权限 | POST | `/admin-api/system/permission/assign-user-role` | 赋予用户角色 | `Permission_assignUserRole` | +| 管理后台 - 权限 | GET | `/admin-api/system/permission/list-role-menus` | 获得角色拥有的菜单编号 | `Permission_getRoleMenuList` | +| 管理后台 - 权限 | GET | `/admin-api/system/permission/list-user-roles` | 获得管理员拥有的角色编号列表 | `Permission_listAdminRoles` | +| 管理后台 - 流量详情 | GET | `/admin-api/jh/landing-page-tracker-detail/export-excel` | 导出流量详情 Excel | `LandingPageTrackerDetail_exportLandingPageTrackerDetailExcel` | +| 管理后台 - 流量详情 | GET | `/admin-api/jh/landing-page-tracker-detail/page` | 获得流量详情分页 | `LandingPageTrackerDetail_getLandingPageTrackerDetailPage` | +| 管理后台 - 用户 | POST | `/admin-api/system/user/create` | 新增用户 | `User_createUser` | +| 管理后台 - 用户 | DELETE | `/admin-api/system/user/delete` | 删除用户 | `User_deleteUser` | +| 管理后台 - 用户 | DELETE | `/admin-api/system/user/delete-list` | 批量删除用户 | `User_deleteUserList` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/export-excel` | 导出用户 | `User_exportUserList` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/get` | 获得用户详情 | `User_getUser` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/get-import-template` | 获得导入用户模板 | `User_importTemplate` | +| 管理后台 - 用户 | POST | `/admin-api/system/user/import` | 导入用户 | `User_importExcel` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/list-all-simple` | 获取用户精简信息列表 | `User_getSimpleUserList` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/page` | 获得用户分页列表 | `User_getUserPage` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/reset-fingerprint` | 重置指纹 | `User_resetFingerprint` | +| 管理后台 - 用户 | GET | `/admin-api/system/user/simple-list` | 获取用户精简信息列表 | `User_getSimpleUserList_1` | +| 管理后台 - 用户 | PUT | `/admin-api/system/user/update` | 修改用户 | `User_updateUser` | +| 管理后台 - 用户 | PUT | `/admin-api/system/user/update-password` | 重置用户密码 | `User_updateUserPassword` | +| 管理后台 - 用户 | PUT | `/admin-api/system/user/update-status` | 修改用户状态 | `User_updateUserStatus` | +| 管理后台 - 用户个人中心 | GET | `/admin-api/system/user/profile/get` | 获得登录用户信息 | `UserProfile_getUserProfile` | +| 管理后台 - 用户个人中心 | PUT | `/admin-api/system/user/profile/update` | 修改用户个人信息 | `UserProfile_updateUserProfile` | +| 管理后台 - 用户个人中心 | PUT | `/admin-api/system/user/profile/update-password` | 修改用户个人密码 | `UserProfile_updateUserProfilePassword` | +| 管理后台 - 登录日志 | GET | `/admin-api/system/login-log/export-excel` | 导出登录日志 Excel | `LoginLog_exportLoginLog` | +| 管理后台 - 登录日志 | GET | `/admin-api/system/login-log/page` | 获得登录日志分页列表 | `LoginLog_getLoginLogPage` | +| 管理后台 - 短信回调 | POST | `/admin-api/system/sms/callback/aliyun` | 阿里云短信的回调 | `SmsCallback_receiveAliyunSmsStatus` | +| 管理后台 - 短信回调 | POST | `/admin-api/system/sms/callback/huawei` | 华为云短信的回调 | `SmsCallback_receiveHuaweiSmsStatus` | +| 管理后台 - 短信回调 | POST | `/admin-api/system/sms/callback/qiniu` | 七牛云短信的回调 | `SmsCallback_receiveQiniuSmsStatus` | +| 管理后台 - 短信回调 | POST | `/admin-api/system/sms/callback/tencent` | 腾讯云短信的回调 | `SmsCallback_receiveTencentSmsStatus` | +| 管理后台 - 短信日志 | GET | `/admin-api/system/sms-log/export-excel` | 导出短信日志 Excel | `SmsLog_exportSmsLogExcel` | +| 管理后台 - 短信日志 | GET | `/admin-api/system/sms-log/page` | 获得短信日志分页 | `SmsLog_getSmsLogPage` | +| 管理后台 - 短信模板 | POST | `/admin-api/system/sms-template/create` | 创建短信模板 | `SmsTemplate_createSmsTemplate` | +| 管理后台 - 短信模板 | DELETE | `/admin-api/system/sms-template/delete` | 删除短信模板 | `SmsTemplate_deleteSmsTemplate` | +| 管理后台 - 短信模板 | DELETE | `/admin-api/system/sms-template/delete-list` | 批量删除短信模板 | `SmsTemplate_deleteSmsTemplateList` | +| 管理后台 - 短信模板 | GET | `/admin-api/system/sms-template/export-excel` | 导出短信模板 Excel | `SmsTemplate_exportSmsTemplateExcel` | +| 管理后台 - 短信模板 | GET | `/admin-api/system/sms-template/get` | 获得短信模板 | `SmsTemplate_getSmsTemplate` | +| 管理后台 - 短信模板 | GET | `/admin-api/system/sms-template/page` | 获得短信模板分页 | `SmsTemplate_getSmsTemplatePage` | +| 管理后台 - 短信模板 | POST | `/admin-api/system/sms-template/send-sms` | 发送短信 | `SmsTemplate_sendSms` | +| 管理后台 - 短信模板 | PUT | `/admin-api/system/sms-template/update` | 更新短信模板 | `SmsTemplate_updateSmsTemplate` | +| 管理后台 - 短信渠道 | POST | `/admin-api/system/sms-channel/create` | 创建短信渠道 | `SmsChannel_createSmsChannel` | +| 管理后台 - 短信渠道 | DELETE | `/admin-api/system/sms-channel/delete` | 删除短信渠道 | `SmsChannel_deleteSmsChannel` | +| 管理后台 - 短信渠道 | DELETE | `/admin-api/system/sms-channel/delete-list` | 批量删除短信渠道 | `SmsChannel_deleteSmsChannelList` | +| 管理后台 - 短信渠道 | GET | `/admin-api/system/sms-channel/get` | 获得短信渠道 | `SmsChannel_getSmsChannel` | +| 管理后台 - 短信渠道 | GET | `/admin-api/system/sms-channel/list-all-simple` | 获得短信渠道精简列表 | `SmsChannel_getSimpleSmsChannelList_1` | +| 管理后台 - 短信渠道 | GET | `/admin-api/system/sms-channel/page` | 获得短信渠道分页 | `SmsChannel_getSmsChannelPage` | +| 管理后台 - 短信渠道 | GET | `/admin-api/system/sms-channel/simple-list` | 获得短信渠道精简列表 | `SmsChannel_getSimpleSmsChannelList` | +| 管理后台 - 短信渠道 | PUT | `/admin-api/system/sms-channel/update` | 更新短信渠道 | `SmsChannel_updateSmsChannel` | +| 管理后台 - 示例分类 | POST | `/admin-api/infra/demo02-category/create` | 创建示例分类 | `Demo02Category_createDemo02Category` | +| 管理后台 - 示例分类 | DELETE | `/admin-api/infra/demo02-category/delete` | 删除示例分类 | `Demo02Category_deleteDemo02Category` | +| 管理后台 - 示例分类 | GET | `/admin-api/infra/demo02-category/export-excel` | 导出示例分类 Excel | `Demo02Category_exportDemo02CategoryExcel` | +| 管理后台 - 示例分类 | GET | `/admin-api/infra/demo02-category/get` | 获得示例分类 | `Demo02Category_getDemo02Category` | +| 管理后台 - 示例分类 | GET | `/admin-api/infra/demo02-category/list` | 获得示例分类列表 | `Demo02Category_getDemo02CategoryList` | +| 管理后台 - 示例分类 | PUT | `/admin-api/infra/demo02-category/update` | 更新示例分类 | `Demo02Category_updateDemo02Category` | +| 管理后台 - 示例联系人 | POST | `/admin-api/infra/demo01-contact/create` | 创建示例联系人 | `Demo01Contact_createDemo01Contact` | +| 管理后台 - 示例联系人 | DELETE | `/admin-api/infra/demo01-contact/delete` | 删除示例联系人 | `Demo01Contact_deleteDemo01Contact` | +| 管理后台 - 示例联系人 | DELETE | `/admin-api/infra/demo01-contact/delete-list` | 批量删除示例联系人 | `Demo01Contact_deleteDemo0iContactList` | +| 管理后台 - 示例联系人 | GET | `/admin-api/infra/demo01-contact/export-excel` | 导出示例联系人 Excel | `Demo01Contact_exportDemo01ContactExcel` | +| 管理后台 - 示例联系人 | GET | `/admin-api/infra/demo01-contact/get` | 获得示例联系人 | `Demo01Contact_getDemo01Contact` | +| 管理后台 - 示例联系人 | GET | `/admin-api/infra/demo01-contact/page` | 获得示例联系人分页 | `Demo01Contact_getDemo01ContactPage` | +| 管理后台 - 示例联系人 | PUT | `/admin-api/infra/demo01-contact/update` | 更新示例联系人 | `Demo01Contact_updateDemo01Contact` | +| 管理后台 - 社交客户端 | POST | `/admin-api/system/social-client/create` | 创建社交客户端 | `SocialClient_createSocialClient` | +| 管理后台 - 社交客户端 | DELETE | `/admin-api/system/social-client/delete` | 删除社交客户端 | `SocialClient_deleteSocialClient` | +| 管理后台 - 社交客户端 | DELETE | `/admin-api/system/social-client/delete-list` | 批量删除社交客户端 | `SocialClient_deleteSocialClientList` | +| 管理后台 - 社交客户端 | GET | `/admin-api/system/social-client/get` | 获得社交客户端 | `SocialClient_getSocialClient` | +| 管理后台 - 社交客户端 | GET | `/admin-api/system/social-client/page` | 获得社交客户端分页 | `SocialClient_getSocialClientPage` | +| 管理后台 - 社交客户端 | POST | `/admin-api/system/social-client/send-subscribe-message` | 发送订阅消息 | `SocialClient_sendSubscribeMessage` | +| 管理后台 - 社交客户端 | PUT | `/admin-api/system/social-client/update` | 更新社交客户端 | `SocialClient_updateSocialClient` | +| 管理后台 - 社交用户 | POST | `/admin-api/system/social-user/bind` | 社交绑定,使用 code 授权码 | `SocialUser_socialBind` | +| 管理后台 - 社交用户 | GET | `/admin-api/system/social-user/get` | 获得社交用户 | `SocialUser_getSocialUser` | +| 管理后台 - 社交用户 | GET | `/admin-api/system/social-user/get-bind-list` | 获得绑定社交用户列表 | `SocialUser_getBindSocialUserList` | +| 管理后台 - 社交用户 | GET | `/admin-api/system/social-user/page` | 获得社交用户分页 | `SocialUser_getSocialUserPage` | +| 管理后台 - 社交用户 | DELETE | `/admin-api/system/social-user/unbind` | 取消社交绑定 | `SocialUser_socialUnbind` | +| 管理后台 - 租户 | POST | `/admin-api/system/tenant/create` | 创建租户 | `Tenant_createTenant` | +| 管理后台 - 租户 | DELETE | `/admin-api/system/tenant/delete` | 删除租户 | `Tenant_deleteTenant` | +| 管理后台 - 租户 | DELETE | `/admin-api/system/tenant/delete-list` | 批量删除租户 | `Tenant_deleteTenantList` | +| 管理后台 - 租户 | GET | `/admin-api/system/tenant/export-excel` | 导出租户 Excel | `Tenant_exportTenantExcel` | +| 管理后台 - 租户 | GET | `/admin-api/system/tenant/get` | 获得租户 | `Tenant_getTenant` | +| 管理后台 - 租户 | GET | `/admin-api/system/tenant/get-by-website` | 使用域名,获得租户信息 | `Tenant_getTenantByWebsite` | +| 管理后台 - 租户 | GET | `/admin-api/system/tenant/get-id-by-name` | 使用租户名,获得租户编号 | `Tenant_getTenantIdByName` | +| 管理后台 - 租户 | GET | `/admin-api/system/tenant/page` | 获得租户分页 | `Tenant_getTenantPage` | +| 管理后台 - 租户 | GET | `/admin-api/system/tenant/simple-list` | 获取租户精简信息列表 | `Tenant_getTenantSimpleList` | +| 管理后台 - 租户 | PUT | `/admin-api/system/tenant/update` | 更新租户 | `Tenant_updateTenant` | +| 管理后台 - 租户套餐 | POST | `/admin-api/system/tenant-package/create` | 创建租户套餐 | `TenantPackage_createTenantPackage` | +| 管理后台 - 租户套餐 | DELETE | `/admin-api/system/tenant-package/delete` | 删除租户套餐 | `TenantPackage_deleteTenantPackage` | +| 管理后台 - 租户套餐 | DELETE | `/admin-api/system/tenant-package/delete-list` | 批量删除租户套餐 | `TenantPackage_deleteTenantPackageList` | +| 管理后台 - 租户套餐 | GET | `/admin-api/system/tenant-package/get` | 获得租户套餐 | `TenantPackage_getTenantPackage` | +| 管理后台 - 租户套餐 | GET | `/admin-api/system/tenant-package/get-simple-list` | 获取租户套餐精简信息列表 | `TenantPackage_getTenantPackageList` | +| 管理后台 - 租户套餐 | GET | `/admin-api/system/tenant-package/page` | 获得租户套餐分页 | `TenantPackage_getTenantPackagePage` | +| 管理后台 - 租户套餐 | GET | `/admin-api/system/tenant-package/simple-list` | 获取租户套餐精简信息列表 | `TenantPackage_getTenantPackageList_1` | +| 管理后台 - 租户套餐 | PUT | `/admin-api/system/tenant-package/update` | 更新租户套餐 | `TenantPackage_updateTenantPackage` | +| 管理后台 - 站内信模版 | POST | `/admin-api/system/notify-template/create` | 创建站内信模版 | `NotifyTemplate_createNotifyTemplate` | +| 管理后台 - 站内信模版 | DELETE | `/admin-api/system/notify-template/delete` | 删除站内信模版 | `NotifyTemplate_deleteNotifyTemplate` | +| 管理后台 - 站内信模版 | DELETE | `/admin-api/system/notify-template/delete-list` | 批量删除站内信模版 | `NotifyTemplate_deleteNotifyTemplateList` | +| 管理后台 - 站内信模版 | GET | `/admin-api/system/notify-template/get` | 获得站内信模版 | `NotifyTemplate_getNotifyTemplate` | +| 管理后台 - 站内信模版 | GET | `/admin-api/system/notify-template/page` | 获得站内信模版分页 | `NotifyTemplate_getNotifyTemplatePage` | +| 管理后台 - 站内信模版 | POST | `/admin-api/system/notify-template/send-notify` | 发送站内信 | `NotifyTemplate_sendNotify` | +| 管理后台 - 站内信模版 | PUT | `/admin-api/system/notify-template/update` | 更新站内信模版 | `NotifyTemplate_updateNotifyTemplate` | +| 管理后台 - 联系我们数据 | POST | `/admin-api/jh/contact-us/create` | 创建联系我们数据 | `ContactUs_createContactUs` | +| 管理后台 - 联系我们数据 | DELETE | `/admin-api/jh/contact-us/delete` | 删除联系我们数据 | `ContactUs_deleteContactUs` | +| 管理后台 - 联系我们数据 | DELETE | `/admin-api/jh/contact-us/delete-list` | 批量删除联系我们数据 | `ContactUs_deleteContactUsList` | +| 管理后台 - 联系我们数据 | GET | `/admin-api/jh/contact-us/export-excel` | 导出联系我们数据 Excel | `ContactUs_exportContactUsExcel` | +| 管理后台 - 联系我们数据 | GET | `/admin-api/jh/contact-us/get` | 获得联系我们数据 | `ContactUs_getContactUs` | +| 管理后台 - 联系我们数据 | GET | `/admin-api/jh/contact-us/get-import-template` | 获得导入联系我们数据模板 | `ContactUs_getImportTemplate` | +| 管理后台 - 联系我们数据 | POST | `/admin-api/jh/contact-us/import-excel` | 导入联系我们数据Excel | `ContactUs_importContactUsExcel` | +| 管理后台 - 联系我们数据 | GET | `/admin-api/jh/contact-us/page` | 获得联系我们数据分页 | `ContactUs_getContactUsPage` | +| 管理后台 - 联系我们数据 | PUT | `/admin-api/jh/contact-us/update` | 更新联系我们数据 | `ContactUs_updateContactUs` | +| 管理后台 - 菜单 | POST | `/admin-api/system/menu/create` | 创建菜单 | `Menu_createMenu` | +| 管理后台 - 菜单 | DELETE | `/admin-api/system/menu/delete` | 删除菜单 | `Menu_deleteMenu` | +| 管理后台 - 菜单 | DELETE | `/admin-api/system/menu/delete-list` | 批量删除菜单 | `Menu_deleteMenuList` | +| 管理后台 - 菜单 | GET | `/admin-api/system/menu/get` | 获取菜单信息 | `Menu_getMenu` | +| 管理后台 - 菜单 | GET | `/admin-api/system/menu/list` | 获取菜单列表 | `Menu_getMenuList` | +| 管理后台 - 菜单 | GET | `/admin-api/system/menu/list-all-simple` | 获取菜单精简信息列表 | `Menu_getSimpleMenuList` | +| 管理后台 - 菜单 | GET | `/admin-api/system/menu/simple-list` | 获取菜单精简信息列表 | `Menu_getSimpleMenuList_1` | +| 管理后台 - 菜单 | PUT | `/admin-api/system/menu/update` | 修改菜单 | `Menu_updateMenu` | +| 管理后台 - 角色 | POST | `/admin-api/system/role/create` | 创建角色 | `Role_createRole` | +| 管理后台 - 角色 | DELETE | `/admin-api/system/role/delete` | 删除角色 | `Role_deleteRole` | +| 管理后台 - 角色 | DELETE | `/admin-api/system/role/delete-list` | 批量删除角色 | `Role_deleteRoleList` | +| 管理后台 - 角色 | GET | `/admin-api/system/role/export-excel` | 导出角色 Excel | `Role_export` | +| 管理后台 - 角色 | GET | `/admin-api/system/role/get` | 获得角色信息 | `Role_getRole` | +| 管理后台 - 角色 | GET | `/admin-api/system/role/list-all-simple` | 获取角色精简信息列表 | `Role_getSimpleRoleList` | +| 管理后台 - 角色 | GET | `/admin-api/system/role/page` | 获得角色分页 | `Role_getRolePage` | +| 管理后台 - 角色 | GET | `/admin-api/system/role/simple-list` | 获取角色精简信息列表 | `Role_getSimpleRoleList_1` | +| 管理后台 - 角色 | PUT | `/admin-api/system/role/update` | 修改角色 | `Role_updateRole` | +| 管理后台 - 订单 | PUT | `/admin-api/jh/order/cancel` | 取消订单 | `Order_cancelOrder` | +| 管理后台 - 订单 | GET | `/admin-api/jh/order/count` | 查询各状态订单数量 | `Order_getOrderCount` | +| 管理后台 - 订单 | GET | `/admin-api/jh/order/export-excel` | 导出订单 Excel | `Order_exportOrderExcel` | +| 管理后台 - 订单 | GET | `/admin-api/jh/order/get` | 获得订单 | `Order_getOrder` | +| 管理后台 - 订单 | GET | `/admin-api/jh/order/page` | 获得订单分页 | `Order_getOrderPage` | +| 管理后台 - 订单 | PUT | `/admin-api/jh/order/set-remark` | 设置订单备注 | `Order_updateOrderRemark` | +| 管理后台 - 认证 | GET | `/admin-api/system/auth/get-permission-info` | 获取登录用户的权限信息 | `Auth_getPermissionInfo` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/login` | 使用账号密码登录 | `Auth_login` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/login-dev` | 使用账号密码登录 | `Auth_loginDev` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/logout` | 登出系统 | `Auth_logout` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/refresh-token` | 刷新令牌 | `Auth_refreshToken` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/register` | 注册用户 | `Auth_register` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/reset-password` | 重置密码 | `Auth_resetPassword` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/send-sms-code` | 发送手机验证码 | `Auth_sendLoginSmsCode` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/sms-login` | 使用短信验证码登录 | `Auth_smsLogin` | +| 管理后台 - 认证 | GET | `/admin-api/system/auth/social-auth-redirect` | 社交授权的跳转 | `Auth_socialLogin` | +| 管理后台 - 认证 | POST | `/admin-api/system/auth/social-login` | 社交快捷登录,使用 code 授权码 | `Auth_socialQuickLogin` | +| 管理后台 - 路由 | POST | `/admin-api/jh/route/create` | 创建路由 | `Route_createRoute` | +| 管理后台 - 路由 | DELETE | `/admin-api/jh/route/delete` | 删除路由 | `Route_deleteRoute` | +| 管理后台 - 路由 | DELETE | `/admin-api/jh/route/delete-list` | 批量删除路由 | `Route_deleteRouteList` | +| 管理后台 - 路由 | GET | `/admin-api/jh/route/export-excel` | 导出路由 Excel | `Route_exportRouteExcel` | +| 管理后台 - 路由 | GET | `/admin-api/jh/route/get` | 获得路由 | `Route_getRoute` | +| 管理后台 - 路由 | GET | `/admin-api/jh/route/get-import-template` | 获得导入路由模板 | `Route_getImportTemplate` | +| 管理后台 - 路由 | POST | `/admin-api/jh/route/import-excel` | 导入路由Excel | `Route_importRouteExcel` | +| 管理后台 - 路由 | GET | `/admin-api/jh/route/page` | 获得路由分页 | `Route_getRoutePage` | +| 管理后台 - 路由 | PUT | `/admin-api/jh/route/update` | 更新路由 | `Route_updateRoute` | +| 管理后台 - 运费模板信息 | POST | `/admin-api/jh/shipping-template/create` | 创建运费模板信息 | `ShippingTemplate_createShippingTemplate` | +| 管理后台 - 运费模板信息 | DELETE | `/admin-api/jh/shipping-template/delete` | 删除运费模板信息 | `ShippingTemplate_deleteShippingTemplate` | +| 管理后台 - 运费模板信息 | DELETE | `/admin-api/jh/shipping-template/delete-list` | 批量删除运费模板信息 | `ShippingTemplate_deleteShippingTemplateList` | +| 管理后台 - 运费模板信息 | GET | `/admin-api/jh/shipping-template/get-detail` | ***获得运费模板详情(含规则与子表) | `ShippingTemplate_getShippingTemplateDetail` | +| 管理后台 - 运费模板信息 | GET | `/admin-api/jh/shipping-template/page` | ***获得运费模板信息分页 | `ShippingTemplate_getShippingTemplatePage` | +| 管理后台 - 运费模板信息 | POST | `/admin-api/jh/shipping-template/save-with-children` | 保存运费模板信息(含规则与子表) | `ShippingTemplate_saveShippingTemplateWithChildren` | +| 管理后台 - 运费模板信息 | GET | `/admin-api/jh/shipping-template/shipping-rule/list-by-shipping-template-id` | 获得运费规则列表 | `ShippingTemplate_getShippingRuleListByShippingTemplateId` | +| 管理后台 - 运费模板信息 | PUT | `/admin-api/jh/shipping-template/update` | 更新运费模板信息 | `ShippingTemplate_updateShippingTemplate` | +| 管理后台 - 通知公告 | POST | `/admin-api/system/notice/create` | 创建通知公告 | `Notice_createNotice` | +| 管理后台 - 通知公告 | DELETE | `/admin-api/system/notice/delete` | 删除通知公告 | `Notice_deleteNotice` | +| 管理后台 - 通知公告 | DELETE | `/admin-api/system/notice/delete-list` | 批量删除通知公告 | `Notice_deleteNoticeList` | +| 管理后台 - 通知公告 | GET | `/admin-api/system/notice/get` | 获得通知公告 | `Notice_getNotice` | +| 管理后台 - 通知公告 | GET | `/admin-api/system/notice/page` | 获取通知公告列表 | `Notice_getNoticePage` | +| 管理后台 - 通知公告 | POST | `/admin-api/system/notice/push` | 推送通知公告 | `Notice_push` | +| 管理后台 - 通知公告 | PUT | `/admin-api/system/notice/update` | 修改通知公告 | `Notice_updateNotice` | +| 管理后台 - 邮件日志 | GET | `/admin-api/system/mail-log/get` | 获得邮箱日志 | `MailLog_getMailTemplate` | +| 管理后台 - 邮件日志 | GET | `/admin-api/system/mail-log/page` | 获得邮箱日志分页 | `MailLog_getMailLogPage` | +| 管理后台 - 邮件模版 | POST | `/admin-api/system/mail-template/create` | 创建邮件模版 | `MailTemplate_createMailTemplate` | +| 管理后台 - 邮件模版 | DELETE | `/admin-api/system/mail-template/delete` | 删除邮件模版 | `MailTemplate_deleteMailTemplate` | +| 管理后台 - 邮件模版 | DELETE | `/admin-api/system/mail-template/delete-list` | 批量删除邮件模版 | `MailTemplate_deleteMailTemplateList` | +| 管理后台 - 邮件模版 | GET | `/admin-api/system/mail-template/get` | 获得邮件模版 | `MailTemplate_getMailTemplate` | +| 管理后台 - 邮件模版 | GET | `/admin-api/system/mail-template/list-all-simple` | 获得邮件模版精简列表 | `MailTemplate_getSimpleTemplateList` | +| 管理后台 - 邮件模版 | GET | `/admin-api/system/mail-template/page` | 获得邮件模版分页 | `MailTemplate_getMailTemplatePage` | +| 管理后台 - 邮件模版 | POST | `/admin-api/system/mail-template/send-mail` | 发送邮件 | `MailTemplate_sendMail` | +| 管理后台 - 邮件模版 | GET | `/admin-api/system/mail-template/simple-list` | 获得邮件模版精简列表 | `MailTemplate_getSimpleTemplateList_1` | +| 管理后台 - 邮件模版 | PUT | `/admin-api/system/mail-template/update` | 修改邮件模版 | `MailTemplate_updateMailTemplate` | +| 管理后台 - 邮箱账号 | POST | `/admin-api/system/mail-account/create` | 创建邮箱账号 | `MailAccount_createMailAccount` | +| 管理后台 - 邮箱账号 | DELETE | `/admin-api/system/mail-account/delete` | 删除邮箱账号 | `MailAccount_deleteMailAccount` | +| 管理后台 - 邮箱账号 | DELETE | `/admin-api/system/mail-account/delete-list` | 批量删除邮箱账号 | `MailAccount_deleteMailAccountList` | +| 管理后台 - 邮箱账号 | GET | `/admin-api/system/mail-account/get` | 获得邮箱账号 | `MailAccount_getMailAccount` | +| 管理后台 - 邮箱账号 | GET | `/admin-api/system/mail-account/list-all-simple` | 获得邮箱账号精简列表 | `MailAccount_getSimpleMailAccountList` | +| 管理后台 - 邮箱账号 | GET | `/admin-api/system/mail-account/page` | 获得邮箱账号分页 | `MailAccount_getMailAccountPage` | +| 管理后台 - 邮箱账号 | GET | `/admin-api/system/mail-account/simple-list` | 获得邮箱账号精简列表 | `MailAccount_getSimpleMailAccountList_1` | +| 管理后台 - 邮箱账号 | PUT | `/admin-api/system/mail-account/update` | 修改邮箱账号 | `MailAccount_updateMailAccount` | +| 管理后台 - 部门 | POST | `/admin-api/system/dept/create` | 创建部门 | `Dept_createDept` | +| 管理后台 - 部门 | DELETE | `/admin-api/system/dept/delete` | 删除部门 | `Dept_deleteDept` | +| 管理后台 - 部门 | DELETE | `/admin-api/system/dept/delete-list` | 批量删除部门 | `Dept_deleteDeptList` | +| 管理后台 - 部门 | GET | `/admin-api/system/dept/get` | 获得部门信息 | `Dept_getDept` | +| 管理后台 - 部门 | GET | `/admin-api/system/dept/list` | 获取部门列表 | `Dept_getDeptList` | +| 管理后台 - 部门 | GET | `/admin-api/system/dept/list-all-simple` | 获取部门精简信息列表 | `Dept_getSimpleDeptList` | +| 管理后台 - 部门 | GET | `/admin-api/system/dept/simple-list` | 获取部门精简信息列表 | `Dept_getSimpleDeptList_1` | +| 管理后台 - 部门 | PUT | `/admin-api/system/dept/update` | 更新部门 | `Dept_updateDept` | +| 管理后台 - 链接 | POST | `/admin-api/jh/landing-page-tracker/create` | 创建链接 | `LandingPageTracker_createLandingPageTracker` | +| 管理后台 - 链接 | DELETE | `/admin-api/jh/landing-page-tracker/delete` | 删除链接 | `LandingPageTracker_deleteLandingPageTracker` | +| 管理后台 - 链接 | DELETE | `/admin-api/jh/landing-page-tracker/delete-list` | 批量删除链接 | `LandingPageTracker_deleteLandingPageTrackerList` | +| 管理后台 - 链接 | GET | `/admin-api/jh/landing-page-tracker/export-detail-excel` | 导出引流统计明细 Excel | `LandingPageTracker_exportLandingPageTrackerDetailExcel` | +| 管理后台 - 链接 | GET | `/admin-api/jh/landing-page-tracker/export-excel` | 导出引流统计列表 Excel | `LandingPageTracker_exportLandingPageTrackerExcel` | +| 管理后台 - 链接 | GET | `/admin-api/jh/landing-page-tracker/get` | 获得链接 | `LandingPageTracker_getLandingPageTracker` | +| 管理后台 - 链接 | GET | `/admin-api/jh/landing-page-tracker/page` | 获得链接分页 | `LandingPageTracker_getLandingPageTrackerPage` | +| 管理后台 - 领星订单同步调试 | GET | `/admin-api/admin-api/jh/lingxing-sync/execute` | 手动触发领星订单同步 | `LingXingOrderSync_execute` | +| 管理后台 - 领星订单同步调试 | GET | `/admin-api/admin-api/jh/lingxing-sync/execute/autocompilte` | 手动触发自动完成订单同步 | `LingXingOrderSync_executeAuto` | +| 管理后台 - 领星订单同步调试 | GET | `/admin-api/admin-api/jh/lingxing-sync/execute/paypal-retry` | 手动触发PayPal物流推送补偿任务 | `LingXingOrderSync_executePayPalRetry` | +| 管理后台 - 验证码 | POST | `/admin-api/system/captcha/check` | 校验验证码 | `Captcha_check` | +| 管理后台 - 验证码 | POST | `/admin-api/system/captcha/get` | 获得验证码 | `Captcha_get` | + +## 接口详情 + +## C端 - APP版本 + +### 1. 获取APP版本列表 + +- 分组:C端 - APP版本 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/web/appversion/page` +- operationId:`WebAppversion_getAppversionPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| storeName | query | 否 | string | 应用商店 | 王五 | +| version | query | 否 | string | 版本号 | | +| downloadUrl | query | 否 | string | 商城下载地址 | https://www.iocoder.cn | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAppversionRespVO` | + +## C端 - FAQ + +### 1. 获得FAQ分类树 + +- 分组:C端 - FAQ +- 请求方式:`GET` +- 接口路径:`/web-api/jh/faq/cate-list` +- operationId:`WebFaq_getFaqCateTree` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| lang | query | 是 | string | 语言 | en | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListFaqCateSimpleRespVO` | + +### 2. 获得FAQ列表 + +- 分组:C端 - FAQ +- 请求方式:`GET` +- 接口路径:`/web-api/jh/faq/list` +- operationId:`WebFaq_getFaqList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| faqCateId | query | 否 | integer | 分类ID | 29870 | +| isHot | query | 否 | integer | 是否热门(0否,1是) | 1 | +| lang | query | 否 | string | 语言 | en | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListFaqRespVO` | + +## C端 - FAQ联系我们 + +### 1. 提交FAQ联系信息 + +- 分组:C端 - FAQ联系我们 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/faq-contact-us/create` +- operationId:`WebFaqContactUs_createFaqContactUs` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqContactUsCreateReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| name | 姓名 | 是 | string | Tom | +| email | 邮箱 | 是 | string | tom@example.com | +| toyOrderNumber | 玩具订单号 | 是 | string | TOY123456 | +| questionType | 问题类型 | 是 | string | order | +| questionDetail | 问题详情 | 否 | string | Where is my order? | +| files | 图片或视频 | 否 | array[JhFileDO] | | +| lang | 语言 | 否 | string | en | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +## C端 - blog信息 + +### 1. 获得blog详情 + +- 分组:C端 - blog信息 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/blog/get-detail` +- operationId:`WebBlog_getBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBlogRespVO` | + +### 2. 获得blog下一条 + +- 分组:C端 - blog信息 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/blog/get-next` +- operationId:`WebBlog_getBlogNext` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 主键 | 25673 | +| cateId | query | 否 | integer | blog分类 ID 列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBlogRespVO` | + +### 3. 获得blog管理分页 + +- 分组:C端 - blog信息 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/blog/page` +- operationId:`WebBlog_getBlogPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateId | query | 否 | integer | 分类id | | +| code | query | 否 | string | 编号 | | +| title | query | 否 | string | 标题 | | +| status | query | 否 | integer | 状态 | 1 | +| id | query | 否 | integer | 编号 | 1 | +| creator | query | 否 | integer | 创建者ID | | +| newTime | query | 否 | string | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultBlogRespVO` | + +## C端 - blog分类 + +### 1. 获得blog分类列表 + +- 分组:C端 - blog分类 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/blog-cate/list` +- operationId:`WebBlogCate_getBlogCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListBlogCateRespVO` | + +## C端 - news分类 + +### 1. 获得news分类列表 + +- 分组:C端 - news分类 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/news-cate/list` +- operationId:`WebNewsCate_getNewsCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListNewsCateRespVO` | + +## C端 - news管理 + +### 1. 获得news详情 + +- 分组:C端 - news管理 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/news/get-detail` +- operationId:`WebNews_getBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNewsRespVO` | + +### 2. 获得news下一条 + +- 分组:C端 - news管理 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/news/get-next` +- operationId:`WebNews_getBlogNext` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 主键 | 25673 | +| cateId | query | 否 | integer | blog分类 ID 列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNewsRespVO` | + +### 3. 获得news管理分页 + +- 分组:C端 - news管理 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/news/page` +- operationId:`WebNews_getBlogPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateId | query | 否 | integer | 分类id | | +| code | query | 否 | string | 编号 | | +| title | query | 否 | string | 标题 | | +| status | query | 否 | integer | 状态 | 2 | +| id | query | 否 | integer | 编号 | 1 | +| creator | query | 否 | integer | 创建者ID | | +| newTime | query | 否 | string | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultNewsRespVO` | + +## C端 - 二维码访问统计 + +### 1. 获取二维码信息 + +- 分组:C端 - 二维码访问统计 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/download-qrcode/get` +- operationId:`WebDownloadQrcode_getByCode` +- 描述:根据code获取二维码的基础信息 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| code | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebDownloadQrcodeRespVO` | + +### 2. 增加二维码访问/点击次数 + +- 分组:C端 - 二维码访问统计 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/download-qrcode/increment` +- operationId:`WebDownloadQrcode_incrementCount` +- 描述:根据code增加对应类型的计数,用于埋点 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`WebDownloadQrcodeIncrementReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| code | 二维码编码 | 是 | string | ABC123 | +| visitCount | 是否增加访问次数 | 否 | boolean | | +| clickCount | 是否增加总点击次数 | 否 | boolean | | +| iosClickCount | 是否增加IOS点击次数 | 否 | boolean | | +| googleClickCount | 是否增加谷歌点击次数 | 否 | boolean | | +| apkClickCount | 是否增加APK点击次数 | 否 | boolean | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## C端 - 产品 + +### 1. 产品详情 + +- 分组:C端 - 产品 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/product/get` +- operationId:`WebProduct_getProduct` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| route | query | 是 | string | 产品跳转路由 | | +| countryCode | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebProductRespVO` | + +### 2. 获得产品分页 + +- 分组:C端 - 产品 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/product/page` +- operationId:`WebProduct_getProductPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productCateId | query | 是 | integer | 产品分类ID | | +| countryCode | query | 是 | string | 国家编码 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultWebProductPageRespVO` | + +## C端 - 产品分类 + +### 1. 获得产品分类列表 + +- 分组:C端 - 产品分类 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/product-cate/list` +- operationId:`WebProductCate_getProductCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateType | query | 是 | integer | 类型(普通产品=1,积分产品=2) | 2 | +| status | query | 否 | integer | 状态(1启用,2停用) | 2 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListWebProductCateRespVO` | + +## C端 - 产品结算 + +### 1. 获取积分结算信息 + +- 分组:C端 - 产品结算 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/settlement/points/settlement` +- operationId:`WebSettlement_getProductPointsSettlement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productSkuId | query | 否 | string | 商品 SKU ID | | +| num | query | 否 | integer | 商品数量 | | +| countryCode | query | 否 | string | 国家编码 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebProductPointsSettlementRespVO` | + +### 2. 纯积分结算提交订单 + +- 分组:C端 - 产品结算 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/settlement/points/submit` +- operationId:`WebSettlement_submitProductPointsSettlement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`WebProductPointsSettlementSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| productSkuId | 商品 SKU ID | 否 | string | | +| num | 商品数量 | 否 | integer | | +| countryCode | 国家编码 | 否 | string | | +| recipientName | 收件人姓名 | 是 | string | | +| recipientPhone | 收件人手机 | 是 | string | | +| provinceState | 省/州 | 否 | string | | +| city | 市 | 是 | string | | +| district | 区/县 | 否 | string | | +| postalCode | 邮编 | 是 | string | | +| houseNumber | 门牌号 | 否 | string | | +| address1 | 地址1 | 是 | string | | +| address2 | 地址2 | 否 | string | | +| userRemark | 用户备注 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +## C端 - 协议 + +### 1. 获得协议 + +- 分组:C端 - 协议 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/agreement/get` +- operationId:`WebAgreement_getAgreement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAgreementRespVO` | + +### 2. 获得协议分页 + +- 分组:C端 - 协议 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/agreement/page` +- operationId:`WebAgreement_getAgreementPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| terminal | query | 是 | string | 终端(1web 2app) | | +| type | query | 是 | integer | 类型(1隐私协议 2用户协议) | 2 | +| lang | query | 是 | string | 语言 (en 英语 de 德语 ja 日语) | en | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAgreementRespVO` | + +## C端 - 合作联系 + +### 1. 提交合作联系信息 + +- 分组:C端 - 合作联系 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/cooperation/create` +- operationId:`WebCooperation_createCooperation` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CooperationCreateReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| name | 姓名 | 是 | string | Tom | +| email | 邮箱 | 是 | string | tom@example.com | +| address | 公司名称或地址 | 是 | string | Berlin | +| cooperationType | 合作类型 | 是 | string | business | +| cooperationDetail | 合作详情 | 否 | string | I want to cooperate with you | +| lang | 语言 | 否 | string | en | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +## C端 - 售后 + +### 1. 提交售后 + +- 分组:C端 - 售后 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/order-after-sale/create` +- operationId:`WebOrderAfterSale_createOrderAfterSale` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`WebOrderAfterSaleSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| orderId | 订单ID | 是 | integer | | +| orderItemId | 订单商品ID | 是 | array[integer] | | +| evidence | 凭证图片或视频 | 是 | array[Evidence] | | +| email | 申请人邮箱 | 是 | string | | +| phone | 电话号码 | 否 | string | | +| productIssues | 产品问题 | 是 | string | | +| deviceId | 设备ID | 是 | string | | +| tenantId | | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 售后详情 + +- 分组:C端 - 售后 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order-after-sale/get` +- operationId:`WebOrderAfterSale_getOrderAfterSale` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebOrderAfterRespVO` | + +### 3. 同步oa售后数据 + +- 分组:C端 - 售后 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/order-after-sale/sync-oa` +- operationId:`WebOrderAfterSale_syncOrderAfterSaleFromOA` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OAOrderAfterRespVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| list | 申请人账号 | 否 | array[OAOrderAfterInfo] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 提供给OA接收售后信息变化 + +- 分组:C端 - 售后 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/order-after-sale/update` +- operationId:`WebOrderAfterSale_updateOrderAfterSale` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`array[WebOAOrderAfterReqVO]` + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## C端 - 售后政策 + +### 1. 获得售后政策 + +- 分组:C端 - 售后政策 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/after-sales-policy/get` +- operationId:`WebAfterSalesPolicy_getAfterSalesPolicy` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAfterSalesPolicyRespVO` | + +### 2. 获得售后政策分页 + +- 分组:C端 - 售后政策 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/after-sales-policy/page` +- operationId:`WebAfterSalesPolicy_getAfterSalesPolicyPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| brandId | query | 否 | integer | 品牌ID | 9150 | +| title | query | 否 | string | 标题 | | +| content | query | 否 | string | 内容 | | +| lang | query | 否 | string | 语言 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAfterSalesPolicyRespVO` | + +## C端 - 售后政策-品牌 + +### 1. 获得售后政策-品牌 + +- 分组:C端 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/after-sales-brand/get` +- operationId:`WebAfterSalesBrand_getAfterSalesBrand` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAfterSalesBrandRespVO` | + +### 2. 获得售后政策-品牌分页 + +- 分组:C端 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/after-sales-brand/page` +- operationId:`WebAfterSalesBrand_getAfterSalesBrandPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| brandName | query | 否 | string | 品牌名称 | Apple | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAfterSalesBrandRespVO` | + +## C端 - 国家信息 + +### 1. 获取国家列表(启用状态) + +- 分组:C端 - 国家信息 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/address-country/list` +- operationId:`WebAddressCountry_getCountryList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListWebAddressCountryListRespVO` | + +## C端 - 埋点 + +### 1. 创建埋点记录 + +- 分组:C端 - 埋点 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/event-tracking/create` +- operationId:`WebEventTracking_createEventTracking` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`EventTrackingSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 自增主键,全局唯一标识 | 否 | integer | 15213 | +| eventName | 事件名称(如 login/click_order) | 是 | string | login | +| customerId | 登录用户唯一 ID | 否 | string | 6548 | +| ip | 客户端 IP 地址(支持 IPv4/IPv6) | 否 | string | | +| anonymousId | 匿名用户唯一标识(未登录用户) | 否 | string | 22457 | +| sessionId | 会话标识(追踪单次会话行为) | 否 | string | 10867 | +| pageUrl | 完整访问 URL(含参数) | 否 | string | https://www.iocoder.cn | +| pagePath | 不含参数的页面路径 | 否 | string | | +| pageType | 页面分类(如商品详情页) | 否 | string | 1 | +| referrer | 上一跳网址(用户进入当前页的前一页) | 否 | string | | +| sourceChannel | 来源分类(如抖音/快手) | 否 | string | | +| country | 国家代码(如 CN/US) | 否 | string | | +| deviceType | 设备类型(限定为 mobile/desktop/tablet) | 否 | string | 2 | +| deviceId | 设备唯一 ID(如 IMEI/IDFA) | 否 | string | 949 | +| browser | 浏览器名称(如 Chrome/Safari) | 否 | string | | +| os | 操作系统(如 iOS/Android) | 否 | string | | +| locale | 访问语言(如 zh-CN/en-US) | 否 | string | | +| utmSource | UTM 来源(如广告投放渠道) | 否 | string | | +| utmAccount | UTM 账号来源 | 否 | string | 5452 | +| utmMedium | UTM 渠道/推广类型(如 email/social) | 否 | string | | +| utmCampaign | UTM 活动标识(如 618 大促) | 否 | string | | +| utmContent | UTM 内容标识(如广告创意) | 否 | string | | +| campaignId | 内部活动 ID | 否 | string | 28818 | +| screenWidth | 屏幕宽度 | 否 | integer | 1920 | +| pageTitle | 页面标题 | 否 | string | Home Page | +| isEffective | 是否有效 | 否 | boolean | True | +| stayDuration | 停留时长(毫秒) | 否 | integer | 5000 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +## C端 - 基础数据-说明(售后/运费说明,售后问题) + +### 1. 获得基础数据-说明 + +- 分组:C端 - 基础数据-说明(售后/运费说明,售后问题) +- 请求方式:`GET` +- 接口路径:`/web-api/jh/article/get` +- operationId:`WebArticle_getArticle` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultArticleRespVO` | + +### 2. 获得基础数据-说明分页 + +- 分组:C端 - 基础数据-说明(售后/运费说明,售后问题) +- 请求方式:`GET` +- 接口路径:`/web-api/jh/article/page` +- operationId:`WebArticle_getArticlePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| articleType | query | 是 | string | 说明类型(数据字典配置) | about_us | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultArticleRespVO` | + +## C端 - 我的订单 + +### 1. 取消订单 + +- 分组:C端 - 我的订单 +- 请求方式:`PUT` +- 接口路径:`/web-api/jh/order/cancel` +- operationId:`ClientOrder_cancelOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OrderCancelReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | ID | 是 | integer | 1316 | +| cancelRemark | 取消订单备注 | 是 | string | 随便 | +| userId | 用户id | 否 | integer | | +| itemDOList | | 否 | array[OrderItemDO] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. 捕获订单 + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/capture` +- operationId:`ClientOrder_captureOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| paypalOrderId | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCaptureRespVO` | + +### 3. 重新计算运费和总价 + +- 分组:C端 - 我的订单 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/order/change-shipping-amount` +- operationId:`ClientOrder_changeShippingAmount` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ShippingAmountReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| paypalOrderId | 支付订单号 | 是 | string | | +| address | 地址 | 是 | AddressExtra | | +| userId | | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultShippingAmountRespVO` | + +### 4. 查询各状态订单数量 + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/count` +- operationId:`ClientOrder_getOrderCount` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOrderCountRespVO` | + +### 5. 创建订单 + +- 分组:C端 - 我的订单 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/order/creat` +- operationId:`ClientOrder_creatOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OrderCreatReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| customerId | 用户id | 否 | integer | | +| userEmail | 用户邮箱 | 否 | string | | +| orderType | 订单类型 | 是 | integer | | +| isAnon | 是否匿名 | 是 | integer | | +| orderNo | 订单号 | 否 | string | | +| source | 订单来源:cart.购物车、product.单个产品 | 是 | string | | +| status | 订单状态: 订单生成=created, 待发货=pending, 已发货待揽收=waiting_for_pickup, 部分发货=partial_shipped, 已发货=shipped, 售后中=after_sales, 交易完成=completed, 交易关闭=closed | 是 | string | | +| couponCode | 优惠券码 | 否 | string | | +| couponName | 优惠券名称 | 否 | string | | +| discountId | 折扣id | 否 | integer | | +| couponDiscountRate | 优惠券折扣率 | 否 | number | | +| totalAmount | 订单总金额 | 是 | number | | +| discountAmount | 优惠金额 | 是 | number | | +| usePoints | 使用积分 | 是 | integer | | +| shippingAmount | 运费 | 是 | number | | +| actualAmount | 实际支付金额 | 是 | number | | +| paymentTime | 支付时间 | 否 | string | | +| deliverTime | 发货时间 | 否 | string | | +| applyAftersaleTime | 申请售后时间 | 否 | string | | +| returnTime | 申请退款时间 | 否 | string | | +| completeTime | 完成时间(退款完成时间、订单完成时间) | 否 | string | | +| userRemark | 用户备注 | 否 | string | | +| sellerRemark | 商家备注 | 否 | string | | +| cancelRemark | 取消订单备注 | 否 | string | | +| paypalOrderId | paypal-订单ID | 否 | string | | +| paypalSelfUrl | paypal-self链接 | 否 | string | | +| paypalApproveUrl | paypal-approve链接 | 否 | string | | +| paypalUpdateUrl | paypal-update链接 | 否 | string | | +| paypalCaptureUrl | paypal-capture链接 | 否 | string | | +| paypalStatus | paypal-状态 | 否 | string | | +| lingxingGlobalOrderNo | 领星多平台订单编码 | 否 | string | | +| lingxingOrderMessage | 领星平台订单提示 | 否 | string | | +| deviceId | 设备ID | 是 | string | | +| deptId | 部门ID | 否 | integer | | +| userId | 用户id | 否 | integer | | +| currencyCode | 币种编码 | 是 | string | | +| paypalCaptureId | paypal捕获id | 否 | string | | +| orderShipping | 订单运输信息 | 否 | OrderShippingDO | | +| items | 订单商品 | 是 | array[OrderCreatItemReqVO] | 随便 | +| joyHubToken | joyHubToken | 否 | string | | +| countryCode | 国家代码 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOrderDO` | + +### 6. 导出订单 Excel + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/export-excel` +- operationId:`ClientOrder_exportOrderExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| isAnon | query | 否 | integer | 订单类型 | (游客支付=1,登录支付=2) | +| orderNo | query | 否 | string | 订单号 | | +| statusList | query | 否 | array[string] | 订单状态 | 2 | +| productName | query | 否 | string | 商品名称 | | +| userId | query | 否 | integer | 用户id | | +| ids | query | 否 | array[integer] | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 获得订单 + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/get` +- operationId:`ClientOrder_getOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOrderRespVO` | + +### 8. 支付成功页订单详情产品信息 + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/order-item` +- operationId:`ClientOrder_getOrderItemList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| orderId | query | 是 | integer | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListOrderItemRespVO` | + +### 9. 获得订单分页 + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/page` +- operationId:`ClientOrder_getOrderPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| isAnon | query | 否 | integer | 订单类型 | (游客支付=1,登录支付=2) | +| orderNo | query | 否 | string | 订单号 | | +| statusList | query | 否 | array[string] | 订单状态 | 2 | +| productName | query | 否 | string | 商品名称 | | +| userId | query | 否 | integer | 用户id | | +| ids | query | 否 | array[integer] | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultOrderRespVO` | + +### 10. 设置订单备注 + +- 分组:C端 - 我的订单 +- 请求方式:`PUT` +- 接口路径:`/web-api/jh/order/set-remark` +- operationId:`ClientOrder_updateOrderRemark` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OrderSetRemarkReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | ID | 是 | integer | 1316 | +| sellerRemark | 商家备注 | 是 | string | | +| userId | 用户id | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 11. 查询状态列表 + +- 分组:C端 - 我的订单 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/order/status` +- operationId:`ClientOrder_getStatus` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListOrderStatusRespVO` | + +## C端 - 支付页产品推荐 + +### 1. 获得支付页产品推荐分页 + +- 分组:C端 - 支付页产品推荐 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/product-payment-recommend/page` +- operationId:`WebProductPaymentRecommend_getProductPaymentRecommendPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultWebProductPaymentRecommendRespVO` | + +## C端 - 文件存储 + +### 1. 创建文件 + +- 分组:C端 - 文件存储 +- 请求方式:`POST` +- 接口路径:`/web-api/infra/file/create` +- operationId:`AppFile_createFile` +- 描述:模式二:前端上传文件:配合 presigned-url 接口,记录上传了上传的文件 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FileCreateReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| configId | 文件配置编号 | 是 | integer | 11 | +| path | 文件路径 | 是 | string | yudao.jpg | +| name | 原文件名 | 是 | string | yudao.jpg | +| url | 文件 URL | 是 | string | https://www.iocoder.cn/yudao.jpg | +| type | 文件 MIME 类型 | 否 | string | application/octet-stream | +| size | 文件大小 | 是 | integer | 2048 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 获取文件预签名地址(上传) + +- 分组:C端 - 文件存储 +- 请求方式:`GET` +- 接口路径:`/web-api/infra/file/presigned-url` +- operationId:`AppFile_getFilePresignedUrl` +- 描述:模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 是 | string | 文件名称 | | +| directory | query | 否 | string | 文件目录 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFilePresignedUrlRespVO` | + +### 3. 上传文件 + +- 分组:C端 - 文件存储 +- 请求方式:`POST` +- 接口路径:`/web-api/infra/file/upload` +- operationId:`AppFile_uploadFile` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| directory | query | 否 | string | 文件目录 | XXX/YYY | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultString` | + +## C端 - 点赞记录 + +### 1. 创建点赞记录 + +- 分组:C端 - 点赞记录 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/like-info/create` +- operationId:`LikeInfo_createLikeInfo` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`LikeInfoSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 26674 | +| type | 点赞数据类型1-new,2-blog | 是 | integer | 2 | +| dataId | 被点赞的数据id | 是 | integer | 13077 | +| deviceId | 点赞设备ID | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 取消点赞 + +- 分组:C端 - 点赞记录 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/like-info/delete` +- operationId:`LikeInfo_deleteLikeInfo` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`LikeInfoSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 26674 | +| type | 点赞数据类型1-new,2-blog | 是 | integer | 2 | +| dataId | 被点赞的数据id | 是 | integer | 13077 | +| deviceId | 点赞设备ID | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 获得点赞记录 + +- 分组:C端 - 点赞记录 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/like-info/get` +- operationId:`LikeInfo_getLikeInfo` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLikeInfoRespVO` | + +### 4. 获得点赞记录分页 + +- 分组:C端 - 点赞记录 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/like-info/page` +- operationId:`LikeInfo_getLikeInfoPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| type | query | 否 | integer | 点赞数据类型new,blog | 2 | +| typeText | query | 否 | string | 点赞数据类型new,blog | | +| dataId | query | 否 | integer | 被点赞的数据id | 16557 | +| dataCode | query | 否 | string | 被点赞的数据编码 | | +| deviceId | query | 否 | string | 点赞设备ID | 1035 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 30926 | +| userId | query | 否 | integer | 权限用户ID | 9582 | +| custId | query | 否 | integer | 点赞app用户id | 20240 | +| nickName | query | 否 | string | 点赞app用户名称 | 李四 | +| email | query | 否 | string | 点赞app用户邮箱 | | +| headImg | query | 否 | string | 点赞头像图片 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultLikeInfoRespVO` | + +## C端 - 用户 + +### 1. 查询当前用户积分 + +- 分组:C端 - 用户 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/client/get/point` +- operationId:`WebClient_getPoint` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultUserPoint` | + +## C端 - 积分结算 + +### 1. 积分商品检测计算积分价格 + +- 分组:C端 - 积分结算 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/settle_points/estimated-calculation` +- operationId:`WebSettlePoints_estimatedCalculation` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productSkuId | query | 否 | string | 商品 SKU ID | | +| num | query | 否 | integer | 商品数量 | | +| countryCode | query | 否 | string | 国家编码 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebProductPointsSettlementRespVO` | + +## C端 - 购物车 + +### 1. 购物车计算 + +- 分组:C端 - 购物车 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/shopping-cart/calculate` +- operationId:`WebShoppingCart_calculate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CalculateParam` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| couponCode | 优惠券码 | 否 | string | | +| countryCode | 国家编码-不为空时表示所有商品国家编码一致 | 否 | string | | +| isAnon | 是否匿名(前端页面不需要传) | 否 | integer | | +| joyhubToken | C端token(前端不需要传) | 否 | string | | +| productItems | 商品详情(登录用户前端页面不需要传) | 否 | array[CalculateItemParam] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCalculateResult` | + +### 2. 单独计算运费 + +- 分组:C端 - 购物车 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/shopping-cart/calculate-shippingcost` +- operationId:`WebShoppingCart_calculateShippingcost` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CalculateShippingcostReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| productList | 产品list | 是 | array[ShoppingCartItemSaveReqVo] | | +| currencyCode | 国家 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCalculateShippingcostRespVO` | + +### 3. 检测购物车产品列表数据 + +- 分组:C端 - 购物车 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/shopping-cart/check` +- operationId:`WebShoppingCart_checkShoppingCart` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ShoppingCartSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| deviceId | 设备ID | 否 | string | | +| products | 商品信息列表 | 否 | array[ShoppingCartItemSaveReqVo] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCheckResult` | + +### 4. 创建购物车 + +- 分组:C端 - 购物车 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/shopping-cart/create` +- operationId:`WebShoppingCart_createShoppingCart` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ShoppingCartSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| deviceId | 设备ID | 否 | string | | +| products | 商品信息列表 | 否 | array[ShoppingCartItemSaveReqVo] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 刪除 + +- 分组:C端 - 购物车 +- 请求方式:`DELETE` +- 接口路径:`/web-api/jh/shopping-cart/delete-list` +- operationId:`WebShoppingCart_deleteBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | integer | ids | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 6. 获得购物车列表 + +- 分组:C端 - 购物车 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/shopping-cart/list` +- operationId:`WebShoppingCart_getShoppingCart` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListShoppingCartRespVO` | + +### 7. 更新购物车产品数量 + +- 分组:C端 - 购物车 +- 请求方式:`POST` +- 接口路径:`/web-api/jh/shopping-cart/update` +- operationId:`WebShoppingCart_updateShoppingCart` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ShoppingCartItemSaveReqVo` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 购物车详情id | 否 | integer | | +| productSkuId | 商品skuid | 是 | string | 3644 | +| num | 购买数量 | 是 | integer | | +| countryCode | 国家编码 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## c端 - Banner信息 + +### 1. 获得Banner管理 + +- 分组:c端 - Banner信息 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/banner/get` +- operationId:`WebBanner_getBanner` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBannerRespVO` | + +### 2. 获得Banner管理分页 + +- 分组:c端 - Banner信息 +- 请求方式:`GET` +- 接口路径:`/web-api/jh/banner/page` +- operationId:`WebBanner_getBannerPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| position | query | 否 | string | 位置,不传则获取所有位置 | HOME_TOP | +| title | query | 否 | string | 标题(模糊查询) | joy | +| subTitle | query | 否 | string | 副标题(模糊查询) | hub | +| platform | query | 是 | integer | 适用平台(1PC 2手机) | 1 | +| lang | query | 是 | string | 语言(en 英语 de 德语 ja 日语) | en | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultBannerRespVO` | + +## default-controller + +### 1. Default_ai404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. Default_ai404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. Default_ai404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. Default_ai404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. Default_ai404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 6. Default_ai404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 7. Default_ai404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/ai/**` +- operationId:`Default_ai404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 8. Default_bpm404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 9. Default_bpm404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 10. Default_bpm404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 11. Default_bpm404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 12. Default_bpm404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 13. Default_bpm404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 14. Default_bpm404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/bpm/**` +- operationId:`Default_bpm404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 15. Default_crm404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 16. Default_crm404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 17. Default_crm404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 18. Default_crm404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 19. Default_crm404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 20. Default_crm404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 21. Default_crm404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/crm/**` +- operationId:`Default_crm404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 22. Default_erp404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 23. Default_erp404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 24. Default_erp404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 25. Default_erp404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 26. Default_erp404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 27. Default_erp404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 28. Default_erp404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/erp/**` +- operationId:`Default_erp404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 29. Default_iot404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 30. Default_iot404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 31. Default_iot404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 32. Default_iot404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 33. Default_iot404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 34. Default_iot404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 35. Default_iot404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/iot/**` +- operationId:`Default_iot404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 36. Default_mp404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 37. Default_mp404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 38. Default_mp404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 39. Default_mp404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 40. Default_mp404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 41. Default_mp404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 42. Default_mp404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/mp/**` +- operationId:`Default_mp404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 43. Default_pay404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 44. Default_pay404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 45. Default_pay404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 46. Default_pay404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 47. Default_pay404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 48. Default_pay404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 49. Default_pay404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/pay/**` +- operationId:`Default_pay404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 50. Default_mall404_17 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_17` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 51. Default_mall404_14 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_14` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 52. Default_mall404_19 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_19` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 53. Default_mall404_20 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_20` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 54. Default_mall404_18 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_18` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 55. Default_mall404_15 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_15` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 56. Default_mall404_16 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/product/**` +- operationId:`Default_mall404_16` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 57. Default_mall404_10 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_10` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 58. Default_mall404_7 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_7` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 59. Default_mall404_12 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_12` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 60. Default_mall404_13 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_13` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 61. Default_mall404_11 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_11` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 62. Default_mall404_8 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_8` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 63. Default_mall404_9 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/promotion/**` +- operationId:`Default_mall404_9` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 64. Default_report404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 65. Default_report404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 66. Default_report404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 67. Default_report404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 68. Default_report404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 69. Default_report404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 70. Default_report404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/report/**` +- operationId:`Default_report404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 71. Default_mall404_3 + +- 分组:default-controller +- 请求方式:`DELETE` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404_3` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 72. Default_mall404 + +- 分组:default-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 73. Default_mall404_5 + +- 分组:default-controller +- 请求方式:`HEAD` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404_5` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 74. Default_mall404_6 + +- 分组:default-controller +- 请求方式:`OPTIONS` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404_6` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 75. Default_mall404_4 + +- 分组:default-controller +- 请求方式:`PATCH` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404_4` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 76. Default_mall404_1 + +- 分组:default-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404_1` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 77. Default_mall404_2 + +- 分组:default-controller +- 请求方式:`PUT` +- 接口路径:`/admin-api/trade/**` +- operationId:`Default_mall404_2` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## pay-pal-payment-controller + +### 1. PayPalPayment_cancel + +- 分组:pay-pal-payment-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/cancel` +- operationId:`PayPalPayment_cancel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `string` | + +### 2. PayPalPayment_captureOrder + +- 分组:pay-pal-payment-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/capture-order` +- operationId:`PayPalPayment_captureOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| orderId | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +### 3. PayPalPayment_createOrder + +- 分组:pay-pal-payment-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/create-order` +- operationId:`PayPalPayment_createOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`PaymentRequest` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| amount | | 否 | number | | +| currency | | 否 | string | | +| description | | 否 | string | | +| outTradeNo | | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +### 4. PayPalPayment_getOrder + +- 分组:pay-pal-payment-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/get-order` +- operationId:`PayPalPayment_getOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| orderId | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +### 5. PayPalPayment_getRefund + +- 分组:pay-pal-payment-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/get-refund` +- operationId:`PayPalPayment_getRefund` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| refundId | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +### 6. PayPalPayment_refundCapturedPayment + +- 分组:pay-pal-payment-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/refund-captured-payment` +- operationId:`PayPalPayment_refundCapturedPayment` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`RefundCapturedPaymentRequest` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| captureId | | 否 | string | | +| currencyCode | | 否 | string | | +| value | | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +### 7. PayPalPayment_searchTransaction + +- 分组:pay-pal-payment-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/search-transaction` +- operationId:`PayPalPayment_searchTransaction` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`SearchTransactionRequest` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| startDate | | 否 | string | | +| endDate | | 否 | string | | +| fields | | 否 | string | | +| pageSize | | 否 | integer | | +| page | | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +### 8. PayPalPayment_success + +- 分组:pay-pal-payment-controller +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/success` +- operationId:`PayPalPayment_success` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| token | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `string` | + +### 9. PayPalPayment_trackOrder + +- 分组:pay-pal-payment-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/track-order` +- operationId:`PayPalPayment_trackOrder` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`TrackRequest` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| orderId | | 否 | string | | +| captureId | | 否 | string | | +| trackingNumber | | 否 | string | | +| carrier | | 否 | string | | +| carrierNameOther | | 否 | string | | +| notifyPayer | | 否 | boolean | | +| items | | 否 | array[OrderTrackerItem] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `object` | + +## pay-pal-webhook-controller + +### 1. PayPalWebhook_receivePayPalWebhook + +- 分组:pay-pal-webhook-controller +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/webhook/payment` +- operationId:`PayPalWebhook_receivePayPalWebhook` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| PAYPAL-TRANSMISSION-ID | header | 是 | string | | | +| PAYPAL-TRANSMISSION-TIME | header | 是 | string | | | +| PAYPAL-TRANSMISSION-SIG | header | 是 | string | | | +| PAYPAL-CERT-URL | header | 是 | string | | | +| PAYPAL-AUTH-ALGO | header | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`string` + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `string` | + +## 用户 App - 地区 + +### 1. 获得地区树 + +- 分组:用户 App - 地区 +- 请求方式:`GET` +- 接口路径:`/app-api/system/area/tree` +- operationId:`AppArea_getAreaTree` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListAppAreaNodeRespVO` | + +## 用户 App - 字典数据 + +### 1. 根据字典类型查询字典数据信息 + +- 分组:用户 App - 字典数据 +- 请求方式:`GET` +- 接口路径:`/app-api/system/dict-data/type` +- operationId:`AppDictData_getDictDataListByType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| type | query | 是 | string | 字典类型 | common_status | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListAppDictDataRespVO` | + +## 用户 App - 租户 + +### 1. 使用域名,获得租户信息 + +- 分组:用户 App - 租户 +- 请求方式:`GET` +- 接口路径:`/app-api/system/tenant/get-by-website` +- operationId:`AppTenant_getTenantByWebsite` +- 描述:根据用户的域名,获得租户信息 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| website | query | 是 | string | 域名 | www.iocoder.cn | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAppTenantRespVO` | + +## 管理后台 - API 访问日志 + +### 1. 导出API 访问日志 Excel + +- 分组:管理后台 - API 访问日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/api-access-log/export-excel` +- operationId:`ApiAccessLog_exportApiAccessLogExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| userId | query | 否 | integer | 用户编号 | 666 | +| userType | query | 否 | integer | 用户类型 | 2 | +| applicationName | query | 否 | string | 应用名 | dashboard | +| requestUrl | query | 否 | string | 请求地址,模糊匹配 | /xxx/yyy | +| beginTime | query | 否 | array[string] | 开始时间 | [2022-07-01 00:00:00, 2022-07-01 23:59:59] | +| duration | query | 否 | integer | 执行时长,大于等于,单位:毫秒 | 100 | +| resultCode | query | 否 | integer | 结果码 | 0 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 2. 获得API 访问日志分页 + +- 分组:管理后台 - API 访问日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/api-access-log/page` +- operationId:`ApiAccessLog_getApiAccessLogPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| userId | query | 否 | integer | 用户编号 | 666 | +| userType | query | 否 | integer | 用户类型 | 2 | +| applicationName | query | 否 | string | 应用名 | dashboard | +| requestUrl | query | 否 | string | 请求地址,模糊匹配 | /xxx/yyy | +| beginTime | query | 否 | array[string] | 开始时间 | [2022-07-01 00:00:00, 2022-07-01 23:59:59] | +| duration | query | 否 | integer | 执行时长,大于等于,单位:毫秒 | 100 | +| resultCode | query | 否 | integer | 结果码 | 0 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultApiAccessLogRespVO` | + +## 管理后台 - API 错误日志 + +### 1. 导出 API 错误日志 Excel + +- 分组:管理后台 - API 错误日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/api-error-log/export-excel` +- operationId:`ApiErrorLog_exportApiErrorLogExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| userId | query | 否 | integer | 用户编号 | 666 | +| userType | query | 否 | integer | 用户类型 | 1 | +| applicationName | query | 否 | string | 应用名 | dashboard | +| requestUrl | query | 否 | string | 请求地址 | /xx/yy | +| exceptionTime | query | 否 | array[string] | 异常发生时间 | | +| processStatus | query | 否 | integer | 处理状态 | 0 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 2. 获得 API 错误日志分页 + +- 分组:管理后台 - API 错误日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/api-error-log/page` +- operationId:`ApiErrorLog_getApiErrorLogPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| userId | query | 否 | integer | 用户编号 | 666 | +| userType | query | 否 | integer | 用户类型 | 1 | +| applicationName | query | 否 | string | 应用名 | dashboard | +| requestUrl | query | 否 | string | 请求地址 | /xx/yy | +| exceptionTime | query | 否 | array[string] | 异常发生时间 | | +| processStatus | query | 否 | integer | 处理状态 | 0 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultApiErrorLogRespVO` | + +### 3. 更新 API 错误日志的状态 + +- 分组:管理后台 - API 错误日志 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/api-error-log/update-status` +- operationId:`ApiErrorLog_updateApiErrorLogProcess` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| processStatus | query | 是 | integer | 处理状态 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - Banner管理 + +### 1. 创建Banner管理 + +- 分组:管理后台 - Banner管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/banner/create` +- operationId:`Banner_createBanner` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`BannerSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 13589 | +| position | 位置 | 是 | string | | +| title | 标题 | 否 | string | | +| subTitle | 副标题 | 否 | string | | +| image | 图片 | 是 | BannerImageDO | {'url': 'https://www.toendi.com/static/image/cd94c191561c4a37a04c78fca2913851.webp', 'name': 'Toendi Joyhub vibrator heater Black Friday promotion for warm and pleasurable experiences', 'mime_type': 'image/webp'} | +| link | 链接 | 否 | string | | +| platform | 适用平台(1PC 2手机) | 是 | integer | | +| lang | 语言(en 英语 de 德语 ja 日语) | 是 | string | | +| rankNum | 排序号 | 是 | integer | | +| type | 类型 | 是 | string | | +| status | 状态 | 是 | integer | 2 | +| intervalTime | 轮播时间(秒) | 是 | integer | | +| coverImage | 缩略图 | 否 | ProductImageDO | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除Banner管理 + +- 分组:管理后台 - Banner管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/banner/delete` +- operationId:`Banner_deleteBanner` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除Banner管理 + +- 分组:管理后台 - Banner管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/banner/delete-list` +- operationId:`Banner_deleteBannerList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出Banner管理 Excel + +- 分组:管理后台 - Banner管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/banner/export-excel` +- operationId:`Banner_exportBannerExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| position | query | 否 | string | 位置 | | +| title | query | 否 | string | 标题 | | +| subTitle | query | 否 | string | 副标题 | | +| platform | query | 否 | integer | 适用平台(1PC 2手机) | | +| lang | query | 否 | string | 语言(en 英语 de 德语 ja 日语) | | +| type | query | 否 | string | 类型 | | +| status | query | 否 | integer | 状态 | 2 | +| intervalTime | query | 否 | integer | 轮播时间(秒) | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得Banner管理 + +- 分组:管理后台 - Banner管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/banner/get` +- operationId:`Banner_getBanner` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBannerRespVO` | + +### 6. 获得导入Banner管理模板 + +- 分组:管理后台 - Banner管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/banner/get-import-template` +- operationId:`Banner_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入Banner管理Excel + +- 分组:管理后台 - Banner管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/banner/import-excel` +- operationId:`Banner_importBannerExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBannerImportRespVO` | + +### 8. 获得Banner管理分页 + +- 分组:管理后台 - Banner管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/banner/page` +- operationId:`Banner_getBannerPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| position | query | 否 | string | 位置 | | +| title | query | 否 | string | 标题 | | +| subTitle | query | 否 | string | 副标题 | | +| platform | query | 否 | integer | 适用平台(1PC 2手机) | | +| lang | query | 否 | string | 语言(en 英语 de 德语 ja 日语) | | +| type | query | 否 | string | 类型 | | +| status | query | 否 | integer | 状态 | 2 | +| intervalTime | query | 否 | integer | 轮播时间(秒) | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultBannerRespVO` | + +### 9. 更新Banner管理 + +- 分组:管理后台 - Banner管理 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/banner/update` +- operationId:`Banner_updateBanner` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`BannerSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 13589 | +| position | 位置 | 是 | string | | +| title | 标题 | 否 | string | | +| subTitle | 副标题 | 否 | string | | +| image | 图片 | 是 | BannerImageDO | {'url': 'https://www.toendi.com/static/image/cd94c191561c4a37a04c78fca2913851.webp', 'name': 'Toendi Joyhub vibrator heater Black Friday promotion for warm and pleasurable experiences', 'mime_type': 'image/webp'} | +| link | 链接 | 否 | string | | +| platform | 适用平台(1PC 2手机) | 是 | integer | | +| lang | 语言(en 英语 de 德语 ja 日语) | 是 | string | | +| rankNum | 排序号 | 是 | integer | | +| type | 类型 | 是 | string | | +| status | 状态 | 是 | integer | 2 | +| intervalTime | 轮播时间(秒) | 是 | integer | | +| coverImage | 缩略图 | 否 | ProductImageDO | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - FAQ分类 + +### 1. 创建FAQ分类 + +- 分组:管理后台 - FAQ分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/faq-cate/create` +- operationId:`FaqCate_createFaqCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 9867 | +| pid | 父分类ID | 是 | integer | 12768 | +| title | 分类 | 是 | string | | +| status | 状态 (1正常 2停用) | 否 | integer | 1 | +| rankNum | 排序号 | 是 | integer | | +| lang | 语言 (en 英语 de 德语 ja 日语) | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除FAQ分类 + +- 分组:管理后台 - FAQ分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/faq-cate/delete` +- operationId:`FaqCate_deleteFaqCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 导出FAQ分类 Excel + +- 分组:管理后台 - FAQ分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-cate/export-excel` +- operationId:`FaqCate_exportFaqCateExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| pid | query | 否 | integer | 父分类ID | 12768 | +| title | query | 否 | string | 分类 | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 1 | +| rankNum | query | 否 | integer | 排序号 | | +| lang | query | 否 | string | 语言 (en 英语 de 德语 ja 日语) | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 6711 | +| userId | query | 否 | integer | 权限用户ID | 4173 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 4. 获得FAQ分类 + +- 分组:管理后台 - FAQ分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-cate/get` +- operationId:`FaqCate_getFaqCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFaqCateRespVO` | + +### 5. 获得导入FAQ分类模板 + +- 分组:管理后台 - FAQ分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-cate/get-import-template` +- operationId:`FaqCate_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 6. 导入FAQ分类Excel + +- 分组:管理后台 - FAQ分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/faq-cate/import-excel` +- operationId:`FaqCate_importFaqCateExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFaqCateImportRespVO` | + +### 7. 获得FAQ分类列表 + +- 分组:管理后台 - FAQ分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-cate/list` +- operationId:`FaqCate_getFaqCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| pid | query | 否 | integer | 父分类ID | 12768 | +| title | query | 否 | string | 分类 | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 1 | +| rankNum | query | 否 | integer | 排序号 | | +| lang | query | 否 | string | 语言 (en 英语 de 德语 ja 日语) | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 6711 | +| userId | query | 否 | integer | 权限用户ID | 4173 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListFaqCateRespVO` | + +### 8. 更新FAQ分类 + +- 分组:管理后台 - FAQ分类 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/faq-cate/update` +- operationId:`FaqCate_updateFaqCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 9867 | +| pid | 父分类ID | 是 | integer | 12768 | +| title | 分类 | 是 | string | | +| status | 状态 (1正常 2停用) | 否 | integer | 1 | +| rankNum | 排序号 | 是 | integer | | +| lang | 语言 (en 英语 de 德语 ja 日语) | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - FAQ数据 + +### 1. 获得FAQ分类下拉列表 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq/cate-list` +- operationId:`Faq_getFaqCateList` +- 描述:仅返回正常的叶子分类 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListFaqCateSimpleRespVO` | + +### 2. 创建FAQ数据 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/faq/create` +- operationId:`Faq_createFaq` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 6362 | +| faqCateId | 分类ID | 是 | integer | 29870 | +| question | 常见问题 | 是 | string | | +| answer | 回答 | 是 | string | | +| isHot | 是否热门(0否,1是) | 是 | integer | | +| status | 状态 (1正常 2停用) | 否 | integer | 2 | +| rankNum | 排序号 | 是 | integer | | +| lang | 语言 (en 英语 de 德语 ja 日语) | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 3. 删除FAQ数据 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/faq/delete` +- operationId:`Faq_deleteFaq` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 批量删除FAQ数据 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/faq/delete-list` +- operationId:`Faq_deleteFaqList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 导出FAQ数据 Excel + +- 分组:管理后台 - FAQ数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq/export-excel` +- operationId:`Faq_exportFaqExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| faqCateId | query | 否 | integer | 分类ID | 29870 | +| question | query | 否 | string | 常见问题 | | +| answer | query | 否 | string | 回答 | | +| isHot | query | 否 | integer | 是否热门(0否,1是) | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 2 | +| rankNum | query | 否 | integer | 排序号 | | +| lang | query | 否 | string | 语言 (en 英语 de 德语 ja 日语) | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 29922 | +| userId | query | 否 | integer | 权限用户ID | 11637 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 6. 获得FAQ数据 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq/get` +- operationId:`Faq_getFaq` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFaqRespVO` | + +### 7. 获得导入FAQ数据模板 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq/get-import-template` +- operationId:`Faq_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 8. 导入FAQ数据Excel + +- 分组:管理后台 - FAQ数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/faq/import-excel` +- operationId:`Faq_importFaqExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFaqImportRespVO` | + +### 9. 获得FAQ数据分页 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq/page` +- operationId:`Faq_getFaqPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| faqCateId | query | 否 | integer | 分类ID | 29870 | +| question | query | 否 | string | 常见问题 | | +| answer | query | 否 | string | 回答 | | +| isHot | query | 否 | integer | 是否热门(0否,1是) | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 2 | +| rankNum | query | 否 | integer | 排序号 | | +| lang | query | 否 | string | 语言 (en 英语 de 德语 ja 日语) | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 29922 | +| userId | query | 否 | integer | 权限用户ID | 11637 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultFaqRespVO` | + +### 10. 更新FAQ数据 + +- 分组:管理后台 - FAQ数据 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/faq/update` +- operationId:`Faq_updateFaq` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 6362 | +| faqCateId | 分类ID | 是 | integer | 29870 | +| question | 常见问题 | 是 | string | | +| answer | 回答 | 是 | string | | +| isHot | 是否热门(0否,1是) | 是 | integer | | +| status | 状态 (1正常 2停用) | 否 | integer | 2 | +| rankNum | 排序号 | 是 | integer | | +| lang | 语言 (en 英语 de 德语 ja 日语) | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - FAQ联系数据 + +### 1. 创建FAQ联系数据 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/faq-contact-us/create` +- operationId:`FaqContactUs_createFaqContactUs` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqContactUsSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 24733 | +| name | 姓名 | 是 | string | 芋艿 | +| email | 邮箱 | 是 | string | | +| toyOrderNumber | 玩具订单号 | 是 | string | | +| questionType | 问题类型 | 是 | string | 1 | +| questionDetail | 详情 | 否 | string | | +| files | 图片或视频 | 否 | array[JhFileDO] | | +| lang | 语言 | 是 | string | | +| ip | IP地址 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除FAQ联系数据 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/faq-contact-us/delete` +- operationId:`FaqContactUs_deleteFaqContactUs` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除FAQ联系数据 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/faq-contact-us/delete-list` +- operationId:`FaqContactUs_deleteFaqContactUsList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出FAQ联系数据 Excel + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-contact-us/export-excel` +- operationId:`FaqContactUs_exportFaqContactUsExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 姓名 | 芋艿 | +| email | query | 否 | string | 邮箱 | | +| toyOrderNumber | query | 否 | string | 玩具订单号 | | +| ids | query | 否 | array[integer] | ids | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得FAQ联系数据 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-contact-us/get` +- operationId:`FaqContactUs_getFaqContactUs` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFaqContactUsRespVO` | + +### 6. 获得导入FAQ联系数据模板 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-contact-us/get-import-template` +- operationId:`FaqContactUs_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入FAQ联系数据Excel + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/faq-contact-us/import-excel` +- operationId:`FaqContactUs_importFaqContactUsExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultFaqContactUsImportRespVO` | + +### 8. 获得FAQ联系数据分页 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/faq-contact-us/page` +- operationId:`FaqContactUs_getFaqContactUsPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 姓名 | 芋艿 | +| email | query | 否 | string | 邮箱 | | +| toyOrderNumber | query | 否 | string | 玩具订单号 | | +| ids | query | 否 | array[integer] | ids | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultFaqContactUsRespVO` | + +### 9. 更新FAQ联系数据 + +- 分组:管理后台 - FAQ联系数据 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/faq-contact-us/update` +- operationId:`FaqContactUs_updateFaqContactUs` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`FaqContactUsSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 24733 | +| name | 姓名 | 是 | string | 芋艿 | +| email | 邮箱 | 是 | string | | +| toyOrderNumber | 玩具订单号 | 是 | string | | +| questionType | 问题类型 | 是 | string | 1 | +| questionDetail | 详情 | 否 | string | | +| files | 图片或视频 | 否 | array[JhFileDO] | | +| lang | 语言 | 是 | string | | +| ip | IP地址 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - LX 亚马逊FBA货件详情 + +### 1. 创建LX 亚马逊FBA货件详情 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`POST` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/create` +- operationId:`LxFbaInboundShipmentDetail_createFbaInboundShipmentDetail` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`LxFbaInboundShipmentDetailSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 唯一ID | 是 | integer | 5515 | +| inboundPlanId | STA任务编号 | 否 | string | 10387 | +| alphaCode | 承运方式 | 否 | string | | +| amazonReferenceId | 关联号 | 否 | string | 28173 | +| endDate | 送达时段-结束时间 | 否 | string | | +| inboundRegion | 入库区域 | 否 | string | | +| itemCount | 商品总数 | 否 | integer | 2784 | +| itemList | 商品信息列表 | 否 | | | +| pickUpId | 提货单号 | 否 | string | 19381 | +| sendAddress | 发货地址 | 否 | | | +| shippingTime | 发货日期 | 否 | string | | +| shipmentConfirmationId | 货件单号 | 否 | string | 31329 | +| shipmentName | 货件名称 | 否 | string | 王五 | +| shippingAddress | 收货地址 | 否 | | | +| shippingMode | 货件类型 | 否 | string | | +| shippingSolution | 承运人 | 否 | string | | +| sid | 店铺ID | 否 | integer | 14347 | +| startDate | 送达时段-开始时间 | 否 | string | | +| status | 货件状态 | 否 | string | 1 | +| trackingNumberList | 追踪编号列表 | 否 | | | +| warehouseId | 物流中心编码 | 否 | string | 16629 | +| erpSyncStatus | 同步状态 (本地字段) | 否 | integer | 1 | +| userId | 权限用户ID | 是 | integer | 17868 | +| deptId | 权限部门ID | 是 | integer | 31940 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除LX 亚马逊FBA货件详情 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/delete` +- operationId:`LxFbaInboundShipmentDetail_deleteFbaInboundShipmentDetail` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除LX 亚马逊FBA货件详情 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/delete-list` +- operationId:`LxFbaInboundShipmentDetail_deleteFbaInboundShipmentDetailList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出LX 亚马逊FBA货件详情 Excel + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/export-excel` +- operationId:`LxFbaInboundShipmentDetail_exportFbaInboundShipmentDetailExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| inboundPlanId | query | 否 | string | STA任务编号 | 10387 | +| alphaCode | query | 否 | string | 承运方式 | | +| amazonReferenceId | query | 否 | string | 关联号 | 28173 | +| endDate | query | 否 | array[string] | 送达时段-结束时间 | | +| inboundRegion | query | 否 | string | 入库区域 | | +| itemCount | query | 否 | integer | 商品总数 | 2784 | +| itemList | query | 否 | object | 商品信息列表 | | +| pickUpId | query | 否 | string | 提货单号 | 19381 | +| sendAddress | query | 否 | object | 发货地址 | | +| shippingTime | query | 否 | array[string] | 发货日期 | | +| shipmentConfirmationId | query | 否 | string | 货件单号 | 31329 | +| shipmentName | query | 否 | string | 货件名称 | 王五 | +| shippingAddress | query | 否 | object | 收货地址 | | +| shippingMode | query | 否 | string | 货件类型 | | +| shippingSolution | query | 否 | string | 承运人 | | +| sid | query | 否 | integer | 店铺ID | 14347 | +| startDate | query | 否 | array[string] | 送达时段-开始时间 | | +| status | query | 否 | string | 货件状态 | 1 | +| trackingNumberList | query | 否 | object | 追踪编号列表 | | +| warehouseId | query | 否 | string | 物流中心编码 | 16629 | +| erpSyncStatus | query | 否 | integer | 同步状态 (本地字段) | 1 | +| createTime | query | 否 | array[string] | 系统创建时间 | | +| userId | query | 否 | integer | 权限用户ID | 17868 | +| deptId | query | 否 | integer | 权限部门ID | 31940 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得LX 亚马逊FBA货件详情 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/get` +- operationId:`LxFbaInboundShipmentDetail_getFbaInboundShipmentDetail` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLxFbaInboundShipmentDetailRespVO` | + +### 6. 获得导入LX 亚马逊FBA货件详情模板 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/get-import-template` +- operationId:`LxFbaInboundShipmentDetail_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入LX 亚马逊FBA货件详情Excel + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`POST` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/import-excel` +- operationId:`LxFbaInboundShipmentDetail_importFbaInboundShipmentDetailExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLxFbaInboundShipmentDetailImportRespVO` | + +### 8. 获得LX 亚马逊FBA货件详情分页 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/page` +- operationId:`LxFbaInboundShipmentDetail_getFbaInboundShipmentDetailPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| inboundPlanId | query | 否 | string | STA任务编号 | 10387 | +| alphaCode | query | 否 | string | 承运方式 | | +| amazonReferenceId | query | 否 | string | 关联号 | 28173 | +| endDate | query | 否 | array[string] | 送达时段-结束时间 | | +| inboundRegion | query | 否 | string | 入库区域 | | +| itemCount | query | 否 | integer | 商品总数 | 2784 | +| itemList | query | 否 | object | 商品信息列表 | | +| pickUpId | query | 否 | string | 提货单号 | 19381 | +| sendAddress | query | 否 | object | 发货地址 | | +| shippingTime | query | 否 | array[string] | 发货日期 | | +| shipmentConfirmationId | query | 否 | string | 货件单号 | 31329 | +| shipmentName | query | 否 | string | 货件名称 | 王五 | +| shippingAddress | query | 否 | object | 收货地址 | | +| shippingMode | query | 否 | string | 货件类型 | | +| shippingSolution | query | 否 | string | 承运人 | | +| sid | query | 否 | integer | 店铺ID | 14347 | +| startDate | query | 否 | array[string] | 送达时段-开始时间 | | +| status | query | 否 | string | 货件状态 | 1 | +| trackingNumberList | query | 否 | object | 追踪编号列表 | | +| warehouseId | query | 否 | string | 物流中心编码 | 16629 | +| erpSyncStatus | query | 否 | integer | 同步状态 (本地字段) | 1 | +| createTime | query | 否 | array[string] | 系统创建时间 | | +| userId | query | 否 | integer | 权限用户ID | 17868 | +| deptId | query | 否 | integer | 权限部门ID | 31940 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultLxFbaInboundShipmentDetailRespVO` | + +### 9. 更新LX 亚马逊FBA货件详情 + +- 分组:管理后台 - LX 亚马逊FBA货件详情 +- 请求方式:`PUT` +- 接口路径:`/admin-api/lx/fba-inbound-shipment-detail/update` +- operationId:`LxFbaInboundShipmentDetail_updateFbaInboundShipmentDetail` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`LxFbaInboundShipmentDetailSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 唯一ID | 是 | integer | 5515 | +| inboundPlanId | STA任务编号 | 否 | string | 10387 | +| alphaCode | 承运方式 | 否 | string | | +| amazonReferenceId | 关联号 | 否 | string | 28173 | +| endDate | 送达时段-结束时间 | 否 | string | | +| inboundRegion | 入库区域 | 否 | string | | +| itemCount | 商品总数 | 否 | integer | 2784 | +| itemList | 商品信息列表 | 否 | | | +| pickUpId | 提货单号 | 否 | string | 19381 | +| sendAddress | 发货地址 | 否 | | | +| shippingTime | 发货日期 | 否 | string | | +| shipmentConfirmationId | 货件单号 | 否 | string | 31329 | +| shipmentName | 货件名称 | 否 | string | 王五 | +| shippingAddress | 收货地址 | 否 | | | +| shippingMode | 货件类型 | 否 | string | | +| shippingSolution | 承运人 | 否 | string | | +| sid | 店铺ID | 否 | integer | 14347 | +| startDate | 送达时段-开始时间 | 否 | string | | +| status | 货件状态 | 否 | string | 1 | +| trackingNumberList | 追踪编号列表 | 否 | | | +| warehouseId | 物流中心编码 | 否 | string | 16629 | +| erpSyncStatus | 同步状态 (本地字段) | 否 | integer | 1 | +| userId | 权限用户ID | 是 | integer | 17868 | +| deptId | 权限部门ID | 是 | integer | 31940 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - LX 亚马逊店铺信息 + +### 1. 创建LX 亚马逊店铺信息 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`POST` +- 接口路径:`/admin-api/lx/amazon-shop/create` +- operationId:`LxAmazonShop_createAmazonShop` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`LxAmazonShopSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 25866 | +| sid | 店铺ID(领星唯一标识) | 是 | integer | 23553 | +| mid | 站点ID | 否 | integer | 16304 | +| sellerAccountId | 店铺账号ID | 否 | integer | 18795 | +| hasAdsSetting | 是否授权广告:0否, 1是 | 否 | integer | | +| status | 店铺状态:0停用, 1正常, 2授权异常, 3欠费 | 否 | integer | 1 | +| erpSyncStatus | 同步状态:0未同步, 1已同步, 2异常 | 否 | integer | 2 | +| name | 店铺名 | 否 | string | 王五 | +| sellerId | 亚马逊店铺ID(Seller ID) | 否 | string | 5978 | +| accountName | 店铺账户名称 | 否 | string | 王五 | +| region | 站点简称 | 否 | string | | +| country | 国家名称 | 否 | string | | +| marketplaceId | 亚马逊市场ID | 否 | string | 21231 | +| userId | 权限用户ID | 是 | integer | 5873 | +| deptId | 权限部门ID | 是 | integer | 13529 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除LX 亚马逊店铺信息 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/lx/amazon-shop/delete` +- operationId:`LxAmazonShop_deleteAmazonShop` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除LX 亚马逊店铺信息 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/lx/amazon-shop/delete-list` +- operationId:`LxAmazonShop_deleteAmazonShopList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出LX 亚马逊店铺信息 Excel + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/amazon-shop/export-excel` +- operationId:`LxAmazonShop_exportAmazonShopExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| sid | query | 否 | integer | 店铺ID(领星唯一标识) | 23553 | +| mid | query | 否 | integer | 站点ID | 16304 | +| sellerAccountId | query | 否 | integer | 店铺账号ID | 18795 | +| hasAdsSetting | query | 否 | integer | 是否授权广告:0否, 1是 | | +| status | query | 否 | integer | 店铺状态:0停用, 1正常, 2授权异常, 3欠费 | 1 | +| erpSyncStatus | query | 否 | integer | 同步状态:0未同步, 1已同步, 2异常 | 2 | +| name | query | 否 | string | 店铺名 | 王五 | +| sellerId | query | 否 | string | 亚马逊店铺ID(Seller ID) | 5978 | +| accountName | query | 否 | string | 店铺账户名称 | 王五 | +| region | query | 否 | string | 站点简称 | | +| country | query | 否 | string | 国家名称 | | +| marketplaceId | query | 否 | string | 亚马逊市场ID | 21231 | +| createTime | query | 否 | array[string] | 创建时间 | | +| userId | query | 否 | integer | 权限用户ID | 5873 | +| deptId | query | 否 | integer | 权限部门ID | 13529 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得LX 亚马逊店铺信息 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/amazon-shop/get` +- operationId:`LxAmazonShop_getAmazonShop` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLxAmazonShopRespVO` | + +### 6. 获得导入LX 亚马逊店铺信息模板 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/amazon-shop/get-import-template` +- operationId:`LxAmazonShop_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入LX 亚马逊店铺信息Excel + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`POST` +- 接口路径:`/admin-api/lx/amazon-shop/import-excel` +- operationId:`LxAmazonShop_importAmazonShopExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLxAmazonShopImportRespVO` | + +### 8. 获得LX 亚马逊店铺信息分页 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/lx/amazon-shop/page` +- operationId:`LxAmazonShop_getAmazonShopPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| sid | query | 否 | integer | 店铺ID(领星唯一标识) | 23553 | +| mid | query | 否 | integer | 站点ID | 16304 | +| sellerAccountId | query | 否 | integer | 店铺账号ID | 18795 | +| hasAdsSetting | query | 否 | integer | 是否授权广告:0否, 1是 | | +| status | query | 否 | integer | 店铺状态:0停用, 1正常, 2授权异常, 3欠费 | 1 | +| erpSyncStatus | query | 否 | integer | 同步状态:0未同步, 1已同步, 2异常 | 2 | +| name | query | 否 | string | 店铺名 | 王五 | +| sellerId | query | 否 | string | 亚马逊店铺ID(Seller ID) | 5978 | +| accountName | query | 否 | string | 店铺账户名称 | 王五 | +| region | query | 否 | string | 站点简称 | | +| country | query | 否 | string | 国家名称 | | +| marketplaceId | query | 否 | string | 亚马逊市场ID | 21231 | +| createTime | query | 否 | array[string] | 创建时间 | | +| userId | query | 否 | integer | 权限用户ID | 5873 | +| deptId | query | 否 | integer | 权限部门ID | 13529 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultLxAmazonShopRespVO` | + +### 9. 更新LX 亚马逊店铺信息 + +- 分组:管理后台 - LX 亚马逊店铺信息 +- 请求方式:`PUT` +- 接口路径:`/admin-api/lx/amazon-shop/update` +- operationId:`LxAmazonShop_updateAmazonShop` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`LxAmazonShopSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 25866 | +| sid | 店铺ID(领星唯一标识) | 是 | integer | 23553 | +| mid | 站点ID | 否 | integer | 16304 | +| sellerAccountId | 店铺账号ID | 否 | integer | 18795 | +| hasAdsSetting | 是否授权广告:0否, 1是 | 否 | integer | | +| status | 店铺状态:0停用, 1正常, 2授权异常, 3欠费 | 否 | integer | 1 | +| erpSyncStatus | 同步状态:0未同步, 1已同步, 2异常 | 否 | integer | 2 | +| name | 店铺名 | 否 | string | 王五 | +| sellerId | 亚马逊店铺ID(Seller ID) | 否 | string | 5978 | +| accountName | 店铺账户名称 | 否 | string | 王五 | +| region | 站点简称 | 否 | string | | +| country | 国家名称 | 否 | string | | +| marketplaceId | 亚马逊市场ID | 否 | string | 21231 | +| userId | 权限用户ID | 是 | integer | 5873 | +| deptId | 权限部门ID | 是 | integer | 13529 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - OAuth2 客户端 + +### 1. 创建 OAuth2 客户端 + +- 分组:管理后台 - OAuth2 客户端 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/oauth2-client/create` +- operationId:`OAuth2Client_createOAuth2Client` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OAuth2ClientSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 否 | integer | 1024 | +| clientId | 客户端编号 | 是 | string | tudou | +| secret | 客户端密钥 | 是 | string | fan | +| name | 应用名 | 是 | string | 土豆 | +| logo | 应用图标 | 是 | string | https://www.iocoder.cn/xx.png | +| description | 应用描述 | 否 | string | 我是一个应用 | +| status | 状态,参见 CommonStatusEnum 枚举 | 是 | integer | 1 | +| accessTokenValiditySeconds | 访问令牌的有效期 | 是 | integer | 8640 | +| refreshTokenValiditySeconds | 刷新令牌的有效期 | 是 | integer | 8640000 | +| redirectUris | 可重定向的 URI 地址 | 是 | array[string] | https://www.iocoder.cn | +| authorizedGrantTypes | 授权类型,参见 OAuth2GrantTypeEnum 枚举 | 是 | array[string] | password | +| scopes | 授权范围 | 否 | array[string] | user_info | +| autoApproveScopes | 自动通过的授权范围 | 否 | array[string] | user_info | +| authorities | 权限 | 否 | array[string] | system:user:query | +| resourceIds | 资源 | 否 | array[string] | 1024 | +| additionalInformation | 附加信息 | 否 | string | {yunai: true} | +| additionalInformationJson | | 否 | boolean | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除 OAuth2 客户端 + +- 分组:管理后台 - OAuth2 客户端 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/oauth2-client/delete` +- operationId:`OAuth2Client_deleteOAuth2Client` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除 OAuth2 客户端 + +- 分组:管理后台 - OAuth2 客户端 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/oauth2-client/delete-list` +- operationId:`OAuth2Client_deleteOAuth2ClientList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 获得 OAuth2 客户端 + +- 分组:管理后台 - OAuth2 客户端 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/oauth2-client/get` +- operationId:`OAuth2Client_getOAuth2Client` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOAuth2ClientRespVO` | + +### 5. 获得 OAuth2 客户端分页 + +- 分组:管理后台 - OAuth2 客户端 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/oauth2-client/page` +- operationId:`OAuth2Client_getOAuth2ClientPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 应用名,模糊匹配 | 土豆 | +| status | query | 否 | integer | 状态,参见 CommonStatusEnum 枚举 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultOAuth2ClientRespVO` | + +### 6. 更新 OAuth2 客户端 + +- 分组:管理后台 - OAuth2 客户端 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/oauth2-client/update` +- operationId:`OAuth2Client_updateOAuth2Client` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OAuth2ClientSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 否 | integer | 1024 | +| clientId | 客户端编号 | 是 | string | tudou | +| secret | 客户端密钥 | 是 | string | fan | +| name | 应用名 | 是 | string | 土豆 | +| logo | 应用图标 | 是 | string | https://www.iocoder.cn/xx.png | +| description | 应用描述 | 否 | string | 我是一个应用 | +| status | 状态,参见 CommonStatusEnum 枚举 | 是 | integer | 1 | +| accessTokenValiditySeconds | 访问令牌的有效期 | 是 | integer | 8640 | +| refreshTokenValiditySeconds | 刷新令牌的有效期 | 是 | integer | 8640000 | +| redirectUris | 可重定向的 URI 地址 | 是 | array[string] | https://www.iocoder.cn | +| authorizedGrantTypes | 授权类型,参见 OAuth2GrantTypeEnum 枚举 | 是 | array[string] | password | +| scopes | 授权范围 | 否 | array[string] | user_info | +| autoApproveScopes | 自动通过的授权范围 | 否 | array[string] | user_info | +| authorities | 权限 | 否 | array[string] | system:user:query | +| resourceIds | 资源 | 否 | array[string] | 1024 | +| additionalInformation | 附加信息 | 否 | string | {yunai: true} | +| additionalInformationJson | | 否 | boolean | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - OAuth2.0 令牌 + +### 1. 删除访问令牌 + +- 分组:管理后台 - OAuth2.0 令牌 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/oauth2-token/delete` +- operationId:`OAuth2Token_deleteAccessToken` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| accessToken | query | 是 | string | 访问令牌 | tudou | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. 批量删除访问令牌 + +- 分组:管理后台 - OAuth2.0 令牌 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/oauth2-token/delete-list` +- operationId:`OAuth2Token_deleteAccessTokenList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| accessTokens | query | 是 | array[string] | 访问令牌数组 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 获得访问令牌分页 + +- 分组:管理后台 - OAuth2.0 令牌 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/oauth2-token/page` +- operationId:`OAuth2Token_getAccessTokenPage` +- 描述:只返回有效期内的 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| userId | query | 是 | integer | 用户编号 | 666 | +| userType | query | 是 | integer | 用户类型,参见 UserTypeEnum 枚举 | 2 | +| clientId | query | 是 | string | 客户端编号 | 2 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultOAuth2AccessTokenRespVO` | + +## 管理后台 - OAuth2.0 授权 + +### 1. 获得授权信息 + +- 分组:管理后台 - OAuth2.0 授权 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/oauth2/authorize` +- operationId:`OAuth2Open_authorize` +- 描述:适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| clientId | query | 是 | string | 客户端编号 | tudou | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOAuth2OpenAuthorizeInfoRespVO` | + +### 2. 申请授权 + +- 分组:管理后台 - OAuth2.0 授权 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/oauth2/authorize` +- operationId:`OAuth2Open_approveOrDeny` +- 描述:适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【提交】调用 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| response_type | query | 是 | string | 响应类型 | code | +| client_id | query | 是 | string | 客户端编号 | tudou | +| scope | query | 否 | string | 授权范围 | userinfo.read | +| redirect_uri | query | 是 | string | 重定向 URI | https://www.iocoder.cn | +| auto_approve | query | 是 | boolean | 用户是否接受 | True | +| state | query | 否 | string | | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultString` | + +### 3. 校验访问令牌 + +- 分组:管理后台 - OAuth2.0 授权 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/oauth2/check-token` +- operationId:`OAuth2Open_checkToken` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| token | query | 是 | string | 访问令牌 | biu | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOAuth2OpenCheckTokenRespVO` | + +### 4. 删除访问令牌 + +- 分组:管理后台 - OAuth2.0 授权 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/oauth2/token` +- operationId:`OAuth2Open_revokeToken` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| token | query | 是 | string | 访问令牌 | biu | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 获得访问令牌 + +- 分组:管理后台 - OAuth2.0 授权 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/oauth2/token` +- operationId:`OAuth2Open_postAccessToken` +- 描述:适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| grant_type | query | 是 | string | 授权类型 | code | +| code | query | 否 | string | 授权范围 | userinfo.read | +| redirect_uri | query | 否 | string | 重定向 URI | https://www.iocoder.cn | +| state | query | 否 | string | 状态 | 1 | +| username | query | 否 | string | | tudou | +| password | query | 否 | string | | cai | +| scope | query | 否 | string | | user_info | +| refresh_token | query | 否 | string | | 123424233 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOAuth2OpenAccessTokenRespVO` | + +## 管理后台 - OAuth2.0 用户 + +### 1. 获得用户基本信息 + +- 分组:管理后台 - OAuth2.0 用户 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/oauth2/user/get` +- operationId:`OAuth2User_getUserInfo` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOAuth2UserInfoRespVO` | + +### 2. 更新用户基本信息 + +- 分组:管理后台 - OAuth2.0 用户 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/oauth2/user/update` +- operationId:`OAuth2User_updateUserInfo` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`OAuth2UserUpdateReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| nickname | 用户昵称 | 是 | string | 芋艿 | +| email | 用户邮箱 | 否 | string | yudao@iocoder.cn | +| mobile | 手机号码 | 否 | string | 15601691300 | +| sex | 用户性别,参见 SexEnum 枚举类 | 否 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - PayPal Webhook 幂等表(防重复处理) + +### 1. 创建PayPal Webhook 幂等表(防重复处理) + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/webhook-idempotent/create` +- operationId:`WebhookIdempotent_createWebhookIdempotent` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`WebhookIdempotentSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | ID | 是 | integer | 13577 | +| webhookEventId | PayPal Webhook 事件ID(WH-xxx) | 是 | string | 28160 | +| eventVersion | 事件版本 | 是 | string | | +| createTime | PayPal 事件创建时间(UTC) | 是 | string | | +| resourceType | 资源类型(如capture) | 是 | string | 1 | +| resourceVersion | 资源版本 | 是 | string | | +| eventType | 事件类型(如PAYMENT.CAPTURE.COMPLETED) | 是 | string | 2 | +| summary | 事件摘要描述 | 是 | string | | +| resource | 核心交易数据(JSON格式) | 否 | | | +| links | Webhook 相关链接(JSON格式) | 否 | | | +| resourceId | PayPal 扣款ID/资源ID | 否 | string | 30853 | +| invoiceId | 商户订单号(对应jh_order.order_no) | 否 | string | 28059 | +| status | 处理状态:1-已接收 2-处理成功 3-处理失败 | 是 | integer | 2 | +| createAt | 记录创建时间 | 是 | string | | +| updateAt | 记录更新时间 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除PayPal Webhook 幂等表(防重复处理) + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`DELETE` +- 接口路径:`/admin-api/paypal/webhook-idempotent/delete` +- operationId:`WebhookIdempotent_deleteWebhookIdempotent` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除PayPal Webhook 幂等表(防重复处理) + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`DELETE` +- 接口路径:`/admin-api/paypal/webhook-idempotent/delete-list` +- operationId:`WebhookIdempotent_deleteWebhookIdempotentList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出PayPal Webhook 幂等表(防重复处理) Excel + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/webhook-idempotent/export-excel` +- operationId:`WebhookIdempotent_exportWebhookIdempotentExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| webhookEventId | query | 否 | string | PayPal Webhook 事件ID(WH-xxx) | 28160 | +| eventVersion | query | 否 | string | 事件版本 | | +| createTime | query | 否 | array[string] | PayPal 事件创建时间(UTC) | | +| resourceType | query | 否 | string | 资源类型(如capture) | 1 | +| resourceVersion | query | 否 | string | 资源版本 | | +| eventType | query | 否 | string | 事件类型(如PAYMENT.CAPTURE.COMPLETED) | 2 | +| summary | query | 否 | string | 事件摘要描述 | | +| resource | query | 否 | object | 核心交易数据(JSON格式) | | +| links | query | 否 | object | Webhook 相关链接(JSON格式) | | +| resourceId | query | 否 | string | PayPal 扣款ID/资源ID | 30853 | +| invoiceId | query | 否 | string | 商户订单号(对应jh_order.order_no) | 28059 | +| status | query | 否 | integer | 处理状态:1-已接收 2-处理成功 3-处理失败 | 2 | +| createAt | query | 否 | string | 记录创建时间 | | +| updateAt | query | 否 | string | 记录更新时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得PayPal Webhook 幂等表(防重复处理) + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/webhook-idempotent/get` +- operationId:`WebhookIdempotent_getWebhookIdempotent` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebhookIdempotentRespVO` | + +### 6. 获得导入PayPal Webhook 幂等表(防重复处理)模板 + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/webhook-idempotent/get-import-template` +- operationId:`WebhookIdempotent_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入PayPal Webhook 幂等表(防重复处理)Excel + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`POST` +- 接口路径:`/admin-api/paypal/webhook-idempotent/import-excel` +- operationId:`WebhookIdempotent_importWebhookIdempotentExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultWebhookIdempotentImportRespVO` | + +### 8. 获得PayPal Webhook 幂等表(防重复处理)分页 + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`GET` +- 接口路径:`/admin-api/paypal/webhook-idempotent/page` +- operationId:`WebhookIdempotent_getWebhookIdempotentPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| webhookEventId | query | 否 | string | PayPal Webhook 事件ID(WH-xxx) | 28160 | +| eventVersion | query | 否 | string | 事件版本 | | +| createTime | query | 否 | array[string] | PayPal 事件创建时间(UTC) | | +| resourceType | query | 否 | string | 资源类型(如capture) | 1 | +| resourceVersion | query | 否 | string | 资源版本 | | +| eventType | query | 否 | string | 事件类型(如PAYMENT.CAPTURE.COMPLETED) | 2 | +| summary | query | 否 | string | 事件摘要描述 | | +| resource | query | 否 | object | 核心交易数据(JSON格式) | | +| links | query | 否 | object | Webhook 相关链接(JSON格式) | | +| resourceId | query | 否 | string | PayPal 扣款ID/资源ID | 30853 | +| invoiceId | query | 否 | string | 商户订单号(对应jh_order.order_no) | 28059 | +| status | query | 否 | integer | 处理状态:1-已接收 2-处理成功 3-处理失败 | 2 | +| createAt | query | 否 | string | 记录创建时间 | | +| updateAt | query | 否 | string | 记录更新时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultWebhookIdempotentRespVO` | + +### 9. 更新PayPal Webhook 幂等表(防重复处理) + +- 分组:管理后台 - PayPal Webhook 幂等表(防重复处理) +- 请求方式:`PUT` +- 接口路径:`/admin-api/paypal/webhook-idempotent/update` +- operationId:`WebhookIdempotent_updateWebhookIdempotent` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`WebhookIdempotentSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | ID | 是 | integer | 13577 | +| webhookEventId | PayPal Webhook 事件ID(WH-xxx) | 是 | string | 28160 | +| eventVersion | 事件版本 | 是 | string | | +| createTime | PayPal 事件创建时间(UTC) | 是 | string | | +| resourceType | 资源类型(如capture) | 是 | string | 1 | +| resourceVersion | 资源版本 | 是 | string | | +| eventType | 事件类型(如PAYMENT.CAPTURE.COMPLETED) | 是 | string | 2 | +| summary | 事件摘要描述 | 是 | string | | +| resource | 核心交易数据(JSON格式) | 否 | | | +| links | Webhook 相关链接(JSON格式) | 否 | | | +| resourceId | PayPal 扣款ID/资源ID | 否 | string | 30853 | +| invoiceId | 商户订单号(对应jh_order.order_no) | 否 | string | 28059 | +| status | 处理状态:1-已接收 2-处理成功 3-处理失败 | 是 | integer | 2 | +| createAt | 记录创建时间 | 是 | string | | +| updateAt | 记录更新时间 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - Redis 监控 + +### 1. 获得 Redis 监控信息 + +- 分组:管理后台 - Redis 监控 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/redis/get-monitor-info` +- operationId:`Redis_getRedisMonitorInfo` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultRedisMonitorRespVO` | + +## 管理后台 - app版本号管理 + +### 1. 创建app版本号管理 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/appversion/create` +- operationId:`Appversion_createAppversion` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AppversionSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 9413 | +| storeName | 应用商店 | 是 | string | 王五 | +| version | 版本号 | 是 | string | | +| downloadUrl | 商城下载地址 | 是 | string | https://www.iocoder.cn | +| isOn | 是否上架(1是,2否) | 是 | integer | | +| status | 状态 (1正常 2停用) | 否 | integer | 2 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除app版本号管理 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/appversion/delete` +- operationId:`Appversion_deleteAppversion` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除app版本号管理 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/appversion/delete-list` +- operationId:`Appversion_deleteAppversionList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出app版本号管理 Excel + +- 分组:管理后台 - app版本号管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/appversion/export-excel` +- operationId:`Appversion_exportAppversionExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| storeName | query | 否 | string | 应用商店 | 王五 | +| version | query | 否 | string | 版本号 | | +| downloadUrl | query | 否 | string | 商城下载地址 | https://www.iocoder.cn | +| isOn | query | 否 | integer | 是否上架(1是,2否) | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 2 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 26004 | +| userId | query | 否 | integer | 权限用户ID | 14739 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得app版本号管理 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/appversion/get` +- operationId:`Appversion_getAppversion` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAppversionRespVO` | + +### 6. 获得导入app版本号管理模板 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/appversion/get-import-template` +- operationId:`Appversion_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入app版本号管理Excel + +- 分组:管理后台 - app版本号管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/appversion/import-excel` +- operationId:`Appversion_importAppversionExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAppversionImportRespVO` | + +### 8. 获得app版本号管理分页 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/appversion/page` +- operationId:`Appversion_getAppversionPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| storeName | query | 否 | string | 应用商店 | 王五 | +| version | query | 否 | string | 版本号 | | +| downloadUrl | query | 否 | string | 商城下载地址 | https://www.iocoder.cn | +| isOn | query | 否 | integer | 是否上架(1是,2否) | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 2 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 26004 | +| userId | query | 否 | integer | 权限用户ID | 14739 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAppversionRespVO` | + +### 9. 更新app版本号管理 + +- 分组:管理后台 - app版本号管理 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/appversion/update` +- operationId:`Appversion_updateAppversion` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AppversionSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 9413 | +| storeName | 应用商店 | 是 | string | 王五 | +| version | 版本号 | 是 | string | | +| downloadUrl | 商城下载地址 | 是 | string | https://www.iocoder.cn | +| isOn | 是否上架(1是,2否) | 是 | integer | | +| status | 状态 (1正常 2停用) | 否 | integer | 2 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - blog分类 + +### 1. 创建blog分类 + +- 分组:管理后台 - blog分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/blog-cate/create` +- operationId:`BlogCate_createBlogCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`BlogCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 25736 | +| name | 分类名称 | 是 | string | 李四 | +| coverImage | 缩略图 | 否 | ProductImageDO | | +| status | 状态 | 否 | integer | 1 | +| rankNum | 排序 | 否 | integer | | +| route | 路由 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除blog分类 + +- 分组:管理后台 - blog分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/blog-cate/delete` +- operationId:`BlogCate_deleteBlogCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除blog分类 + +- 分组:管理后台 - blog分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/blog-cate/delete-list` +- operationId:`BlogCate_deleteBlogCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出blog分类 Excel + +- 分组:管理后台 - blog分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog-cate/export-excel` +- operationId:`BlogCate_exportBlogCateExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 分类名称 | 李四 | +| status | query | 否 | integer | 状态 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得blog分类 + +- 分组:管理后台 - blog分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog-cate/get` +- operationId:`BlogCate_getBlogCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBlogCateRespVO` | + +### 6. 获得导入blog分类模板 + +- 分组:管理后台 - blog分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog-cate/get-import-template` +- operationId:`BlogCate_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入blog分类Excel + +- 分组:管理后台 - blog分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/blog-cate/import-excel` +- operationId:`BlogCate_importBlogCateExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBlogCateImportRespVO` | + +### 8. 获得blog分类分页 + +- 分组:管理后台 - blog分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog-cate/page` +- operationId:`BlogCate_getBlogCatePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 分类名称 | 李四 | +| status | query | 否 | integer | 状态 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultBlogCateRespVO` | + +### 9. 更新blog分类 + +- 分组:管理后台 - blog分类 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/blog-cate/update` +- operationId:`BlogCate_updateBlogCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`BlogCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 25736 | +| name | 分类名称 | 是 | string | 李四 | +| coverImage | 缩略图 | 否 | ProductImageDO | | +| status | 状态 | 否 | integer | 1 | +| rankNum | 排序 | 否 | integer | | +| route | 路由 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - blog管理 + +### 1. 获得blog分类列表 + +- 分组:管理后台 - blog管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog/blog-cate-relation/list-by-blog-id` +- operationId:`Blog_getBlogCateRelationListByBlogId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| blogId | query | 是 | integer | 博客ID | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListBlogCateRelationDO` | + +### 2. 创建blog管理 + +- 分组:管理后台 - blog管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/blog/create` +- operationId:`Blog_createBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`BlogSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 25673 | +| code | 编号 | 否 | string | | +| title | 标题 | 是 | string | | +| coverImage | 缩略图 | 是 | ProductImageDO | | +| status | 状态 | 否 | integer | 1 | +| content | 页面内容 | 是 | string | | +| rankNum | 排序 | 否 | integer | | +| seoTitle | SEO标题 | 否 | string | | +| seoKeyword | SEO关键词 | 否 | string | | +| seoDescription | SEO描述 | 否 | string | 你猜 | +| likesNum | 点赞数 | 否 | integer | 0 | +| cateIds | blog分类 ID 列表 | 否 | array[integer] | | +| route | 路由 | 否 | string | | +| publishTime | 发布时间 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 3. 删除blog管理 + +- 分组:管理后台 - blog管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/blog/delete` +- operationId:`Blog_deleteBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 批量删除blog管理 + +- 分组:管理后台 - blog管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/blog/delete-list` +- operationId:`Blog_deleteBlogList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 导出blog管理 Excel + +- 分组:管理后台 - blog管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog/export-excel` +- operationId:`Blog_exportBlogExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateId | query | 否 | integer | 分类id | | +| code | query | 否 | string | 编号 | | +| title | query | 否 | string | 标题 | | +| status | query | 否 | integer | 状态 | 1 | +| id | query | 否 | integer | 编号 | 1 | +| creator | query | 否 | integer | 创建者ID | | +| newTime | query | 否 | string | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 6. 获得blog管理 + +- 分组:管理后台 - blog管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog/get` +- operationId:`Blog_getBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBlogRespVO` | + +### 7. 获得导入blog管理模板 + +- 分组:管理后台 - blog管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog/get-import-template` +- operationId:`Blog_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 8. 导入blog管理Excel + +- 分组:管理后台 - blog管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/blog/import-excel` +- operationId:`Blog_importBlogExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBlogImportRespVO` | + +### 9. 获得blog管理分页 + +- 分组:管理后台 - blog管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/blog/page` +- operationId:`Blog_getBlogPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateId | query | 否 | integer | 分类id | | +| code | query | 否 | string | 编号 | | +| title | query | 否 | string | 标题 | | +| status | query | 否 | integer | 状态 | 1 | +| id | query | 否 | integer | 编号 | 1 | +| creator | query | 否 | integer | 创建者ID | | +| newTime | query | 否 | string | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultBlogRespVO` | + +### 10. 更新blog管理 + +- 分组:管理后台 - blog管理 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/blog/update` +- operationId:`Blog_updateBlog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`BlogSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 25673 | +| code | 编号 | 否 | string | | +| title | 标题 | 是 | string | | +| coverImage | 缩略图 | 是 | ProductImageDO | | +| status | 状态 | 否 | integer | 1 | +| content | 页面内容 | 是 | string | | +| rankNum | 排序 | 否 | integer | | +| seoTitle | SEO标题 | 否 | string | | +| seoKeyword | SEO关键词 | 否 | string | | +| seoDescription | SEO描述 | 否 | string | 你猜 | +| likesNum | 点赞数 | 否 | integer | 0 | +| cateIds | blog分类 ID 列表 | 否 | array[integer] | | +| route | 路由 | 否 | string | | +| publishTime | 发布时间 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - news分类 + +### 1. 创建news分类 + +- 分组:管理后台 - news分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/news-cate/create` +- operationId:`NewsCate_createNewsCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`NewsCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 2718 | +| name | 分类名称 | 是 | string | 李四 | +| coverImage | 缩略图 | 否 | ProductImageDO | | +| status | 状态 | 否 | integer | 1 | +| rankNum | 排序 | 否 | integer | | +| route | 路由 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除news分类 + +- 分组:管理后台 - news分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/news-cate/delete` +- operationId:`NewsCate_deleteNewsCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除news分类 + +- 分组:管理后台 - news分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/news-cate/delete-list` +- operationId:`NewsCate_deleteNewsCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出news分类 Excel + +- 分组:管理后台 - news分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news-cate/export-excel` +- operationId:`NewsCate_exportNewsCateExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 分类名称 | 李四 | +| status | query | 否 | integer | 状态 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得news分类 + +- 分组:管理后台 - news分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news-cate/get` +- operationId:`NewsCate_getNewsCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNewsCateRespVO` | + +### 6. 获得导入news分类模板 + +- 分组:管理后台 - news分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news-cate/get-import-template` +- operationId:`NewsCate_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入news分类Excel + +- 分组:管理后台 - news分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/news-cate/import-excel` +- operationId:`NewsCate_importNewsCateExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNewsCateImportRespVO` | + +### 8. 获得news分类分页 + +- 分组:管理后台 - news分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news-cate/page` +- operationId:`NewsCate_getNewsCatePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 分类名称 | 李四 | +| status | query | 否 | integer | 状态 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultNewsCateRespVO` | + +### 9. 更新news分类 + +- 分组:管理后台 - news分类 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/news-cate/update` +- operationId:`NewsCate_updateNewsCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`NewsCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 2718 | +| name | 分类名称 | 是 | string | 李四 | +| coverImage | 缩略图 | 否 | ProductImageDO | | +| status | 状态 | 否 | integer | 1 | +| rankNum | 排序 | 否 | integer | | +| route | 路由 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - news管理 + +### 1. 创建news管理 + +- 分组:管理后台 - news管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/news/create` +- operationId:`News_createNews` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`NewsSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 2771 | +| code | 编号 | 否 | string | | +| title | 标题 | 是 | string | | +| coverImage | 缩略图 | 是 | ProductImageDO | | +| status | 状态 | 否 | integer | 2 | +| content | PC页面内容 | 是 | string | | +| rankNum | 排序 | 否 | integer | | +| seoTitle | SEO标题 | 否 | string | | +| seoKeyword | SEO关键词 | 否 | string | | +| seoDescription | SEO描述 | 否 | string | 你猜 | +| likesNum | 点赞数 | 否 | integer | 0 | +| cateIds | news分类 ID 列表 | 否 | array[integer] | | +| route | 路由 | 否 | string | | +| publishTime | 发布时间 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除news管理 + +- 分组:管理后台 - news管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/news/delete` +- operationId:`News_deleteNews` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除news管理 + +- 分组:管理后台 - news管理 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/news/delete-list` +- operationId:`News_deleteNewsList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出news管理 Excel + +- 分组:管理后台 - news管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news/export-excel` +- operationId:`News_exportNewsExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateId | query | 否 | integer | 分类id | | +| code | query | 否 | string | 编号 | | +| title | query | 否 | string | 标题 | | +| status | query | 否 | integer | 状态 | 2 | +| id | query | 否 | integer | 编号 | 1 | +| creator | query | 否 | integer | 创建者ID | | +| newTime | query | 否 | string | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得news管理 + +- 分组:管理后台 - news管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news/get` +- operationId:`News_getNews` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNewsRespVO` | + +### 6. 获得导入news管理模板 + +- 分组:管理后台 - news管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news/get-import-template` +- operationId:`News_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入news管理Excel + +- 分组:管理后台 - news管理 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/news/import-excel` +- operationId:`News_importNewsExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNewsImportRespVO` | + +### 8. 获得news分类关联列表 + +- 分组:管理后台 - news管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news/news-cate-relation/list-by-news-id` +- operationId:`News_getNewsCateRelationListByNewsId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| newsId | query | 是 | integer | 新闻ID | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListNewsCateRelationDO` | + +### 9. 获得news管理分页 + +- 分组:管理后台 - news管理 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/news/page` +- operationId:`News_getNewsPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateId | query | 否 | integer | 分类id | | +| code | query | 否 | string | 编号 | | +| title | query | 否 | string | 标题 | | +| status | query | 否 | integer | 状态 | 2 | +| id | query | 否 | integer | 编号 | 1 | +| creator | query | 否 | integer | 创建者ID | | +| newTime | query | 否 | string | | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultNewsRespVO` | + +### 10. 更新news管理 + +- 分组:管理后台 - news管理 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/news/update` +- operationId:`News_updateNews` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`NewsSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 2771 | +| code | 编号 | 否 | string | | +| title | 标题 | 是 | string | | +| coverImage | 缩略图 | 是 | ProductImageDO | | +| status | 状态 | 否 | integer | 2 | +| content | PC页面内容 | 是 | string | | +| rankNum | 排序 | 否 | integer | | +| seoTitle | SEO标题 | 否 | string | | +| seoKeyword | SEO关键词 | 否 | string | | +| seoDescription | SEO描述 | 否 | string | 你猜 | +| likesNum | 点赞数 | 否 | integer | 0 | +| cateIds | news分类 ID 列表 | 否 | array[integer] | | +| route | 路由 | 否 | string | | +| publishTime | 发布时间 | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 二维码 + +### 1. 创建二维码 + +- 分组:管理后台 - 二维码 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/download-qrcode/create` +- operationId:`DownloadQrcode_createDownloadQrcode` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DownloadQrcodeSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 28763 | +| title | 标题 | 是 | string | | +| status | 状态 | 是 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除二维码 + +- 分组:管理后台 - 二维码 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/download-qrcode/delete` +- operationId:`DownloadQrcode_deleteDownloadQrcode` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除二维码 + +- 分组:管理后台 - 二维码 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/download-qrcode/delete-list` +- operationId:`DownloadQrcode_deleteDownloadQrcodeList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出二维码 Excel + +- 分组:管理后台 - 二维码 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/download-qrcode/export-excel` +- operationId:`DownloadQrcode_exportDownloadQrcodeExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| title | query | 否 | string | 标题 | | +| creator | query | 否 | string | 创建者 | | +| updater | query | 否 | string | 更新者 | | +| visitCountOper1 | query | 否 | string | 访问次数操作符1 | | +| visitCountOper2 | query | 否 | string | 访问次数操作符2 | | +| visitCount1 | query | 否 | integer | 访问次数起始值 | | +| visitCount2 | query | 否 | integer | 访问次数到达值 | | +| clickCountOper1 | query | 否 | string | 总点击次数操作符1 | | +| clickCountOper2 | query | 否 | string | 总点击次数操作符2 | | +| clickCount1 | query | 否 | integer | 总点击次数起始值 | | +| clickCount2 | query | 否 | integer | 总点击次数到达值 | | +| iosClickCountOper1 | query | 否 | string | IOS点击次数操作符1 | | +| iosClickCountOper2 | query | 否 | string | IOS点击次数操作符2 | | +| iosClickCount1 | query | 否 | integer | IOS点击次数起始值 | | +| iosClickCount2 | query | 否 | integer | IOS点击次数到达值 | | +| googleClickCountOper1 | query | 否 | string | 谷歌点击次数操作符1 | | +| googleClickCountOper2 | query | 否 | string | 谷歌点击次数操作符2 | | +| googleClickCount1 | query | 否 | integer | 谷歌点击次数起始值 | | +| googleClickCount2 | query | 否 | integer | 谷歌点击次数到达值 | | +| apkClickCountOper1 | query | 否 | string | APK点击次数操作符1 | | +| apkClickCountOper2 | query | 否 | string | APK点击次数操作符2 | | +| apkClickCount1 | query | 否 | integer | APK点击次数起始值 | | +| apkClickCount2 | query | 否 | integer | APK点击次数到达值 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得二维码 + +- 分组:管理后台 - 二维码 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/download-qrcode/get` +- operationId:`DownloadQrcode_getDownloadQrcode` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDownloadQrcodeRespVO` | + +### 6. 获得导入二维码模板 + +- 分组:管理后台 - 二维码 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/download-qrcode/get-import-template` +- operationId:`DownloadQrcode_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入二维码Excel + +- 分组:管理后台 - 二维码 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/download-qrcode/import-excel` +- operationId:`DownloadQrcode_importDownloadQrcodeExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDownloadQrcodeImportRespVO` | + +### 8. 获得二维码分页(含统计) + +- 分组:管理后台 - 二维码 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/download-qrcode/page` +- operationId:`DownloadQrcode_getDownloadQrcodePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| title | query | 否 | string | 标题 | | +| creator | query | 否 | string | 创建者 | | +| updater | query | 否 | string | 更新者 | | +| visitCountOper1 | query | 否 | string | 访问次数操作符1 | | +| visitCountOper2 | query | 否 | string | 访问次数操作符2 | | +| visitCount1 | query | 否 | integer | 访问次数起始值 | | +| visitCount2 | query | 否 | integer | 访问次数到达值 | | +| clickCountOper1 | query | 否 | string | 总点击次数操作符1 | | +| clickCountOper2 | query | 否 | string | 总点击次数操作符2 | | +| clickCount1 | query | 否 | integer | 总点击次数起始值 | | +| clickCount2 | query | 否 | integer | 总点击次数到达值 | | +| iosClickCountOper1 | query | 否 | string | IOS点击次数操作符1 | | +| iosClickCountOper2 | query | 否 | string | IOS点击次数操作符2 | | +| iosClickCount1 | query | 否 | integer | IOS点击次数起始值 | | +| iosClickCount2 | query | 否 | integer | IOS点击次数到达值 | | +| googleClickCountOper1 | query | 否 | string | 谷歌点击次数操作符1 | | +| googleClickCountOper2 | query | 否 | string | 谷歌点击次数操作符2 | | +| googleClickCount1 | query | 否 | integer | 谷歌点击次数起始值 | | +| googleClickCount2 | query | 否 | integer | 谷歌点击次数到达值 | | +| apkClickCountOper1 | query | 否 | string | APK点击次数操作符1 | | +| apkClickCountOper2 | query | 否 | string | APK点击次数操作符2 | | +| apkClickCount1 | query | 否 | integer | APK点击次数起始值 | | +| apkClickCount2 | query | 否 | integer | APK点击次数到达值 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDownloadQrcodePageRespVO` | + +### 9. 更新二维码 + +- 分组:管理后台 - 二维码 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/download-qrcode/update` +- operationId:`DownloadQrcode_updateDownloadQrcode` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DownloadQrcodeSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 28763 | +| title | 标题 | 是 | string | | +| status | 状态 | 是 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 产品 + +### 1. 批量上下架产品 + +- 分组:管理后台 - 产品 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product/change-status` +- operationId:`Product_updateProductStatus` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductChangeStatusReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| ids | 产品ID | 是 | array[integer] | 17510 | +| status | 状态 | 是 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. 创建产品 + +- 分组:管理后台 - 产品 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/product/create` +- operationId:`Product_createProduct` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 17510 | +| productType | 产品类型(普通产品=1,积分产品=2) | 否 | integer | 2 | +| productName | 产品名称 | 是 | string | 王五 | +| productCateId | 产品分类 | 是 | integer | 17525 | +| shippingTemplateId | 运费模板ID | 是 | integer | 6786 | +| route | 跳转路由 | 是 | string | | +| intro | 产品简介 | 是 | string | 你说的对 | +| rankNum | 序号 | 否 | integer | | +| status | 状态(1上架,2下架) | 是 | integer | 1 | +| seoTitle | SEO标题 | 否 | string | | +| seoKeyword | SEO关键词 | 否 | string | | +| seoDescription | SEO描述 | 否 | string | 你说的对 | +| singleUserExchangeLimit | 单用户兑换次数限制 | 否 | integer | | +| singleProductExchangeLimit | 单次兑换数量限制 | 否 | integer | | +| productAttrs | 产品规格类型关联列表 | 是 | array[ProductAttrReqVO] | | +| productSkus | 产品规格列表 | 是 | array[ProductSkuSaveReqVO] | | +| productDetails | 产品详情列表 | 否 | array[ProductDetailSaveReqVO] | | +| brandId | 品牌id | 是 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 3. 删除产品 + +- 分组:管理后台 - 产品 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product/delete` +- operationId:`Product_deleteProduct` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 批量删除产品 + +- 分组:管理后台 - 产品 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product/delete-list` +- operationId:`Product_deleteProductList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 获得产品 + +- 分组:管理后台 - 产品 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product/get` +- operationId:`Product_getProduct` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultProductRespVO` | + +### 6. 获得产品分页 + +- 分组:管理后台 - 产品 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product/page` +- operationId:`Product_getProductPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| code | query | 否 | string | 产品编码 | | +| productType | query | 否 | integer | 产品类型(普通产品=1,积分产品=2) | 2 | +| productName | query | 否 | string | 产品名称 | 王五 | +| productCateIdList | query | 否 | array[integer] | 产品分类ID列表(查询多个产品分类) | 17525 | +| productCateId | query | 否 | integer | 产品分类ID(查询单个产品分类) | | +| status | query | 否 | integer | 状态 | 1 | +| ids | query | 否 | array[integer] | 产品ID列表 | | +| shippingTemplateIds | query | 否 | array[integer] | 运费模板 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultProductPageRespVO` | + +### 7. 获得产品规格类型关联列表 + +- 分组:管理后台 - 产品 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product/product-attr/list-by-product-id` +- operationId:`Product_getProductAttrListByProductId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productId | query | 是 | integer | 产品ID | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListProductAttrDO` | + +### 8. 获得产品详情列表 + +- 分组:管理后台 - 产品 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product/product-detail/list-by-product-id` +- operationId:`Product_getProductDetailListByProductId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productId | query | 是 | integer | 产品ID | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListProductDetailDO` | + +### 9. 获得产品规格列表 + +- 分组:管理后台 - 产品 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product/product-sku/list-by-product-id` +- operationId:`Product_getProductSkuListByProductId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productId | query | 是 | integer | 产品ID | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListProductSkuDO` | + +### 10. 获得产品及规格列表-优惠券中使用 + +- 分组:管理后台 - 产品 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product/product/sku-list` +- operationId:`Product_getProductSkuList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| code | query | 否 | string | 产品编码 | | +| productName | query | 否 | string | 产品名称 | | +| skuNo | query | 否 | string | 产品SKU | | +| productType | query | 否 | integer | 产品类型(普通产品=1,积分产品=2) | 2 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultProductSkuRespVO` | + +### 11. 更新产品 + +- 分组:管理后台 - 产品 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product/update` +- operationId:`Product_updateProduct` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 17510 | +| productType | 产品类型(普通产品=1,积分产品=2) | 否 | integer | 2 | +| productName | 产品名称 | 是 | string | 王五 | +| productCateId | 产品分类 | 是 | integer | 17525 | +| shippingTemplateId | 运费模板ID | 是 | integer | 6786 | +| route | 跳转路由 | 是 | string | | +| intro | 产品简介 | 是 | string | 你说的对 | +| rankNum | 序号 | 否 | integer | | +| status | 状态(1上架,2下架) | 是 | integer | 1 | +| seoTitle | SEO标题 | 否 | string | | +| seoKeyword | SEO关键词 | 否 | string | | +| seoDescription | SEO描述 | 否 | string | 你说的对 | +| singleUserExchangeLimit | 单用户兑换次数限制 | 否 | integer | | +| singleProductExchangeLimit | 单次兑换数量限制 | 否 | integer | | +| productAttrs | 产品规格类型关联列表 | 是 | array[ProductAttrReqVO] | | +| productSkus | 产品规格列表 | 是 | array[ProductSkuSaveReqVO] | | +| productDetails | 产品详情列表 | 否 | array[ProductDetailSaveReqVO] | | +| brandId | 品牌id | 是 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 产品分类 + +### 1. 修改产品分类启用/停用状态 + +- 分组:管理后台 - 产品分类 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product-cate/change-status` +- operationId:`ProductCate_updateProductCateStatus` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductCateUpdateStatusReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 17391 | +| status | 状态(1启用,2停用) | 是 | integer | 2 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. 创建产品分类 + +- 分组:管理后台 - 产品分类 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/product-cate/create` +- operationId:`ProductCate_createProductCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 17391 | +| cateType | 类型(普通产品=1,积分产品=2) | 否 | integer | 2 | +| cateName | 产品分类名称 | 是 | string | 赵六 | +| status | 状态 | 是 | integer | 2 | +| rankNum | 排序 | 是 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 3. 删除产品分类 + +- 分组:管理后台 - 产品分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product-cate/delete` +- operationId:`ProductCate_deleteProductCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 批量删除产品分类 + +- 分组:管理后台 - 产品分类 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product-cate/delete-list` +- operationId:`ProductCate_deleteProductCateList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 获得产品分类 + +- 分组:管理后台 - 产品分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product-cate/get` +- operationId:`ProductCate_getProductCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultProductCateSingleRespVO` | + +### 6. 获得产品分类分页 + +- 分组:管理后台 - 产品分类 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product-cate/page` +- operationId:`ProductCate_getProductCatePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| cateType | query | 否 | integer | 类型 | 2 | +| cateName | query | 否 | string | 产品分类名称 | 赵六 | +| status | query | 否 | integer | 状态 | 2 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultProductCateRespVO` | + +### 7. 更新产品分类 + +- 分组:管理后台 - 产品分类 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product-cate/update` +- operationId:`ProductCate_updateProductCate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductCateSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 17391 | +| cateType | 类型(普通产品=1,积分产品=2) | 否 | integer | 2 | +| cateName | 产品分类名称 | 是 | string | 赵六 | +| status | 状态 | 是 | integer | 2 | +| rankNum | 排序 | 是 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 产品属性 + +### 1. 启用/停用产品属性状态 + +- 分组:管理后台 - 产品属性 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product-attr-type/change-status` +- operationId:`ProductAttrType_updateProductAttrTypeStatus` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductAttrTypeChangeStatusReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 5850 | +| status | 状态 | 是 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. 创建产品属性 + +- 分组:管理后台 - 产品属性 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/product-attr-type/create` +- operationId:`ProductAttrType_createProductAttrType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductAttrTypeSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 5850 | +| type | 属性类型:1-颜色属性(有色卡),2-普通属性 | 是 | integer | 2 | +| name | 属性名称 | 是 | string | 王五 | +| status | 状态 | 是 | integer | 1 | +| remark | 备注 | 否 | string | 你说的对 | +| rankNum | 排序号 | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 3. 删除产品属性 + +- 分组:管理后台 - 产品属性 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product-attr-type/delete` +- operationId:`ProductAttrType_deleteProductAttrType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 批量删除产品属性 + +- 分组:管理后台 - 产品属性 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product-attr-type/delete-list` +- operationId:`ProductAttrType_deleteProductAttrTypeList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 获得产品属性 + +- 分组:管理后台 - 产品属性 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product-attr-type/get` +- operationId:`ProductAttrType_getProductAttrType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultProductAttrTypeRespVO` | + +### 6. 获得产品属性分页 + +- 分组:管理后台 - 产品属性 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product-attr-type/page` +- operationId:`ProductAttrType_getProductAttrTypePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| type | query | 否 | integer | 属性类型 | 2 | +| name | query | 否 | string | 属性名称 | 王五 | +| status | query | 否 | integer | 状态 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultProductAttrTypeRespVO` | + +### 7. 更新产品属性 + +- 分组:管理后台 - 产品属性 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product-attr-type/update` +- operationId:`ProductAttrType_updateProductAttrType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductAttrTypeSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 5850 | +| type | 属性类型:1-颜色属性(有色卡),2-普通属性 | 是 | integer | 2 | +| name | 属性名称 | 是 | string | 王五 | +| status | 状态 | 是 | integer | 1 | +| remark | 备注 | 否 | string | 你说的对 | +| rankNum | 排序号 | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 产品属性值 + +### 1. 创建产品属性值 + +- 分组:管理后台 - 产品属性值 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/product-attr-data/create` +- operationId:`ProductAttrData_createProductAttrData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductAttrDataSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 26147 | +| productAttrTypeId | 关联产品属性表的主键ID | 是 | integer | 28627 | +| attrValue | 属性值名称 | 是 | string | | +| color | 色卡 | 否 | array[string] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除产品属性值 + +- 分组:管理后台 - 产品属性值 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product-attr-data/delete` +- operationId:`ProductAttrData_deleteProductAttrData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除产品属性值 + +- 分组:管理后台 - 产品属性值 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/product-attr-data/delete-list` +- operationId:`ProductAttrData_deleteProductAttrDataList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 获得产品属性值 + +- 分组:管理后台 - 产品属性值 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product-attr-data/get` +- operationId:`ProductAttrData_getProductAttrData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultProductAttrDataRespVO` | + +### 5. 获得产品属性值分页 + +- 分组:管理后台 - 产品属性值 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/product-attr-data/page` +- operationId:`ProductAttrData_getProductAttrDataPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| productAttrTypeId | query | 否 | integer | 关联产品属性表的主键ID | 28627 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultProductAttrDataRespVO` | + +### 6. 更新产品属性值 + +- 分组:管理后台 - 产品属性值 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/product-attr-data/update` +- operationId:`ProductAttrData_updateProductAttrData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ProductAttrDataSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键ID | 是 | integer | 26147 | +| productAttrTypeId | 关联产品属性表的主键ID | 是 | integer | 28627 | +| attrValue | 属性值名称 | 是 | string | | +| color | 色卡 | 否 | array[string] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 代码生成器 + +### 1. 基于数据库的表结构,创建代码生成器的表和字段定义 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/codegen/create-list` +- operationId:`Codegen_createCodegenList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CodegenCreateListReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| dataSourceConfigId | 数据源配置的编号 | 是 | integer | 1 | +| tableNames | 表名数组 | 是 | array[string] | [1, 2, 3] | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListLong` | + +### 2. 获得数据库自带的表定义列表 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/codegen/db/table/list` +- operationId:`Codegen_getDatabaseTableList` +- 描述:会过滤掉已经导入 Codegen 的表 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| dataSourceConfigId | query | 是 | integer | 数据源配置的编号 | 1 | +| name | query | 否 | string | 表名,模糊匹配 | yudao | +| comment | query | 否 | string | 描述,模糊匹配 | 芋道 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDatabaseTableRespVO` | + +### 3. 删除数据库的表和字段定义 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/codegen/delete` +- operationId:`Codegen_deleteCodegen` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableId | query | 是 | integer | 表编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 批量删除数据库的表和字段定义 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/codegen/delete-list` +- operationId:`Codegen_deleteCodegenList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableIds | query | 是 | array[integer] | 表编号列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 5. 获得表和字段的明细 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/codegen/detail` +- operationId:`Codegen_getCodegenDetail` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableId | query | 是 | integer | 表编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCodegenDetailRespVO` | + +### 6. 下载生成代码 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/codegen/download` +- operationId:`Codegen_downloadCodegen` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableId | query | 是 | integer | 表编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 预览生成代码 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/codegen/preview` +- operationId:`Codegen_previewCodegen` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableId | query | 是 | integer | 表编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListCodegenPreviewRespVO` | + +### 8. 基于数据库的表结构,同步数据库的表和字段定义 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/codegen/sync-from-db` +- operationId:`Codegen_syncCodegenFromDB` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableId | query | 是 | integer | 表编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 9. 获得表定义列表 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/codegen/table/list` +- operationId:`Codegen_getCodegenTableList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| dataSourceConfigId | query | 是 | integer | 数据源配置的编号 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListCodegenTableRespVO` | + +### 10. 获得表定义分页 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/codegen/table/page` +- operationId:`Codegen_getCodegenTablePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tableName | query | 否 | string | 表名称,模糊匹配 | yudao | +| tableComment | query | 否 | string | 表描述,模糊匹配 | 芋道 | +| className | query | 否 | string | 实体,模糊匹配 | Yudao | +| createTime | query | 否 | array[string] | 创建时间 | [2022-07-01 00:00:00,2022-07-01 23:59:59] | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultCodegenTableRespVO` | + +### 11. 更新数据库的表和字段定义 + +- 分组:管理后台 - 代码生成器 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/codegen/update` +- operationId:`Codegen_updateCodegen` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CodegenUpdateReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| table | | 是 | CodegenTableSaveReqVO | | +| columns | | 是 | array[CodegenColumnSaveReqVO] | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 协议 + +### 1. 创建协议 + +- 分组:管理后台 - 协议 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/agreement/create` +- operationId:`Agreement_createAgreement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AgreementSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 11878 | +| terminal | 终端(1web 2app) | 是 | string | | +| type | 类型(1隐私协议 2用户协议) | 是 | integer | 2 | +| title | 标题 | 是 | string | | +| content | 内容 | 是 | string | | +| status | 状态 (1正常 2停用) | 否 | integer | 2 | +| lang | 语言 (en 英语 de 德语 ja 日语) | 是 | string | | +| rankNum | 排序号 | 是 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除协议 + +- 分组:管理后台 - 协议 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/agreement/delete` +- operationId:`Agreement_deleteAgreement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除协议 + +- 分组:管理后台 - 协议 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/agreement/delete-list` +- operationId:`Agreement_deleteAgreementList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出协议 Excel + +- 分组:管理后台 - 协议 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/agreement/export-excel` +- operationId:`Agreement_exportAgreementExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| terminal | query | 否 | string | 终端(1web 2app) | | +| type | query | 否 | integer | 类型(1隐私协议 2用户协议) | 2 | +| title | query | 否 | string | 标题 | | +| content | query | 否 | string | 内容 | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 2 | +| lang | query | 否 | string | 语言 (en 英语 de 德语 ja 日语) | | +| rankNum | query | 否 | integer | 排序号 | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 3044 | +| userId | query | 否 | integer | 权限用户ID | 25518 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得协议 + +- 分组:管理后台 - 协议 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/agreement/get` +- operationId:`Agreement_getAgreement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAgreementRespVO` | + +### 6. 获得导入协议模板 + +- 分组:管理后台 - 协议 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/agreement/get-import-template` +- operationId:`Agreement_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入协议Excel + +- 分组:管理后台 - 协议 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/agreement/import-excel` +- operationId:`Agreement_importAgreementExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAgreementImportRespVO` | + +### 8. 获得协议分页 + +- 分组:管理后台 - 协议 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/agreement/page` +- operationId:`Agreement_getAgreementPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| terminal | query | 否 | string | 终端(1web 2app) | | +| type | query | 否 | integer | 类型(1隐私协议 2用户协议) | 2 | +| title | query | 否 | string | 标题 | | +| content | query | 否 | string | 内容 | | +| status | query | 否 | integer | 状态 (1正常 2停用) | 2 | +| lang | query | 否 | string | 语言 (en 英语 de 德语 ja 日语) | | +| rankNum | query | 否 | integer | 排序号 | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 3044 | +| userId | query | 否 | integer | 权限用户ID | 25518 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAgreementRespVO` | + +### 9. 更新协议 + +- 分组:管理后台 - 协议 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/agreement/update` +- operationId:`Agreement_updateAgreement` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AgreementSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 11878 | +| terminal | 终端(1web 2app) | 是 | string | | +| type | 类型(1隐私协议 2用户协议) | 是 | integer | 2 | +| title | 标题 | 是 | string | | +| content | 内容 | 是 | string | | +| status | 状态 (1正常 2停用) | 否 | integer | 2 | +| lang | 语言 (en 英语 de 德语 ja 日语) | 是 | string | | +| rankNum | 排序号 | 是 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 参数配置 + +### 1. 创建参数配置 + +- 分组:管理后台 - 参数配置 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/config/create` +- operationId:`Config_createConfig` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ConfigSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 参数配置序号 | 否 | integer | 1024 | +| category | 参数分组 | 是 | string | biz | +| name | 参数名称 | 是 | string | 数据库名 | +| key | 参数键名 | 是 | string | yunai.db.username | +| value | 参数键值 | 是 | string | 1024 | +| visible | 是否可见 | 是 | boolean | True | +| remark | 备注 | 否 | string | 备注一下很帅气! | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除参数配置 + +- 分组:管理后台 - 参数配置 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/config/delete` +- operationId:`Config_deleteConfig` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除参数配置 + +- 分组:管理后台 - 参数配置 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/config/delete-list` +- operationId:`Config_deleteConfigList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出参数配置 + +- 分组:管理后台 - 参数配置 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/config/export-excel` +- operationId:`Config_exportConfig` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 数据源名称,模糊匹配 | 名称 | +| key | query | 否 | string | 参数键名,模糊匹配 | yunai.db.username | +| type | query | 否 | integer | 参数类型,参见 SysConfigTypeEnum 枚举 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | [2022-07-01 00:00:00,2022-07-01 23:59:59] | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得参数配置 + +- 分组:管理后台 - 参数配置 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/config/get` +- operationId:`Config_getConfig` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultConfigRespVO` | + +### 6. 根据参数键名查询参数值 + +- 分组:管理后台 - 参数配置 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/config/get-value-by-key` +- operationId:`Config_getConfigKey` +- 描述:不可见的配置,不允许返回给前端 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| key | query | 是 | string | 参数键 | yunai.biz.username | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultString` | + +### 7. 获取参数配置分页 + +- 分组:管理后台 - 参数配置 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/config/page` +- operationId:`Config_getConfigPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 数据源名称,模糊匹配 | 名称 | +| key | query | 否 | string | 参数键名,模糊匹配 | yunai.db.username | +| type | query | 否 | integer | 参数类型,参见 SysConfigTypeEnum 枚举 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | [2022-07-01 00:00:00,2022-07-01 23:59:59] | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultConfigRespVO` | + +### 8. 修改参数配置 + +- 分组:管理后台 - 参数配置 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/config/update` +- operationId:`Config_updateConfig` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ConfigSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 参数配置序号 | 否 | integer | 1024 | +| category | 参数分组 | 是 | string | biz | +| name | 参数名称 | 是 | string | 数据库名 | +| key | 参数键名 | 是 | string | yunai.db.username | +| value | 参数键值 | 是 | string | 1024 | +| visible | 是否可见 | 是 | boolean | True | +| remark | 备注 | 否 | string | 备注一下很帅气! | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 合作联系数据 + +### 1. 创建合作联系数据 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/cooperation/create` +- operationId:`Cooperation_createCooperation` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CooperationSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 22204 | +| name | 姓名 | 是 | string | 芋艿 | +| email | 邮箱 | 是 | string | | +| address | 公司名称或地址 | 是 | string | | +| cooperationType | 合作类型 | 是 | string | 2 | +| cooperationDetail | 合作详情 | 否 | string | | +| lang | 语言 | 是 | string | | +| ip | IP | 是 | string | | +| requestStatus | APP接口同步状态 | 是 | integer | 1 | +| requestResult | 请求结果 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除合作联系数据 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/cooperation/delete` +- operationId:`Cooperation_deleteCooperation` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除合作联系数据 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/cooperation/delete-list` +- operationId:`Cooperation_deleteCooperationList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出合作联系数据 Excel + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/cooperation/export-excel` +- operationId:`Cooperation_exportCooperationExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 姓名 | 芋艿 | +| email | query | 否 | string | 邮箱 | | +| address | query | 否 | string | 公司名称或地址 | | +| cooperationType | query | 否 | string | 合作类型 | 2 | +| createTime | query | 否 | array[string] | 提交时间 | | +| requestStatus | query | 否 | integer | APP接口同步状态 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得合作联系数据 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/cooperation/get` +- operationId:`Cooperation_getCooperation` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCooperationRespVO` | + +### 6. 获得导入合作联系数据模板 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/cooperation/get-import-template` +- operationId:`Cooperation_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入合作联系数据Excel + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/cooperation/import-excel` +- operationId:`Cooperation_importCooperationExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultCooperationImportRespVO` | + +### 8. 获得合作联系数据分页 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/cooperation/page` +- operationId:`Cooperation_getCooperationPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 姓名 | 芋艿 | +| email | query | 否 | string | 邮箱 | | +| address | query | 否 | string | 公司名称或地址 | | +| cooperationType | query | 否 | string | 合作类型 | 2 | +| createTime | query | 否 | array[string] | 提交时间 | | +| requestStatus | query | 否 | integer | APP接口同步状态 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultCooperationRespVO` | + +### 9. 更新合作联系数据 + +- 分组:管理后台 - 合作联系数据 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/cooperation/update` +- operationId:`Cooperation_updateCooperation` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`CooperationSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 22204 | +| name | 姓名 | 是 | string | 芋艿 | +| email | 邮箱 | 是 | string | | +| address | 公司名称或地址 | 是 | string | | +| cooperationType | 合作类型 | 是 | string | 2 | +| cooperationDetail | 合作详情 | 否 | string | | +| lang | 语言 | 是 | string | | +| ip | IP | 是 | string | | +| requestStatus | APP接口同步状态 | 是 | integer | 1 | +| requestResult | 请求结果 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 售后 + +### 1. 导出售后 Excel + +- 分组:管理后台 - 售后 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/order-after-sale/export-excel` +- operationId:`OrderAfterSale_exportOrderAfterSaleExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 否 | array[integer] | 集合ID | | +| afterSaleMessageId | query | 否 | integer | 售后信息ID | 31115 | +| afterSalesOrderNo | query | 否 | string | 售后单号 | | +| oaReferenceNo | query | 否 | string | OA通讯编号 | | +| serviceOrderNo | query | 否 | string | 咨询订单号 | | +| country | query | 否 | string | 国家 | | +| status | query | 否 | integer | 售后状态 | 1 | +| afterSalesSolution | query | 否 | integer | 售后方案 | | +| oaStatus | query | 否 | integer | oa售后状态 | 1 | +| oaAfterSalesId | query | 否 | integer | oa售后Id | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 2. 获得售后 + +- 分组:管理后台 - 售后 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/order-after-sale/get` +- operationId:`OrderAfterSale_getOrderAfterSale` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | | | +| orderId | query | 是 | | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultOrderAfterSaleRespVO` | + +### 3. 获得售后分页 + +- 分组:管理后台 - 售后 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/order-after-sale/page` +- operationId:`OrderAfterSale_getOrderAfterSalePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 否 | array[integer] | 集合ID | | +| afterSaleMessageId | query | 否 | integer | 售后信息ID | 31115 | +| afterSalesOrderNo | query | 否 | string | 售后单号 | | +| oaReferenceNo | query | 否 | string | OA通讯编号 | | +| serviceOrderNo | query | 否 | string | 咨询订单号 | | +| country | query | 否 | string | 国家 | | +| status | query | 否 | integer | 售后状态 | 1 | +| afterSalesSolution | query | 否 | integer | 售后方案 | | +| oaStatus | query | 否 | integer | oa售后状态 | 1 | +| oaAfterSalesId | query | 否 | integer | oa售后Id | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultOrderAfterSaleDO` | + +## 管理后台 - 售后政策 + +### 1. 创建售后政策 + +- 分组:管理后台 - 售后政策 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/after-sales-policy/create` +- operationId:`AfterSalesPolicy_createAfterSalesPolicy` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AfterSalesPolicySaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 14586 | +| brandId | 品牌ID | 是 | integer | 9150 | +| title | 标题 | 是 | string | | +| content | 内容 | 是 | string | | +| status | 状态 | 否 | integer | 2 | +| lang | 语言 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除售后政策 + +- 分组:管理后台 - 售后政策 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/after-sales-policy/delete` +- operationId:`AfterSalesPolicy_deleteAfterSalesPolicy` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除售后政策 + +- 分组:管理后台 - 售后政策 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/after-sales-policy/delete-list` +- operationId:`AfterSalesPolicy_deleteAfterSalesPolicyList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出售后政策 Excel + +- 分组:管理后台 - 售后政策 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-policy/export-excel` +- operationId:`AfterSalesPolicy_exportAfterSalesPolicyExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| brandId | query | 否 | integer | 品牌ID | 9150 | +| title | query | 否 | string | 标题 | | +| content | query | 否 | string | 内容 | | +| status | query | 否 | integer | 状态 | 2 | +| lang | query | 否 | string | 语言 | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 17093 | +| userId | query | 否 | integer | 权限用户ID | 758 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得售后政策 + +- 分组:管理后台 - 售后政策 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-policy/get` +- operationId:`AfterSalesPolicy_getAfterSalesPolicy` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAfterSalesPolicyRespVO` | + +### 6. 获得导入售后政策模板 + +- 分组:管理后台 - 售后政策 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-policy/get-import-template` +- operationId:`AfterSalesPolicy_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入售后政策Excel + +- 分组:管理后台 - 售后政策 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/after-sales-policy/import-excel` +- operationId:`AfterSalesPolicy_importAfterSalesPolicyExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAfterSalesPolicyImportRespVO` | + +### 8. 获得售后政策分页 + +- 分组:管理后台 - 售后政策 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-policy/page` +- operationId:`AfterSalesPolicy_getAfterSalesPolicyPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| brandId | query | 否 | integer | 品牌ID | 9150 | +| title | query | 否 | string | 标题 | | +| content | query | 否 | string | 内容 | | +| status | query | 否 | integer | 状态 | 2 | +| lang | query | 否 | string | 语言 | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 17093 | +| userId | query | 否 | integer | 权限用户ID | 758 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAfterSalesPolicyRespVO` | + +### 9. 更新售后政策 + +- 分组:管理后台 - 售后政策 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/after-sales-policy/update` +- operationId:`AfterSalesPolicy_updateAfterSalesPolicy` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AfterSalesPolicySaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 14586 | +| brandId | 品牌ID | 是 | integer | 9150 | +| title | 标题 | 是 | string | | +| content | 内容 | 是 | string | | +| status | 状态 | 否 | integer | 2 | +| lang | 语言 | 是 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 售后政策-品牌 + +### 1. 创建售后政策-品牌 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/after-sales-brand/create` +- operationId:`AfterSalesBrand_createAfterSalesBrand` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AfterSalesBrandSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 25519 | +| brandName | 品牌名称 | 是 | string | 赵六 | +| status | 状态 | 否 | integer | 2 | +| rankNum | 排序号 | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除售后政策-品牌 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/after-sales-brand/delete` +- operationId:`AfterSalesBrand_deleteAfterSalesBrand` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除售后政策-品牌 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/after-sales-brand/delete-list` +- operationId:`AfterSalesBrand_deleteAfterSalesBrandList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出售后政策-品牌 Excel + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-brand/export-excel` +- operationId:`AfterSalesBrand_exportAfterSalesBrandExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| brandName | query | 否 | string | 品牌名称 | 赵六 | +| status | query | 否 | integer | 状态 | 2 | +| rankNum | query | 否 | integer | 排序号 | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 17576 | +| userId | query | 否 | integer | 权限用户ID | 13390 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得售后政策-品牌 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-brand/get` +- operationId:`AfterSalesBrand_getAfterSalesBrand` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAfterSalesBrandRespVO` | + +### 6. 获得导入售后政策-品牌模板 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-brand/get-import-template` +- operationId:`AfterSalesBrand_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入售后政策-品牌Excel + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/after-sales-brand/import-excel` +- operationId:`AfterSalesBrand_importAfterSalesBrandExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAfterSalesBrandImportRespVO` | + +### 8. 获得可用的品牌列表 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-brand/list-available` +- operationId:`AfterSalesBrand_getAvailableBrandList` +- 描述:获取所有状态为启用(status=1)的品牌列表,用于前端在新增售后政策时选择品牌。 +返回结果按排序号(rankNum)升序、ID降序排列。 +已软删除的品牌不会出现在列表中。 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListAfterSalesBrandRespVO` | + +### 9. 获得售后政策-品牌分页 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/after-sales-brand/page` +- operationId:`AfterSalesBrand_getAfterSalesBrandPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| brandName | query | 否 | string | 品牌名称 | 赵六 | +| status | query | 否 | integer | 状态 | 2 | +| rankNum | query | 否 | integer | 排序号 | | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 17576 | +| userId | query | 否 | integer | 权限用户ID | 13390 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAfterSalesBrandRespVO` | + +### 10. 更新售后政策-品牌 + +- 分组:管理后台 - 售后政策-品牌 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/after-sales-brand/update` +- operationId:`AfterSalesBrand_updateAfterSalesBrand` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AfterSalesBrandSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 25519 | +| brandName | 品牌名称 | 是 | string | 赵六 | +| status | 状态 | 否 | integer | 2 | +| rankNum | 排序号 | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 国家信息 + +### 1. 创建国家信息 + +- 分组:管理后台 - 国家信息 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/address-country/create` +- operationId:`AddressCountry_createAddressCountry` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AddressCountrySaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 4792 | +| lingxingCountryCode | 领星国家代码 | 否 | string | | +| paypalCountryCode | paypal国家代码 | 否 | string | | +| nameEn | 英文名 | 否 | string | | +| nameCn | 中文名 | 否 | string | | +| status | 是否支持(1是 2否) | 是 | integer | 2 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除国家信息 + +- 分组:管理后台 - 国家信息 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/address-country/delete` +- operationId:`AddressCountry_deleteAddressCountry` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除国家信息 + +- 分组:管理后台 - 国家信息 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/address-country/delete-list` +- operationId:`AddressCountry_deleteAddressCountryList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出国家信息 Excel + +- 分组:管理后台 - 国家信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/address-country/export-excel` +- operationId:`AddressCountry_exportAddressCountryExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| lingxingCountryCode | query | 否 | string | 领星国家代码 | | +| paypalCountryCode | query | 否 | string | paypal国家代码 | | +| nameEn | query | 否 | string | 英文名 | | +| nameCn | query | 否 | string | 中文名 | | +| status | query | 否 | integer | 是否支持(1是 2否) | 2 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 11472 | +| userId | query | 否 | integer | 权限用户ID | 25927 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得国家信息 + +- 分组:管理后台 - 国家信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/address-country/get` +- operationId:`AddressCountry_getAddressCountry` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAddressCountryRespVO` | + +### 6. 获得导入国家信息模板 + +- 分组:管理后台 - 国家信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/address-country/get-import-template` +- operationId:`AddressCountry_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入国家信息Excel + +- 分组:管理后台 - 国家信息 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/address-country/import-excel` +- operationId:`AddressCountry_importAddressCountryExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultAddressCountryImportRespVO` | + +### 8. 获得运费规则国家下拉选项(弃用) + +- 分组:管理后台 - 国家信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/address-country/options-for-shipping` +- operationId:`AddressCountry_getOptionsForShipping` +- 描述:获取所有状态为启用(status=1)的国家列表,用于前端在新增运费规则时选择国家。 +且排除在同一运费模板下已配置的国家。同时配置一个国家在一个模板的不同规则下会报错 + + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| shippingTemplateId | query | 是 | integer | | | +| shippingRuleId | query | 否 | integer | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListAddressCountrySimpleRespVO` | + +### 9. 获得国家信息分页 + +- 分组:管理后台 - 国家信息 +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/address-country/page` +- operationId:`AddressCountry_getAddressCountryPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| lingxingCountryCode | query | 否 | string | 领星国家代码 | | +| paypalCountryCode | query | 否 | string | paypal国家代码 | | +| nameEn | query | 否 | string | 英文名 | | +| nameCn | query | 否 | string | 中文名 | | +| status | query | 否 | integer | 是否支持(1是 2否) | 2 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 11472 | +| userId | query | 否 | integer | 权限用户ID | 25927 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultAddressCountryRespVO` | + +### 10. 更新国家信息 + +- 分组:管理后台 - 国家信息 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/address-country/update` +- operationId:`AddressCountry_updateAddressCountry` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`AddressCountrySaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 4792 | +| lingxingCountryCode | 领星国家代码 | 否 | string | | +| paypalCountryCode | paypal国家代码 | 否 | string | | +| nameEn | 英文名 | 否 | string | | +| nameCn | 中文名 | 否 | string | | +| status | 是否支持(1是 2否) | 是 | integer | 2 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 11. 批量更新国家信息状态 + +- 分组:管理后台 - 国家信息 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/address-country/update-status-list` +- operationId:`AddressCountry_updateAddressCountryStatusList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | | | +| status | query | 是 | integer | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 地区 + +### 1. 获得 IP 对应的地区名 + +- 分组:管理后台 - 地区 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/area/get-by-ip` +- operationId:`Area_getAreaByIp` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ip | query | 是 | string | IP | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultString` | + +### 2. 获得地区树 + +- 分组:管理后台 - 地区 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/area/tree` +- operationId:`Area_getAreaTree` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListAreaNodeRespVO` | + +## 管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) + +### 1. 创建基础数据-说明 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/article/create` +- operationId:`Article_createArticle` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ArticleSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 29288 | +| title | 标题 | 是 | string | | +| articleType | 说明类型(数据字典配置) | 是 | string | 2 | +| content | 内容 | 是 | string | | +| status | 状态 | 否 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除基础数据-说明 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/article/delete` +- operationId:`Article_deleteArticle` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除基础数据-说明 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`DELETE` +- 接口路径:`/admin-api/jh/article/delete-list` +- operationId:`Article_deleteArticleList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出基础数据-说明 Excel + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/article/export-excel` +- operationId:`Article_exportArticleExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| title | query | 否 | string | 标题 | | +| articleType | query | 否 | string | 说明类型(数据字典配置) | 2 | +| content | query | 否 | string | 内容 | | +| status | query | 否 | integer | 状态 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 30831 | +| userId | query | 否 | integer | 权限用户ID | 10123 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得基础数据-说明 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/article/get` +- operationId:`Article_getArticle` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultArticleRespVO` | + +### 6. 获得导入基础数据-说明模板 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/article/get-import-template` +- operationId:`Article_getImportTemplate` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 7. 导入基础数据-说明Excel + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/article/import-excel` +- operationId:`Article_importArticleExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| updateSupport | query | 是 | boolean | 是否支持更新 | True | +| userId | query | 否 | integer | 创建人-为空则取当前人 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultArticleImportRespVO` | + +### 8. 获得基础数据-说明分页 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`GET` +- 接口路径:`/admin-api/jh/article/page` +- operationId:`Article_getArticlePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| title | query | 否 | string | 标题 | | +| articleType | query | 否 | string | 说明类型(数据字典配置) | 2 | +| content | query | 否 | string | 内容 | | +| status | query | 否 | integer | 状态 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| deptId | query | 否 | integer | 权限部门ID | 30831 | +| userId | query | 否 | integer | 权限用户ID | 10123 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultArticleRespVO` | + +### 9. 更新基础数据-说明 + +- 分组:管理后台 - 基础数据-说明(售后说明,运费说明,售后问题等) +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/article/update` +- operationId:`Article_updateArticle` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`ArticleSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 主键 | 是 | integer | 29288 | +| title | 标题 | 是 | string | | +| articleType | 说明类型(数据字典配置) | 是 | string | 2 | +| content | 内容 | 是 | string | | +| status | 状态 | 否 | integer | 1 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 字典数据 + +### 1. 新增字典数据 + +- 分组:管理后台 - 字典数据 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/dict-data/create` +- operationId:`DictData_createDictData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DictDataSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 字典数据编号 | 否 | integer | 1024 | +| sort | 显示顺序 | 是 | integer | 1024 | +| label | 字典标签 | 是 | string | 芋道 | +| value | 字典值 | 是 | string | iocoder | +| dictType | 字典类型 | 是 | string | sys_common_sex | +| status | 状态,见 CommonStatusEnum 枚举 | 是 | integer | 1 | +| colorType | 颜色类型,default、primary、success、info、warning、danger | 否 | string | default | +| cssClass | css 样式 | 否 | string | btn-visible | +| remark | 备注 | 否 | string | 我是一个角色 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除字典数据 + +- 分组:管理后台 - 字典数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/dict-data/delete` +- operationId:`DictData_deleteDictData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除字典数据 + +- 分组:管理后台 - 字典数据 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/dict-data/delete-list` +- operationId:`DictData_deleteDictDataList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出字典数据 + +- 分组:管理后台 - 字典数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-data/export-excel` +- operationId:`DictData_export` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| label | query | 否 | string | 字典标签 | 芋道 | +| dictType | query | 否 | string | 字典类型,模糊匹配 | sys_common_sex | +| status | query | 否 | integer | 展示状态,参见 CommonStatusEnum 枚举类 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. /查询字典数据详细 + +- 分组:管理后台 - 字典数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-data/get` +- operationId:`DictData_getDictData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDictDataRespVO` | + +### 6. 获得全部字典数据列表 + +- 分组:管理后台 - 字典数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-data/list-all-simple` +- operationId:`DictData_getSimpleDictDataList` +- 描述:一般用于管理后台缓存字典数据在本地 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDictDataSimpleRespVO` | + +### 7. 获得字典类型的分页 + +- 分组:管理后台 - 字典数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-data/page` +- operationId:`DictData_getDictTypePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| label | query | 否 | string | 字典标签 | 芋道 | +| dictType | query | 否 | string | 字典类型,模糊匹配 | sys_common_sex | +| status | query | 否 | integer | 展示状态,参见 CommonStatusEnum 枚举类 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDictDataRespVO` | + +### 8. 获得全部字典数据列表 + +- 分组:管理后台 - 字典数据 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-data/simple-list` +- operationId:`DictData_getSimpleDictDataList_1` +- 描述:一般用于管理后台缓存字典数据在本地 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDictDataSimpleRespVO` | + +### 9. 修改字典数据 + +- 分组:管理后台 - 字典数据 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/dict-data/update` +- operationId:`DictData_updateDictData` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DictDataSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 字典数据编号 | 否 | integer | 1024 | +| sort | 显示顺序 | 是 | integer | 1024 | +| label | 字典标签 | 是 | string | 芋道 | +| value | 字典值 | 是 | string | iocoder | +| dictType | 字典类型 | 是 | string | sys_common_sex | +| status | 状态,见 CommonStatusEnum 枚举 | 是 | integer | 1 | +| colorType | 颜色类型,default、primary、success、info、warning、danger | 否 | string | default | +| cssClass | css 样式 | 否 | string | btn-visible | +| remark | 备注 | 否 | string | 我是一个角色 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 字典类型 + +### 1. 创建字典类型 + +- 分组:管理后台 - 字典类型 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/dict-type/create` +- operationId:`DictType_createDictType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DictTypeSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 字典类型编号 | 否 | integer | 1024 | +| name | 字典名称 | 是 | string | 性别 | +| type | 字典类型 | 是 | string | sys_common_sex | +| status | 状态,参见 CommonStatusEnum 枚举类 | 是 | integer | 1 | +| remark | 备注 | 否 | string | 快乐的备注 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除字典类型 + +- 分组:管理后台 - 字典类型 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/dict-type/delete` +- operationId:`DictType_deleteDictType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除字典类型 + +- 分组:管理后台 - 字典类型 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/dict-type/delete-list` +- operationId:`DictType_deleteDictTypeList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出数据类型 + +- 分组:管理后台 - 字典类型 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-type/export-excel` +- operationId:`DictType_export` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 字典类型名称,模糊匹配 | 芋道 | +| type | query | 否 | string | 字典类型,模糊匹配 | sys_common_sex | +| status | query | 否 | integer | 展示状态,参见 CommonStatusEnum 枚举类 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. /查询字典类型详细 + +- 分组:管理后台 - 字典类型 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-type/get` +- operationId:`DictType_getDictType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDictTypeRespVO` | + +### 6. 获得全部字典类型列表 + +- 分组:管理后台 - 字典类型 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-type/list-all-simple` +- operationId:`DictType_getSimpleDictTypeList` +- 描述:包括开启 + 禁用的字典类型,主要用于前端的下拉选项 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDictTypeSimpleRespVO` | + +### 7. 获得字典类型的分页列表 + +- 分组:管理后台 - 字典类型 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-type/page` +- operationId:`DictType_pageDictTypes` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 字典类型名称,模糊匹配 | 芋道 | +| type | query | 否 | string | 字典类型,模糊匹配 | sys_common_sex | +| status | query | 否 | integer | 展示状态,参见 CommonStatusEnum 枚举类 | 1 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDictTypeRespVO` | + +### 8. 获得全部字典类型列表 + +- 分组:管理后台 - 字典类型 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/dict-type/simple-list` +- operationId:`DictType_getSimpleDictTypeList_1` +- 描述:包括开启 + 禁用的字典类型,主要用于前端的下拉选项 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDictTypeSimpleRespVO` | + +### 9. 修改字典类型 + +- 分组:管理后台 - 字典类型 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/dict-type/update` +- operationId:`DictType_updateDictType` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DictTypeSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 字典类型编号 | 否 | integer | 1024 | +| name | 字典名称 | 是 | string | 性别 | +| type | 字典类型 | 是 | string | sys_common_sex | +| status | 状态,参见 CommonStatusEnum 枚举类 | 是 | integer | 1 | +| remark | 备注 | 否 | string | 快乐的备注 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 学生 + +### 1. 创建学生 + +- 分组:管理后台 - 学生 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/demo03-student-erp/create` +- operationId:`Demo03StudentErp_createDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03StudentErpSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 是 | integer | 8525 | +| name | 名字 | 是 | string | 芋艿 | +| sex | 性别 | 是 | integer | | +| birthday | 出生日期 | 是 | string | | +| description | 简介 | 是 | string | 随便 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除学生 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-erp/delete` +- operationId:`Demo03StudentErp_deleteDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除学生 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-erp/delete-list` +- operationId:`Demo03StudentErp_deleteDemo03StudentList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 创建学生课程 + +- 分组:管理后台 - 学生 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-course/create` +- operationId:`Demo03StudentErp_createDemo03Course` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03CourseDO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| createTime | | 否 | string | | +| updateTime | | 否 | string | | +| creator | | 否 | string | | +| updater | | 否 | string | | +| deleted | | 否 | boolean | | +| id | | 否 | integer | | +| studentId | | 否 | integer | | +| name | | 否 | string | | +| score | | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 5. 删除学生课程 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-course/delete` +- operationId:`Demo03StudentErp_deleteDemo03Course` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 6. 批量删除学生课程 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-course/delete-list` +- operationId:`Demo03StudentErp_deleteDemo03CourseList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 7. 获得学生课程 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-course/get` +- operationId:`Demo03StudentErp_getDemo03Course` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03CourseDO` | + +### 8. 获得学生课程分页 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-course/page` +- operationId:`Demo03StudentErp_getDemo03CoursePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| studentId | query | 是 | integer | 学生编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDemo03CourseDO` | + +### 9. 更新学生课程 + +- 分组:管理后台 - 学生 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-course/update` +- operationId:`Demo03StudentErp_updateDemo03Course` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03CourseDO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| createTime | | 否 | string | | +| updateTime | | 否 | string | | +| creator | | 否 | string | | +| updater | | 否 | string | | +| deleted | | 否 | boolean | | +| id | | 否 | integer | | +| studentId | | 否 | integer | | +| name | | 否 | string | | +| score | | 否 | integer | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 10. 创建学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-grade/create` +- operationId:`Demo03StudentErp_createDemo03Grade` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03GradeDO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| createTime | | 否 | string | | +| updateTime | | 否 | string | | +| creator | | 否 | string | | +| updater | | 否 | string | | +| deleted | | 否 | boolean | | +| id | | 否 | integer | | +| studentId | | 否 | integer | | +| name | | 否 | string | | +| teacher | | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 11. 删除学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-grade/delete` +- operationId:`Demo03StudentErp_deleteDemo03Grade` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 12. 批量删除学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-grade/delete-list` +- operationId:`Demo03StudentErp_deleteDemo03GradeList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 13. 获得学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-grade/get` +- operationId:`Demo03StudentErp_getDemo03Grade` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03GradeDO` | + +### 14. 获得学生班级分页 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-grade/page` +- operationId:`Demo03StudentErp_getDemo03GradePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| studentId | query | 是 | integer | 学生编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDemo03GradeDO` | + +### 15. 更新学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/demo03-student-erp/demo03-grade/update` +- operationId:`Demo03StudentErp_updateDemo03Grade` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03GradeDO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| createTime | | 否 | string | | +| updateTime | | 否 | string | | +| creator | | 否 | string | | +| updater | | 否 | string | | +| deleted | | 否 | boolean | | +| id | | 否 | integer | | +| studentId | | 否 | integer | | +| name | | 否 | string | | +| teacher | | 否 | string | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 16. 导出学生 Excel + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/export-excel` +- operationId:`Demo03StudentErp_exportDemo03StudentExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 名字 | 芋艿 | +| sex | query | 否 | integer | 性别 | | +| description | query | 否 | string | 简介 | 随便 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 17. 获得学生 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/get` +- operationId:`Demo03StudentErp_getDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03StudentErpRespVO` | + +### 18. 获得学生分页 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-erp/page` +- operationId:`Demo03StudentErp_getDemo03StudentPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 名字 | 芋艿 | +| sex | query | 否 | integer | 性别 | | +| description | query | 否 | string | 简介 | 随便 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDemo03StudentErpRespVO` | + +### 19. 更新学生 + +- 分组:管理后台 - 学生 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/demo03-student-erp/update` +- operationId:`Demo03StudentErp_updateDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03StudentErpSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 是 | integer | 8525 | +| name | 名字 | 是 | string | 芋艿 | +| sex | 性别 | 是 | integer | | +| birthday | 出生日期 | 是 | string | | +| description | 简介 | 是 | string | 随便 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 20. 创建学生 + +- 分组:管理后台 - 学生 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/demo03-student-inner/create` +- operationId:`Demo03StudentInner_createDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03StudentInnerSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 是 | integer | 8525 | +| name | 名字 | 是 | string | 芋艿 | +| sex | 性别 | 是 | integer | | +| birthday | 出生日期 | 是 | string | | +| description | 简介 | 是 | string | 随便 | +| demo03Courses | 学生课程列表 | 否 | array[Demo03CourseDO] | | +| demo03Grade | 学生班级 | 否 | Demo03GradeDO | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 21. 删除学生 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-inner/delete` +- operationId:`Demo03StudentInner_deleteDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 22. 批量删除学生 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-inner/delete-list` +- operationId:`Demo03StudentInner_deleteDemo03StudentList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 23. 获得学生课程列表 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-inner/demo03-course/list-by-student-id` +- operationId:`Demo03StudentInner_getDemo03CourseListByStudentId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| studentId | query | 是 | integer | 学生编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDemo03CourseDO` | + +### 24. 获得学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-inner/demo03-grade/get-by-student-id` +- operationId:`Demo03StudentInner_getDemo03GradeByStudentId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| studentId | query | 是 | integer | 学生编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03GradeDO` | + +### 25. 导出学生 Excel + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-inner/export-excel` +- operationId:`Demo03StudentInner_exportDemo03StudentExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 名字 | 芋艿 | +| sex | query | 否 | integer | 性别 | | +| description | query | 否 | string | 简介 | 随便 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 26. 获得学生 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-inner/get` +- operationId:`Demo03StudentInner_getDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03StudentInnerRespVO` | + +### 27. 获得学生分页 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-inner/page` +- operationId:`Demo03StudentInner_getDemo03StudentPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 名字 | 芋艿 | +| sex | query | 否 | integer | 性别 | | +| description | query | 否 | string | 简介 | 随便 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDemo03StudentInnerRespVO` | + +### 28. 更新学生 + +- 分组:管理后台 - 学生 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/demo03-student-inner/update` +- operationId:`Demo03StudentInner_updateDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03StudentInnerSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 是 | integer | 8525 | +| name | 名字 | 是 | string | 芋艿 | +| sex | 性别 | 是 | integer | | +| birthday | 出生日期 | 是 | string | | +| description | 简介 | 是 | string | 随便 | +| demo03Courses | 学生课程列表 | 否 | array[Demo03CourseDO] | | +| demo03Grade | 学生班级 | 否 | Demo03GradeDO | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 29. 创建学生 + +- 分组:管理后台 - 学生 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/demo03-student-normal/create` +- operationId:`Demo03StudentNormal_createDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03StudentNormalSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 是 | integer | 8525 | +| name | 名字 | 是 | string | 芋艿 | +| sex | 性别 | 是 | integer | | +| birthday | 出生日期 | 是 | string | | +| description | 简介 | 是 | string | 随便 | +| demo03Courses | 学生课程列表 | 否 | array[Demo03CourseDO] | | +| demo03Grade | 学生班级 | 否 | Demo03GradeDO | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 30. 删除学生 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-normal/delete` +- operationId:`Demo03StudentNormal_deleteDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 31. 批量删除学生 + +- 分组:管理后台 - 学生 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/demo03-student-normal/delete-list` +- operationId:`Demo03StudentNormal_deleteDemo03StudentList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 32. 获得学生课程列表 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-normal/demo03-course/list-by-student-id` +- operationId:`Demo03StudentNormal_getDemo03CourseListByStudentId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| studentId | query | 是 | integer | 学生编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListDemo03CourseDO` | + +### 33. 获得学生班级 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-normal/demo03-grade/get-by-student-id` +- operationId:`Demo03StudentNormal_getDemo03GradeByStudentId` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| studentId | query | 是 | integer | 学生编号 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03GradeDO` | + +### 34. 导出学生 Excel + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-normal/export-excel` +- operationId:`Demo03StudentNormal_exportDemo03StudentExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 名字 | 芋艿 | +| sex | query | 否 | integer | 性别 | | +| description | query | 否 | string | 简介 | 随便 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 35. 获得学生 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-normal/get` +- operationId:`Demo03StudentNormal_getDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultDemo03StudentNormalRespVO` | + +### 36. 获得学生分页 + +- 分组:管理后台 - 学生 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/demo03-student-normal/page` +- operationId:`Demo03StudentNormal_getDemo03StudentPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 名字 | 芋艿 | +| sex | query | 否 | integer | 性别 | | +| description | query | 否 | string | 简介 | 随便 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultDemo03StudentNormalRespVO` | + +### 37. 更新学生 + +- 分组:管理后台 - 学生 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/demo03-student-normal/update` +- operationId:`Demo03StudentNormal_updateDemo03Student` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`Demo03StudentNormalSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 编号 | 是 | integer | 8525 | +| name | 名字 | 是 | string | 芋艿 | +| sex | 性别 | 是 | integer | | +| birthday | 出生日期 | 是 | string | | +| description | 简介 | 是 | string | 随便 | +| demo03Courses | 学生课程列表 | 否 | array[Demo03CourseDO] | | +| demo03Grade | 学生班级 | 否 | Demo03GradeDO | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 定时任务 + +### 1. 创建定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/job/create` +- operationId:`Job_createJob` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`JobSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 任务编号 | 否 | integer | 1024 | +| name | 任务名称 | 是 | string | 测试任务 | +| handlerName | 处理器的名字 | 是 | string | sysUserSessionTimeoutJob | +| handlerParam | 处理器的参数 | 否 | string | yudao | +| cronExpression | CRON 表达式 | 是 | string | 0/10 * * * * ? * | +| retryCount | 重试次数 | 是 | integer | 3 | +| retryInterval | 重试间隔 | 是 | integer | 1000 | +| monitorTimeout | 监控超时时间 | 否 | integer | 1000 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/job/delete` +- operationId:`Job_deleteJob` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/infra/job/delete-list` +- operationId:`Job_deleteJobList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号列表 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 导出定时任务 Excel + +- 分组:管理后台 - 定时任务 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job/export-excel` +- operationId:`Job_exportJobExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 任务名称,模糊匹配 | 测试任务 | +| status | query | 否 | integer | 任务状态,参见 JobStatusEnum 枚举 | 1 | +| handlerName | query | 否 | string | 处理器的名字,模糊匹配 | sysUserSessionTimeoutJob | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job/get` +- operationId:`Job_getJob` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultJobRespVO` | + +### 6. 获得定时任务的下 n 次执行时间 + +- 分组:管理后台 - 定时任务 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job/get_next_times` +- operationId:`Job_getJobNextTimes` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| count | query | 否 | integer | 数量 | 5 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListLocalDateTime` | + +### 7. 获得定时任务分页 + +- 分组:管理后台 - 定时任务 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job/page` +- operationId:`Job_getJobPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| name | query | 否 | string | 任务名称,模糊匹配 | 测试任务 | +| status | query | 否 | integer | 任务状态,参见 JobStatusEnum 枚举 | 1 | +| handlerName | query | 否 | string | 处理器的名字,模糊匹配 | sysUserSessionTimeoutJob | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultJobRespVO` | + +### 8. 同步定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`POST` +- 接口路径:`/admin-api/infra/job/sync` +- operationId:`Job_syncJob` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 9. 触发定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/job/trigger` +- operationId:`Job_triggerJob` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 10. 更新定时任务 + +- 分组:管理后台 - 定时任务 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/job/update` +- operationId:`Job_updateJob` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`JobSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 任务编号 | 否 | integer | 1024 | +| name | 任务名称 | 是 | string | 测试任务 | +| handlerName | 处理器的名字 | 是 | string | sysUserSessionTimeoutJob | +| handlerParam | 处理器的参数 | 否 | string | yudao | +| cronExpression | CRON 表达式 | 是 | string | 0/10 * * * * ? * | +| retryCount | 重试次数 | 是 | integer | 3 | +| retryInterval | 重试间隔 | 是 | integer | 1000 | +| monitorTimeout | 监控超时时间 | 否 | integer | 1000 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 11. 更新定时任务的状态 + +- 分组:管理后台 - 定时任务 +- 请求方式:`PUT` +- 接口路径:`/admin-api/infra/job/update-status` +- operationId:`Job_updateJobStatus` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| status | query | 是 | integer | 状态 | 1 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 定时任务日志 + +### 1. 导出定时任务日志 Excel + +- 分组:管理后台 - 定时任务日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job-log/export-excel` +- operationId:`JobLog_exportJobLogExcel` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| jobId | query | 否 | integer | 任务编号 | 10 | +| handlerName | query | 否 | string | 处理器的名字,模糊匹配 | | +| beginTime | query | 否 | string | 开始执行时间 | | +| endTime | query | 否 | string | 结束执行时间 | | +| status | query | 否 | integer | 任务状态,参见 JobLogStatusEnum 枚举 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 2. 获得定时任务日志 + +- 分组:管理后台 - 定时任务日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job-log/get` +- operationId:`JobLog_getJobLog` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultJobLogRespVO` | + +### 3. 获得定时任务日志分页 + +- 分组:管理后台 - 定时任务日志 +- 请求方式:`GET` +- 接口路径:`/admin-api/infra/job-log/page` +- operationId:`JobLog_getJobLogPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| jobId | query | 否 | integer | 任务编号 | 10 | +| handlerName | query | 否 | string | 处理器的名字,模糊匹配 | | +| beginTime | query | 否 | string | 开始执行时间 | | +| endTime | query | 否 | string | 结束执行时间 | | +| status | query | 否 | integer | 任务状态,参见 JobLogStatusEnum 枚举 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultJobLogRespVO` | + +## 管理后台 - 岗位 + +### 1. 创建岗位 + +- 分组:管理后台 - 岗位 +- 请求方式:`POST` +- 接口路径:`/admin-api/system/post/create` +- operationId:`Post_createPost` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`PostSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 岗位编号 | 否 | integer | 1024 | +| name | 岗位名称 | 是 | string | 小土豆 | +| code | 岗位编码 | 是 | string | yudao | +| sort | 显示顺序 | 是 | integer | 1024 | +| status | 状态 | 是 | integer | 1 | +| remark | 备注 | 否 | string | 快乐的备注 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 2. 删除岗位 + +- 分组:管理后台 - 岗位 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/post/delete` +- operationId:`Post_deletePost` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 3. 批量删除岗位 + +- 分组:管理后台 - 岗位 +- 请求方式:`DELETE` +- 接口路径:`/admin-api/system/post/delete-list` +- operationId:`Post_deletePostList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 4. 岗位管理 + +- 分组:管理后台 - 岗位 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/post/export-excel` +- operationId:`Post_export` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| code | query | 否 | string | 岗位编码,模糊匹配 | yudao | +| name | query | 否 | string | 岗位名称,模糊匹配 | 芋道 | +| status | query | 否 | integer | 展示状态,参见 CommonStatusEnum 枚举类 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `` | + +### 5. 获得岗位信息 + +- 分组:管理后台 - 岗位 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/post/get` +- operationId:`Post_getPost` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 岗位编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPostRespVO` | + +### 6. 获取岗位全列表 + +- 分组:管理后台 - 岗位 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/post/list-all-simple` +- operationId:`Post_getSimplePostList` +- 描述:只包含被开启的岗位,主要用于前端的下拉选项 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListPostSimpleRespVO` | + +### 7. 获得岗位分页列表 + +- 分组:管理后台 - 岗位 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/post/page` +- operationId:`Post_getPostPage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| code | query | 否 | string | 岗位编码,模糊匹配 | yudao | +| name | query | 否 | string | 岗位名称,模糊匹配 | 芋道 | +| status | query | 否 | integer | 展示状态,参见 CommonStatusEnum 枚举类 | 1 | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultPostRespVO` | + +### 8. 获取岗位全列表 + +- 分组:管理后台 - 岗位 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/post/simple-list` +- operationId:`Post_getSimplePostList_1` +- 描述:只包含被开启的岗位,主要用于前端的下拉选项 + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListPostSimpleRespVO` | + +### 9. 修改岗位 + +- 分组:管理后台 - 岗位 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/post/update` +- operationId:`Post_updatePost` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`PostSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 岗位编号 | 否 | integer | 1024 | +| name | 岗位名称 | 是 | string | 小土豆 | +| code | 岗位编码 | 是 | string | yudao | +| sort | 显示顺序 | 是 | integer | 1024 | +| status | 状态 | 是 | integer | 1 | +| remark | 备注 | 否 | string | 快乐的备注 | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 我的站内信 + +### 1. 获得站内信 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/notify-message/get` +- operationId:`NotifyMessage_getNotifyMessage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | 编号 | 1024 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultNotifyMessageRespVO` | + +### 2. 获得当前用户的未读站内信数量 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/notify-message/get-unread-count` +- operationId:`NotifyMessage_getUnreadNotifyMessageCount` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultLong` | + +### 3. 获取当前用户的最新站内信列表,默认 10 条 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/notify-message/get-unread-list` +- operationId:`NotifyMessage_getUnreadNotifyMessageList` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| size | query | 否 | integer | 10 | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultListNotifyMessageRespVO` | + +### 4. 获得我的站内信分页 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/notify-message/my-page` +- operationId:`NotifyMessage_getMyMyNotifyMessagePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| readStatus | query | 否 | boolean | 是否已读 | True | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultNotifyMessageRespVO` | + +### 5. 获得站内信分页 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`GET` +- 接口路径:`/admin-api/system/notify-message/page` +- operationId:`NotifyMessage_getNotifyMessagePage` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| userId | query | 否 | integer | 用户编号 | 25025 | +| userType | query | 否 | integer | 用户类型 | 1 | +| templateCode | query | 否 | string | 模板编码 | test_01 | +| templateType | query | 否 | integer | 模版类型 | 2 | +| createTime | query | 否 | array[string] | 创建时间 | | +| pageNo | query | 是 | integer | 页码,从 1 开始 | 1 | +| pageSize | query | 是 | integer | 每页条数,最大值为 999 | 10 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultPageResultNotifyMessageRespVO` | + +### 6. 标记所有站内信为已读 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/notify-message/update-all-read` +- operationId:`NotifyMessage_updateAllNotifyMessageRead` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 7. 标记站内信为已读 + +- 分组:管理后台 - 我的站内信 +- 请求方式:`PUT` +- 接口路径:`/admin-api/system/notify-message/update-read` +- operationId:`NotifyMessage_updateNotifyMessageRead` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| ids | query | 是 | array[integer] | 编号列表 | 1024,2048 | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +## 管理后台 - 折扣 + +### 1. 启用/停用 + +- 分组:管理后台 - 折扣 +- 请求方式:`PUT` +- 接口路径:`/admin-api/jh/discount/change-status` +- operationId:`Discount_updateDiscountStatus` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| id | query | 是 | integer | ID | | +| status | query | 是 | string | | | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 响应 + +| 状态码 | 说明 | Schema | +| --- | --- | --- | +| 200 | OK | `CommonResultBoolean` | + +### 2. 创建折扣 + +- 分组:管理后台 - 折扣 +- 请求方式:`POST` +- 接口路径:`/admin-api/jh/discount/create` +- operationId:`Discount_createDiscount` + +#### 请求参数 + +| 名称 | 位置 | 必填 | 类型 | 说明 | 示例 | +| --- | --- | --- | --- | --- | --- | +| tenant-id | header | 否 | integer | 租户编号 | | +| Authorization | header | 否 | string | 认证 Token | | + +#### 请求体 + +- 必填:是 +- Content-Type:`application/json` +- Schema:`DiscountSaveReqVO` + +| 字段 | 说明 | 必填 | 类型 | 示例 | +| --- | --- | --- | --- | --- | +| id | 折扣主键 | 是 | integer | 8592 | +| discountCode | 折扣编码 | 否 | string | | +| discountName | 折扣名称 | 是 | string | 芋艿 | +| discountType | 折扣类型(product_discount-产品折扣、order_discount-订单折扣、buy_x_get_y-买X赠Y) | 是 | string | 1 | +| discountEffectType | 折扣生效类型(discount_code-折扣码、auto_discount-自动折扣) | 是 | string | 1 | +| discountCodeValue | 折扣码(折扣生效类型为"折扣码"时必填) | 否 | string | | +| discountTitle | 折扣标题(折扣生效类型为"自动折扣"时必填) | 否 | string | | +| status | 状态(active-有效、expired-已过期、disabled-已停用) | 否 | string | | +| startTime | 开始时间 | 是 | string | | +| endTime | 结束时间 | 否 | string | | +| minRequirementType | 最低购买要求(none-无最低要求、min_purchase_amount-最低购买金额、min_product_quantity-最低购买产品数量) | 否 | string | 1 | +| minPurchaseAmount | 最低购买金额(购买要求为"最低购买金额"时必填) | 否 | number | | +| minProductQuantity | 最低购买产品数量(购买要求为"最低购买产品数量"时必填) | 否 | integer | | +| customerEligibility | 客户资格适用范围(all_customer-所有客户、specific_cate-特定客户分类、specific_customer-特定客户) | 否 | string | | +| totalIssuanceLimit | 总发放量(0这是正文内容

image

', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '204', 'updater': '挂辣辣的瓜', 'createTime': 1776068587089, 'updateTime': 1776069119841, 'deptId': 0, 'userId': 204}, {'id': 13, 'terminal': '1', 'type': 1, 'title': '孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。 林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。 长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。', 'content': '

孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。

林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。

长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。

', 'status': 1, 'lang': 'pl', 'rankNum': 0, 'creator': '203', 'updater': '203', 'createTime': 1775787078899, 'updateTime': 1775787078899, 'deptId': 114, 'userId': 203}, {'id': 11, 'terminal': '1', 'type': 4, 'title': '用户协议', 'content': '

不遵守的就猪八

', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '203', 'updater': '哇啦啦的哇', 'createTime': 1774599611156, 'updateTime': 1775786859785, 'deptId': 114, 'userId': 203}, {'id': 9, 'terminal': '1', 'type': 1, 'title': '测试协议', 'content': '

测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议

', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '145', 'updater': 'joyhub', 'createTime': 1774404487857, 'updateTime': 1774404497348, 'deptId': 1, 'userId': 145}, {'id': 5, 'terminal': '1', 'type': 2, 'title': '昆仑山,横亘西疆,绵延千里,被誉为万山之祖、中华龙脉。雪峰巍峨,冰川如玉,终年银装素裹,在苍穹下静静矗立。', 'content': '

测试环境一哈

', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '147', 'updater': '哇啦啦的哇', 'createTime': 1773107640496, 'updateTime': 1774598787925, 'deptId': 116, 'userId': 147}, {'id': 4, 'terminal': '1', 'type': 1, 'title': '用户测试协议1111', 'content': '

飞机飞机艾佛啊

', 'status': 1, 'lang': 'de', 'rankNum': 0, 'creator': '147', 'updater': '147', 'createTime': 1773056002516, 'updateTime': 1773107141877, 'deptId': 116, 'userId': 147}, {'id': 6, 'terminal': '1', 'type': 1, 'title': '测试数据123', 'content': '

124513515

', 'status': 1, 'lang': 'es', 'rankNum': 1, 'creator': '147', 'updater': '147', 'createTime': 1773110599081, 'updateTime': 1773220135616, 'deptId': 116, 'userId': 147}, {'id': 8, 'terminal': '1', 'type': 1, 'title': '测试多个隐私策略', 'content': '

狗日饿啊缝纫机

', 'status': 1, 'lang': 'es', 'rankNum': 5, 'creator': '147', 'updater': '147', 'createTime': 1773111389179, 'updateTime': 1773220125716, 'deptId': 116, 'userId': 147}, {'id': 10, 'terminal': '1', 'type': 3, 'title': '鱼人语教学开始', 'content': '
  • Wralarrrrr!Wawalala!Wurrrrgl!
  • Mmmurlok mmmrrglllm!
  • Wrarararralalla!Wuuuu~
  • Glub-glub… Murloc ok!
  • ', 'status': 1, 'lang': 'en', 'rankNum': 11, 'creator': '203', 'updater': '203', 'createTime': 1774598987819, 'updateTime': 1774598987819, 'deptId': 114, 'userId': 203}, {'id': 12, 'terminal': '1', 'type': 5, 'title': '社区指南测试版本', 'content': '

    多见于平台用户协议、违规提示中,是互联网产品的标准用语。

    ', 'status': 1, 'lang': 'en', 'rankNum': 123, 'creator': '203', 'updater': '203', 'createTime': 1774835556936, 'updateTime': 1774835556936, 'deptId': 114, 'userId': 203}]}} +2026-05-06 15:16:18,342 [tid:22052 pid:14556] AgreementManage.py[line:32] INFO 创建协议 - type: 2, title: 测试协议_1778051778, content: 这是测试协议内容_1778051778..., status: 1 +2026-05-06 15:16:18,344 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:16:18,493 [tid:22052 pid:14556] AgreementManage.py[line:43] INFO 创建协议响应: {'code': 400, 'msg': 'The request parameters are incorrect:排序号不能为空', 'data': None} +2026-05-06 15:16:18,901 [tid:22052 pid:14556] AgreementManage.py[line:32] INFO 创建协议 - type: 1, title: 详情测试协议_1778051778, content: 详情测试协议内容_1778051778..., status: 1 +2026-05-06 15:16:18,902 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:16:19,024 [tid:22052 pid:14556] AgreementManage.py[line:43] INFO 创建协议响应: {'code': 400, 'msg': 'The request parameters are incorrect:排序号不能为空', 'data': None} +2026-05-06 15:16:19,056 [tid:22052 pid:14556] AgreementManage.py[line:32] INFO 创建协议 - type: 2, title: 待更新协议_1778051779, content: 待更新协议内容_1778051779..., status: 1 +2026-05-06 15:16:19,057 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:16:19,203 [tid:22052 pid:14556] AgreementManage.py[line:43] INFO 创建协议响应: {'code': 400, 'msg': 'The request parameters are incorrect:排序号不能为空', 'data': None} +2026-05-06 15:16:19,224 [tid:22052 pid:14556] AgreementManage.py[line:32] INFO 创建协议 - type: 2, title: 待删除协议_1778051779, content: 待删除协议内容_1778051779..., status: 2 +2026-05-06 15:16:19,226 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:16:19,382 [tid:22052 pid:14556] AgreementManage.py[line:43] INFO 创建协议响应: {'code': 400, 'msg': 'The request parameters are incorrect:终端(1web 2app)不能为空', 'data': None} +2026-05-06 15:16:19,396 [tid:22052 pid:14556] AgreementManage.py[line:32] INFO 创建协议 - type: 1, title: 批量删除协议1_1778051779, content: 批量删除协议内容1_1778051779..., status: 2 +2026-05-06 15:16:19,397 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:16:19,523 [tid:22052 pid:14556] AgreementManage.py[line:43] INFO 创建协议响应: {'code': 400, 'msg': 'The request parameters are incorrect:终端(1web 2app)不能为空', 'data': None} +2026-05-06 15:16:19,526 [tid:22052 pid:14556] AgreementManage.py[line:32] INFO 创建协议 - type: 2, title: 批量删除协议2_1778051779, content: 批量删除协议内容2_1778051779..., status: 2 +2026-05-06 15:16:19,527 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:16:19,658 [tid:22052 pid:14556] AgreementManage.py[line:43] INFO 创建协议响应: {'code': 400, 'msg': 'The request parameters are incorrect:语言 (en 英语 de 德语 ja 日语)不能为空', 'data': None} +2026-05-06 15:16:19,675 [tid:22052 pid:14556] AgreementManage.py[line:82] INFO 导出协议Excel - 参数: {'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:16:19,676 [tid:22052 pid:14556] Dlizhan_interface.py[line:45] INFO =========== 导出协议 Excel =========== +2026-05-06 15:16:19,832 [tid:22052 pid:14556] AgreementManage.py[line:85] INFO 导出协议Excel响应: +2026-05-06 15:17:29,237 [tid:21980 pid:22676] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:17:29,240 [tid:21980 pid:22676] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'C:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:17:29,241 [tid:21980 pid:22676] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:17:29,879 [tid:21980 pid:22676] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:17:30,063 [tid:21980 pid:22676] AgreementManage.py[line:116] INFO 获得协议分页列表 - 参数: {'page_no': 1, 'page_size': 10, 'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:17:30,065 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 获得协议分页 =========== +2026-05-06 15:17:30,193 [tid:21980 pid:22676] AgreementManage.py[line:119] INFO 获得协议分页列表响应: {'code': 0, 'msg': '', 'data': {'total': 10, 'list': [{'id': 14, 'terminal': '1', 'type': 6, 'title': '透明度报告标题', 'content': '

    这是正文内容

    image

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '204', 'updater': '挂辣辣的瓜', 'createTime': 1776068587089, 'updateTime': 1776069119841, 'deptId': 0, 'userId': 204}, {'id': 13, 'terminal': '1', 'type': 1, 'title': '孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。 林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。 长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。', 'content': '

    孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。

    林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。

    长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。

    ', 'status': 1, 'lang': 'pl', 'rankNum': 0, 'creator': '203', 'updater': '203', 'createTime': 1775787078899, 'updateTime': 1775787078899, 'deptId': 114, 'userId': 203}, {'id': 11, 'terminal': '1', 'type': 4, 'title': '用户协议', 'content': '

    不遵守的就猪八

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '203', 'updater': '哇啦啦的哇', 'createTime': 1774599611156, 'updateTime': 1775786859785, 'deptId': 114, 'userId': 203}, {'id': 9, 'terminal': '1', 'type': 1, 'title': '测试协议', 'content': '

    测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '145', 'updater': 'joyhub', 'createTime': 1774404487857, 'updateTime': 1774404497348, 'deptId': 1, 'userId': 145}, {'id': 5, 'terminal': '1', 'type': 2, 'title': '昆仑山,横亘西疆,绵延千里,被誉为万山之祖、中华龙脉。雪峰巍峨,冰川如玉,终年银装素裹,在苍穹下静静矗立。', 'content': '

    测试环境一哈

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '147', 'updater': '哇啦啦的哇', 'createTime': 1773107640496, 'updateTime': 1774598787925, 'deptId': 116, 'userId': 147}, {'id': 4, 'terminal': '1', 'type': 1, 'title': '用户测试协议1111', 'content': '

    飞机飞机艾佛啊

    ', 'status': 1, 'lang': 'de', 'rankNum': 0, 'creator': '147', 'updater': '147', 'createTime': 1773056002516, 'updateTime': 1773107141877, 'deptId': 116, 'userId': 147}, {'id': 6, 'terminal': '1', 'type': 1, 'title': '测试数据123', 'content': '

    124513515

    ', 'status': 1, 'lang': 'es', 'rankNum': 1, 'creator': '147', 'updater': '147', 'createTime': 1773110599081, 'updateTime': 1773220135616, 'deptId': 116, 'userId': 147}, {'id': 8, 'terminal': '1', 'type': 1, 'title': '测试多个隐私策略', 'content': '

    狗日饿啊缝纫机

    ', 'status': 1, 'lang': 'es', 'rankNum': 5, 'creator': '147', 'updater': '147', 'createTime': 1773111389179, 'updateTime': 1773220125716, 'deptId': 116, 'userId': 147}, {'id': 10, 'terminal': '1', 'type': 3, 'title': '鱼人语教学开始', 'content': '
  • Wralarrrrr!Wawalala!Wurrrrgl!
  • Mmmurlok mmmrrglllm!
  • Wrarararralalla!Wuuuu~
  • Glub-glub… Murloc ok!
  • ', 'status': 1, 'lang': 'en', 'rankNum': 11, 'creator': '203', 'updater': '203', 'createTime': 1774598987819, 'updateTime': 1774598987819, 'deptId': 114, 'userId': 203}, {'id': 12, 'terminal': '1', 'type': 5, 'title': '社区指南测试版本', 'content': '

    多见于平台用户协议、违规提示中,是互联网产品的标准用语。

    ', 'status': 1, 'lang': 'en', 'rankNum': 123, 'creator': '203', 'updater': '203', 'createTime': 1774835556936, 'updateTime': 1774835556936, 'deptId': 114, 'userId': 203}]}} +2026-05-06 15:17:30,207 [tid:21980 pid:22676] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 测试协议_1778051850, content: 这是测试协议内容_1778051850..., terminal: web, lang: en, rank_num: 1, status: 1 +2026-05-06 15:17:30,209 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:17:30,356 [tid:21980 pid:22676] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:17:30,730 [tid:21980 pid:22676] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 详情测试协议_1778051850, content: 详情测试协议内容_1778051850..., terminal: web, lang: en, rank_num: 1, status: 1 +2026-05-06 15:17:30,731 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:17:30,884 [tid:21980 pid:22676] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:17:30,895 [tid:21980 pid:22676] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 待更新协议_1778051850, content: 待更新协议内容_1778051850..., terminal: web, lang: en, rank_num: 1, status: 1 +2026-05-06 15:17:30,896 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:17:31,030 [tid:21980 pid:22676] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:17:31,042 [tid:21980 pid:22676] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 待删除协议_1778051851, content: 待删除协议内容_1778051851..., terminal: web, lang: en, rank_num: 1, status: 2 +2026-05-06 15:17:31,043 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:17:31,175 [tid:21980 pid:22676] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 15} +2026-05-06 15:17:31,180 [tid:21980 pid:22676] AgreementManage.py[line:60] INFO 删除协议 - agreement_id: 15 +2026-05-06 15:17:31,181 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 删除协议 =========== +2026-05-06 15:17:31,321 [tid:21980 pid:22676] AgreementManage.py[line:63] INFO 删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:17:31,333 [tid:21980 pid:22676] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 批量删除协议1_1778051851, content: 批量删除协议内容1_1778051851..., terminal: web, lang: en, rank_num: 1, status: 2 +2026-05-06 15:17:31,335 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:17:31,478 [tid:21980 pid:22676] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 16} +2026-05-06 15:17:31,480 [tid:21980 pid:22676] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 批量删除协议2_1778051851, content: 批量删除协议内容2_1778051851..., terminal: web, lang: en, rank_num: 1, status: 2 +2026-05-06 15:17:31,481 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:17:31,615 [tid:21980 pid:22676] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 17} +2026-05-06 15:17:31,619 [tid:21980 pid:22676] AgreementManage.py[line:74] INFO 批量删除协议 - agreement_ids: [16, 17] +2026-05-06 15:17:31,621 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 批量删除协议 =========== +2026-05-06 15:17:31,754 [tid:21980 pid:22676] AgreementManage.py[line:77] INFO 批量删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:17:31,767 [tid:21980 pid:22676] AgreementManage.py[line:88] INFO 导出协议Excel - 参数: {'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:17:31,768 [tid:21980 pid:22676] Dlizhan_interface.py[line:45] INFO =========== 导出协议 Excel =========== +2026-05-06 15:17:31,921 [tid:21980 pid:22676] AgreementManage.py[line:91] INFO 导出协议Excel响应: +2026-05-06 15:19:09,224 [tid:17864 pid:13156] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:19:09,228 [tid:17864 pid:13156] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'C:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:19:09,229 [tid:17864 pid:13156] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:19:09,895 [tid:17864 pid:13156] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:19:10,080 [tid:17864 pid:13156] AgreementManage.py[line:116] INFO 获得协议分页列表 - 参数: {'page_no': 1, 'page_size': 10, 'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:19:10,082 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 获得协议分页 =========== +2026-05-06 15:19:10,233 [tid:17864 pid:13156] AgreementManage.py[line:119] INFO 获得协议分页列表响应: {'code': 0, 'msg': '', 'data': {'total': 10, 'list': [{'id': 14, 'terminal': '1', 'type': 6, 'title': '透明度报告标题', 'content': '

    这是正文内容

    image

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '204', 'updater': '挂辣辣的瓜', 'createTime': 1776068587089, 'updateTime': 1776069119841, 'deptId': 0, 'userId': 204}, {'id': 13, 'terminal': '1', 'type': 1, 'title': '孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。 林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。 长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。', 'content': '

    孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。

    林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。

    长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。

    ', 'status': 1, 'lang': 'pl', 'rankNum': 0, 'creator': '203', 'updater': '203', 'createTime': 1775787078899, 'updateTime': 1775787078899, 'deptId': 114, 'userId': 203}, {'id': 11, 'terminal': '1', 'type': 4, 'title': '用户协议', 'content': '

    不遵守的就猪八

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '203', 'updater': '哇啦啦的哇', 'createTime': 1774599611156, 'updateTime': 1775786859785, 'deptId': 114, 'userId': 203}, {'id': 9, 'terminal': '1', 'type': 1, 'title': '测试协议', 'content': '

    测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '145', 'updater': 'joyhub', 'createTime': 1774404487857, 'updateTime': 1774404497348, 'deptId': 1, 'userId': 145}, {'id': 5, 'terminal': '1', 'type': 2, 'title': '昆仑山,横亘西疆,绵延千里,被誉为万山之祖、中华龙脉。雪峰巍峨,冰川如玉,终年银装素裹,在苍穹下静静矗立。', 'content': '

    测试环境一哈

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '147', 'updater': '哇啦啦的哇', 'createTime': 1773107640496, 'updateTime': 1774598787925, 'deptId': 116, 'userId': 147}, {'id': 4, 'terminal': '1', 'type': 1, 'title': '用户测试协议1111', 'content': '

    飞机飞机艾佛啊

    ', 'status': 1, 'lang': 'de', 'rankNum': 0, 'creator': '147', 'updater': '147', 'createTime': 1773056002516, 'updateTime': 1773107141877, 'deptId': 116, 'userId': 147}, {'id': 6, 'terminal': '1', 'type': 1, 'title': '测试数据123', 'content': '

    124513515

    ', 'status': 1, 'lang': 'es', 'rankNum': 1, 'creator': '147', 'updater': '147', 'createTime': 1773110599081, 'updateTime': 1773220135616, 'deptId': 116, 'userId': 147}, {'id': 8, 'terminal': '1', 'type': 1, 'title': '测试多个隐私策略', 'content': '

    狗日饿啊缝纫机

    ', 'status': 1, 'lang': 'es', 'rankNum': 5, 'creator': '147', 'updater': '147', 'createTime': 1773111389179, 'updateTime': 1773220125716, 'deptId': 116, 'userId': 147}, {'id': 10, 'terminal': '1', 'type': 3, 'title': '鱼人语教学开始', 'content': '
  • Wralarrrrr!Wawalala!Wurrrrgl!
  • Mmmurlok mmmrrglllm!
  • Wrarararralalla!Wuuuu~
  • Glub-glub… Murloc ok!
  • ', 'status': 1, 'lang': 'en', 'rankNum': 11, 'creator': '203', 'updater': '203', 'createTime': 1774598987819, 'updateTime': 1774598987819, 'deptId': 114, 'userId': 203}, {'id': 12, 'terminal': '1', 'type': 5, 'title': '社区指南测试版本', 'content': '

    多见于平台用户协议、违规提示中,是互联网产品的标准用语。

    ', 'status': 1, 'lang': 'en', 'rankNum': 123, 'creator': '203', 'updater': '203', 'createTime': 1774835556936, 'updateTime': 1774835556936, 'deptId': 114, 'userId': 203}]}} +2026-05-06 15:19:10,248 [tid:17864 pid:13156] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 测试协议_1778051950, content: 这是测试协议内容_1778051950..., terminal: web, lang: de, rank_num: 950, status: 2 +2026-05-06 15:19:10,249 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:10,380 [tid:17864 pid:13156] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 18} +2026-05-06 15:19:10,396 [tid:17864 pid:13156] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 详情测试协议_1778051950, content: 详情测试协议内容_1778051950..., terminal: app, lang: ja, rank_num: 1950, status: 1 +2026-05-06 15:19:10,399 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:10,538 [tid:17864 pid:13156] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 19} +2026-05-06 15:19:10,540 [tid:17864 pid:13156] AgreementManage.py[line:102] INFO 获得协议详情 - agreement_id: 19 +2026-05-06 15:19:10,541 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 获得协议 =========== +2026-05-06 15:19:10,674 [tid:17864 pid:13156] AgreementManage.py[line:105] INFO 获得协议详情响应: {'code': 0, 'msg': '', 'data': {'id': 19, 'terminal': 'app', 'type': 2, 'title': '详情测试协议_1778051950', 'content': '详情测试协议内容_1778051950', 'status': 1, 'lang': 'ja', 'rankNum': 1950, 'creator': '203', 'updater': '203', 'createTime': 1778051950467, 'updateTime': 1778051950467, 'deptId': 114, 'userId': 203}} +2026-05-06 15:19:10,710 [tid:17864 pid:13156] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 待更新协议_1778051950, content: 待更新协议内容_1778051950..., terminal: app, lang: de, rank_num: 2950, status: 1 +2026-05-06 15:19:10,713 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:10,857 [tid:17864 pid:13156] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:19:10,873 [tid:17864 pid:13156] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 待删除协议_1778051950, content: 待删除协议内容_1778051950..., terminal: web, lang: ja, rank_num: 4950, status: 2 +2026-05-06 15:19:10,875 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:11,059 [tid:17864 pid:13156] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 20} +2026-05-06 15:19:11,063 [tid:17864 pid:13156] AgreementManage.py[line:60] INFO 删除协议 - agreement_id: 20 +2026-05-06 15:19:11,065 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 删除协议 =========== +2026-05-06 15:19:11,203 [tid:17864 pid:13156] AgreementManage.py[line:63] INFO 删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:19:11,208 [tid:17864 pid:13156] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 批量删除协议1_1778051951, content: 批量删除协议内容1_1778051951..., terminal: app, lang: de, rank_num: 5951, status: 2 +2026-05-06 15:19:11,208 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:11,344 [tid:17864 pid:13156] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 21} +2026-05-06 15:19:11,348 [tid:17864 pid:13156] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 批量删除协议2_1778051951, content: 批量删除协议内容2_1778051951..., terminal: app, lang: ja, rank_num: 6951, status: 2 +2026-05-06 15:19:11,350 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:11,473 [tid:17864 pid:13156] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 22} +2026-05-06 15:19:11,475 [tid:17864 pid:13156] AgreementManage.py[line:74] INFO 批量删除协议 - agreement_ids: [21, 22] +2026-05-06 15:19:11,475 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 批量删除协议 =========== +2026-05-06 15:19:11,599 [tid:17864 pid:13156] AgreementManage.py[line:77] INFO 批量删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:19:11,606 [tid:17864 pid:13156] AgreementManage.py[line:88] INFO 导出协议Excel - 参数: {'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:19:11,608 [tid:17864 pid:13156] Dlizhan_interface.py[line:45] INFO =========== 导出协议 Excel =========== +2026-05-06 15:19:11,740 [tid:17864 pid:13156] AgreementManage.py[line:91] INFO 导出协议Excel响应: +2026-05-06 15:19:51,206 [tid:18004 pid:2008] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:19:51,212 [tid:18004 pid:2008] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'C:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:19:51,213 [tid:18004 pid:2008] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:19:52,211 [tid:18004 pid:2008] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:19:52,406 [tid:18004 pid:2008] AgreementManage.py[line:116] INFO 获得协议分页列表 - 参数: {'page_no': 1, 'page_size': 10, 'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:19:52,410 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 获得协议分页 =========== +2026-05-06 15:19:52,560 [tid:18004 pid:2008] AgreementManage.py[line:119] INFO 获得协议分页列表响应: {'code': 0, 'msg': '', 'data': {'total': 12, 'list': [{'id': 14, 'terminal': '1', 'type': 6, 'title': '透明度报告标题', 'content': '

    这是正文内容

    image

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '204', 'updater': '挂辣辣的瓜', 'createTime': 1776068587089, 'updateTime': 1776069119841, 'deptId': 0, 'userId': 204}, {'id': 13, 'terminal': '1', 'type': 1, 'title': '孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。 林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。 长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。', 'content': '

    孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。

    林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。

    长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。

    ', 'status': 1, 'lang': 'pl', 'rankNum': 0, 'creator': '203', 'updater': '203', 'createTime': 1775787078899, 'updateTime': 1775787078899, 'deptId': 114, 'userId': 203}, {'id': 11, 'terminal': '1', 'type': 4, 'title': '用户协议', 'content': '

    不遵守的就猪八

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '203', 'updater': '哇啦啦的哇', 'createTime': 1774599611156, 'updateTime': 1775786859785, 'deptId': 114, 'userId': 203}, {'id': 9, 'terminal': '1', 'type': 1, 'title': '测试协议', 'content': '

    测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '145', 'updater': 'joyhub', 'createTime': 1774404487857, 'updateTime': 1774404497348, 'deptId': 1, 'userId': 145}, {'id': 5, 'terminal': '1', 'type': 2, 'title': '昆仑山,横亘西疆,绵延千里,被誉为万山之祖、中华龙脉。雪峰巍峨,冰川如玉,终年银装素裹,在苍穹下静静矗立。', 'content': '

    测试环境一哈

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '147', 'updater': '哇啦啦的哇', 'createTime': 1773107640496, 'updateTime': 1774598787925, 'deptId': 116, 'userId': 147}, {'id': 4, 'terminal': '1', 'type': 1, 'title': '用户测试协议1111', 'content': '

    飞机飞机艾佛啊

    ', 'status': 1, 'lang': 'de', 'rankNum': 0, 'creator': '147', 'updater': '147', 'createTime': 1773056002516, 'updateTime': 1773107141877, 'deptId': 116, 'userId': 147}, {'id': 6, 'terminal': '1', 'type': 1, 'title': '测试数据123', 'content': '

    124513515

    ', 'status': 1, 'lang': 'es', 'rankNum': 1, 'creator': '147', 'updater': '147', 'createTime': 1773110599081, 'updateTime': 1773220135616, 'deptId': 116, 'userId': 147}, {'id': 8, 'terminal': '1', 'type': 1, 'title': '测试多个隐私策略', 'content': '

    狗日饿啊缝纫机

    ', 'status': 1, 'lang': 'es', 'rankNum': 5, 'creator': '147', 'updater': '147', 'createTime': 1773111389179, 'updateTime': 1773220125716, 'deptId': 116, 'userId': 147}, {'id': 10, 'terminal': '1', 'type': 3, 'title': '鱼人语教学开始', 'content': '
  • Wralarrrrr!Wawalala!Wurrrrgl!
  • Mmmurlok mmmrrglllm!
  • Wrarararralalla!Wuuuu~
  • Glub-glub… Murloc ok!
  • ', 'status': 1, 'lang': 'en', 'rankNum': 11, 'creator': '203', 'updater': '203', 'createTime': 1774598987819, 'updateTime': 1774598987819, 'deptId': 114, 'userId': 203}, {'id': 12, 'terminal': '1', 'type': 5, 'title': '社区指南测试版本', 'content': '

    多见于平台用户协议、违规提示中,是互联网产品的标准用语。

    ', 'status': 1, 'lang': 'en', 'rankNum': 123, 'creator': '203', 'updater': '203', 'createTime': 1774835556936, 'updateTime': 1774835556936, 'deptId': 114, 'userId': 203}]}} +2026-05-06 15:19:52,570 [tid:18004 pid:2008] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 测试协议_1778051992, content: 这是测试协议内容_1778051992..., terminal: web, lang: de, rank_num: 992, status: 2 +2026-05-06 15:19:52,571 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:52,717 [tid:18004 pid:2008] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 23} +2026-05-06 15:19:52,726 [tid:18004 pid:2008] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 详情测试协议_1778051992, content: 详情测试协议内容_1778051992..., terminal: app, lang: ja, rank_num: 1992, status: 1 +2026-05-06 15:19:52,727 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:52,873 [tid:18004 pid:2008] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:19:52,889 [tid:18004 pid:2008] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 待更新协议_1778051992, content: 待更新协议内容_1778051992..., terminal: app, lang: de, rank_num: 2992, status: 1 +2026-05-06 15:19:52,892 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:53,053 [tid:18004 pid:2008] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:19:53,064 [tid:18004 pid:2008] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 待删除协议_1778051993, content: 待删除协议内容_1778051993..., terminal: web, lang: ja, rank_num: 4993, status: 2 +2026-05-06 15:19:53,065 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:53,225 [tid:18004 pid:2008] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 24} +2026-05-06 15:19:53,229 [tid:18004 pid:2008] AgreementManage.py[line:60] INFO 删除协议 - agreement_id: 24 +2026-05-06 15:19:53,230 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 删除协议 =========== +2026-05-06 15:19:53,376 [tid:18004 pid:2008] AgreementManage.py[line:63] INFO 删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:19:53,385 [tid:18004 pid:2008] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 批量删除协议1_1778051993, content: 批量删除协议内容1_1778051993..., terminal: app, lang: de, rank_num: 5993, status: 2 +2026-05-06 15:19:53,386 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:53,536 [tid:18004 pid:2008] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 25} +2026-05-06 15:19:53,539 [tid:18004 pid:2008] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 批量删除协议2_1778051993, content: 批量删除协议内容2_1778051993..., terminal: app, lang: ja, rank_num: 6993, status: 2 +2026-05-06 15:19:53,540 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:19:53,676 [tid:18004 pid:2008] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 26} +2026-05-06 15:19:53,679 [tid:18004 pid:2008] AgreementManage.py[line:74] INFO 批量删除协议 - agreement_ids: [25, 26] +2026-05-06 15:19:53,680 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 批量删除协议 =========== +2026-05-06 15:19:53,822 [tid:18004 pid:2008] AgreementManage.py[line:77] INFO 批量删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:19:53,850 [tid:18004 pid:2008] AgreementManage.py[line:88] INFO 导出协议Excel - 参数: {'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:19:53,852 [tid:18004 pid:2008] Dlizhan_interface.py[line:45] INFO =========== 导出协议 Excel =========== +2026-05-06 15:19:54,018 [tid:18004 pid:2008] AgreementManage.py[line:91] INFO 导出协议Excel响应: +2026-05-06 15:49:56,500 [tid:32644 pid:18880] UserManage.py[line:44] INFO 尝试读取配置文件: c:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:49:56,509 [tid:32644 pid:18880] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'c:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:49:56,510 [tid:32644 pid:18880] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:49:56,565 [tid:32644 pid:18880] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-05-06 15:49:56,567 [tid:32644 pid:18880] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-05-06 15:49:56,567 [tid:32644 pid:18880] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-05-06 15:51:08,800 [tid:8016 pid:3984] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:51:08,803 [tid:8016 pid:3984] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'C:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:51:08,804 [tid:8016 pid:3984] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:51:09,508 [tid:8016 pid:3984] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:51:09,798 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理分页 =========== +2026-05-06 15:51:09,950 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:51:10,093 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:51:10,232 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理详情 =========== +2026-05-06 15:51:10,419 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:51:10,607 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 更新Banner管理 =========== +2026-05-06 15:51:10,795 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:51:10,987 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 删除Banner管理 =========== +2026-05-06 15:51:11,177 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:51:11,387 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:51:11,563 [tid:8016 pid:3984] Dlizhan_interface.py[line:45] INFO =========== 批量删除Banner管理 =========== +2026-05-06 15:56:47,655 [tid:3856 pid:23924] UserManage.py[line:44] INFO 尝试读取配置文件: c:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:56:47,658 [tid:3856 pid:23924] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'c:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:56:47,658 [tid:3856 pid:23924] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:56:47,713 [tid:3856 pid:23924] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-05-06 15:56:47,713 [tid:3856 pid:23924] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-05-06 15:56:47,714 [tid:3856 pid:23924] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-05-06 15:57:26,392 [tid:14496 pid:26092] UserManage.py[line:44] INFO 尝试读取配置文件: c:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 15:57:26,395 [tid:14496 pid:26092] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'c:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 15:57:26,395 [tid:14496 pid:26092] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 15:57:26,432 [tid:14496 pid:26092] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-05-06 15:57:26,433 [tid:14496 pid:26092] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-05-06 15:57:26,433 [tid:14496 pid:26092] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-05-06 15:57:27,017 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:27,234 [tid:14496 pid:26092] AgreementManage.py[line:116] INFO 获得协议分页列表 - 参数: {'page_no': 1, 'page_size': 10, 'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:57:27,235 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得协议分页 =========== +2026-05-06 15:57:27,366 [tid:14496 pid:26092] AgreementManage.py[line:119] INFO 获得协议分页列表响应: {'code': 0, 'msg': '', 'data': {'total': 13, 'list': [{'id': 14, 'terminal': '1', 'type': 6, 'title': '透明度报告标题', 'content': '

    这是正文内容

    image

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '204', 'updater': '挂辣辣的瓜', 'createTime': 1776068587089, 'updateTime': 1776069119841, 'deptId': 0, 'userId': 204}, {'id': 13, 'terminal': '1', 'type': 1, 'title': '孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。 林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。 长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。', 'content': '

    孤悬于远东寒海之间,库页岛如沉睡巨鲸,静卧在鄂霍次克海与鞑靼海峡的碧波里。千里山脉纵贯全境,东西双峰衔云而立,六千溪流蜿蜒成练,千座湖泊散落如星,浸染着寒地的清冽与辽阔。

    林海是岛屿永恒的底色,苍劲的落叶松与冷杉铺展万顷浓绿,春日新芽破霜,秋日层林染金,连荒野草木都生得蓬勃伟岸。林间棕熊缓步,紫貂潜行,驯鹿踏过湿地苔原;海岸边灰鲸逐浪,海鸟翩飞,鲑鱼洄游奔赴星河,原生态的生灵百态,绘就北国最壮阔的自然长卷。

    长风掠过雪原,林海低语潮汐,每一寸土地都藏着山海深情,每一缕风都载着岁月悠长。

    ', 'status': 1, 'lang': 'pl', 'rankNum': 0, 'creator': '203', 'updater': '203', 'createTime': 1775787078899, 'updateTime': 1775787078899, 'deptId': 114, 'userId': 203}, {'id': 11, 'terminal': '1', 'type': 4, 'title': '用户协议', 'content': '

    不遵守的就猪八

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '203', 'updater': '哇啦啦的哇', 'createTime': 1774599611156, 'updateTime': 1775786859785, 'deptId': 114, 'userId': 203}, {'id': 9, 'terminal': '1', 'type': 1, 'title': '测试协议', 'content': '

    测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议测试协议

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '145', 'updater': 'joyhub', 'createTime': 1774404487857, 'updateTime': 1774404497348, 'deptId': 1, 'userId': 145}, {'id': 5, 'terminal': '1', 'type': 2, 'title': '昆仑山,横亘西疆,绵延千里,被誉为万山之祖、中华龙脉。雪峰巍峨,冰川如玉,终年银装素裹,在苍穹下静静矗立。', 'content': '

    测试环境一哈

    ', 'status': 1, 'lang': 'en', 'rankNum': 0, 'creator': '147', 'updater': '哇啦啦的哇', 'createTime': 1773107640496, 'updateTime': 1774598787925, 'deptId': 116, 'userId': 147}, {'id': 4, 'terminal': '1', 'type': 1, 'title': '用户测试协议1111', 'content': '

    飞机飞机艾佛啊

    ', 'status': 1, 'lang': 'de', 'rankNum': 0, 'creator': '147', 'updater': '147', 'createTime': 1773056002516, 'updateTime': 1773107141877, 'deptId': 116, 'userId': 147}, {'id': 6, 'terminal': '1', 'type': 1, 'title': '测试数据123', 'content': '

    124513515

    ', 'status': 1, 'lang': 'es', 'rankNum': 1, 'creator': '147', 'updater': '147', 'createTime': 1773110599081, 'updateTime': 1773220135616, 'deptId': 116, 'userId': 147}, {'id': 8, 'terminal': '1', 'type': 1, 'title': '测试多个隐私策略', 'content': '

    狗日饿啊缝纫机

    ', 'status': 1, 'lang': 'es', 'rankNum': 5, 'creator': '147', 'updater': '147', 'createTime': 1773111389179, 'updateTime': 1773220125716, 'deptId': 116, 'userId': 147}, {'id': 10, 'terminal': '1', 'type': 3, 'title': '鱼人语教学开始', 'content': '
  • Wralarrrrr!Wawalala!Wurrrrgl!
  • Mmmurlok mmmrrglllm!
  • Wrarararralalla!Wuuuu~
  • Glub-glub… Murloc ok!
  • ', 'status': 1, 'lang': 'en', 'rankNum': 11, 'creator': '203', 'updater': '203', 'createTime': 1774598987819, 'updateTime': 1774598987819, 'deptId': 114, 'userId': 203}, {'id': 12, 'terminal': '1', 'type': 5, 'title': '社区指南测试版本', 'content': '

    多见于平台用户协议、违规提示中,是互联网产品的标准用语。

    ', 'status': 1, 'lang': 'en', 'rankNum': 123, 'creator': '203', 'updater': '203', 'createTime': 1774835556936, 'updateTime': 1774835556936, 'deptId': 114, 'userId': 203}]}} +2026-05-06 15:57:27,373 [tid:14496 pid:26092] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 测试协议_1778054247, content: 这是测试协议内容_1778054247..., terminal: web, lang: de, rank_num: 247, status: 2 +2026-05-06 15:57:27,373 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:57:27,499 [tid:14496 pid:26092] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 27} +2026-05-06 15:57:27,509 [tid:14496 pid:26092] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 详情测试协议_1778054247, content: 详情测试协议内容_1778054247..., terminal: app, lang: ja, rank_num: 1247, status: 1 +2026-05-06 15:57:27,510 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:57:27,643 [tid:14496 pid:26092] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:57:27,652 [tid:14496 pid:26092] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 待更新协议_1778054247, content: 待更新协议内容_1778054247..., terminal: app, lang: de, rank_num: 2247, status: 1 +2026-05-06 15:57:27,652 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:57:27,777 [tid:14496 pid:26092] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 120146, 'msg': 'An enabled agreement with the same language and type already exists', 'data': None} +2026-05-06 15:57:27,785 [tid:14496 pid:26092] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 待删除协议_1778054247, content: 待删除协议内容_1778054247..., terminal: web, lang: ja, rank_num: 4247, status: 2 +2026-05-06 15:57:27,785 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:57:27,934 [tid:14496 pid:26092] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 28} +2026-05-06 15:57:27,935 [tid:14496 pid:26092] AgreementManage.py[line:60] INFO 删除协议 - agreement_id: 28 +2026-05-06 15:57:27,935 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除协议 =========== +2026-05-06 15:57:28,067 [tid:14496 pid:26092] AgreementManage.py[line:63] INFO 删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:57:28,076 [tid:14496 pid:26092] AgreementManage.py[line:35] INFO 创建协议 - type: 2, title: 批量删除协议1_1778054248, content: 批量删除协议内容1_1778054248..., terminal: app, lang: de, rank_num: 5248, status: 2 +2026-05-06 15:57:28,077 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:57:28,220 [tid:14496 pid:26092] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 29} +2026-05-06 15:57:28,221 [tid:14496 pid:26092] AgreementManage.py[line:35] INFO 创建协议 - type: 1, title: 批量删除协议2_1778054248, content: 批量删除协议内容2_1778054248..., terminal: app, lang: ja, rank_num: 6248, status: 2 +2026-05-06 15:57:28,222 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建协议 =========== +2026-05-06 15:57:28,345 [tid:14496 pid:26092] AgreementManage.py[line:49] INFO 创建协议响应: {'code': 0, 'msg': '', 'data': 30} +2026-05-06 15:57:28,348 [tid:14496 pid:26092] AgreementManage.py[line:74] INFO 批量删除协议 - agreement_ids: [29, 30] +2026-05-06 15:57:28,349 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除协议 =========== +2026-05-06 15:57:28,489 [tid:14496 pid:26092] AgreementManage.py[line:77] INFO 批量删除协议响应: {'code': 0, 'msg': '', 'data': True} +2026-05-06 15:57:28,501 [tid:14496 pid:26092] AgreementManage.py[line:88] INFO 导出协议Excel - 参数: {'type': '', 'title': '', 'content': '', 'status': ''} +2026-05-06 15:57:28,502 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 导出协议 Excel =========== +2026-05-06 15:57:28,650 [tid:14496 pid:26092] AgreementManage.py[line:91] INFO 导出协议Excel响应: +2026-05-06 15:57:28,792 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:28,970 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得app版本号管理分页 =========== +2026-05-06 15:57:29,117 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建app版本号管理 =========== +2026-05-06 15:57:29,260 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建app版本号管理 =========== +2026-05-06 15:57:29,399 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得app版本号管理 =========== +2026-05-06 15:57:29,545 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建app版本号管理 =========== +2026-05-06 15:57:29,687 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 更新app版本号管理 =========== +2026-05-06 15:57:29,830 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建app版本号管理 =========== +2026-05-06 15:57:29,975 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除app版本号管理 =========== +2026-05-06 15:57:30,116 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建app版本号管理 =========== +2026-05-06 15:57:30,250 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建app版本号管理 =========== +2026-05-06 15:57:30,417 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除app版本号管理 =========== +2026-05-06 15:57:30,559 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得导入app版本号管理模板 =========== +2026-05-06 15:57:30,715 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 导出app版本号管理 Excel =========== +2026-05-06 15:57:30,988 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:31,178 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理分页 =========== +2026-05-06 15:57:31,330 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:57:31,475 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:57:31,613 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理详情 =========== +2026-05-06 15:57:31,760 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:57:31,910 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 更新Banner管理 =========== +2026-05-06 15:57:32,045 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:57:32,181 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除Banner管理 =========== +2026-05-06 15:57:32,333 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:57:32,461 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 15:57:32,619 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除Banner管理 =========== +2026-05-06 15:57:32,865 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:33,034 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-05-06 15:57:33,176 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 15:57:33,322 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-05-06 15:57:33,508 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-05-06 15:57:33,671 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 15:57:33,838 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-05-06 15:57:34,021 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 15:57:34,167 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 15:57:34,303 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-05-06 15:57:34,439 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-05-06 15:57:34,569 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-05-06 15:57:34,846 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:35,179 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-05-06 15:57:35,341 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 15:57:35,518 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-05-06 15:57:35,689 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 15:57:35,862 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-05-06 15:57:36,027 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 15:57:36,168 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-05-06 15:57:36,341 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 15:57:36,483 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 15:57:36,624 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-05-06 15:57:36,761 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-05-06 15:57:36,917 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-05-06 15:57:37,259 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-05-06 15:57:37,412 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 15:57:37,568 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 15:57:37,716 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-05-06 15:57:37,891 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 15:57:38,026 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-05-06 15:57:38,196 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 15:57:38,344 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-05-06 15:57:38,489 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 15:57:38,624 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 15:57:38,762 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-05-06 15:57:38,910 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-05-06 15:57:39,047 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-05-06 15:57:39,291 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:39,586 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板分页 =========== +2026-05-06 15:57:39,730 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 15:57:39,864 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板详情 =========== +2026-05-06 15:57:39,997 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 保存运费模板信息(含规则与子表) =========== +2026-05-06 15:57:40,145 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 15:57:40,268 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-05-06 15:57:40,409 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 15:57:40,528 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-05-06 15:57:40,658 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除运费模板信息 =========== +2026-05-06 15:57:40,801 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 15:57:40,930 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 15:57:41,069 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除运费模板信息 =========== +2026-05-06 15:57:41,343 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:41,692 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-05-06 15:57:41,855 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-05-06 15:57:42,002 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:42,154 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:42,297 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-05-06 15:57:42,458 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:42,585 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-05-06 15:57:42,735 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:42,899 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-05-06 15:57:43,041 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:43,178 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-05-06 15:57:43,338 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:43,470 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-05-06 15:57:43,635 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:43,759 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 15:57:43,891 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-05-06 15:57:44,158 [tid:14496 pid:26092] Dlizhan_interface.py[line:71] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 15:57:44,292 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-05-06 15:57:44,445 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-05-06 15:57:44,584 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-05-06 15:57:44,724 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-05-06 15:57:44,874 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-05-06 15:57:45,158 [tid:14496 pid:26092] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/ContractManage.py b/dulizhan/test_case/TestCase/接口/SZPurchase/ContractManage.py deleted file mode 100644 index e69de29..0000000 diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py b/dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py deleted file mode 100644 index ebe8fb4..0000000 --- a/dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- - -import allure -import logging - -from zhyy.library.BusinessKw.SZPurchase.PurchaseOrderManage import PurchaseOrder - - -@allure.feature('深圳采购工作台采购订单页面') -class Test_purchase_order(object): - test_case = PurchaseOrder() - - def teardown_method(self): - logging.info("-----------------------------End-------------------------------") - - @allure.story("验证采购工作台采购订单页面列表查询") - def test_check_purchase_order_page(self): - purchase_order_code = 'PO251209048' # 采购单号 必填 - supplier_company_ids = ['334'] # 供应商id 非必填 - payment_status = '0' # 付款状态 非必填 - status = '0' # 采购单状态 非必填 - page_no = 1 # 页码 必填 - page_size = 10 # 每页条数 必填 - response_data = self.test_case.kw_zhyy_get_purchase_page_post( - note="采购工作台采购订单页面列表查询", - user='purchase', - order_sn=purchase_order_code, - supplier_company_ids=supplier_company_ids, - payment_status=payment_status, - status=status, - page_no=page_no, - page_size=page_size - ) - - # 断言检查 - assert response_data is not None, "响应数据不能为空" - assert 'code' in response_data, "响应数据中缺少code字段" - assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( - response_data.get('code'), response_data.get('msg', '未知错误')) - assert 'data' in response_data, "响应数据中缺少data字段" - assert response_data['data'] is not None, "响应数据中的data字段不能为空" - - # 如果传入了采购单号,检查返回的数据中是否包含该采购单号 - if purchase_order_code: - data = response_data.get('data', {}) - order_found = False - - # 检查返回的数据结构,可能包含列表或其他结构 - if isinstance(data, dict): - # 如果data是字典,可能包含records、list、data等字段 - records = data.get('records') or data.get('list') or data.get('data') or [] - if isinstance(records, list) and len(records) > 0: - # 检查列表中是否包含指定的采购单号 - for item in records: - if isinstance(item, dict): - order_sn = item.get('order_sn') or item.get('orderSn') or item.get('orderSn') - if order_sn == purchase_order_code: - order_found = True - break - elif isinstance(data, list): - # 如果data本身就是列表 - for item in data: - if isinstance(item, dict): - order_sn = item.get('order_sn') or item.get('orderSn') or item.get('orderSn') - if order_sn == purchase_order_code: - order_found = True - break - - if order_found: - logging.info("✓ 断言通过:返回的数据中包含采购单号 {}".format(purchase_order_code)) - else: - logging.warning("⚠ 警告:返回的数据中未找到采购单号: {},但接口调用成功".format(purchase_order_code)) - - logging.info("✓ 所有断言检查通过") - print("✓ 查询成功,响应数据: {}".format(response_data)) \ No newline at end of file diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py b/dulizhan/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py deleted file mode 100644 index e69de29..0000000 diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/__init__.py b/dulizhan/test_case/TestCase/接口/SZPurchase/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/index.py b/dulizhan/test_case/TestCase/接口/SZPurchase/index.py deleted file mode 100644 index 4db87c8..0000000 --- a/dulizhan/test_case/TestCase/接口/SZPurchase/index.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -import allure -import logging - -from zhyy.library.BusinessKw.SZPurchase.index import PurchaseIndex - - -@allure.feature('深圳采购工作台首页') -class Test_purchase_index(object): - # config = ReadConfig.ReadConfig() # 调用读取配置文件的方法类 - test_case = PurchaseIndex() - - def teardown_method(self): - logging.info("-----------------------------End-------------------------------") - - @allure.story("验证采购工作台待办任务与在办任务功能") - def test_check_todo(self): - get_purchase_data = self.test_case.kw_zhyy_get_todo(note="采购工作台首页待办任务PO与在办任务PO", user='purchase') diff --git a/dulizhan/test_case/run_tests.py b/dulizhan/test_case/run_tests.py index d1e9a8d..9cd9de0 100644 --- a/dulizhan/test_case/run_tests.py +++ b/dulizhan/test_case/run_tests.py @@ -46,8 +46,8 @@ def run_pytest(args_list): if is_jenkins and 'WORKSPACE' in env: # Jenkins环境下使用绝对路径 global ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR - ALLURE_RESULTS_DIR = os.path.join(env['WORKSPACE'], 'zhyy', 'test_case', 'reports', 'allure-results') - ALLURE_REPORT_DIR = os.path.join(env['WORKSPACE'], 'zhyy', 'test_case', 'reports', 'allure-report') + ALLURE_RESULTS_DIR = os.path.join(env['WORKSPACE'], 'dulizhan', 'test_case', 'reports', 'allure-results') + ALLURE_REPORT_DIR = os.path.join(env['WORKSPACE'], 'dulizhan', 'test_case', 'reports', 'allure-report') ensure_dirs() cmd = ['python', '-m', 'pytest'] + args_list diff --git a/zhyy/__init__.py b/zhyy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/BusinessKw/SZPurchase/ContractManage.py b/zhyy/library/BusinessKw/SZPurchase/ContractManage.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/BusinessKw/SZPurchase/PurchaseOrderManage.py b/zhyy/library/BusinessKw/SZPurchase/PurchaseOrderManage.py deleted file mode 100644 index 868f3a7..0000000 --- a/zhyy/library/BusinessKw/SZPurchase/PurchaseOrderManage.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: qiaoxinjiu -Email: qiaoxinjiu@sparkedu.com -Create Date: 2026/01/22 5:58 下午 -""" -import logging -import os -import sys - -# 添加项目根目录到 Python 路径,以便导入 base_framework 模块 -current_file_path = os.path.abspath(__file__) -project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../../../')) -if project_root not in sys.path: - sys.path.insert(0, project_root) - -from base_framework.public_tools import log -from base_framework.public_tools.my_faker import MyFaker -from base_framework.public_tools.runner import Runner -from base_framework.public_tools.pgsqlhelper import PgSqlHelper -from base_framework.public_tools import read_config -from base_framework.public_tools import utils -from base_framework.public_tools import mg_keyword -from zhyy.library.ZZYY_interface import ZhyyInterface - -obj_get_log = log.get_logger() -obj_my_faker = MyFaker() -obj_runner = Runner() -obj_pgsql_helper = PgSqlHelper() -obj_get_way = utils.Tools() -obj_mg_keyword = mg_keyword.ManageKeyWord() - - -class PurchaseOrder(ZhyyInterface): - def __init__(self): - ''' - 这个是针对于读取配置文件的初始化函数,用于读取默认参数 - ''' - super().__init__() - self.config_index_path = os.path.dirname(os.path.abspath(__file__)) - self.config_index_filePath = os.path.join(self.config_index_path, "purchase.ini") - self.config_index_content = read_config.ReadConfig(filename=self.config_index_filePath) - - def kw_zhyy_get_purchase_page_post(self, note, user, **kwargs): - """ - | 功能说明: | 返回采购工作台采购单列表数据 | - | 输入参数: | note | 注释 | - |user | 用户信息,传入 'purchase' 默认读取配置文件里面 'purchase' 对应的默认账号信息| - |supplier_company_ids | 供应商id | 非必填 - |payment_status | 付款状态 | 非必填 - |status | 采购单状态 | 非必填 - |order_sn | 采购单号 | 非必填 - |page_no | 页码 | 必填 - |page_size | 每页条数 | 必填 - | 返回参数: | {"success":true,"message":"success","code":200,"data": - {'todoTask':['PO260116003','PO260115010'],'inProcessTask':['PO260116003','PO260115010']}} | | - | 作者信息: | 谯新久 | 修改时间 | 2022-8-20 | - """ - logging.info("==========={0}===========".format(note)) - # 获取所有参数 - supplier_company_ids = kwargs.get("supplier_company_ids") - payment_status = kwargs.get("payment_status") - status = kwargs.get("status") - order_sn = kwargs.get("order_sn") - page_no = kwargs.get("page_no") - page_size = kwargs.get("page_size") - - # 检查必填参数 - if not page_no or not page_size: - raise Exception("页码和每页条数不能为空") - - # 组装参数字典,只包含非空字段,参数名使用 pageNo 和 pageSize - request_params = { - "pageNo": page_no, - "pageSize": page_size - } - - # 如果字段不为空,才添加到参数字典中 - if supplier_company_ids is not None and supplier_company_ids != "": - request_params["supplier_company_ids"] = supplier_company_ids - if payment_status is not None and payment_status != "": - request_params["payment_status"] = payment_status - if status is not None and status != "": - request_params["status"] = status - if order_sn is not None and order_sn != "": - request_params["order_sn"] = order_sn - - # 使用 ** 方式解包字典传递参数 - get_todo_info = self.kw_in_zhyy_purchase_order_page_post(user=user, **request_params) - print(get_todo_info if get_todo_info else "查询失败") - return get_todo_info - - -if __name__ == '__main__': - test = PurchaseOrder() - a = test.kw_zhyy_get_purchase_page_post(user='purchase', note="测试", page_no=1, page_size=10) - print(a) diff --git a/zhyy/library/BusinessKw/SZPurchase/PurchasePlanManage.py b/zhyy/library/BusinessKw/SZPurchase/PurchasePlanManage.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/BusinessKw/SZPurchase/__init__.py b/zhyy/library/BusinessKw/SZPurchase/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/BusinessKw/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38.pyc b/zhyy/library/BusinessKw/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38.pyc deleted file mode 100644 index e0eafa84504e1665e82e766bea600975b2adec96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3594 zcmb7H-E-T<5eGn!1R+u%w(Qz<;xM#hRWlMztFaCHd0jAhg=ejx z2&@e$AtdC)au`J_yb^8kR3kAyhN2Z-4^;%{m641>IWZr_Kc#KCOXrbX5qLVXXvPZ( zCBgWx*w;??^pU69|L}avVrk3@EetljPEkPR@kI$ z;yIKkZ?164*HO<5r))ueKwm)Xfxd_~l($09OK4*`3GK_@=k&OqIKk-&v}q=!q|i3K zJ1_i#$0?Ko`|W6Z?iIa9@74SCb^7`_QQ3h8(2f}%<`WKbgZu{t-LEFA zch3ZKr{o3<&F!Cxr_(z-e}g;;nf3%U(YH%)X?cW!jlAnw7UQ}OOdOmve}K$lQ-oP` zHEUbr26YL0u3$Lj+9D2v|NP8wJgfgSyw-ymf&m$262D~P7!9g zafXW%k`mHGx_E+9#92<{lrXGHm?RE(ID15M&^uU1I17O4Jd_W^ONVvd0^)KrT$!(M zJm(6zP+4R&>;k+hyw9moCQCk-i|Twu08Px5b6p_EbYYHK#PtwNDta_>IoW#ZPkvRs z``g;(#m2{{g2j8)`{(M54}$rNjgxcBj}~edXR8lxFMo0(ICU-f&6(ir#bEYP?ZU0E z9-du3e`Ce?!R7kG7s32T(A61vDqd`TT-vYwTzsX30S-sJu{rjL$ILDI*Zf`;AUf@WzGr~nSb zn&;ZXE^^#vziAxC8ZM1}*K-UDInKVLV+WOXZpYdTOY+-nkaV$x6A;@rcpV7{C(8Ur zejPuxagBAly*}ACyr^v)UW$!<@H&47;sP>szAX5Fg$issKU5CsaI{Q|j0*u5W}FCI zgmGcuqKpFsO-qb}BWXJ3OZboE$G9b=W^k3IB0yq;C=a$aE_nu zawC2huKHb;peN{Y;&%atyS*#0937-lDErCa^k?;%NA<;}+U0X!J^TbT$@-J?!Ie)N zv$OT3KLmHKS07ys=5MvcxeLLmOZCbPfNX7UA?ZIgTK(}agOk^rkZz7<*>Di~$=aW8 zG-gjfWltk$KfdQ642G~lYNzg0pHyleF2a7PJ}kq4$$|E!7)UnQuKCaH)|frpxb}H+ zwJGe(;Qo2ohb^C_UkCH8q1Oi94uZBmY_XzgAPgs4p{Q9U)zBRXtory03>IAYxuJv9 zxb|uAS7NKr3%19EUD2>$51M3>!29PWQJ0@=4z?YHHkPr;M%%rktSY<)J{B!wvtFwFUWT);nbF|mv$a)8s@|Q0!=QTi{_@THgMt#FF8ggF z(e@yC?k5}(=|=VFSz7z-dVTTp;EO-jm#z;+NfauF3B#HoqG65OBr?!8}ByhX{U!vXT5z4No}u zMG){-N?xKQNeTTdoC2bBV>Ic(H3L^2)(Q?uKnyAc1k4O!ZJ~yYyZ{{83K6kzs8uJV zPB24YmqdXV{uPPz@)E!54fTUGHMI6hdiErP5qe$I`x~xnSycQ@$7#`u>8(#v&oafVrp0t+$iTAlOL;c4 z+MJq%579MP@jt4SNTOL3?L(#aVE>SAHe9FlX3568XapiHxtg%yHB9lm3NI`BK-$|x o-M8sVJKq8#h5_Te6pHg(0r%ZPoL}=3BtF7^)TVc@4E#F&->!3>@Bjb+ diff --git a/zhyy/library/BusinessKw/SZPurchase/__pycache__/__init__.cpython-38.pyc b/zhyy/library/BusinessKw/SZPurchase/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 56ce41da931e1f40b27af505e42b74db69f8130a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 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 diff --git a/zhyy/library/CommonFun/__pycache__/contract_pair_check.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/contract_pair_check.cpython-38.pyc deleted file mode 100644 index b28df69c117f29bf372f7afb86abde3409e5390f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8950 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 diff --git a/zhyy/library/CommonFun/__pycache__/course_package_common.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/course_package_common.cpython-38.pyc deleted file mode 100644 index 8557aad0b955bd615a47d4a2c6296f2874621ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1323 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 diff --git a/zhyy/library/CommonFun/__pycache__/handle_aita.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/handle_aita.cpython-38.pyc deleted file mode 100644 index 4839ff131d8e8461a28f76b26a9125612c552bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3934 zcmZu!TW=f36`q-$T`rdtCCjdZI&R9kg%hF`UH1mZO;RVZovL*i!^Jy9?nZh;bINNk#cb9Ha82N)*NKvqt$f?q#ip$mQMj zySH-pZaRpPE)kDE4kkCyvL?ES5o>J`If@_f4W}*JZrf8rIfu+%FO_@94tTq)JX}%A zy)W-S*c(Kz=__51ZuZca+UIB)sX{Rv;H_8e70+cB#ar3~)pl>zZeHIQZfdph@Uwe2 zH{#x=?&!UZ&(nTCO>Pg9jqOgN;wbF&Os6^6%l$CyB|Q^{75cb9$M|Tu;G{WQJ0U3T zp=P=H1Oo*zW46!6Y{HM&J|FXmID$=}-Al&Vk@wk@;(+oSP~7_rJ%qM$$d)GI^3tnk zaP2NmjNSQ(+U$h#Xm8=lqmP67^wGnl-i7nQ>*lm>Uxk^`^b+rNdj05@)~U{eY`8hlX*bF;P5RelOe8>YGnW46)^p7oB zM;(<{$T3v(buz^L6%vjF>6obDX##FunhKb^U?&{t_lU>`Iq#lAL|%box+FI%+e-=4;quU7hh2gq}c*s#dz`@>~8#%C-JLl8t=A_9J8h$&AW2y!h?@EtOgJgD*!R{^*nZtyua4Pt&i(l zC`Bkj0|kr8o%Q<DI5mrvys5}Mew2G%z)dZ0f>KdP;*t<5|b!_k@f-1;$QuPGhrPpSKi zPL$xoKgEL@(k43;0-YyOwy?f6yQZM1Z=yr#h1?9|$5AxUw}?z3V3u0lZi?)!*NHy2 zYXObZhNK)>+}6kLjM6JZ+$c)jRcq1!rVK!lTnafe-QwH{(@}9i&4%yu7?9}{LNA$Z z3}eA?^tZ%mjhaciJsi{rd#HAkU)N_$E5H5a)vL{H zyTOat=@hZkiBr|~vh5J>Q!!HC0SkXa%Sdh#3<4~QgQ=QZ4Su^((LcZrO+4#&sG~Zx zQ2VcFbeTGGEd3|y?ovlzKX#+lt*v1%V1b&A${-hxAP^w{SZ1iYFF0D5cg{@ie^mSx`Gi21 VQK?7Pg&R7x)s@u89~vL_{U3Y4Y6AcO diff --git a/zhyy/library/CommonFun/__pycache__/handle_harmonyos.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/handle_harmonyos.cpython-38.pyc deleted file mode 100644 index a58fde11b91bd0f3635d8dad5ccf16bef620bed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3031 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 diff --git a/zhyy/library/CommonFun/__pycache__/handle_login.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/handle_login.cpython-38.pyc deleted file mode 100644 index 1be6c0cc17a1a308e4533fbf30de09d32f9020e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6564 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 diff --git a/zhyy/library/CommonFun/__pycache__/statistical_function.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/statistical_function.cpython-38.pyc deleted file mode 100644 index ae45bf161cc7849ba9b494c5a6bc16fa71165241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3439 zcmdT`&2Jk;6rYdX^?GBcX(??$1q$WMX`2cVP^wZsT9p$Kv{Y2C%WAu`iJjQH&g{4$ z)*31rsVWj5ryLLmTYyA`;DQ85NZj}*=1N=WzrY3Fn@v(DINZCdoq6+S=IzYy{pQU( zS1x-5o@ahvnLWFkkUy|7{BUTz3Sasx6oLraB-Om8RchL-%HAM?3BE!EzsjmSvV^t3 zT>P+P(l4%D_N2p4Kc6om(ML5ztK z)NWK1Wih@&uF|Rp@(wX!R*+w(cUVB;9lh`PWGP#r}6f0C)Y1Ev( zL8J?o|9;`rv0CSn6t#1&pE*@)HZI9PF4s;btyU7l;%e#LwfeJbi=A#SYuEQ1aYOlj z0T+p;2zAWc-8W)?)9b@S+}QeqbBpkqjs5_FA{j-r1^(c@0@r?JGU;}C- z4*k}E^|-S7Hu@st1KzVts{k!)qvfu*GOLeXa$uHaWG|Ot4tNdh+L_&VVJ7W4nIrqE zm^s4B=v7Vu`gyNEmeB#F&uOPI7bi06 z?x-E9P1UBRr(VITc0`lzUQ}JEE!Ez=XtYN%P#l?_>Xx2<<@lq=DtSv&Fzt2l&|J9r z%ay}-e*5O)!I?@)TS+^LwI!oKXvh37(vFDWzmaA#(md^4(ghi{n?V@qLYTDLNFFDR z0vXn|-Ik45Nek?1CuoB$Q7K6Dn=T^D{C1$~+EUT`N{*^1^r4=k3Vm0w3`i#5Ljqle5gF-w8?&It%sP$M7@=@_1qT{gojtIS zH5OgJa{J5cc$#xQb?s?vXy*Gfl`+kdR9j0ya{AevGuq-gIRz7u`zZux z2v)n%Pi&G|P?xC7_R#L5qx`dJ5u0KjG7M>D{Bj;Yi9cxXuD7|jV)5DdLx;w7J{Fzu*7!eX=qRjN7C+8qM22(ZG5 zF-P+qBgzA?CT&AFluA}WHn3K#{45mm@oBYS4n?;PKgg#c*M=BB-s-4^zhV7l=v{-* zGQ^(v$KePie7yVEC} z%|YM7>K#a^wR;Ycmj`k9X3XVFpnDU(?YVkj6wq5t-vdY^IKxPrOMeY$XWF#3!`eaI z{vYdc1SHQRwuSl_n7R1BP>EfaRJfx zX6aqH@Z8G!kQVN~1O+j{(8Ykrx=(ILu+5V<>HWJT)E*XnqD}pp!$P=i44U4;rHxl|;Vpfc2(8MTMXTg2g-RVx?%cxgm u)QrGIwE|$XU$OIOY2x8?>lWneD2=eM-Q)QdPN2ICKM@Rab=BSYtsvZpb_;SSjJWYa2nn(c^j zY$l1PL5Gg|vLrOH`{JE5BV$E4#n|Yn56_I{bLWL2rpHcOg@R?CEt+s8_3%p;J;{0a8wOE4-zX3|?!e#1G(5XupnJ4?D zvK)-auFPnK0tj;PEEtLd@{(0@Y-$Jt{m)!f-1lr4)-)XSuiJtQa6M!rZaKNnE>C|&UBs!qusE) z0_2dLFw6^F2X_{X(8hi^qK)JvQH{h%AG!2eCkQWHlf~(+g5GPB$#H1lMUkrEdU$zx z5H62|0?)ufrj)6<7g{p3QY->3%>lZZ1z21p7_~SGCfd;$@TTWAS?J?rIQ8 zNGR<&BU6Sj3W*S$k*#jQouV+eIszVSpvxOUl+jemqp71n;i@o9W)-|BesiYd$&jtk zzZ-!L$Mh2C7sHN1&dfPYi1D@P#(7^S2{%`xpI(Kzb{vEh?IRleRIGsdrPsRSYaa>=}7J< zA_;jf`q4~O@Tt6!_w44@g|C`LkAkNn7{`c^U59op;1a=N~|BG3N=ni zFpg&^7&%kd8#o=#mc&mqgnJL@;s6R96mNm>B2xka{6BZ~wBzATP9UcRybvcE-Sw_U F{sA%=BryO0 diff --git a/zhyy/library/CommonFun/__pycache__/user_common.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/user_common.cpython-38.pyc deleted file mode 100644 index 113f9e6abff2fb6c7a69a40570078ded77ec69b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11528 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 diff --git a/zhyy/library/CommonFun/asset_common.py b/zhyy/library/CommonFun/asset_common.py deleted file mode 100644 index 995fef0..0000000 --- a/zhyy/library/CommonFun/asset_common.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding:utf-8 -*- - -""" -Author: 陈江 -Email: chenjiang@huohua.cn -Create Date: 2022/03/03 11:25 下午 -""" -from base_framework.public_tools import log -from base_framework.public_tools.sqlhelper import MySqLHelper - -obj_log = log.get_logger() -obj_my_sql_helper = MySqLHelper() - -class AssetCommon: - def __init__(self): - pass - - def get_course_package_info_by_name(self, course_package_name): - """ - 功能:根据套餐名称获取套餐基本信息 - | 输入参数: | course_package_name string | 套餐名称 | - """ - sql = "SELECT id,code,name,price FROM `peppa`.`course_package` WHERE `name`='{}';".format(course_package_name) - return obj_my_sql_helper.select_one(sql) - - def get_order_info_V2(self, **where_condition): - # user_id = None, course_package_id = None, course_id = None, business_line_type = None, order_id = None, order_code = None - ocp = ['user_id', 'business_line_type', 'order_id', 'order_code', 'status'] - sprl = ['course_package_id', 'course_id'] - where_str = None - for k in where_condition.keys(): - t = '' - if k in sprl: - t = 'sprl' - else: - t = 'ocp' - - if not where_str: - where_str = '{}.{}=\'{}\''.format(t, k, where_condition.get(k)) - else: - where_str = '{} AND {}.{}=\'{}\''.format(where_str, t, k, where_condition.get(k)) - if not where_str: - obj_log.error('参数必填') - return False - sql = "SELECT ocp.id as order_id,ocp.code,ocp.audit_status,ocp.status as order_status,ocp.user_id,ocp.user_address_id,ocp.business_line_type,sprl.course_package_id,sprl.course_id,sprl.subscribe_id,sprl.valid as subscribe_pre_valid,sprl.id as subscribe_pre_id FROM order_center.order_course_package ocp LEFT JOIN order_center.subscribe_pre_create_log sprl ON ocp.id=sprl.order_id WHERE {} ORDER BY ocp.id DESC LIMIT 1".format( - where_str.replace('order_id', 'id')) - obj_log.info(sql) - return obj_my_sql_helper.select_one(sql) - - -if __name__ == '__main__': - user_common_obj = AssetCommon() - print(user_common_obj.get_order_info(**{'order_id': 1193182, 'business_line_type': '1', 'status': 100})) - - - - diff --git a/zhyy/library/CommonFun/contract_pair_check.py b/zhyy/library/CommonFun/contract_pair_check.py deleted file mode 100644 index 5ef4fd8..0000000 --- a/zhyy/library/CommonFun/contract_pair_check.py +++ /dev/null @@ -1,240 +0,0 @@ -# -*- coding:utf-8 -*- -# @Time : 2023/3/7 13:28 -# @Author: luozhipeng -# @File : contract_pair_check.py -import os -import sys -input_team_name = sys.argv - -BASIC_PATH = os.path.dirname(os.path.abspath(__file__)) -TEAM_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../../{}'.format("base_framework"))) -sys.path.append(TEAM_PATH) -PROJECT_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../..')) -sys.path.append(PROJECT_PATH) -from base_framework.public_tools.sqlhelper import MySqLHelper -from base_framework.public_tools.utils import Tools -import requests -import re -import json -import pymysql - -obj_my_sql_helper = MySqLHelper() - - -class ContractPairCheck(): - def __init__(self): - pass - - def get_unfinished_interface(self): - sql_get_interface = "SELECT distinct (x.con_url) 提供方接口,x.pro_url 消费方接口,x.con_method 提供方请求方式,x.con_server 提供方服务,x.pro_server 消费方服务,x.at_num 自动化接口数 FROM sparkatp.contract_pair x WHERE x.at_num =0 and x.status =1 and x.con_server in (select si.server_name from sparkatp.swagger_info si where si.team in ('ubrd','GUE') and access_type IN (2)) and x.pro_server not in (select si.server_name from sparkatp.swagger_info si where si.team ='ubrd' and access_type IN (2)) and x.roles = 0 order by x.pro_server,x.con_url" - unfinished_interface = obj_my_sql_helper.select_all(sql_get_interface) - return unfinished_interface - - def send_reshult(self): - - headers = {"Content-Type": "application/json;charset=UTF-8"} - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/9f3556b7-cb60-44bf-adbf-24b5b2552014" - - contract_pair_intf = self.get_unfinished_interface() - if len(contract_pair_intf) != 0: - message_data = {"msg_type": "text", "content": {'text': '未完成自动化的契约对接口{}'.format(contract_pair_intf)}} - - rsp = requests.post(url=web_hook, json=message_data, headers=headers) - - -class AutoInterfaceCheck(): - def __init__(self): - pass - - def get_unfinished_interface(self): - sql_get_interface = """select id,in_url from sparkatp.interface_info a WHERE( a.swagger_id in (SELECT id FROM sparkatp.swagger_info WHERE team in ("UBRD","GUE") and access_type not IN (0)) ) AND a.created_time > "2023-01-01 00:00:50" AND is_used = 1 and (case_numbers IS NULL or case_numbers='') and offline=0 and jira_id is null order by created_time """ - unfinished_interface_list = obj_my_sql_helper.select_all(sql_get_interface) - return unfinished_interface_list - - def get_interface_jira(self,interface): - sql_req_time = "select max(created_time) created_time from sparkatp.request_parameters rp where rp.interface_id ={}".format( - interface["id"]) - req_max_time = obj_my_sql_helper.select_one(sql_req_time)['created_time'] - sql_rep_time = "select max(created_time) created_time from sparkatp.response_parameters rp where rp.interface_id ={}".format( - interface["id"]) - rep_max_time = obj_my_sql_helper.select_one(sql_rep_time)['created_time'] - if rep_max_time and req_max_time: - if rep_max_time <= req_max_time: - sql_req_jira = "select distinct (jira_id) from sparkatp.request_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( - interface["id"], req_max_time) - interface_jira = obj_my_sql_helper.select_one(sql_req_jira)["jira_id"] - else: - sql_rep_jira = "select distinct (jira_id) from sparkatp.response_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( - interface["id"], rep_max_time) - interface_jira = obj_my_sql_helper.select_one(sql_rep_jira)["jira_id"] - elif rep_max_time and not req_max_time: - sql_rep_jira = "select distinct (jira_id) from sparkatp.response_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( - interface["id"], rep_max_time) - interface_jira = obj_my_sql_helper.select_one(sql_rep_jira)["jira_id"] - elif not rep_max_time and req_max_time: - sql_req_jira = "select distinct (jira_id) from sparkatp.request_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( - interface["id"], req_max_time) - interface_jira = obj_my_sql_helper.select_one(sql_req_jira)["jira_id"] - return interface_jira - - def send_result(self): - unfinished_interface_list = self.get_unfinished_interface() - for interface in unfinished_interface_list: - interface['jira'] = self.get_interface_jira(interface) - if not interface['jira']: - interface['qa'] = None - else: - interface['qa'] = self.get_jira_qa(interface['jira']) - headers = {"Content-Type": "application/json;charset=UTF-8"} - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/9f3556b7-cb60-44bf-adbf-24b5b2552014" - if len(unfinished_interface_list) != 0: - message_data = {"msg_type": "text", "content": {'text': 'QA公共环境未完成自动化的接口{}'.format(unfinished_interface_list)}} - rsp = requests.post(url=web_hook, json=message_data, headers=headers) - - def get_jira_qa(self,jira): - try: - conn = pymysql.connect(host='10.250.200.53',user='root',password='peppa@test',database='tools',charset="utf8",port=3306) - except : - raise pymysql.OperationalError("连接数据库失败") - cn =conn.cursor() - sql = "SELECT tester FROM tools.tm_project where jira_number = '{}'".format(jira) - cn.execute(sql) - qa = cn.fetchall() - cn.close() - conn.close() - if qa: - return qa[0][0] - else: - return None - - -class CoverageCheck(): - - # 连接数据库 - @staticmethod - def get_select(sql): - try: - conn = pymysql.connect(host='10.250.200.53', user='root', password='peppa@test', database='tools', - charset="utf8", port=3306) - except: - raise pymysql.OperationalError("连接数据库失败") - cn = conn.cursor() - cn.execute(sql) - res = cn.fetchall() - cn.close() - conn.close() - return res - - # 获取未搜集覆盖率的项目 - @staticmethod - def get_unfinished_coverage(): - start_time = Tools().get_format_date(r_type=15, add_days=-2) - end_time = Tools().get_format_date(r_type=16, add_days=-1) - - # 查询最近一天上线有后端代码变动,需要搜集覆盖率项目 - need_sql = """SELECT env FROM tools.project_plan WHERE ID IN - (SELECT project_id FROM tools.project_tester WHERE tester IN ("陈洁","陈江","罗志鹏","谯新久","刘涛婷")) - AND status IN (14) AND rd_code_add_line>0 AND (it_start_date IS NOT NULL OR qa_start_date IS NOT null) - AND online_date BETWEEN '{}' AND '{}'""".format(start_time, end_time) - need_coverage_list = CoverageCheck().get_select(need_sql) - - # 查询已搜集覆盖率项目 - sql_implemented_sql = '''SELECT `env_name` FROM `sparkatp`.`build_jacoco` WHERE `team` = 'UBRD' AND `status` = '1' - AND `is_delete` = '0' AND `is_pass` = '1' ''' - completed_coverage_list = obj_my_sql_helper.select_all(sql_implemented_sql) - - unfinished_coverage_list = [] - for item1 in range(0, len(need_coverage_list)): - unfinished_coverage_list.append(need_coverage_list[item1][0]) - - # 返回未搜集覆盖率的项目 - for item in completed_coverage_list: - completed_jira = item["env_name"] - if completed_jira in unfinished_coverage_list: - unfinished_coverage_list.remove(completed_jira) - # 根据unfinished_coverage_list 查jira_name - jira_name_list = [] - for item in unfinished_coverage_list: - env_name = item - sql = """SELECT jira_number FROM tools.project_plan WHERE env='{}'""".format(env_name) - jira_name = CoverageCheck().get_select(sql) - jira_name_list.append(jira_name[0][0]) - return jira_name_list - - # 获取未构建基线用例项目 - @staticmethod - def get_not_bulid_jira(): - start_time = Tools().get_format_date(r_type=15, add_days=-2) - end_time = Tools().get_format_date(r_type=16, add_days=-1) - - # 返回有后端变动的jira (有后端代码变更&上线时间在3天内 + jira存在服务变更,项目状态为sim测试) - need_sql = """SELECT env FROM tools.project_plan WHERE - ID IN (SELECT project_id FROM tools.project_tester WHERE tester IN ("陈洁","陈江","罗志鹏","谯新久","刘涛婷")) - AND status IN (14) AND rd_code_add_line>0 AND online_date BETWEEN '{}' AND '{}' - AND qa_start_date IS NOT NULL UNION SELECT env FROM tools.project_plan WHERE ID IN (SELECT project_plan_id - FROM tools.project_plan_server) AND jira_number IN (SELECT jira_number FROM tools.tm_project WHERE status - IN (12) AND `tester` IN ("陈洁","陈江","罗志鹏","谯新久","刘涛婷") AND test_qa_time_consume>0)""".format(start_time, - end_time) - - need_build_list = CoverageCheck().get_select(need_sql) - - # 返回有构建基线用例jira - built_sql = """SELECT DISTINCT special_env FROM sparkatp.build_info WHERE run_type=2 AND team='UBRD' AND STATUS=2""" - built_list = obj_my_sql_helper.select_all(built_sql) - - not_bulit_list = [] - # 取出有后端改动得jira - for item1 in range(0, len(need_build_list)): - not_bulit_list.append(need_build_list[item1][0]) - - # 返回未构建基线用例jira - for item in built_list: - completed_jira = item["special_env"] - if completed_jira in not_bulit_list: - not_bulit_list.remove(completed_jira) - jira_name_list = [] - for item in not_bulit_list: - env_name = item - sql = """SELECT jira_number FROM tools.project_plan WHERE env='{}'""".format(env_name) - jira_name = CoverageCheck().get_select(sql) - jira_name_list.append(jira_name[0][0]) - return jira_name_list - - # 发送消息 - def send_result(self, type=1): - if type == 1: - jira_list = self.get_unfinished_coverage() - elif type == 2: - jira_list = self.get_not_bulid_jira() - - send_list = [] - for item in jira_list: - send_dict = {} - send_dict["jira"] = item - qa_list = AutoInterfaceCheck().get_jira_qa(item) - send_dict["qa"] = qa_list - send_list.append(send_dict) - - headers = {"Content-Type": "application/json;charset=UTF-8"} - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/b6bf33ae-4239-4bef-a8a8-21896e0d1ba1" - if len(jira_list) != 0: - if type == 1: - message_data = {"msg_type": "text", - "content": {'text': '未搜集覆盖率已上线项目{}'.format(send_list)}} - rsp = requests.post(url=web_hook, json=message_data, headers=headers) - elif type == 2: - message_data = {"msg_type": "text", - "content": {'text': '未构建基线用例已上线项目{}'.format(send_list)}} - rsp = requests.post(url=web_hook, json=message_data, headers=headers) - - -if __name__ == '__main__': - A = ContractPairCheck() - A.send_reshult() - B = AutoInterfaceCheck() - # B.get_unfinished_interface() - # B.get_jira_qa(jira = 'PLATFORM-31791') - B.send_result() - C = CoverageCheck() - C.send_result(type=1) - C.send_result(type=2) \ No newline at end of file diff --git a/zhyy/library/CommonFun/course_package_common.py b/zhyy/library/CommonFun/course_package_common.py deleted file mode 100644 index fe4694a..0000000 --- a/zhyy/library/CommonFun/course_package_common.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding:utf-8 -*- - -""" -Author: 罗志鹏 -Email: luozhipeng@huohua.cn -Create Date: 2022/03/03 11:25 下午 -""" -from base_framework.public_tools import log -from base_framework.public_tools.sqlhelper import MySqLHelper - -obj_log = log.get_logger() -obj_my_sql_helper = MySqLHelper() - -class CoursePackageCommon: - def __init__(self): - pass - - def get_course_package_info_by_name(self, course_package_name): - """ - 功能:根据套餐名称获取套餐基本信息 - | 输入参数: | course_package_name string | 套餐名称 | - """ - sql = "SELECT id,code,name,price FROM `peppa`.`course_package` WHERE `name`='{}';".format(course_package_name) - return obj_my_sql_helper.select_one(sql) -if __name__ == '__main__': - user_common_obj = CoursePackageCommon() - user_common_obj.get_course_package_info_by_name('测试杰拉德0325-火花-直播逻辑思维') - - - - diff --git a/zhyy/library/CommonFun/drawPicture.py b/zhyy/library/CommonFun/drawPicture.py deleted file mode 100644 index 1165be7..0000000 --- a/zhyy/library/CommonFun/drawPicture.py +++ /dev/null @@ -1,31 +0,0 @@ -import matplotlib.pyplot as plt -import matplotlib - -# 设置字体为支持中文的字体(如SimHei) -matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统 -# matplotlib.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # macOS系统 -matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 - -# 数据 -categories = ['供应链', '天窗', 'cc', 'la', '题库', '练测', '教务', '教师', '基础', '学生端', '家长端', '活字', '转介绍'] -values = [8, 4, 13, 20, 11, 2, 22, 10, 1, 1, 14, 1, 17] - -# 创建柱状图 -plt.figure(figsize=(10, 6)) -bars = plt.bar(categories, values, color='skyblue') - -# 添加标题和标签 -plt.title('各类别数量统计', fontsize=16) -plt.xlabel('类别', fontsize=12) -plt.ylabel('数量', fontsize=12) -plt.xticks(rotation=45, ha='right') # 旋转X轴标签 - -# 在每个柱子上方显示数量 -for bar in bars: - height = bar.get_height() - plt.text(bar.get_x() + bar.get_width() / 2, height, str(height), - ha='center', va='bottom', fontsize=10) - -# 显示图表 -plt.tight_layout() -plt.show() \ No newline at end of file diff --git a/zhyy/library/CommonFun/env_check.ini b/zhyy/library/CommonFun/env_check.ini deleted file mode 100644 index e1a6cb1..0000000 --- a/zhyy/library/CommonFun/env_check.ini +++ /dev/null @@ -1,7 +0,0 @@ -[QA] -check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] - - - -[SIM] -check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] \ No newline at end of file diff --git a/zhyy/library/CommonFun/env_check.py b/zhyy/library/CommonFun/env_check.py deleted file mode 100644 index dc696c7..0000000 --- a/zhyy/library/CommonFun/env_check.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- coding:utf-8 -*- - -""" -Author: 罗志鹏 -Email: luozhipeng@huohua.cn -Create Date: 2022/07/25 11:25 下午 -""" - -import requests -import re -import json - - - - -class EnvCheck(): - def __init__(self): - self.container_ip_list = [] - - - - def get_env_container_ip(self,env): - dis_server =[] - dis_ip = [] - headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding':'gzip, deflate, br'} - if env =='QA': - req = requests.get(url="http://eureka.qa.huohua.cn/",headers=headers) - elif env == 'SIM': - req = requests.get(url="http://eureka.sim.huohua.cn/", headers=headers) - else: - raise RuntimeError("环境选择异常") - req_list =req.text.split('tbody') - # print(req_list[1]) - server_str_list = req_list[1].split('') - check_list = self.get_check_lsit(env=env) - - for server in check_list: - if req.text.find(server) ==-1: - dis_server.append(server) - - - for i in check_list: - for str_ser in server_str_list: - if str_ser.find(i) != -1: - dict_sever = {} - # ip_list = [] - str_sername_start = '' - str_sername_end = '' - server_name = str_ser[str_ser.find(str_sername_start) + 7:str_ser.find(str_sername_end)] - ip_list = re.findall(r'[a-z]://(.*?):8080', str_ser) - dict_sever[server_name] = ip_list - # print(dict_sever) - for ip_ch in ip_list: - url_check = "http://"+ip_ch+':8080/actuator/health' - resp = requests.get(url=url_check) - # print(resp.json()) - if resp.json()['status'] != 'UP': - dict_ip = {server_name:ip_ch} - dis_ip.append(dict_ip) - return dis_ip,dis_server - - - # re_list = [] - # server_list = [] - # for str_ser in server_check_list: - # print(str_ser) - - # print(server_name) - - # pattern = re.compile(r'') - # str_server = pattern.search(str_ser) - # server_name = str_ser[str_ser.start():str_ser.end()] - # print(server_name) - # for server in check_list : - # for string_server in server_list: - # if string_server.find(server)!= -1: - # # print(string_server.find(server)) - # re_list.append(string_server) - - # print(re_list) - # ip_list = [] - # for string_server in re_list : - # if string_server.find('http://'): - # pattern = re.compile(r'[a-zA-z]+://[^\s]*:8080') - # str_ip = pattern.search(string_server) - # # print(str_ip.start()) - # url = string_server[str_ip.start():str_ip.end()] - # print(url) - - def send_result(self): - dis_ip,dis_server = self.get_env_container_ip(env='SIM') - at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}] - - message_data_SIM_server = {"msg_type": "text", "content": {'text':'SIM服务未找到部署IP{}'.format(dis_server)}} - message_data_SIM_IP = {"msg_type": "text", "content": {'text':'SIM服务部署IP不可用{}'.format(dis_ip)}} - - headers = {"Content-Type": "application/json;charset=UTF-8"} - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/28b775e7-a863-4807-b280-c82e09be0a80" - if len(dis_server) != 0: - json_data = json.dumps(message_data_SIM_server) - rsp = requests.post(url=web_hook, json=message_data_SIM_server, headers=headers) - - if len(dis_ip) != 0: - json_data = json.dumps(message_data_SIM_IP) - rsp = requests.post(url=web_hook, json=message_data_SIM_IP, headers=headers) - dis_ip,dis_server = self.get_env_container_ip(env='QA') - message_data_QA_server = {"msg_type": "text", "content": {'text':'QA服务未找到部署IP{}'.format(dis_server)}} - message_data_QA_IP = {"msg_type": "text", "content": {'text':'QA服务部署IP不可用{}'.format(dis_ip)}} - - if len(dis_server) != 0: - json_data = json.dumps(message_data_QA_server) - rsp = requests.post(url=web_hook, data=json_data, headers=headers) - if len(dis_ip) != 0: - json_data = json.dumps(message_data_QA_IP) - rsp = requests.post(url=web_hook, json=message_data_QA_IP, headers=headers) - - - - - - def get_check_lsit(self,env): - if env == 'QA': - check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] - return check_list - if env == 'SIM': - check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] - return check_list - - - - -if __name__ == '__main__': - # o ='"http://10.251.187.248:8080/actuator/info" "http://10.251.187.248:8080/actuator/info"' - # i =re.findall(r'[a-z]://(.*?):8080',o) - # print(a) - A=EnvCheck() - A.send_result() - - - - diff --git a/zhyy/library/CommonFun/handle_aita.py b/zhyy/library/CommonFun/handle_aita.py deleted file mode 100644 index a3951b9..0000000 --- a/zhyy/library/CommonFun/handle_aita.py +++ /dev/null @@ -1,141 +0,0 @@ -# encoding: UTF-8 -import time -import subprocess -from subprocess import PIPE,Popen -import os - - -class OSType: - WIN, LINUX, UNKNOWN = range(3) - - def __init__(self): - pass - - @staticmethod - def get_type(): - import platform - system_name = platform.system() - if system_name.lower() == 'windows': - return OSType.WIN - elif system_name.lower() == 'linux': - return OSType.LINUX - else: - return OSType.UNKNOWN - - -class tool(object): - def __init__(self): - self.env_port = 5011 - - def run_process(self, cmd_str, out_p=False): - """ - run command - cmd_str unicode string. - """ - if OSType.WIN == OSType.get_type(): - # cmd_str = cmd_str.encode('gbk') - cmd_str = cmd_str - elif OSType.LINUX == OSType.get_type(): - cmd_str = cmd_str.encode('utf-8') - else: - raise RuntimeError("your os is not support.") - close_fds = False if OSType.WIN == OSType.get_type() else True - if out_p: - p = subprocess.Popen(cmd_str, shell=True, close_fds=close_fds, stdout=PIPE) - p.wait() - return p.returncode, p.stdout.read() - else: - c = self.get_devnull() - p = subprocess.Popen(cmd_str, shell=True, close_fds=close_fds, stdout=c) - # for line in p.stdout.readline(): - # print(line) - # p.stdout.close() - p.communicate() - return p.returncode, None - - def adb_cmd(self,cmd): - process = Popen(cmd, shell=True, stderr=PIPE, stdout=PIPE) - (stdout, stdrr) = process.communicate() - stdout = stdout.decode('gbk') # 返回字段中存在中文,使用gbk - - return stdout, stdrr - - def get_devnull(self): - try: - return subprocess.DEVNULL - except AttributeError: - # Python 2.x or older - return open(os.devnull, 'r+') - - def _kills_pid(self): - if OSType.WIN == OSType.get_type(): - kill_pid_cmd = "taskkill /f /pid {}".format(self.pid) - elif OSType.LINUX == OSType.get_type(): - kill_pid_cmd = "kill -9 {}".format(self.pid) - else: - raise RuntimeError("your os is not support.") - - res_code, res_context = self.run_process(kill_pid_cmd) - if res_code: - raise RuntimeError("kill pid: {} failed. error: {}".format(self.pid, res_context)) - - def check_port(self): - if OSType.WIN == OSType.get_type(): - find_pid_win_cmd = 'netstat -ano | findstr {} | findstr LISTENING'.format(self.env_port) - print(find_pid_win_cmd) - res_code, res_context = self.run_process(find_pid_win_cmd, out_p=True) - if res_code == 0: - if len(res_context) > 0: - try: - self.pid = str(res_context).split()[-1].replace("\\r\\n'", "") - self._kills_pid() - except IndexError: - pass - - elif OSType.LINUX == OSType.get_type(): - find_pid_linux_cmd = "lsof -i:{}".format(self.env_port) - res_code, res_context = self.run_process(find_pid_linux_cmd, out_p=True) - if res_code == 0: - # 获取pid - if len(res_context) > 0: - try: - self.pid = str(res_context).split("\n")[1].split()[1] - self._kills_pid() - except IndexError: - pass - else: - raise RuntimeError("your os is not support.") - - def run_manage(self): - count = 3 - while count > 0: - self.run_manages() - find_pid_linux_cmd = "lsof -i:{}".format(self.env_port) - res_code, res_context = self.run_process(find_pid_linux_cmd, out_p=True) - print(res_code, "---res_code---", res_context, "---res_context---") - if len(res_context) > 0: - time.sleep(2) - pid = str(res_context).split("\n")[1].split()[1] - print(pid, "pid####") - count -= 1 - if pid: - break - else: - continue - else: - break - - def run_manages(self): - lod = "nohup python3 platform_tools/aida/manage.py &." - sh_lod = "./5011.sh" - - self.run_process(sh_lod) - # subprocess.call(["./5011.sh"]) - # self.run_process(lod) - - -if __name__ == '__main__': - test = tool() - test.check_port() - time.sleep(3) - test.run_manage() diff --git a/zhyy/library/CommonFun/handle_harmonyos.py b/zhyy/library/CommonFun/handle_harmonyos.py deleted file mode 100644 index 9836ccf..0000000 --- a/zhyy/library/CommonFun/handle_harmonyos.py +++ /dev/null @@ -1,105 +0,0 @@ -import os -import subprocess -from urllib.parse import urlparse -import argparse - - -class HarmonyAppInstaller: - def __init__(self) -> None: - self.project_path = os.getcwd() - self.temp_dir = os.path.join(self.project_path, "temp") - - def _run_command(self, command: str) -> str: - result = subprocess.run(command, shell=True, capture_output=True, text=True) - if result.returncode != 0: - raise Exception(f"Command failed: {command}\nError: {result.stderr}") - return result.stdout - - def install(self, appUniqId, packageId): - import requests - import os - import shutil - - # Create or clean temp directory - if os.path.exists(self.temp_dir): - shutil.rmtree(self.temp_dir) - os.makedirs(self.temp_dir) - - url = "https://api.qa.huohua.cn/api/versions" - - headers = { - 'Content-Type': 'application/json', - 'huohua-podenv': 'HHC-111781' - } - - params = { - 'version': '25.1.2.1', - 'platform': 'harmonyos', - 'appUniqId': appUniqId, - 'packageId': packageId - } - - response = requests.get(url, headers=headers, params=params) - response_data = response.json() - - if not response_data.get('success'): - raise Exception(f"API request failed: {response_data.get('message')}") - - app_version = response_data.get('data', {}).get('app_version', {}) - download_url = app_version.get('url') - - if not download_url: - raise Exception("No download URL found in response") - - # Get the filename from the URL - hap_filename = os.path.basename(urlparse(download_url).path) - if not hap_filename.endswith('.hap'): - hap_filename = 'eduparent.hap' # fallback name if URL doesn't end with .hap - - # Download the HAP file - hap_file_path = os.path.join(self.temp_dir, hap_filename) - download_response = requests.get(download_url, stream=True) - download_response.raise_for_status() - - with open(hap_file_path, 'wb') as f: - for chunk in download_response.iter_content(chunk_size=8192): - if chunk: - f.write(chunk) - - # Execute HDC commands - device_path = f"data/local/tmp/{hap_filename}" - - print(f'hdc file send "{hap_file_path}" "{device_path}"') - # Push HAP file to device - self._run_command(f'hdc file send "{hap_file_path}" "{device_path}"') - - try: - # Install HAP package - print(f'hdc shell bm install -p "{device_path}"') - self._run_command(f'hdc shell bm install -p "{device_path}"') - finally: - # Clean up: Remove HAP file from device - print(f'hdc shell rm -rf "{device_path}"') - self._run_command(f'hdc shell rm -rf "{device_path}"') - - return hap_file_path - - -def main(): - parser = argparse.ArgumentParser(description='Install HarmonyOS application') - parser.add_argument('--app-uniq-id', required=True, help='Unique ID of the application') - parser.add_argument('--package-id', required=True, help='Package ID for the application') - - args = parser.parse_args() - - try: - installer = HarmonyAppInstaller() - hap_path = installer.install(args.app_uniq_id, args.package_id) - print(f"Successfully installed HAP from: {hap_path}") - except Exception as e: - print(f"Error: {str(e)}") - exit(1) - - -if __name__ == '__main__': - main() diff --git a/zhyy/library/CommonFun/handle_jenkins.py b/zhyy/library/CommonFun/handle_jenkins.py deleted file mode 100644 index a6247ee..0000000 --- a/zhyy/library/CommonFun/handle_jenkins.py +++ /dev/null @@ -1,257 +0,0 @@ -# -*- coding:utf-8 -*- -import sys -import xml.etree.ElementTree as ET -WORKSPACE = sys.argv[1] -sys.path.append(WORKSPACE) -import json -import requests -import os -import re -from bs4 import BeautifulSoup -from html.parser import HTMLParser - -handle_parser = HTMLParser() -BUILD_INFO = {} - - -class handle_to_jenkins(): - ''' - 处理关于jenkins的执行相关方法 - ''' - - def __init__(self): - self.dict_info = {} - self.list_info = [] - def GetJenkinsVar(self, key): - ''' - 获取jenkins上获得的参数信息 - ''' - try: - value = os.environ.get(key) - except Exception: - value = os.environ.get(key.upper()) - if (not value): - value = '' - return value - - def kw_to_get_dd_token(self, environment): - """ - 功能: 根据传入环境获取不同的token信息 - """ - sim = "40696c86-264a-4222-a40c-cfd64a05dffd" - product = "40696c86-264a-4222-a40c-cfd64a05dffd" - if environment.lower() == "sim" or environment.lower() == "qa": - return sim - else: - return product - - def send_message_by_dingding(self, data, environment="qa"): - ''' - 发送钉钉消息 - ''' - token = self.kw_to_get_dd_token(environment=environment) - # web_hook = "https://oapi.dingtalk.com/robot/send?access_token={}".format(token) - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/{}".format(token) - headers = {"Content-Type": "application/json"} - json_data = json.dumps(data) - rsp = requests.post(url=web_hook, data=json_data, headers=headers) - return rsp - - # print(data) - def send_feishu(self,inferfaces): - ''' - 发送飞书 - :return: - ''' - at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}] - message_data = {"msg_type": "post", "content": { - "post": {"zh_cn": {"title": "有存在的接口未实现自动化哦", - "content": [[{"tag": "text", "text": "问题数据:"}], - [{"tag": "text", "text": "{}".format(inferfaces)}], - at_user_list]}}}} - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/40696c86-264a-4222-a40c-cfd64a05dffd" - headers = {"Content-Type": "application/json"} - json_data = json.dumps(message_data) - print(json_data) - rsp = requests.post(url=web_hook, data=json_data, headers=headers) - return rsp - - def handle_send_message(self,root): - ''' - 处理对应所有人,根据job名称匹配来发送@的消息 - ''' - list_name_phone = {"陈江": "13458500234", "张楠": "", "罗志鹏": "", - "蒲思宇": "", "陈洁": "15328118883", "刘涛婷": "18328504751", "谯新久": "18202810506"} - job_name = self.GetJenkinsVar("JOB_TO_NAME") - job_url = self.GetJenkinsVar("JOB_TO_URL") - enviroment = self.GetJenkinsVar("JOB_ENVIRONMENT") - - # job_name = "123" - # job_url = "http://10.250.200.1:8080/jenkins/job/QA%E7%8E%AF%E5%A2%83%E5%B7%A1%E6%A3%80/2387/robot/report/report.html" - # enviroment = "PRODUCT" - - dict_info = self.get_fail_test_case(son_node=root) - BUILD_INFO = dict_info.get("BUILD_INFO") - fail_info = dict_info.get("INFO") - list_phone = [] - if BUILD_INFO: - for key, value in BUILD_INFO.items(): - list_phone.append(list_name_phone.get(key)) - print(list_phone) - print("+++++++{0}+++++{1}".format(job_name, job_url)) - if re.search("PRODUCT", enviroment): - # message_data = {"msg_type": "text", "content": { - # "text": "线上巡检:线上环境出现了问题,请点击进行查看{0},以下是错误日志:{1}".format(job_url + "robot/report/report.html",fail_info)}, - # "at": {"atMobiles": list_phone}} - - at_user_list = [{"tag": "at", "user_id": "{}".format("7020366258071715842")}] - message_data = {"msg_type": "post", "content": { - "post": {"zh_cn": {"title": "线上环境巡检", - "content": [[{"tag": "text", "text": "线上环境出现了问题:"}], - [{"tag": "a", "text": "点击查看","href":"".format(job_url + "robot/report/report.html")}], - at_user_list]}}}} - print(message_data) - self.send_message_by_dingding(message_data,environment="product") - - return enviroment - if re.search("QA", enviroment) or re.search("SIM", enviroment): - message_data = {"msg_type": "text", "content": { - "text": "{0}环境构建出问题了哦,请点击进行查看{1},以下是错误日志:{2}".format(enviroment, job_url + "robot/report/report.html",fail_info)}, - "at": {"atMobiles": list_phone}} - print(message_data) - self.send_message_by_dingding(message_data) - return enviroment - for key, value in list_name_phone.items(): - if re.search(key, job_name): - message_data = {"msg_type": "text", "content": { - "text": "亲爱的{0}同学,你的独立环境构建出问题了哦,请点击进行查看{1}".format(key, job_url + "robot/report/report.html")}, - "at": {"atMobiles": [value]}} - self.send_message_by_dingding(message_data) - return value - else: - return "这个job:{}没有找到人".format(job_name) - - def get_fail_test_case(self,son_node, father_node=None, grandpa_node=None): - """ - 功能:遍历xml文件的所有节点,搜索构建失败的用例信息 - """ - children_node = son_node.getchildren() - if len(children_node) == 0: - # if son_node.tag == 'doc': - # print(son_node.text) - # if son_node.tag == 'msg' and son_node.attrib['level'] == 'FAIL': - # # print(son_node.text) - # # print(son_node.attrib['timestamp']) - # print(children_node) - if son_node.tag == 'status' and son_node.attrib['status'] == 'FAIL' and 'critical' in son_node.attrib: - - # print(father_node.attrib["name"]) - tag = self.find_tags(father_node) - # a = self.find_error(father_node) - # print(a) - info_error = self.check_log_info(son_node.text) - INFO = "用例名称:" + father_node.attrib["name"] +"。人员:" + tag + "。失败日志:" + str(info_error) - run_time = son_node.attrib['endtime'] - # print(info_error) - # print(son_node.text) - # self.check_log_info(text=son_node.text) - run_time = "{}-{}-{} {}".format(run_time[0:4], run_time[4:6], run_time[6:8], run_time[9:17]) - reason = son_node.text.replace('"', '\\"') - # 满足构建时间,同时数据库中没有数据,才入库 - # print(run_time) - if tag in BUILD_INFO: - BUILD_INFO[tag] += 1 - else: - BUILD_INFO[tag] = 1 - # print(BUILD_INFO) - # print(tag) - self.list_info.append(INFO) - self.dict_info["BUILD_INFO"] = BUILD_INFO - self.dict_info["INFO"] = self.list_info - # print(tag) - - run_time = run_time - author = tag - case_name = father_node.attrib['name'] - file_path = grandpa_node.attrib['source'] - reason = reason[0:4500] - return self.dict_info - for child in children_node: - self.dict_info = self.get_fail_test_case(child, son_node, father_node) - return self.dict_info - - def check_log_info(self,text): - ''' - 过滤精确日志信息 - ''' - soup = BeautifulSoup(text, features="lxml") - list_info = [] - for a in soup.find_all(name='span'): - dict_info = {} - if a.text == "Old message:": - dict_info["old_message"] = a.nextSibling - list_info.append(dict_info) - elif a.text == "New message:": - dict_info["new_message"] = a.nextSibling - list_info.append(dict_info) - # print(a.nextSibling) - - if list_info: - return list_info - else: - return text - - - - def find_tags(self,root): - """ - 功能:在xml文件中搜索失败用对应的作者 - """ - children_node = root.getchildren() - for child in children_node: - if child.tag == 'tags': - tags = child.getchildren() - for tag in tags: - if 'qa-' in tag.text.lower(): - return tag.text[3:len(tag.text)] - return "无作者标签" - - def find_error(self,root): - """ - 功能:在xml文件中查询失败日志 - """ - children_node = root.getchildren() - for child in children_node: - if child.tag == 'kw': - msgs = child.getchildren() - for msg in msgs: - a = msg.tag - - # t = msg.attrib['level'] - l = msg.text - # print(msg.attrib['timestamp']) - if msg.tag == 'msg' and msg.attrib['level'] == 'FAIL': - print(msg.attrib) - s = msg.text - return msg.text - return "" - - def run(self): - ''' - 运行入口 - ''' - # FILE_PATH = "D:/output2.xml" - FILE_PATH = os.path.abspath(os.path.join(WORKSPACE, 'Report/out/output.xml')) - root = ET.parse(FILE_PATH).getroot() - # self.get_fail_test_case(son_node=root) - self.handle_send_message(root=root) - -if __name__ == '__main__': - test = handle_to_jenkins() - - # FILE_PATH = "D:/output1.xml" - # FILE_PATH = os.path.abspath(os.path.join(WORKSPACE, 'Report/out/output.xml')) - # root = ET.parse(FILE_PATH).getroot() - # print(test.get_fail_test_case(son_node=root)) - test.run() - # test.handle_send_message(root=root) \ No newline at end of file diff --git a/zhyy/library/CommonFun/handle_jira.py b/zhyy/library/CommonFun/handle_jira.py deleted file mode 100644 index 70fbe20..0000000 --- a/zhyy/library/CommonFun/handle_jira.py +++ /dev/null @@ -1,331 +0,0 @@ -# -*- coding:utf-8 -*- -""" -人员当日jira任务、故事状态流转 -""" -import os, sys - -file_dir = os.path.dirname(__file__) -project_dir = os.path.abspath(os.path.join(file_dir, "..", "..", "..")) -sys.path.append(project_dir) - -from jira import JIRA -from base_framework.public_tools.utils import Tools -from base_framework.public_tools.read_config import ReadConfig -from base_framework.platform_tools.Message_service.Feishu_api import FeiShuMessage,get_user_name_by_email_prefix,get_feishu_config_value -from configparser import ConfigParser -from base_framework.base_config.current_pth import * -import datetime - -tools = Tools() -ReadConfig = ReadConfig(filename=la_config_path) -FS_INFO = [{"team": "TO", "users": "wuyonggang,xuwenjun,luohong"}, - {"team": "TO-RD", "users": "fengtian,guosongchao,zhaoxiaofang," - "zhuliang,majincheng,gaozhijun,liuxuegang," - "zhangxiong"}, - {"team": "USER-FE", "users": "zhaofei,liuxinlin,qingchen,yefei,xiangming,jianghao,jianglingmin,xuchangle," - "libaicheng,gouyuheng,jixiang.dong,baiyang01"} - ] - - -class JiraApi: - def __init__(self): - self.jira = JIRA(server='https://jira.bg.huohua.cn/', - basic_auth=("wuyonggang", "Mima@123")) - - def close_jira_subtask(self, user_name): - """ - 功能: 关闭指定人员名下当天结束的子任务 - 请求参数 user_name (指定人员jira登录名,type: list) - """ - bad_name = [] - right_name = [] - for j in user_name: - if j not in ReadConfig.get_sections(): - bad_name.append(j) - elif j in ReadConfig.get_sections(): - right_name.append(j) - success = [] - false = [] - today_time = tools.get_format_date(r_type=1) - work_start_time = datetime.datetime.strptime('{0} 10:00:00'.format(today_time), '%Y-%m-%d %H:%M:%S') - for name in right_name: - jira = JIRA(server='https://jira.bg.huohua.cn/', basic_auth=(name, ReadConfig.get_value(name, 'password'))) - jql = 'project = HHC AND issuetype = 子任务 AND status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计,' \ - ' 产品需求内审, 需求评审, 排期, 执行, 开发, 待测试, QA测试, SIM验证, 验证中, 待办, 处理中, 关闭) AND resolution = Unresolved' \ - ' AND (QA in ({0}) OR assignee in ({1})) ORDER BY priority DESC, updated DESC'.format(name,name) - issues = jira.search_issues(jql, fields='') - # if len(issues) == 0: break - not_need_closed = 0 - for i in issues: - s = list(jira.transitions(i)) - close_status_id = [x['id'] for x in s if x['name'] == '关闭'] - if str(i.fields.status) == '处理中': - if i.fields.aggregatetimeestimate != None: - if i.fields.aggregatetimeestimate > 28800: - jira.add_worklog(i, timeSpent='7', started=work_start_time) - elif 0 < i.fields.aggregatetimeestimate <= 28800: - jira.add_worklog(i, timeSpent='{0}'.format(i.fields.aggregatetimeestimate / 3600), - started=work_start_time) - else: - jira.add_worklog(i, timeSpent='8', started=work_start_time) - if str(i.fields.status) == '处理中' and str(i.fields.customfield_13406) == today_time: - jira.transition_issue(i, int(close_status_id[0])) - else: - not_need_closed += 1 - issues2 = jira.search_issues(jql, fields='') - if not_need_closed == len(issues2): - success.append(name) - else: - false.append(name) - return "{0}今日结束的子任务已关闭成功; {1}今日结束的子任务关闭失败; {2}没有进行账号配置".format(success, false, bad_name) - - def start_jira_subtask(self, user_name): - """ - 功能: 将待开始为今天的子任务状态流转为“处理中” - 请求参数 user_name (指定人员jira登录名,type: list) - """ - bad_name = [] - right_name = [] - for j in user_name: - if j not in ReadConfig.get_sections(): - bad_name.append(j) - elif j in ReadConfig.get_sections(): - right_name.append(j) - success = [] - false = [] - for name in right_name: - jira = JIRA(server='https://jira.bg.huohua.cn/', basic_auth=(name, ReadConfig.get_value(name, 'password'))) - jql = 'project = HHC AND issuetype = 子任务 AND status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计, 产品需求内审, 需求评审, ' \ - '排期, 执行, 开发, 待测试, QA测试, SIM验证, 验证中, 待办, 关闭) AND resolution = Unresolved' \ - ' AND (QA in ({0}) OR assignee in ({1})) ORDER BY priority DESC, updated DESC'.format(name,name) - today_time = tools.get_format_date(r_type=1) - issues = jira.search_issues(jql, fields='') - # if len(issues) == 0: break - not_need_update = 0 - for i in issues: - s = list(jira.transitions(i)) - start_status_id = [x['id'] for x in s if x['name'] == '处理中'] - if str(i.fields.status) == '待办' and str(i.fields.customfield_12700) == today_time: - jira.transition_issue(i, int(start_status_id[0])) - else: - not_need_update += 1 - issues2 = jira.search_issues(jql, fields='') - if not_need_update == len(issues2): - success.append(name) - else: - false.append(name) - return "{0}今日开始的子任务已将状态修改为“处理中”‘; {1}今日开始的子任务状态修改失败; {2}没有进行账号配置".format(success, false, bad_name) - - def change_story(self, user_name, type): - """ - 功能: 将提测时间为今天的指定人员名下的故事状态修改至“QA测试” - 请求参数 user_name (指定人员jira登录名,type: list) - type (故事需要修改至的状态 1:提测日为今天,状态修改至【QA测试】 2:上线日为今天,状态修改至【关闭】) - """ - bad_name = [] - right_name = [] - for j in user_name: - if j not in ReadConfig.get_sections(): - bad_name.append(j) - elif j in ReadConfig.get_sections(): - right_name.append(j) - success = [] - false = [] - for name in right_name: - jira = JIRA(server='https://jira.bg.huohua.cn/', basic_auth=(name, ReadConfig.get_value(name, 'password'))) - jql = "project = HHC AND issuetype = 故事 AND " \ - "status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计, 产品需求内审, 需求评审, 排期, 执行, 开发, 待测试, 验证中, 待办, QA测试, SIM验证, 处理中, 关闭)" \ - " AND resolution = Unresolved AND QA in ({0}) ORDER BY priority DESC, updated DESC".format(name) - today_time = tools.get_format_date(r_type=1) - issues = jira.search_issues(jql, fields='') - # if len(issues) == 0 : break - x = 0 - need_update = 0 - if type == 1: # 将故事状态一直流转至“QA测试” - for i in issues: - if str(i.fields.status) == 'QA测试' or str(i.fields.status) == 'SIM验证': need_update += 1 - if str(i.fields.customfield_10504) == today_time: - if str(i.fields.status) != 'QA测试' and str(i.fields.status) != 'SIM验证': - need_update += 1 - for j in range(8): - jira.transition_issue(i, int(jira.transitions(i)[2]['id'])) - issues_2 = jira.search_issues(jql, fields='') # 重新获取所有故事 - status_now = issues_2[x].fields.status - print(status_now) - if str(status_now) == 'QA测试' or str(status_now) == 'SIM验证': - break - x += 1 - jql2 = "project = HHC AND issuetype = 故事 AND " \ - "status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计, 产品需求内审, 需求评审, 排期, 执行, 开发, 待测试, 验证中, 待办, 处理中, 关闭)" \ - " AND resolution = Unresolved AND QA in ({0}) ORDER BY priority DESC, updated DESC".format(name) - issues2 = jira.search_issues(jql2, fields='') - if len(issues2) == len(issues) - need_update: - success.append(name) - else: - false.append(name) - elif type == 2: # 直接将故事关闭 - for i in issues: - if str(i.fields.customfield_10606) == today_time: - jira.transition_issue(i, int(jira.transitions(i)[1]['id']), comment="已上线") # 将故事修改为关闭状态 - need_update += 1 - issues2 = jira.search_issues(jql, fields='') - if len(issues2) + need_update == len(issues): - success.append(name) - else: - false.append(name) - - return "{0}今日的故事已将状态修改成功!; {1}今日的故事状态修改失败; {2}没有进行账号配置".format(success, false, bad_name) - - def change_jira_status(self, user_name): - """ - 功能: 判断当前时间是否在下午18:00点以前,来选择打开或关闭【子任务】和【故事】 - 请求参数 user_name (指定人员jira登录名,type: list) - """ - time_now = tools.get_format_date(r_type=4) - time_now2 = '{0} 18:00:00'.format(time_now[0:10:1]) - if time_now < '{0} 18:00:00'.format(time_now2): - a = self.start_jira_subtask(user_name) - b = self.change_story(user_name, type=1) - return a + '\n' + b - elif time_now >= '{0} 18:00:00'.format(time_now2): - a = self.close_jira_subtask(user_name) - b = self.change_story(user_name, type=2) - return a + '\n' + b - - def query_jira_subtask(self, user_name, begin_date=0, end_date=0): - """ - | 功能 | 查询用户对应的jira子任务 | - | 入参 | user_name | 用户名字 | - | | begin_date | 开始时间:0-今天,X-未来X天,-X-过去的X天 | - | | end_date | 开始时间:0-今天,X-未来X天,-X-过去的X天 | - """ - b_date = tools.get_format_date(r_type=1, add_days=int(begin_date)) - e_date = tools.get_format_date(r_type=1, add_days=int(end_date)) - jql = "issuetype = 子任务 AND 计划开始时间 <= {} AND 计划结束时间 >= {} AND assignee in ({}) ORDER BY cf[12700] ASC"\ - .format(b_date, e_date, user_name) - issues = self.jira.search_issues(jql, fields='') - # print(jql) - return issues - # for item in issues: - # print("{0}:{1}, 当前状态:{2}".format(item.key, item.fields.summary, item.fields.status)) - - def query_jira_by_id(self, jira_id): - """ - | 功能 | 跟进jira的id查询具体详情 | - | 入参 | jira_id | jira的id | - """ - jql = "id={}".format(jira_id) - issues = self.jira.search_issues(jql, fields='') - if len(issues) == 0: - raise Exception("根据jira_id未查询到对应的jira信息,请检查....") - rd = issues[0].fields.assignee.displayName - qa = issues[0].fields.reporter.displayName - title = issues[0].fields.summary - status = issues[0].fields.status - j_time = issues[0].fields.created - j_time = j_time[0:10] + ' ' + j_time[11:19] - return {"jira_rd": rd, - "jira_qa": qa, - "jira_title": title, - "jira_time": j_time, - "jira_status": str(status)} - - def query_overdue_issues(self, user_name): - """ - | 功能 | 查询逾期的子任务和故事 | - | 入参 | 无 | - """ - today = tools.get_format_date() - check_time = tools.get_format_date(r_type=4) - if check_time < "{} 17:00:00".format(today): - jql = "issuetype in (故事,子任务) AND (计划结束时间 1: - dict_response[level] = list_level.count(level) - if dict_response: - return {"code":500,"data":dict_response} - else: - return {"code":200,"data":dict_response} - -class student_verity(): - def __init__(self): - self.get_url = auth_login() - - def get_schedule_count(self): - ''' - - :return: - ''' - m_token = self.get_url.get_m_online_token() - headers = self.get_url.get_m_headers(m_token=m_token) - url = self.get_url.get_student_config_info(url_name="scheduleCount_url") - print(url) - get_response_data = self.get_url.get_json_result(url=url, headers=headers, request_data={"subjectType": 4}) - - return get_response_data - - -if __name__ == '__main__': - test = auth_login() - test1 = m_parent() - test2 = student_verity() - # print(test.get_student_online_token()) - # print(test1.get_recommendedCourse()) - print(test1.get_trial_level(courseSubtype=22)) - # print(test2.get_schedule_count()) diff --git a/zhyy/library/CommonFun/handle_mq.py b/zhyy/library/CommonFun/handle_mq.py deleted file mode 100644 index 52edde6..0000000 --- a/zhyy/library/CommonFun/handle_mq.py +++ /dev/null @@ -1,19 +0,0 @@ -import pika - -# 设置RabbitMQ服务器的连接参数,使用自定义端口9876 -connection_params = pika.ConnectionParameters('rocketmq.qa.huohua.cn', 9876) -connection = pika.BlockingConnection(connection_params) -channel = connection.channel() - -# 声明一个队列,如果队列不存在则会创建 -queue_name = 'my_queue' -channel.queue_declare(queue=queue_name) - -# 发布消息到指定的队列 -message = 'Hello, World!' -channel.basic_publish(exchange='', - routing_key=queue_name, - body=message) -print(f" [x] Sent '{message}'") -# 关闭连接 -connection.close() diff --git a/zhyy/library/CommonFun/handle_picture.py b/zhyy/library/CommonFun/handle_picture.py deleted file mode 100644 index 24030f2..0000000 --- a/zhyy/library/CommonFun/handle_picture.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: qiaoxinjiu -Email: qiaoxinjiu@sparkedu.com -Create Date: 2022/05/08 5:58 下午 -""" -import os -from PIL import Image - -def image_gray(img): - # 打开图片 - img = Image.open(img) - - # 计算平均灰度值 - gray_sum = 0 - count = 0 - for x in range(img.width): - for y in range(img.height): - if img.mode == "RGB": - r, g, b = img.getpixel((x, y)) - gray_sum += (r + g + b) / 3 - elif img.mode == "L": - gray_value = img.getpixel((x, y)) - gray_sum += gray_value - count += 1 - - avg_gray = gray_sum / count - return avg_gray - - -def find_image(folder_path): - # 定义一个列表存储图片路径 - images = [] - # 遍历文件夹下的所有文件 - for root, dirs, files in os.walk(folder_path): - for file in files: - file_path = os.path.join(root, file) - # 处理每个文件,将其添加到列表中 - images.append(file_path) - return images - - -def assert_run(folder_path): - images = find_image(folder_path) - for img in images: - gray = image_gray(img) - # 灰度值小于50,将认为是黑图 - if gray < 50: - print(img, ":", gray) - - -if __name__ == "__main__": - # image_gray() - # find_image() - folder_path = r'D:\picture' - assert_run(folder_path) diff --git a/zhyy/library/CommonFun/handle_tools.py b/zhyy/library/CommonFun/handle_tools.py deleted file mode 100644 index 2d0d25f..0000000 --- a/zhyy/library/CommonFun/handle_tools.py +++ /dev/null @@ -1,211 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: qiaoxinjiu -Email: xinjiu.qiao@allschool.com -Create Date: 2022/04/26 5:58 下午 -""" -import os -import sys - -input_team_name = sys.argv - -BASIC_PATH = os.path.dirname(os.path.abspath(__file__)) -TEAM_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../../{}'.format("base_framework"))) -sys.path.append(TEAM_PATH) -PROJECT_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../..')) -sys.path.append(PROJECT_PATH) -from base_framework.public_tools.sqlhelper import MySqLHelper -import json -import requests - -obj_mysql_helper = MySqLHelper() - - -class Handle_tools: - def __init__(self): - pass - - def query_interface_sql(self): - ''' - 查询qa的余量接口信息 - :return: - ''' - query_sql = ''' SELECT in_url,controller_name - FROM - sparkatp.interface_info - WHERE - id IN ( - SELECT - a.id - FROM - (SELECT * from sparkatp.interface_info) a - WHERE - ( a.swagger_id in (SELECT id FROM sparkatp.swagger_info WHERE team="UBRD") ) - AND a.created_time > "2022-01-01 00:00:50" - AND is_used = 1 and at_numbers = 0 and offline=0 and jira_id is null) ORDER BY created_time''' - - query_sql_r = """SELECT - si.id AS interface_id, - rpgm.jira_id, - si.in_url -FROM - ( - SELECT - ii.id, - ii.in_url, - ii.jira_id - FROM - sparkatp.interface_info ii - WHERE - ii.swagger_id IN ( SELECT id FROM sparkatp.swagger_info WHERE team = "UBRD" ) - AND ii.created_time > "2022-01-01 00:00:50" - AND ii.is_used = 1 - AND ii.at_numbers = 0 - AND ii.offline = 0 - AND ii.jira_id IS NULL - ) si - INNER JOIN ( - SELECT - rp.interface_id, - rp.jira_id, - MAX( modified_time ) - FROM - request_parameters rp - WHERE - rp.jira_id IS NOT NULL - AND rp.jira_id <> 'None' - AND rp.jira_id <> '' - GROUP BY - rp.interface_id - ) rpgm ON rpgm.interface_id = si.id;""" - - # query_sql = " SELECT * FROM sparkatp.interface_info WHERE id IN (SELECT a.id FROM(SELECT * from sparkatp.interface_info) a WHERE( a.swagger_id in (SELECT id FROM sparkatp.swagger_info WHERE team='UBRD') ) AND a.created_time > '2022-01-01 00:00:50' AND is_used = 1 and at_numbers = 0 and offline=0 and jira_id is null) ORDER BY created_time" - query_sql_r_result = obj_mysql_helper.select_all(query_sql_r) - query_sql_dict = {} - query_sql_dict_temp = {} - # : {'interface_id': 924646, 'jira_id': 'HHC-48875', 'in_url': 'http://peppa-parent-api.qa.huohua.cn/classes/audition/enter'} - for qsrr in query_sql_r_result: - in_url = "{}_{}".format(str(qsrr.get('interface_id')).strip(' '), qsrr.get('in_url').strip(' ')) - if qsrr.get('jira_id') in query_sql_dict.keys(): - if in_url in query_sql_dict.get(qsrr.get('jira_id')): - pass - else: - query_sql_dict[qsrr.get('jira_id')].append(in_url) - else: - query_sql_dict[qsrr.get('jira_id')] = [in_url] - - query_sql_s = """SELECT - si.id AS interface_id, - rpgm.jira_id, - si.in_url -FROM - ( - SELECT - ii.id, - ii.in_url, - ii.jira_id - FROM - sparkatp.interface_info ii - WHERE - ii.swagger_id IN ( SELECT id FROM sparkatp.swagger_info WHERE team = "UBRD" ) - AND ii.created_time > "2022-01-01 00:00:50" - AND ii.is_used = 1 - AND ii.at_numbers = 0 - AND ii.offline = 0 - AND ii.jira_id IS NULL - ) si - INNER JOIN ( - SELECT - rp.interface_id, - rp.jira_id, - MAX( modified_time ) - FROM - response_parameters rp - WHERE - rp.jira_id IS NOT NULL - AND rp.jira_id <> 'None' - AND rp.jira_id <> '' - GROUP BY - rp.interface_id - ) rpgm ON rpgm.interface_id = si.id;""" - - query_sql_s_result = obj_mysql_helper.select_all(query_sql_s) - for qsrs in query_sql_s_result: - in_url = "{}_{}".format(str(qsrs.get('interface_id')).strip(' '), qsrs.get('in_url').strip(' ')) - if qsrs.get('jira_id') in query_sql_dict.keys(): - if in_url in query_sql_dict[qsrs.get('jira_id')]: - pass - else: - query_sql_dict[qsrs.get('jira_id')].append(in_url) - else: - query_sql_dict[qsrs.get('jira_id')] = [in_url] - return query_sql_dict - - def send_log_info(self): - ''' - 每天进行日志提醒 - :return: - ''' - feishu_name_id = {"罗志鹏": "7020366259502153730", "谯新久": "7020366258071715842", - "陈洁": "7020370251997069314", "蒲思宇": "7076270364313108481", "张楠": "7076270369128349697", - "刘涛婷": "7020366262240854017"} - order_list = ["谯新久", "陈洁", "刘涛婷", "罗志鹏", "蒲思宇", "张楠"] - # for name in order_list: - - def send_feishu(self, inferfaces): - ''' - 发送飞书 - :return: - ''' - at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}] - message_data = {"msg_type": "post", "content": { - "post": {"zh_cn": {"title": "有存在的接口未实现自动化哦", - "content": [[{"tag": "text", "text": "问题数据:"}], - [{"tag": "text", "text": "{}".format(inferfaces)}], - at_user_list]}}}} - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/40696c86-264a-4222-a40c-cfd64a05dffd" - headers = {"Content-Type": "application/json"} - json_data = json.dumps(message_data) - print(json_data) - rsp = requests.post(url=web_hook, data=json_data, headers=headers) - return rsp - - def send_message_by_feishu(self, web_hook, data): - headers = {"Content-Type": "application/json"} - json_data = json.dumps(data) - rsp = requests.post(url=web_hook, data=json_data, headers=headers) - return rsp - - def compare_txt(self, su_t, st_t): - ''' - 对比两个文档,返回不同的信息 - :param su_t: - :param st_t: - :return: - ''' - file_object1 = open(su_t, 'r', encoding='utf-8') - file_object2 = open(st_t, 'r', encoding='utf-8') - try: - while True: - line = file_object1.readline() - lines = file_object2.readline() - if line.strip() != lines.strip(): - print("pc :", line) - print("right:", lines) - else: - continue - finally: - file_object1.close() - file_object2.close() - - -if __name__ == '__main__': - test = Handle_tools() - # get_interfaces = test.query_interface_sql() - # if get_interfaces: - # test.send_feishu(json.dumps(get_interfaces)) - # else: - # print("都已经完成") - su_t = r"D:\UiVispark\spark1.txt" - st_t = r"D:\UiVispark\spark2.txt" - test.compare_txt(st_t=st_t,su_t=su_t) \ No newline at end of file diff --git a/zhyy/library/CommonFun/host_update.ini b/zhyy/library/CommonFun/host_update.ini deleted file mode 100644 index 8e3f842..0000000 --- a/zhyy/library/CommonFun/host_update.ini +++ /dev/null @@ -1 +0,0 @@ -host_list = [{"ip":'127.0.0.1',"host_names":"ts.sim.huohua.cn"},{"ip":'127.0.0.1',"host_names":"student-api.sim.huohua.cn"}] \ No newline at end of file diff --git a/zhyy/library/CommonFun/host_update.py b/zhyy/library/CommonFun/host_update.py deleted file mode 100644 index ab5cda7..0000000 --- a/zhyy/library/CommonFun/host_update.py +++ /dev/null @@ -1,263 +0,0 @@ -# -*- coding:utf-8 -*- -# @Time : 2023/7/5 10:27 -# @Author: luozhipeng -# @File : host_update.py -import os -from python_hosts import Hosts, HostsEntry -import sys -LOCAL_PATH = os.path.dirname(os.path.abspath(__file__)) -BASE_PROJECT_PATH = os.path.abspath(os.path.join(LOCAL_PATH, '../../../{}'.format("UBRD"))) -BASIC_PATH = os.path.abspath(os.path.join(LOCAL_PATH, '../../../')) -sys.path.append(BASE_PROJECT_PATH) -sys.path.append(BASIC_PATH) -from base_framework.public_tools.utils import Tools -from base_framework.public_tools.apollo import Apollo -import requests, time -import os -import sys -import socket -import subprocess -import requests -import urllib.parse -obj_apollo = Apollo() - -obj_tools = Tools() - -class HostUpdate: - def __init__(self): - if sys.platform.startswith('win'): - self.hosts_location = Hosts(path='C:\Windows\System32\drivers\etc\hosts') - elif sys.platform.startswith('darwin'): - self.hosts_location = Hosts(path='\etc\hosts') - - def host_update_by_host_dict(self, host_dict_list: list): - - entry_list = [] - for host in host_dict_list: - new_entry = HostsEntry(entry_type='ipv4', address=host['ip'], names=[host['host_name'], '']) - entry_list.append(new_entry) - self.hosts_location.add(entry_list) - self.hosts_location.write() - - def host_remove_intercept(self,address,name): - self.hosts_location.remove_all_matching(address,name) - self.hosts_location.write() - - def get_ip_by_host_domain(self,domain: str): - ip=socket.gethostbyname(domain) - return ip - - def wait_dns_flush(self,ip,domain): - count=1 - while True: - - cmd1="ipconfig /flushdns" - result1=subprocess.run(cmd1,capture_output=True,text=True) - output1=result1.stdout - print(output1) - cmd2="ping {}".format(domain) - result2=subprocess.run(cmd2,capture_output=True,text=True) - output2=result2.stdout - print(output2) - cmd="ipconfig /displaydns" - result=subprocess.run(cmd,capture_output=True,text=True) - output=result.stdout - print(output) - if output is None: - output='' - if ip in output: - break - if count >= 30: - break - count=count + 1 - host_list=[{"ip": ip,"host_name": domain}] - self.host_remove_intercept(ip,domain) - self.host_update_by_host_dict(host_list) - time.sleep(2) - - -class CoreApollo: - def __init__(self,show_username=None,password=None,current_evn=None): - if not show_username: - self.show_username="liuruiquan" - if not password: - self.password="lrq5823LRQ" - self.apollo_url="http://apollo.qa.huohua.cn/signin" - if not current_evn: - self.current_evn="SIM" - self.apollo_host="http://apollo.qa.huohua.cn" - self.session=self.core_apollo_login() - - def core_apollo_login(self): - post_data=dict() - post_data['login-submit']='登录' - post_data['username']=self.show_username - post_data['password']=self.password - req_session=requests.Session() - resp=req_session.post(url=self.apollo_url,data=post_data) - return req_session - - def get_key(self,server,cluster,key,project): - req_url="%s/apps/%s/envs/%s/clusters/%s/namespaces" % ( - self.apollo_host,server,self.current_evn,cluster) - resp=self.session.get(url=req_url).json() - for item in resp: - base_info=item.get('baseInfo') - items=item.get('items') - if not base_info['namespaceName'].lower() == project.lower(): - continue - for key_info in items: - item_detail=key_info["item"] - if item_detail["key"] == key: - return key_info["item"] - else: - return None - - def set_key(self,key,value,cluster='default',server="",project=None): - if server: - self.server=server - req_url="%s/apps/%s/envs/%s/clusters/%s/namespaces/%s/item" % ( - self.apollo_host,self.server,self.current_evn,cluster,project) - items=self.get_key(server,cluster,key,project) - if items is None: - items=dict() - items["value"]=value - items["key"]=key - items["tableViewOperType"]='create' - items["addItemBtnDisabled"]=True - - else: - items["value"]=value - items["tableViewOperType"]='update' - update_resp=self.session.put(url=req_url,json=items) - - assert update_resp.status_code == 200 - release_body=dict() - release_time_stamp=time.localtime() - release_time='%s-release' % time.strftime("%Y%m%d%H%M%S",release_time_stamp) - release_body["isEmergencyPublish"]=False - release_body["releaseComment"]="" - release_body["releaseTitle"]=release_time - release_url="%s/apps/%s/envs/%s/clusters/%s/namespaces/%s/releases" % ( - self.apollo_host,self.server,self.current_evn,cluster,project) - resp=self.session.post(url=release_url,json=release_body) - assert resp.status_code == 200 - time.sleep(5) - - def set_user_force_true(self,vlaue="true"): - self.set_key(value=vlaue,key="user-token.forceFallback",server="peppa-core-api",cluster="check" - ,project="application") - - def set_teacher_force_true(self,vlaue="true"): - self.set_key(value=vlaue,key="sso-token.forceFallback",server="peppa-core-api",cluster="check" - ,project="application") - - -class EduClassroom: - def kw_ubrd_get_online_test_classroom(self,post_data_input=None): - post_data = dict() - host = "sso.huohua.cn" - api_url = "https://{}/authentication/form".format(host) - show_username = "liuruiquan" - username = "liuruiquan" - password = "lrq5823LRQ" - post_data['showUsername'] = show_username - post_data['username'] = username - post_data['password'] = password - user_agent = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"} - deviceid = {"SSO_DEVICE_ID":"8dfbecf2-064a-4e3f-ac2b-fc09a2401416"} - req_session = requests.session() - req_session.cookies.update(deviceid) - req_session.headers.update(user_agent) - resp = req_session.post( - url=api_url, - data=post_data, - allow_redirects=False) - - # token_header = {"accesstoken": token} - # req_session.headers.update(token_header) - # print(token_header) - client_id = "tic-payment-admin" - origin_url="aHR0cHM6Ly9zc28uaHVvaHVhLmNuLw==" - # origin_url="aHR0cHM6Ly9zc28uc2ltLmh1b2h1YS5jbi8=" - - redirect_uri = "https://{}/uim/authorize_proxy?client_id={}&debug_mode=1&origin_url={}".format(host,client_id,origin_url) - print(redirect_uri) - token_code_url = "https://{}/oauth/authorize?client_id={}&response_type=code&".format(host,client_id,redirect_uri) - authorize_data = {"redirect_uri": redirect_uri} - authorize_data_uri =urllib.parse.urlencode(authorize_data) - resp = req_session.get( - url=token_code_url+authorize_data_uri, - data=authorize_data, - allow_redirects=False) - print(resp.url) - print(resp.headers) - print(resp) - - # token_url = "https://{}/uim/authorize_proxy?client_id={}&debug_mode=1&origin_url={}&code={}".format(host,client_id,origin_url,code) - token_url= resp.headers["Location"] - # authorize_code_data = {"client_id":"tic-payment-admin","debug_mode": 1,"origin_url": origin_url,"code":code} - - print(token_url,"token_url") - # print(authorize_code_data) - resp = req_session.get( - url=token_url, - # data=authorize_code_data, - allow_redirects=False) - print(resp) - print(resp.url) - for key, value in req_session.cookies.items(): - if key == 'peppa_sso_token': - token = value - token_header = {"accesstoken": token} - req_session.headers.update(token_header) - print(token_header) - print(value) - break - - - op_time = obj_tools.get_format_date(r_type=4,add_minutes=10) - print(op_time) - - create_classroom_json = {"courseId":1898,"unionFlag":0,"lessonId":49264,"planStudentCount":4,"timezoneName":"Asia/Shanghai","openTime":op_time,"overseasTag":0,"secondOpenTime":op_time,"teacherId":36573,"type":100} - api_url_created_classroom = "https://teach-api.huohua.cn/peppa-teach-api/classroom" - create_classroom_resp = req_session.post( - url=api_url_created_classroom, - json=create_classroom_json) - # print(req_session.headers) - # print(req_session.cookies) - # print(resp.content) - # print(resp.url) - print(create_classroom_resp.json()) - classroom_id = create_classroom_resp.json()['data']["classroomId"] - print(create_classroom_resp.json()) - # - # return req_session - add_student_json = {"classroomId":classroom_id,"studentId":274886,"userId":275774,"joinType":0,"ignoreClassHour":1} - api_url_add_student = "https://teach-api.huohua.cn/peppa-teach-api/classroom_student/add" - add_student_resp = req_session.post( - url=api_url_add_student, - json=add_student_json) - print(add_student_resp.json()) - - # return req_session - add_student_json1 = {"classroomId":classroom_id,"studentId":5635578,"userId":5646962,"joinType":0,"ignoreClassHour":1} - add_student_resp1 = req_session.post( - url=api_url_add_student, - json=add_student_json1) - print(add_student_resp1.json()) - -if __name__ == '__main__': - - - host_list = [{"ip": "127.0.0.1", "host_name": "ts.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "its.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "student-api.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "sentry.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "gray.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "classroom-api.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "logserver.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "zipkin.sim.huohua.cn"}, - {"ip": "127.0.0.1", "host_name": "gs.sim.huohua.cn"}] - A = EduClassroom() - A.kw_ubrd_get_online_test_classroom() \ No newline at end of file diff --git a/zhyy/library/CommonFun/statistical_function.py b/zhyy/library/CommonFun/statistical_function.py deleted file mode 100644 index e54072d..0000000 --- a/zhyy/library/CommonFun/statistical_function.py +++ /dev/null @@ -1,142 +0,0 @@ -import os -import re -import threading - - -class StatisticalFunction: - def __init__(self): - self.java_dir =[] - self.zh_file = [] - self.python_dir = [] - self.robot_dir = [] - - - def check_lang_every_word(self,file_path): - """ 获取文件中注释外含中文的文档 """ - # file_path ='C:\\Users\\HuoH # a=time.time()ua\\Downloads\\peppa-parent-api\\src\\main\\java\\com\\peppa\\parent\\api\\common\\ApiErrorEnum.java' - with open(file_path,'r',encoding='utf-8') as text: - all_content = text.read() - all_content = all_content.encode('utf-8') - all_content = all_content.decode('utf-8','ignore') - yy= re.sub("\/\*\*.*?\*\*\/", "",all_content) # 去除多行注释 - yy = re.sub("\/\*[\w\W]*?\*\/|\/\/.*", "", yy) # 去除文本注释 - yy = re.sub("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%0AlQYV%&GY5Z2XK{IZ;sBUoPnRQF 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 diff --git a/zhyy/library/UpFile/classify.xlsx b/zhyy/library/UpFile/classify.xlsx deleted file mode 100644 index 5929be8d975466fc31473fe6584bfe4ead35e545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12324 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 diff --git a/zhyy/library/UpFile/tag.xlsx b/zhyy/library/UpFile/tag.xlsx deleted file mode 100644 index 8479c713e8beda0a6b53fd680888103875ca38e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10952 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 diff --git a/zhyy/library/ZZYYLogic/__init__.py b/zhyy/library/ZZYYLogic/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/ZZYYLogic/__pycache__/__init__.cpython-38.pyc b/zhyy/library/ZZYYLogic/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 01e8b10f4d7445911e14a87257ef90953eefcc37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmWIL<>g`k0>h&%X(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2D5#VV#WsVF5T z)G5d%CMPqgD6yzACe+<0KRq)!CO$qhFS8^*Uaz3?7Kcr4eoARhsvXFL&p^xo0Eb>2 A2mk;8 diff --git a/zhyy/library/ZZYYLogic/purchase_logic.py b/zhyy/library/ZZYYLogic/purchase_logic.py deleted file mode 100644 index d0a6109..0000000 --- a/zhyy/library/ZZYYLogic/purchase_logic.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: qiaoxinjiu -Email: qiaoxinjiu@qq.com -Create Date: 2026/01/17 5:58 下午 -""" -from base_framework.public_tools.mg_keyword import ManageKeyWord -from base_framework.public_tools import utils -from zhyy.library.BusinessKw.SZPurchase.index import PurchaseIndex - -obj_get_way = utils.Tools() -obj_purchase_kw = PurchaseIndex() -obj_manage_kw = ManageKeyWord() - - -class PurchaseLogic(): - def __init__(self): - pass - - def logic_zhyy_sz_purchase_todo_task(self, post_data_input, phone=None): - """ - | 功能说明: | 深圳采购待办任务处理 | - | 请求参数名 | 说明 | 类型 | 条件 | 是否必填 | | - | userName | 登录名 | string |None | 0 | - - 作者信息: | 谯新久 | 2026/01/17 | - """ - try: - post_data_input = eval(post_data_input) - except: - post_data_input = post_data_input - - return - - -if __name__ == '__main__': - pass diff --git a/zhyy/library/ZZYY_interface.py b/zhyy/library/ZZYY_interface.py deleted file mode 100644 index d3754a9..0000000 --- a/zhyy/library/ZZYY_interface.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*-coding:utf-8-* -import os -import sys - -# 添加项目根目录到 Python 路径,以便导入 base_framework 模块 -current_file_path = os.path.abspath(__file__) -project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../')) -if project_root not in sys.path: - sys.path.insert(0, project_root) - -from base_framework.public_tools import utils -from base_framework.public_tools.log import get_logger -from base_framework.public_tools.runner import Runner -from base_framework.public_tools.utils import Tools -from base_framework.public_tools import check_resp, convert_json, get_user, custom_check_resp -from base_framework.public_tools.eureka_api import EurekaAPI -import requests - -obj_runner = Runner() -obj_log = get_logger() -tools = Tools() -obj_tool = utils.Tools() -s = requests.session() -eureka = EurekaAPI() - - -class ZhyyInterface: - def __init__(self): - self.domain_url = eureka.get_url_from_config() - - def kw_in_zhyy_purchase_todo_get(self, is_check='', **kwargs): - """ - 查询采购待办任务 + POST + interface id: 88383 - url: http://peppa-personas-server.qa.huohua.cn/crowd_pack_query/list - | 请求参数名 | 说明 | 类型 | 条件 | 是否必填 | - | is_check | is_check默认空不校验返回,有值就校验返回 | string | 业务case的时候需要传入值 | False | - """ - user, kwargs = get_user(kwargs) - kwargs = convert_json(kwargs) - url = "%s/erp/purchase-workbench/get-todo" % self.domain_url - obj_log.info("your input:{0}".format(kwargs)) - resp = obj_runner.call_rest_api(API_URL=url, req_type="GET", user=user) - check_resp(is_check, resp) - return resp - - def kw_in_zhyy_purchase_order_page_post(self, is_check='', **kwargs): - """ - 查询采购单列表 + POST + interface id: 88383 - url: http://peppa-personas-server.qa.huohua.cn/admin-api/erp/purchase-order/page - | 请求参数名 | 说明 | 类型 | 条件 | 是否必填 | - | is_check | is_check默认空不校验返回,有值就校验返回 | string | 业务case的时候需要传入值 | False | - | pageNum | 页码 | integer | None | 0 | - | pageSize | 每页条数 | integer | None | 0 | - """ - user, kwargs = get_user(kwargs) - kwargs = convert_json(kwargs) - url = "%s/erp/purchase-order/page" % self.domain_url - obj_log.info("your input:{0}".format(kwargs)) - resp = obj_runner.call_rest_api(API_URL=url, req_type="POST", json=kwargs, user=user) - check_resp(is_check, resp) - return resp - -if __name__ == '__main__': - test = ZhyyInterface() - # print(test.domain_url) - a = test.kw_in_zhyy_purchase_todo_get( - user="purchase") - print(a) diff --git a/zhyy/library/__init__.py b/zhyy/library/__init__.py deleted file mode 100644 index c605a82..0000000 --- a/zhyy/library/__init__.py +++ /dev/null @@ -1,134 +0,0 @@ -# coding: utf-8 -import importlib -import os -import re -import sys -import traceback -from base_framework.base_config.current_pth import env_choose_path -from base_framework.public_tools.read_config import ReadConfig -from base_framework.public_tools.log import get_logger -evn_cfg = ReadConfig(env_choose_path) -team = evn_cfg.get_value(sections="run_evn_name", options="current_team") -__all__ = ['KwLibrary'] -cls_list_all = list() -cls_list_father = list() -cls_list_children = list() -t_c_list = list() -obj_log = get_logger() - - -def is_import(root): - black_list = [os.sep.join(['platform', 'tools']),'scene_server'] - import_flag = True - for black_item in black_list: - if black_item in root: - # print(3, root) - import_flag = False - return import_flag - - -def class_import(path_list): - root_path = os.path.abspath(os.path.join(os.getcwd(), "../")) - module_path = root_path + os.sep + os.sep.join(path_list) - sys.path.append(module_path) - for root, dirs, files in os.walk(module_path): - # if is_import(root): - for file in files: - if os.path.splitext(file)[1] == '.py' and not file.startswith('__'): - with open(os.sep.join([root, file]), encoding="utf-8") as f: - for line in f.readlines(): - cls_match = re.match(r"class\s(.*?)[\(:]", line) - if cls_match: - cls_name = cls_match.group(1) - try: - if cls_name not in ["Runner"]: - # module_list = root.split(os.sep)[len(os.getcwd().split(os.sep)) - 1:] - # module_list.append(os.path.splitext(file)[0]) - # module = importlib.import_module('.'.join(module_list)) - module_path_list = root.split(os.sep) - module_path_list.append(os.path.splitext(file)[0]) - module_path = '' - for index in range(len(module_path_list)): - if module_path_list[index].lower() == 'base_framework' or module_path_list[index].lower() == 'library': - tmp_path = module_path_list[index:] - for path in tmp_path: - module_path = module_path + path + '.' - break - module_path = module_path[0:-1] - module = importlib.import_module(module_path) - - class_attr = getattr(module, cls_name) - t_c_list.append(class_attr) - # if class_attr: - # if class_attr.__bases__[0] == object: - # cls_list_children.append(class_attr) - # else: - # cls_list_father.append(class_attr) - except: - traceback.print_exc() - print("ERROR import", file, cls_name) - - -def sort_class(class_list): - """ - 功能:将所有的class按继承关系排序,子类在前,父类在后,用于startup启动加载 - """ - while len(class_list) > 0: - # cls_list_len = len(cls_list_all) - tmp_class_list = [] - del_list = [] - for index in range(len(class_list)): - if not cls_list_all: - # 先找出所有的父类是object的基类 - if class_list[index].__bases__[0] == object: - # while class_list[index].__bases__[0] == object: - tmp_class_list.append(class_list[index]) - del_list.append(class_list[index]) - else: - # 寻找前一步晒出基类的子类 - if class_list[index].__bases__[0] in cls_list_all[len(cls_list_all) - 1]: - tmp_class_list.append(class_list[index]) - del_list.append(class_list[index]) - if len(tmp_class_list) > 0: - # 如果父类在已选出的类中,则保存该类 - cls_list_all.append(tmp_class_list) - for item in del_list: - class_list.remove(item) - else: - # 如果父类都不在已选出的类中,则全部按父类是object处理 - cls_list_all.append(class_list) - class_list = [] - - -class_import(["base_framework", "public_tools"]) -class_import(["base_framework", "public_business"]) -class_import([team, "library"]) -# BaseLibrary = type('BaseLibrary', tuple(cls_list_father + cls_list_children), {}) -sort_class(t_c_list) -c_len = len(cls_list_all) -obj_cls_tuple = () -while c_len > 0: - obj_cls_tuple += tuple(cls_list_all[c_len - 1], ) - c_len = c_len - 1 -print(obj_cls_tuple) -BaseLibrary = type('BaseLibrary', obj_cls_tuple, {}) - - -class KwLibrary(BaseLibrary): - - def __init__(self): - class_len = 0 - for base in BaseLibrary.__bases__: - try: - if hasattr(base, '__init__'): - if '__init__' in base.__dict__.keys(): - if base.__bases__[0] != object or len(base.__init__.__code__.co_varnames) == 1: - base.__init__(self) - print(base) - # obj_log.info("init class:{} success...".format(base)) - class_len += 1 - except Exception as e: - if base.__bases__[0] == object: - print("INIT", e, base, base.__dict__) - # obj_log.info("import files num: {}".format(class_len)) - print("import files num: {}".format(class_len)) diff --git a/zhyy/library/__pycache__/ZZYY_interface.cpython-38.pyc b/zhyy/library/__pycache__/ZZYY_interface.cpython-38.pyc deleted file mode 100644 index 3e36819888794efe00599dcbd82dba1b43a955da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3037 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 diff --git a/zhyy/qa_helper/common/__init__.py b/zhyy/qa_helper/common/__init__.py deleted file mode 100644 index 0161749..0000000 --- a/zhyy/qa_helper/common/__init__.py +++ /dev/null @@ -1 +0,0 @@ -print("222222222222") \ No newline at end of file diff --git a/zhyy/qa_helper/common/__pycache__/__init__.cpython-38.pyc b/zhyy/qa_helper/common/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 04be308db3dc62e611b14939b759875964b8c758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmWIL<>g`k0>h&%X(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DL#VV#WsVF5T z)G5d%rZ6!+BQ>WWwJ0VzKQ}i&FD5=dGcU6wK3=b&@)n0pZhlH>PO2Tqh|fUG006R& B9K-+s diff --git a/zhyy/qa_helper/common/__pycache__/order.cpython-38.pyc b/zhyy/qa_helper/common/__pycache__/order.cpython-38.pyc deleted file mode 100644 index fe34ed0405849015ff69d81fb3122300e9de3568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5361 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 HfQS1Z&f5Zc diff --git a/zhyy/qa_helper/common/__pycache__/user.cpython-38.pyc b/zhyy/qa_helper/common/__pycache__/user.cpython-38.pyc deleted file mode 100644 index f9253d20adcd09de3668d17ce874d3807ac0fab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8429 zcmeHMO>i4WcAgph5(Ftqwq#lI&%_m5MoJ_BlAh9CDmgrD_ua1at8%hpkE} z-|NONMaxblhdl%&8vXP7b@%JnU%&VIKwDc#z$fJ`=5|# zLR`>9O-hMrDK3eW_oO^&Z`{lB-jpxxkNa8PmkOkV@gU3lQ!VLGJjC*WRBJjM53_tQ z)s}9Lx3hdpYE`-;-of&r)av+ZT{aogPB^kRC?5UT;VG zu-<`m!ygM;s}_Du(84FA_(uH^t!+}W{!we!R%sn`Qv6YU;|ZbgnEvRzh*3iOgvjdL z2o@FEo^vKL)}Xxf!Ku<0ABBd}s*xI$6BD|5*ig;!ZFW|*CUq^>mB^$+J1t#xba@w& zLAfW|)6*T@+TGJD_Y6k+sm%B|EBO!Dy2a?*UQkWyt4|%wSQ-e! zyH!(5>57xdr0n4Y4cqvUP}qjAy$gvh#6|3%MEm!e5cg;v&5K{J=F|N6^=Sbuh+n_f zqJ{7q;IfPdwKlCC#3yGidvTZ z?#W$)hjL?iW7DE&k*r5__#5H)dLw8oHwROZDQ zkK@rK$D8+@5KldBqJWI}S~lb4Hc zepEhjv%GM*^#0pl-#91d<=Z`<8<-l$>Oma<%L_N_r8+z4L!@Z z-YK5^q&WL(=@*}~p7pluM8?#+NkV(Hyv$jZ{^G6D+_mEDm2O@(G>o-$;ltwXlg0VJ z#z1$jp1E_QaOcLkrR(pPFMYgpZWi>VFF!55j;3RGu3ju({uR1^ed9dH7SFv_V~CE$ z&)zT2eTu&2H!c?6{Iq=ge0lyf?+g0+#1f5)y)&cf-MnUxR>@R!etCIVP3w7?rpIPd zJo9C7b^-IJnrp8YKmTI!`UhB6qpWHxLMzSix{be=fdH^e~C!5K-J`1>}yB@=I-1f}aVPyyZc{uPBLO(JzLikQfrz;2Rdb;`BNO z1^0Ap!h|6D6D}}J7=t9f9TN;;##6(E5l1>)D{0ahamJhX0y8}GVjkG}oM3KXw7>)_ zRn1jeIJ)@J^3OFcC{?*wzjVA>fb~J`c|i+a0Oq_ZR%^hemK*ILizd+FSL-Z|3*r2+3`99E>%qblGkYVaY2)Oj>vGT%|JJ+t&FspRxU7R6C z&erRbZ?@Zt>Iy9Betb)yV3y zX+EmIrvMX+bw*+TWT`R5oR<>ja3w{ z{LSL^Sq`EW-S`pFdI&!ZKp2J%M_R28s#%T1Z6(NJgH9feKRF4UhDA|DEV7;Wgn%{5 z*c9JPw|xXCZlv{ts%0AHc>M8Y-D+5pwK7Q~rCV!gxCbbCkj7kb7}L_n0d%^hV|cor zt#zP{1Q|5)B@m3oSJkMiEp_sWel`swt7|&ZeoIbN!N@Wt0)x7PfmZK1IFb<|x&nJ_5!cnjsBg1Am zt^)wz7ivnZO|W8nJEJ|F(XDcg4=S{pW@zSV}U zXnKlmHGG!@ocYR5>p#sJ{G|M^w=Q>r?b?2crXnJ$<*2$*Y9)YSFqc&7E|C}!~@j}4VW^KQ<({H7#wW6y@i$#ZpWbH z6+7;FJ(T*T>Ge(bU_-a2>#!-ZFacKI?nN*wo+1mQ$gLb%SjQs^u*p}9E6h^_#gqFj zhO66)E7;QIx33gu-!08uMGagt}VgUg-sLHl#4$dF~PN)r#RdvBL<1s_kGMrNhEkV%dwUz>@4lCt7^AZ%w ze>jl$lDi0{@)d$mF2Cv3TH#juK^I1^-#IOXkk*Etm7007>);kz|E9Ii1Q94js8n06 zt;q+p2ObvC>p?iJYv-hKaa`2a%}Iu6h}uJQ(oBofS_tQZ`IdPs5Hs{(-s>+&7^|Tt z98^CX!-t{F8*;lLi2EvYarWm+$Br*uJY8NmzF0Wkpd$C!dNn?zX?dCLGJb3N|Mkr| znTNoZQ8Hb(rYJ}S`r`SU#Y62>L5w&X~mjMuVCCrHAhD{xp&tcprxVhXACsJ}&%57~B zi7R$8SHuk`GNuEAh>V2n^iYNMD>H)w(Sc~UZYHd$tkVtWhvGipA2X)u&U&70!&5m! zdp_3F+qb3vDVtqr2$iePzcK@V(SreV8*wr?Zt-oy(SyKbBU}9Vi}K}9TrcsQ{_(z{ zy+b?q%V~RD{=vwLFUX_WoIRlsv60YmHQQ->R6e+SXk-XYH`{kHC{U@{<8v2{#MMz?C6Tec))oqhdkf9HVK|4iprtuLAEjgG~}^d8qsF)-IRJ)tB_ zH;{&TiYUG7b@ZP)4AEQIX?~ZB0%! zz2g!Zj7@C(-lB( z6CQlo6+rhv^$GwKin;%4ghCEs_r4e`9XnUP{YK?te;ZE%f7KX(=l*cBS2lcT39;%PNV@-`LN#{bK~s{gqpJmMdNKuHBCLm z5DjrUukodOW(hCupi4${FU%hNHhkXBRDXHq|E$R6Y^wiS|bOw??DUSoc7G zXRNmmxmaI+H2TCc(5-S_Hb^x<^M5tWy=eVi!t~2+o`}Rx@P?)nT%9YkT|rVafS2nz zjtCDsG0MLq{U(JITBg@96Q!wnI1-}gG;%}~#SJM6{JR|93>7!5C`WQ?inmzpU|&1Q&P91SdOCi7AZINvZ+5}OrGHSU~llj;M!mpYooE5Z>_{z+4j-Z z5RDpJZGu6D0P$7aU#~qAMILtpilSu_iW2`mdzwfhYNj8}Sd(3qcZq5ofZk;BaM(r9 zi7csx0jmTSNhZGYf52t(D3~@p)hd(v6o%F;I?(ZrD|2EmuolJ6+$Zlt(FK=>zj#_c z;`aFcXrUYyxgYVtm8q&rY?1+H&+O^yq$!jae`;k0Y|>rn@!AT>YQ+PPF=naORM$=> z+8^Z1u12J{T0mqyO9{J$){-yB1y+l~OdfT8`{_;E8X!7$eRya&WWUGTnD@t?vX#lB z*7t~n)X3U_#Fdgsu7)dUn;U$NYw!1HSMAM6ygnY_tfxWAj|Zb5zLh^u`=1NFK?Fqq E8;#`: 按allure feature标签运行 -- `--story `: 按allure story标签运行 -- `--dir `: 按目录运行(相对于TestCase目录) -- `--file `: 按文件运行(相对于TestCase目录) -- `--keyword `: 按关键字运行 -- `--marker `: 按pytest标记运行 -- `--report`: 生成Allure报告 -- `--open`: 打开Allure报告 -- `--no-report`: 不生成Allure报告 - -## 报告位置 - -- Allure结果: `reports/allure-results/` -- Allure报告: `reports/allure-report/` - -## 查看报告 - -生成报告后,可以使用以下命令打开: - -```bash -allure open reports/allure-report -``` - -或者直接使用 `--open` 参数自动打开。 diff --git a/zhyy/test_case/Resource/AdapterKws/hh-qa.robot b/zhyy/test_case/Resource/AdapterKws/hh-qa.robot deleted file mode 100644 index 750156a..0000000 --- a/zhyy/test_case/Resource/AdapterKws/hh-qa.robot +++ /dev/null @@ -1,9 +0,0 @@ -*** Settings *** -*** Variables *** - -${parent_phone_1} 13400234900 # 增长业务使用(陈江)(陈洁-login、留资等也在使用),逻辑思维用户 -${parentphone_customerId_1} 6022462 #用户 13400234900逻辑思维线索id -${parent_phone_2} 12030990019 #张楠 course_package.robot(陈洁-login、留资等也在使用),中文素养用户 -${parent_phone_3} 13400234902 # 海报任务专用 - - diff --git a/zhyy/test_case/TestCase/__init__.py b/zhyy/test_case/TestCase/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/test_case/TestCase/__pycache__/__init__.cpython-38.pyc b/zhyy/test_case/TestCase/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index f93ff0910db4c6db2253a3bb5b568d62f905488d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmWIL<>g`kf(qWOOc4DTL?8o3AjbiSi&=m~3PUi1CZpdTZlX-=vg$dJ!K%m4t|DjmB3 diff --git a/zhyy/test_case/TestCase/__pycache__/test_sample.cpython-38-pytest-7.4.4.pyc b/zhyy/test_case/TestCase/__pycache__/test_sample.cpython-38-pytest-7.4.4.pyc deleted file mode 100644 index 0f3d6e462a1e66d246e16c71bc5a2cda2a449842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmYjOO>fjN5S?+n-K8HZx|NW)^-_c-v;ta+RCQ5N;YcsQWwlad)?N`vHo;ESCQ2?X zKZ65%q>=f?_K83DY%&A3^Y2`WDXS9{-;n6@7|R3j2*fVeJDesPH?hS;g!$hu^5E zTA&KNzF;d(8mnN1O~w@}{);_=I#4~eRs|7K&GUe|yy7do#w&8iq4vRQs>x6P>=x-p zfp=^&5m=7)o@T`hVRt8!U0)suE0_yN^KeiOrM24RP47@xFCL1XTR+K)T-!X9#%+gl z8ONc~nVF|aCXIFvLMs>AD{lC<84#t*_r|2g?SzZeBr*^6Wfse&%&9{IH)vqk-u1jo z_PgX|OWFaiy5#jAFx&L5yYaiDS^2dnW@SmxSe#3%XP?OIsV^GI$|Q^RI4j&nhx^6Y zhXjC}b~d1R2AePhvqPHbyTO<9D9)p$b(`MqJ$oFs+ZeYGpcjpezA#Zvo4A);|DR_3 czi&o1mOC(_h8r9wsXCAKo5l_&X#gYm3yRjZ&;S4c diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/ContractManage.py b/zhyy/test_case/TestCase/接口/SZPurchase/ContractManage.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py b/zhyy/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py deleted file mode 100644 index ebe8fb4..0000000 --- a/zhyy/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- - -import allure -import logging - -from zhyy.library.BusinessKw.SZPurchase.PurchaseOrderManage import PurchaseOrder - - -@allure.feature('深圳采购工作台采购订单页面') -class Test_purchase_order(object): - test_case = PurchaseOrder() - - def teardown_method(self): - logging.info("-----------------------------End-------------------------------") - - @allure.story("验证采购工作台采购订单页面列表查询") - def test_check_purchase_order_page(self): - purchase_order_code = 'PO251209048' # 采购单号 必填 - supplier_company_ids = ['334'] # 供应商id 非必填 - payment_status = '0' # 付款状态 非必填 - status = '0' # 采购单状态 非必填 - page_no = 1 # 页码 必填 - page_size = 10 # 每页条数 必填 - response_data = self.test_case.kw_zhyy_get_purchase_page_post( - note="采购工作台采购订单页面列表查询", - user='purchase', - order_sn=purchase_order_code, - supplier_company_ids=supplier_company_ids, - payment_status=payment_status, - status=status, - page_no=page_no, - page_size=page_size - ) - - # 断言检查 - assert response_data is not None, "响应数据不能为空" - assert 'code' in response_data, "响应数据中缺少code字段" - assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( - response_data.get('code'), response_data.get('msg', '未知错误')) - assert 'data' in response_data, "响应数据中缺少data字段" - assert response_data['data'] is not None, "响应数据中的data字段不能为空" - - # 如果传入了采购单号,检查返回的数据中是否包含该采购单号 - if purchase_order_code: - data = response_data.get('data', {}) - order_found = False - - # 检查返回的数据结构,可能包含列表或其他结构 - if isinstance(data, dict): - # 如果data是字典,可能包含records、list、data等字段 - records = data.get('records') or data.get('list') or data.get('data') or [] - if isinstance(records, list) and len(records) > 0: - # 检查列表中是否包含指定的采购单号 - for item in records: - if isinstance(item, dict): - order_sn = item.get('order_sn') or item.get('orderSn') or item.get('orderSn') - if order_sn == purchase_order_code: - order_found = True - break - elif isinstance(data, list): - # 如果data本身就是列表 - for item in data: - if isinstance(item, dict): - order_sn = item.get('order_sn') or item.get('orderSn') or item.get('orderSn') - if order_sn == purchase_order_code: - order_found = True - break - - if order_found: - logging.info("✓ 断言通过:返回的数据中包含采购单号 {}".format(purchase_order_code)) - else: - logging.warning("⚠ 警告:返回的数据中未找到采购单号: {},但接口调用成功".format(purchase_order_code)) - - logging.info("✓ 所有断言检查通过") - print("✓ 查询成功,响应数据: {}".format(response_data)) \ No newline at end of file diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py b/zhyy/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/__init__.py b/zhyy/test_case/TestCase/接口/SZPurchase/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/ContractManage.cpython-38-pytest-7.4.4.pyc b/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/ContractManage.cpython-38-pytest-7.4.4.pyc deleted file mode 100644 index 19a7fba8957d8d902747498add17a97c50baaa3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmWIL<>g`k0`;SXnIQTxh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o71wBxw~>l~Gw4 zQ&j~dN>YnU;*%4LQ)5DaEN2koS>Mv9{flFQqXJ5ck~2Ue&iQ#IMTyBJzKMB>>8W}J VmA5!-a`RJ4b5iX<=6?oa1^^v+DT4q2 diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38-pytest-7.4.4.pyc b/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38-pytest-7.4.4.pyc deleted file mode 100644 index 7e79365163d9f1e6c05f95af11e865a255aacb32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3674 zcma)8|8Eq>72nz2+uJ*z&G~G;mN+higloYv7-)-1LYpRyQk5VqWY7th*0e7Aed z?26jmm1s>1M0Rl$XjJMJA1M_{Wgu!IA_VEL{R{HL^tYBf&c8H2wW|6<)c0oZU=1X& zr=5Fm-kbO3GjC_!kGi|F3Os-N&++o#dlcoL$RwW>F#F-L1m*M3An&K;qgpxWz9KeKnVEU!)U-rD>(k~N(tf-1~#Ty?lyW>JHyJH@} zqjRS+_MXDh;PKy>G2MG)dSYto2(Q}A-(Iy{d)%oyuD{(5d~drCS;TUrtWm)A2xj&& z63t&N9aaC=x{h%5TefG7^))r^4i`PoI5A<~8=YL~fw0)YT|YH$}aE zcbNBkW>k=U8s-7r&2`YLT?^-m=I{7O3N5Bozhi4hFb7ouLG%xlL#g?HF3$>?HF5ZxoTXA`z> zCv4xR6Sikp*q#l0!Qa39-o*ml3UvhsDjunB9%lMz@xhGL_!`Rme)@H+K&-3w;k)fX zsq5eyJ9qEcIsC2RUEeHeBO|*68D7Ridl?UrU^`Mzx>1s6kuW=#LD3Yt>-mn*1MVJ%o_EoHQSxC%9M+qnmvUFvc-Md54bSe|LGc>)Ryasj3jt@+9{I% z8D%~Q#*1Wn&6cgTso^3YjAsUs9Vv3r%^Y6yT<%!Z_HDQ$G*H7~Bv=PYHQt_U+&bU9 zaHBbQ?e52Ot(iM_KfZPEy<5}y?29&sfPHCcH&}u-yM;dLQE)8OvI|ZN=w$~wbvq7Y z4?Ea;gzec!JS^S2eXDWfEws{DdZ&5qBZeSDChER@NrU_LNrStJyr{BgKn30J3Z4fl zzK2>jX6~K8+W6xKtq-q!c6$~L?j8JDv~94;$B_^k5J3+07v8^j>B{o?-?pw_e<-az zaawzXj^KQ8xG0Uo?I10ame_aV47P%=m2fWIyLjrs(j>gEiZpXZp%l2#D`oDpJS;Ay zWo;aC4+ndJ{l~)FgU#P8wXU9AK6$bA*VCWfhVgvkcYgq@oef)R%>J@5|L1mT&RuAn zy9v1m2XXnu#lhCnpBity`PhYkO7rX|jWg}e2-+f8i@*Vxcklcv33BtyeB;ea!NyKZ zXHPa4&c=~7-#rO;ZyaB+xuYO&<9HQVOJaf!imOHDetS_Gm^@)&M`DdTi3Up6c+KO! z$nLLANo|{nUg$_F6^l7FCO;YGh#ZKmqd~dimtFW+DjsNXvCiTXUQnS@)f%sON9~H` z+EqtnEN+iEXaTH^d8}&tR$S*$E~4iO=cly_^fx|8gb^T5M7vW9PrL0vm<8W&~_!6JxR6UBr}p!+nr>-!8U=jQdfLd zjd_7f8SXChmA+Gz#VT9McrZ~i5O3*(GdlTDA8g@fVpjYj42r4~gXry_LDZGM{~B<~ zo6!2as;p6Z6q6ulD6h3SlpwziemzP~jk(t!k>c8%W{@1wwVb+@Y*0<0H<2v(&5>M! z%c=$`sChL@rguKRH^oNyi_$t!%m~wxrDa(nYgtu~1{DYBoMjyk>?IUni=G$|RHngz3pjG7W~ioS5;|`Se9vN4}OC~mGV($v#Fu)22j-w=RY_x^q}1zdQ7`7 u6BFq%2kt7!$MB9GbKo1mxD&a^)MS;I-;M!#5j8lT&Zbg;T{hJmWcGi`HMm~@ diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchasePlanManage.cpython-38-pytest-7.4.4.pyc b/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchasePlanManage.cpython-38-pytest-7.4.4.pyc deleted file mode 100644 index 4b83896ff95085df7921d32e5ea5fa03b2ba740a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmWIL<>g`kf{#ZEGePuY5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!?dNYW~%DxtPCqNy diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/__init__.cpython-38.pyc b/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 3209a529f8f4192633276a3cf6ed092b98747afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmWIL<>g`k0;ZVkOc4DTL?8o3AjbiSi&=m~3PUi1CZpd3rDQ30hz$r&J#`1s7c%#!$cy@JYH95%W6 PDWy57b|8~K12F>t!~Q0c diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/index.cpython-38-pytest-7.4.4.pyc b/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/index.cpython-38-pytest-7.4.4.pyc deleted file mode 100644 index 997a65e9a460365b63e1db8e407eda5a6d07fe3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1249 zcmaKq&ubGw6vt;ao6V*sYSoK)^kTr|BpyVxSVTl<3)RaK7`B;dvUPvdnOS0r9;Av; zw7q#MY7j*QQBhHl_UzxVSG&^u0ebemjfrWg4$Rwm^JezF?`Ph%a(Rrv`1b3Dw`maa z9i7pU2WJANx(bF9PJQCg>}v!$gHRHfPM-E7mSbg+f>VI6;oCvcDN-V=r(-Irn`*i(7@BaPmk8je? z&$l+#)3tZK7ms?~PYt{_I&$Dlz*Hx}h^$P<5V>XIn4EIsE^+cuN&!ph7Xl^N+=3Dc z$>FO)X}0($Kl8AF28I6&2Cgx|Buup*j3!Shr(KHL;TOi#()sHD#>J5TFATAYkre!> z+4RC@VtV0x1V~IJ{P|Zz79iu#Yhd`9`ckXYsjI-1x*E8l+Z2Hab=8e^RMnuOAIBAI z0LwZmo5aPB)#vHjv-+$vz+BH{))qU-0WDm~qjtywp<5A0fePAz5V~}H4>Yx1=i}3G zwD27^lP1j!z-E`&2_VUIK%9zrGnNdChi(6!YEC6S2 z@Z3Y=Hgq1aHmBlKm~XGH7|k~`y({C)v||t67-*Yeq(x%JN=WdELuAgu>urXVSyO1H zBOX-@X+cJ395)7kVBFPi_A-5A!wDpb;9H_`J-ay$n|+eTzew&lKUFCvHe;b12*#2z z#)62)KCVlQ-H2VkACX8(me3S2t>yZDEJc!6I+7h(#sK!rh{5tCwlH2$=-D~TuyZ!e zb}Qw?o{K$Sd!b576N?=-^p3K{4$7*z3Q%b;3Tsldr3dhe!>yz+*c*e(83k8LlrQl` zof8PO=6iF}m7Us!Sb3pP>Poxzw;yX+KW5UB!n|-bDzc)v1<}x1jU#F@aT#&@Y#-4% R)TR)LO%4&8+C~Yq{RR@_fa3rF diff --git a/zhyy/test_case/TestCase/接口/SZPurchase/index.py b/zhyy/test_case/TestCase/接口/SZPurchase/index.py deleted file mode 100644 index 4db87c8..0000000 --- a/zhyy/test_case/TestCase/接口/SZPurchase/index.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -import allure -import logging - -from zhyy.library.BusinessKw.SZPurchase.index import PurchaseIndex - - -@allure.feature('深圳采购工作台首页') -class Test_purchase_index(object): - # config = ReadConfig.ReadConfig() # 调用读取配置文件的方法类 - test_case = PurchaseIndex() - - def teardown_method(self): - logging.info("-----------------------------End-------------------------------") - - @allure.story("验证采购工作台待办任务与在办任务功能") - def test_check_todo(self): - get_purchase_data = self.test_case.kw_zhyy_get_todo(note="采购工作台首页待办任务PO与在办任务PO", user='purchase') diff --git a/zhyy/test_case/TestCase/接口/__init__.py b/zhyy/test_case/TestCase/接口/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/test_case/TestCase/接口/__pycache__/__init__.cpython-38.pyc b/zhyy/test_case/TestCase/接口/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 9ce1ed724d671226cbde2ffa22b8646df184eafc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmWIL<>g`kf;fS!Oc4DTL?8o3AjbiSi&=m~3PUi1CZpdt5?3NJ diff --git a/zhyy/test_case/TestCase/接口/__pycache__/conftest.cpython-38-pytest-7.4.4.pyc b/zhyy/test_case/TestCase/接口/__pycache__/conftest.cpython-38-pytest-7.4.4.pyc deleted file mode 100644 index 676231a7a3bd77467ed6e1b1eb908523dd32b2b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmYjMzi-qq6t;b#_N6(l*Nug}!-X9osKiVcV2Mt$+}Nc#E^)9Op>%Cghn7P^z`)ci zLV~3?0TPJL{0&~|{pi35Gfs|HSoVA0`#!(t&ktKIAGr17&y(aA1mI^?{J*d(*4@#@ z1r8#>Ax8rkp*lBG4*>|$E71~MC^*8kLLwq?zj@?~5#)^#a%x+& z1?e{*W0hC=XoW-39w9do-3M!4amPLFPd^>Z$FI+yJ)eC)nZDUS`}WzNz4~zWbvQpc zt*Ba_4abw?-Pzl{`IqtJbZ_$VaM9qOyAfbxXE_XST*xg`k0>h&%X(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DB#VV#Mqp~ul sstQPyq!yRNCnpxC#>B^G=4F<|$LkeT-r}&y%}*)KNwov%{S3qm00Gz1?n-1:0),i=1;i1?n-1:0),i=1;i1?n-1:0),i=1;i0)for(e=0;e1?r-1:0),a=1;a1&&void 0!==arguments[1]?arguments[1]:{},r=!e._isAttached&&o(this.el),i=void 0===n.replaceElement?!!t.result(this,"replaceElement"):!!n.replaceElement;r&&triggerMethodOn(e,"before:attach",e),i?this._replaceEl(e):this.attachHtml(e),r&&(e._isAttached=!0,triggerMethodOn(e,"attach",e))},_ensureElement:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(t.isObject(this.el)||(this.$el=this.getEl(this.el),this.el=this.$el[0]),!this.$el||0===this.$el.length){var n=void 0===e.allowMissingEl?!!t.result(this,"allowMissingEl"):!!e.allowMissingEl;if(n)return!1;throw new d('An "el" must exist in DOM for this region '+this.cid)}return!0},_getView:function(t){if(!t)throw new d({name:"ViewNotValid",message:"The view passed is undefined and therefore invalid. You must pass a view instance to show."});if(t._isDestroyed)throw new d({name:"ViewDestroyedError",message:'View (cid: "'+t.cid+'") has already been destroyed and cannot be used.'});if(t instanceof e.View)return t;var n=this._getViewOptions(t);return new P(n)},_getViewOptions:function(e){return t.isFunction(e)?{template:e}:t.isObject(e)?e:{template:function(){return e}}},getEl:function(e){return this.findEls(e,t.result(this,"parentEl"))},_replaceEl:function(e){this._restoreEl(),e.on("before:destroy",this._restoreEl,this),this.replaceEl(e.el,this.el),this._isReplaced=!0},_restoreEl:function(){if(this._isReplaced){var e=this.currentView;e&&(this._detachView(e),this._isReplaced=!1)}},isReplaced:function(){return!!this._isReplaced},isSwappingView:function(){return!!this._isSwappingView},attachHtml:function(e){this.appendChildren(this.el,e.el)},empty:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{allowMissingEl:!0},t=this.currentView;if(!t)return this._ensureElement(e)&&this.detachHtml(),this;var n=!e.preventDestroy;return n||a("The preventDestroy option is deprecated. Use Region#detachView"),this._empty(t,n),this},_empty:function(e,t){e.off("destroy",this._empty,this),this.triggerMethod("before:empty",this,e),this._restoreEl(),delete this.currentView,e._isDestroyed||(t?this.removeView(e):this._detachView(e),this._stopChildViewEvents(e)),this.triggerMethod("empty",this,e)},_stopChildViewEvents:function(e){var t=this._parentView;t&&this._parentView.stopListening(e)},destroyView:function(e){return e._isDestroyed?e:(e.destroy?e.destroy():destroyBackboneView(e),e)},removeView:function(e){this.destroyView(e)},detachView:function(){var e=this.currentView;if(e)return this._empty(e),e},_detachView:function(e){var t=!!e._isAttached,n=this._isReplaced;t&&triggerMethodOn(e,"before:detach",e),n?this.replaceEl(this.el,e.el):this.detachHtml(),t&&(e._isAttached=!1,triggerMethodOn(e,"detach",e))},detachHtml:function(){this.detachContents(this.el)},hasView:function(){return!!this.currentView},reset:function(e){return this.empty(e),this.$el&&(this.el=this._initEl),delete this.$el,this},destroy:function(e){return this._isDestroyed?this:(this.reset(e),this._name&&this._parentView._removeReferences(this._name),delete this._parentView,delete this._name,v.prototype.destroy.apply(this,arguments))}});t.extend(R.prototype,b);var N=function(e,n){return e instanceof R?e:function(e,n){var r=t.extend({},n);if(t.isString(e))return t.extend(r,{el:e}),buildRegionFromObject(r);if(t.isFunction(e))return t.extend(r,{regionClass:e}),buildRegionFromObject(r);if(t.isObject(e))return e.selector&&a("The selector option on a Region definition object is deprecated. Use el to pass a selector string"),t.extend(r,{el:e.selector},e),buildRegionFromObject(r);throw new d({message:"Improper region configuration type.",url:"marionette.region.html#region-configuration-types"})}(e,n)};function buildRegionFromObject(e){var n=e.regionClass,r=t.omit(e,"regionClass");return new n(r)}var D={regionClass:R,_initRegions:function(){this.regions=this.regions||{},this._regions={},this.addRegions(t.result(this,"regions"))},_reInitRegions:function(){_(this._regions,"reset")},addRegion:function(e,t){var n={};return n[e]=t,this.addRegions(n)[e]},addRegions:function(e){if(!t.isEmpty(e))return e=this.normalizeUIValues(e,["selector","el"]),this.regions=t.extend({},this.regions,e),this._addRegions(e)},_addRegions:function(e){var n=this,r={regionClass:this.regionClass,parentEl:t.partial(t.result,this,"el")};return t.reduce(e,function(e,t,i){return e[i]=N(t,r),n._addRegion(e[i],i),e},{})},_addRegion:function(e,t){this.triggerMethod("before:add:region",this,t,e),e._parentView=this,e._name=t,this._regions[t]=e,this.triggerMethod("add:region",this,t,e)},removeRegion:function(e){var t=this._regions[e];return this._removeRegion(t,e),t},removeRegions:function(){var e=this._getRegions();return t.each(this._regions,t.bind(this._removeRegion,this)),e},_removeRegion:function(e,t){this.triggerMethod("before:remove:region",this,t,e),e.destroy(),this.triggerMethod("remove:region",this,t,e)},_removeReferences:function(e){delete this.regions[e],delete this._regions[e]},emptyRegions:function(){var e=this.getRegions();return _(e,"empty"),e},hasRegion:function(e){return!!this.getRegion(e)},getRegion:function(e){return this._isRendered||this.render(),this._regions[e]},_getRegions:function(){return t.clone(this._regions)},getRegions:function(){return this._isRendered||this.render(),this._getRegions()},showChildView:function(e,t){for(var n=this.getRegion(e),r=arguments.length,i=Array(r>2?r-2:0),a=2;a0&&void 0!==arguments[0]?arguments[0]:{},n=t.result(this,"templateContext");return t.extend(e,n)},attachElContent:function(e){return this.setInnerContent(this.el,e),this},_removeChildren:function(){this.removeRegions()},_getImmediateChildren:function(){return t.chain(this._getRegions()).map("currentView").compact().value()}},{setRenderer:function(e){this.prototype._renderHtml=e}});t.extend(P.prototype,A,D);var L=["forEach","each","map","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","toArray","first","initial","rest","last","without","isEmpty","pluck","reduce","partition"],I=function(e,n){t.each(L,function(r){e[r]=function(){var e=t.values(t.result(this,n)),i=[e].concat(t.toArray(arguments));return t[r].apply(t,i)}})},B=function(e){this._views={},this._indexByModel={},this._indexByCustom={},this._updateLength(),t.each(e,t.bind(this.add,this))};I(B.prototype,"_views"),t.extend(B.prototype,{add:function(e,t){return this._add(e,t)._updateLength()},_add:function(e,t){var n=e.cid;return this._views[n]=e,e.model&&(this._indexByModel[e.model.cid]=n),t&&(this._indexByCustom[t]=n),this},findByModel:function(e){return this.findByModelCid(e.cid)},findByModelCid:function(e){var t=this._indexByModel[e];return this.findByCid(t)},findByCustom:function(e){var t=this._indexByCustom[e];return this.findByCid(t)},findByIndex:function(e){return t.values(this._views)[e]},findByCid:function(e){return this._views[e]},remove:function(e){return this._remove(e)._updateLength()},_remove:function(e){var n=e.cid;return e.model&&delete this._indexByModel[e.model.cid],t.some(this._indexByCustom,t.bind(function(e,t){if(e===n)return delete this._indexByCustom[t],!0},this)),delete this._views[n],this},_updateLength:function(){return this.length=t.size(this._views),this}});var z=["behaviors","childView","childViewEventPrefix","childViewEvents","childViewOptions","childViewTriggers","collectionEvents","events","filter","emptyView","emptyViewOptions","modelEvents","reorderOnSort","sort","triggers","ui","viewComparator"],U=e.View.extend({sort:!0,constructor:function(n){this.render=t.bind(this.render,this),this._setOptions(n),this.mergeOptions(n,z),monitorViewEvents(this),this._initBehaviors(),this.once("render",this._initialEvents),this._initChildViewStorage(),this._bufferedChildren=[];var r=Array.prototype.slice.call(arguments);r[0]=this.options,e.View.prototype.constructor.apply(this,r),this.delegateEntityEvents(),this._triggerEventOnBehaviors("initialize",this)},_startBuffering:function(){this._isBuffering=!0},_endBuffering:function(){var e=!!this._isAttached,n=e?this._getImmediateChildren():[];this._isBuffering=!1,t.each(n,function(e){triggerMethodOn(e,"before:attach",e)}),this.attachBuffer(this,this._createBuffer()),t.each(n,function(e){e._isAttached=!0,triggerMethodOn(e,"attach",e)}),this._bufferedChildren=[]},_getImmediateChildren:function(){return t.values(this.children._views)},_initialEvents:function(){this.collection&&(this.listenTo(this.collection,"add",this._onCollectionAdd),this.listenTo(this.collection,"update",this._onCollectionUpdate),this.listenTo(this.collection,"reset",this.render),this.sort&&this.listenTo(this.collection,"sort",this._sortViews))},_onCollectionAdd:function(e,n,r){var i=void 0!==r.at&&(r.index||n.indexOf(e));(this.filter||!1===i)&&(i=t.indexOf(this._filteredSortedModels(i),e)),this._shouldAddChild(e,i)&&(this._destroyEmptyView(),this._addChild(e,i))},_onCollectionUpdate:function(e,t){var n=t.changes;this._removeChildModels(n.removed)},_removeChildModels:function(e){var t=this._getRemovedViews(e);t.length&&(this.children._updateLength(),this._updateIndices(t,!1),this.isEmpty()&&this._showEmptyView())},_getRemovedViews:function(e){var n=this;return t.reduce(e,function(e,t){var r=t&&n.children.findByModel(t);return!r||r._isDestroyed?e:(n._removeChildView(r),e.push(r),e)},[])},_removeChildView:function(e){this.triggerMethod("before:remove:child",this,e),this.children._remove(e),e.destroy?e.destroy():destroyBackboneView(e),this.stopListening(e),this.triggerMethod("remove:child",this,e)},setElement:function(){var t=!!this.el;return e.View.prototype.setElement.apply(this,arguments),t&&(this._isAttached=o(this.el)),this},render:function(){return this._isDestroyed?this:(this.triggerMethod("before:render",this),this._renderChildren(),this._isRendered=!0,this.triggerMethod("render",this),this)},setFilter:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.preventRender,r=this._isRendered&&!this._isDestroyed,i=this.filter!==e,a=r&&i&&!n;if(a){var o=this._filteredSortedModels();this.filter=e;var s=this._filteredSortedModels();this._applyModelDeltas(s,o)}else this.filter=e;return this},removeFilter:function(e){return this.setFilter(null,e)},_applyModelDeltas:function(e,n){var r=this,i={};t.each(e,function(e,t){var n=!r.children.findByModel(e);n&&r._onCollectionAdd(e,r.collection,{at:t}),i[e.cid]=!0});var a=t.filter(n,function(e){return!i[e.cid]&&r.children.findByModel(e)});this._removeChildModels(a)},reorder:function(){var e=this.children,n=this._filteredSortedModels();if(!n.length&&this._showingEmptyView)return this;var r=t.some(n,function(t){return!e.findByModel(t)});if(r)this.render();else{var i=[],a=e.reduce(function(e,r){var a=t.indexOf(n,r.model);return-1===a?(i.push(r.model),e):(r._index=a,e[a]=r.el,e)},new Array(n.length));this.triggerMethod("before:reorder",this),this._appendReorderedChildren(a),this._removeChildModels(i),this.triggerMethod("reorder",this)}return this},resortView:function(){return this.reorderOnSort?this.reorder():this._renderChildren(),this},_sortViews:function(){var e=this,n=this._filteredSortedModels(),r=t.find(n,function(t,n){var r=e.children.findByModel(t);return!r||r._index!==n});r&&this.resortView()},_emptyViewIndex:-1,_appendReorderedChildren:function(e){this.appendChildren(this.el,e)},_renderChildren:function(){this._isRendered&&(this._destroyEmptyView(),this._destroyChildren());var e=this._filteredSortedModels();this.isEmpty({processedModels:e})?this._showEmptyView():(this.triggerMethod("before:render:children",this),this._startBuffering(),this._showCollection(e),this._endBuffering(),this.triggerMethod("render:children",this))},_createView:function(e,t){var n=this._getChildView(e),r=this._getChildViewOptions(e,t),i=this.buildChildView(e,n,r);return i},_setupChildView:function(e,t){monitorViewEvents(e),this._proxyChildViewEvents(e),this.sort&&(e._index=t)},_showCollection:function(e){t.each(e,t.bind(this._addChild,this)),this.children._updateLength()},_filteredSortedModels:function(e){if(!this.collection||!this.collection.length)return[];var t=this.getViewComparator(),n=this.collection.models;if(e=Math.min(Math.max(e,0),n.length-1),t){var r=void 0;e&&(r=n[e],n=n.slice(0,e).concat(n.slice(e+1))),n=this._sortModelsBy(n,t),r&&n.splice(e,0,r)}return n=this._filterModels(n)},getViewComparator:function(){return this.viewComparator},_filterModels:function(e){var n=this;return this.filter&&(e=t.filter(e,function(e,t){return n._shouldAddChild(e,t)})),e},_sortModelsBy:function(e,n){return"string"==typeof n?t.sortBy(e,function(e){return e.get(n)}):1===n.length?t.sortBy(e,t.bind(n,this)):t.clone(e).sort(t.bind(n,this))},_showEmptyView:function(){var n=this._getEmptyView();if(n&&!this._showingEmptyView){this._showingEmptyView=!0;var r=new e.Model,i=this.emptyViewOptions||this.childViewOptions;t.isFunction(i)&&(i=i.call(this,r,this._emptyViewIndex));var a=this.buildChildView(r,n,i);this.triggerMethod("before:render:empty",this,a),this.addChildView(a,0),this.triggerMethod("render:empty",this,a)}},_destroyEmptyView:function(){this._showingEmptyView&&(this.triggerMethod("before:remove:empty",this),this._destroyChildren(),delete this._showingEmptyView,this.triggerMethod("remove:empty",this))},_getEmptyView:function(){var e=this.emptyView;if(e)return this._getView(e)},_getChildView:function(e){var t=this.childView;if(!t)throw new d({name:"NoChildViewError",message:'A "childView" must be specified'});if(!(t=this._getView(t,e)))throw new d({name:"InvalidChildViewError",message:'"childView" must be a view class or a function that returns a view class'});return t},_getView:function(n,r){return n.prototype instanceof e.View||n===e.View?n:t.isFunction(n)?n.call(this,r):void 0},_addChild:function(e,t){var n=this._createView(e,t);return this.addChildView(n,t),n},_getChildViewOptions:function(e,n){return t.isFunction(this.childViewOptions)?this.childViewOptions(e,n):this.childViewOptions},addChildView:function(e,t){return this.triggerMethod("before:add:child",this,e),this._setupChildView(e,t),this._isBuffering?this.children._add(e):(this._updateIndices(e,!0),this.children.add(e)),this._renderView(e),this._attachView(e,t),this.triggerMethod("add:child",this,e),e},_updateIndices:function(e,n){if(this.sort)if(n){var r=t.isArray(e)?t.max(e,"_index"):e;t.isObject(r)&&this.children.each(function(e){e._index>=r._index&&(e._index+=1)})}else t.each(t.sortBy(this.children._views,"_index"),function(e,t){e._index=t})},_renderView:function(e){e._isRendered||(e.supportsRenderLifecycle||triggerMethodOn(e,"before:render",e),e.render(),e.supportsRenderLifecycle||(e._isRendered=!0,triggerMethodOn(e,"render",e)))},_attachView:function(e,t){var n=!e._isAttached&&!this._isBuffering&&this._isAttached;n&&triggerMethodOn(e,"before:attach",e),this.attachHtml(this,e,t),n&&(e._isAttached=!0,triggerMethodOn(e,"attach",e))},buildChildView:function(e,n,r){var i=t.extend({model:e},r);return new n(i)},removeChildView:function(e){return!e||e._isDestroyed?e:(this._removeChildView(e),this.children._updateLength(),this._updateIndices(e,!1),e)},isEmpty:function(e){var n=void 0;return t.result(e,"processedModels")?n=e.processedModels:(n=this.collection?this.collection.models:[],n=this._filterModels(n)),0===n.length},attachBuffer:function(e,t){this.appendChildren(e.el,t)},_createBuffer:function(){var e=this,n=this.createBuffer();return t.each(this._bufferedChildren,function(t){e.appendChildren(n,t.el)}),n},attachHtml:function(e,t,n){e._isBuffering?e._bufferedChildren.splice(n,0,t):e._insertBefore(t,n)||e._insertAfter(t)},_insertBefore:function(e,t){var n=void 0,r=this.sort&&t1&&void 0!==arguments[1]?arguments[1]:this._views.length,n=e.cid;this._viewsByCid[n]=e,e.model&&(this._indexByModel[e.model.cid]=n),this._views.splice(t,0,e),this._updateLength()},_sort:function(e){return"string"==typeof e?(e=t.partial(stringComparator,e),this._sortBy(e)):1===e.length?this._sortBy(e):this._views.sort(e)},_sortBy:function(e){var n=t.sortBy(this._views,e);return this._set(n),n},_set:function(e){this._views.length=0,this._views.push.apply(this._views,e.slice(0)),this._updateLength()},findByModel:function(e){return this.findByModelCid(e.cid)},findByModelCid:function(e){var t=this._indexByModel[e];return this.findByCid(t)},findByIndex:function(e){return this._views[e]},findIndexByView:function(e){return this._views.indexOf(e)},findByCid:function(e){return this._viewsByCid[e]},_remove:function(e){if(this._viewsByCid[e.cid]){e.model&&delete this._indexByModel[e.model.cid],delete this._viewsByCid[e.cid];var t=this.findIndexByView(e);this._views.splice(t,1),this._updateLength()}},_updateLength:function(){this.length=this._views.length}});var H=["behaviors","childView","childViewEventPrefix","childViewEvents","childViewOptions","childViewTriggers","collectionEvents","emptyView","emptyViewOptions","events","modelEvents","sortWithCollection","triggers","ui","viewComparator","viewFilter"],q=e.View.extend({sortWithCollection:!0,constructor:function(t){this._setOptions(t),this.mergeOptions(t,H),monitorViewEvents(this),this.once("render",this._initialEvents),this._initChildViewStorage(),this._initBehaviors();var n=Array.prototype.slice.call(arguments);n[0]=this.options,e.View.prototype.constructor.apply(this,n),this._initEmptyRegion(),this.delegateEntityEvents(),this._triggerEventOnBehaviors("initialize",this)},_initChildViewStorage:function(){this.children=new F},_initEmptyRegion:function(){this.emptyRegion=new R({el:this.el}),this.emptyRegion._parentView=this},_initialEvents:function(){this.listenTo(this.collection,{sort:this._onCollectionSort,reset:this._onCollectionReset,update:this._onCollectionUpdate})},_onCollectionSort:function(){var e=this;if(this.sortWithCollection&&this.collection.length===this.children.length){var t=this.collection.some(function(t){return!e.children.findByModel(t)});t||this.sort()}},_onCollectionReset:function(){this.render()},_onCollectionUpdate:function(e,t){var n=t.changes,r=this._removeChildModels(n.removed);this._addChildModels(n.added),this._detachChildren(r),this._showChildren(),this._removeChildViews(r)},_removeChildModels:function(e){return t.map(e,t.bind(this._removeChildModel,this))},_removeChildModel:function(e){var t=this.children.findByModel(e);return this._removeChild(t),t},_removeChild:function(e){this.triggerMethod("before:remove:child",this,e),this.children._remove(e),this.triggerMethod("remove:child",this,e)},_addChildModels:function(e){return t.map(e,t.bind(this._addChildModel,this))},_addChildModel:function(e){var t=this._createChildView(e);return this._addChild(t),t},_createChildView:function(e){var t=this._getChildView(e),n=this._getChildViewOptions(e),r=this.buildChildView(e,t,n);return r},_addChild:function(e,t){this.triggerMethod("before:add:child",this,e),this._setupChildView(e),this.children._add(e,t),this.triggerMethod("add:child",this,e)},_getChildView:function(e){var t=this.childView;if(!t)throw new d({name:"NoChildViewError",message:'A "childView" must be specified'});if(!(t=this._getView(t,e)))throw new d({name:"InvalidChildViewError",message:'"childView" must be a view class or a function that returns a view class'});return t},_getView:function(n,r){return n.prototype instanceof e.View||n===e.View?n:t.isFunction(n)?n.call(this,r):void 0},_getChildViewOptions:function(e){return t.isFunction(this.childViewOptions)?this.childViewOptions(e):this.childViewOptions},buildChildView:function(e,n,r){var i=t.extend({model:e},r);return new n(i)},_setupChildView:function(e){monitorViewEvents(e),e.on("destroy",this.removeChildView,this),this._proxyChildViewEvents(e)},_getImmediateChildren:function(){return this.children._views},setElement:function(){var t=!!this.el;return e.View.prototype.setElement.apply(this,arguments),t&&(this._isAttached=o(this.el)),this},render:function(){return this._isDestroyed?this:(this.triggerMethod("before:render",this),this._destroyChildren(),this.children._init(),this.collection&&this._addChildModels(this.collection.models),this._showChildren(),this._isRendered=!0,this.triggerMethod("render",this),this)},sort:function(){return this._isDestroyed?this:this.children.length?(this._showChildren(),this):this},_showChildren:function(){this.isEmpty()?this._showEmptyView():(this._sortChildren(),this.filter())},isEmpty:function(e){return e||!this.children.length},_showEmptyView:function(){var e=this._getEmptyView();if(e){var t=this._getEmptyViewOptions();this.emptyRegion.show(new e(t))}},_getEmptyView:function(){var e=this.emptyView;if(e)return this._getView(e)},_destroyEmptyView:function(){this.emptyRegion.hasView()&&this.emptyRegion.empty()},_getEmptyViewOptions:function(){var e=this.emptyViewOptions||this.childViewOptions;return t.isFunction(e)?e.call(this):e},_sortChildren:function(){this.triggerMethod("before:sort",this);var e=this.getComparator();t.isFunction(e)&&(e=e.bind(this)),this.children._sort(e),this.triggerMethod("sort",this)},setComparator:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.preventRender,r=this.viewComparator!==e,i=r&&!n;return this.viewComparator=e,i&&this.sort(),this},removeComparator:function(e){return this.setComparator(null,e)},getComparator:function(){return this.viewComparator||this._viewComparator},_viewComparator:function(e){if(this.collection)return this.collection.indexOf(e.model)},filter:function(){if(this._isDestroyed)return this;if(!this.children.length)return this;var e=this._filterChildren();return this._renderChildren(e),this},_filterChildren:function(){var e=this._getFilter();if(!e)return this.children._views;this.triggerMethod("before:filter",this);var n=this.children.partition(t.bind(e,this));return this._detachChildren(n[1]),this.triggerMethod("filter",this),n[0]},_getFilter:function(){var e=this.getFilter();if(!e)return!1;if(t.isFunction(e))return e;if(t.isObject(e)){var n=t.matches(e);return function(e){return n(e.model&&e.model.attributes)}}if(t.isString(e))return function(t){return t.model&&t.model.get(e)};throw new d({name:"InvalidViewFilterError",message:'"viewFilter" must be a function, predicate object literal, a string indicating a model attribute, or falsy'})},getFilter:function(){return this.viewFilter},setFilter:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.preventRender,r=this.viewFilter!==e,i=r&&!n;return this.viewFilter=e,i&&this.filter(),this},removeFilter:function(e){return this.setFilter(null,e)},_detachChildren:function(e){t.each(e,t.bind(this._detachChildView,this))},_detachChildView:function(e){var t=!!e._isAttached;t&&triggerMethodOn(e,"before:detach",e),this.detachHtml(e),t&&(e._isAttached=!1,triggerMethodOn(e,"detach",e))},detachHtml:function(e){this.detachEl(e.el)},_renderChildren:function(e){if(this.isEmpty(!e.length))this._showEmptyView();else{this._destroyEmptyView(),this.triggerMethod("before:render:children",this,e);var t=this._getBuffer(e);this._attachChildren(t,e),this.triggerMethod("render:children",this,e)}},_attachChildren:function(e,n){var r=!!this._isAttached;n=r?n:[],t.each(n,function(e){e._isAttached||triggerMethodOn(e,"before:attach",e)}),this.attachHtml(this,e),t.each(n,function(e){e._isAttached||(e._isAttached=!0,triggerMethodOn(e,"attach",e))})},_getBuffer:function(e){var n=this,r=this.createBuffer();return t.each(e,function(e){n._renderChildView(e),n.appendChildren(r,e.el)}),r},_renderChildView:function(e){e._isRendered||(e.supportsRenderLifecycle||triggerMethodOn(e,"before:render",e),e.render(),e.supportsRenderLifecycle||(e._isRendered=!0,triggerMethodOn(e,"render",e)))},attachHtml:function(e,t){this.appendChildren(e.el,t)},addChildView:function(e,t){return!e||e._isDestroyed?e:(this._addChild(e,t),this._showChildren(),e)},detachChildView:function(e){return this.removeChildView(e,{shouldDetach:!0}),e},removeChildView:function(e,t){return e?(this._removeChildView(e,t),this._removeChild(e),this.isEmpty()&&this._showEmptyView(),e):e},_removeChildViews:function(e){t.each(e,t.bind(this._removeChildView,this))},_removeChildView:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.shouldDetach;e.off("destroy",this.removeChildView,this),n?this._detachChildView(e):this._destroyChildView(e),this.stopListening(e)},_destroyChildView:function(e){e._isDestroyed||(e.destroy?e.destroy():destroyBackboneView(e))},_removeChildren:function(){this._destroyChildren(),this.emptyRegion.destroy()},_destroyChildren:function(){this.children&&this.children.length&&(this.triggerMethod("before:destroy:children",this),this.children.each(t.bind(this._removeChildView,this)),this.triggerMethod("destroy:children",this))}});t.extend(q.prototype,A);var W=["childViewContainer","template","templateContext"],$=U.extend({constructor:function(e){a("CompositeView is deprecated. Convert to View at your earliest convenience"),this.mergeOptions(e,W),U.prototype.constructor.apply(this,arguments)},_initialEvents:function(){this.collection&&(this.listenTo(this.collection,"add",this._onCollectionAdd),this.listenTo(this.collection,"update",this._onCollectionUpdate),this.listenTo(this.collection,"reset",this.renderChildren),this.sort&&this.listenTo(this.collection,"sort",this._sortViews))},_getChildView:function(e){var t=this.childView;if(!t)return this.constructor;if(!(t=this._getView(t,e)))throw new d({name:"InvalidChildViewError",message:'"childView" must be a view class or a function that returns a view class'});return t},serializeData:function(){return this.serializeModel()},render:function(){return this._isDestroyed?this:(this._isRendering=!0,this.resetChildViewContainer(),this.triggerMethod("before:render",this),this._renderTemplate(),this.bindUIElements(),this.renderChildren(),this._isRendering=!1,this._isRendered=!0,this.triggerMethod("render",this),this)},renderChildren:function(){(this._isRendered||this._isRendering)&&U.prototype._renderChildren.call(this)},attachBuffer:function(e,t){var n=this.getChildViewContainer(e);this.appendChildren(n,t)},_insertAfter:function(e){var t=this.getChildViewContainer(this,e);this.appendChildren(t,e.el)},_appendReorderedChildren:function(e){var t=this.getChildViewContainer(this);this.appendChildren(t,e)},getChildViewContainer:function(e,n){if(e.$childViewContainer)return e.$childViewContainer;var r=void 0,i=e.childViewContainer;if(i){var a=t.result(e,"childViewContainer");if((r="@"===a.charAt(0)&&e.ui?e.ui[a.substr(4)]:this.findEls(a,e.$el)).length<=0)throw new d({name:"ChildViewContainerMissingError",message:'The specified "childViewContainer" was not found: '+e.childViewContainer})}else r=e.$el;return e.$childViewContainer=r,r},resetChildViewContainer:function(){this.$childViewContainer&&(this.$childViewContainer=void 0)}}),Y=t.pick(P.prototype,"serializeModel","getTemplate","_renderTemplate","_renderHtml","mixinTemplateContext","attachElContent");t.extend($.prototype,Y);var G=["collectionEvents","events","modelEvents","triggers","ui"],X=v.extend({cidPrefix:"mnb",constructor:function(e,n){this.view=n,this.defaults&&a("Behavior defaults are deprecated. For similar functionality set options on the Behavior class."),this.defaults=t.clone(t.result(this,"defaults",{})),this._setOptions(this.defaults,e),this.mergeOptions(this.options,G),this.ui=t.extend({},t.result(this,"ui"),t.result(n,"ui")),v.apply(this,arguments)},$:function(){return this.view.$.apply(this.view,arguments)},destroy:function(){return this.stopListening(),this.view._removeBehavior(this),this},proxyViewProperties:function(){return this.$el=this.view.$el,this.el=this.view.el,this},bindUIElements:function(){return this._bindUIElements(),this},unbindUIElements:function(){return this._unbindUIElements(),this},getUI:function(e){return this._getUI(e)},delegateEntityEvents:function(){return this._delegateEntityEvents(this.view.model,this.view.collection),this},undelegateEntityEvents:function(){return this._undelegateEntityEvents(this.view.model,this.view.collection),this},getEvents:function(){var e=this,n=this.normalizeUIKeys(t.result(this,"events"));return t.reduce(n,function(n,r,i){if(t.isFunction(r)||(r=e[r]),r)return i=C(i),n[i]=t.bind(r,e),n},{})},getTriggers:function(){if(this.triggers){var e=this.normalizeUIKeys(t.result(this,"triggers"));return this._getViewTriggers(this.view,e)}}});t.extend(X.prototype,x,T,M);var K=["region","regionClass"],Z=v.extend({cidPrefix:"mna",constructor:function(e){this._setOptions(e),this.mergeOptions(e,K),this._initRegion(),v.prototype.constructor.apply(this,arguments)},regionClass:R,_initRegion:function(){var e=this.region;if(e){var t={regionClass:this.regionClass};this._region=N(e,t)}},getRegion:function(){return this._region},showView:function(e){for(var t=this.getRegion(),n=arguments.length,r=Array(n>1?n-1:0),i=1;ithis.length&&(i=this.length),i<0&&(i+=this.length+1);var a,o,s=[],l=[],u=[],c=[],f={},h=t.add,d=t.merge,p=t.remove,g=!1,m=this.comparator&&null==i&&!1!==t.sort,v=n.isString(this.comparator)?this.comparator:null;for(o=0;o7),this._useHashChange=this._wantsHashChange&&this._hasHashChange,this._wantsPushState=!!this.options.pushState,this._hasPushState=!(!this.history||!this.history.pushState),this._usePushState=this._wantsPushState&&this._hasPushState,this.fragment=this.getFragment(),this.root=("/"+this.root+"/").replace(V,"/"),this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var t=this.root.slice(0,-1)||"/";return this.location.replace(t+"#"+this.getPath()),!0}this._hasPushState&&this.atRoot()&&this.navigate(this.getHash(),{replace:!0})}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe"),this.iframe.src="javascript:0",this.iframe.style.display="none",this.iframe.tabIndex=-1;var r=document.body,i=r.insertBefore(this.iframe,r.firstChild).contentWindow;i.document.open(),i.document.close(),i.location.hash="#"+this.fragment}var a=window.addEventListener||function(e,t){return attachEvent("on"+e,t)};if(this._usePushState?a("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe?a("hashchange",this.checkUrl,!1):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),!this.options.silent)return this.loadUrl()},stop:function(){var e=window.removeEventListener||function(e,t){return detachEvent("on"+e,t)};this._usePushState?e("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe&&e("hashchange",this.checkUrl,!1),this.iframe&&(document.body.removeChild(this.iframe),this.iframe=null),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),N.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();if(t===this.fragment&&this.iframe&&(t=this.getHash(this.iframe.contentWindow)),t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()},loadUrl:function(e){return!!this.matchRoot()&&(e=this.fragment=this.getFragment(e),n.some(this.handlers,function(t){if(t.route.test(e))return t.callback(e),!0}))},navigate:function(e,t){if(!N.started)return!1;t&&!0!==t||(t={trigger:!!t}),e=this.getFragment(e||"");var n=this.root;""!==e&&"?"!==e.charAt(0)||(n=n.slice(0,-1)||"/");var r=n+e;if(e=this.decodeFragment(e.replace(j,"")),this.fragment!==e){if(this.fragment=e,this._usePushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,r);else{if(!this._wantsHashChange)return this.location.assign(r);if(this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getHash(this.iframe.contentWindow)){var i=this.iframe.contentWindow;t.replace||(i.document.open(),i.document.close()),this._updateHash(i.location,e,t.replace)}}return t.trigger?this.loadUrl(e):void 0}},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),t.history=new N,b.extend=y.extend=E.extend=k.extend=N.extend=function(e,t){var r,i=this;return r=e&&n.has(e,"constructor")?e.constructor:function(){return i.apply(this,arguments)},n.extend(r,i,t),r.prototype=n.create(i.prototype,e),r.prototype.constructor=r,r.__super__=i.prototype,r};var P=function(){throw new Error('A "url" property or function must be specified')},L=function(e,t){var n=t.error;t.error=function(r){n&&n.call(t.context,e,r,t),e.trigger("error",e,r,t)}};return t}(o,n,e,t)}.apply(t,i))||(e.exports=a)}).call(this,n(29))},function(e,t,n){(function(e,n){var r;!function(){var i="object"==typeof self&&self.self===self&&self||"object"==typeof e&&e.global===e&&e||this||{},a=i._,o=Array.prototype,s=Object.prototype,l="undefined"!=typeof Symbol?Symbol.prototype:null,u=o.push,c=o.slice,f=s.toString,h=s.hasOwnProperty,d=Array.isArray,p=Object.keys,g=Object.create,m=function(){},v=function(e){return e instanceof v?e:this instanceof v?void(this._wrapped=e):new v(e)};t.nodeType?i._=v:(!n.nodeType&&n.exports&&(t=n.exports=v),t._=v),v.VERSION="1.9.1";var b,y=function(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,a){return e.call(t,n,r,i,a)}}return function(){return e.apply(t,arguments)}},_=function(e,t,n){return v.iteratee!==b?v.iteratee(e,t):null==e?v.identity:v.isFunction(e)?y(e,t,n):v.isObject(e)&&!v.isArray(e)?v.matcher(e):v.property(e)};v.iteratee=b=function(e,t){return _(e,t,1/0)};var w=function(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;i=0&&t<=T};v.each=v.forEach=function(e,t,n){var r,i;if(t=y(t,n),M(e))for(r=0,i=e.length;r=3;return function(t,n,r,i){var a=!M(t)&&v.keys(t),o=(a||t).length,s=e>0?0:o-1;for(i||(r=t[a?a[s]:s],s+=e);s>=0&&s=0},v.invoke=w(function(e,t,n){var r,i;return v.isFunction(t)?i=t:v.isArray(t)&&(r=t.slice(0,-1),t=t[t.length-1]),v.map(e,function(e){var a=i;if(!a){if(r&&r.length&&(e=S(e,r)),null==e)return;a=e[t]}return null==a?a:a.apply(e,n)})}),v.pluck=function(e,t){return v.map(e,v.property(t))},v.where=function(e,t){return v.filter(e,v.matcher(t))},v.findWhere=function(e,t){return v.find(e,v.matcher(t))},v.max=function(e,t,n){var r,i,a=-1/0,o=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,l=(e=M(e)?e:v.values(e)).length;sa&&(a=r);else t=_(t,n),v.each(e,function(e,n,r){((i=t(e,n,r))>o||i===-1/0&&a===-1/0)&&(a=e,o=i)});return a},v.min=function(e,t,n){var r,i,a=1/0,o=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,l=(e=M(e)?e:v.values(e)).length;sr||void 0===n)return 1;if(n0?0:i-1;a>=0&&a0?o=a>=0?a:Math.max(a+s,o):s=a>=0?Math.min(a+1,s):a+s+1;else if(n&&a&&s)return r[a=n(r,i)]===i?a:-1;if(i!=i)return(a=t(c.call(r,o,s),v.isNaN))>=0?a+o:-1;for(a=e>0?o:s-1;a>=0&&at?(r&&(clearTimeout(r),r=null),s=u,o=e.apply(i,a),r||(i=a=null)):r||!1===n.trailing||(r=setTimeout(l,c)),o};return u.cancel=function(){clearTimeout(r),s=0,r=i=a=null},u},v.debounce=function(e,t,n){var r,i,a=function(t,n){r=null,n&&(i=e.apply(t,n))},o=w(function(o){if(r&&clearTimeout(r),n){var s=!r;r=setTimeout(a,t),s&&(i=e.apply(this,o))}else r=v.delay(a,t,this,o);return i});return o.cancel=function(){clearTimeout(r),r=null},o},v.wrap=function(e,t){return v.partial(t,e)},v.negate=function(e){return function(){return!e.apply(this,arguments)}},v.compose=function(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}},v.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},v.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},v.once=v.partial(v.before,2),v.restArguments=w;var P=!{toString:null}.propertyIsEnumerable("toString"),L=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],I=function(e,t){var n=L.length,r=e.constructor,i=v.isFunction(r)&&r.prototype||s,a="constructor";for(C(e,a)&&!v.contains(t,a)&&t.push(a);n--;)(a=L[n])in e&&e[a]!==i[a]&&!v.contains(t,a)&&t.push(a)};v.keys=function(e){if(!v.isObject(e))return[];if(p)return p(e);var t=[];for(var n in e)C(e,n)&&t.push(n);return P&&I(e,t),t},v.allKeys=function(e){if(!v.isObject(e))return[];var t=[];for(var n in e)t.push(n);return P&&I(e,t),t},v.values=function(e){for(var t=v.keys(e),n=t.length,r=Array(n),i=0;i1&&(r=y(r,t[1])),t=v.allKeys(e)):(r=F,t=N(t,!1,!1),e=Object(e));for(var i=0,a=t.length;i1&&(n=t[1])):(t=v.map(N(t,!1,!1),String),r=function(e,n){return!v.contains(t,n)}),v.pick(e,r,n)}),v.defaults=B(v.allKeys,!0),v.create=function(e,t){var n=x(e);return t&&v.extendOwn(n,t),n},v.clone=function(e){return v.isObject(e)?v.isArray(e)?e.slice():v.extend({},e):e},v.tap=function(e,t){return t(e),e},v.isMatch=function(e,t){var n=v.keys(t),r=n.length;if(null==e)return!r;for(var i=Object(e),a=0;a":">",'"':""","'":"'","`":"`"},W=v.invert(q),$=function(e){var t=function(t){return e[t]},n="(?:"+v.keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(i,t):e}};v.escape=$(q),v.unescape=$(W),v.result=function(e,t,n){v.isArray(t)||(t=[t]);var r=t.length;if(!r)return v.isFunction(n)?n.call(e):n;for(var i=0;i/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var G=/(.)^/,X={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},K=/\\|'|\r|\n|\u2028|\u2029/g,Z=function(e){return"\\"+X[e]};v.template=function(e,t,n){!t&&n&&(t=n),t=v.defaults({},t,v.templateSettings);var r,i=RegExp([(t.escape||G).source,(t.interpolate||G).source,(t.evaluate||G).source].join("|")+"|$","g"),a=0,o="__p+='";e.replace(i,function(t,n,r,i,s){return o+=e.slice(a,s).replace(K,Z),a=s+t.length,n?o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?o+="'+\n((__t=("+r+"))==null?'':__t)+\n'":i&&(o+="';\n"+i+"\n__p+='"),t}),o+="';\n",t.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(t.variable||"obj","_",o)}catch(e){throw e.source=o,e}var s=function(e){return r.call(this,e,v)},l=t.variable||"obj";return s.source="function("+l+"){\n"+o+"}",s},v.chain=function(e){var t=v(e);return t._chain=!0,t};var J=function(e,t){return e._chain?v(t).chain():t};v.mixin=function(e){return v.each(v.functions(e),function(t){var n=v[t]=e[t];v.prototype[t]=function(){var e=[this._wrapped];return u.apply(e,arguments),J(this,n.apply(v,e))}}),v},v.mixin(v),v.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=o[e];v.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],J(this,n)}}),v.each(["concat","join","slice"],function(e){var t=o[e];v.prototype[e]=function(){return J(this,t.apply(this._wrapped,arguments))}}),v.prototype.value=function(){return this._wrapped},v.prototype.valueOf=v.prototype.toJSON=v.prototype.value,v.prototype.toString=function(){return String(this._wrapped)},void 0===(r=function(){return v}.apply(t,[]))||(n.exports=r)}()}).call(this,n(29),n(42)(e))},function(e,t,n){var r; -/*! - * jQuery JavaScript Library v3.4.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2019-04-10T19:48Z - */ -/*! - * jQuery JavaScript Library v3.4.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2019-04-10T19:48Z - */ -!function(t,n){"use strict";"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,function(n,i){"use strict";var a=[],o=n.document,s=Object.getPrototypeOf,l=a.slice,u=a.concat,c=a.push,f=a.indexOf,h={},d=h.toString,p=h.hasOwnProperty,g=p.toString,m=g.call(Object),v={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},y=function(e){return null!=e&&e===e.window},_={type:!0,src:!0,nonce:!0,noModule:!0};function DOMEval(e,t,n){var r,i,a=(n=n||o).createElement("script");if(a.text=e,t)for(r in _)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&a.setAttribute(r,i);n.head.appendChild(a).parentNode.removeChild(a)}function toType(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?h[d.call(e)]||"object":typeof e}var w=function(e,t){return new w.fn.init(e,t)},x=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function isArrayLike(e){var t=!!e&&"length"in e&&e.length,n=toType(e);return!b(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}w.fn=w.prototype={jquery:"3.4.0",constructor:w,length:0,toArray:function(){return l.call(this)},get:function(e){return null==e?l.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(l.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+L+")"+L+"*"),W=new RegExp(L+"|>"),$=new RegExp(z),Y=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+z),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/HTML$/i,K=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ae=function(){h()},oe=addCombinator(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{D.apply(O=V.call(w.childNodes),w.childNodes),O[w.childNodes.length].nodeType}catch(e){D={apply:O.length?function(e,t){N.apply(e,V.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function Sizzle(e,t,r,i){var a,s,u,c,f,p,v,b=t&&t.ownerDocument,x=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&h(t),t=t||d,g)){if(11!==x&&(f=Q.exec(e)))if(a=f[1]){if(9===x){if(!(u=t.getElementById(a)))return r;if(u.id===a)return r.push(u),r}else if(b&&(u=b.getElementById(a))&&y(t,u)&&u.id===a)return r.push(u),r}else{if(f[2])return D.apply(r,t.getElementsByTagName(e)),r;if((a=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return D.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&!E[e+" "]&&(!m||!m.test(e))&&(1!==x||"object"!==t.nodeName.toLowerCase())){if(v=e,b=t,1===x&&W.test(e)){for((c=t.getAttribute("id"))?c=c.replace(re,ie):t.setAttribute("id",c=_),s=(p=o(e)).length;s--;)p[s]="#"+c+" "+toSelector(p[s]);v=p.join(","),b=ee.test(e)&&testContext(t.parentNode)||t}try{return D.apply(r,b.querySelectorAll(v)),r}catch(t){E(e,!0)}finally{c===_&&t.removeAttribute("id")}}}return l(e.replace(F,"$1"),t,r,i)}function createCache(){var e=[];return function cache(t,n){return e.push(t+" ")>r.cacheLength&&delete cache[e.shift()],cache[t+" "]=n}}function markFunction(e){return e[_]=!0,e}function assert(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function addHandle(e,t){for(var n=e.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=t}function siblingCheck(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function createInputPseudo(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function createButtonPseudo(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function createDisabledPseudo(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&oe(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function createPositionalPseudo(e){return markFunction(function(t){return t=+t,markFunction(function(n,r){for(var i,a=e([],n.length,t),o=a.length;o--;)n[i=a[o]]&&(n[i]=!(r[i]=n[i]))})})}function testContext(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=Sizzle.support={},a=Sizzle.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!X.test(t||n&&n.nodeName||"HTML")},h=Sizzle.setDocument=function(e){var t,i,o=e?e.ownerDocument||e:w;return o!==d&&9===o.nodeType&&o.documentElement?(p=(d=o).documentElement,g=!a(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",ae,!1):i.attachEvent&&i.attachEvent("onunload",ae)),n.attributes=assert(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=assert(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=J.test(d.getElementsByClassName),n.getById=assert(function(e){return p.appendChild(e).id=_,!d.getElementsByName||!d.getElementsByName(_).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,r,i,a=t.getElementById(e);if(a){if((n=a.getAttributeNode("id"))&&n.value===e)return[a];for(i=t.getElementsByName(e),r=0;a=i[r++];)if((n=a.getAttributeNode("id"))&&n.value===e)return[a]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,a=t.getElementsByTagName(e);if("*"===e){for(;n=a[i++];)1===n.nodeType&&r.push(n);return r}return a},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],m=[],(n.qsa=J.test(d.querySelectorAll))&&(assert(function(e){p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+L+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+L+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+_+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+_+"+*").length||m.push(".#.+[+~]")}),assert(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+L+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=J.test(b=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&assert(function(e){n.disconnectedMatch=b.call(e,"*"),b.call(e,"[s!='']:x"),v.push("!=",z)}),m=m.length&&new RegExp(m.join("|")),v=v.length&&new RegExp(v.join("|")),t=J.test(p.compareDocumentPosition),y=t||J.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},M=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&y(w,e)?-1:t===d||t.ownerDocument===w&&y(w,t)?1:c?j(c,e)-j(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,a=t.parentNode,o=[e],s=[t];if(!i||!a)return e===d?-1:t===d?1:i?-1:a?1:c?j(c,e)-j(c,t):0;if(i===a)return siblingCheck(e,t);for(n=e;n=n.parentNode;)o.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;o[r]===s[r];)r++;return r?siblingCheck(o[r],s[r]):o[r]===w?-1:s[r]===w?1:0},d):d},Sizzle.matches=function(e,t){return Sizzle(e,null,null,t)},Sizzle.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&h(e),n.matchesSelector&&g&&!E[t+" "]&&(!v||!v.test(t))&&(!m||!m.test(t)))try{var r=b.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){E(t,!0)}return Sizzle(t,d,null,[e]).length>0},Sizzle.contains=function(e,t){return(e.ownerDocument||e)!==d&&h(e),y(e,t)},Sizzle.attr=function(e,t){(e.ownerDocument||e)!==d&&h(e);var i=r.attrHandle[t.toLowerCase()],a=i&&A.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==a?a:n.attributes||!g?e.getAttribute(t):(a=e.getAttributeNode(t))&&a.specified?a.value:null},Sizzle.escape=function(e){return(e+"").replace(re,ie)},Sizzle.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},Sizzle.uniqueSort=function(e){var t,r=[],i=0,a=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(M),f){for(;t=e[a++];)t===e[a]&&(i=r.push(a));for(;i--;)e.splice(r[i],1)}return c=null,e},i=Sizzle.getText=function(e){var t,n="",r=0,a=e.nodeType;if(a){if(1===a||9===a||11===a){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===a||4===a)return e.nodeValue}else for(;t=e[r++];)n+=i(t);return n},(r=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||Sizzle.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&Sizzle.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&$.test(n)&&(t=o(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=new RegExp("(^|"+L+")"+e+"("+L+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=Sizzle.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(U," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var a="nth"!==e.slice(0,3),o="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,f,h,d,p,g=a!==o?"nextSibling":"previousSibling",m=t.parentNode,v=s&&t.nodeName.toLowerCase(),b=!l&&!s,y=!1;if(m){if(a){for(;g;){for(h=t;h=h[g];)if(s?h.nodeName.toLowerCase()===v:1===h.nodeType)return!1;p=g="only"===e&&!p&&"nextSibling"}return!0}if(p=[o?m.firstChild:m.lastChild],o&&b){for(y=(d=(u=(c=(f=(h=m)[_]||(h[_]={}))[h.uniqueID]||(f[h.uniqueID]={}))[e]||[])[0]===x&&u[1])&&u[2],h=d&&m.childNodes[d];h=++d&&h&&h[g]||(y=d=0)||p.pop();)if(1===h.nodeType&&++y&&h===t){c[e]=[x,d,y];break}}else if(b&&(y=d=(u=(c=(f=(h=t)[_]||(h[_]={}))[h.uniqueID]||(f[h.uniqueID]={}))[e]||[])[0]===x&&u[1]),!1===y)for(;(h=++d&&h&&h[g]||(y=d=0)||p.pop())&&((s?h.nodeName.toLowerCase()!==v:1!==h.nodeType)||!++y||(b&&((c=(f=h[_]||(h[_]={}))[h.uniqueID]||(f[h.uniqueID]={}))[e]=[x,y]),h!==t)););return(y-=i)===r||y%r==0&&y/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||Sizzle.error("unsupported pseudo: "+e);return i[_]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?markFunction(function(e,n){for(var r,a=i(e,t),o=a.length;o--;)e[r=j(e,a[o])]=!(n[r]=a[o])}):function(e){return i(e,0,n)}):i}},pseudos:{not:markFunction(function(e){var t=[],n=[],r=s(e.replace(F,"$1"));return r[_]?markFunction(function(e,t,n,i){for(var a,o=r(e,null,i,[]),s=e.length;s--;)(a=o[s])&&(e[s]=!(t[s]=a))}):function(e,i,a){return t[0]=e,r(t,null,a,n),t[0]=null,!n.pop()}}),has:markFunction(function(e){return function(t){return Sizzle(e,t).length>0}}),contains:markFunction(function(e){return e=e.replace(te,ne),function(t){return(t.textContent||i(t)).indexOf(e)>-1}}),lang:markFunction(function(e){return Y.test(e||"")||Sizzle.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===p},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:createDisabledPseudo(!1),disabled:createDisabledPseudo(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Z.test(e.nodeName)},input:function(e){return K.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:createPositionalPseudo(function(){return[0]}),last:createPositionalPseudo(function(e,t){return[t-1]}),eq:createPositionalPseudo(function(e,t,n){return[n<0?n+t:n]}),even:createPositionalPseudo(function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e}),gt:createPositionalPseudo(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function condense(e,t,n,r,i){for(var a,o=[],s=0,l=e.length,u=null!=t;s-1&&(a[u]=!(o[u]=f))}}else v=condense(v===o?v.splice(p,v.length):v),i?i(null,o,v,l):D.apply(o,v)})}function matcherFromTokens(e){for(var t,n,i,a=e.length,o=r.relative[e[0].type],s=o||r.relative[" "],l=o?1:0,c=addCombinator(function(e){return e===t},s,!0),f=addCombinator(function(e){return j(t,e)>-1},s,!0),h=[function(e,n,r){var i=!o&&(r||n!==u)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];l1&&elementMatcher(h),l>1&&toSelector(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(F,"$1"),n,l0,i=e.length>0,a=function(a,o,s,l,c){var f,p,m,v=0,b="0",y=a&&[],_=[],w=u,k=a||i&&r.find.TAG("*",c),C=x+=null==w?1:Math.random()||.1,S=k.length;for(c&&(u=o===d||o||c);b!==S&&null!=(f=k[b]);b++){if(i&&f){for(p=0,o||f.ownerDocument===d||(h(f),s=!g);m=e[p++];)if(m(f,o||d,s)){l.push(f);break}c&&(x=C)}n&&((f=!m&&f)&&v--,a&&y.push(f))}if(v+=b,n&&b!==v){for(p=0;m=t[p++];)m(y,_,o,s);if(a){if(v>0)for(;b--;)y[b]||_[b]||(_[b]=R.call(l));_=condense(_)}D.apply(l,_),c&&!a&&_.length>0&&v+t.length>1&&Sizzle.uniqueSort(l)}return c&&(x=C,u=w),y};return n?markFunction(a):a}(a,i))).selector=e}return s},l=Sizzle.select=function(e,t,n,i){var a,l,u,c,f,h="function"==typeof e&&e,d=!i&&o(e=h.selector||e);if(n=n||[],1===d.length){if((l=d[0]=d[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===t.nodeType&&g&&r.relative[l[1].type]){if(!(t=(r.find.ID(u.matches[0].replace(te,ne),t)||[])[0]))return n;h&&(t=t.parentNode),e=e.slice(l.shift().value.length)}for(a=G.needsContext.test(e)?0:l.length;a--&&(u=l[a],!r.relative[c=u.type]);)if((f=r.find[c])&&(i=f(u.matches[0].replace(te,ne),ee.test(l[0].type)&&testContext(t.parentNode)||t))){if(l.splice(a,1),!(e=i.length&&toSelector(l)))return D.apply(n,i),n;break}}return(h||s(e,d))(i,t,!g,n,!t||ee.test(e)&&testContext(t.parentNode)||t),n},n.sortStable=_.split("").sort(M).join("")===_,n.detectDuplicates=!!f,h(),n.sortDetached=assert(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),assert(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||addHandle("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&assert(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||addHandle("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),assert(function(e){return null==e.getAttribute("disabled")})||addHandle(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),Sizzle}(n);w.find=k,w.expr=k.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=k.uniqueSort,w.text=k.getText,w.isXMLDoc=k.isXML,w.contains=k.contains,w.escapeSelector=k.escape;var C=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},T=w.expr.match.needsContext;function nodeName(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function winnow(e,t,n){return b(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return f.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(winnow(this,e||[],!1))},not:function(e){return this.pushStack(winnow(this,e||[],!0))},is:function(e){return!!winnow(this,"string"==typeof e&&T.test(e)?w(e):e||[],!1).length}});var M,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||M,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:A.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),E.test(r[1])&&w.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=o.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,M=w(o);var O=/^(?:parents|prev(?:Until|All))/,R={children:!0,contents:!0,next:!0,prev:!0};function sibling(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){a.push(n);break}return this.pushStack(a.length>1?w.uniqueSort(a):a)},index:function(e){return e?"string"==typeof e?f.call(w(e),this[0]):f.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return C(e,"parentNode")},parentsUntil:function(e,t,n){return C(e,"parentNode",n)},next:function(e){return sibling(e,"nextSibling")},prev:function(e){return sibling(e,"previousSibling")},nextAll:function(e){return C(e,"nextSibling")},prevAll:function(e){return C(e,"previousSibling")},nextUntil:function(e,t,n){return C(e,"nextSibling",n)},prevUntil:function(e,t,n){return C(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return void 0!==e.contentDocument?e.contentDocument:(nodeName(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(R[e]||w.uniqueSort(i),O.test(e)&&i.reverse()),this.pushStack(i)}});var N=/[^\x20\t\r\n\f]+/g;function Identity(e){return e}function Thrower(e){throw e}function adoptValue(e,t,n,r){var i;try{e&&b(i=e.promise)?i.call(e).done(t).fail(n):e&&b(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return w.each(e.match(N)||[],function(e,n){t[n]=!0}),t}(e):w.extend({},e);var t,n,r,i,a=[],o=[],s=-1,l=function(){for(i=i||e.once,r=t=!0;o.length;s=-1)for(n=o.shift();++s-1;)a.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=o=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=o=[],n||t||(a=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],o.push(n),t||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!r}};return u},w.extend({Deferred:function(e){var t=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return a.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(n){w.each(t,function(t,r){var i=b(e[r[4]])&&e[r[4]];a[r[1]](function(){var e=i&&i.apply(this,arguments);e&&b(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(e,r,i){var a=0;function resolve(e,t,r,i){return function(){var o=this,s=arguments,l=function(){var n,l;if(!(e=a&&(r!==Thrower&&(o=void 0,s=[n]),t.rejectWith(o,s))}};e?u():(w.Deferred.getStackHook&&(u.stackTrace=w.Deferred.getStackHook()),n.setTimeout(u))}}return w.Deferred(function(n){t[0][3].add(resolve(0,n,b(i)?i:Identity,n.notifyWith)),t[1][3].add(resolve(0,n,b(e)?e:Identity)),t[2][3].add(resolve(0,n,b(r)?r:Thrower))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},a={};return w.each(t,function(e,n){var o=n[2],s=n[5];i[n[1]]=o.add,s&&o.add(function(){r=s},t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),o.add(n[3].fire),a[n[0]]=function(){return a[n[0]+"With"](this===a?void 0:this,arguments),this},a[n[0]+"With"]=o.fireWith}),i.promise(a),e&&e.call(a,a),a},when:function(e){var t=arguments.length,n=t,r=Array(n),i=l.call(arguments),a=w.Deferred(),o=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?l.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(adoptValue(e,a.done(o(n)).resolve,a.reject,!t),"pending"===a.state()||b(i[n]&&i[n].then)))return a.then();for(;n--;)adoptValue(i[n],o(n),a.reject);return a.promise()}});var D=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(e,t){n.console&&n.console.warn&&e&&D.test(e.name)&&n.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},w.readyException=function(e){n.setTimeout(function(){throw e})};var V=w.Deferred();function completed(){o.removeEventListener("DOMContentLoaded",completed),n.removeEventListener("load",completed),w.ready()}w.fn.ready=function(e){return V.then(e).catch(function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||V.resolveWith(o,[w]))}}),w.ready.then=V.then,"complete"===o.readyState||"loading"!==o.readyState&&!o.documentElement.doScroll?n.setTimeout(w.ready):(o.addEventListener("DOMContentLoaded",completed),n.addEventListener("load",completed));var j=function(e,t,n,r,i,a,o){var s=0,l=e.length,u=null==n;if("object"===toType(n))for(s in i=!0,n)j(e,t,s,n[s],!0,a,o);else if(void 0!==r&&(i=!0,b(r)||(o=!0),u&&(o?(t.call(e,r),t=null):(u=t,t=function(e,t,n){return u.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=B.get(e,t),n&&(!r||Array.isArray(n)?r=B.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),a=w._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete a.stop,i.call(e,function(){w.dequeue(e,t)},a)),!r&&a&&a.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return B.get(e,n)||B.access(e,n,{empty:w.Callbacks("once memory").add(function(){B.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,ee=/^$|^module$|\/(?:java|ecma)script/i,te={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function getAll(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&nodeName(e,t)?w.merge([e],n):n}function setGlobalEval(e,t){for(var n=0,r=e.length;n-1)i&&i.push(a);else if(u=Y(a),o=getAll(f.appendChild(a),"script"),u&&setGlobalEval(o),n)for(c=0;a=o[c++];)ee.test(a.type||"")&&n.push(a);return f}ne=o.createDocumentFragment().appendChild(o.createElement("div")),(re=o.createElement("input")).setAttribute("type","radio"),re.setAttribute("checked","checked"),re.setAttribute("name","t"),ne.appendChild(re),v.checkClone=ne.cloneNode(!0).cloneNode(!0).lastChild.checked,ne.innerHTML="",v.noCloneChecked=!!ne.cloneNode(!0).lastChild.defaultValue;var ae=/^key/,oe=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,se=/^([^.]*)(?:\.(.+)|)/;function returnTrue(){return!0}function returnFalse(){return!1}function expectSync(e,t){return e===function(){try{return o.activeElement}catch(e){}}()==("focus"===t)}function on(e,t,n,r,i,a){var o,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)on(e,s,n,r,t[s],a);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=returnFalse;else if(!i)return e;return 1===a&&(o=i,(i=function(e){return w().off(e),o.apply(this,arguments)}).guid=o.guid||(o.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}function leverageNative(e,t,n){n?(B.set(e,t,!1),w.event.add(e,t,{namespace:!1,handler:function(e){var r,i,a=B.get(this,t);if(1&e.isTrigger&&this[t]){if(a)(w.event.special[t]||{}).delegateType&&e.stopPropagation();else if(a=l.call(arguments),B.set(this,t,a),r=n(this,t),this[t](),a!==(i=B.get(this,t))||r?B.set(this,t,!1):i=void 0,a!==i)return e.stopImmediatePropagation(),e.preventDefault(),i}else a&&(B.set(this,t,w.event.trigger(w.extend(a.shift(),w.Event.prototype),a,this)),e.stopImmediatePropagation())}})):w.event.add(e,t,returnTrue)}w.event={global:{},add:function(e,t,n,r,i){var a,o,s,l,u,c,f,h,d,p,g,m=B.get(e);if(m)for(n.handler&&(n=(a=n).handler,i=a.selector),i&&w.find.matchesSelector($,i),n.guid||(n.guid=w.guid++),(l=m.events)||(l=m.events={}),(o=m.handle)||(o=m.handle=function(t){return void 0!==w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),u=(t=(t||"").match(N)||[""]).length;u--;)d=g=(s=se.exec(t[u])||[])[1],p=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:p.join(".")},a),(h=l[d])||((h=l[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,p,o)||e.addEventListener&&e.addEventListener(d,o)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,c):h.push(c),w.event.global[d]=!0)},remove:function(e,t,n,r,i){var a,o,s,l,u,c,f,h,d,p,g,m=B.hasData(e)&&B.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(N)||[""]).length;u--;)if(d=g=(s=se.exec(t[u])||[])[1],p=(s[2]||"").split(".").sort(),d){for(f=w.event.special[d]||{},h=l[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=a=h.length;a--;)c=h[a],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(h.splice(a,1),c.selector&&h.delegateCount--,f.remove&&f.remove.call(e,c));o&&!h.length&&(f.teardown&&!1!==f.teardown.call(e,p,m.handle)||w.removeEvent(e,d,m.handle),delete l[d])}else for(d in l)w.event.remove(e,d+t[u],n,r,!0);w.isEmptyObject(l)&&B.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,a,o,s=w.event.fix(e),l=new Array(arguments.length),u=(B.get(this,"events")||{})[s.type]||[],c=w.event.special[s.type]||{};for(l[0]=s,t=1;t=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==e.type||!0!==u.disabled)){for(a=[],o={},n=0;n-1:w.find(i,this,null,[u]).length),o[i]&&a.push(r);a.length&&s.push({elem:u,handlers:a})}return u=this,l\x20\t\r\n\f]*)[^>]*)\/>/gi,ue=/\s*$/g;function manipulationTarget(e,t){return nodeName(e,"table")&&nodeName(11!==t.nodeType?t:t.firstChild,"tr")&&w(e).children("tbody")[0]||e}function disableScript(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function restoreScript(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function cloneCopyEvent(e,t){var n,r,i,a,o,s,l,u;if(1===t.nodeType){if(B.hasData(e)&&(a=B.access(e),o=B.set(t,a),u=a.events))for(i in delete o.handle,o.events={},u)for(n=0,r=u[i].length;n1&&"string"==typeof p&&!v.checkClone&&ce.test(p))return e.each(function(i){var a=e.eq(i);g&&(t[0]=p.call(this,i,a.html())),domManip(a,t,n,r)});if(h&&(a=(i=buildFragment(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=a),a||r)){for(s=(o=w.map(getAll(i,"script"),disableScript)).length;f")},clone:function(e,t,n){var r,i,a,o,s,l,u,c=e.cloneNode(!0),f=Y(e);if(!(v.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(o=getAll(c),r=0,i=(a=getAll(e)).length;r0&&setGlobalEval(o,!f&&getAll(e,"script")),c},cleanData:function(e){for(var t,n,r,i=w.event.special,a=0;void 0!==(n=e[a]);a++)if(I(n)){if(t=n[B.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[B.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),w.fn.extend({detach:function(e){return remove(this,e,!0)},remove:function(e){return remove(this,e)},text:function(e){return j(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return domManip(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||manipulationTarget(this,e).appendChild(e)})},prepend:function(){return domManip(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=manipulationTarget(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return domManip(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return domManip(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(getAll(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return j(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ue.test(e)&&!te[(Q.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-a-l-s-.5))||0),l}function getWidthOrHeight(e,t,n){var r=de(e),i=(!v.boxSizingReliable()||n)&&"border-box"===w.css(e,"boxSizing",!1,r),a=i,o=curCSS(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(he.test(o)){if(!n)return o;o="auto"}return(!v.boxSizingReliable()&&i||"auto"===o||!parseFloat(o)&&"inline"===w.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===w.css(e,"boxSizing",!1,r),(a=s in e)&&(o=e[s])),(o=parseFloat(o)||0)+boxModelAdjustment(e,t,n||(i?"border":"content"),a,r,o)+"px"}function Tween(e,t,n,r,i){return new Tween.prototype.init(e,t,n,r,i)}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=curCSS(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,a,o,s=camelCase(t),l=ye.test(t),u=e.style;if(l||(t=finalPropName(s)),o=w.cssHooks[t]||w.cssHooks[s],void 0===n)return o&&"get"in o&&void 0!==(i=o.get(e,!1,r))?i:u[t];"string"===(a=typeof n)&&(i=q.exec(n))&&i[1]&&(n=adjustCSS(e,t,i),a="number"),null!=n&&n==n&&("number"!==a||l||(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),v.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),o&&"set"in o&&void 0===(n=o.set(e,n,r))||(l?u.setProperty(t,n):u[t]=n))}},css:function(e,t,n,r){var i,a,o,s=camelCase(t);return ye.test(t)||(t=finalPropName(s)),(o=w.cssHooks[t]||w.cssHooks[s])&&"get"in o&&(i=o.get(e,!0,n)),void 0===i&&(i=curCSS(e,t,r)),"normal"===i&&t in we&&(i=we[t]),""===n||n?(a=parseFloat(i),!0===n||isFinite(a)?a||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!be.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?getWidthOrHeight(e,t,r):K(e,_e,function(){return getWidthOrHeight(e,t,r)})},set:function(e,n,r){var i,a=de(e),o=!v.scrollboxSize()&&"absolute"===a.position,s=(o||r)&&"border-box"===w.css(e,"boxSizing",!1,a),l=r?boxModelAdjustment(e,t,r,s,a):0;return s&&o&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(a[t])-boxModelAdjustment(e,t,"border",!1,a)-.5)),l&&(i=q.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),setPositiveNumber(0,n,l)}}}),w.cssHooks.marginLeft=addGetHookIf(v.reliableMarginLeft,function(e,t){if(t)return(parseFloat(curCSS(e,"marginLeft"))||e.getBoundingClientRect().left-K(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},a="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+W[r]+t]=a[r]||a[r-2]||a[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=setPositiveNumber)}),w.fn.extend({css:function(e,t){return j(this,function(e,t,n){var r,i,a={},o=0;if(Array.isArray(t)){for(r=de(e),i=t.length;o1)}}),w.Tween=Tween,Tween.prototype={constructor:Tween,init:function(e,t,n,r,i,a){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=a||(w.cssNumber[n]?"":"px")},cur:function(){var e=Tween.propHooks[this.prop];return e&&e.get?e.get(this):Tween.propHooks._default.get(this)},run:function(e){var t,n=Tween.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Tween.propHooks._default.set(this),this}},Tween.prototype.init.prototype=Tween.prototype,Tween.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||!w.cssHooks[e.prop]&&null==e.elem.style[finalPropName(e.prop)]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=Tween.prototype.init,w.fx.step={};var xe,ke,Ce=/^(?:toggle|show|hide)$/,Se=/queueHooks$/;function schedule(){ke&&(!1===o.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(schedule):n.setTimeout(schedule,w.fx.interval),w.fx.tick())}function createFxNow(){return n.setTimeout(function(){xe=void 0}),xe=Date.now()}function genFx(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=W[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function createTween(e,t,n){for(var r,i=(Animation.tweeners[t]||[]).concat(Animation.tweeners["*"]),a=0,o=i.length;a1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,a=e.nodeType;if(3!==a&&8!==a&&2!==a)return void 0===e.getAttribute?w.prop(e,t,n):(1===a&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?Te:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!v.radioValue&&"radio"===t&&nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(N);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),Te={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=Ee[t]||w.find.attr;Ee[t]=function(e,t,r){var i,a,o=t.toLowerCase();return r||(a=Ee[o],Ee[o]=i,i=null!=n(e,t,r)?o:null,Ee[o]=a),i}});var Me=/^(?:input|select|textarea|button)$/i,Ae=/^(?:a|area)$/i;function stripAndCollapse(e){return(e.match(N)||[]).join(" ")}function getClass(e){return e.getAttribute&&e.getAttribute("class")||""}function classesToArray(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(N)||[]}w.fn.extend({prop:function(e,t){return j(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,a=e.nodeType;if(3!==a&&8!==a&&2!==a)return 1===a&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):Me.test(e.nodeName)||Ae.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),v.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this}),w.fn.extend({addClass:function(e){var t,n,r,i,a,o,s,l=0;if(b(e))return this.each(function(t){w(this).addClass(e.call(this,t,getClass(this)))});if((t=classesToArray(e)).length)for(;n=this[l++];)if(i=getClass(n),r=1===n.nodeType&&" "+stripAndCollapse(i)+" "){for(o=0;a=t[o++];)r.indexOf(" "+a+" ")<0&&(r+=a+" ");i!==(s=stripAndCollapse(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,a,o,s,l=0;if(b(e))return this.each(function(t){w(this).removeClass(e.call(this,t,getClass(this)))});if(!arguments.length)return this.attr("class","");if((t=classesToArray(e)).length)for(;n=this[l++];)if(i=getClass(n),r=1===n.nodeType&&" "+stripAndCollapse(i)+" "){for(o=0;a=t[o++];)for(;r.indexOf(" "+a+" ")>-1;)r=r.replace(" "+a+" "," ");i!==(s=stripAndCollapse(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):b(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,getClass(this),t),t)}):this.each(function(){var t,i,a,o;if(r)for(i=0,a=w(this),o=classesToArray(e);t=o[i++];)a.hasClass(t)?a.removeClass(t):a.addClass(t);else void 0!==e&&"boolean"!==n||((t=getClass(this))&&B.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":B.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+stripAndCollapse(getClass(n))+" ").indexOf(t)>-1)return!0;return!1}});var Oe=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=b(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(Oe,""):null==n?"":n:void 0}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:stripAndCollapse(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,a=e.selectedIndex,o="select-one"===e.type,s=o?null:[],l=o?a+1:i.length;for(r=a<0?l:o?a:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),a}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},v.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),v.focusin="onfocusin"in n;var Re=/^(?:focusinfocus|focusoutblur)$/,Ne=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(e,t,r,i){var a,s,l,u,c,f,h,d,g=[r||o],m=p.call(e,"type")?e.type:e,v=p.call(e,"namespace")?e.namespace.split("."):[];if(s=d=l=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!Re.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(v=m.split("."),m=v.shift(),v.sort()),c=m.indexOf(":")<0&&"on"+m,(e=e[w.expando]?e:new w.Event(m,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=v.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:w.makeArray(t,[e]),h=w.event.special[m]||{},i||!h.trigger||!1!==h.trigger.apply(r,t))){if(!i&&!h.noBubble&&!y(r)){for(u=h.delegateType||m,Re.test(u+m)||(s=s.parentNode);s;s=s.parentNode)g.push(s),l=s;l===(r.ownerDocument||o)&&g.push(l.defaultView||l.parentWindow||n)}for(a=0;(s=g[a++])&&!e.isPropagationStopped();)d=s,e.type=a>1?u:h.bindType||m,(f=(B.get(s,"events")||{})[e.type]&&B.get(s,"handle"))&&f.apply(s,t),(f=c&&s[c])&&f.apply&&I(s)&&(e.result=f.apply(s,t),!1===e.result&&e.preventDefault());return e.type=m,i||e.isDefaultPrevented()||h._default&&!1!==h._default.apply(g.pop(),t)||!I(r)||c&&b(r[m])&&!y(r)&&((l=r[c])&&(r[c]=null),w.event.triggered=m,e.isPropagationStopped()&&d.addEventListener(m,Ne),r[m](),e.isPropagationStopped()&&d.removeEventListener(m,Ne),w.event.triggered=void 0,l&&(r[c]=l)),e.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),v.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=B.access(r,t);i||r.addEventListener(e,n,!0),B.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=B.access(r,t)-1;i?B.access(r,t,i):(r.removeEventListener(e,n,!0),B.remove(r,t))}}});var De=n.location,Ve=Date.now(),je=/\?/;w.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+e),t};var Pe=/\[\]$/,Le=/\r?\n/g,Ie=/^(?:submit|button|image|reset|file)$/i,Be=/^(?:input|select|textarea|keygen)/i;function buildParams(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||Pe.test(e)?r(e,i):buildParams(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==toType(t))r(e,t);else for(i in t)buildParams(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=b(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)buildParams(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&Be.test(this.nodeName)&&!Ie.test(e)&&(this.checked||!J.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Le,"\r\n")}}):{name:t.name,value:n.replace(Le,"\r\n")}}).get()}});var ze=/%20/g,Ue=/#.*$/,Fe=/([?&])_=[^&]*/,He=/^(.*?):[ \t]*([^\r\n]*)$/gm,qe=/^(?:GET|HEAD)$/,We=/^\/\//,$e={},Ye={},Ge="*/".concat("*"),Xe=o.createElement("a");function addToPrefiltersOrTransports(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,a=t.toLowerCase().match(N)||[];if(b(n))for(;r=a[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function inspectPrefiltersOrTransports(e,t,n,r){var i={},a=e===Ye;function inspect(o){var s;return i[o]=!0,w.each(e[o]||[],function(e,o){var l=o(t,n,r);return"string"!=typeof l||a||i[l]?a?!(s=l):void 0:(t.dataTypes.unshift(l),inspect(l),!1)}),s}return inspect(t.dataTypes[0])||!i["*"]&&inspect("*")}function ajaxExtend(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}Xe.href=De.href,w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:De.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(De.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ge,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?ajaxExtend(ajaxExtend(e,w.ajaxSettings),t):ajaxExtend(w.ajaxSettings,e)},ajaxPrefilter:addToPrefiltersOrTransports($e),ajaxTransport:addToPrefiltersOrTransports(Ye),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,a,s,l,u,c,f,h,d,p=w.ajaxSetup({},t),g=p.context||p,m=p.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),b=w.Callbacks("once memory"),y=p.statusCode||{},_={},x={},k="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=He.exec(a);)s[t[1].toLowerCase()+" "]=(s[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=s[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=x[e.toLowerCase()]=x[e.toLowerCase()]||e,_[e]=t),this},overrideMimeType:function(e){return null==c&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)C.always(e[C.status]);else for(t in e)y[t]=[y[t],e[t]];return this},abort:function(e){var t=e||k;return r&&r.abort(t),done(0,t),this}};if(v.promise(C),p.url=((e||p.url||De.href)+"").replace(We,De.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(N)||[""],null==p.crossDomain){u=o.createElement("a");try{u.href=p.url,u.href=u.href,p.crossDomain=Xe.protocol+"//"+Xe.host!=u.protocol+"//"+u.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=w.param(p.data,p.traditional)),inspectPrefiltersOrTransports($e,p,t,C),c)return C;for(h in(f=w.event&&p.global)&&0==w.active++&&w.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!qe.test(p.type),i=p.url.replace(Ue,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(ze,"+")):(d=p.url.slice(i.length),p.data&&(p.processData||"string"==typeof p.data)&&(i+=(je.test(i)?"&":"?")+p.data,delete p.data),!1===p.cache&&(i=i.replace(Fe,"$1"),d=(je.test(i)?"&":"?")+"_="+Ve+++d),p.url=i+d),p.ifModified&&(w.lastModified[i]&&C.setRequestHeader("If-Modified-Since",w.lastModified[i]),w.etag[i]&&C.setRequestHeader("If-None-Match",w.etag[i])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Ge+"; q=0.01":""):p.accepts["*"]),p.headers)C.setRequestHeader(h,p.headers[h]);if(p.beforeSend&&(!1===p.beforeSend.call(g,C,p)||c))return C.abort();if(k="abort",b.add(p.complete),C.done(p.success),C.fail(p.error),r=inspectPrefiltersOrTransports(Ye,p,t,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,p]),c)return C;p.async&&p.timeout>0&&(l=n.setTimeout(function(){C.abort("timeout")},p.timeout));try{c=!1,r.send(_,done)}catch(e){if(c)throw e;done(-1,e)}}else done(-1,"No Transport");function done(e,t,o,s){var u,h,d,_,x,k=t;c||(c=!0,l&&n.clearTimeout(l),r=void 0,a=s||"",C.readyState=e>0?4:0,u=e>=200&&e<300||304===e,o&&(_=function(e,t,n){for(var r,i,a,o,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){l.unshift(i);break}if(l[0]in n)a=l[0];else{for(i in n){if(!l[0]||e.converters[i+" "+l[0]]){a=i;break}o||(o=i)}a=a||o}if(a)return a!==l[0]&&l.unshift(a),n[a]}(p,C,o)),_=function(e,t,n,r){var i,a,o,s,l,u={},c=e.dataTypes.slice();if(c[1])for(o in e.converters)u[o.toLowerCase()]=e.converters[o];for(a=c.shift();a;)if(e.responseFields[a]&&(n[e.responseFields[a]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=a,a=c.shift())if("*"===a)a=l;else if("*"!==l&&l!==a){if(!(o=u[l+" "+a]||u["* "+a]))for(i in u)if((s=i.split(" "))[1]===a&&(o=u[l+" "+s[0]]||u["* "+s[0]])){!0===o?o=u[i]:!0!==u[i]&&(a=s[0],c.unshift(s[1]));break}if(!0!==o)if(o&&e.throws)t=o(t);else try{t=o(t)}catch(e){return{state:"parsererror",error:o?e:"No conversion from "+l+" to "+a}}}return{state:"success",data:t}}(p,_,C,u),u?(p.ifModified&&((x=C.getResponseHeader("Last-Modified"))&&(w.lastModified[i]=x),(x=C.getResponseHeader("etag"))&&(w.etag[i]=x)),204===e||"HEAD"===p.type?k="nocontent":304===e?k="notmodified":(k=_.state,h=_.data,u=!(d=_.error))):(d=k,!e&&k||(k="error",e<0&&(e=0))),C.status=e,C.statusText=(t||k)+"",u?v.resolveWith(g,[h,k,C]):v.rejectWith(g,[C,k,d]),C.statusCode(y),y=void 0,f&&m.trigger(u?"ajaxSuccess":"ajaxError",[C,p,u?h:d]),b.fireWith(g,[C,k]),f&&(m.trigger("ajaxComplete",[C,p]),--w.active||w.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return b(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e,t){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){w.globalEval(e,t)}})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(b(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return b(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Ke={0:200,1223:204},Ze=w.ajaxSettings.xhr();v.cors=!!Ze&&"withCredentials"in Ze,v.ajax=Ze=!!Ze,w.ajaxTransport(function(e){var t,r;if(v.cors||Ze&&!e.crossDomain)return{send:function(i,a){var o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(o in e.xhrFields)s[o]=e.xhrFields[o];for(o in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(o,i[o]);t=function(e){return function(){t&&(t=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?a(0,"error"):a(s.status,s.statusText):a(Ke[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),r=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout(function(){t&&r()})},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=w("