Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c98f43b984 | ||
|
|
e93f128a7a | ||
|
|
71d8e7edd2 | ||
|
|
48f4298a8d | ||
|
|
1c15beadc7 | ||
|
|
2c1600ddfb | ||
|
|
298f7d9d52 | ||
|
|
105f0bfde2 | ||
|
|
cf3a78e114 | ||
|
|
9cc5f0f889 | ||
|
|
e30db9ee77 | ||
|
|
235be757f8 | ||
|
|
e31d26a887 | ||
|
|
2293ba02ea | ||
|
|
7188997dd1 | ||
|
|
31cfb09468 | ||
|
|
b76f2e2008 | ||
|
|
4b90972341 | ||
|
|
f4ff34224c | ||
|
|
877c9c4ff9 | ||
|
|
ac0b7291dd | ||
|
|
491ef6085a | ||
|
|
3cedef4974 | ||
|
|
22ab04bd2b | ||
|
|
e5a080aebe | ||
|
|
c560cc5add | ||
|
|
0d27bc323b | ||
|
|
c71d3cef18 | ||
|
|
4e2d8daa3a | ||
|
|
d0f51da0af | ||
|
|
aeb73bca27 | ||
|
|
f239b03291 | ||
|
|
297c2965f4 | ||
|
|
daddf4d98e | ||
|
|
e05f9bfebf | ||
|
|
768bdc2cc2 | ||
|
|
a0a093e260 | ||
|
|
0b2a7fdc15 | ||
|
|
f1876e20f8 | ||
|
|
7d6a6e53f7 | ||
|
|
6b765a1f77 | ||
|
|
3b3c93dd53 |
25
CHANGELOG.md
@@ -3,6 +3,31 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复旧版本升级上来报错eab授权的bug ([b76f2e2](https://github.com/certd/certd/commit/b76f2e2008a7fefac4c91179c45c56c7a7a84b71))
|
||||||
|
* 选择授权对话框编辑时,名称字段排在最后的bug ([31cfb09](https://github.com/certd/certd/commit/31cfb09468bda3272f5f63af65ff3e9272220b39))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 7001绑定::地址 ([7188997](https://github.com/certd/certd/commit/7188997dd1979f1c10fa29b30221015e0bd5fe9e))
|
||||||
|
* 登录失败时清除验证码状态 ([1c15bea](https://github.com/certd/certd/commit/1c15beadc7fe8a7c6ec1903b7e722ca2f52e05b3))
|
||||||
|
* 公共cname支持权限校验 ([9cc5f0f](https://github.com/certd/certd/commit/9cc5f0f889d4362ff36e7a1f0e448e02d32ecee7))
|
||||||
|
* 优化连接失败的报错提示 ([71d8e7e](https://github.com/certd/certd/commit/71d8e7edd23ad63fdc01a92766b52ede5074fe7c))
|
||||||
|
* 增加自签名证书提示 ([877c9c4](https://github.com/certd/certd/commit/877c9c4ff99f81d289f67afd96f440c0796b03ea))
|
||||||
|
* add preferred chain for google trust service ([#539](https://github.com/certd/certd/issues/539)) @ZeroClover ([e31d26a](https://github.com/certd/certd/commit/e31d26a8871c6088d9f8c0f580746ff2a810ae0c))
|
||||||
|
* dns支持新网域名解析 ([cf3a78e](https://github.com/certd/certd/commit/cf3a78e1145ff0505c87fbc485d9e731b1aa88a8))
|
||||||
|
* gcore flush plugin ssl_id改为必填项 ([4b90972](https://github.com/certd/certd/commit/4b909723411c57505aa13b07d8699fb9ac77c937))
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复导入插件对话框无法打开的bug,修复插件编辑页面打开多个代码编辑器消失的bug ([e5a080a](https://github.com/certd/certd/commit/e5a080aebe0d2f3e3c0f86bf863f75069c1bf7ab))
|
||||||
|
* 修复ssl.com报EMAILADDRESS数量不对的bug ([c560cc5](https://github.com/certd/certd/commit/c560cc5adda6e15bf3a8865d874042550a6c2688))
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
00:34
|
21:09
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ export default defineConfig({
|
|||||||
{text: "邮箱配置", link: "/guide/use/email/index.md"},
|
{text: "邮箱配置", link: "/guide/use/email/index.md"},
|
||||||
{text: "IPv6支持", link: "/guide/use/setting/ipv6.md"},
|
{text: "IPv6支持", link: "/guide/use/setting/ipv6.md"},
|
||||||
{text: "ESXi", link: "/guide/use/ESXi/index.md"},
|
{text: "ESXi", link: "/guide/use/ESXi/index.md"},
|
||||||
|
{text: "宝塔动态IP白名单", link: "/guide/use/baota/white_list.md"},
|
||||||
{text: "子域名托管", link: "/guide/use/cert/subdomain.md"},
|
{text: "子域名托管", link: "/guide/use/cert/subdomain.md"},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,6 +3,33 @@
|
|||||||
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.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复导入插件对话框无法打开的bug,修复插件编辑页面打开多个代码编辑器消失的bug ([e5a080a](https://github.com/certd/certd/commit/e5a080aebe0d2f3e3c0f86bf863f75069c1bf7ab))
|
||||||
|
* 修复ssl.com报EMAILADDRESS数量不对的bug ([c560cc5](https://github.com/certd/certd/commit/c560cc5adda6e15bf3a8865d874042550a6c2688))
|
||||||
|
|
||||||
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复商业版退出登录后,丢失站点个性化设置的bug ([d75dd05](https://github.com/certd/certd/commit/d75dd058d65c85f80c49e1fa7a910e6c6f08e824))
|
||||||
|
* 修复授权类型和名称字段排到最后的bug ([43b7977](https://github.com/certd/certd/commit/43b79778ea9034065f6a15af3296274315597c6b))
|
||||||
|
* 修复证书监控某些情况下报 options.lookup不能为null的bug ([d2ecfe5](https://github.com/certd/certd/commit/d2ecfe5491b2639eb30b5cae293af6062d58bb9f))
|
||||||
|
* 修复证书手动托管时新上传的证书无效的bug ([506385e](https://github.com/certd/certd/commit/506385e5a2600887fe30854e0713583caaa2e689))
|
||||||
|
* 修复secret patch 类型多了type:的bug ([d04f383](https://github.com/certd/certd/commit/d04f3831611011a90ec0594724b9694490d5edd0))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 登录支持极验验证码 ([370db62](https://github.com/certd/certd/commit/370db62bf0aece241859244927beabba32d6a257))
|
||||||
|
* 登录注册、找回密码都支持极验验证码和图片验证码 ([7bdde68](https://github.com/certd/certd/commit/7bdde68ecea29fe2c570fd3cb082139db6c93d93))
|
||||||
|
* 优化加量包展示效果 ([3c65f37](https://github.com/certd/certd/commit/3c65f37d84177ba107d4a6462648af12d2fc4b7a))
|
||||||
|
* 证书到期剩余天数进度条根据实际证书有效期计算 ([#528](https://github.com/certd/certd/issues/528)) nicheng-he ([2d4586b](https://github.com/certd/certd/commit/2d4586b1c42c39f97d2a95b9453cca4bc8bfbe61))
|
||||||
|
* add preferred chain option ([#519](https://github.com/certd/certd/issues/519)) @ZeroClover ([902359f](https://github.com/certd/certd/commit/902359f24ed12eee4f9b65178f1d6a60378351d2))
|
||||||
|
* ssh配置增加脚本类型设置,bash还是sh ([ae41c60](https://github.com/certd/certd/commit/ae41c6038b27c9476e64a2402a8daf247c38a5b6))
|
||||||
|
* start.sh增加sudo ([b7271d7](https://github.com/certd/certd/commit/b7271d7a464773a1bf87d7d1f24d933ba0f86915))
|
||||||
|
|
||||||
## [1.36.19](https://github.com/certd/certd/compare/v1.36.18...v1.36.19) (2025-09-05)
|
## [1.36.19](https://github.com/certd/certd/compare/v1.36.18...v1.36.19) (2025-09-05)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -21,13 +21,13 @@
|
|||||||
|
|
||||||
#### 2.2 容器编排方式部署
|
#### 2.2 容器编排方式部署
|
||||||
|
|
||||||
1. 打开`docker-compose.yaml`,整个内容复制下来
|
1. 打开`docker-compose.yaml`,整个内容复制下来
|
||||||
https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml
|
https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml
|
||||||
|
|
||||||
|
|
||||||
然后到宝塔里面进到docker->容器编排->添加容器编排
|
然后到宝塔里面进到docker->容器编排->添加容器编排
|
||||||

|

|
||||||
点击确定,等待启动完成
|
点击确定,等待启动完成
|
||||||

|

|
||||||
|
|
||||||
> certd默认使用sqlite数据库,另外支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database)
|
> certd默认使用sqlite数据库,另外支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database)
|
||||||
@@ -35,16 +35,16 @@
|
|||||||
|
|
||||||
## 二、访问应用
|
## 二、访问应用
|
||||||
|
|
||||||
http://ip:7001
|
http://ip:7001
|
||||||
https://ip:7002
|
https://ip:7002
|
||||||
默认账号密码
|
默认账号密码
|
||||||
admin/123456
|
admin/123456
|
||||||
登录后请及时修改密码
|
登录后请及时修改密码
|
||||||
|
|
||||||
## 三、如何升级
|
## 三、如何升级
|
||||||
宝塔升级certd非常简单
|
宝塔升级certd非常简单
|
||||||
|
|
||||||
打开容器页面: `docker`->`容器编排`->`左侧选择Certd`->`更新镜像`
|
打开容器页面: `docker`->`容器编排`->`左侧选择Certd`->`更新镜像`
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -80,5 +80,8 @@ admin/123456
|
|||||||
### 1. 无法访问Certd
|
### 1. 无法访问Certd
|
||||||
1. 确认服务器的安全规则,是否放开了对应端口
|
1. 确认服务器的安全规则,是否放开了对应端口
|
||||||
2. 确认宝塔防火墙是否放开对应端口
|
2. 确认宝塔防火墙是否放开对应端口
|
||||||
3. 尝试将Certd容器加入宝塔的`bridge`网络
|
3. 尝试将Certd容器加入宝塔的`bridge`网络
|
||||||

|

|
||||||
|
|
||||||
|
### 2. 动态IP无法加白名单问题
|
||||||
|
[Nginx代理解决方案](../../use/baota/white_list.md)
|
||||||
@@ -17,4 +17,17 @@
|
|||||||
解决方案:可以加多一个子域名,重新执行就可以规避次错误
|
解决方案:可以加多一个子域名,重新执行就可以规避次错误
|
||||||
```
|
```
|
||||||
"detail": too many certificates (5) already issued for this exact set of idantifiers in the last 168hm0s
|
"detail": too many certificates (5) already issued for this exact set of idantifiers in the last 168hm0s
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## ssl.com报错 CAA record does not include ssl.com which is required to issue the certificate
|
||||||
|
ssl.com申请证书要求必须设置CAA记录,表示允许ssl.com为该域名颁发证书
|
||||||
|
请按如下格式添加CAA记录
|
||||||
|
|
||||||
|
| 示例 | 类型 | 域名前缀 | flag | tag | 值 |
|
||||||
|
|-------|-----| -- |-----------|--------|----------------------|
|
||||||
|
| 顶级域名 | CAA | @ | 0 | issue | "ssl.com" (注意有双引号) |
|
||||||
|
| 一级泛域名 | CAA | * | 0 | issue/issuewild | "ssl.com" |
|
||||||
|
| 固定子域名 | CAA | sub | 0 | issue |"ssl.com" |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
docs/guide/use/baota/images/white-1.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
docs/guide/use/baota/images/white-2.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/guide/use/baota/images/white-3.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/guide/use/baota/images/white-4.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
docs/guide/use/baota/images/white-5.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
docs/guide/use/baota/images/white-6.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/guide/use/baota/images/white-safe-1.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/guide/use/baota/images/white-safe-2.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
98
docs/guide/use/baota/white_list.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# 宝塔IP白名单与动态IP问题
|
||||||
|
调用宝塔接口需要添加IP白名单,但当certd部署在动态IP环境下时,IP白名单就不好添加
|
||||||
|
本章节提供两种解决方案:
|
||||||
|
1. 小范围网段放开(简单)
|
||||||
|
2. nginx代理
|
||||||
|
|
||||||
|
## 一、放开小范围网段
|
||||||
|
|
||||||
|
家庭网络IP虽然会变动,但是只会在小范围变的。
|
||||||
|
|
||||||
|
你可以分析规律,将变动的部分,设置成网段即可
|
||||||
|
|
||||||
|
> 比如出现过: 100.25.1.5 , 100.25.1.8
|
||||||
|
>
|
||||||
|
> 那么你可以配置 100.25.1.1-100.25.1.255
|
||||||
|
|
||||||
|
|
||||||
|
> 如果出现过: 100.25.1.5 , 100.25.4.8
|
||||||
|
>
|
||||||
|
> 可以尝试配置 100.25.*.5
|
||||||
|
|
||||||
|
## 二、nginx代理方案
|
||||||
|
|
||||||
|
通过在宝塔中配置一个nginx反向代理,代理宝塔自己的地址
|
||||||
|
|
||||||
|
然后在nginx中配置放开certd需要的接口,缩小影响范围
|
||||||
|
|
||||||
|
让nginx来充当防火墙
|
||||||
|
|
||||||
|
架构图如下:
|
||||||
|
```
|
||||||
|
只要将127.0.0.1加入白名单即可
|
||||||
|
↓
|
||||||
|
certd --------> nginx -------> 宝塔
|
||||||
|
↑
|
||||||
|
拦截除更新证书之外的地址
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1. 添加nginx反向代理
|
||||||
|

|
||||||
|
|
||||||
|
### 2. 域名和代理目标
|
||||||
|

|
||||||
|
|
||||||
|
### 3. 设置放开哪些接口
|
||||||
|

|
||||||
|

|
||||||
|
将如下脚本填入上方文本域中,保存
|
||||||
|
```nginx configuration
|
||||||
|
set $allow_access false;
|
||||||
|
|
||||||
|
# 检查请求的URI是否在白名单中
|
||||||
|
if ($request_uri ~* "^/(site\?action=get_site_types)") {
|
||||||
|
# 允许测试
|
||||||
|
set $allow_access true;
|
||||||
|
}
|
||||||
|
if ($request_uri ~* "^/(config\?action=SavePanelSSL)") {
|
||||||
|
# 允许部署到宝塔面板本身证书
|
||||||
|
set $allow_access true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* "^/(mod/docker/com/set_ssl|site\?action=SetSSL|ssl\?action=GetSiteDomain|mod/docker/com/get_site_list)") {
|
||||||
|
# 允许部署宝塔网站证书
|
||||||
|
set $allow_access true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* "^/(ssl?action=remove_cloud_cert|ssl\?action=get_cert_list)") {
|
||||||
|
# 允许删除宝塔过期证书
|
||||||
|
set $allow_access true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* "^/(datalist/get_data_list|site/set_site_ssl)") {
|
||||||
|
set $allow_access true;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 如果不在白名单,返回403禁止访问
|
||||||
|
if ($allow_access = false) {
|
||||||
|
return 405;
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 4. 接口IP白名单添加127.0.0.1
|
||||||
|

|
||||||
|
|
||||||
|
### 5. certd中宝塔授权配置改成新的这个域名地址
|
||||||
|
|
||||||
|

|
||||||
|
点击测试检查是否ok ,到这里就可以正常部署证书了
|
||||||
|
|
||||||
|
### 6. 安全加强(将请求地址改成https)
|
||||||
|
在宝塔中配置证书部署任务,选择刚才新建的这个网站,给他部署证书
|
||||||
|
勾选强制https
|
||||||
|

|
||||||
|
更换443端口【可选】
|
||||||
|

|
||||||
|
禁止http访问
|
||||||
@@ -9,5 +9,5 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmClient": "pnpm",
|
"npmClient": "pnpm",
|
||||||
"version": "1.36.20"
|
"version": "1.36.22"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/publishlab/node-acme-client/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/publishlab/node-acme-client/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
## [1.36.20](https://github.com/publishlab/node-acme-client/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/publishlab/node-acme-client/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/acme-client
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|||||||
@@ -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.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "scr/index.js",
|
"module": "scr/index.js",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"types"
|
"types"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@peculiar/x509": "^1.11.0",
|
"@peculiar/x509": "^1.11.0",
|
||||||
"asn1js": "^3.0.5",
|
"asn1js": "^3.0.5",
|
||||||
"axios": "^1.7.2",
|
"axios": "^1.7.2",
|
||||||
@@ -69,5 +69,5 @@
|
|||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 优化连接失败的报错提示 ([71d8e7e](https://github.com/certd/certd/commit/71d8e7edd23ad63fdc01a92766b52ede5074fe7c))
|
||||||
|
* 增加自签名证书提示 ([877c9c4](https://github.com/certd/certd/commit/877c9c4ff99f81d289f67afd96f440c0796b03ea))
|
||||||
|
* dns支持新网域名解析 ([cf3a78e](https://github.com/certd/certd/commit/cf3a78e1145ff0505c87fbc485d9e731b1aa88a8))
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/basic
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
00:56
|
01:46
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/basic",
|
"name": "@certd/basic",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -45,5 +45,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,26 @@ function base64(data: string) {
|
|||||||
function base64Decode(data: string) {
|
function base64Decode(data: string) {
|
||||||
return Buffer.from(data, "base64").toString("utf8");
|
return Buffer.from(data, "base64").toString("utf8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toHex(data: number | string) {
|
||||||
|
if (typeof data === "number") {
|
||||||
|
return data.toString(16);
|
||||||
|
}
|
||||||
|
return Buffer.from(data).toString("hex");
|
||||||
|
}
|
||||||
|
function hexToStr(data: string) {
|
||||||
|
return Buffer.from(data, "hex").toString("utf8");
|
||||||
|
}
|
||||||
|
function hexToNumber(data: string) {
|
||||||
|
return parseInt(data, 16);
|
||||||
|
}
|
||||||
export const hashUtils = {
|
export const hashUtils = {
|
||||||
md5,
|
md5,
|
||||||
sha256,
|
sha256,
|
||||||
base64,
|
base64,
|
||||||
base64Decode,
|
base64Decode,
|
||||||
hmacSha256,
|
hmacSha256,
|
||||||
|
toHex,
|
||||||
|
hexToStr,
|
||||||
|
hexToNumber,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,6 +7,13 @@ import * as https from "node:https";
|
|||||||
import { merge } from "lodash-es";
|
import { merge } from "lodash-es";
|
||||||
import { safePromise } from "./util.promise.js";
|
import { safePromise } from "./util.promise.js";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
|
|
||||||
|
const errorMap: Record<string, string> = {
|
||||||
|
"ssl3_get_record:wrong version number": "http协议错误,服务端要求http协议,请检查是否使用了https请求",
|
||||||
|
"getaddrinfo EAI_AGAIN": "无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置",
|
||||||
|
"self-signed certificate": "目标站点为自签名证书,请勾选忽略证书校验",
|
||||||
|
};
|
||||||
|
|
||||||
export class HttpError extends Error {
|
export class HttpError extends Error {
|
||||||
status?: number;
|
status?: number;
|
||||||
statusText?: string;
|
statusText?: string;
|
||||||
@@ -21,11 +28,12 @@ export class HttpError extends Error {
|
|||||||
super(error.message || error.response?.statusText);
|
super(error.message || error.response?.statusText);
|
||||||
|
|
||||||
const message = error?.message;
|
const message = error?.message;
|
||||||
if (message && typeof message === "string") {
|
if (message && typeof message === "string" && message.indexOf) {
|
||||||
if (message.indexOf && message.indexOf("ssl3_get_record:wrong version number") >= 0) {
|
for (const key in errorMap) {
|
||||||
this.message = `${message}(http协议错误,服务端要求http协议,请检查是否使用了https请求)`;
|
if (message.indexOf(key) > -1) {
|
||||||
} else if (message.indexOf("getaddrinfo EAI_AGAIN") >= 0) {
|
this.message = `${this.message}(${errorMap[key]})`;
|
||||||
this.message = `${message}(无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置)`;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,10 +207,31 @@ export function createAxiosService({ logger }: { logger: ILogger }) {
|
|||||||
case 505:
|
case 505:
|
||||||
error.message = "HTTP版本不受支持";
|
error.message = "HTTP版本不受支持";
|
||||||
break;
|
break;
|
||||||
|
case 302:
|
||||||
|
//重定向
|
||||||
|
return Promise.resolve(error.response);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
logger.error(`请求出错:status:${error.response?.status},statusText:${error.response?.statusText},url:${error.config?.url},method:${error.config?.method}。`);
|
|
||||||
|
const errorCode = error.code;
|
||||||
|
let errorMessage = null;
|
||||||
|
if (errorCode === "ECONNABORTED") {
|
||||||
|
errorMessage = "请求连接终止";
|
||||||
|
} else if (errorCode === "ETIMEDOUT") {
|
||||||
|
errorMessage = "请求连接超时";
|
||||||
|
} else if (errorCode === "ECONNRESET") {
|
||||||
|
errorMessage = "请求连接被重置";
|
||||||
|
} else if (errorCode === "ECONNREFUSED") {
|
||||||
|
errorMessage = "请求连接被服务端拒绝";
|
||||||
|
} else if (errorCode === "ENOTFOUND") {
|
||||||
|
errorMessage = "请求地址不存在";
|
||||||
|
}
|
||||||
|
if (errorMessage) {
|
||||||
|
error.message = errorMessage + "," + error.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.error(`请求出错:status:${error.response?.status || error.code},statusText:${error.response?.statusText || error.code},url:${error.config?.url},method:${error.config?.method}。`);
|
||||||
logger.error("返回数据:", JSON.stringify(error.response?.data));
|
logger.error("返回数据:", JSON.stringify(error.response?.data));
|
||||||
if (error.response?.data) {
|
if (error.response?.data) {
|
||||||
const message = error.response.data.message || error.response.data.msg || error.response.data.error;
|
const message = error.response.data.message || error.response.data.msg || error.response.data.error;
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**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.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -17,8 +17,8 @@
|
|||||||
"pub": "npm publish"
|
"pub": "npm publish"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@certd/plus-core": "^1.36.20",
|
"@certd/plus-core": "^1.36.22",
|
||||||
"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"
|
||||||
@@ -44,5 +44,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**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.36.20",
|
"version": "1.36.22",
|
||||||
"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",
|
||||||
@@ -24,5 +24,5 @@
|
|||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tslib": "^2.8.1"
|
"tslib": "^2.8.1"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**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.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -31,5 +31,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**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.36.20",
|
"version": "1.36.22",
|
||||||
"description": "jdcloud openApi sdk",
|
"description": "jdcloud openApi sdk",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
@@ -61,5 +61,5 @@
|
|||||||
"fetch"
|
"fetch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-k8s",
|
"name": "@certd/lib-k8s",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"pub": "npm publish"
|
"pub": "npm publish"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@kubernetes/client-node": "0.21.0"
|
"@kubernetes/client-node": "0.21.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -32,5 +32,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Performance Improvements
|
### Performance Improvements
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-server",
|
"name": "@certd/lib-server",
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -27,10 +27,11 @@
|
|||||||
],
|
],
|
||||||
"license": "AGPL",
|
"license": "AGPL",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.36.20",
|
"@certd/acme-client": "^1.36.22",
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@certd/pipeline": "^1.36.20",
|
"@certd/pipeline": "^1.36.22",
|
||||||
"@certd/plus-core": "^1.36.20",
|
"@certd/plugin-lib": "^1.36.22",
|
||||||
|
"@certd/plus-core": "^1.36.22",
|
||||||
"@midwayjs/cache": "~3.14.0",
|
"@midwayjs/cache": "~3.14.0",
|
||||||
"@midwayjs/core": "~3.20.3",
|
"@midwayjs/core": "~3.20.3",
|
||||||
"@midwayjs/i18n": "~3.20.3",
|
"@midwayjs/i18n": "~3.20.3",
|
||||||
@@ -61,5 +62,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
export * from './service/plus-service.js';
|
export * from './service/plus-service.js';
|
||||||
export * from './service/file-service.js';
|
export * from './service/file-service.js';
|
||||||
export * from './service/encryptor.js';
|
export * from './service/encryptor.js';
|
||||||
|
export * from './service/ocr-service.js';
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import { Inject, Provide, Scope, ScopeEnum } from "@midwayjs/core";
|
||||||
|
import { PlusService } from "./plus-service.js";
|
||||||
|
import { IOcrService } from "@certd/plugin-lib";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
@Provide("ocrService")
|
||||||
|
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
||||||
|
export class OcrService implements IOcrService {
|
||||||
|
@Inject()
|
||||||
|
plusService: PlusService;
|
||||||
|
|
||||||
|
async doOcrFromImage(opts: { image: string }): Promise<{ texts: string[] }> {
|
||||||
|
const res = await this.plusService.requestWithToken({
|
||||||
|
url: "/activation/certd/ocr",
|
||||||
|
method: "post",
|
||||||
|
data: {
|
||||||
|
image: opts.image
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ import { cache, http, HttpRequestConfig, logger } from '@certd/basic';
|
|||||||
import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js';
|
import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js';
|
||||||
import { merge } from 'lodash-es';
|
import { merge } from 'lodash-es';
|
||||||
|
|
||||||
@Provide()
|
@Provide("plusService")
|
||||||
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
||||||
export class PlusService {
|
export class PlusService {
|
||||||
@Inject()
|
@Inject()
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
**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.36.20",
|
"version": "1.36.22",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -46,5 +46,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,22 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复旧版本升级上来报错eab授权的bug ([b76f2e2](https://github.com/certd/certd/commit/b76f2e2008a7fefac4c91179c45c56c7a7a84b71))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* add preferred chain for google trust service ([#539](https://github.com/certd/certd/issues/539)) @ZeroClover ([e31d26a](https://github.com/certd/certd/commit/e31d26a8871c6088d9f8c0f580746ff2a810ae0c))
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复ssl.com报EMAILADDRESS数量不对的bug ([c560cc5](https://github.com/certd/certd/commit/c560cc5adda6e15bf3a8865d874042550a6c2688))
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-cert",
|
"name": "@certd/plugin-cert",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"pub": "npm publish"
|
"pub": "npm publish"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.36.20",
|
"@certd/acme-client": "^1.36.22",
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@certd/pipeline": "^1.36.20",
|
"@certd/pipeline": "^1.36.22",
|
||||||
"@certd/plugin-lib": "^1.36.20",
|
"@certd/plugin-lib": "^1.36.22",
|
||||||
"@google-cloud/publicca": "^1.3.0",
|
"@google-cloud/publicca": "^1.3.0",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
@@ -43,5 +43,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { HttpClient, ILogger, utils } from "@certd/basic";
|
import { HttpClient, ILogger, utils } from "@certd/basic";
|
||||||
import { IAccess, Registrable } from "@certd/pipeline";
|
import { IAccess, IServiceGetter, Registrable } from "@certd/pipeline";
|
||||||
|
|
||||||
export type DnsProviderDefine = Registrable & {
|
export type DnsProviderDefine = Registrable & {
|
||||||
accessType: string;
|
accessType: string;
|
||||||
@@ -25,6 +25,7 @@ export type DnsProviderContext = {
|
|||||||
http: HttpClient;
|
http: HttpClient;
|
||||||
utils: typeof utils;
|
utils: typeof utils;
|
||||||
domainParser: IDomainParser;
|
domainParser: IDomainParser;
|
||||||
|
serviceGetter: IServiceGetter;
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface IDnsProvider<T = any> {
|
export interface IDnsProvider<T = any> {
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ export class AcmeService {
|
|||||||
commonName,
|
commonName,
|
||||||
...csrInfo,
|
...csrInfo,
|
||||||
altNames,
|
altNames,
|
||||||
emailAddress: email,
|
// emailAddress: email,
|
||||||
},
|
},
|
||||||
privateKey
|
privateKey
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -38,6 +38,53 @@ export type DomainsVerifyPlanInput = {
|
|||||||
[key: string]: DomainVerifyPlanInput;
|
[key: string]: DomainVerifyPlanInput;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const preferredChainConfigs = {
|
||||||
|
letsencrypt: {
|
||||||
|
helper: "如无特殊需求保持默认即可",
|
||||||
|
options: [
|
||||||
|
{ value: "ISRG Root X1", label: "ISRG Root X1" },
|
||||||
|
{ value: "ISRG Root X2", label: "ISRG Root X2" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
google: {
|
||||||
|
helper: "GlobalSign 提供对老旧设备更好的兼容性,但证书链会变长",
|
||||||
|
options: [
|
||||||
|
{ value: "GTS Root R1", label: "GTS Root R1" },
|
||||||
|
{ value: "GlobalSign", label: "GlobalSign" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
const preferredChainSupportedProviders = Object.keys(preferredChainConfigs);
|
||||||
|
|
||||||
|
const preferredChainMergeScript = (() => {
|
||||||
|
const configs = JSON.stringify(preferredChainConfigs);
|
||||||
|
const supportedProviders = JSON.stringify(preferredChainSupportedProviders);
|
||||||
|
const defaultProvider = JSON.stringify(preferredChainSupportedProviders[0]);
|
||||||
|
return `
|
||||||
|
const chainConfigs = ${configs};
|
||||||
|
const supportedProviders = ${supportedProviders};
|
||||||
|
const defaultProvider = ${defaultProvider};
|
||||||
|
const getConfig = (provider)=> chainConfigs[provider] || chainConfigs[defaultProvider];
|
||||||
|
return {
|
||||||
|
show: ctx.compute(({form})=> supportedProviders.includes(form.sslProvider)),
|
||||||
|
component: {
|
||||||
|
options: ctx.compute(({form})=> getConfig(form.sslProvider).options)
|
||||||
|
},
|
||||||
|
helper: ctx.compute(({form})=> getConfig(form.sslProvider).helper),
|
||||||
|
value: ctx.compute(({form})=>{
|
||||||
|
const { options } = getConfig(form.sslProvider);
|
||||||
|
const allowed = options.map(item=>item.value);
|
||||||
|
const current = form.preferredChain;
|
||||||
|
if(allowed.includes(current)){
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
return allowed[0];
|
||||||
|
})
|
||||||
|
};
|
||||||
|
`;
|
||||||
|
})();
|
||||||
|
|
||||||
@IsTaskPlugin({
|
@IsTaskPlugin({
|
||||||
name: "CertApply",
|
name: "CertApply",
|
||||||
title: "证书申请(JS版)",
|
title: "证书申请(JS版)",
|
||||||
@@ -92,7 +139,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
|
|||||||
{ value: "sslcom", label: "SSL.com(仅主域名和www免费)", icon: "la:expeditedssl" },
|
{ value: "sslcom", label: "SSL.com(仅主域名和www免费)", icon: "la:expeditedssl" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
helper: "Let's Encrypt:申请最简单\nGoogle:大厂光环,兼容性好,仅首次需要翻墙获取EAB授权\nZeroSSL:需要EAB授权,无需翻墙",
|
helper: "Let's Encrypt:申请最简单\nGoogle:大厂光环,兼容性好,仅首次需要翻墙获取EAB授权\nZeroSSL:需要EAB授权,无需翻墙\nSSL.com:仅主域名和www免费,必须设置CAA记录",
|
||||||
required: true,
|
required: true,
|
||||||
})
|
})
|
||||||
sslProvider!: SSLProvider;
|
sslProvider!: SSLProvider;
|
||||||
@@ -294,24 +341,14 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
|
|||||||
|
|
||||||
@TaskInput({
|
@TaskInput({
|
||||||
title: "首选链",
|
title: "首选链",
|
||||||
value: "ISRG Root X1",
|
|
||||||
component: {
|
component: {
|
||||||
name: "a-select",
|
name: "a-select",
|
||||||
vModel: "value",
|
vModel: "value",
|
||||||
options: [
|
options: preferredChainConfigs.letsencrypt.options,
|
||||||
{ value: "ISRG Root X1", label: "ISRG Root X1" },
|
|
||||||
{ value: "ISRG Root X2", label: "ISRG Root X2" },
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
helper: "仅 Let's Encrypt 可选,默认为 ISRG Root X1",
|
helper: preferredChainConfigs.letsencrypt.helper,
|
||||||
required: false,
|
required: false,
|
||||||
mergeScript: `
|
mergeScript: preferredChainMergeScript,
|
||||||
return {
|
|
||||||
show: ctx.compute(({form})=>{
|
|
||||||
return form.sslProvider === 'letsencrypt'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
})
|
})
|
||||||
preferredChain!: string;
|
preferredChain!: string;
|
||||||
|
|
||||||
@@ -375,7 +412,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
|
|||||||
async onInit() {
|
async onInit() {
|
||||||
let eab: EabAccess = null;
|
let eab: EabAccess = null;
|
||||||
|
|
||||||
if (this.sslProvider !== "letsencrypt") {
|
if (this.sslProvider && this.sslProvider !== "letsencrypt") {
|
||||||
if (this.sslProvider === "google" && this.googleAccessId) {
|
if (this.sslProvider === "google" && this.googleAccessId) {
|
||||||
this.logger.info("当前正在使用 google服务账号授权获取EAB");
|
this.logger.info("当前正在使用 google服务账号授权获取EAB");
|
||||||
const googleAccess = await this.getAccess(this.googleAccessId);
|
const googleAccess = await this.getAccess(this.googleAccessId);
|
||||||
@@ -487,6 +524,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
|
|||||||
http: this.ctx.http,
|
http: this.ctx.http,
|
||||||
utils,
|
utils,
|
||||||
domainParser,
|
domainParser,
|
||||||
|
serviceGetter: this.ctx.serviceGetter,
|
||||||
};
|
};
|
||||||
return await createDnsProvider({
|
return await createDnsProvider({
|
||||||
dnsProviderType,
|
dnsProviderType,
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Performance Improvements
|
### Performance Improvements
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-lib",
|
"name": "@certd/plugin-lib",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@alicloud/tea-util": "^1.4.10",
|
"@alicloud/tea-util": "^1.4.10",
|
||||||
"@aws-sdk/client-s3": "^3.787.0",
|
"@aws-sdk/client-s3": "^3.787.0",
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@certd/pipeline": "^1.36.20",
|
"@certd/pipeline": "^1.36.22",
|
||||||
"@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",
|
||||||
@@ -53,5 +53,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "6d8981479517b5de9634e242c1ebf22e70527ec4"
|
"gitHead": "3cedef4974708d828fb972acc54af0515e3ec3a0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,3 +7,4 @@ export * from "./qiniu/index.js";
|
|||||||
export * from "./ctyun/index.js";
|
export * from "./ctyun/index.js";
|
||||||
export * from "./oss/index.js";
|
export * from "./oss/index.js";
|
||||||
export * from "./s3/index.js";
|
export * from "./s3/index.js";
|
||||||
|
export * from "./lib/index.js";
|
||||||
|
|||||||
1
packages/plugins/plugin-lib/src/lib/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from "./ocr-api.js";
|
||||||
3
packages/plugins/plugin-lib/src/lib/ocr-api.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export interface IOcrService {
|
||||||
|
doOcrFromImage(opts: { image: string }): Promise<{ texts: string[] }>;
|
||||||
|
}
|
||||||
@@ -3,6 +3,22 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 选择授权对话框编辑时,名称字段排在最后的bug ([31cfb09](https://github.com/certd/certd/commit/31cfb09468bda3272f5f63af65ff3e9272220b39))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 登录失败时清除验证码状态 ([1c15bea](https://github.com/certd/certd/commit/1c15beadc7fe8a7c6ec1903b7e722ca2f52e05b3))
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复导入插件对话框无法打开的bug,修复插件编辑页面打开多个代码编辑器消失的bug ([e5a080a](https://github.com/certd/certd/commit/e5a080aebe0d2f3e3c0f86bf863f75069c1bf7ab))
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-client",
|
"name": "@certd/ui-client",
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --open",
|
"dev": "vite --open",
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
"@aws-sdk/s3-request-presigner": "^3.535.0",
|
"@aws-sdk/s3-request-presigner": "^3.535.0",
|
||||||
"@certd/vue-js-cron-light": "^4.0.14",
|
"@certd/vue-js-cron-light": "^4.0.14",
|
||||||
"@ctrl/tinycolor": "^4.1.0",
|
"@ctrl/tinycolor": "^4.1.0",
|
||||||
|
"@fast-crud/editor-code": "^1.26.6",
|
||||||
"@fast-crud/fast-crud": "^1.26.6",
|
"@fast-crud/fast-crud": "^1.26.6",
|
||||||
"@fast-crud/fast-extends": "^1.26.6",
|
"@fast-crud/fast-extends": "^1.26.6",
|
||||||
"@fast-crud/ui-antdv4": "^1.26.6",
|
"@fast-crud/ui-antdv4": "^1.26.6",
|
||||||
@@ -103,8 +104,8 @@
|
|||||||
"zod-defaults": "^0.1.3"
|
"zod-defaults": "^0.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@certd/lib-iframe": "^1.36.20",
|
"@certd/lib-iframe": "^1.36.22",
|
||||||
"@certd/pipeline": "^1.36.20",
|
"@certd/pipeline": "^1.36.22",
|
||||||
"@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",
|
||||||
@@ -138,7 +139,7 @@
|
|||||||
"prettier": "3.3.3",
|
"prettier": "3.3.3",
|
||||||
"pretty-quick": "^4.0.0",
|
"pretty-quick": "^4.0.0",
|
||||||
"rimraf": "^5.0.5",
|
"rimraf": "^5.0.5",
|
||||||
"rollup": "^4.13.0",
|
"rollup": "4.50.0",
|
||||||
"rollup-plugin-visualizer": "^5.12.0",
|
"rollup-plugin-visualizer": "^5.12.0",
|
||||||
"stylelint": "^15.11.0",
|
"stylelint": "^15.11.0",
|
||||||
"stylelint-order": "^6.0.4",
|
"stylelint-order": "^6.0.4",
|
||||||
@@ -148,7 +149,7 @@
|
|||||||
"tslint": "^6.1.3",
|
"tslint": "^6.1.3",
|
||||||
"typescript": "^5.4.2",
|
"typescript": "^5.4.2",
|
||||||
"unplugin-vue-define-options": "^1.4.2",
|
"unplugin-vue-define-options": "^1.4.2",
|
||||||
"vite": "^5.3.1",
|
"vite": "5.4.19",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-html": "^3.2.2",
|
"vite-plugin-html": "^3.2.2",
|
||||||
"vite-plugin-theme": "^0.8.6",
|
"vite-plugin-theme": "^0.8.6",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<component :is="captchaComponent" v-if="settingStore.inited" ref="captchaRef" class="captcha_input" :captcha-get="getCaptcha" @change="onChange" />
|
<component :is="captchaComponent" v-if="settingStore.inited" ref="captchaRef" :model-value="modelValue" class="captcha_input" :captcha-get="getCaptcha" @change="onChange" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, defineAsyncComponent } from "vue";
|
import { ref, computed, defineAsyncComponent } from "vue";
|
||||||
@@ -7,6 +7,12 @@ import { useSettingStore } from "/@/store/settings";
|
|||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { request } from "/@/api/service";
|
import { request } from "/@/api/service";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({}),
|
||||||
|
},
|
||||||
|
});
|
||||||
const captchaRef = ref(null);
|
const captchaRef = ref(null);
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
|
|
||||||
@@ -17,7 +23,7 @@ const captchaAddonId = computed(() => {
|
|||||||
return settingStore.sysPublic.captchaAddonId ?? 0;
|
return settingStore.sysPublic.captchaAddonId ?? 0;
|
||||||
});
|
});
|
||||||
const captchaComponent = computed(() => {
|
const captchaComponent = computed(() => {
|
||||||
let type = "image";
|
let type: any = "image";
|
||||||
if (settingStore.sysPublic.captchaAddonId && settingStore.sysPublic.captchaType) {
|
if (settingStore.sysPublic.captchaAddonId && settingStore.sysPublic.captchaType) {
|
||||||
type = settingStore.sysPublic.captchaType;
|
type = settingStore.sysPublic.captchaType;
|
||||||
}
|
}
|
||||||
@@ -36,7 +42,7 @@ async function getCaptcha(): Promise<any> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onChange(data) {
|
function onChange(data: any) {
|
||||||
emits("update:modelValue", data);
|
emits("update:modelValue", data);
|
||||||
emits("change", data);
|
emits("change", data);
|
||||||
}
|
}
|
||||||
@@ -44,7 +50,11 @@ function onChange(data) {
|
|||||||
async function getCaptchaForm() {
|
async function getCaptchaForm() {
|
||||||
return await captchaRef.value.getCaptchaForm();
|
return await captchaRef.value.getCaptchaForm();
|
||||||
}
|
}
|
||||||
|
async function reset() {
|
||||||
|
await captchaRef.value.reset();
|
||||||
|
}
|
||||||
defineExpose({
|
defineExpose({
|
||||||
getCaptchaForm,
|
getCaptchaForm,
|
||||||
|
reset,
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div ref="captchaRef" class="geetest_captcha_wrapper"></div>
|
<div ref="captchaRef" class="geetest_captcha_wrapper"></div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, defineProps, defineEmits, ref, onUnmounted } from "vue";
|
import { onMounted, defineProps, defineEmits, ref, onUnmounted, Ref, watch } from "vue";
|
||||||
import { useSettingStore } from "/@/store/settings";
|
import { useSettingStore } from "/@/store/settings";
|
||||||
import { request } from "/src/api/service";
|
import { request } from "/src/api/service";
|
||||||
import { notification } from "ant-design-vue";
|
import { notification } from "ant-design-vue";
|
||||||
@@ -12,13 +12,14 @@ defineOptions({
|
|||||||
});
|
});
|
||||||
const emit = defineEmits(["update:modelValue", "change"]);
|
const emit = defineEmits(["update:modelValue", "change"]);
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
|
modelValue: any;
|
||||||
captchaGet: () => Promise<any>;
|
captchaGet: () => Promise<any>;
|
||||||
}>();
|
}>();
|
||||||
const captchaRef = ref(null);
|
const captchaRef = ref(null);
|
||||||
// const addonApi = createAddonApi();
|
// const addonApi = createAddonApi();
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
|
|
||||||
const captchaInstanceRef = ref({});
|
const captchaInstanceRef: Ref = ref({});
|
||||||
async function init() {
|
async function init() {
|
||||||
// if (!initGeetest4) {
|
// if (!initGeetest4) {
|
||||||
// await import("https://static.geetest.com/v4/gt4.js");
|
// await import("https://static.geetest.com/v4/gt4.js");
|
||||||
@@ -35,6 +36,13 @@ async function init() {
|
|||||||
captcha.appendTo(captchaRef.value); // 调用appendTo将验证码插入到页的某一个元素中,这个元素用户可以自定义
|
captcha.appendTo(captchaRef.value); // 调用appendTo将验证码插入到页的某一个元素中,这个元素用户可以自定义
|
||||||
captchaInstanceRef.value.instance = captcha;
|
captchaInstanceRef.value.instance = captcha;
|
||||||
captchaInstanceRef.value.captchaId = captchaId;
|
captchaInstanceRef.value.captchaId = captchaId;
|
||||||
|
|
||||||
|
captcha.onSuccess(function () {
|
||||||
|
const form = getCaptchaForm();
|
||||||
|
if (form) {
|
||||||
|
emitChange(form);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -58,29 +66,51 @@ function getCaptchaForm() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const valueRef = ref(null);
|
// const valueRef = ref(null);
|
||||||
const timeoutId = setInterval(() => {
|
// const timeoutId = setInterval(() => {
|
||||||
const form = getCaptchaForm();
|
// const form = getCaptchaForm();
|
||||||
if (form && valueRef.value != form) {
|
// if (form && valueRef.value != form) {
|
||||||
console.log("form", form);
|
// console.log("form", form);
|
||||||
valueRef.value = form;
|
// valueRef.value = form;
|
||||||
emitChange(form);
|
// emitChange(form);
|
||||||
}
|
// }
|
||||||
}, 1000);
|
// }, 1000);
|
||||||
|
|
||||||
onUnmounted(() => {
|
// onUnmounted(() => {
|
||||||
clearTimeout(timeoutId);
|
// clearTimeout(timeoutId);
|
||||||
});
|
// });
|
||||||
|
|
||||||
function emitChange(value: string) {
|
function emitChange(value: string) {
|
||||||
emit("update:modelValue", value);
|
emit("update:modelValue", value);
|
||||||
emit("change", value);
|
emit("change", value);
|
||||||
}
|
}
|
||||||
|
function reset() {
|
||||||
|
captchaInstanceRef.value.instance.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => {
|
||||||
|
return props.modelValue;
|
||||||
|
},
|
||||||
|
value => {
|
||||||
|
if (value == null) {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
getCaptchaForm,
|
getCaptchaForm,
|
||||||
|
reset,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => [props.captchaGet],
|
||||||
|
async () => {
|
||||||
|
await init();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await init();
|
await init();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,10 +11,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { defineEmits, defineExpose, defineProps, ref } from "vue";
|
import { defineEmits, defineExpose, defineProps, ref, watch } from "vue";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
|
modelValue: any;
|
||||||
captchaGet?: () => Promise<any>;
|
captchaGet?: () => Promise<any>;
|
||||||
}>();
|
}>();
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -42,6 +43,7 @@ function getCaptchaForm() {
|
|||||||
defineExpose({
|
defineExpose({
|
||||||
resetImageCode,
|
resetImageCode,
|
||||||
getCaptchaForm,
|
getCaptchaForm,
|
||||||
|
reset: resetImageCode,
|
||||||
});
|
});
|
||||||
|
|
||||||
resetImageCode();
|
resetImageCode();
|
||||||
@@ -52,7 +54,18 @@ function onChange(value: string) {
|
|||||||
emitChange(form);
|
emitChange(form);
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitChange(value) {
|
watch(
|
||||||
|
() => {
|
||||||
|
return props.modelValue;
|
||||||
|
},
|
||||||
|
value => {
|
||||||
|
if (value == null) {
|
||||||
|
resetImageCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
function emitChange(value: any) {
|
||||||
emit("update:modelValue", value);
|
emit("update:modelValue", value);
|
||||||
emit("change", value);
|
emit("change", value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { request } from "/src/api/service";
|
|||||||
// import "/src/mock";
|
// import "/src/mock";
|
||||||
import { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils } from "@fast-crud/fast-crud";
|
import { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils } from "@fast-crud/fast-crud";
|
||||||
import "@fast-crud/fast-crud/dist/style.css";
|
import "@fast-crud/fast-crud/dist/style.css";
|
||||||
import { FsExtendsCopyable, FsExtendsEditor, FsExtendsJson, FsExtendsTime, FsExtendsUploader, FsExtendsInput, FsUploaderS3SignedUrlType, FsUploaderGetAuthContext, FsUploaderAliossSTS } from "@fast-crud/fast-extends";
|
import { FsExtendsCopyable, FsExtendsEditor, FsExtendsJson, FsExtendsTime, FsExtendsUploader, FsExtendsInput } from "@fast-crud/fast-extends";
|
||||||
import "@fast-crud/fast-extends/dist/style.css";
|
import "@fast-crud/fast-extends/dist/style.css";
|
||||||
import UiAntdv from "@fast-crud/ui-antdv4";
|
import UiAntdv from "@fast-crud/ui-antdv4";
|
||||||
import "@fast-crud/ui-antdv4/dist/style.css";
|
import "@fast-crud/ui-antdv4/dist/style.css";
|
||||||
@@ -13,6 +13,9 @@ import { notification } from "ant-design-vue";
|
|||||||
import { usePreferences } from "/@/vben/preferences";
|
import { usePreferences } from "/@/vben/preferences";
|
||||||
import { LocalStorage } from "/@/utils/util.storage";
|
import { LocalStorage } from "/@/utils/util.storage";
|
||||||
|
|
||||||
|
import { FsEditorCode } from "@fast-crud/editor-code";
|
||||||
|
import "@fast-crud/editor-code/dist/style.css"
|
||||||
|
|
||||||
class ColumnSizeSaver {
|
class ColumnSizeSaver {
|
||||||
save: (key: string, size: number) => void;
|
save: (key: string, size: number) => void;
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -272,6 +275,7 @@ function install(app: App, options: any = {}) {
|
|||||||
app.use(FsExtendsTime);
|
app.use(FsExtendsTime);
|
||||||
app.use(FsExtendsCopyable);
|
app.use(FsExtendsCopyable);
|
||||||
app.use(FsExtendsInput);
|
app.use(FsExtendsInput);
|
||||||
|
app.use(FsEditorCode);
|
||||||
|
|
||||||
const { addTypes, getType } = useTypes();
|
const { addTypes, getType } = useTypes();
|
||||||
//此处演示修改官方字段类型
|
//此处演示修改官方字段类型
|
||||||
|
|||||||
@@ -5,11 +5,12 @@ import permission from "./permission";
|
|||||||
import { App } from "vue";
|
import { App } from "vue";
|
||||||
import "./validator/index.js";
|
import "./validator/index.js";
|
||||||
import directives from "./directive/index";
|
import directives from "./directive/index";
|
||||||
|
import { setupMonaco } from "./monaco";
|
||||||
function install(app: App, options: any = {}) {
|
function install(app: App, options: any = {}) {
|
||||||
app.use(FastCrud, options);
|
app.use(FastCrud, options);
|
||||||
app.use(permission);
|
app.use(permission);
|
||||||
app.use(directives);
|
app.use(directives);
|
||||||
|
setupMonaco();
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
15
packages/ui/certd-client/src/plugin/monaco/index.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
|
||||||
|
import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
|
||||||
|
import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
|
||||||
|
import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker";
|
||||||
|
import yamlWorker from "./yaml.worker?worker";
|
||||||
|
import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
|
||||||
|
import { registerWorker } from "@fast-crud/editor-code";
|
||||||
|
export function setupMonaco() {
|
||||||
|
registerWorker("json", jsonWorker);
|
||||||
|
registerWorker(["css", "less", "scss"], cssWorker);
|
||||||
|
registerWorker(["html", "handlebars", "razor"], htmlWorker);
|
||||||
|
registerWorker(["yaml", "yml"], yamlWorker);
|
||||||
|
registerWorker(["typescript", "javascript"], tsWorker);
|
||||||
|
registerWorker("*", editorWorker);
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from "monaco-yaml/yaml.worker.js";
|
||||||
@@ -105,9 +105,11 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
|||||||
form: {
|
form: {
|
||||||
rules: [{ required: true, message: t("certd.pleaseEnterName") }],
|
rules: [{ required: true, message: t("certd.pleaseEnterName") }],
|
||||||
helper: t("certd.nameHelper"),
|
helper: t("certd.nameHelper"),
|
||||||
|
order: -2,
|
||||||
},
|
},
|
||||||
column: {
|
column: {
|
||||||
width: 200,
|
width: 200,
|
||||||
|
order: -2,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
from: {
|
from: {
|
||||||
|
|||||||
@@ -21,10 +21,17 @@
|
|||||||
</a-input>
|
</a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item has-feedback name="captchaForEmail" label="验证码">
|
<a-form-item has-feedback name="captchaForEmail" label="验证码">
|
||||||
<CaptchaInput v-model:model-value="formState.captchaForEmail"></CaptchaInput>
|
<CaptchaInput ref="captchaForEmailRef" v-model:model-value="formState.captchaForEmail"></CaptchaInput>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item has-feedback name="validateCode" label="邮件验证码">
|
<a-form-item has-feedback name="validateCode" label="邮件验证码">
|
||||||
<email-code v-model:value="formState.validateCode" :captcha="formState.captchaForEmail" :email="formState.input" :random-str="formState.randomStr" verification-type="forgotPassword" />
|
<email-code
|
||||||
|
v-model:value="formState.validateCode"
|
||||||
|
:captcha="formState.captchaForEmail"
|
||||||
|
:email="formState.input"
|
||||||
|
:random-str="formState.randomStr"
|
||||||
|
verification-type="forgotPassword"
|
||||||
|
@error="formState.captchaForEmail = null"
|
||||||
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
<a-tab-pane key="mobile" tab="手机号找回">
|
<a-tab-pane key="mobile" tab="手机号找回">
|
||||||
@@ -36,10 +43,17 @@
|
|||||||
</a-input>
|
</a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item has-feedback name="captchaForSms" label="验证码">
|
<a-form-item has-feedback name="captchaForSms" label="验证码">
|
||||||
<CaptchaInput v-model:model-value="formState.captchaForSms"></CaptchaInput>
|
<CaptchaInput ref="captchaForSmsRef" v-model:model-value="formState.captchaForSms"></CaptchaInput>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item name="validateCode" label="手机验证码">
|
<a-form-item name="validateCode" label="手机验证码">
|
||||||
<sms-code v-model:value="formState.validateCode" :captcha="formState.captchaForSms" :mobile="formState.input" :phone-code="formState.phoneCode" verification-type="forgotPassword" />
|
<sms-code
|
||||||
|
v-model:value="formState.validateCode"
|
||||||
|
:captcha="formState.captchaForSms"
|
||||||
|
:mobile="formState.input"
|
||||||
|
:phone-code="formState.phoneCode"
|
||||||
|
verification-type="forgotPassword"
|
||||||
|
@error="formState.captchaForSms = null"
|
||||||
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
@@ -73,7 +87,6 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, reactive, ref, toRaw, watch } from "vue";
|
import { onMounted, reactive, ref, toRaw, watch } from "vue";
|
||||||
import ImageCode from "/@/views/framework/login/image-code.vue";
|
|
||||||
import EmailCode from "/@/views/framework/register/email-code.vue";
|
import EmailCode from "/@/views/framework/register/email-code.vue";
|
||||||
import SmsCode from "/@/views/framework/login/sms-code.vue";
|
import SmsCode from "/@/views/framework/login/sms-code.vue";
|
||||||
import { utils } from "@fast-crud/fast-crud";
|
import { utils } from "@fast-crud/fast-crud";
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item name="smsCode" :rules="rules.smsCode">
|
<a-form-item name="smsCode" :rules="rules.smsCode">
|
||||||
<sms-code v-model:value="formState.smsCode" :captcha="formState.smsCaptcha" :mobile="formState.mobile" :phone-code="formState.phoneCode" />
|
<sms-code v-model:value="formState.smsCode" :captcha="formState.smsCaptcha" :mobile="formState.mobile" :phone-code="formState.phoneCode" @error="formState.smsCaptcha = null" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
@@ -188,6 +188,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
formState.captcha = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -209,18 +210,6 @@ export default defineComponent({
|
|||||||
|
|
||||||
const captchaInputRef = ref();
|
const captchaInputRef = ref();
|
||||||
const captchaInputForSmsCode = ref();
|
const captchaInputForSmsCode = ref();
|
||||||
async function doCaptchaValidate() {
|
|
||||||
if (!sysPublicSettings.captchaEnabled) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
const res = await captchaInputRef.value.getValidatedForm();
|
|
||||||
if (!res) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
...res,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
t,
|
t,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ const props = defineProps<{
|
|||||||
captcha?: any;
|
captcha?: any;
|
||||||
verificationType?: string;
|
verificationType?: string;
|
||||||
}>();
|
}>();
|
||||||
const emit = defineEmits(["update:value", "change"]);
|
const emit = defineEmits(["update:value", "change", "error"]);
|
||||||
|
|
||||||
function onChange(value: string) {
|
function onChange(value: string) {
|
||||||
emit("update:value", value);
|
emit("update:value", value);
|
||||||
@@ -59,6 +59,9 @@ async function sendSmsCode() {
|
|||||||
captcha: props.captcha,
|
captcha: props.captcha,
|
||||||
verificationType: props.verificationType,
|
verificationType: props.verificationType,
|
||||||
});
|
});
|
||||||
|
} catch (e) {
|
||||||
|
emit("error", e);
|
||||||
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const props = defineProps<{
|
|||||||
captcha?: any;
|
captcha?: any;
|
||||||
verificationType?: string;
|
verificationType?: string;
|
||||||
}>();
|
}>();
|
||||||
const emit = defineEmits(["update:value", "change"]);
|
const emit = defineEmits(["update:value", "change", "error"]);
|
||||||
|
|
||||||
function onChange(value: string) {
|
function onChange(value: string) {
|
||||||
emit("update:value", value);
|
emit("update:value", value);
|
||||||
@@ -54,6 +54,9 @@ async function sendSmsCode() {
|
|||||||
captcha: props.captcha,
|
captcha: props.captcha,
|
||||||
verificationType: props.verificationType,
|
verificationType: props.verificationType,
|
||||||
});
|
});
|
||||||
|
} catch (e) {
|
||||||
|
emit("error", e);
|
||||||
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item has-feedback name="validateCode" :rules="rules.validateCode" label="邮件验证码">
|
<a-form-item has-feedback name="validateCode" :rules="rules.validateCode" label="邮件验证码">
|
||||||
<email-code v-model:value="formState.validateCode" :captcha="formState.captchaForEmail" :email="formState.email" />
|
<email-code v-model:value="formState.validateCode" :captcha="formState.captchaForEmail" :email="formState.email" @error="formState.captchaForEmail = null" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
@@ -182,16 +182,20 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleFinish = async (values: any) => {
|
const handleFinish = async (values: any) => {
|
||||||
await userStore.register(
|
try {
|
||||||
toRaw({
|
await userStore.register(
|
||||||
type: registerType.value,
|
toRaw({
|
||||||
password: formState.password,
|
type: registerType.value,
|
||||||
username: formState.username,
|
password: formState.password,
|
||||||
email: formState.email,
|
username: formState.username,
|
||||||
captcha: formState.captcha,
|
email: formState.email,
|
||||||
validateCode: formState.validateCode,
|
captcha: formState.captcha,
|
||||||
}) as any
|
validateCode: formState.validateCode,
|
||||||
);
|
}) as any
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
formState.captcha = null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleFinishFailed = (errors: any) => {
|
const handleFinishFailed = (errors: any) => {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<a-tab-pane key="editor" tab="元数据"> </a-tab-pane>
|
<a-tab-pane key="editor" tab="元数据"> </a-tab-pane>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
<div class="metadata-body">
|
<div class="metadata-body">
|
||||||
<code-editor id="metadata" v-model:model-value="plugin.metadata" language="yaml" @save="doSave"></code-editor>
|
<code-editor :id="`metadata_${idRef}`" v-model:model-value="plugin.metadata" language="yaml" @save="doSave"></code-editor>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="script">
|
<div class="script">
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
<a-tab-pane key="script" tab="脚本"> </a-tab-pane>
|
<a-tab-pane key="script" tab="脚本"> </a-tab-pane>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
<div class="script-body">
|
<div class="script-body">
|
||||||
<code-editor id="content" v-model:model-value="plugin.content" language="javascript" @save="doSave"></code-editor>
|
<code-editor :id="`content_${idRef}`" v-model:model-value="plugin.content" language="javascript" @save="doSave"></code-editor>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,6 +83,7 @@ function initFormOptions() {
|
|||||||
}
|
}
|
||||||
initFormOptions();
|
initFormOptions();
|
||||||
|
|
||||||
|
const idRef = ref(route.query.id);
|
||||||
async function getPlugin() {
|
async function getPlugin() {
|
||||||
const id = route.query.id;
|
const id = route.query.id;
|
||||||
const pluginObj = await api.GetObj(id);
|
const pluginObj = await api.GetObj(id);
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import * as api from "/@/views/sys/plugin/api";
|
import * as api from "/@/views/sys/plugin/api";
|
||||||
import { useFormWrapper } from "@fast-crud/fast-crud";
|
import { dict, useFormWrapper } from "@fast-crud/fast-crud";
|
||||||
import { useI18n } from "/@/locales";
|
import { useI18n } from "/@/locales";
|
||||||
import { Modal, notification } from "ant-design-vue";
|
import { notification } from "ant-design-vue";
|
||||||
|
|
||||||
export function usePluginImport() {
|
export function usePluginImport() {
|
||||||
const { openCrudFormDialog } = useFormWrapper();
|
const { openCrudFormDialog } = useFormWrapper();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
async function openImportDialog({ crudExpose }) {
|
async function openImportDialog(opts: any) {
|
||||||
|
const { crudExpose } = opts;
|
||||||
function createCrudOptions() {
|
function createCrudOptions() {
|
||||||
return {
|
return {
|
||||||
crudOptions: {
|
crudOptions: {
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export default ({ command, mode }) => {
|
|||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
plugins: [visualizer()],
|
plugins: [visualizer()],
|
||||||
},
|
},
|
||||||
|
minify: "esbuild",
|
||||||
},
|
},
|
||||||
css: {
|
css: {
|
||||||
preprocessorOptions: {
|
preprocessorOptions: {
|
||||||
|
|||||||
@@ -3,6 +3,19 @@
|
|||||||
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.36.22](https://github.com/certd/certd/compare/v1.36.21...v1.36.22) (2025-09-23)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 7001绑定::地址 ([7188997](https://github.com/certd/certd/commit/7188997dd1979f1c10fa29b30221015e0bd5fe9e))
|
||||||
|
* 公共cname支持权限校验 ([9cc5f0f](https://github.com/certd/certd/commit/9cc5f0f889d4362ff36e7a1f0e448e02d32ecee7))
|
||||||
|
* dns支持新网域名解析 ([cf3a78e](https://github.com/certd/certd/commit/cf3a78e1145ff0505c87fbc485d9e731b1aa88a8))
|
||||||
|
* gcore flush plugin ssl_id改为必填项 ([4b90972](https://github.com/certd/certd/commit/4b909723411c57505aa13b07d8699fb9ac77c937))
|
||||||
|
|
||||||
|
## [1.36.21](https://github.com/certd/certd/compare/v1.36.20...v1.36.21) (2025-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/ui-server
|
||||||
|
|
||||||
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
## [1.36.20](https://github.com/certd/certd/compare/v1.36.19...v1.36.20) (2025-09-13)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-server",
|
"name": "@certd/ui-server",
|
||||||
"version": "1.36.20",
|
"version": "1.36.22",
|
||||||
"description": "fast-server base midway",
|
"description": "fast-server base midway",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -43,20 +43,20 @@
|
|||||||
"@aws-sdk/client-cloudfront": "^3.699.0",
|
"@aws-sdk/client-cloudfront": "^3.699.0",
|
||||||
"@aws-sdk/client-iam": "^3.699.0",
|
"@aws-sdk/client-iam": "^3.699.0",
|
||||||
"@aws-sdk/client-s3": "^3.705.0",
|
"@aws-sdk/client-s3": "^3.705.0",
|
||||||
"@certd/acme-client": "^1.36.20",
|
"@certd/acme-client": "^1.36.22",
|
||||||
"@certd/basic": "^1.36.20",
|
"@certd/basic": "^1.36.22",
|
||||||
"@certd/commercial-core": "^1.36.20",
|
"@certd/commercial-core": "^1.36.22",
|
||||||
"@certd/cv4pve-api-javascript": "^8.4.2",
|
"@certd/cv4pve-api-javascript": "^8.4.2",
|
||||||
"@certd/jdcloud": "^1.36.20",
|
"@certd/jdcloud": "^1.36.22",
|
||||||
"@certd/lib-huawei": "^1.36.20",
|
"@certd/lib-huawei": "^1.36.22",
|
||||||
"@certd/lib-k8s": "^1.36.20",
|
"@certd/lib-k8s": "^1.36.22",
|
||||||
"@certd/lib-server": "^1.36.20",
|
"@certd/lib-server": "^1.36.22",
|
||||||
"@certd/midway-flyway-js": "^1.36.20",
|
"@certd/midway-flyway-js": "^1.36.22",
|
||||||
"@certd/pipeline": "^1.36.20",
|
"@certd/pipeline": "^1.36.22",
|
||||||
"@certd/plugin-cert": "^1.36.20",
|
"@certd/plugin-cert": "^1.36.22",
|
||||||
"@certd/plugin-lib": "^1.36.20",
|
"@certd/plugin-lib": "^1.36.22",
|
||||||
"@certd/plugin-plus": "^1.36.20",
|
"@certd/plugin-plus": "^1.36.22",
|
||||||
"@certd/plus-core": "^1.36.20",
|
"@certd/plus-core": "^1.36.22",
|
||||||
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120",
|
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120",
|
||||||
"@huaweicloud/huaweicloud-sdk-core": "^3.1.120",
|
"@huaweicloud/huaweicloud-sdk-core": "^3.1.120",
|
||||||
"@koa/cors": "^5.0.0",
|
"@koa/cors": "^5.0.0",
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ const development = {
|
|||||||
},
|
},
|
||||||
keys: 'certd',
|
keys: 'certd',
|
||||||
koa: {
|
koa: {
|
||||||
|
hostname:"::",
|
||||||
port: 7001,
|
port: 7001,
|
||||||
},
|
},
|
||||||
https: {
|
https: {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import { DomainParser } from "@certd/plugin-cert/dist/dns-provider/domain-parser
|
|||||||
import punycode from "punycode.js";
|
import punycode from "punycode.js";
|
||||||
import { SubDomainService } from "../../pipeline/service/sub-domain-service.js";
|
import { SubDomainService } from "../../pipeline/service/sub-domain-service.js";
|
||||||
import { SubDomainsGetter } from "../../pipeline/service/getter/sub-domain-getter.js";
|
import { SubDomainsGetter } from "../../pipeline/service/getter/sub-domain-getter.js";
|
||||||
|
import { TaskServiceBuilder } from "../../pipeline/service/getter/task-service-getter.js";
|
||||||
|
|
||||||
type CnameCheckCacheValue = {
|
type CnameCheckCacheValue = {
|
||||||
validating: boolean;
|
validating: boolean;
|
||||||
@@ -55,6 +56,10 @@ export class CnameRecordService extends BaseService<CnameRecordEntity> {
|
|||||||
@Inject()
|
@Inject()
|
||||||
subDomainService: SubDomainService;
|
subDomainService: SubDomainService;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
taskServiceBuilder: TaskServiceBuilder;
|
||||||
|
|
||||||
|
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
getRepository() {
|
getRepository() {
|
||||||
return this.repository;
|
return this.repository;
|
||||||
@@ -113,15 +118,13 @@ export class CnameRecordService extends BaseService<CnameRecordEntity> {
|
|||||||
|
|
||||||
const randomKey = utils.id.simpleNanoId(6).toLowerCase();
|
const randomKey = utils.id.simpleNanoId(6).toLowerCase();
|
||||||
|
|
||||||
let userIdHash = ""
|
const userIdHex = utils.hash.toHex(userId)
|
||||||
if(param.cnameProviderId < 0){
|
let userKeyHash = ""
|
||||||
//公共cname服务
|
const installInfo = await this.sysSettingsService.getSetting<SysInstallInfo>(SysInstallInfo)
|
||||||
userIdHash = utils.hash.md5(`userId${userId}_${randomKey}`).substring(0, 10)
|
userKeyHash = `${installInfo.siteId}_${userIdHex}_${randomKey}`
|
||||||
}else{
|
userKeyHash = utils.hash.md5(userKeyHash).substring(0, 10)
|
||||||
const installInfo = await this.sysSettingsService.getSetting<SysInstallInfo>(SysInstallInfo)
|
logger.info(`userKeyHash:${userKeyHash},subjectId:${installInfo.siteId},randomKey:${randomKey},userIdHex:${userIdHex}`)
|
||||||
userIdHash = utils.hash.md5(`${installInfo.siteId}_${randomKey}`).substring(0, 10)
|
const cnameKey = `${userKeyHash}-${userIdHex}-${randomKey}`;
|
||||||
}
|
|
||||||
const cnameKey = `${userIdHash}-${randomKey}`;
|
|
||||||
const safeDomain = param.domain.replaceAll('.', '-');
|
const safeDomain = param.domain.replaceAll('.', '-');
|
||||||
param.recordValue = `${safeDomain}.${cnameKey}.${cnameProvider.domain}`;
|
param.recordValue = `${safeDomain}.${cnameKey}.${cnameProvider.domain}`;
|
||||||
}
|
}
|
||||||
@@ -250,8 +253,9 @@ export class CnameRecordService extends BaseService<CnameRecordEntity> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const serviceGetter = this.taskServiceBuilder.create({userId:cnameProvider.userId})
|
||||||
const access = await this.accessService.getById(cnameProvider.accessId, cnameProvider.userId);
|
const access = await this.accessService.getById(cnameProvider.accessId, cnameProvider.userId);
|
||||||
const context = {access, logger, http, utils, domainParser};
|
const context = {access, logger, http, utils, domainParser,serviceGetter};
|
||||||
const dnsProvider: IDnsProvider = await createDnsProvider({
|
const dnsProvider: IDnsProvider = await createDnsProvider({
|
||||||
dnsProviderType: cnameProvider.dnsProviderType,
|
dnsProviderType: cnameProvider.dnsProviderType,
|
||||||
context,
|
context,
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ import { DomainVerifierGetter } from "./domain-verifier-getter.js";
|
|||||||
import { DomainService } from "../../../cert/service/domain-service.js";
|
import { DomainService } from "../../../cert/service/domain-service.js";
|
||||||
import { SubDomainService } from "../sub-domain-service.js";
|
import { SubDomainService } from "../sub-domain-service.js";
|
||||||
|
|
||||||
|
const serviceNames = [
|
||||||
|
'ocrService',
|
||||||
|
]
|
||||||
export class TaskServiceGetter implements IServiceGetter{
|
export class TaskServiceGetter implements IServiceGetter{
|
||||||
private userId: number;
|
private userId: number;
|
||||||
private appCtx : IMidwayContainer;
|
private appCtx : IMidwayContainer;
|
||||||
@@ -29,8 +32,14 @@ export class TaskServiceGetter implements IServiceGetter{
|
|||||||
return await this.getNotificationService() as T
|
return await this.getNotificationService() as T
|
||||||
} else if (serviceName === 'domainVerifierGetter') {
|
} else if (serviceName === 'domainVerifierGetter') {
|
||||||
return await this.getDomainVerifierGetter() as T
|
return await this.getDomainVerifierGetter() as T
|
||||||
}else{
|
} else{
|
||||||
throw new Error(`service ${serviceName} not found`)
|
if(!serviceNames.includes(serviceName)){
|
||||||
|
throw new Error(`${serviceName} not in whitelist`)
|
||||||
|
}
|
||||||
|
const service = await this.appCtx.getAsync(serviceName)
|
||||||
|
if (! service){
|
||||||
|
throw new Error(`${serviceName} not found`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,3 +36,4 @@ export * from './plugin-apisix/index.js'
|
|||||||
export * from './plugin-dokploy/index.js'
|
export * from './plugin-dokploy/index.js'
|
||||||
export * from './plugin-godaddy/index.js'
|
export * from './plugin-godaddy/index.js'
|
||||||
export * from './plugin-captcha/index.js'
|
export * from './plugin-captcha/index.js'
|
||||||
|
export * from './plugin-xinnet/index.js'
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export class GcoreflushPlugin extends AbstractTaskPlugin {
|
|||||||
certName!: string;
|
certName!: string;
|
||||||
@TaskInput({
|
@TaskInput({
|
||||||
title: '证书ID',
|
title: '证书ID',
|
||||||
|
required:true,
|
||||||
})
|
})
|
||||||
ssl_id!: string;
|
ssl_id!: string;
|
||||||
|
|
||||||
@@ -66,6 +67,10 @@ export class GcoreflushPlugin extends AbstractTaskPlugin {
|
|||||||
|
|
||||||
async execute(): Promise<void> {
|
async execute(): Promise<void> {
|
||||||
const { cert, accessId } = this;
|
const { cert, accessId } = this;
|
||||||
|
|
||||||
|
if(!this.ssl_id){
|
||||||
|
throw new Error('请填写要刷新的证书ID');
|
||||||
|
}
|
||||||
const access = (await this.getAccess(accessId)) as GcoreAccess;
|
const access = (await this.getAccess(accessId)) as GcoreAccess;
|
||||||
let otp = null;
|
let otp = null;
|
||||||
if (access.otpkey) {
|
if (access.otpkey) {
|
||||||
|
|||||||
79
packages/ui/certd-server/src/plugins/plugin-xinnet/access.ts
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import { IsAccess, AccessInput, BaseAccess } from "@certd/pipeline";
|
||||||
|
import { XinnetClient } from "@certd/plugin-plus";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 这个注解将注册一个授权配置
|
||||||
|
* 在certd的后台管理系统中,用户可以选择添加此类型的授权
|
||||||
|
*/
|
||||||
|
@IsAccess({
|
||||||
|
name: "xinnet",
|
||||||
|
title: "新网授权",
|
||||||
|
icon: "lsicon:badge-new-filled",
|
||||||
|
desc: ""
|
||||||
|
})
|
||||||
|
export class XinnetAccess extends BaseAccess {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权属性配置
|
||||||
|
*/
|
||||||
|
@AccessInput({
|
||||||
|
title: "用户名",
|
||||||
|
component: {
|
||||||
|
placeholder: "手机号/用户名"
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
encrypt: true
|
||||||
|
})
|
||||||
|
username = "";
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "登录密码",
|
||||||
|
component: {
|
||||||
|
name: "a-input-password",
|
||||||
|
vModel: "value",
|
||||||
|
placeholder: "登录密码"
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
encrypt: true
|
||||||
|
})
|
||||||
|
password = "";
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "测试",
|
||||||
|
component: {
|
||||||
|
name: "api-test",
|
||||||
|
action: "TestRequest"
|
||||||
|
},
|
||||||
|
helper: "点击测试接口是否正常"
|
||||||
|
})
|
||||||
|
testRequest = true;
|
||||||
|
|
||||||
|
async onTestRequest() {
|
||||||
|
|
||||||
|
const client = new XinnetClient({
|
||||||
|
access: this,
|
||||||
|
logger: this.ctx.logger,
|
||||||
|
http: this.ctx.http
|
||||||
|
});
|
||||||
|
|
||||||
|
await client.getDomainList({ pageNo: 1, pageSize: 1 });
|
||||||
|
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getCacheKey () {
|
||||||
|
let hashStr = ""
|
||||||
|
for (const key in this) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(this, key)) {
|
||||||
|
const element = this[key];
|
||||||
|
hashStr += element;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const hashCode = this.ctx.utils.hash.sha256(hashStr);
|
||||||
|
return `xinnet-${hashCode}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
new XinnetAccess();
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert";
|
||||||
|
import { XinnetAccess } from "./access.js";
|
||||||
|
import { XinnetClient } from "@certd/plugin-plus";
|
||||||
|
|
||||||
|
export type XinnetRecord = {
|
||||||
|
recordId: number;
|
||||||
|
recordFullName: string;
|
||||||
|
recordValue: string;
|
||||||
|
type: string;
|
||||||
|
serviceCode: string;
|
||||||
|
dcpCookie: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 这里通过IsDnsProvider注册一个dnsProvider
|
||||||
|
@IsDnsProvider({
|
||||||
|
name: "xinnet",
|
||||||
|
title: "新网",
|
||||||
|
desc: "新网域名解析",
|
||||||
|
icon: "lsicon:badge-new-filled",
|
||||||
|
// 这里是对应的 cloudflare的access类型名称
|
||||||
|
accessType: "xinnet",
|
||||||
|
order: 7
|
||||||
|
})
|
||||||
|
export class XinnetProvider extends AbstractDnsProvider<XinnetRecord> {
|
||||||
|
access!: XinnetAccess;
|
||||||
|
|
||||||
|
async onInstance() {
|
||||||
|
//一些初始化的操作
|
||||||
|
// 也可以通过ctx成员变量传递context
|
||||||
|
this.access = this.ctx.access as XinnetAccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建dns解析记录,用于验证域名所有权
|
||||||
|
*/
|
||||||
|
async createRecord(options: CreateRecordOptions): Promise<XinnetRecord> {
|
||||||
|
/**
|
||||||
|
* fullRecord: '_acme-challenge.test.example.com',
|
||||||
|
* value: 一串uuid
|
||||||
|
* type: 'TXT',
|
||||||
|
* domain: 'example.com'
|
||||||
|
*/
|
||||||
|
const { fullRecord, hostRecord, value, type, domain } = options;
|
||||||
|
this.logger.info("添加域名解析:", fullRecord, value, type, domain);
|
||||||
|
|
||||||
|
const client = new XinnetClient({
|
||||||
|
logger: this.logger,
|
||||||
|
access: this.access,
|
||||||
|
http: this.http
|
||||||
|
});
|
||||||
|
|
||||||
|
const res = await client.getDomainList({
|
||||||
|
searchKey: domain
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!res.list || res.list.length == 0) {
|
||||||
|
throw new Error("域名不存在");
|
||||||
|
}
|
||||||
|
const serviceCode = res.list[0].serviceCode;
|
||||||
|
|
||||||
|
const dcpCookie = await client.getDcpCookie({
|
||||||
|
serviceCode
|
||||||
|
});
|
||||||
|
|
||||||
|
const recordRes = await client.addDomainDnsRecord({
|
||||||
|
recordName: hostRecord,
|
||||||
|
type: type,
|
||||||
|
recordValue: value
|
||||||
|
}, {
|
||||||
|
dcpCookie,
|
||||||
|
serviceCode
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
...recordRes,
|
||||||
|
serviceCode,
|
||||||
|
dcpCookie
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除dns解析记录,清理申请痕迹
|
||||||
|
* @param options
|
||||||
|
*/
|
||||||
|
async removeRecord(options: RemoveRecordOptions<XinnetRecord>): Promise<void> {
|
||||||
|
const client = new XinnetClient({
|
||||||
|
logger: this.logger,
|
||||||
|
access: this.access,
|
||||||
|
http: this.http
|
||||||
|
});
|
||||||
|
|
||||||
|
const recordRes = options.recordRes;
|
||||||
|
let dcpCookie = recordRes.dcpCookie;
|
||||||
|
if (!dcpCookie) {
|
||||||
|
dcpCookie = await client.getDcpCookie({
|
||||||
|
serviceCode: recordRes.serviceCode
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await client.deleteDomainDnsRecord(recordRes, {
|
||||||
|
dcpCookie,
|
||||||
|
serviceCode: recordRes.serviceCode
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//实例化这个provider,将其自动注册到系统中
|
||||||
|
new XinnetProvider();
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from './dns-provider.js';
|
||||||
|
export * from './access.js';
|
||||||