mirror of
https://github.com/certd/certd.git
synced 2026-06-16 14:27:32 +08:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8875e8059f | |||
| 6490366c68 | |||
| c278946771 | |||
| 1562d9de36 | |||
| 5bb0990abb | |||
| bfd3cacc68 | |||
| c7e1163d59 | |||
| fba7aeb71b | |||
| c66a2bd77a | |||
| ed58ae3c53 | |||
| 194463bea9 | |||
| 260f5ae777 | |||
| e85d824337 | |||
| e17fc39709 | |||
| da9b297b12 | |||
| 807dfcd57a | |||
| 0a410db52a | |||
| 4501095106 | |||
| bc731e4fb1 | |||
| 53561d2755 | |||
| e913fe509c | |||
| a3a215b7ae | |||
| 56f2949ac5 | |||
| c1b5a35f90 | |||
| 48ab1fbffe | |||
| 5f078273b3 | |||
| 636338f9ed |
@@ -3,6 +3,16 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* **plugin:** 增加 Dynadot DNS and access 插件 ([a3a215b](https://github.com/certd/certd/commit/a3a215b7ae2b90efcde91270ce4165bbfe77dc64))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ https://certd.handfree.work/
|
|||||||
|
|
||||||
|
|
||||||
> [50元专业版优惠券限时领取](https://app.handfree.work/subject/#/app/certd/product) https://app.handfree.work/subject/#/app/certd/product
|
> [50元专业版优惠券限时领取](https://app.handfree.work/subject/#/app/certd/product) https://app.handfree.work/subject/#/app/certd/product
|
||||||
> handfree.work是Certd官方激活码购买平台
|
> app.handfree.work是Certd官方激活码购买平台
|
||||||
|
|
||||||
|
|
||||||
专业版、商业版特权对比
|
专业版、商业版特权对比
|
||||||
|
|||||||
@@ -3,6 +3,26 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* **plugin:** 增加 Dynadot DNS and access 插件 ([a3a215b](https://github.com/certd/certd/commit/a3a215b7ae2b90efcde91270ce4165bbfe77dc64))
|
||||||
|
|
||||||
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复litessl无法申请证书,报authorization must be pending 错误的问题 ([d6cd9d1](https://github.com/certd/certd/commit/d6cd9d136d2812b2335917305f36d6d9414507ad))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 首页夜间模式主图切换为黑色背景 ([15484bc](https://github.com/certd/certd/commit/15484bc119fef7a0ca7f3fdab01d665fde47e688))
|
||||||
|
|
||||||
## [1.41.2](https://github.com/certd/certd/compare/v1.41.1...v1.41.2) (2026-06-10)
|
## [1.41.2](https://github.com/certd/certd/compare/v1.41.1...v1.41.2) (2026-06-10)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ Certd 是一款开源、免费、全自动申请和部署更新SSL证书的工
|
|||||||
关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具
|
关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具
|
||||||
|
|
||||||
|
|
||||||
| 官方开源地址: | |
|
| |官方开源地址: |
|
||||||
| ---- | ---- |
|
| ---- | ---- |
|
||||||
| [Github](https://github.com/certd/certd)|  |
|
| [Github](https://github.com/certd/certd)|  |
|
||||||
| [Gitee](https://gitee.com/certd/certd) |  |
|
| [Gitee](https://gitee.com/certd/certd) |  |
|
||||||
|
|||||||
@@ -33,53 +33,54 @@
|
|||||||
| 29.| **彩虹DNS** | 彩虹DNS管理系统授权 |
|
| 29.| **彩虹DNS** | 彩虹DNS管理系统授权 |
|
||||||
| 30.| **多吉云** | |
|
| 30.| **多吉云** | |
|
||||||
| 31.| **Dokploy授权** | |
|
| 31.| **Dokploy授权** | |
|
||||||
| 32.| **farcdn授权** | |
|
| 32.| **Dynadot授权** | |
|
||||||
| 33.| **FlexCDN授权** | |
|
| 33.| **farcdn授权** | |
|
||||||
| 34.| **Gcore** | Gcore |
|
| 34.| **FlexCDN授权** | |
|
||||||
| 35.| **Github授权** | |
|
| 35.| **Gcore** | Gcore |
|
||||||
| 36.| **godaddy授权** | |
|
| 36.| **Github授权** | |
|
||||||
| 37.| **HiPM DNSMgr** | HiPM DNSMgr API Token 授权 |
|
| 37.| **godaddy授权** | |
|
||||||
| 38.| **金山云授权** | |
|
| 38.| **HiPM DNSMgr** | HiPM DNSMgr API Token 授权 |
|
||||||
| 39.| **FTP授权** | |
|
| 39.| **金山云授权** | |
|
||||||
| 40.| **七牛OSS授权** | |
|
| 40.| **FTP授权** | |
|
||||||
| 41.| **腾讯云COS授权** | 腾讯云对象存储授权,包含地域和存储桶 |
|
| 41.| **七牛OSS授权** | |
|
||||||
| 42.| **s3/minio授权** | S3/minio oss授权 |
|
| 42.| **腾讯云COS授权** | 腾讯云对象存储授权,包含地域和存储桶 |
|
||||||
| 43.| **namesilo授权** | |
|
| 43.| **s3/minio授权** | S3/minio oss授权 |
|
||||||
| 44.| **Next Terminal 授权** | 用于访问 Next Terminal API 的授权配置 |
|
| 44.| **namesilo授权** | |
|
||||||
| 45.| **Nginx Proxy Manager 授权** | 用于登录 Nginx Proxy Manager,并为代理主机证书部署提供授权。 |
|
| 45.| **Next Terminal 授权** | 用于访问 Next Terminal API 的授权配置 |
|
||||||
| 46.| **1panel授权** | 账号和密码 |
|
| 46.| **Nginx Proxy Manager 授权** | 用于登录 Nginx Proxy Manager,并为代理主机证书部署提供授权。 |
|
||||||
| 47.| **支付宝** | |
|
| 47.| **1panel授权** | 账号和密码 |
|
||||||
| 48.| **白山云授权** | |
|
| 48.| **支付宝** | |
|
||||||
| 49.| **宝塔云WAF授权** | 用于连接和管理宝塔云WAF服务的授权配置 |
|
| 49.| **白山云授权** | |
|
||||||
| 50.| **cdnfly授权** | |
|
| 50.| **宝塔云WAF授权** | 用于连接和管理宝塔云WAF服务的授权配置 |
|
||||||
| 51.| **k8s授权** | |
|
| 51.| **cdnfly授权** | |
|
||||||
| 52.| **括彩云cdn授权** | 括彩云CDN,每月免费30G,[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) |
|
| 52.| **k8s授权** | |
|
||||||
| 53.| **LeCDN授权** | |
|
| 53.| **括彩云cdn授权** | 括彩云CDN,每月免费30G,[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) |
|
||||||
| 54.| **lucky** | |
|
| 54.| **LeCDN授权** | |
|
||||||
| 55.| **猫云授权** | |
|
| 55.| **lucky** | |
|
||||||
| 56.| **plesk授权** | |
|
| 56.| **猫云授权** | |
|
||||||
| 57.| **长亭雷池授权** | |
|
| 57.| **plesk授权** | |
|
||||||
| 58.| **群晖登录授权** | |
|
| 58.| **长亭雷池授权** | |
|
||||||
| 59.| **uniCloud** | unicloud授权 |
|
| 59.| **群晖登录授权** | |
|
||||||
| 60.| **微信支付** | |
|
| 60.| **uniCloud** | unicloud授权 |
|
||||||
| 61.| **易盾rcdn授权** | 易盾CDN,每月免费30G,[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) |
|
| 61.| **微信支付** | |
|
||||||
| 62.| **易发云短信** | sms.yfyidc.cn/ |
|
| 62.| **易盾rcdn授权** | 易盾CDN,每月免费30G,[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) |
|
||||||
| 63.| **易盾DCDN授权** | https://user.yiduncdn.com |
|
| 63.| **易发云短信** | sms.yfyidc.cn/ |
|
||||||
| 64.| **易支付** | |
|
| 64.| **易盾DCDN授权** | https://user.yiduncdn.com |
|
||||||
| 65.| **proxmox** | |
|
| 65.| **易支付** | |
|
||||||
| 66.| **Spaceship.com 授权** | Spaceship.com API 授权插件 |
|
| 66.| **proxmox** | |
|
||||||
| 67.| **Technitium DNS Server** | Technitium DNS Server 自建DNS服务器授权 |
|
| 67.| **Spaceship.com 授权** | Spaceship.com API 授权插件 |
|
||||||
| 68.| **UCloud授权** | 优刻得授权 |
|
| 68.| **Technitium DNS Server** | Technitium DNS Server 自建DNS服务器授权 |
|
||||||
| 69.| **又拍云** | |
|
| 69.| **UCloud授权** | 优刻得授权 |
|
||||||
| 70.| **网宿授权** | |
|
| 70.| **又拍云** | |
|
||||||
| 71.| **西部数码授权** | |
|
| 71.| **网宿授权** | |
|
||||||
| 72.| **我爱云授权** | 我爱云CDN |
|
| 72.| **西部数码授权** | |
|
||||||
| 73.| **新网授权(代理方式)** | |
|
| 73.| **我爱云授权** | 我爱云CDN |
|
||||||
| 74.| **新网授权** | |
|
| 74.| **新网授权(代理方式)** | |
|
||||||
| 75.| **新网互联授权** | 仅支持代理账号,ip需要加入白名单 |
|
| 75.| **新网授权** | |
|
||||||
| 76.| **Zenlayer授权** | Zenlayer授权 |
|
| 76.| **新网互联授权** | 仅支持代理账号,ip需要加入白名单 |
|
||||||
| 77.| **GoEdge授权** | |
|
| 77.| **Zenlayer授权** | Zenlayer授权 |
|
||||||
| 78.| **雨云授权** | https://app.rainyun.com/ |
|
| 78.| **GoEdge授权** | |
|
||||||
|
| 79.| **雨云授权** | https://app.rainyun.com/ |
|
||||||
|
|
||||||
<style module>
|
<style module>
|
||||||
table th:first-of-type {
|
table th:first-of-type {
|
||||||
|
|||||||
@@ -13,21 +13,22 @@
|
|||||||
| 9.| **BIND9 DNS** | 通过 SSH 连接到 BIND9 服务器,使用 nsupdate 命令管理 DNS 记录 |
|
| 9.| **BIND9 DNS** | 通过 SSH 连接到 BIND9 服务器,使用 nsupdate 命令管理 DNS 记录 |
|
||||||
| 10.| **cloudflare** | cloudflare dns provider |
|
| 10.| **cloudflare** | cloudflare dns provider |
|
||||||
| 11.| **dns.la** | dns.la |
|
| 11.| **dns.la** | dns.la |
|
||||||
| 12.| **godaddy** | GoDaddy |
|
| 12.| **Dynadot** | Dynadot DNS提供商 |
|
||||||
| 13.| **HiPM DNSMgr** | HiPM DNSMgr DNS 解析提供商 |
|
| 13.| **godaddy** | GoDaddy |
|
||||||
| 14.| **华为云** | 华为云DNS解析提供商 |
|
| 14.| **HiPM DNSMgr** | HiPM DNSMgr DNS 解析提供商 |
|
||||||
| 15.| **namesilo** | namesilo dns provider |
|
| 15.| **华为云** | 华为云DNS解析提供商 |
|
||||||
| 16.| **雨云** | 雨云DNS解析提供商 |
|
| 16.| **namesilo** | namesilo dns provider |
|
||||||
| 17.| **Technitium DNS Server** | Technitium DNS Server 自建DNS服务器 |
|
| 17.| **雨云** | 雨云DNS解析提供商 |
|
||||||
| 18.| **腾讯云** | 腾讯云域名DNS解析提供者 |
|
| 18.| **Technitium DNS Server** | Technitium DNS Server 自建DNS服务器 |
|
||||||
| 19.| **腾讯云EO DNS** | 腾讯云EO DNS解析提供者 |
|
| 19.| **腾讯云** | 腾讯云域名DNS解析提供者 |
|
||||||
| 20.| **西部数码** | west dns provider |
|
| 20.| **腾讯云EO DNS** | 腾讯云EO DNS解析提供者 |
|
||||||
| 21.| **Google Cloud DNS** | Google Cloud DNS提供商 |
|
| 21.| **西部数码** | west dns provider |
|
||||||
| 22.| **Dns提供商Demo** | dns provider示例 |
|
| 22.| **Google Cloud DNS** | Google Cloud DNS提供商 |
|
||||||
| 23.| **彩虹DNS** | 彩虹DNS管理系统 |
|
| 23.| **Dns提供商Demo** | dns provider示例 |
|
||||||
| 24.| **Spaceship** | Spaceship 域名解析 |
|
| 24.| **彩虹DNS** | 彩虹DNS管理系统 |
|
||||||
| 25.| **51dns** | 51DNS |
|
| 25.| **Spaceship** | Spaceship 域名解析 |
|
||||||
| 26.| **新网互联** | 新网互联 |
|
| 26.| **51dns** | 51DNS |
|
||||||
|
| 27.| **新网互联** | 新网互联 |
|
||||||
|
|
||||||
<style module>
|
<style module>
|
||||||
table th:first-of-type {
|
table th:first-of-type {
|
||||||
|
|||||||
+1
-1
@@ -9,5 +9,5 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmClient": "pnpm",
|
"npmClient": "pnpm",
|
||||||
"version": "1.41.3"
|
"version": "1.41.4"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -15,8 +15,7 @@
|
|||||||
"vitepress-plugin-lightbox": "^1.0.2"
|
"vitepress-plugin-lightbox": "^1.0.2"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "lerna bootstrap --hoist",
|
"start": "cd ./packages/ui/certd-server && pnpm start",
|
||||||
"start:server": "cd ./packages/ui/certd-server && pnpm start",
|
|
||||||
"devb": "lerna run dev-build",
|
"devb": "lerna run dev-build",
|
||||||
"i-all": "lerna link && lerna exec npm install ",
|
"i-all": "lerna link && lerna exec npm install ",
|
||||||
"publish": "pnpm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits && pnpm run afterpublishOnly ",
|
"publish": "pnpm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits && pnpm run afterpublishOnly ",
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/publishlab/node-acme-client/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
## [1.41.3](https://github.com/publishlab/node-acme-client/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/publishlab/node-acme-client/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"description": "Simple and unopinionated ACME client",
|
"description": "Simple and unopinionated ACME client",
|
||||||
"private": false,
|
"private": false,
|
||||||
"author": "nmorsman",
|
"author": "nmorsman",
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"types"
|
"types"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@peculiar/x509": "^1.11.0",
|
"@peculiar/x509": "^1.11.0",
|
||||||
"asn1js": "^3.0.5",
|
"asn1js": "^3.0.5",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
@@ -76,5 +76,5 @@
|
|||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/basic
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
23:53
|
21:25
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/basic",
|
"name": "@certd/basic",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -52,5 +52,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/pipeline
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/pipeline",
|
"name": "@certd/pipeline",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
"compile": "tsc --skipLibCheck --watch"
|
"compile": "tsc --skipLibCheck --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@certd/plus-core": "^1.41.3",
|
"@certd/plus-core": "^1.41.4",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"reflect-metadata": "^0.1.13"
|
"reflect-metadata": "^0.1.13"
|
||||||
@@ -49,5 +49,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-huawei
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-huawei",
|
"name": "@certd/lib-huawei",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
"types": "./dist/d/index.d.ts",
|
"types": "./dist/d/index.d.ts",
|
||||||
@@ -12,7 +12,8 @@
|
|||||||
"dev-build": "npm run build",
|
"dev-build": "npm run build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||||
"pub": "npm publish"
|
"pub": "npm publish",
|
||||||
|
"compile": "npm run build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
@@ -27,5 +28,5 @@
|
|||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tslib": "^2.8.1"
|
"tslib": "^2.8.1"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-iframe
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-iframe",
|
"name": "@certd/lib-iframe",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -15,7 +15,8 @@
|
|||||||
"build2": "vue-tsc --noEmit && vite build",
|
"build2": "vue-tsc --noEmit && vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||||
"pub": "npm publish"
|
"pub": "npm publish",
|
||||||
|
"compile": "npm run build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^4.0.0"
|
"nanoid": "^4.0.0"
|
||||||
@@ -34,5 +35,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/jdcloud
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/jdcloud",
|
"name": "@certd/jdcloud",
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"description": "jdcloud openApi sdk",
|
"description": "jdcloud openApi sdk",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
@@ -10,7 +10,8 @@
|
|||||||
"build": "npm run before-build && rollup -c ",
|
"build": "npm run before-build && rollup -c ",
|
||||||
"dev-build": "npm run build",
|
"dev-build": "npm run build",
|
||||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||||
"pub": "npm publish"
|
"pub": "npm publish",
|
||||||
|
"compile": "npm run build"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "Apache",
|
"license": "Apache",
|
||||||
@@ -59,5 +60,5 @@
|
|||||||
"fetch"
|
"fetch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-k8s
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-k8s",
|
"name": "@certd/lib-k8s",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"compile": "tsc --skipLibCheck --watch"
|
"compile": "tsc --skipLibCheck --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@kubernetes/client-node": "0.21.0"
|
"@kubernetes/client-node": "0.21.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -36,5 +36,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-server
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-server",
|
"name": "@certd/lib-server",
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -29,11 +29,11 @@
|
|||||||
],
|
],
|
||||||
"license": "AGPL",
|
"license": "AGPL",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.41.3",
|
"@certd/acme-client": "^1.41.4",
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@certd/pipeline": "^1.41.3",
|
"@certd/pipeline": "^1.41.4",
|
||||||
"@certd/plugin-lib": "^1.41.3",
|
"@certd/plugin-lib": "^1.41.4",
|
||||||
"@certd/plus-core": "^1.41.3",
|
"@certd/plus-core": "^1.41.4",
|
||||||
"@midwayjs/cache": "3.14.0",
|
"@midwayjs/cache": "3.14.0",
|
||||||
"@midwayjs/core": "3.20.11",
|
"@midwayjs/core": "3.20.11",
|
||||||
"@midwayjs/i18n": "3.20.13",
|
"@midwayjs/i18n": "3.20.13",
|
||||||
@@ -69,5 +69,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,7 +173,6 @@ export class SysSettingsService extends BaseService<SysSettingsEntity> {
|
|||||||
if (privateSetting.dnsResultOrder) {
|
if (privateSetting.dnsResultOrder) {
|
||||||
dns.setDefaultResultOrder(privateSetting.dnsResultOrder as any);
|
dns.setDefaultResultOrder(privateSetting.dnsResultOrder as any);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (privateSetting.pipelineMaxRunningCount) {
|
if (privateSetting.pipelineMaxRunningCount) {
|
||||||
executorQueue.setMaxRunningCount(privateSetting.pipelineMaxRunningCount);
|
executorQueue.setMaxRunningCount(privateSetting.pipelineMaxRunningCount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/midway-flyway-js",
|
"name": "@certd/midway-flyway-js",
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -16,7 +16,8 @@
|
|||||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||||
"cov": "midway-bin cov --ts",
|
"cov": "midway-bin cov --ts",
|
||||||
"prepublish": "npm run build",
|
"prepublish": "npm run build",
|
||||||
"pub": "npm publish"
|
"pub": "npm publish",
|
||||||
|
"compile": "npm run build"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "greper",
|
"author": "greper",
|
||||||
@@ -49,5 +50,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-cert
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-cert",
|
"name": "@certd/plugin-cert",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -18,10 +18,10 @@
|
|||||||
"compile": "tsc --skipLibCheck --watch"
|
"compile": "tsc --skipLibCheck --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.41.3",
|
"@certd/acme-client": "^1.41.4",
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@certd/pipeline": "^1.41.3",
|
"@certd/pipeline": "^1.41.4",
|
||||||
"@certd/plugin-lib": "^1.41.3",
|
"@certd/plugin-lib": "^1.41.4",
|
||||||
"psl": "^1.9.0",
|
"psl": "^1.9.0",
|
||||||
"punycode.js": "^2.3.1"
|
"punycode.js": "^2.3.1"
|
||||||
},
|
},
|
||||||
@@ -41,5 +41,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-lib
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-lib",
|
"name": "@certd/plugin-lib",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -23,10 +23,10 @@
|
|||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@alicloud/tea-util": "^1.4.11",
|
"@alicloud/tea-util": "^1.4.11",
|
||||||
"@aws-sdk/client-s3": "^3.964.0",
|
"@aws-sdk/client-s3": "^3.964.0",
|
||||||
"@certd/acme-client": "^1.41.3",
|
"@certd/acme-client": "^1.41.4",
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@certd/pipeline": "^1.41.3",
|
"@certd/pipeline": "^1.41.4",
|
||||||
"@certd/plus-core": "^1.41.3",
|
"@certd/plus-core": "^1.41.4",
|
||||||
"@kubernetes/client-node": "0.21.0",
|
"@kubernetes/client-node": "0.21.0",
|
||||||
"ali-oss": "^6.22.0",
|
"ali-oss": "^6.22.0",
|
||||||
"basic-ftp": "^5.0.5",
|
"basic-ftp": "^5.0.5",
|
||||||
@@ -61,5 +61,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "cc38ccd0e9eddbd31e0b0401516788e5d9c16d05"
|
"gitHead": "bc731e4fb119787930e816a7d57c808b1b5cd66a"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ export class CertConverter {
|
|||||||
if (!fs.existsSync(dir)) {
|
if (!fs.existsSync(dir)) {
|
||||||
fs.mkdirSync(dir, { recursive: true });
|
fs.mkdirSync(dir, { recursive: true });
|
||||||
}
|
}
|
||||||
await this.exec(`keytool -importkeystore -srckeystore ${p12Path} -srcstoretype PKCS12 -srcstorepass "${jksPassword}" -destkeystore ${jksPath} -deststoretype PKCS12 -deststorepass "${jksPassword}" `);
|
await this.exec(`keytool -importkeystore -srckeystore ${p12Path} -srcstoretype PKCS12 -srcstorepass "${jksPassword}" -destkeystore ${jksPath} -deststoretype JKS -deststorepass "${jksPassword}" `);
|
||||||
fs.unlinkSync(p12Path);
|
fs.unlinkSync(p12Path);
|
||||||
|
|
||||||
const fileBuffer = fs.readFileSync(jksPath);
|
const fileBuffer = fs.readFileSync(jksPath);
|
||||||
|
|||||||
+29
-8
@@ -1,4 +1,4 @@
|
|||||||
FROM node:22-alpine3.21 AS builder
|
FROM node:22-trixie-slim AS builder
|
||||||
|
|
||||||
# RUN apk add build-base
|
# RUN apk add build-base
|
||||||
# RUN wget -O - https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2 | tar -xj && \
|
# RUN wget -O - https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2 | tar -xj && \
|
||||||
@@ -25,7 +25,7 @@ RUN cd /workspace/certd-server && pnpm install && npm run build-on-docker
|
|||||||
# npm run build-on-docker
|
# npm run build-on-docker
|
||||||
|
|
||||||
|
|
||||||
FROM node:22-alpine3.21
|
FROM node:22-trixie-slim
|
||||||
EXPOSE 7001
|
EXPOSE 7001
|
||||||
EXPOSE 7002
|
EXPOSE 7002
|
||||||
|
|
||||||
@@ -34,14 +34,32 @@ EXPOSE 7002
|
|||||||
# ENV LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
|
# ENV LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
|
||||||
|
|
||||||
|
|
||||||
RUN apk add --no-cache openssl
|
# RUN apk add --no-cache openssl
|
||||||
RUN apk add --no-cache openjdk8
|
# RUN apk add --no-cache openjdk8
|
||||||
RUN apk add --no-cache gcompat
|
# RUN apk add --no-cache gcompat
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
ca-certificates \
|
||||||
|
gnupg \
|
||||||
|
wget \
|
||||||
|
openssl \
|
||||||
|
netcat-openbsd \
|
||||||
|
iputils-ping \
|
||||||
|
dnsutils \
|
||||||
|
iproute2 \
|
||||||
|
ncurses-base \
|
||||||
|
&& wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | tee /usr/share/keyrings/adoptium.gpg > /dev/null \
|
||||||
|
&& echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main" | tee /etc/apt/sources.list.d/adoptium.list \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends temurin-8-jre \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /app/
|
WORKDIR /app/
|
||||||
COPY --from=builder /workspace/certd-server/ /app/
|
|
||||||
|
|
||||||
COPY ./patch/ssh2/*.js /app/node_modules/.pnpm/node_modules/ssh2/lib/protocol/
|
|
||||||
|
|
||||||
|
ENV TERM xterm
|
||||||
ENV LEGO_VERSION=4.30.1
|
ENV LEGO_VERSION=4.30.1
|
||||||
ENV LEGO_DOWNLOAD_DIR=/app/tools/lego
|
ENV LEGO_DOWNLOAD_DIR=/app/tools/lego
|
||||||
|
|
||||||
@@ -63,6 +81,9 @@ RUN ARCH=$(uname -m) && \
|
|||||||
ENV TZ=Asia/Shanghai
|
ENV TZ=Asia/Shanghai
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV MIDWAY_SERVER_ENV=production
|
ENV MIDWAY_SERVER_ENV=production
|
||||||
|
|
||||||
|
COPY --from=builder /workspace/certd-server/ /app/
|
||||||
|
COPY ./patch/ssh2/*.js /app/node_modules/.pnpm/node_modules/ssh2/lib/protocol/
|
||||||
CMD ["node", "--optimize-for-size", "./bootstrap.js"]
|
CMD ["node", "--optimize-for-size", "./bootstrap.js"]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
### Performance Improvements
|
### Performance Improvements
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-client",
|
"name": "@certd/ui-client",
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --open",
|
"dev": "vite --open",
|
||||||
@@ -106,8 +106,8 @@
|
|||||||
"zod-defaults": "^0.1.3"
|
"zod-defaults": "^0.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@certd/lib-iframe": "^1.41.3",
|
"@certd/lib-iframe": "^1.41.4",
|
||||||
"@certd/pipeline": "^1.41.3",
|
"@certd/pipeline": "^1.41.4",
|
||||||
"@rollup/plugin-commonjs": "^25.0.7",
|
"@rollup/plugin-commonjs": "^25.0.7",
|
||||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||||
"@types/chai": "^4.3.12",
|
"@types/chai": "^4.3.12",
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "DnsPersistRecord",
|
name: "DnsPersistRecord",
|
||||||
@@ -24,10 +24,8 @@ const context: any = {
|
|||||||
};
|
};
|
||||||
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });
|
||||||
|
|
||||||
onMounted(() => {
|
// 页面打开后获取列表数据
|
||||||
// crudExpose.doRefresh();
|
useMounted(async () => {
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -19,13 +19,14 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
import { useCrudPermission } from "/@/plugin/permission";
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -61,10 +62,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -21,13 +21,14 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
import { useCrudPermission } from "/@/plugin/permission";
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -61,10 +62,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -149,7 +149,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, nextTick, onActivated, onMounted, reactive, ref } from "vue";
|
import { computed, nextTick, reactive, ref } from "vue";
|
||||||
import { FsIcon, useFs } from "@fast-crud/fast-crud";
|
import { FsIcon, useFs } from "@fast-crud/fast-crud";
|
||||||
import { notification } from "ant-design-vue";
|
import { notification } from "ant-design-vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
@@ -158,6 +158,7 @@ import createInviteesCrudOptions from "./crud-invitees";
|
|||||||
import createLogsCrudOptions from "./crud-logs";
|
import createLogsCrudOptions from "./crud-logs";
|
||||||
import { useSettingStore } from "/@/store/settings";
|
import { useSettingStore } from "/@/store/settings";
|
||||||
import { util } from "/@/utils";
|
import { util } from "/@/utils";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({ name: "InviteCommission" });
|
defineOptions({ name: "InviteCommission" });
|
||||||
|
|
||||||
@@ -314,16 +315,10 @@ async function refreshInvitePage(autoOpenAgreement = true) {
|
|||||||
await refreshActiveList();
|
await refreshActiveList();
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
// 页面打开后获取列表数据
|
||||||
|
useMounted(async () => {
|
||||||
await refreshInvitePage(true);
|
await refreshInvitePage(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
onActivated(async () => {
|
|
||||||
if (!loaded.value) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await refreshInvitePage();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, onActivated, onMounted, provide, ref } from "vue";
|
import { computed, provide, ref } from "vue";
|
||||||
import { dict, useFs } from "@fast-crud/fast-crud";
|
import { dict, useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import ChangeGroup from "./components/change-group.vue";
|
import ChangeGroup from "./components/change-group.vue";
|
||||||
@@ -67,7 +67,7 @@ import BatchRerun from "./components/batch-rerun.vue";
|
|||||||
import { Modal, notification } from "ant-design-vue";
|
import { Modal, notification } from "ant-design-vue";
|
||||||
import * as api from "./api";
|
import * as api from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
import ChangeNotification from "/@/views/certd/pipeline/components/change-notification.vue";
|
import ChangeNotification from "/@/views/certd/pipeline/components/change-notification.vue";
|
||||||
import { useSettingStore } from "/@/store/settings";
|
import { useSettingStore } from "/@/store/settings";
|
||||||
@@ -128,11 +128,7 @@ context.hasActionPermission = hasActionPermission;
|
|||||||
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
|
|
||||||
onActivated(async () => {
|
|
||||||
await groupDictRef.reloadDict();
|
await groupDictRef.reloadDict();
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -26,13 +26,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
import { useCrudPermission } from "/@/plugin/permission";
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -67,10 +67,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted, Ref, ref } from "vue";
|
import { onMounted, ref } from "vue";
|
||||||
import { useMounted } from "/@/use/use-mounted";
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
|
|||||||
@@ -18,12 +18,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -52,10 +52,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -8,9 +8,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "MyTrade",
|
name: "MyTrade",
|
||||||
@@ -18,10 +18,7 @@ defineOptions({
|
|||||||
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions });
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions });
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, h, onActivated, onMounted, reactive, ref } from "vue";
|
import { computed, h, reactive, ref } from "vue";
|
||||||
import { compute, dict, useFs } from "@fast-crud/fast-crud";
|
import { compute, dict, useFs } from "@fast-crud/fast-crud";
|
||||||
import { Button, notification } from "ant-design-vue";
|
import { Button, notification } from "ant-design-vue";
|
||||||
import * as api from "./api";
|
import * as api from "./api";
|
||||||
@@ -36,6 +36,7 @@ import createWithdrawCrudOptions from "./crud-withdraw";
|
|||||||
import { util } from "/@/utils";
|
import { util } from "/@/utils";
|
||||||
import { useFormDialog } from "/@/use/use-dialog";
|
import { useFormDialog } from "/@/use/use-dialog";
|
||||||
import { useUserStore } from "/@/store/user";
|
import { useUserStore } from "/@/store/user";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({ name: "MyWallet" });
|
defineOptions({ name: "MyWallet" });
|
||||||
|
|
||||||
@@ -257,14 +258,8 @@ async function refreshWalletPage() {
|
|||||||
loaded.value = true;
|
loaded.value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(refreshWalletPage);
|
// 页面打开后获取列表数据
|
||||||
|
useMounted(refreshWalletPage);
|
||||||
onActivated(async () => {
|
|
||||||
if (!loaded.value) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await refreshWalletPage();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
|
|||||||
@@ -14,27 +14,25 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onActivated, onMounted, ref } from "vue";
|
import { defineComponent, ref} from "vue";
|
||||||
import createCrudOptions from "./crud.js";
|
import createCrudOptions from "./crud.js";
|
||||||
import FsPermissionTree from "./fs-permission-tree.vue";
|
import FsPermissionTree from "./fs-permission-tree.vue";
|
||||||
import { usePermission } from "/src/plugin/permission";
|
import { usePermission } from "/src/plugin/permission";
|
||||||
import { useFs, useUi } from "@fast-crud/fast-crud";
|
import { useFs, useUi } from "@fast-crud/fast-crud";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "PermissionManager",
|
name: "PermissionManager",
|
||||||
components: { FsPermissionTree },
|
components: { FsPermissionTree },
|
||||||
setup() {
|
setup() {
|
||||||
// 此处传入permission进行通用按钮权限设置,会通过commonOptions去设置actionbar和rowHandle的按钮的show属性
|
// 此处传入permission进行通用按钮权限设置,会通过commonOptions去设置actionbar和rowHandle的按钮的show属性
|
||||||
// 更多关于按钮权限的源代码设置,请参考 ./src/plugin/fast-crud/index.js (75-77行)
|
// 更多关于按钮权限的源代码的说明,请参考 ./src/plugin/fast-crud/index.js (75-77行)
|
||||||
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { permission: "sys:auth:per" } });
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { permission: "sys:auth:per" } });
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(async () => {
|
useMounted(async () => {
|
||||||
// await crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -22,12 +22,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -55,10 +56,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -22,12 +22,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -55,10 +56,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -19,12 +19,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
@@ -61,10 +62,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -17,14 +17,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
import { useProjectStore } from "/@/store/project";
|
import { useCrudPermission } from "/@/plugin/permission";
|
||||||
import AdminModeIntro from "./intro.vue";
|
import AdminModeIntro from "./intro.vue";
|
||||||
|
import { useProjectStore } from "/@/store/project";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -52,10 +54,7 @@ const handleBatchDelete = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -17,12 +17,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import { DeleteBatch } from "./api";
|
import { DeleteBatch } from "./api";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -31,15 +31,11 @@ defineOptions({
|
|||||||
});
|
});
|
||||||
const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });
|
const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });
|
||||||
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
|
|
||||||
const selectedRowKeys = context.selectedRowKeys;
|
const selectedRowKeys = context.selectedRowKeys;
|
||||||
const handleBatchDelete = () => {
|
const handleBatchDelete = () => {
|
||||||
if (selectedRowKeys.value?.length > 0) {
|
if (selectedRowKeys.value?.length > 0) {
|
||||||
Modal.confirm({
|
Modal.confirm({
|
||||||
title: t("certd.confirm"),
|
title: t("certd.pluginManagement"),
|
||||||
content: t("certd.batchDeleteConfirm", { count: selectedRowKeys.value.length }),
|
content: t("certd.batchDeleteConfirm", { count: selectedRowKeys.value.length }),
|
||||||
async onOk() {
|
async onOk() {
|
||||||
await DeleteBatch(selectedRowKeys.value);
|
await DeleteBatch(selectedRowKeys.value);
|
||||||
@@ -49,13 +45,13 @@ const handleBatchDelete = () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
message.error(t("certd.pleaseSelectRecord"));
|
message.error(t("certd.selectRecordFirst"));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<style lang="less"></style>
|
<style lang="less"></style>
|
||||||
|
|||||||
@@ -8,10 +8,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
import { useSettingStore } from "/@/store/settings";
|
import { useSettingStore } from "/@/store/settings";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "SettingsHeaderMenus",
|
name: "SettingsHeaderMenus",
|
||||||
@@ -20,10 +20,7 @@ const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions
|
|||||||
|
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
// crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onActivated, onMounted } from "vue";
|
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "SysProductActivationCode",
|
name: "SysProductActivationCode",
|
||||||
@@ -21,10 +21,8 @@ defineOptions({
|
|||||||
|
|
||||||
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions });
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions });
|
||||||
|
|
||||||
onMounted(() => {
|
// 页面打开后获取列表数据
|
||||||
// crudExpose.doRefresh();
|
useMounted(async () => {
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -3,9 +3,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { defineEmits, onActivated, onMounted, ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { useFs } from "@fast-crud/fast-crud";
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
import createCrudOptions from "./crud";
|
import createCrudOptions from "./crud";
|
||||||
|
import { useMounted } from "/@/use/use-mounted";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "ProductManager",
|
name: "ProductManager",
|
||||||
@@ -16,10 +17,7 @@ const context: any = { emit };
|
|||||||
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });
|
||||||
|
|
||||||
// 页面打开后获取列表数据
|
// 页面打开后获取列表数据
|
||||||
onMounted(() => {
|
useMounted(async () => {
|
||||||
crudExpose.doRefresh();
|
|
||||||
});
|
|
||||||
onActivated(async () => {
|
|
||||||
await crudExpose.doRefresh();
|
await crudExpose.doRefresh();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -3,6 +3,16 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.41.4](https://github.com/certd/certd/compare/v1.41.3...v1.41.4) (2026-06-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复设置里面不显示tab页签,导致某些页面需要点击查询按钮才有数据出来的bug ([c1b5a35](https://github.com/certd/certd/commit/c1b5a35f90a7d4b41397717b5c27905bc68e1bfb))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* **plugin:** 增加 Dynadot DNS and access 插件 ([a3a215b](https://github.com/certd/certd/commit/a3a215b7ae2b90efcde91270ce4165bbfe77dc64))
|
||||||
|
|
||||||
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
## [1.41.3](https://github.com/certd/certd/compare/v1.41.2...v1.41.3) (2026-06-11)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/ui-server
|
**Note:** Version bump only for package @certd/ui-server
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: dynadot
|
||||||
|
title: Dynadot授权
|
||||||
|
desc: ''
|
||||||
|
icon: simple-icons:dynatrace
|
||||||
|
input:
|
||||||
|
apiKey:
|
||||||
|
title: API Key
|
||||||
|
component:
|
||||||
|
placeholder: api key
|
||||||
|
helper: >-
|
||||||
|
前往 [Dynadot
|
||||||
|
API设置](https://www.dynadot.cn/zh/account/domain/setting/api.html) 获取API
|
||||||
|
Key
|
||||||
|
required: true
|
||||||
|
encrypt: true
|
||||||
|
apiSecret:
|
||||||
|
title: API Secret
|
||||||
|
component:
|
||||||
|
name: a-input-password
|
||||||
|
vModel: value
|
||||||
|
placeholder: api secret
|
||||||
|
helper: >-
|
||||||
|
前往 [Dynadot
|
||||||
|
API设置](https://www.dynadot.cn/zh/account/domain/setting/api.html) 获取API
|
||||||
|
Secret
|
||||||
|
required: true
|
||||||
|
encrypt: true
|
||||||
|
testRequest:
|
||||||
|
title: 测试
|
||||||
|
component:
|
||||||
|
name: api-test
|
||||||
|
action: TestRequest
|
||||||
|
helper: 点击测试接口是否正常
|
||||||
|
pluginType: access
|
||||||
|
type: builtIn
|
||||||
|
scriptFilePath: /plugins/plugin-dynadot/access.js
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
name: dynadot
|
||||||
|
title: Dynadot
|
||||||
|
desc: Dynadot DNS提供商
|
||||||
|
icon: simple-icons:dynatrace
|
||||||
|
accessType: dynadot
|
||||||
|
pluginType: dnsProvider
|
||||||
|
type: builtIn
|
||||||
|
scriptFilePath: /plugins/plugin-dynadot/dns-provider.js
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-server",
|
"name": "@certd/ui-server",
|
||||||
"version": "1.41.3",
|
"version": "1.41.4",
|
||||||
"description": "fast-server base midway",
|
"description": "fast-server base midway",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -54,20 +54,20 @@
|
|||||||
"@aws-sdk/client-sts": "^3.990.0",
|
"@aws-sdk/client-sts": "^3.990.0",
|
||||||
"@azure/arm-dns": "^5.1.0",
|
"@azure/arm-dns": "^5.1.0",
|
||||||
"@azure/identity": "^4.13.1",
|
"@azure/identity": "^4.13.1",
|
||||||
"@certd/acme-client": "^1.41.3",
|
"@certd/acme-client": "^1.41.4",
|
||||||
"@certd/basic": "^1.41.3",
|
"@certd/basic": "^1.41.4",
|
||||||
"@certd/commercial-core": "^1.41.3",
|
"@certd/commercial-core": "^1.41.4",
|
||||||
"@certd/cv4pve-api-javascript": "^8.4.2",
|
"@certd/cv4pve-api-javascript": "^8.4.2",
|
||||||
"@certd/jdcloud": "^1.41.3",
|
"@certd/jdcloud": "^1.41.4",
|
||||||
"@certd/lib-huawei": "^1.41.3",
|
"@certd/lib-huawei": "^1.41.4",
|
||||||
"@certd/lib-k8s": "^1.41.3",
|
"@certd/lib-k8s": "^1.41.4",
|
||||||
"@certd/lib-server": "^1.41.3",
|
"@certd/lib-server": "^1.41.4",
|
||||||
"@certd/midway-flyway-js": "^1.41.3",
|
"@certd/midway-flyway-js": "^1.41.4",
|
||||||
"@certd/pipeline": "^1.41.3",
|
"@certd/pipeline": "^1.41.4",
|
||||||
"@certd/plugin-cert": "^1.41.3",
|
"@certd/plugin-cert": "^1.41.4",
|
||||||
"@certd/plugin-lib": "^1.41.3",
|
"@certd/plugin-lib": "^1.41.4",
|
||||||
"@certd/plugin-plus": "^1.41.3",
|
"@certd/plugin-plus": "^1.41.4",
|
||||||
"@certd/plus-core": "^1.41.3",
|
"@certd/plus-core": "^1.41.4",
|
||||||
"@google-cloud/dns": "^5.3.1",
|
"@google-cloud/dns": "^5.3.1",
|
||||||
"@google-cloud/publicca": "^1.3.0",
|
"@google-cloud/publicca": "^1.3.0",
|
||||||
"@huaweicloud/huaweicloud-sdk-cdn": "3.1.185",
|
"@huaweicloud/huaweicloud-sdk-cdn": "3.1.185",
|
||||||
|
|||||||
@@ -134,7 +134,5 @@ export class MainConfiguration {
|
|||||||
});
|
});
|
||||||
|
|
||||||
logger.info("当前环境:", this.app.getEnv()); // prod
|
logger.info("当前环境:", this.app.getEnv()); // prod
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,17 +98,17 @@ export class LegacyAcmeAccountAccessFix {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const name = buildAcmeAccountAccessName(parsedKey.caType, parsedKey.email);
|
const name = buildAcmeAccountAccessName(parsedKey.caType, parsedKey.email);
|
||||||
const query = {
|
const query = {
|
||||||
userId: record.userId,
|
userId: record.userId,
|
||||||
type: "acmeAccount",
|
type: "acmeAccount",
|
||||||
subtype: parsedKey.caType,
|
subtype: parsedKey.caType,
|
||||||
name,
|
name,
|
||||||
} as any
|
} as any;
|
||||||
if (record.projectId) {
|
if (record.projectId) {
|
||||||
query.projectId = record.projectId;
|
query.projectId = record.projectId;
|
||||||
}
|
}
|
||||||
const exists = await this.accessService.findOne({
|
const exists = await this.accessService.findOne({
|
||||||
where:query,
|
where: query,
|
||||||
});
|
});
|
||||||
if (exists) {
|
if (exists) {
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
+1
-4
@@ -192,10 +192,7 @@ describe("CertApplyTemplateService", () => {
|
|||||||
|
|
||||||
await service.setDefault(2, 10, null);
|
await service.setDefault(2, 10, null);
|
||||||
|
|
||||||
assert.deepEqual((service as any).updateWhereList, [
|
assert.deepEqual((service as any).updateWhereList, [{ userId: 10 }, { userId: 10, id: 2 }]);
|
||||||
{ userId: 10 },
|
|
||||||
{ userId: 10, id: 2 },
|
|
||||||
]);
|
|
||||||
assert.equal(list[0].isDefault, false);
|
assert.equal(list[0].isDefault, false);
|
||||||
assert.equal(list[1].isDefault, true);
|
assert.equal(list[1].isDefault, true);
|
||||||
assert.equal(list[2].isDefault, false);
|
assert.equal(list[2].isDefault, false);
|
||||||
|
|||||||
@@ -897,13 +897,7 @@ export class PipelineService extends BaseService<PipelineEntity> {
|
|||||||
if (param.projectId != null) {
|
if (param.projectId != null) {
|
||||||
query.projectId = param.projectId;
|
query.projectId = param.projectId;
|
||||||
}
|
}
|
||||||
const statusCount = await this.repository
|
const statusCount = await this.repository.createQueryBuilder().select("status").addSelect("count(1)", "count").where(query).groupBy("status").getRawMany();
|
||||||
.createQueryBuilder()
|
|
||||||
.select("status")
|
|
||||||
.addSelect("count(1)", "count")
|
|
||||||
.where(query)
|
|
||||||
.groupBy("status")
|
|
||||||
.getRawMany();
|
|
||||||
return statusCount;
|
return statusCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -915,13 +909,7 @@ export class PipelineService extends BaseService<PipelineEntity> {
|
|||||||
if (param.projectId != null) {
|
if (param.projectId != null) {
|
||||||
query.projectId = param.projectId;
|
query.projectId = param.projectId;
|
||||||
}
|
}
|
||||||
const statusCount = await this.repository
|
const statusCount = await this.repository.createQueryBuilder().select("disabled").addSelect("count(1)", "count").where(query).groupBy("disabled").getRawMany();
|
||||||
.createQueryBuilder()
|
|
||||||
.select("disabled")
|
|
||||||
.addSelect("count(1)", "count")
|
|
||||||
.where(query)
|
|
||||||
.groupBy("disabled")
|
|
||||||
.getRawMany();
|
|
||||||
const result = {
|
const result = {
|
||||||
enabled: 0,
|
enabled: 0,
|
||||||
disabled: 0,
|
disabled: 0,
|
||||||
@@ -1115,14 +1103,12 @@ export class PipelineService extends BaseService<PipelineEntity> {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
for (const item of list) {
|
for (const item of list) {
|
||||||
const pipeline = JSON.parse(item.content);
|
const pipeline = JSON.parse(item.content);
|
||||||
if (trigger.props === false) {
|
if (trigger.props === false) {
|
||||||
//清除trigger
|
//清除trigger
|
||||||
pipeline.triggers = [];
|
pipeline.triggers = [];
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
const start = dayjs().format("YYYY-MM-DD") + " " + trigger.randomRange[0];
|
const start = dayjs().format("YYYY-MM-DD") + " " + trigger.randomRange[0];
|
||||||
let end = dayjs().format("YYYY-MM-DD") + " " + trigger.randomRange[1];
|
let end = dayjs().format("YYYY-MM-DD") + " " + trigger.randomRange[1];
|
||||||
if (trigger.randomRange[1] < trigger.randomRange[0]) {
|
if (trigger.randomRange[1] < trigger.randomRange[0]) {
|
||||||
@@ -1137,19 +1123,20 @@ export class PipelineService extends BaseService<PipelineEntity> {
|
|||||||
//随机时间
|
//随机时间
|
||||||
const randomTime = Math.floor(Math.random() * (endTime - startTime)) + startTime;
|
const randomTime = Math.floor(Math.random() * (endTime - startTime)) + startTime;
|
||||||
const time = dayjs(randomTime).format(" ss:mm:HH").replaceAll(":", " ").replaceAll(" 0", " ").trim();
|
const time = dayjs(randomTime).format(" ss:mm:HH").replaceAll(":", " ").replaceAll(" 0", " ").trim();
|
||||||
set(triggerConf, "props.cron", `${time} * * *`)
|
set(triggerConf, "props.cron", `${time} * * *`);
|
||||||
}
|
}
|
||||||
delete triggerConf.random
|
delete triggerConf.random;
|
||||||
delete triggerConf.randomRange;
|
delete triggerConf.randomRange;
|
||||||
pipeline.triggers = [{
|
pipeline.triggers = [
|
||||||
id: nanoid(),
|
{
|
||||||
title: "定时触发",
|
id: nanoid(),
|
||||||
...triggerConf
|
title: "定时触发",
|
||||||
}];
|
...triggerConf,
|
||||||
|
},
|
||||||
|
];
|
||||||
}
|
}
|
||||||
await this.doUpdatePipelineJson(item, pipeline);
|
await this.doUpdatePipelineJson(item, pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async batchUpdateNotifications(ids: number[], notification: Notification, userId: any, projectId?: number) {
|
async batchUpdateNotifications(ids: number[], notification: Notification, userId: any, projectId?: number) {
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import assert from "assert";
|
||||||
|
import esmock from "esmock";
|
||||||
|
|
||||||
|
describe("NetTestService.telnet", () => {
|
||||||
|
it("treats nc succeeded output as a successful port connection", async () => {
|
||||||
|
const { NetTestService } = await esmock("./nettest-service.js", {
|
||||||
|
"@certd/basic": {
|
||||||
|
http: {},
|
||||||
|
logger: {
|
||||||
|
error() {},
|
||||||
|
},
|
||||||
|
utils: {
|
||||||
|
sp: {
|
||||||
|
async spawn() {
|
||||||
|
return "Connection to baidu.com (110.242.74.102) 443 port [tcp/*] succeeded!";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const service = new NetTestService();
|
||||||
|
(service as any).isWindows = () => false;
|
||||||
|
|
||||||
|
const result = await service.telnet("baidu.com", 443);
|
||||||
|
|
||||||
|
assert.equal(result.success, true);
|
||||||
|
assert.equal(result.message, "端口连接测试成功");
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -40,7 +40,11 @@ export class NetTestService {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 判断测试是否成功
|
// 判断测试是否成功
|
||||||
const success = this.isWindows() ? output.includes("端口连接成功") : output.includes(" open");
|
const normalizedOutput = output.toLowerCase();
|
||||||
|
const success = this.isWindows()
|
||||||
|
? normalizedOutput.includes("端口连接成功")
|
||||||
|
: normalizedOutput.includes("succeeded!") || normalizedOutput.includes("connected to") || normalizedOutput.includes(" open");
|
||||||
|
|
||||||
|
|
||||||
// 处理结果
|
// 处理结果
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -48,3 +48,4 @@
|
|||||||
// export * from './plugin-dnsmgr/index.js'
|
// export * from './plugin-dnsmgr/index.js'
|
||||||
// export * from './plugin-nginx-proxy-manager/index.js'
|
// export * from './plugin-nginx-proxy-manager/index.js'
|
||||||
// export * from './plugin-hipmdnsmgr/index.js'
|
// export * from './plugin-hipmdnsmgr/index.js'
|
||||||
|
// export * from './plugin-dynadot/index.js'
|
||||||
|
|||||||
@@ -78,8 +78,8 @@ export class DeployCertToAliyunApig extends AbstractTaskPlugin {
|
|||||||
action: DeployCertToAliyunApig.prototype.onGetDomainList.name,
|
action: DeployCertToAliyunApig.prototype.onGetDomainList.name,
|
||||||
watches: ["region", "accessId", "gatewayType"],
|
watches: ["region", "accessId", "gatewayType"],
|
||||||
required: true,
|
required: true,
|
||||||
pager:true,
|
pager: true,
|
||||||
search:true,
|
search: true,
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
domainList!: string[];
|
domainList!: string[];
|
||||||
@@ -196,7 +196,7 @@ export class DeployCertToAliyunApig extends AbstractTaskPlugin {
|
|||||||
throw new Error("请选择网关类型");
|
throw new Error("请选择网关类型");
|
||||||
}
|
}
|
||||||
|
|
||||||
const pager = new Pager(data);
|
const pager = new Pager(data);
|
||||||
const access = await this.getAccess<AliyunAccess>(this.accessId);
|
const access = await this.getAccess<AliyunAccess>(this.accessId);
|
||||||
|
|
||||||
const client = access.getClient(this.regionEndpoint);
|
const client = access.getClient(this.regionEndpoint);
|
||||||
@@ -227,7 +227,11 @@ export class DeployCertToAliyunApig extends AbstractTaskPlugin {
|
|||||||
domain: item.name,
|
domain: item.name,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
return optionsUtils.buildGroupOptions(options, this.certDomains);
|
const records = optionsUtils.buildGroupOptions(options, this.certDomains);
|
||||||
|
return {
|
||||||
|
list: records,
|
||||||
|
total: res?.data?.totalSize || 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async onGetRegionList(data: any) {
|
async onGetRegionList(data: any) {
|
||||||
|
|||||||
+20
-5
@@ -1,4 +1,4 @@
|
|||||||
import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline";
|
import { AbstractTaskPlugin, IsTaskPlugin, Pager, PageSearch, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline";
|
||||||
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib";
|
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib";
|
||||||
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
||||||
import { optionsUtils } from "@certd/basic";
|
import { optionsUtils } from "@certd/basic";
|
||||||
@@ -69,7 +69,9 @@ export class DeployCertToAliyunApiGateway extends AbstractTaskPlugin {
|
|||||||
action: DeployCertToAliyunApiGateway.prototype.onGetGroupList.name,
|
action: DeployCertToAliyunApiGateway.prototype.onGetGroupList.name,
|
||||||
watches: ["regionEndpoint", "accessId"],
|
watches: ["regionEndpoint", "accessId"],
|
||||||
required: true,
|
required: true,
|
||||||
single:true
|
single: true,
|
||||||
|
pager: true,
|
||||||
|
search: true,
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
groupId!: string;
|
groupId!: string;
|
||||||
@@ -122,7 +124,7 @@ export class DeployCertToAliyunApiGateway extends AbstractTaskPlugin {
|
|||||||
this.logger.info(`设置${domainName}证书成功:`, ret.RequestId);
|
this.logger.info(`设置${domainName}证书成功:`, ret.RequestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onGetGroupList(data: any) {
|
async onGetGroupList(data: PageSearch) {
|
||||||
if (!this.accessId) {
|
if (!this.accessId) {
|
||||||
throw new Error("请选择Access授权");
|
throw new Error("请选择Access授权");
|
||||||
}
|
}
|
||||||
@@ -131,23 +133,36 @@ export class DeployCertToAliyunApiGateway extends AbstractTaskPlugin {
|
|||||||
}
|
}
|
||||||
const access = await this.getAccess<AliyunAccess>(this.accessId);
|
const access = await this.getAccess<AliyunAccess>(this.accessId);
|
||||||
const client = access.getClient(this.regionEndpoint);
|
const client = access.getClient(this.regionEndpoint);
|
||||||
|
|
||||||
|
const pager = new Pager(data)
|
||||||
const res = await client.doRequest({
|
const res = await client.doRequest({
|
||||||
// 接口名称
|
// 接口名称
|
||||||
action: "DescribeApiGroups",
|
action: "DescribeApiGroups",
|
||||||
// 接口版本
|
// 接口版本
|
||||||
version: "2016-07-14",
|
version: "2016-07-14",
|
||||||
data: {},
|
data: {
|
||||||
|
query: {
|
||||||
|
GroupName: data.searchKey,
|
||||||
|
PageNumber: pager.pageNo,
|
||||||
|
PageSize: pager.pageSize,
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
const list = res?.ApiGroupAttributes?.ApiGroupAttribute;
|
const list = res?.ApiGroupAttributes?.ApiGroupAttribute;
|
||||||
if (!list || list.length === 0) {
|
if (!list || list.length === 0) {
|
||||||
throw new Error("没有数据,您可以手动输入API网关ID");
|
throw new Error("没有数据,您可以手动输入API网关ID");
|
||||||
}
|
}
|
||||||
return list.map((item: any) => {
|
const records = list.map((item: any) => {
|
||||||
return {
|
return {
|
||||||
value: item.GroupId,
|
value: item.GroupId,
|
||||||
label: `${item.GroupName}<${item.GroupId}>`,
|
label: `${item.GroupName}<${item.GroupId}>`,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
list: records,
|
||||||
|
total: res?.TotalCount || 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async onGetDomainList(data: any) {
|
async onGetDomainList(data: any) {
|
||||||
|
|||||||
@@ -33,10 +33,7 @@ export class AwsClient {
|
|||||||
// Split the full PEM chain: first block is the leaf cert, the rest is the intermediate chain
|
// Split the full PEM chain: first block is the leaf cert, the rest is the intermediate chain
|
||||||
const pemBlocks = certInfo.crt.split(/(?<=-----END CERTIFICATE-----)/);
|
const pemBlocks = certInfo.crt.split(/(?<=-----END CERTIFICATE-----)/);
|
||||||
const cert = pemBlocks[0].trim();
|
const cert = pemBlocks[0].trim();
|
||||||
const chain = pemBlocks
|
const chain = pemBlocks.slice(1).join("").trim();
|
||||||
.slice(1)
|
|
||||||
.join("")
|
|
||||||
.trim();
|
|
||||||
|
|
||||||
// 构建上传参数
|
// 构建上传参数
|
||||||
const data = await acmClient.send(
|
const data = await acmClient.send(
|
||||||
|
|||||||
@@ -138,18 +138,18 @@ export class AcmeAccountAccess extends BaseAccess {
|
|||||||
eabHmacKey = "";
|
eabHmacKey = "";
|
||||||
|
|
||||||
@AccessInput({
|
@AccessInput({
|
||||||
title: "ACME账号信息",
|
title: "生成ACME账号",
|
||||||
component: {
|
component: {
|
||||||
name: "refresh-input",
|
name: "refresh-input",
|
||||||
action: "GenerateAccount",
|
action: "GenerateAccount",
|
||||||
buttonText: "生成ACME账号",
|
buttonText: "生成ACME账号",
|
||||||
successMessage: "ACME账号已生成,请保存授权配置",
|
successMessage: "ACME账号已生成,请保存授权配置",
|
||||||
type:"textarea",
|
type: "textarea",
|
||||||
rows:4,
|
rows: 4,
|
||||||
},
|
},
|
||||||
col:{span:24},
|
col: { span: 24 },
|
||||||
required: true,
|
required: true,
|
||||||
helper: "请生成ACME账号,账号一旦生成不允许修改",
|
helper: "请点击右边按钮生成ACME账号,账号一旦生成不允许修改",
|
||||||
encrypt: true,
|
encrypt: true,
|
||||||
mergeScript: `
|
mergeScript: `
|
||||||
return {
|
return {
|
||||||
@@ -170,7 +170,6 @@ export class AcmeAccountAccess extends BaseAccess {
|
|||||||
required: false,
|
required: false,
|
||||||
helper: "是否开启修改ACME账号,注意,开启后,会影响DNS持久验证记录",
|
helper: "是否开启修改ACME账号,注意,开启后,会影响DNS持久验证记录",
|
||||||
encrypt: false,
|
encrypt: false,
|
||||||
|
|
||||||
})
|
})
|
||||||
editAccount = false;
|
editAccount = false;
|
||||||
|
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
|
|||||||
type: "acmeAccount",
|
type: "acmeAccount",
|
||||||
},
|
},
|
||||||
required: false,
|
required: false,
|
||||||
helper: "请选择颁发机构对应的ACME账号",
|
helper: "直接本地生成,无需外部注册\n点击选择按钮->添加->填写邮箱->生成账号即可",
|
||||||
mergeScript: `
|
mergeScript: `
|
||||||
return {
|
return {
|
||||||
show: ctx.compute(({form})=>{
|
show: ctx.compute(({form})=>{
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
import { AccessInput, BaseAccess, IsAccess, PageRes, PageSearch, Pager } from "@certd/pipeline";
|
||||||
|
import { DomainRecord } from "@certd/plugin-lib";
|
||||||
|
import { createHmac } from "crypto";
|
||||||
|
|
||||||
|
export type RequestOptions = {
|
||||||
|
method: "GET" | "POST" | "PUT" | "DELETE";
|
||||||
|
path: string;
|
||||||
|
params?: Record<string, any>;
|
||||||
|
data?: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
@IsAccess({
|
||||||
|
name: "dynadot",
|
||||||
|
title: "Dynadot授权",
|
||||||
|
desc: "",
|
||||||
|
icon: "simple-icons:dynatrace",
|
||||||
|
})
|
||||||
|
export class DynadotAccess extends BaseAccess {
|
||||||
|
@AccessInput({
|
||||||
|
title: "API Key",
|
||||||
|
component: {
|
||||||
|
placeholder: "api key",
|
||||||
|
},
|
||||||
|
helper: "前往 [Dynadot API设置](https://www.dynadot.cn/zh/account/domain/setting/api.html) 获取API Key",
|
||||||
|
required: true,
|
||||||
|
encrypt: true,
|
||||||
|
})
|
||||||
|
apiKey = "";
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "API Secret",
|
||||||
|
component: {
|
||||||
|
name: "a-input-password",
|
||||||
|
vModel: "value",
|
||||||
|
placeholder: "api secret",
|
||||||
|
},
|
||||||
|
helper: "前往 [Dynadot API设置](https://www.dynadot.cn/zh/account/domain/setting/api.html) 获取API Secret",
|
||||||
|
required: true,
|
||||||
|
encrypt: true,
|
||||||
|
})
|
||||||
|
apiSecret = "";
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "测试",
|
||||||
|
component: {
|
||||||
|
name: "api-test",
|
||||||
|
action: "TestRequest",
|
||||||
|
},
|
||||||
|
helper: "点击测试接口是否正常",
|
||||||
|
})
|
||||||
|
testRequest = true;
|
||||||
|
|
||||||
|
async onTestRequest() {
|
||||||
|
await this.getDomainListPage({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 1,
|
||||||
|
});
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
async getDomainListPage(req: PageSearch): Promise<PageRes<DomainRecord>> {
|
||||||
|
const pager = new Pager(req);
|
||||||
|
const params: Record<string, any> = {
|
||||||
|
page: pager.pageNo,
|
||||||
|
page_size: pager.pageSize,
|
||||||
|
};
|
||||||
|
if (req.searchKey) {
|
||||||
|
params.search = req.searchKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await this.doRequest({
|
||||||
|
method: "GET",
|
||||||
|
path: "/restful/v2/domains",
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
|
||||||
|
const domainList = res.data?.domain_info_list || [];
|
||||||
|
const list = domainList.map((item: any) => ({
|
||||||
|
id: item.domain_name,
|
||||||
|
domain: item.domain_name,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return {
|
||||||
|
total: list.length,
|
||||||
|
list,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async doRequest(opts: RequestOptions): Promise<any> {
|
||||||
|
const { method, path, params, data } = opts;
|
||||||
|
|
||||||
|
const queryString = params ? "?" + new URLSearchParams(params).toString() : "";
|
||||||
|
const fullPath = path + queryString;
|
||||||
|
const body = data ? JSON.stringify(data) : "";
|
||||||
|
|
||||||
|
const headers: Record<string, string> = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: `Bearer ${this.apiKey}`,
|
||||||
|
"X-Signature": this.generateSignature(fullPath, body),
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await this.ctx.http.request<any, any>({
|
||||||
|
url: fullPath,
|
||||||
|
baseURL: "https://api.dynadot.com",
|
||||||
|
method,
|
||||||
|
data: body || undefined,
|
||||||
|
headers,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.checkApiError(res);
|
||||||
|
return res;
|
||||||
|
} catch (e: any) {
|
||||||
|
if (e.response?.data) {
|
||||||
|
const errData = e.response.data;
|
||||||
|
this.ctx.logger.error("Dynadot API返回错误:", JSON.stringify(errData));
|
||||||
|
throw new Error(`Dynadot API错误: ${errData.message || JSON.stringify(errData)}`);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private generateSignature(fullPathAndQuery: string, body: string): string {
|
||||||
|
const stringToSign = this.apiKey + "\n" + fullPathAndQuery + "\n\n" + body;
|
||||||
|
const hmac = createHmac("sha256", this.apiSecret);
|
||||||
|
hmac.update(stringToSign, "utf8");
|
||||||
|
return hmac.digest("base64");
|
||||||
|
}
|
||||||
|
|
||||||
|
private checkApiError(res: any) {
|
||||||
|
if (!res || typeof res !== "object") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const code = res.code;
|
||||||
|
if (code !== undefined && code !== null && code !== 200) {
|
||||||
|
const errorMsg = res.message || JSON.stringify(res);
|
||||||
|
throw new Error(`Dynadot API错误: ${errorMsg}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new DynadotAccess();
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
import { PageRes, PageSearch } from "@certd/pipeline";
|
||||||
|
import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert";
|
||||||
|
import { DynadotAccess } from "./access.js";
|
||||||
|
|
||||||
|
export type DynadotRecord = {
|
||||||
|
sub_host: string;
|
||||||
|
record_type: string;
|
||||||
|
record_value1: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type SubRecordItem = DynadotRecord & { record_value2: string };
|
||||||
|
type MainRecordItem = { record_type: string; record_value1: string; record_value2: string };
|
||||||
|
|
||||||
|
@IsDnsProvider({
|
||||||
|
name: "dynadot",
|
||||||
|
title: "Dynadot",
|
||||||
|
desc: "Dynadot DNS提供商",
|
||||||
|
icon: "simple-icons:dynatrace",
|
||||||
|
accessType: "dynadot",
|
||||||
|
})
|
||||||
|
export class DynadotDnsProvider extends AbstractDnsProvider<DynadotRecord> {
|
||||||
|
access!: DynadotAccess;
|
||||||
|
|
||||||
|
async onInstance() {
|
||||||
|
this.access = this.ctx.access as DynadotAccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
async createRecord(options: CreateRecordOptions): Promise<DynadotRecord> {
|
||||||
|
const { fullRecord, hostRecord, value, type, domain } = options;
|
||||||
|
this.logger.info("添加域名解析:", fullRecord, value, type, domain);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const subRecords = [
|
||||||
|
{
|
||||||
|
sub_host: hostRecord,
|
||||||
|
record_type: type.toLowerCase(),
|
||||||
|
record_value1: value,
|
||||||
|
record_value2: "",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
await this.postRecords(domain, {subRecords, mainRecords: [], addToCurrent: true});
|
||||||
|
|
||||||
|
this.logger.info("添加域名解析成功:", fullRecord, value);
|
||||||
|
return {
|
||||||
|
sub_host: hostRecord,
|
||||||
|
record_type: type.toLowerCase(),
|
||||||
|
record_value1: value,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("创建DNS记录失败:", error);
|
||||||
|
throw new Error(`创建DNS记录失败: ${(error as Error).message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeRecord(options: RemoveRecordOptions<DynadotRecord>): Promise<void> {
|
||||||
|
const { fullRecord, value, domain } = options.recordReq;
|
||||||
|
const record = options.recordRes;
|
||||||
|
this.logger.info("删除域名解析:", fullRecord, value);
|
||||||
|
|
||||||
|
if (!record || !record.sub_host) {
|
||||||
|
this.logger.info("record为空,不执行删除");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const existingRecords = await this.getDnsRecords(domain);
|
||||||
|
|
||||||
|
const beforeCount = existingRecords.subRecords.length;
|
||||||
|
existingRecords.subRecords = existingRecords.subRecords.filter(item => !(item.sub_host === record.sub_host && item.record_type === record.record_type && item.record_value1 === record.record_value1));
|
||||||
|
|
||||||
|
if (beforeCount === existingRecords.subRecords.length) {
|
||||||
|
this.logger.info("未找到要删除的DNS记录,可能已被移除或不存在:", fullRecord);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existingRecords.mainRecords.length == 0) {
|
||||||
|
existingRecords.mainRecords = [
|
||||||
|
{
|
||||||
|
record_type: "txt",
|
||||||
|
record_value1: "init_txt_by_certd",
|
||||||
|
record_value2: "",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.postRecords(domain, {
|
||||||
|
...existingRecords,
|
||||||
|
addToCurrent: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.logger.info("删除域名解析成功:", fullRecord, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getDomainListPage(req: PageSearch): Promise<PageRes<DomainRecord>> {
|
||||||
|
return await this.access.getDomainListPage(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getDnsRecords(domain: string): Promise<{
|
||||||
|
mainRecords: MainRecordItem[];
|
||||||
|
subRecords: SubRecordItem[];
|
||||||
|
}> {
|
||||||
|
let res: any;
|
||||||
|
try {
|
||||||
|
res = await this.access.doRequest({
|
||||||
|
method: "GET",
|
||||||
|
path: `/restful/v2/domains/${domain}/records`,
|
||||||
|
});
|
||||||
|
} catch (e: any) {
|
||||||
|
this.logger.info("获取DNS记录失败,域名可能尚未配置DNS记录,将视为空记录:");
|
||||||
|
return { mainRecords: [], subRecords: [] };
|
||||||
|
}
|
||||||
|
|
||||||
|
const glueInfo = res.data?.glue_info || {};
|
||||||
|
|
||||||
|
const subRecords: SubRecordItem[] = (glueInfo.dns_sub_list || [])
|
||||||
|
.filter((item: any) => item.sub_host && item.record_value1)
|
||||||
|
.map((item: any) => ({
|
||||||
|
sub_host: item.sub_host || "",
|
||||||
|
record_type: item.record_type || "",
|
||||||
|
record_value1: item.record_value1 || "",
|
||||||
|
record_value2: item.record_value2 || "",
|
||||||
|
}));
|
||||||
|
|
||||||
|
const mainRecords: MainRecordItem[] = (glueInfo.dns_main_list || [])
|
||||||
|
.filter((item: any) => item.record_value1)
|
||||||
|
.map((item: any) => ({
|
||||||
|
record_type: item.record_type || "",
|
||||||
|
record_value1: String(item.record_value1),
|
||||||
|
record_value2: String(item.record_value2 || ""),
|
||||||
|
}));
|
||||||
|
|
||||||
|
return { mainRecords, subRecords };
|
||||||
|
}
|
||||||
|
|
||||||
|
private async postRecords(domain: string, records: { mainRecords: MainRecordItem[]; subRecords: SubRecordItem[] ,addToCurrent: boolean}): Promise<void> {
|
||||||
|
await this.access.doRequest({
|
||||||
|
method: "POST",
|
||||||
|
path: `/restful/v2/domains/${domain}/records`,
|
||||||
|
data: {
|
||||||
|
dns_main_list: records.mainRecords,
|
||||||
|
dns_sub_list: records.subRecords,
|
||||||
|
ttl: 300,
|
||||||
|
add_dns_to_current_setting: records.addToCurrent || false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new DynadotDnsProvider();
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from "./dns-provider.js";
|
||||||
|
export * from "./access.js";
|
||||||
@@ -57,8 +57,8 @@ export class HipmDnsmgrAccess extends BaseAccess {
|
|||||||
// 方案1: 使用 keyword 参数直接查询
|
// 方案1: 使用 keyword 参数直接查询
|
||||||
try {
|
try {
|
||||||
const resp = await this.doRequest({
|
const resp = await this.doRequest({
|
||||||
method: 'GET',
|
method: "GET",
|
||||||
path: '/domains',
|
path: "/domains",
|
||||||
params: {
|
params: {
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 1,
|
pageSize: 1,
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ export class HipmDnsmgrDnsProvider extends AbstractDnsProvider<{ domainId: strin
|
|||||||
|
|
||||||
// 1. 获取域名 ID(双层查询策略)
|
// 1. 获取域名 ID(双层查询策略)
|
||||||
const domainId = await this.access.getDomainId(domain);
|
const domainId = await this.access.getDomainId(domain);
|
||||||
this.logger.debug('[HiPM DNSMgr] 找到域名:', domain, 'ID:', domainId);
|
this.logger.debug("[HiPM DNSMgr] 找到域名:", domain, "ID:", domainId);
|
||||||
|
|
||||||
// 2. 创建 DNS 记录
|
// 2. 创建 DNS 记录
|
||||||
const name = hostRecord; // 使用子域名,如 _acme-challenge
|
const name = hostRecord; // 使用子域名,如 _acme-challenge
|
||||||
|
|||||||
+1
-2
@@ -21,7 +21,7 @@ const regionOptions = [
|
|||||||
icon: "svg:icon-volcengine",
|
icon: "svg:icon-volcengine",
|
||||||
group: pluginGroups.volcengine.key,
|
group: pluginGroups.volcengine.key,
|
||||||
desc: "替换火山引擎VKE集群中的TLS Secret证书",
|
desc: "替换火山引擎VKE集群中的TLS Secret证书",
|
||||||
needPlus:true,
|
needPlus: true,
|
||||||
default: {
|
default: {
|
||||||
strategy: {
|
strategy: {
|
||||||
runStrategy: RunStrategy.SkipWhenSucceed,
|
runStrategy: RunStrategy.SkipWhenSucceed,
|
||||||
@@ -495,7 +495,6 @@ export class VolcengineDeployToVKE extends AbstractPlusTaskPlugin {
|
|||||||
await this.deleteKubeconfig(vkeService, kubeconfigId);
|
await this.deleteKubeconfig(vkeService, kubeconfigId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new VolcengineDeployToVKE();
|
new VolcengineDeployToVKE();
|
||||||
@@ -1 +1 @@
|
|||||||
23:38
|
21:30
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
00:25
|
00:17
|
||||||
|
|||||||
Reference in New Issue
Block a user