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 e0eafa8..0000000 Binary files a/zhyy/library/BusinessKw/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38.pyc and /dev/null differ 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 56ce41d..0000000 Binary files a/zhyy/library/BusinessKw/SZPurchase/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/BusinessKw/SZPurchase/__pycache__/index.cpython-38.pyc b/zhyy/library/BusinessKw/SZPurchase/__pycache__/index.cpython-38.pyc deleted file mode 100644 index 33bc8c7..0000000 Binary files a/zhyy/library/BusinessKw/SZPurchase/__pycache__/index.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/BusinessKw/SZPurchase/index.py b/zhyy/library/BusinessKw/SZPurchase/index.py deleted file mode 100644 index 830d09b..0000000 --- a/zhyy/library/BusinessKw/SZPurchase/index.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: qiaoxinjiu -Email: qiaoxinjiu@sparkedu.com -Create Date: 2022/08/20 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 PurchaseIndex(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_todo(self, note, user): - """ - | 功能说明: | 返回采购工作台首页待办任务的PO与在办任务PO | - | 输入参数: | note | 注释 | - |user | 用户信息,传入 'purchase' 默认读取配置文件里面 'purchase' 对应的默认账号信息| - | 返回参数: | {"success":true,"message":"success","code":200,"data": - {'todoTask':['PO260116003','PO260115010'],'inProcessTask':['PO260116003','PO260115010']}} | | - | 作者信息: | 谯新久 | 修改时间 | 2022-8-20 | - """ - logging.info("==========={0}===========".format(note)) - get_todo_info = self.kw_in_zhyy_purchase_todo_get(user=user) - if get_todo_info['code'] != 0: - raise Exception("查询采购待办任务失败: {}".format(get_todo_info)) - get_todo_info["message"] = "查询采购待办任务成功" - data = get_todo_info.get("data") - if data is None: - raise Exception("返回数据为空,data字段不存在") - list_get_todo_task = data.get("todoTask") or [] - list_get_process_task = data.get("inProcessTask") or [] - list_todo_task_po = [] - list_process_task_po = [] - for todoTask in list_get_todo_task: - if isinstance(todoTask, dict): - list_todo_task_po.append(todoTask.get("businessSn")) - for processTask in list_get_process_task: - if isinstance(processTask, dict): - list_process_task_po.append(processTask.get("businessSn")) - get_todo_info["data"]["todoTask"] = list_todo_task_po - get_todo_info["data"]["inProcessTask"] = list_process_task_po - if list_todo_task_po: - test_purchase = list_todo_task_po[0] - # 表在public schema中,使用public.erp_purchase_order格式 - sql = "SELECT * FROM public.erp_purchase_order WHERE order_sn = '{}'".format(test_purchase) - try: - obj_pgsql_helper.select_one(sql) - except Exception as e: - # 如果查询失败,记录日志但不影响主流程 - obj_get_log.warning("查询采购订单表失败,订单号:{},错误:{}".format(test_purchase, str(e))) - return get_todo_info - - -if __name__ == '__main__': - test = PurchaseIndex() - a = test.kw_zhyy_get_todo(user='purchase',note="测试") - print(a) diff --git a/zhyy/library/BusinessKw/SZPurchase/purchase.ini b/zhyy/library/BusinessKw/SZPurchase/purchase.ini deleted file mode 100644 index 3565730..0000000 --- a/zhyy/library/BusinessKw/SZPurchase/purchase.ini +++ /dev/null @@ -1,2 +0,0 @@ -[qa-user] -user_info ={"studentId":21797349,"sex":0,"nickName":"auto st test","birthday":1640966400000,"avatar":"https://stalegacy.huohua.cn/image/huohua/avatar/default/default_avatar1.png"} \ No newline at end of file diff --git a/zhyy/library/BusinessKw/__init__.py b/zhyy/library/BusinessKw/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/BusinessKw/__pycache__/__init__.cpython-38.pyc b/zhyy/library/BusinessKw/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index e3f1867..0000000 Binary files a/zhyy/library/BusinessKw/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__init__.py b/zhyy/library/CommonFun/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/library/CommonFun/__pycache__/__init__.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index a103240..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/asset_common.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/asset_common.cpython-38.pyc deleted file mode 100644 index abc741d..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/asset_common.cpython-38.pyc and /dev/null differ 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 b28df69..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/contract_pair_check.cpython-38.pyc and /dev/null differ 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 8557aad..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/course_package_common.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/env_check.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/env_check.cpython-38.pyc deleted file mode 100644 index 90cb7a9..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/env_check.cpython-38.pyc and /dev/null differ 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 4839ff1..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/handle_aita.cpython-38.pyc and /dev/null differ 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 a58fde1..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/handle_harmonyos.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/handle_jenkins.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/handle_jenkins.cpython-38.pyc deleted file mode 100644 index fc0dfeb..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/handle_jenkins.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/handle_jira.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/handle_jira.cpython-38.pyc deleted file mode 100644 index d4003f7..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/handle_jira.cpython-38.pyc and /dev/null differ 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 1be6c0c..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/handle_login.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/handle_tools.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/handle_tools.cpython-38.pyc deleted file mode 100644 index 759301a..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/handle_tools.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/host_update.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/host_update.cpython-38.pyc deleted file mode 100644 index 2ab3bc1..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/host_update.cpython-38.pyc and /dev/null differ 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 ae45bf1..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/statistical_function.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/ubrd_now_time.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/ubrd_now_time.cpython-38.pyc deleted file mode 100644 index 068e8be..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/ubrd_now_time.cpython-38.pyc and /dev/null differ 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 113f9e6..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/user_common.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/CommonFun/__pycache__/user_message.cpython-38.pyc b/zhyy/library/CommonFun/__pycache__/user_message.cpython-38.pyc deleted file mode 100644 index 89046b8..0000000 Binary files a/zhyy/library/CommonFun/__pycache__/user_message.cpython-38.pyc and /dev/null differ 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("(? 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 3e36819..0000000 Binary files a/zhyy/library/__pycache__/ZZYY_interface.cpython-38.pyc and /dev/null differ diff --git a/zhyy/library/__pycache__/__init__.cpython-38.pyc b/zhyy/library/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 044ba08..0000000 Binary files a/zhyy/library/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/zhyy/qa_helper/__init__.py b/zhyy/qa_helper/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/qa_helper/__pycache__/__init__.cpython-38.pyc b/zhyy/qa_helper/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index fdb43c5..0000000 Binary files a/zhyy/qa_helper/__pycache__/__init__.cpython-38.pyc and /dev/null differ 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 04be308..0000000 Binary files a/zhyy/qa_helper/common/__pycache__/__init__.cpython-38.pyc and /dev/null differ 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 fe34ed0..0000000 Binary files a/zhyy/qa_helper/common/__pycache__/order.cpython-38.pyc and /dev/null differ 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 f9253d2..0000000 Binary files a/zhyy/qa_helper/common/__pycache__/user.cpython-38.pyc and /dev/null differ diff --git a/zhyy/qa_helper/common/course_package.py b/zhyy/qa_helper/common/course_package.py deleted file mode 100644 index cc001b8..0000000 --- a/zhyy/qa_helper/common/course_package.py +++ /dev/null @@ -1,337 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: 陈江 -Email: chenjiang@sparkedu.com -Create Date: 2022/09/23 2:06 下午 -""" -from base_framework.public_tools.sqlhelper import MySqLHelper - -import json - -obj_mysql_helper = MySqLHelper() - - -class CoursePackage: - def __init__(self): - pass - - @staticmethod - def __get_data_name(data_list): - temp_data_list = [] - if data_list: - for data in data_list: - temp_data_list.append( - {"course_package_id": data.get('value'), "cc显示_course_package_name": data.get('name'), - "course_package_name": data.get('text')}) - return temp_data_list - return None - - def get_course_package_by_cc_crm(self, post_data_input): - """ - | 功能说明: | 获取套餐信息,根据cc/crm购买可选套餐 | - | 输入参数: | - | 作者信息: | 陈江 | 修改时间 | 2022-9-28 | - """ - sql_crm_vispark_subscribe_chinese = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', -type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type = 2 - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',2,' - AND course_type IN ( ',5,', ',1,' ) - AND sale_type = 2 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,7,%' -ORDER BY - id DESC LIMIT 3;""" - crm_vispark_subscribe_chinese_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_subscribe_chinese)) - - sql_crm_vispark_subscribe_sg = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type = 1 - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',1,' - AND course_type IN ( ',5,' ) - AND sale_type = 2 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,10,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_subscribe_sg_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_subscribe_sg)) - - sql_crm_vispark_subscribe_oc = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type in( 1,10 ) - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',1,' - AND course_type IN ( ',5,' ) - AND sale_type = 2 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,13,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_subscribe_oc_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_subscribe_oc)) - - sql_crm_vispark_buy_chinese = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type = 2 - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',2,' - AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') - AND sale_type = 1 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,7,%' -ORDER BY - IF (abbreviation="",NAME,abbreviation) asc limit 3;""" - crm_vispark_buy_chinese_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_buy_chinese)) - - sql_crm_vispark_buy_us = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type = 10 - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',1,' - AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') - AND sale_type = 1 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,11,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_buy_us_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_buy_us)) - - sql_crm_vispark_buy_canada = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type = 10 - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',1,' - AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') - AND sale_type = 1 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,1012,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_buy_canada_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_buy_canada)) - - sql_crm_vispark_buy_sg = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type = 1 - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',1,' - AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') - AND sale_type = 1 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,10,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_buy_sg_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_buy_sg)) - - sql_crm_vispark_buy_oc = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - type = 1 - AND business_line = 1 - AND business_line_type in( 1,10 ) - AND teaching_method = 0 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject = ',1,' - AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') - AND sale_type = 1 - AND course_teaching_method = 1 - AND STATUS = 1 - AND view_authority_scope LIKE '%,13,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_buy_oc_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_buy_oc)) - - sql_crm_vispark_buy_huohua = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - teaching_method = 0 - AND business_line_type in( 0,4,9 ) --- AND business_line = 0 (以及业务线) - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject like '%,2,%' --- AND course_type IN ( ',1,',',5,' ) (课程类型) - AND sale_type = 1 - AND course_teaching_method = 1 --- AND STATUS = 1 (状态) - AND view_authority_scope LIKE '%,7,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_buy_huohua_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_buy_huohua)) - - sql_crm_vispark_subscribe_huohua = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - teaching_method = 0 - AND business_line_type in( 0,4,9 ) - AND business_line = 1 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject like '%,2,%' --- AND course_type IN ( ',1,',',5,' ) (课程类型) - AND sale_type = 2 - AND course_teaching_method = 1 --- AND STATUS = 1 (状态) - AND view_authority_scope LIKE '%,7,%' -ORDER BY - id DESC limit 3;""" - crm_vispark_subscribe_huohua_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_crm_vispark_subscribe_huohua)) - - sql_cc_vispark_subscribe_huohua = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - teaching_method = 0 - AND business_line_type in( 0,3,9 ) - AND business_line = 1 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject like '%,1,%' --- AND course_type IN ( ',1,',',5,' ) (课程类型) - AND sale_type = 2 - AND course_teaching_method = 1 --- AND STATUS = 1 (状态) - AND view_authority_scope LIKE '%,2,%' -ORDER BY - id DESC limit 3;""" - cc_vispark_subscribe_huohua_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_cc_vispark_subscribe_huohua)) - - sql_cc_vispark_buy_huohua = """SELECT - IF (abbreviation="",NAME,abbreviation) AS 'text',name, - id AS 'value', - type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope -FROM - peppa.course_package -WHERE - teaching_method = 0 - AND business_line_type in( 0,3,9 ) - AND business_line = 1 - AND sale_status = 1 - AND saleable_status = 1 - AND course_subject like '%,1,%' --- AND course_type IN ( ',1,',',5,' ) (课程类型) - AND sale_type = 1 - AND course_teaching_method = 1 --- AND STATUS = 1 (状态) - AND view_authority_scope LIKE '%,2,%' -ORDER BY - id DESC limit 3;""" - cc_vispark_buy_huohua_list = self.__get_data_name( - obj_mysql_helper.select_all(sql_cc_vispark_buy_huohua)) - data = {"crm中订阅vispark业务的对外汉语-套餐": crm_vispark_subscribe_chinese_list, - "crm中订阅vispark业务的sg-套餐": crm_vispark_subscribe_sg_list, - "crm中订阅vispark业务的海华-套餐": crm_vispark_subscribe_oc_list, - "crm中直购vispark业务的对外汉语-套餐": crm_vispark_buy_chinese_list, - "crm中直购vispark业务的us-套餐": crm_vispark_buy_us_list, - "crm中直购vispark业务的加拿大-套餐": crm_vispark_buy_canada_list, - "crm中直购vispark业务的sg-套餐": crm_vispark_buy_sg_list, - "crm中直购vispark业务的海华-套餐": crm_vispark_buy_oc_list, - "crm中直购vispark业务的火花-套餐": crm_vispark_buy_huohua_list, - "crm中订阅vispark业务的火花-套餐": crm_vispark_subscribe_huohua_list, - "cc中订阅vispark业务的火花-套餐": cc_vispark_subscribe_huohua_list, - "cc中直购vispark业务的火花-套餐": cc_vispark_buy_huohua_list} - - return data - - -if __name__ == '__main__': - cc = CoursePackage() - bb = cc.get_course_package_by_cc_crm('') - print(bb) diff --git a/zhyy/qa_helper/common/order.py b/zhyy/qa_helper/common/order.py deleted file mode 100644 index 3c85ed5..0000000 --- a/zhyy/qa_helper/common/order.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: 陈江 -Email: chenjiang@sparkedu.com -Create Date: 2022/09/23 2:06 下午 -""" -from base_framework.public_business.common.UBRD.kw.coursePackage_keyword import CoursePackageKW -from base_framework.public_tools import utils -from base_framework.public_tools.sqlhelper import MySqLHelper -from base_framework.public_tools.mg_keyword import ManageKeyWord -from base_framework.public_business import manage_public_business - -import json - - -obj_course_package_kw = CoursePackageKW() -obj_get_way = utils.Tools() -obj_mysql_helper = MySqLHelper() -obj_manage_kw = ManageKeyWord() -obj_manage_business = manage_public_business.ManagePublicBusiness() - -class Order: - def __init__(self): - pass - - def order_done_pay(self, post_data_input): - """ - | 功能说明: | 订单完成支付 | - | 输入参数: | - |orderId/orderCode/prepayCode| 订单id/code/prepayCode | 必填其一 - | podenv | str | 独立环境编号| 非必填 - | 作者信息: | 陈江 | 修改时间 | 2022-9-28 | - """ - if not post_data_input.get('orderId') and not post_data_input.get('orderCode') and not post_data_input.get( - 'prepayCode'): - raise "orderId/orderCode/prepayCode必传1个" - - ordr_info = obj_course_package_kw.get_order_info(post_data_input) - order_id = ordr_info.get('orderId') - mq_body_dict = obj_course_package_kw.kw_ubrd_public_get_service_id_by_order_id({"orderId": order_id}) - message_body = {"orderId": order_id, "serviceId": int(mq_body_dict.get('serviceId'))} - if post_data_input.get('podenv'): - obj_get_way.mq_send(mq_body_dict.get('topic'), json.dumps(message_body), pro=post_data_input.get('podenv')) - else: - obj_get_way.mq_send(mq_body_dict.get('topic'), json.dumps(message_body)) - order_100_sql = f"SELECT id FROM `order_center`.`order_course_package` WHERE id='{order_id}' AND status=100" - obj_mysql_helper.check_result_exist(order_100_sql, retry_count=20) - subscribe_id_sql = f"SELECT subscribe_id FROM `order_center`.`subscribe_order_log` WHERE order_id={order_id}" - obj_mysql_helper.check_result_exist(subscribe_id_sql, retry_count=20) - subscribe_id = obj_mysql_helper.select_one(subscribe_id_sql).get('subscribe_id') - - return {"order_id": order_id, "subscribe_id": subscribe_id} - - def add_review_subscribe_order(self, post_data_input): - """ - | 功能说明: | 生成续订阅订单 | - | 输入参数: | - |subscribeIds| 订阅id | 传了用该订阅id生成续订阅订单,必传 比如[3355] - | 作者信息: | 张楠 | 修改时间 | 2022-11-10 | - """ - try: - post_data_input = eval(post_data_input) - except: - post_data_input = post_data_input - - if not post_data_input.get('subscribeIds'): - raise RuntimeWarning("订阅id必传") - # 构造生成续订阅订单请求参数 - response_data = obj_manage_kw.kw_execute_xxl_job(8306, para=json.dumps(post_data_input)) - return response_data - - def create_order(self, post_data_input): - """ - | 功能说明: | 创建直购订单 | - | 请求参数名 | 说明 | 类型 | 是否必填 | 如无要求时的值 | - | userId | 用户id | string | 0 | | - | phone | 用户手机号 | string | 0 | | - | coursePackageId | 套餐id | integer | 0 | | - | businessLine | 业务线一级类型,0:火花中国、1:vispark | integer | 0 | | - | businessLineType | 业务线二级类型,1:新加坡数学、2:对外汉语、3:直播逻辑思维、4:直播中文素养、5:直播双语素养、6:AI、7:围棋、8:国际象棋、9:其他、10:北美数学、11:越南数学、12:春风思维、13:口才课 | integer | 0 | | - | category | 业务线三级类型,K-SMAP:新加坡AP、P-CM:新加坡CP、A:北美AP、C-北美CP、V-越南AP、N-越南CP、ZHK-对外汉语综合课 | string | 0 | | - | teachingMethod | 授课方式, 0:直播、1:AI | integer | 0 | 0 | - | type | 套餐类型,1:正式课、2:体验课 | integer | 0 | 1 | - | courseSubjectList | 课程学科集合,1:数学、2:语文、3:科学、4:英语、5:编程、7:围棋、8:国际象棋、9:春风思维、10:口才课 | list | 0 | | - | courseId | 课程id | integer | 0 | | - | channel | 渠道,1:电商、0:非电商 | integer | 0 | 0 | - | channelValue | 渠道chi | string | 0 | 0 | - | classHourType | 课时类型,0:小班课、3:1v1 | integer | 0 | | - | offline | 线下,1:线下、0:线上 | integer | 0 | 1 | - | businessType | 业务类型,0:常规、1:补差、2:可补差 | integer | 0 | 0 | - | currency | 币种,0:人民币、1:美元 | integer | 0 | | - | saleType | 售卖方式,1:直购、2:订阅 | integer | 0 | 1 | - | teachingScope | 授课范围,1:所有课程、2:自定义课程 | integer | 0 | 1 | - | payPrice | 实付金额 | integer | 0 | | - | createdType | 订单类型,0:默认未选择、 10:团购订单、11:加价购-团购订单、12:加价购-普通订单、20:CC提单、30:CC提单、40:自助下单、50:微店购买| integer | 0| 0 | - Returns: - {orderId, orderCode} - | 作者信息: | lrq | 修改时间 | 2025-03-18 | - """ - try: - post_data_input = eval(post_data_input) - except: - post_data_input = post_data_input - return obj_manage_business.kw_public_manage_create_order(**post_data_input) - - -if __name__ == '__main__': - a = Order() - a.create_order({"userId":"2557864","channel":"35d75242534611e8b5325cb9018964ec","coursePackageId":"2503934602"}) diff --git a/zhyy/qa_helper/common/user.py b/zhyy/qa_helper/common/user.py deleted file mode 100644 index a53d867..0000000 --- a/zhyy/qa_helper/common/user.py +++ /dev/null @@ -1,208 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: 陈江 -Email: chenjiang@sparkedu.com -Create Date: 2022/09/23 2:06 下午 -""" -from base_framework.public_business.common.UBRD.UBRD_public_business import BaseLogic -from base_framework.public_business.common.UBRD.kw.coursePackage_keyword import CoursePackageKW -from base_framework.public_tools import utils -from base_framework.public_tools.sqlhelper import MySqLHelper -from base_framework.public_tools.log import get_logger -from base_framework.public_business.common.UBRD.kw.user_keyword import UserKW -from base_framework.public_tools.mg_keyword import ManageKeyWord -from library.CommonFun.handle_tools import Handle_tools -import requests - -obj_base_logic = BaseLogic() -obj_course_package_kw = CoursePackageKW() -obj_get_way = utils.Tools() -obj_mysql_helper = MySqLHelper() -log = get_logger() -obj_user_kw = UserKW() -obj_manage_kw = ManageKeyWord() -obj_handle_tools = Handle_tools() - - -class User: - def __init__(self): - pass - - def add_user_recharge(self, post_data_input): - """ - | 功能说明: | 新增用户,充值课时 | - | 输入参数: | - |phone/userId| 用户手机号/用户id | 非必填,不传会默认随机注册一个账号;传的手机号不存在会自动进行注册; - |coursePackageCode/courseId/coursePackageId/coursePackageName| 传一个即可 | 传了就给用充值课时,不传就不充 - |classHour | | 充值课时 | 不传,需要充值时默认充值100 - |new_user_count | | 生成新账号数量,存在这个参数时只会生成相应数量的账号 | - | 作者信息: | 陈江 | 修改时间 | 2022-9-23 | - """ - user_list = [] - try: - post_data_input = eval(post_data_input) - except: - post_data_input = post_data_input - - if post_data_input.get('new_user_count'): - new_user_count = post_data_input.pop('new_user_count') - for count in range(0, int(new_user_count)): - user_info = obj_base_logic.logic_public_add_user_recharge(post_data_input) - user_list.append(user_info) - return user_list - return obj_base_logic.logic_public_add_user_recharge(post_data_input) - - def add_new_user(self, post_data_input): - """ - | 功能说明: | 新增用户 | - | 输入参数: | - |fu_phone/fu_user_Id| 邀请人手机号或者user_id | 非必填,不传新增用户无邀请人; - |new_phone| 新增用户手机号 | 传了用该手机号注册,不传则随机一个手机号 - |new_user_count | | 生成新账号数量,存在这个参数时只会生成相应数量的账号 | - | 作者信息: | 陈江 | 修改时间 | 2022-11-01 | - """ - user_list = [] - try: - post_data_input = eval(post_data_input) - except: - post_data_input = post_data_input - - # 构造增加用户请求参数 - add_user_params = {} - # 判断是否需要进行邀请 - if post_data_input.get('fu_phone'): - user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=post_data_input.get('fu_phone')) - add_user_params['fromUserId'] = user_info.get('user_id') - elif post_data_input.get('fu_user_Id'): - add_user_params['fromUserId'] = post_data_input.get('fu_user_Id') - else: - pass - - if post_data_input.get('new_phone'): - user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=post_data_input.get('new_phone')) - if user_info: - raise RuntimeWarning(f"该手机号{post_data_input.get('new_phone')}已经存在") - add_user_params['phone'] = post_data_input.get('new_phone') - obj_user_kw.kw_ubrd_public_add_user_profile(post_data_input=add_user_params) - user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=post_data_input.get('new_phone')) - return user_info - else: - if post_data_input.get('new_user_count'): - new_user_count = post_data_input.pop('new_user_count') - for count in range(0, int(new_user_count)): - phone = obj_user_kw.kw_ubrd_public_get_unregistered_phone() - add_user_params['phone'] = phone - obj_user_kw.kw_ubrd_public_add_user_profile(post_data_input=add_user_params) - user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=phone) - user_list.append(user_info) - return user_list - else: - phone = obj_user_kw.kw_ubrd_public_get_unregistered_phone() - add_user_params['phone'] = phone - obj_user_kw.kw_ubrd_public_add_user_profile(post_data_input=add_user_params) - user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=phone) - return user_info - - def add_new_haihua_user(self, post_data_input): - """ - | 功能说明: | 生成海华标签新用户 | - | 输入参数: | - |fu_phone/fu_user_Id| 邀请人手机号或者user_id | 非必填,不传新增用户无邀请人; - |new_phone| 新增用户手机号 | 传了用该手机号注册,不传则随机一个手机号 - |new_user_count | | 生成新账号数量,存在这个参数时只会生成相应数量的账号 | - | 作者信息: | 陈江 | 修改时间 | 2022-11-01 | - """ - user_info_list = self.add_new_user(post_data_input) - if user_info_list: - for user_info in user_info_list: - # 设置权益信息 - obj_mysql_helper.insert_one( - f"""INSERT INTO `operation`.`haibao_task_equity`(`user_id`, `order_id`, `order_business_side`, `course_package_id`, `course_package_name`, `equity_num`, `used_num`, `remain_num`, `lock_num`, `start_time`, `end_time`, `effect_period`, `generated_first_task`, `frozen_status`, `refund_status`, `equity_status`, `policy`, `subject_type`, `related_order_id`, `creator_id`, `creator_name`, `created_time`, `modifier_id`, `modifier_name`, `modified_time`) VALUES ({user_info.get('user_id')}, 8881050, 0, 23002, '逻辑思维直播系统课48课包', 20, 0, 20, 0, '2023-02-09 14:44:36', '2023-02-09 14:44:36', 360, 0, 0, 0, 0, 2, 0, 0, 0, '', '2023-02-01 00:00:01', 0, '', '2023-02-09 14:44:36');""") - # 设置海华标签 - obj_mysql_helper.insert_one( - f"""INSERT INTO `utag_mass`.`user_tag`(`user_id`, `tag_id`, `tag_name`, `creator_id`, `creator_name`, `created_time`, `status`, `is_del`, `source_type`, `expiration_time`, `modifier_id`, `modifier_name`, `modified_time`) VALUES ({user_info.get('user_id')}, 51, '海外及港澳台用户', 587312, '陈江', '2023-02-09 16:08:24', 1, 0, 0, NULL, 587312, '陈江', '2023-02-09 16:08:24');""") - return user_info_list - - def get_unregistered_user(self, post_data_input): - """ - | 功能说明: | 获取未注册手机号 | - | 输入参数: | - |user_count | | 返回未注册手机号数量 | - | 作者信息: | 刘涛婷 | 修改时间 | 2022-11-10 | - """ - user_list = [] - try: - post_data_input = eval(post_data_input) - except: - post_data_input = post_data_input - - if post_data_input.get('user_count'): - user_count = post_data_input.pop('user_count') - for count in range(0, int(user_count)): - user_phone = obj_user_kw.kw_ubrd_public_get_unregistered_phone() - user_list.append(user_phone) - return user_list - return obj_user_kw.kw_ubrd_public_get_unregistered_phone() - - def get_sms_code_by_phone(self, post_data_input): - """ - | 功能说明: | 发送验证码 | - | 输入参数: - | phone | 手机号| 必填 - | countryCode | 国家码 | 默认 86 - | authType | 验证码类型 | 默认2 - | verifyAppId | 验证appId | 默认2 - | 作者信息: | 陈江 | 2022/10/21 | - """ - # 发送验证码 - obj_base_logic.logic_public_send_auth_code(post_data_input) - # 获取验证码内容 - # 根据phone获取phone_code - phone_server_ip = obj_get_way.get_container_ip_from_eureka('PHONE-SERVER', need_jira_id='qa', - eureka_url='http://eureka.qa.huohua.cn') - if post_data_input.get('countryCode'): - phone = f"{post_data_input.get('countryCode')}-{post_data_input.get('phone')}" - else: - phone = post_data_input.get('phone') - - if phone_server_ip.get('container_ip'): - url = 'http://{}:8080/encrypt/regdata?biztype=phone&uid=123456&sourceData={}'.format( - phone_server_ip.get('container_ip'), phone) - response = requests.post(url=url) # 三个参数 - response_json = response.json() - else: - raise "获取phone server ip失败" - - if response_json.get('data'): - msg = obj_mysql_helper.select_all( - 'SELECT msg FROM `push_service`.`sms` WHERE `phone_code` = \'{}\' ORDER BY id DESC LIMIT 1 '.format( - response_json.get('data'))) - if msg: - web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/c9baf09d-55f1-46a6-8d67-9d4ff30b1be2" - message_data = {"msg_type": "post", "content": { - "post": {"zh_cn": {"title": "message", - "content": [[{"tag": "text", "text": msg[0].get('msg')}]]}}}} - obj_handle_tools.send_message_by_feishu(web_hook, message_data) - else: - raise f"{phone}获取验证码失败" - return msg[0].get('msg') - - else: - return response_json - - def register_user(self, post_data_input): - """ - | 功能说明: | 通过注册接口进行注册用户并设置密码A123456(支持邀请码,渠道) | - | 输入参数: | - | | | channelId | string | 渠道id | - | | | invitePhone | string | 手机号 | "12030690001/86-13400114600" - | | | registerPhone | string | 手机号 | "12030690001/86-13400114600" - | 作者信息: | 陈江 | 修改时间 | 2022-11-10 | - """ - return obj_base_logic.logic_public_register_user(post_data_input) - - -if __name__ == '__main__': - ff = {'phone': '13400234500','coursePackageId':29497} - # User().add_user_recharge(ff) - User().add_new_user(post_data_input={"new_user_count":"2"}) diff --git a/zhyy/test_case/JENKINS_SETUP.md b/zhyy/test_case/JENKINS_SETUP.md deleted file mode 100644 index 680924b..0000000 --- a/zhyy/test_case/JENKINS_SETUP.md +++ /dev/null @@ -1,190 +0,0 @@ -# Jenkins + Allure 报告集成配置指南 - -## 前置要求 - -1. **Jenkins已安装并运行** -2. **安装Allure插件** - - 进入 Jenkins → Manage Jenkins → Manage Plugins - - 搜索并安装 "Allure Plugin" -3. **安装Allure命令行工具** - - 下载:https://github.com/allure-framework/allure2/releases - - 解压并添加到系统PATH环境变量 - - 或在Jenkins全局工具配置中配置Allure路径 - -## Jenkins配置步骤 - -### 方式一:使用Jenkinsfile(推荐) - -1. **在Jenkins中创建Pipeline任务** - - 新建任务 → 选择 "Pipeline" - - 任务名称:例如 "ZZYY_Test_Automation" - -2. **配置Pipeline** - - Pipeline definition → Pipeline script from SCM - - SCM: Git(或其他版本控制) - - Script Path: `zhyy/test_case/Jenkinsfile` - - 保存 - -3. **运行任务** - - 点击 "Build with Parameters" - - 选择运行方式(RUN_TYPE) - - 填写相应参数 - - 点击 "Build" - -### 方式二:自由风格项目配置 - -1. **创建自由风格项目** - - 新建任务 → 选择 "Freestyle project" - - 任务名称:例如 "ZZYY_Test_Automation" - -2. **配置源码管理** - - Source Code Management → Git - - Repository URL: 你的Git仓库地址 - - Branch: 分支名称 - -3. **配置构建步骤** - - Build → Add build step → Execute shell(Linux/Mac)或 Execute Windows batch command(Windows) - - 命令示例: - ```bash - # Linux/Mac - cd ${WORKSPACE} - python zhyy/test_case/run_tests.py --all --no-report - ``` - ```batch - # Windows - cd %WORKSPACE% - python zhyy\test_case\run_tests.py --all --no-report - ``` - -4. **配置Allure报告** - - Post-build Actions → Add post-build action → Allure Report - - Results path: `zhyy/test_case/reports/allure-results` - - Report path: `zhyy/test_case/reports/allure-report`(可选) - - 保存 - -5. **配置参数化构建(可选)** - - This project is parameterized → Add Parameter - - 添加Choice Parameter: - - Name: `RUN_TYPE` - - Choices: `all`, `feature`, `story`, `dir`, `file`, `keyword`, `marker` - - 添加String Parameter(根据需要): - - `FEATURE_NAME`, `STORY_NAME`, `DIR_PATH`, `FILE_PATH`, `KEYWORD`, `MARKER` - -6. **修改构建命令以使用参数** - ```bash - # Linux/Mac - cd ${WORKSPACE} - if [ "${RUN_TYPE}" = "all" ]; then - python zhyy/test_case/run_tests.py --all --no-report - elif [ "${RUN_TYPE}" = "feature" ]; then - python zhyy/test_case/run_tests.py --feature "${FEATURE_NAME}" --no-report - elif [ "${RUN_TYPE}" = "dir" ]; then - python zhyy/test_case/run_tests.py --dir "${DIR_PATH}" --no-report - # ... 其他条件 - fi - ``` - -## Allure插件配置 - -### 全局工具配置 - -1. **配置Allure命令行工具路径** - - Manage Jenkins → Global Tool Configuration - - Allure Commandline → Add Allure Commandline - - Name: `Allure`(或自定义名称) - - Installation directory: Allure安装路径(如:`C:\allure\bin` 或 `/usr/local/allure/bin`) - - 保存 - -### 项目配置 - -1. **在项目配置中添加Allure报告** - - Post-build Actions → Allure Report - - Results path: `zhyy/test_case/reports/allure-results` - - 勾选 "Keep allure results history" - -## 环境变量配置 - -### Jenkins全局环境变量 - -1. **配置Python路径(如需要)** - - Manage Jenkins → Configure System → Global properties - - Environment variables → Add - - Name: `PYTHONPATH` - - Value: `${WORKSPACE}` - -### 项目环境变量 - -在Pipeline或构建脚本中设置: -```groovy -environment { - PYTHONPATH = "${WORKSPACE}" - ALLURE_RESULTS = "${WORKSPACE}/zhyy/test_case/reports/allure-results" -} -``` - -## 使用示例 - -### 运行所有测试 -```bash -python zhyy/test_case/run_tests.py --all --no-report -``` - -### 按目录运行 -```bash -python zhyy/test_case/run_tests.py --dir "接口/SZPurchase" --no-report -``` - -### 按Feature标签运行 -```bash -python zhyy/test_case/run_tests.py --feature "深圳采购工作台采购订单页面" --no-report -``` - -## 报告查看 - -1. **在Jenkins中查看** - - 构建完成后,在项目页面左侧菜单会出现 "Allure Report" 链接 - - 点击即可查看详细的测试报告 - -2. **报告内容** - - 测试用例执行情况 - - 通过/失败统计 - - 执行时间 - - 测试步骤详情 - - 截图和日志(如果配置了) - -## 常见问题 - -### 1. Allure命令未找到 -- 确保Allure已安装并添加到PATH -- 或在Jenkins全局工具配置中指定Allure路径 - -### 2. 模块导入错误 -- 检查PYTHONPATH环境变量 -- 确保项目根目录在Python路径中 - -### 3. 报告未生成 -- 检查allure-results目录是否存在且包含数据 -- 检查Jenkins Allure插件配置的路径是否正确 - -### 4. 权限问题 -- 确保Jenkins有权限访问工作空间目录 -- 确保有权限执行Python和Allure命令 - -## 邮件通知配置(可选) - -在Post-build Actions中添加: -- Email Notification -- 配置收件人、主题等 -- 可以附加Allure报告链接 - -## 定时构建(可选) - -在项目配置中: -- Build Triggers → Build periodically -- 例如:`H 2 * * *`(每天凌晨2点执行) - -## 多节点执行(可选) - -如果有多台Jenkins节点: -- 在Pipeline中配置 `agent { label 'your-node-label' }` -- 或在自由风格项目中配置 "Restrict where this project can be run" diff --git a/zhyy/test_case/Jenkinsfile b/zhyy/test_case/Jenkinsfile deleted file mode 100644 index 721bf36..0000000 --- a/zhyy/test_case/Jenkinsfile +++ /dev/null @@ -1,175 +0,0 @@ -pipeline { - agent any - - options { - // 保留最近10次构建 - buildDiscarder(logRotator(numToKeepStr: '10')) - // 超时时间60分钟 - timeout(time: 60, unit: 'MINUTES') - } - - environment { - // Python路径 - PYTHONPATH = "${WORKSPACE}" - // Allure结果目录 - ALLURE_RESULTS = "${WORKSPACE}/zhyy/test_case/reports/allure-results" - // Allure报告目录 - ALLURE_REPORT = "${WORKSPACE}/zhyy/test_case/reports/allure-report" - } - - stages { - stage('Checkout') { - steps { - echo '检出代码...' - checkout scm - } - } - - stage('环境准备') { - steps { - echo '准备测试环境...' - script { - // 确保Python环境 - sh ''' - python --version - pip --version - ''' - } - } - } - - stage('运行测试') { - steps { - echo '执行测试用例...' - script { - // 根据参数选择运行方式 - def runType = params.RUN_TYPE ?: 'all' - def testCommand = '' - - switch(runType) { - case 'all': - testCommand = 'python zhyy/test_case/run_tests.py --all --no-report' - break - case 'feature': - def feature = params.FEATURE_NAME ?: '' - testCommand = "python zhyy/test_case/run_tests.py --feature \"${feature}\" --no-report" - break - case 'story': - def story = params.STORY_NAME ?: '' - testCommand = "python zhyy/test_case/run_tests.py --story \"${story}\" --no-report" - break - case 'dir': - def dir = params.DIR_PATH ?: '' - testCommand = "python zhyy/test_case/run_tests.py --dir \"${dir}\" --no-report" - break - case 'file': - def file = params.FILE_PATH ?: '' - testCommand = "python zhyy/test_case/run_tests.py --file \"${file}\" --no-report" - break - case 'keyword': - def keyword = params.KEYWORD ?: '' - testCommand = "python zhyy/test_case/run_tests.py --keyword \"${keyword}\" --no-report" - break - case 'marker': - def marker = params.MARKER ?: '' - testCommand = "python zhyy/test_case/run_tests.py --marker \"${marker}\" --no-report" - break - default: - testCommand = 'python zhyy/test_case/run_tests.py --all --no-report' - } - - sh """ - cd ${WORKSPACE} - ${testCommand} - """ - } - } - post { - always { - // 无论成功失败都收集测试结果 - echo '收集测试结果...' - } - } - } - - stage('生成Allure报告') { - steps { - echo '生成Allure报告...' - script { - sh """ - cd ${WORKSPACE} - allure generate ${ALLURE_RESULTS} -o ${ALLURE_REPORT} --clean || echo "Allure报告生成失败,但继续执行" - """ - } - } - } - } - - post { - always { - // 发布Allure报告 - allure([ - includeProperties: false, - jdk: '', - properties: [], - reportBuildPolicy: 'ALWAYS', - results: [[path: 'zhyy/test_case/reports/allure-results']] - ]) - - // 清理工作空间(可选) - // cleanWs() - } - success { - echo '✓ 测试执行成功' - // 可以在这里添加成功通知,如发送邮件、钉钉等 - } - failure { - echo '✗ 测试执行失败' - // 可以在这里添加失败通知 - } - unstable { - echo '⚠ 测试执行不稳定' - } - } -} - -// 参数化构建 -properties([ - parameters([ - choice( - name: 'RUN_TYPE', - choices: ['all', 'feature', 'story', 'dir', 'file', 'keyword', 'marker'], - description: '选择运行方式' - ), - string( - name: 'FEATURE_NAME', - defaultValue: '', - description: 'Feature标签名称(当RUN_TYPE=feature时使用)' - ), - string( - name: 'STORY_NAME', - defaultValue: '', - description: 'Story标签名称(当RUN_TYPE=story时使用)' - ), - string( - name: 'DIR_PATH', - defaultValue: '接口/SZPurchase', - description: '测试目录路径(当RUN_TYPE=dir时使用,相对于TestCase目录)' - ), - string( - name: 'FILE_PATH', - defaultValue: '接口/SZPurchase/PurchaseOrderManage.py', - description: '测试文件路径(当RUN_TYPE=file时使用,相对于TestCase目录)' - ), - string( - name: 'KEYWORD', - defaultValue: 'purchase', - description: '关键字(当RUN_TYPE=keyword时使用)' - ), - string( - name: 'MARKER', - defaultValue: 'smoke', - description: 'Pytest标记(当RUN_TYPE=marker时使用)' - ) - ]) -]) diff --git a/zhyy/test_case/README_JENKINS.md b/zhyy/test_case/README_JENKINS.md deleted file mode 100644 index d13633f..0000000 --- a/zhyy/test_case/README_JENKINS.md +++ /dev/null @@ -1,84 +0,0 @@ -# Jenkins + Allure 集成快速参考 - -## 快速开始 - -### 1. 安装Allure插件 -- Jenkins → Manage Jenkins → Manage Plugins -- 搜索 "Allure Plugin" 并安装 - -### 2. 配置Allure工具 -- Manage Jenkins → Global Tool Configuration -- Allure Commandline → 添加Allure安装路径 - -### 3. 创建Jenkins任务 - -#### 方式A:使用Jenkinsfile(推荐) -1. 新建Pipeline任务 -2. Pipeline script from SCM -3. Script Path: `zhyy/test_case/Jenkinsfile` -4. 保存并运行 - -#### 方式B:自由风格项目 -1. 新建Freestyle project -2. 构建步骤:执行 `jenkins_build.sh` 或 `jenkins_build.bat` -3. Post-build Actions → Allure Report -4. Results path: `zhyy/test_case/reports/allure-results` - -## 参数化构建 - -在Jenkins任务中配置以下参数: - -| 参数名 | 类型 | 说明 | 示例值 | -|--------|------|------|--------| -| RUN_TYPE | Choice | 运行方式 | all, feature, story, dir, file, keyword, marker | -| FEATURE_NAME | String | Feature标签 | 深圳采购工作台采购订单页面 | -| STORY_NAME | String | Story标签 | 验证采购工作台采购订单页面列表查询 | -| DIR_PATH | String | 目录路径 | 接口/SZPurchase | -| FILE_PATH | String | 文件路径 | 接口/SZPurchase/PurchaseOrderManage.py | -| KEYWORD | String | 关键字 | purchase | -| MARKER | String | Pytest标记 | smoke | - -## 常用命令 - -### 本地运行 -```bash -# 运行所有测试 -python run_tests.py - -# 按目录运行 -python run_tests.py --dir "接口/SZPurchase" - -# 按文件运行 -python run_tests.py --file "接口/SZPurchase/PurchaseOrderManage.py" - -# 生成并打开报告 -python run_tests.py --all --report --open -``` - -### Jenkins中运行 -```bash -# 使用构建脚本(自动检测参数) -bash jenkins_build.sh - -# 或直接使用run_tests.py -python run_tests.py --all --no-report -``` - -## Allure报告路径 - -- **结果目录**: `zhyy/test_case/reports/allure-results` -- **报告目录**: `zhyy/test_case/reports/allure-report` -- **Jenkins中查看**: 构建完成后点击左侧 "Allure Report" 链接 - -## 环境变量 - -Jenkins会自动设置以下环境变量: -- `WORKSPACE`: Jenkins工作空间路径 -- `BUILD_NUMBER`: 构建编号 -- `JENKINS_URL`: Jenkins服务器地址 - -`run_tests.py` 会自动检测Jenkins环境并调整路径。 - -## 详细文档 - -更多配置说明请参考:`JENKINS_SETUP.md` diff --git a/zhyy/test_case/README_RUN_TESTS.md b/zhyy/test_case/README_RUN_TESTS.md deleted file mode 100644 index 15762dc..0000000 --- a/zhyy/test_case/README_RUN_TESTS.md +++ /dev/null @@ -1,96 +0,0 @@ -# 测试执行说明 - -## 统一测试执行工具 - -使用 `run_tests.py` 可以方便地执行各种测试用例。 - -## 安装依赖 - -```bash -pip install pytest -pip install pytest-allure-adaptor # 或 allure-pytest -pip install allure-python-commons -``` - -## 使用方法 - -### 1. 运行所有测试用例 - -```bash -python run_tests.py --all -``` - -### 2. 按 Allure Feature 标签运行 - -```bash -python run_tests.py --feature "深圳采购工作台采购订单页面" -``` - -### 3. 按 Allure Story 标签运行 - -```bash -python run_tests.py --story "验证采购工作台采购订单页面列表查询" -``` - -### 4. 按目录运行 - -```bash -python run_tests.py --dir "接口/SZPurchase" -``` - -### 5. 按文件运行 - -```bash -python run_tests.py --file "接口/SZPurchase/PurchaseOrderManage.py" -``` - -### 6. 按关键字运行(匹配文件名或类名) - -```bash -python run_tests.py --keyword "purchase" -``` - -### 7. 按 pytest 标记运行 - -```bash -python run_tests.py --marker "smoke" -``` - -### 8. 生成并打开 Allure 报告 - -```bash -python run_tests.py --all --report --open -``` - -## 快捷方式(Windows) - -- `run_all.bat` - 运行所有测试用例 -- `run_purchase.bat` - 运行采购相关测试用例 - -## 参数说明 - -- `--all`: 运行所有测试用例 -- `--feature `: 按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 f93ff09..0000000 Binary files a/zhyy/test_case/TestCase/__pycache__/__init__.cpython-38.pyc and /dev/null differ 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 0f3d6e4..0000000 Binary files a/zhyy/test_case/TestCase/__pycache__/test_sample.cpython-38-pytest-7.4.4.pyc and /dev/null differ 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 19a7fba..0000000 Binary files a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/ContractManage.cpython-38-pytest-7.4.4.pyc and /dev/null differ 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 7e79365..0000000 Binary files a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchaseOrderManage.cpython-38-pytest-7.4.4.pyc and /dev/null differ 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 4b83896..0000000 Binary files a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/PurchasePlanManage.cpython-38-pytest-7.4.4.pyc and /dev/null differ 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 3209a52..0000000 Binary files a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/__init__.cpython-38.pyc and /dev/null differ 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 997a65e..0000000 Binary files a/zhyy/test_case/TestCase/接口/SZPurchase/__pycache__/index.cpython-38-pytest-7.4.4.pyc and /dev/null differ 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 9ce1ed7..0000000 Binary files a/zhyy/test_case/TestCase/接口/__pycache__/__init__.cpython-38.pyc and /dev/null differ 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 676231a..0000000 Binary files a/zhyy/test_case/TestCase/接口/__pycache__/conftest.cpython-38-pytest-7.4.4.pyc and /dev/null differ diff --git a/zhyy/test_case/TestCase/接口/conftest.py b/zhyy/test_case/TestCase/接口/conftest.py deleted file mode 100644 index 889acff..0000000 --- a/zhyy/test_case/TestCase/接口/conftest.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -""" -测试配置文件 -用于设置测试环境的路径和配置 -""" -import os -import sys - -# 添加项目根目录到 Python 路径,确保能导入 zhyy 模块 -current_file_path = os.path.abspath(__file__) -# 从 test_case/TestCase/接口/conftest.py 向上找到项目根目录 d:\zhyy -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) diff --git a/zhyy/test_case/__init__.py b/zhyy/test_case/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/zhyy/test_case/__pycache__/__init__.cpython-38.pyc b/zhyy/test_case/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 1dcb11e..0000000 Binary files a/zhyy/test_case/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/zhyy/test_case/jenkins_build.bat b/zhyy/test_case/jenkins_build.bat deleted file mode 100644 index ca3212e..0000000 --- a/zhyy/test_case/jenkins_build.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -REM Jenkins构建脚本(Windows) -REM 用于在Jenkins中执行测试并生成Allure报告 - -setlocal enabledelayedexpansion - -REM 设置工作目录 -if defined WORKSPACE ( - cd /d %WORKSPACE% -) else ( - cd /d %~dp0.. -) - -REM 进入测试目录 -cd zhyy\test_case - -REM 运行测试(根据参数选择运行方式) -if "%RUN_TYPE%"=="" set RUN_TYPE=all - -if "%RUN_TYPE%"=="all" ( - python run_tests.py --all --no-report -) else if "%RUN_TYPE%"=="feature" ( - python run_tests.py --feature "%FEATURE_NAME%" --no-report -) else if "%RUN_TYPE%"=="story" ( - python run_tests.py --story "%STORY_NAME%" --no-report -) else if "%RUN_TYPE%"=="dir" ( - python run_tests.py --dir "%DIR_PATH%" --no-report -) else if "%RUN_TYPE%"=="file" ( - python run_tests.py --file "%FILE_PATH%" --no-report -) else if "%RUN_TYPE%"=="keyword" ( - python run_tests.py --keyword "%KEYWORD%" --no-report -) else if "%RUN_TYPE%"=="marker" ( - python run_tests.py --marker "%MARKER%" --no-report -) else ( - echo 未知的运行类型: %RUN_TYPE% - exit /b 1 -) - -REM 生成Allure报告(Jenkins插件会自动处理,这里可选) -REM allure generate reports\allure-results -o reports\allure-report --clean - -echo 测试执行完成,Allure结果已保存到: reports\allure-results - -endlocal diff --git a/zhyy/test_case/jenkins_build.sh b/zhyy/test_case/jenkins_build.sh deleted file mode 100644 index cba769a..0000000 --- a/zhyy/test_case/jenkins_build.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -# Jenkins构建脚本(Linux/Mac) -# 用于在Jenkins中执行测试并生成Allure报告 - -set -e # 遇到错误立即退出 - -# 设置工作目录 -cd ${WORKSPACE:-$(pwd)} - -# 进入测试目录 -cd zhyy/test_case - -# 运行测试(根据参数选择运行方式) -RUN_TYPE=${RUN_TYPE:-all} - -case ${RUN_TYPE} in - all) - python run_tests.py --all --no-report - ;; - feature) - python run_tests.py --feature "${FEATURE_NAME}" --no-report - ;; - story) - python run_tests.py --story "${STORY_NAME}" --no-report - ;; - dir) - python run_tests.py --dir "${DIR_PATH}" --no-report - ;; - file) - python run_tests.py --file "${FILE_PATH}" --no-report - ;; - keyword) - python run_tests.py --keyword "${KEYWORD}" --no-report - ;; - marker) - python run_tests.py --marker "${MARKER}" --no-report - ;; - *) - echo "未知的运行类型: ${RUN_TYPE}" - exit 1 - ;; -esac - -# 生成Allure报告(Jenkins插件会自动处理,这里可选) -# allure generate reports/allure-results -o reports/allure-report --clean || true - -echo "测试执行完成,Allure结果已保存到: reports/allure-results" diff --git a/zhyy/test_case/reports/allure-report/app.js b/zhyy/test_case/reports/allure-report/app.js deleted file mode 100644 index 579e79d..0000000 --- a/zhyy/test_case/reports/allure-report/app.js +++ /dev/null @@ -1,60 +0,0 @@ -!function(e){var t={};function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.l=!0,r.exports}__webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.t=function(e,t){if(1&t&&(e=__webpack_require__(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(__webpack_require__.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)__webpack_require__.d(n,r,function(t){return e[t]}.bind(null,r));return n},__webpack_require__.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="/",__webpack_require__(__webpack_require__.s=197)}([function(e,t){function _getPrototypeOf(t){return e.exports=_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},_getPrototypeOf(t)}e.exports=_getPrototypeOf},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){var r=n(113),i=n(1);e.exports=function(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?i(e):t}},function(e,t,n){var r=n(114);e.exports=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&r(e,t)}},function(e,t){function _defineProperties(e,t){for(var n=0;n1?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("