mirror of
https://github.com/certd/certd.git
synced 2026-04-28 07:57:25 +08:00
Compare commits
44 Commits
v1.38.4
...
ba623903e0
| Author | SHA1 | Date | |
|---|---|---|---|
| ba623903e0 | |||
| 907af3ae18 | |||
| 24ae8a6b66 | |||
| 1646a5cdd2 | |||
| 814f17d10b | |||
| 40fe105903 | |||
| 42a347d8b1 | |||
| 5450e5dac4 | |||
| 1368259a1e | |||
| 81a495f267 | |||
| 693a4a6633 | |||
| 82786c580a | |||
| e19743f705 | |||
| 9166a57930 | |||
| bd511f97cb | |||
| 560bf40e4b | |||
| 4f4652c1cd | |||
| 60e13c2a1d | |||
| 1fe0dc4d16 | |||
| 181a1e3c0a | |||
| 6bba771856 | |||
| 921f1f42fb | |||
| eeb1f27fa4 | |||
| 9ce21ad152 | |||
| c036929cfe | |||
| 21591a3a89 | |||
| a2e9a41a7e | |||
| 0902349130 | |||
| f900db8e10 | |||
| 0fa9b344e0 | |||
| f48ef3d17b | |||
| 40801d0a06 | |||
| c6ccf1cf21 | |||
| d311992983 | |||
| b4babbe2c7 | |||
| 0719f4c99e | |||
| eb5de15033 | |||
| b229486d3b | |||
| 33b8d3e219 | |||
| 230256793f | |||
| 540ef96745 | |||
| 1baf30a671 | |||
| 5e93840e48 | |||
| 73a5908039 |
Vendored
+5
-1
@@ -16,5 +16,9 @@
|
|||||||
},
|
},
|
||||||
"[less]": {
|
"[less]": {
|
||||||
"editor.defaultFormatter": "vscode.css-language-features"
|
"editor.defaultFormatter": "vscode.css-language-features"
|
||||||
}
|
},
|
||||||
|
"scm.repositories.visible": 9,
|
||||||
|
"scm.repositories.explorer": false,
|
||||||
|
"scm.repositories.selectionMode": "multiple",
|
||||||
|
"scm.repositories.sortOrder": "discovery time"
|
||||||
}
|
}
|
||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复新网找错域名的bug ([bd511f9](https://github.com/certd/certd/commit/bd511f97cb7fbdcaeff7ac899f0460a5c7b41826))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 当域名管理中没有域名时,创建流水线时不展开域名选择框 ([9166a57](https://github.com/certd/certd/commit/9166a579301a60750f0b72b6a42b0c8d730695fd))
|
||||||
|
* count tip ([e19743f](https://github.com/certd/certd/commit/e19743f70553700f1f91bff76f87370f749dd247))
|
||||||
|
* oauth支持github 和google, 修复头像显示问题 ([693a4a6](https://github.com/certd/certd/commit/693a4a663385ced3176286bf4b5f3566da83d90e))
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 阿里云esa查询证书限制接口无效,改成配置证书数量上限检查方式进行清理 ([2302567](https://github.com/certd/certd/commit/230256793f8ad87ef8a0738c37108bf7b5ab9853))
|
||||||
|
* 某些情况下登陆页面没有显示重置密码文档链接的问题 ([40801d0](https://github.com/certd/certd/commit/40801d0a0668c77adb57fae42b4b6615b198a88d))
|
||||||
|
* 修复部署到火山引擎vod,获取域名列表为空的bug ([0719f4c](https://github.com/certd/certd/commit/0719f4c99e9198544d03431107b53652e076e881))
|
||||||
|
* 修复litessl new-nonce报428的bug ([540ef96](https://github.com/certd/certd/commit/540ef967457a7871637cfdb5012ed1fa3261757b))
|
||||||
|
* 修复oidc配置取消后获取登出地址失败后无法列出oauth列表的bug ([eb5de15](https://github.com/certd/certd/commit/eb5de150332fd914c56b812c3ba2c2445f902bb7))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 将重置密码的日志挪到启动成功之后,方便查看 ([0fa9b34](https://github.com/certd/certd/commit/0fa9b344e08cf355aee7a7566f061cc5d95dc374))
|
||||||
|
* 支持绑定两个url地址 ([a2e9a41](https://github.com/certd/certd/commit/a2e9a41a7e712395c0e3ee6fe55b370aa1fc1f12))
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -3,6 +3,51 @@
|
|||||||
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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复新网找错域名的bug ([bd511f9](https://github.com/certd/certd/commit/bd511f97cb7fbdcaeff7ac899f0460a5c7b41826))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 当域名管理中没有域名时,创建流水线时不展开域名选择框 ([9166a57](https://github.com/certd/certd/commit/9166a579301a60750f0b72b6a42b0c8d730695fd))
|
||||||
|
* count tip ([e19743f](https://github.com/certd/certd/commit/e19743f70553700f1f91bff76f87370f749dd247))
|
||||||
|
* oauth支持github 和google, 修复头像显示问题 ([693a4a6](https://github.com/certd/certd/commit/693a4a663385ced3176286bf4b5f3566da83d90e))
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 阿里云esa查询证书限制接口无效,改成配置证书数量上限检查方式进行清理 ([2302567](https://github.com/certd/certd/commit/230256793f8ad87ef8a0738c37108bf7b5ab9853))
|
||||||
|
* 某些情况下登陆页面没有显示重置密码文档链接的问题 ([40801d0](https://github.com/certd/certd/commit/40801d0a0668c77adb57fae42b4b6615b198a88d))
|
||||||
|
* 修复部署到火山引擎vod,获取域名列表为空的bug ([0719f4c](https://github.com/certd/certd/commit/0719f4c99e9198544d03431107b53652e076e881))
|
||||||
|
* 修复litessl new-nonce报428的bug ([540ef96](https://github.com/certd/certd/commit/540ef967457a7871637cfdb5012ed1fa3261757b))
|
||||||
|
* 修复oidc配置取消后获取登出地址失败后无法列出oauth列表的bug ([eb5de15](https://github.com/certd/certd/commit/eb5de150332fd914c56b812c3ba2c2445f902bb7))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 将重置密码的日志挪到启动成功之后,方便查看 ([0fa9b34](https://github.com/certd/certd/commit/0fa9b344e08cf355aee7a7566f061cc5d95dc374))
|
||||||
|
* 支持绑定两个url地址 ([a2e9a41](https://github.com/certd/certd/commit/a2e9a41a7e712395c0e3ee6fe55b370aa1fc1f12))
|
||||||
|
|
||||||
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复1:: 形式的ipv6校验失败的bug ([8b96f21](https://github.com/certd/certd/commit/8b96f218d5284033f10c186c0ce18e4c16d8e9b2))
|
||||||
|
* 修复阿里云esa超过免费配额之后无法部署证书的bug,改成删除最旧的那张证书 ([32de8d9](https://github.com/certd/certd/commit/32de8d9ccb08d26414adbdde950d7cd405dc344a))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 当ip证书天数太小时,自动调整更新天数,避免每次运行都重新申请ip证书 ([433e98b](https://github.com/certd/certd/commit/433e98b6450fa7d0491151f159e432bf3dfe4feb))
|
||||||
|
* 首页证书数量支持点击跳转 ([52cbff0](https://github.com/certd/certd/commit/52cbff0e15329aecd3edcf81315fb7ceab9ec290))
|
||||||
|
* 修复旧版本流水线数据发送通知标题为空的bug ([9bee0e4](https://github.com/certd/certd/commit/9bee0e460bfebe8db76742b80b2d52854392f4de))
|
||||||
|
* 验证码支持 Cloudflare Turnstile ,谨慎启用,国内被墙了 ([ca43c77](https://github.com/certd/certd/commit/ca43c775250154def63c4acd96d65dc95d1c0c2b))
|
||||||
|
* 优化证书未过期时的任务日志提示 ([ac85488](https://github.com/certd/certd/commit/ac85488245197694560aad7df9425ca215ef7ff7))
|
||||||
|
* 支持部署到阿里云GA ([1a0d3ee](https://github.com/certd/certd/commit/1a0d3eeb1b0b5ce08f05af84b6161e00c1fe1815))
|
||||||
|
* 支持部署到华为elb ([60c8ace](https://github.com/certd/certd/commit/60c8ace443e848155d3ce12e95b84766a4610d3a))
|
||||||
|
* 支持部署到AcePanel ([1661cae](https://github.com/certd/certd/commit/1661caed05e3413dc3e2b14ce62b75aa03ad90e0))
|
||||||
|
|
||||||
## [1.38.3](https://github.com/certd/certd/compare/v1.38.2...v1.38.3) (2026-01-28)
|
## [1.38.3](https://github.com/certd/certd/compare/v1.38.2...v1.38.3) (2026-01-28)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"notice": "永久专业版上线,新用户立减50,升级到最新版点击下方“立即赞助”按钮前往获取",
|
||||||
|
"plus": {
|
||||||
|
"name": "专业版",
|
||||||
|
"price": "89.9",
|
||||||
|
"price3": "199",
|
||||||
|
"tooltip": "开源需要您的赞助支持",
|
||||||
|
"priceText":"¥89.9/年",
|
||||||
|
"discountText":"永久专业版50优惠券立即领取"
|
||||||
|
},
|
||||||
|
"comm": {
|
||||||
|
"name": "商业版",
|
||||||
|
"price": "399",
|
||||||
|
"price3": "899",
|
||||||
|
"tooltip": "3年优惠300",
|
||||||
|
"priceText":"¥399/年",
|
||||||
|
"discountText":"¥899/3年(3年优惠300)"
|
||||||
|
},
|
||||||
|
"app":{
|
||||||
|
"minVersion":"1.36.0",
|
||||||
|
"minVersionTip":"版本过低,为了您的数据安全,请尽快升级"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
| 序号 | 名称 | 说明 |
|
| 序号 | 名称 | 说明 |
|
||||||
|-----|-----|-----|
|
|-----|-----|-----|
|
||||||
| 1.| **证书申请(JS版)** | 免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
| 1.| **证书申请(JS版)** | 免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
||||||
| 2.| **商用证书托管** | 手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次) |
|
| 2.| **已有证书托管** | 手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次) |
|
||||||
| 3.| **获取阿里云订阅证书** | 从阿里云拉取订阅模式的商用证书 |
|
| 3.| **获取阿里云订阅证书** | 从阿里云拉取订阅模式的商用证书 |
|
||||||
| 4.| **证书申请(Lego)** | 支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
| 4.| **证书申请(Lego)** | 支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
||||||
## 2. 主机
|
## 2. 主机
|
||||||
|
|||||||
@@ -52,3 +52,11 @@ service:
|
|||||||
3. DNS 有其他平台申请过的_acme-challenge记录,删除即可
|
3. DNS 有其他平台申请过的_acme-challenge记录,删除即可
|
||||||
|
|
||||||
|
|
||||||
|
## 7. DNS problem: NXDOMAIN looking up TXT for _acme-challenge.xxx
|
||||||
|
`
|
||||||
|
DNS problem: NXDOMAIN looking up TXT for _acme-challenge.xxxxx - check that a DNS record exists for this domain
|
||||||
|
`
|
||||||
|
证书颁发机构向域名ns查询TXT验证记录失败,有以下几种可能
|
||||||
|
1、域名的ns服务器修改成别的了,但申请证书时的DNS提供商选择错误(检查确认,配置正确的DNS提供商)
|
||||||
|
2、证书颁发机构与ns域名服务器之间访问不通,无法查询到TXT记录(尝试更换证书颁发机构)
|
||||||
|
3、ns服务商解析值生效慢(尝试修改证书申请任务里面的等待生效时长600-1000s)
|
||||||
+1
-1
@@ -9,5 +9,5 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmClient": "pnpm",
|
"npmClient": "pnpm",
|
||||||
"version": "1.38.4"
|
"version": "1.38.6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,16 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.38.6](https://github.com/publishlab/node-acme-client/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/publishlab/node-acme-client/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复litessl new-nonce报428的bug ([540ef96](https://github.com/publishlab/node-acme-client/commit/540ef967457a7871637cfdb5012ed1fa3261757b))
|
||||||
|
|
||||||
## [1.38.4](https://github.com/publishlab/node-acme-client/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/publishlab/node-acme-client/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**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.38.4",
|
"version": "1.38.6",
|
||||||
"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.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@peculiar/x509": "^1.11.0",
|
"@peculiar/x509": "^1.11.0",
|
||||||
"asn1js": "^3.0.5",
|
"asn1js": "^3.0.5",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
@@ -70,5 +70,5 @@
|
|||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,9 @@ class AcmeClient {
|
|||||||
max: this.opts.backoffMax,
|
max: this.opts.backoffMax,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.http = new HttpClient(this.opts.directoryUrl, this.opts.accountKey, this.opts.externalAccountBinding, this.opts.urlMapping, opts.logger);
|
const cacheNonce = true
|
||||||
|
// const cacheNonce = this.sslProvider === 'litessl';
|
||||||
|
this.http = new HttpClient(this.opts.directoryUrl, this.opts.accountKey, this.opts.externalAccountBinding, this.opts.urlMapping, opts.logger, cacheNonce);
|
||||||
this.api = new AcmeApi(this.http, this.opts.accountUrl);
|
this.api = new AcmeApi(this.http, this.opts.accountUrl);
|
||||||
this.logger = opts.logger;
|
this.logger = opts.logger;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { getJwk } from './crypto/index.js';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
class HttpClient {
|
class HttpClient {
|
||||||
constructor(directoryUrl, accountKey, externalAccountBinding = {}, urlMapping = {},logger) {
|
constructor(directoryUrl, accountKey, externalAccountBinding = {}, urlMapping = {}, logger, cacheNonce= false) {
|
||||||
this.directoryUrl = directoryUrl;
|
this.directoryUrl = directoryUrl;
|
||||||
this.accountKey = accountKey;
|
this.accountKey = accountKey;
|
||||||
this.externalAccountBinding = externalAccountBinding;
|
this.externalAccountBinding = externalAccountBinding;
|
||||||
@@ -31,7 +31,34 @@ class HttpClient {
|
|||||||
this.directoryMaxAge = 86400;
|
this.directoryMaxAge = 86400;
|
||||||
this.directoryTimestamp = 0;
|
this.directoryTimestamp = 0;
|
||||||
this.urlMapping = urlMapping;
|
this.urlMapping = urlMapping;
|
||||||
this.log = logger? logger.info.bind(logger) : log;
|
this.log = logger ? logger.info.bind(logger) : log;
|
||||||
|
this.nonces = [];
|
||||||
|
this.cacheNonce = cacheNonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
pushNonce(nonce) {
|
||||||
|
if (!this.cacheNonce || !nonce) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.nonces.push({
|
||||||
|
nonce,
|
||||||
|
expires: Date.now() + 30*1000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
popNonce() {
|
||||||
|
while (true) {
|
||||||
|
if (this.nonces.length === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const item = this.nonces.shift();
|
||||||
|
if (!item) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (item.expires < Date.now()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return item.nonce;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,6 +97,13 @@ class HttpClient {
|
|||||||
const resp = await axios.request(opts);
|
const resp = await axios.request(opts);
|
||||||
|
|
||||||
this.log(`RESP ${resp.status} ${method} ${url}`);
|
this.log(`RESP ${resp.status} ${method} ${url}`);
|
||||||
|
|
||||||
|
const nonce = resp.headers['replay-nonce'];
|
||||||
|
if (nonce) {
|
||||||
|
//如果有nonce
|
||||||
|
this.pushNonce(nonce);
|
||||||
|
}
|
||||||
|
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,6 +161,13 @@ class HttpClient {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
async getNonce() {
|
async getNonce() {
|
||||||
|
|
||||||
|
//尝试从队列中pop一个nonce
|
||||||
|
const nonce = this.popNonce();
|
||||||
|
if (nonce) {
|
||||||
|
return nonce;
|
||||||
|
}
|
||||||
|
|
||||||
const url = await this.getResourceUrl('newNonce');
|
const url = await this.getResourceUrl('newNonce');
|
||||||
const resp = await this.request(url, 'head');
|
const resp = await this.request(url, 'head');
|
||||||
|
|
||||||
@@ -134,7 +175,11 @@ class HttpClient {
|
|||||||
throw new Error('Failed to get nonce from ACME provider');
|
throw new Error('Failed to get nonce from ACME provider');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.cacheNonce) {
|
||||||
|
return this.popNonce();
|
||||||
|
}
|
||||||
return resp.headers['replay-nonce'];
|
return resp.headers['replay-nonce'];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
02:08
|
01:13
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/basic",
|
"name": "@certd/basic",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -47,5 +47,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
### Performance Improvements
|
### Performance Improvements
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/pipeline",
|
"name": "@certd/pipeline",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -18,8 +18,8 @@
|
|||||||
"compile": "tsc --skipLibCheck --watch"
|
"compile": "tsc --skipLibCheck --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@certd/plus-core": "^1.38.4",
|
"@certd/plus-core": "^1.38.6",
|
||||||
"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"
|
||||||
@@ -45,5 +45,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**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.38.4",
|
"version": "1.38.6",
|
||||||
"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": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**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.38.4",
|
"version": "1.38.6",
|
||||||
"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": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**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.38.4",
|
"version": "1.38.6",
|
||||||
"description": "jdcloud openApi sdk",
|
"description": "jdcloud openApi sdk",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
@@ -56,5 +56,5 @@
|
|||||||
"fetch"
|
"fetch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-k8s
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-k8s",
|
"name": "@certd/lib-k8s",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"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.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@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": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,16 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 支持绑定两个url地址 ([a2e9a41](https://github.com/certd/certd/commit/a2e9a41a7e712395c0e3ee6fe55b370aa1fc1f12))
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-server
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-server",
|
"name": "@certd/lib-server",
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -28,11 +28,11 @@
|
|||||||
],
|
],
|
||||||
"license": "AGPL",
|
"license": "AGPL",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.38.4",
|
"@certd/acme-client": "^1.38.6",
|
||||||
"@certd/basic": "^1.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@certd/pipeline": "^1.38.4",
|
"@certd/pipeline": "^1.38.6",
|
||||||
"@certd/plugin-lib": "^1.38.4",
|
"@certd/plugin-lib": "^1.38.6",
|
||||||
"@certd/plus-core": "^1.38.4",
|
"@certd/plus-core": "^1.38.6",
|
||||||
"@midwayjs/cache": "3.14.0",
|
"@midwayjs/cache": "3.14.0",
|
||||||
"@midwayjs/core": "3.20.11",
|
"@midwayjs/core": "3.20.11",
|
||||||
"@midwayjs/i18n": "3.20.13",
|
"@midwayjs/i18n": "3.20.13",
|
||||||
@@ -64,5 +64,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export class PlusService {
|
|||||||
|
|
||||||
const subjectId = installInfo.siteId;
|
const subjectId = installInfo.siteId;
|
||||||
const bindUrl = installInfo.bindUrl;
|
const bindUrl = installInfo.bindUrl;
|
||||||
|
const bindUrl2 = installInfo.bindUrl2;
|
||||||
const installTime = installInfo.installTime;
|
const installTime = installInfo.installTime;
|
||||||
const saveLicense = async (license: string) => {
|
const saveLicense = async (license: string) => {
|
||||||
let licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
|
let licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
|
||||||
@@ -30,7 +31,7 @@ export class PlusService {
|
|||||||
await this.sysSettingsService.saveSetting(licenseInfo);
|
await this.sysSettingsService.saveSetting(licenseInfo);
|
||||||
};
|
};
|
||||||
|
|
||||||
return new PlusRequestService({ subjectId, bindUrl, installTime, saveLicense });
|
return new PlusRequestService({ subjectId, bindUrl, bindUrl2, installTime, saveLicense });
|
||||||
}
|
}
|
||||||
|
|
||||||
async getSubjectId() {
|
async getSubjectId() {
|
||||||
@@ -53,9 +54,9 @@ export class PlusService {
|
|||||||
await plusRequestService.verify({ license: licenseInfo.license });
|
await plusRequestService.verify({ license: licenseInfo.license });
|
||||||
}
|
}
|
||||||
|
|
||||||
async bindUrl(url: string) {
|
async bindUrl(url: string, url2?:string) {
|
||||||
const plusRequestService = await this.getPlusRequestService();
|
const plusRequestService = await this.getPlusRequestService();
|
||||||
const res = await plusRequestService.bindUrl(url);
|
const res = await plusRequestService.bindUrl(url,url2);
|
||||||
this.plusRequestService = null;
|
this.plusRequestService = null;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -150,6 +151,12 @@ export class PlusService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getTodayOrderCount () {
|
||||||
|
await this.register();
|
||||||
|
const plusRequestService = await this.getPlusRequestService();
|
||||||
|
return await plusRequestService.getOrderCount()
|
||||||
|
}
|
||||||
|
|
||||||
async requestWithToken(config: HttpRequestConfig) {
|
async requestWithToken(config: HttpRequestConfig) {
|
||||||
const plusRequestService = await this.getPlusRequestService();
|
const plusRequestService = await this.getPlusRequestService();
|
||||||
const token = await this.getAccessToken();
|
const token = await this.getAccessToken();
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ export class SysInstallInfo extends BaseSettings {
|
|||||||
siteId?: string;
|
siteId?: string;
|
||||||
bindUserId?: number;
|
bindUserId?: number;
|
||||||
bindUrl?: string;
|
bindUrl?: string;
|
||||||
|
bindUrl2?: string;
|
||||||
accountServerBaseUrl?: string;
|
accountServerBaseUrl?: string;
|
||||||
appKey?: string;
|
appKey?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**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.38.4",
|
"version": "1.38.6",
|
||||||
"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": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-cert
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-cert",
|
"name": "@certd/plugin-cert",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -17,10 +17,10 @@
|
|||||||
"compile": "tsc --skipLibCheck --watch"
|
"compile": "tsc --skipLibCheck --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.38.4",
|
"@certd/acme-client": "^1.38.6",
|
||||||
"@certd/basic": "^1.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@certd/pipeline": "^1.38.4",
|
"@certd/pipeline": "^1.38.6",
|
||||||
"@certd/plugin-lib": "^1.38.4",
|
"@certd/plugin-lib": "^1.38.6",
|
||||||
"psl": "^1.9.0",
|
"psl": "^1.9.0",
|
||||||
"punycode.js": "^2.3.1"
|
"punycode.js": "^2.3.1"
|
||||||
},
|
},
|
||||||
@@ -38,5 +38,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-lib
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-lib",
|
"name": "@certd/plugin-lib",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -22,10 +22,10 @@
|
|||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@alicloud/tea-util": "^1.4.11",
|
"@alicloud/tea-util": "^1.4.11",
|
||||||
"@aws-sdk/client-s3": "^3.964.0",
|
"@aws-sdk/client-s3": "^3.964.0",
|
||||||
"@certd/acme-client": "^1.38.4",
|
"@certd/acme-client": "^1.38.6",
|
||||||
"@certd/basic": "^1.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@certd/pipeline": "^1.38.4",
|
"@certd/pipeline": "^1.38.6",
|
||||||
"@certd/plus-core": "^1.38.4",
|
"@certd/plus-core": "^1.38.6",
|
||||||
"@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",
|
||||||
@@ -57,5 +57,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "ee6cdfb391568ad8532701a2c37ee53e88e39f75"
|
"gitHead": "1368259a1e780486204e9d814c88a741a373dcca"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,24 @@
|
|||||||
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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 当域名管理中没有域名时,创建流水线时不展开域名选择框 ([9166a57](https://github.com/certd/certd/commit/9166a579301a60750f0b72b6a42b0c8d730695fd))
|
||||||
|
* count tip ([e19743f](https://github.com/certd/certd/commit/e19743f70553700f1f91bff76f87370f749dd247))
|
||||||
|
* oauth支持github 和google, 修复头像显示问题 ([693a4a6](https://github.com/certd/certd/commit/693a4a663385ced3176286bf4b5f3566da83d90e))
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 某些情况下登陆页面没有显示重置密码文档链接的问题 ([40801d0](https://github.com/certd/certd/commit/40801d0a0668c77adb57fae42b4b6615b198a88d))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 支持绑定两个url地址 ([a2e9a41](https://github.com/certd/certd/commit/a2e9a41a7e712395c0e3ee6fe55b370aa1fc1f12))
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-client",
|
"name": "@certd/ui-client",
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --open",
|
"dev": "vite --open",
|
||||||
@@ -106,8 +106,8 @@
|
|||||||
"zod-defaults": "^0.1.3"
|
"zod-defaults": "^0.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@certd/lib-iframe": "^1.38.4",
|
"@certd/lib-iframe": "^1.38.6",
|
||||||
"@certd/pipeline": "^1.38.4",
|
"@certd/pipeline": "^1.38.6",
|
||||||
"@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",
|
||||||
|
|||||||
@@ -8,19 +8,23 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, provide, ref } from "vue";
|
import { computed, provide, Ref, ref } from "vue";
|
||||||
import { preferences, usePreferences } from "/@/vben/preferences";
|
import { preferences, usePreferences } from "/@/vben/preferences";
|
||||||
import { useAntdDesignTokens } from "/@/vben/hooks";
|
import { useAntdDesignTokens } from "/@/vben/hooks";
|
||||||
import { Modal, theme } from "ant-design-vue";
|
import { Modal, theme } from "ant-design-vue";
|
||||||
import AConfigProvider from "ant-design-vue/es/config-provider";
|
import AConfigProvider from "ant-design-vue/es/config-provider";
|
||||||
import { antdvLocale } from "./locales/antdv";
|
import { antdvLocale } from "./locales/antdv";
|
||||||
import { setI18nLanguage } from "/@/locales";
|
import { setI18nLanguage } from "/@/locales";
|
||||||
|
import { mitter } from "./utils/util.mitt";
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "App",
|
name: "App",
|
||||||
});
|
});
|
||||||
|
|
||||||
const [modal, contextHolder] = Modal.useModal();
|
const [modal, contextHolder] = Modal.useModal();
|
||||||
provide("modal", modal);
|
provide("modal", modal);
|
||||||
|
mitter.on("getModal", (event: any) => {
|
||||||
|
event.ModalRef = modal;
|
||||||
|
});
|
||||||
|
|
||||||
const locale = preferences.app.locale;
|
const locale = preferences.app.locale;
|
||||||
setI18nLanguage(locale);
|
setI18nLanguage(locale);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
:options="optionsRef"
|
:options="optionsRef"
|
||||||
:value="value"
|
:value="value"
|
||||||
v-bind="attrs"
|
v-bind="attrs"
|
||||||
|
:open="openProp"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
@update:value="emit('update:value', $event)"
|
@update:value="emit('update:value', $event)"
|
||||||
>
|
>
|
||||||
@@ -56,11 +57,11 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, defineComponent, ref, Ref, useAttrs } from "vue";
|
import { computed, defineComponent, ref, Ref, useAttrs } from "vue";
|
||||||
import { request } from "/@/api/service";
|
|
||||||
import { Dicts } from "../lib/dicts";
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { useDomainImport, useDomainImportManage } from "/@/views/certd/cert/domain/use";
|
import { Dicts } from "../lib/dicts";
|
||||||
|
import { request } from "/@/api/service";
|
||||||
import { openRouteInNewWindow } from "/@/vben/utils";
|
import { openRouteInNewWindow } from "/@/vben/utils";
|
||||||
|
import { useDomainImportManage } from "/@/views/certd/cert/domain/use";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "DomainSelector",
|
name: "DomainSelector",
|
||||||
@@ -82,6 +83,7 @@ const props = defineProps<{
|
|||||||
search?: boolean;
|
search?: boolean;
|
||||||
pager?: boolean;
|
pager?: boolean;
|
||||||
value?: any[];
|
value?: any[];
|
||||||
|
open?: boolean;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
@@ -90,6 +92,15 @@ const emit = defineEmits<{
|
|||||||
|
|
||||||
const attrs = useAttrs();
|
const attrs = useAttrs();
|
||||||
|
|
||||||
|
const hasOptions: Ref = ref(null);
|
||||||
|
|
||||||
|
const openProp = computed(() => {
|
||||||
|
if (hasOptions.value == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return hasOptions.value;
|
||||||
|
});
|
||||||
|
|
||||||
const searchKeyRef = ref("");
|
const searchKeyRef = ref("");
|
||||||
const optionsRef = ref([]);
|
const optionsRef = ref([]);
|
||||||
const message = ref("");
|
const message = ref("");
|
||||||
@@ -143,6 +154,13 @@ const getOptions = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
optionsRef.value = options;
|
optionsRef.value = options;
|
||||||
|
if (hasOptions.value == null) {
|
||||||
|
if (options.length > 0) {
|
||||||
|
hasOptions.value = true;
|
||||||
|
} else {
|
||||||
|
hasOptions.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
pagerRef.value.total = list.length;
|
pagerRef.value.total = list.length;
|
||||||
if (props.pager) {
|
if (props.pager) {
|
||||||
if (res.total != null) {
|
if (res.total != null) {
|
||||||
|
|||||||
@@ -15,3 +15,10 @@ export async function getVipTrial(vipType: string) {
|
|||||||
data: { vipType },
|
data: { vipType },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getTodayVipOrderCount() {
|
||||||
|
return await request({
|
||||||
|
url: "/sys/plus/getTodayVipOrderCount",
|
||||||
|
method: "post",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -14,16 +14,20 @@
|
|||||||
<script lang="tsx" setup>
|
<script lang="tsx" setup>
|
||||||
import { message, Modal } from "ant-design-vue";
|
import { message, Modal } from "ant-design-vue";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { computed, onMounted, reactive, ref } from "vue";
|
import { computed, onMounted, ref } from "vue";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import * as api from "./api";
|
import * as api from "./api";
|
||||||
import { useSettingStore } from "/@/store/settings";
|
import { useSettingStore } from "/src/store/settings/index";
|
||||||
import { useUserStore } from "/@/store/user";
|
import { useUserStore } from "/@/store/user";
|
||||||
import { env } from "/@/utils/util.env";
|
import { env } from "/@/utils/util.env";
|
||||||
import { mitter } from "/@/utils/util.mitt";
|
import { mitter } from "/@/utils/util.mitt";
|
||||||
|
import VipModalContent from "./vip-modal-content.vue";
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "VipButton",
|
||||||
|
});
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
@@ -39,6 +43,7 @@ type Text = {
|
|||||||
};
|
};
|
||||||
const text = computed<Text>(() => {
|
const text = computed<Text>(() => {
|
||||||
const vipLabel = settingStore.vipLabel;
|
const vipLabel = settingStore.vipLabel;
|
||||||
|
const plusMessage = settingStore.plusInfo?.message;
|
||||||
const map = {
|
const map = {
|
||||||
isComm: {
|
isComm: {
|
||||||
comm: {
|
comm: {
|
||||||
@@ -91,7 +96,7 @@ const text = computed<Text>(() => {
|
|||||||
},
|
},
|
||||||
nav: {
|
nav: {
|
||||||
name: t("vip.free.nav.name"),
|
name: t("vip.free.nav.name"),
|
||||||
title: t("vip.free.nav.title"),
|
title: plusMessage || t("vip.free.nav.title"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -113,58 +118,16 @@ const expireTime = computed(() => {
|
|||||||
|
|
||||||
const expiredDays = computed(() => {
|
const expiredDays = computed(() => {
|
||||||
if (settingStore.plusInfo?.isPlus && !settingStore.isPlus) {
|
if (settingStore.plusInfo?.isPlus && !settingStore.isPlus) {
|
||||||
//已过期多少天
|
|
||||||
const days = dayjs().diff(dayjs(settingStore.plusInfo.expireTime), "day");
|
const days = dayjs().diff(dayjs(settingStore.plusInfo.expireTime), "day");
|
||||||
return `${settingStore.vipLabel}已过期${days}天`;
|
return `${settingStore.vipLabel}已过期${days}天`;
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
});
|
});
|
||||||
|
|
||||||
const formState = reactive({
|
|
||||||
code: "",
|
|
||||||
inviteCode: "",
|
|
||||||
});
|
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
async function doActive() {
|
|
||||||
if (!formState.code) {
|
|
||||||
message.error(t("vip.enterCode"));
|
|
||||||
throw new Error(t("vip.enterCode"));
|
|
||||||
}
|
|
||||||
const res = await api.doActive(formState);
|
|
||||||
if (res) {
|
|
||||||
await settingStore.init();
|
|
||||||
const vipLabel = settingStore.vipLabel;
|
|
||||||
Modal.success({
|
|
||||||
title: t("vip.successTitle"),
|
|
||||||
content: t("vip.successContent", {
|
|
||||||
vipLabel,
|
|
||||||
expireDate: dayjs(settingStore.plusInfo.expireTime).format("YYYY-MM-DD"),
|
|
||||||
}),
|
|
||||||
onOk() {
|
|
||||||
if (!(settingStore.installInfo.bindUserId > 0)) {
|
|
||||||
Modal.confirm({
|
|
||||||
title: t("vip.bindAccountTitle"),
|
|
||||||
content: t("vip.bindAccountContent"),
|
|
||||||
onOk() {
|
|
||||||
router.push("/sys/account");
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const computedSiteId = computed(() => settingStore.installInfo?.siteId);
|
|
||||||
const [modal, contextHolder] = Modal.useModal();
|
const [modal, contextHolder] = Modal.useModal();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
|
||||||
function goAccount() {
|
|
||||||
Modal.destroyAll();
|
|
||||||
router.push("/sys/account");
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getVipTrial(vipType = "plus") {
|
async function getVipTrial(vipType = "plus") {
|
||||||
const res = await api.getVipTrial(vipType);
|
const res = await api.getVipTrial(vipType);
|
||||||
message.success(t("vip.congratulations_vip_trial", { duration: res.duration }));
|
message.success(t("vip.congratulations_vip_trial", { duration: res.duration }));
|
||||||
@@ -253,6 +216,7 @@ function openUpgrade() {
|
|||||||
throw new Error(t("vip.already_perpetual_plus"));
|
throw new Error(t("vip.already_perpetual_plus"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function goBuyPlusPage() {
|
function goBuyPlusPage() {
|
||||||
checkPerpetualPlus();
|
checkPerpetualPlus();
|
||||||
if (settingStore.isComm) {
|
if (settingStore.isComm) {
|
||||||
@@ -264,6 +228,7 @@ function openUpgrade() {
|
|||||||
}
|
}
|
||||||
window.open(goBuyUrl);
|
window.open(goBuyUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
function goBuyCommPage() {
|
function goBuyCommPage() {
|
||||||
checkPerpetualPlus();
|
checkPerpetualPlus();
|
||||||
if (settingStore.isPlus && !settingStore.isComm) {
|
if (settingStore.isPlus && !settingStore.isComm) {
|
||||||
@@ -278,75 +243,6 @@ function openUpgrade() {
|
|||||||
}
|
}
|
||||||
window.open(goBuyCommUrl);
|
window.open(goBuyCommUrl);
|
||||||
}
|
}
|
||||||
const vipTypeDefine = {
|
|
||||||
free: {
|
|
||||||
title: t("vip.basic_edition"),
|
|
||||||
desc: t("vip.community_free_version"),
|
|
||||||
type: "free",
|
|
||||||
icon: "lucide:package-open",
|
|
||||||
privilege: [t("vip.unlimited_certificate_application"), t("vip.unlimited_domain_count"), t("vip.unlimited_certificate_pipelines"), t("vip.common_deployment_plugins"), t("vip.email_webhook_notifications")],
|
|
||||||
},
|
|
||||||
plus: {
|
|
||||||
title: t("vip.professional_edition"),
|
|
||||||
desc: t("vip.open_source_support"),
|
|
||||||
type: "plus",
|
|
||||||
privilege: [t("vip.vip_group_priority"), t("vip.unlimited_site_certificate_monitoring"), t("vip.more_notification_methods"), t("vip.plugins_fully_open")],
|
|
||||||
trial: {
|
|
||||||
title: t("vip.click_to_get_7_day_trial"),
|
|
||||||
click: () => {
|
|
||||||
openStarModal("plus");
|
|
||||||
},
|
|
||||||
},
|
|
||||||
icon: "stash:thumb-up",
|
|
||||||
priceText: productInfo.plus.priceText || `¥${productInfo.plus.price}/${t("vip.years")}`,
|
|
||||||
discountText: productInfo.plus.discountText || `¥${productInfo.plus.price3}/3${t("vip.years")}`,
|
|
||||||
tooltip: productInfo.plus.tooltip,
|
|
||||||
get() {
|
|
||||||
return (
|
|
||||||
<a-tooltip title={t("vip.afdian_support_vip")}>
|
|
||||||
<a-button size="small" type="primary" onClick={goBuyPlusPage}>
|
|
||||||
{t("vip.get_after_support")}
|
|
||||||
</a-button>
|
|
||||||
</a-tooltip>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
comm: {
|
|
||||||
title: t("vip.business_edition"),
|
|
||||||
desc: t("vip.commercial_license"),
|
|
||||||
type: "comm",
|
|
||||||
icon: "vaadin:handshake",
|
|
||||||
privilege: [t("vip.all_pro_privileges"), t("vip.allow_commercial_use_modify_logo_title"), t("vip.data_statistics"), t("vip.plugin_management"), t("vip.unlimited_multi_users"), t("vip.support_user_payment")],
|
|
||||||
priceText: productInfo.comm.priceText || `¥${productInfo.comm.price}/${t("vip.years")}`,
|
|
||||||
discountText: productInfo.comm.discountText || `¥${productInfo.comm.price3}/3${t("vip.years")}`,
|
|
||||||
tooltip: productInfo.comm.tooltip,
|
|
||||||
trial: {
|
|
||||||
title: t("vip.click_to_get_7_day_trial"),
|
|
||||||
click: () => {
|
|
||||||
openStarModal("comm");
|
|
||||||
},
|
|
||||||
},
|
|
||||||
get() {
|
|
||||||
return (
|
|
||||||
<a-button size="small" type="primary" onClick={goBuyCommPage}>
|
|
||||||
{t("vip.buy")}
|
|
||||||
</a-button>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const manualActiveFlag = ref();
|
|
||||||
function showManualActivation() {
|
|
||||||
manualActiveFlag.value = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function goBindAccount() {
|
|
||||||
modalRef?.destroy();
|
|
||||||
router.push({
|
|
||||||
path: "/sys/account",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const modalRef = modal.success({
|
const modalRef = modal.success({
|
||||||
title,
|
title,
|
||||||
class: "vip-modal",
|
class: "vip-modal",
|
||||||
@@ -354,119 +250,7 @@ function openUpgrade() {
|
|||||||
okText: t("vip.close"),
|
okText: t("vip.close"),
|
||||||
width: 1100,
|
width: 1100,
|
||||||
content: () => {
|
content: () => {
|
||||||
let manualActiveBlock: any = "";
|
return <VipModalContent placeholder={placeholder} isPlus={isPlus} productInfo={productInfo} goBuyPlusPage={goBuyPlusPage} goBuyCommPage={goBuyCommPage} openStarModal={openStarModal} modalRef={modalRef} />;
|
||||||
if (manualActiveFlag.value) {
|
|
||||||
manualActiveBlock = (
|
|
||||||
<div>
|
|
||||||
<div class="mt-10">
|
|
||||||
<a-input-search class="w-2/6" v-model:value={formState.code} placeholder={placeholder} enter-button={t("vip.activate")} onSearch={doActive}></a-input-search>
|
|
||||||
</div>
|
|
||||||
<div class="mt-10">
|
|
||||||
{t("vip.activation_code_one_use")}
|
|
||||||
<a onClick={goAccount}>{t("vip.bind_account")}</a>,{t("vip.transfer_vip")}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
const vipLabel = settingStore.vipLabel;
|
|
||||||
let plusInfo: any = "";
|
|
||||||
if (isPlus) {
|
|
||||||
plusInfo = (
|
|
||||||
<div class="mt-10 flex flex-col md:flex-row ">
|
|
||||||
<span class="mr-2">
|
|
||||||
{t("vip.current")} {vipLabel} {t("vip.activated_expire_time")} {settingStore.expiresText}
|
|
||||||
</span>
|
|
||||||
<a href="https://app.handfree.work/subject/#/page/detail/1" target="_blank">
|
|
||||||
{t("vip.learn_more")}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const slots = [];
|
|
||||||
for (const key in vipTypeDefine) {
|
|
||||||
// @ts-ignore
|
|
||||||
const item = vipTypeDefine[key];
|
|
||||||
const vipBlockClass = `vip-block ${key === settingStore.plusInfo.vipType ? "current" : ""}`;
|
|
||||||
slots.push(
|
|
||||||
<div class="w-full md:w-1/3 mb-4 p-5">
|
|
||||||
<div class={vipBlockClass}>
|
|
||||||
<h3 class="block-header ">
|
|
||||||
<span class="flex-o">{item.title}</span>
|
|
||||||
{item.trial && (
|
|
||||||
<span class="trial">
|
|
||||||
<a-tooltip title={item.trial.message}>
|
|
||||||
<a onClick={item.trial.click}>{item.trial.title}</a>
|
|
||||||
</a-tooltip>
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</h3>
|
|
||||||
<div style="color:green" class="flex-o">
|
|
||||||
<fs-icon icon={item.icon} class="fs-16 flex-o" />
|
|
||||||
{item.desc}
|
|
||||||
</div>
|
|
||||||
<ul class="flex-1 privilege">
|
|
||||||
{item.privilege.map((p: string) => (
|
|
||||||
<li class="flex-baseline">
|
|
||||||
<fs-icon class="color-green" icon="ion:checkmark-sharp" />
|
|
||||||
{p}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
<div class="footer flex-between flex-vc">
|
|
||||||
<div class="price-show">
|
|
||||||
{item.priceText && (
|
|
||||||
<span class="flex">
|
|
||||||
<span class="-text">{item.priceText}</span>
|
|
||||||
<a-tooltip class="ml-5" title={item.discountText}>
|
|
||||||
<fs-icon class="pointer color-red" icon="ic:outline-discount"></fs-icon>
|
|
||||||
</a-tooltip>
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
{!item.priceText && (
|
|
||||||
<span>
|
|
||||||
<span class="price-text">{t("vip.freee")}</span>
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div class="get-show">{item.get && <div>{item.get()}</div>}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div class="mt-10 mb-10 vip-active-modal">
|
|
||||||
{productInfo.notice && (
|
|
||||||
<div class="mb-10">
|
|
||||||
<a-alert type="error" message={productInfo.notice}></a-alert>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div class="vip-type-vs">
|
|
||||||
<a-row gutter={20}>{slots}</a-row>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<a href="https://certd.docmirror.cn/guide/donate/#相关问题" target="_blank">
|
|
||||||
{t("vip.question")}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="mt-10">
|
|
||||||
<div class=" w-100 flex-col md:flex-row ">
|
|
||||||
<span>{t("vip.site_id")}:</span>
|
|
||||||
<fs-copyable v-model={computedSiteId.value} class="mr-2"></fs-copyable>
|
|
||||||
<a onClick={goBindAccount}>{t("vip.not_effective")}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{plusInfo}
|
|
||||||
<div class="mt-10 ">
|
|
||||||
<span class="mr-2">{t("vip.have_activation_code")}</span>
|
|
||||||
<span>
|
|
||||||
<a onClick={showManualActivation}>{t("vip.manual_activation")}</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="mt-10">{manualActiveBlock}</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -502,69 +286,4 @@ onMounted(() => {
|
|||||||
.text {
|
.text {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.vip-active-modal {
|
|
||||||
.vip-block {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
padding: 10px;
|
|
||||||
border: 1px solid #eee;
|
|
||||||
border-radius: 5px;
|
|
||||||
height: 275px;
|
|
||||||
line-height: 24px;
|
|
||||||
|
|
||||||
.privilege {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
//background-color: rgba(250, 237, 167, 0.79);
|
|
||||||
&.current {
|
|
||||||
border-color: green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.block-header {
|
|
||||||
padding: 0px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
.trial {
|
|
||||||
font-size: 12px;
|
|
||||||
font-wight: 400;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
padding-top: 5px;
|
|
||||||
margin-top: 0px;
|
|
||||||
border-top: 1px solid #eee;
|
|
||||||
|
|
||||||
.price-text {
|
|
||||||
font-size: 18px;
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style-type: unset;
|
|
||||||
margin-left: 0px;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.color-green {
|
|
||||||
color: green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vip-type-vs {
|
|
||||||
.privilege {
|
|
||||||
.fs-icon {
|
|
||||||
color: green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.fs-icon {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,434 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mt-10 vip-active-modal">
|
||||||
|
<div v-if="todayOrderCount.enabled" class="order-count hidden md:flex">
|
||||||
|
<div v-for="(stage, index) in todayOrderCount.stages" :key="index" class="status-item" :class="{ 'status-show': TodayVipOrderCountRef.current === index }">
|
||||||
|
<div class="background">
|
||||||
|
<img :src="stage.bg" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col order-count-text weight-bold">
|
||||||
|
<div class="count-text ml-4 flex items-center">
|
||||||
|
<fs-icon icon="noto:fire" class="fs-20 mr-2"></fs-icon>
|
||||||
|
<template v-if="stage.vipTotal > 0">
|
||||||
|
<span> 已有 </span>
|
||||||
|
<span class="count-number color-red font-bold text-2xl ml-1 mr-1"> {{ stage.vipTotal }} </span> 位小伙伴赞助,
|
||||||
|
<span>
|
||||||
|
{{ stage.title }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<span> 今日赞助 </span>
|
||||||
|
<span class="count-number color-red font-bold text-2xl ml-1 mr-1"> {{ stage.orderCount }} </span> 人,
|
||||||
|
<span>
|
||||||
|
{{ stage.title }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="productInfo.notice" class="mt-10">
|
||||||
|
<a-alert type="error" :message="productInfo.notice"></a-alert>
|
||||||
|
</div>
|
||||||
|
<div class="vip-type-vs mt-10">
|
||||||
|
<a-row :gutter="20">
|
||||||
|
<div v-for="(item, key) in vipTypeDefine" :key="key" class="w-full md:w-1/3 mb-4 p-5">
|
||||||
|
<div :class="`vip-block ${key === settingStore.plusInfo.vipType ? 'current' : ''}`">
|
||||||
|
<h3 class="block-header">
|
||||||
|
<span class="flex-o">{{ item.title }}</span>
|
||||||
|
<span v-if="item.trial" class="trial">
|
||||||
|
<a-tooltip :title="item.trial.message">
|
||||||
|
<a @click="item.trial.click">{{ item.trial.title }}</a>
|
||||||
|
</a-tooltip>
|
||||||
|
</span>
|
||||||
|
</h3>
|
||||||
|
<div style="color: green" class="flex-o">
|
||||||
|
<fs-icon :icon="item.icon" class="fs-16 flex-o" />
|
||||||
|
{{ item.desc }}
|
||||||
|
</div>
|
||||||
|
<ul class="flex-1 privilege">
|
||||||
|
<li v-for="p in item.privilege" :key="p" class="flex-baseline">
|
||||||
|
<fs-icon class="color-green" icon="ion:checkmark-sharp" />
|
||||||
|
{{ p }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="footer flex-between flex-vc">
|
||||||
|
<div class="price-show">
|
||||||
|
<span v-if="item.priceText" class="flex">
|
||||||
|
<span class="-text">{{ item.priceText }}</span>
|
||||||
|
<a-tooltip class="ml-5" :title="item.discountText">
|
||||||
|
<fs-icon class="pointer color-red" icon="ic:outline-discount"></fs-icon>
|
||||||
|
</a-tooltip>
|
||||||
|
</span>
|
||||||
|
<span v-else>
|
||||||
|
<span class="price-text">{{ t("vip.freee") }}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="get-show">
|
||||||
|
<template v-if="item.type === 'plus'">
|
||||||
|
<a-tooltip :title="t('vip.afdian_support_vip')">
|
||||||
|
<a-button size="small" type="primary" @click="goBuyPlusPage">
|
||||||
|
{{ t("vip.get_after_support") }}
|
||||||
|
</a-button>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="item.type === 'comm'">
|
||||||
|
<a-button size="small" type="primary" @click="goBuyCommPage">
|
||||||
|
{{ t("vip.buy") }}
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-row>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<a href="https://certd.docmirror.cn/guide/donate/#相关问题" target="_blank">
|
||||||
|
{{ t("vip.question") }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="mt-10">
|
||||||
|
<div class="w-100 flex-col md:flex-row">
|
||||||
|
<span>{{ t("vip.site_id") }}:</span>
|
||||||
|
<fs-copyable v-model="computedSiteId" class="mr-2"></fs-copyable>
|
||||||
|
<a @click="goBindAccount">{{ t("vip.not_effective") }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="isPlus" class="mt-10 flex flex-col md:flex-row">
|
||||||
|
<span class="mr-2"> {{ t("vip.current") }} {{ vipLabel }} {{ t("vip.activated_expire_time") }} {{ settingStore.expiresText }} </span>
|
||||||
|
<a href="https://app.handfree.work/subject/#/page/detail/1" target="_blank">
|
||||||
|
{{ t("vip.learn_more") }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="mt-10">
|
||||||
|
<span class="mr-2">{{ t("vip.have_activation_code") }}</span>
|
||||||
|
<span>
|
||||||
|
<a @click="showManualActivation">{{ t("vip.manual_activation") }}</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="manualActiveFlag" class="mt-10">
|
||||||
|
<div class="mt-10">
|
||||||
|
<a-input-search v-model:value="formState.code" class="w-2/6" :placeholder="placeholder" :enter-button="t('vip.activate')" @search="doActive"></a-input-search>
|
||||||
|
</div>
|
||||||
|
<div class="mt-10">
|
||||||
|
{{ t("vip.activation_code_one_use") }}
|
||||||
|
<a @click="goAccount">{{ t("vip.bind_account") }}</a
|
||||||
|
>,{{ t("vip.transfer_vip") }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { message, Modal } from "ant-design-vue";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
import { computed, nextTick, onMounted, onUnmounted, reactive, Ref, ref } from "vue";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import * as api from "./api";
|
||||||
|
import { useSettingStore } from "/@/store/settings";
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const router = useRouter();
|
||||||
|
const settingStore = useSettingStore();
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
placeholder: string;
|
||||||
|
isPlus: boolean;
|
||||||
|
productInfo: any;
|
||||||
|
goBuyPlusPage: () => void;
|
||||||
|
goBuyCommPage: () => void;
|
||||||
|
openStarModal: (vipType: string) => void;
|
||||||
|
modalRef: any;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const formState = reactive({
|
||||||
|
code: "",
|
||||||
|
inviteCode: "",
|
||||||
|
});
|
||||||
|
|
||||||
|
async function doActive() {
|
||||||
|
if (!formState.code) {
|
||||||
|
message.error(t("vip.enterCode"));
|
||||||
|
throw new Error(t("vip.enterCode"));
|
||||||
|
}
|
||||||
|
const res = await api.doActive(formState);
|
||||||
|
if (res) {
|
||||||
|
await settingStore.init();
|
||||||
|
const vipLabel = settingStore.vipLabel;
|
||||||
|
Modal.success({
|
||||||
|
title: t("vip.successTitle"),
|
||||||
|
content: t("vip.successContent", {
|
||||||
|
vipLabel,
|
||||||
|
expireDate: dayjs(settingStore.plusInfo.expireTime).format("YYYY-MM-DD"),
|
||||||
|
}),
|
||||||
|
onOk() {
|
||||||
|
if (!(settingStore.installInfo.bindUserId > 0)) {
|
||||||
|
Modal.confirm({
|
||||||
|
title: t("vip.bindAccountTitle"),
|
||||||
|
content: t("vip.bindAccountContent"),
|
||||||
|
onOk() {
|
||||||
|
router.push("/sys/account");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const vipLabel = computed(() => settingStore.vipLabel);
|
||||||
|
const computedSiteId = computed(() => settingStore.installInfo?.siteId);
|
||||||
|
|
||||||
|
const manualActiveFlag = ref(false);
|
||||||
|
|
||||||
|
function showManualActivation() {
|
||||||
|
manualActiveFlag.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function goAccount() {
|
||||||
|
props.modalRef?.destroy();
|
||||||
|
router.push("/sys/account");
|
||||||
|
}
|
||||||
|
|
||||||
|
function goBindAccount() {
|
||||||
|
props.modalRef?.destroy();
|
||||||
|
router.push({
|
||||||
|
path: "/sys/account",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const vipTypeDefine: any = {
|
||||||
|
free: {
|
||||||
|
title: t("vip.basic_edition"),
|
||||||
|
desc: t("vip.community_free_version"),
|
||||||
|
type: "free",
|
||||||
|
icon: "lucide:package-open",
|
||||||
|
privilege: [t("vip.unlimited_certificate_application"), t("vip.unlimited_domain_count"), t("vip.unlimited_certificate_pipelines"), t("vip.common_deployment_plugins"), t("vip.email_webhook_notifications")],
|
||||||
|
},
|
||||||
|
plus: {
|
||||||
|
title: t("vip.professional_edition"),
|
||||||
|
desc: t("vip.open_source_support"),
|
||||||
|
type: "plus",
|
||||||
|
privilege: [t("vip.vip_group_priority"), t("vip.unlimited_site_certificate_monitoring"), t("vip.more_notification_methods"), t("vip.plugins_fully_open")],
|
||||||
|
trial: {
|
||||||
|
title: t("vip.click_to_get_7_day_trial"),
|
||||||
|
click: () => {
|
||||||
|
props.openStarModal("plus");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icon: "stash:thumb-up",
|
||||||
|
priceText: props.productInfo.plus.priceText || `¥${props.productInfo.plus.price}/${t("vip.years")}`,
|
||||||
|
discountText: props.productInfo.plus.discountText || `¥${props.productInfo.plus.price3}/3${t("vip.years")}`,
|
||||||
|
tooltip: props.productInfo.plus.tooltip,
|
||||||
|
},
|
||||||
|
comm: {
|
||||||
|
title: t("vip.business_edition"),
|
||||||
|
desc: t("vip.commercial_license"),
|
||||||
|
type: "comm",
|
||||||
|
icon: "vaadin:handshake",
|
||||||
|
privilege: [t("vip.all_pro_privileges"), t("vip.allow_commercial_use_modify_logo_title"), t("vip.data_statistics"), t("vip.plugin_management"), t("vip.unlimited_multi_users"), t("vip.support_user_payment")],
|
||||||
|
priceText: props.productInfo.comm.priceText || `¥${props.productInfo.comm.price}/${t("vip.years")}`,
|
||||||
|
discountText: props.productInfo.comm.discountText || `¥${props.productInfo.comm.price3}/3${t("vip.years")}`,
|
||||||
|
tooltip: props.productInfo.comm.tooltip,
|
||||||
|
trial: {
|
||||||
|
title: t("vip.click_to_get_7_day_trial"),
|
||||||
|
click: () => {
|
||||||
|
props.openStarModal("comm");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const TodayVipOrderCountRef: Ref = ref({ enabled: false, current: 0, stages: [] });
|
||||||
|
|
||||||
|
async function getTodayVipOrderCount() {
|
||||||
|
const res = await api.getTodayVipOrderCount();
|
||||||
|
if (res) {
|
||||||
|
TodayVipOrderCountRef.value = res;
|
||||||
|
TodayVipOrderCountRef.value.current = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const todayOrderCount = computed(() => {
|
||||||
|
const countInfo = TodayVipOrderCountRef.value;
|
||||||
|
const enabled = countInfo?.enabled || false;
|
||||||
|
const orderCount = countInfo?.orderCount || 0;
|
||||||
|
for (const stage of countInfo?.stages) {
|
||||||
|
stage.orderCount = stage.countGe || 0;
|
||||||
|
}
|
||||||
|
const lastStage = countInfo?.stages?.[countInfo?.stages?.length - 1] || {};
|
||||||
|
lastStage.orderCount = orderCount;
|
||||||
|
|
||||||
|
const stages: any = [];
|
||||||
|
stages.push({
|
||||||
|
title: countInfo.title,
|
||||||
|
vipTotal: countInfo?.vipTotal || 0,
|
||||||
|
orderCount: orderCount,
|
||||||
|
bg: lastStage.bg,
|
||||||
|
});
|
||||||
|
if (lastStage.orderCount > 0) {
|
||||||
|
stages.push(lastStage);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
enabled: enabled,
|
||||||
|
stages: stages,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
async function scrollOrderCount() {
|
||||||
|
const stages = todayOrderCount.value.stages;
|
||||||
|
if (stages.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let index = 0;
|
||||||
|
const doScroll = () => {
|
||||||
|
TodayVipOrderCountRef.value.current = index;
|
||||||
|
index++;
|
||||||
|
if (index >= stages.length) {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
doScroll();
|
||||||
|
scrollOrderCountIntervalRef.value = setInterval(doScroll, 7000);
|
||||||
|
}
|
||||||
|
|
||||||
|
const scrollOrderCountIntervalRef: Ref = ref(null);
|
||||||
|
onMounted(async () => {
|
||||||
|
await getTodayVipOrderCount();
|
||||||
|
await nextTick();
|
||||||
|
await scrollOrderCount();
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
clearInterval(scrollOrderCountIntervalRef.value);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.vip-active-modal {
|
||||||
|
.order-count {
|
||||||
|
height: 80px;
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid #fee2c5;
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
.background {
|
||||||
|
border: 0px;
|
||||||
|
border-radius: 5px;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
img {
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-count-text {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 2;
|
||||||
|
padding: 10px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-evenly;
|
||||||
|
/* 左至右渐变*/
|
||||||
|
background: linear-gradient(to right, rgba(255, 217, 167, 0.5), rgba(255, 255, 255, 0));
|
||||||
|
|
||||||
|
.count-text {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #ff6600;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.count-number {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-item {
|
||||||
|
opacity: 0;
|
||||||
|
transition: all 0.7s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-show {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.vip-block {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 10px;
|
||||||
|
border: 1px solid #eee;
|
||||||
|
border-radius: 5px;
|
||||||
|
height: 275px;
|
||||||
|
line-height: 24px;
|
||||||
|
|
||||||
|
.privilege {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current {
|
||||||
|
border-color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.block-header {
|
||||||
|
padding: 0px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.trial {
|
||||||
|
font-size: 12px;
|
||||||
|
font-wight: 400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
padding-top: 5px;
|
||||||
|
margin-top: 0px;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
|
||||||
|
.price-text {
|
||||||
|
font-size: 18px;
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style-type: unset;
|
||||||
|
margin-left: 0px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.color-green {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vip-type-vs {
|
||||||
|
.privilege {
|
||||||
|
.fs-icon {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fs-icon {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -35,7 +35,13 @@ const menus = computed(() => [
|
|||||||
|
|
||||||
const avatar = computed(() => {
|
const avatar = computed(() => {
|
||||||
const avt = userStore.getUserInfo?.avatar;
|
const avt = userStore.getUserInfo?.avatar;
|
||||||
return avt ? `/api/basic/file/download?key=${avt}` : "";
|
if (!avt) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (avt.startsWith("http")) {
|
||||||
|
return avt;
|
||||||
|
}
|
||||||
|
return `/api/basic/file/download?key=${avt}`;
|
||||||
});
|
});
|
||||||
|
|
||||||
async function handleLogout() {
|
async function handleLogout() {
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ export default {
|
|||||||
},
|
},
|
||||||
customPipeline: "自定义流水线",
|
customPipeline: "自定义流水线",
|
||||||
createCertdPipeline: "创建证书流水线",
|
createCertdPipeline: "创建证书流水线",
|
||||||
commercialCertHosting: "商用证书托管",
|
commercialCertHosting: "已有证书托管",
|
||||||
tooltip: {
|
tooltip: {
|
||||||
manualUploadOwnCert: "手动上传自有证书,执行自动部署",
|
manualUploadOwnCert: "手动上传自有证书,执行自动部署",
|
||||||
noAutoApplyCommercialCert: "并不能自动申请商业证书",
|
noAutoApplyCommercialCert: "并不能自动申请商业证书",
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export type PlusInfo = {
|
|||||||
expireTime?: number;
|
expireTime?: number;
|
||||||
isPlus: boolean;
|
isPlus: boolean;
|
||||||
isComm?: boolean;
|
isComm?: boolean;
|
||||||
|
message?: string;
|
||||||
};
|
};
|
||||||
export type SysPublicSetting = {
|
export type SysPublicSetting = {
|
||||||
registerEnabled?: boolean;
|
registerEnabled?: boolean;
|
||||||
@@ -107,6 +108,8 @@ export type SysPrivateSetting = {
|
|||||||
};
|
};
|
||||||
export type SysInstallInfo = {
|
export type SysInstallInfo = {
|
||||||
siteId: string;
|
siteId: string;
|
||||||
|
bindUrl?: string;
|
||||||
|
bindUrl2?: string;
|
||||||
};
|
};
|
||||||
export type MenuItem = {
|
export type MenuItem = {
|
||||||
id: string;
|
id: string;
|
||||||
|
|||||||
+65
-14
@@ -1,5 +1,5 @@
|
|||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
import { Modal, notification } from "ant-design-vue";
|
import { notification } from "ant-design-vue";
|
||||||
import * as basicApi from "./api.basic";
|
import * as basicApi from "./api.basic";
|
||||||
import { AppInfo, HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "./api.basic";
|
import { AppInfo, HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "./api.basic";
|
||||||
import { useUserStore } from "../user";
|
import { useUserStore } from "../user";
|
||||||
@@ -20,6 +20,7 @@ export interface SettingState {
|
|||||||
installTime?: number;
|
installTime?: number;
|
||||||
bindUserId?: number;
|
bindUserId?: number;
|
||||||
bindUrl?: string;
|
bindUrl?: string;
|
||||||
|
bindUrl2?: string;
|
||||||
accountServerBaseUrl?: string;
|
accountServerBaseUrl?: string;
|
||||||
appKey?: string;
|
appKey?: string;
|
||||||
};
|
};
|
||||||
@@ -153,9 +154,11 @@ export const useSettingStore = defineStore({
|
|||||||
if (this.plusInfo?.expireTime === -1) {
|
if (this.plusInfo?.expireTime === -1) {
|
||||||
return "永久";
|
return "永久";
|
||||||
}
|
}
|
||||||
|
//@ts-ignore
|
||||||
return dayjs(this.plusInfo?.expireTime).format("YYYY-MM-DD");
|
return dayjs(this.plusInfo?.expireTime).format("YYYY-MM-DD");
|
||||||
},
|
},
|
||||||
isForever() {
|
isForever() {
|
||||||
|
//@ts-ignore
|
||||||
return this.isPlus && this.plusInfo?.expireTime === -1;
|
return this.isPlus && this.plusInfo?.expireTime === -1;
|
||||||
},
|
},
|
||||||
vipLabel(): string {
|
vipLabel(): string {
|
||||||
@@ -251,9 +254,17 @@ export const useSettingStore = defineStore({
|
|||||||
url = url.split("#")[0];
|
url = url.split("#")[0];
|
||||||
return url;
|
return url;
|
||||||
},
|
},
|
||||||
async doBindUrl() {
|
async doBindUrl(key: string = "url") {
|
||||||
const url = this.getBaseUrl();
|
const url = this.installInfo.bindUrl;
|
||||||
await basicApi.bindUrl({ url });
|
const url2 = this.installInfo.bindUrl2;
|
||||||
|
|
||||||
|
const thisUrl = this.getBaseUrl();
|
||||||
|
const form = {
|
||||||
|
url,
|
||||||
|
url2,
|
||||||
|
[key]: thisUrl,
|
||||||
|
};
|
||||||
|
await basicApi.bindUrl(form);
|
||||||
await this.loadSysSettings();
|
await this.loadSysSettings();
|
||||||
},
|
},
|
||||||
async checkUrlBound() {
|
async checkUrlBound() {
|
||||||
@@ -262,24 +273,64 @@ export const useSettingStore = defineStore({
|
|||||||
if (!userStore.isAdmin) {
|
if (!userStore.isAdmin) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const event: any = { ModalRef: null };
|
||||||
|
mitter.emit("getModal", event);
|
||||||
|
const Modal = event.ModalRef;
|
||||||
|
let modalRef: any = null;
|
||||||
const bindUrl = this.installInfo.bindUrl;
|
const bindUrl = this.installInfo.bindUrl;
|
||||||
|
const bindUrl2 = this.installInfo.bindUrl2;
|
||||||
|
|
||||||
|
const doBindRequest = async (key: string) => {
|
||||||
|
await this.doBindUrl(key);
|
||||||
|
if (modalRef) {
|
||||||
|
modalRef.destroy();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (!bindUrl) {
|
if (!bindUrl) {
|
||||||
//绑定url
|
//绑定url
|
||||||
await this.doBindUrl();
|
await this.doBindUrl("url");
|
||||||
} else {
|
} else {
|
||||||
//检查当前url 是否与绑定的url一致
|
//检查当前url 是否与绑定的url一致
|
||||||
const url = window.location.href;
|
const url = window.location.href;
|
||||||
if (!url.startsWith(bindUrl)) {
|
if (!url.startsWith(bindUrl) && !url.startsWith(bindUrl2)) {
|
||||||
Modal.confirm({
|
modalRef = Modal.warning({
|
||||||
title: "URL地址有变化",
|
title: "URL地址未绑定,是否绑定此地址?",
|
||||||
content: "以后都用这个新地址访问本系统吗?",
|
width: 500,
|
||||||
onOk: async () => {
|
keyboard: false,
|
||||||
await this.doBindUrl();
|
content: () => {
|
||||||
|
return (
|
||||||
|
<div class="p-4">
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<span>
|
||||||
|
绑定地址1:
|
||||||
|
<a-tag color="green">{bindUrl || "未占用"}</a-tag>
|
||||||
|
</span>
|
||||||
|
<a-button type="primary" onClick={() => doBindRequest("url")}>
|
||||||
|
绑定到地址1
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center justify-between mt-3">
|
||||||
|
<span>
|
||||||
|
绑定地址2:
|
||||||
|
<a-tag color="green">{bindUrl2 || "未占用"}</a-tag>
|
||||||
|
</span>
|
||||||
|
<a-button type="primary" onClick={() => doBindRequest("url2")}>
|
||||||
|
绑定到地址2
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
},
|
},
|
||||||
okText: "是的,继续",
|
onOk: async () => {
|
||||||
cancelText: "不是,回到原来的地址",
|
// await this.doBindUrl();
|
||||||
|
window.location.href = bindUrl;
|
||||||
|
},
|
||||||
|
okButtonProps: {
|
||||||
|
danger: true,
|
||||||
|
},
|
||||||
|
okText: "不,回到原来的地址",
|
||||||
|
cancelText: "不,回到原来的地址",
|
||||||
onCancel: () => {
|
onCancel: () => {
|
||||||
window.location.href = bindUrl;
|
window.location.href = bindUrl;
|
||||||
},
|
},
|
||||||
@@ -320,10 +320,25 @@ h6 {
|
|||||||
font-size: 16px !important;
|
font-size: 16px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fs-18 {
|
||||||
|
font-size: 18px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fs-20 {
|
||||||
|
font-size: 20px !important;
|
||||||
|
}
|
||||||
|
.fs-24 {
|
||||||
|
font-size: 24px !important;
|
||||||
|
}
|
||||||
|
.fs-26 {
|
||||||
|
font-size: 26px !important;
|
||||||
|
}
|
||||||
.fs-28 {
|
.fs-28 {
|
||||||
font-size: 28px !important;
|
font-size: 28px !important;
|
||||||
}
|
}
|
||||||
|
.fs-32 {
|
||||||
|
font-size: 32px !important;
|
||||||
|
}
|
||||||
.w-50\% {
|
.w-50\% {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<a-descriptions-item :label="t('authentication.username')">{{ userInfo.username }}</a-descriptions-item>
|
<a-descriptions-item :label="t('authentication.username')">{{ userInfo.username }}</a-descriptions-item>
|
||||||
<a-descriptions-item :label="t('authentication.nickName')">{{ userInfo.nickName }}</a-descriptions-item>
|
<a-descriptions-item :label="t('authentication.nickName')">{{ userInfo.nickName }}</a-descriptions-item>
|
||||||
<a-descriptions-item :label="t('authentication.avatar')">
|
<a-descriptions-item :label="t('authentication.avatar')">
|
||||||
<a-avatar v-if="userInfo.avatar" size="large" :src="'api/basic/file/download?&key=' + userInfo.avatar" style="background-color: #eee"> </a-avatar>
|
<a-avatar v-if="userInfo.avatar" size="large" :src="userAvatar" style="background-color: #eee"> </a-avatar>
|
||||||
<a-avatar v-else size="large" style="background-color: #00b4f5">
|
<a-avatar v-else size="large" style="background-color: #00b4f5">
|
||||||
{{ userInfo.username }}
|
{{ userInfo.username }}
|
||||||
</a-avatar>
|
</a-avatar>
|
||||||
@@ -108,6 +108,17 @@ async function bind(type: string) {
|
|||||||
window.location.href = loginUrl;
|
window.location.href = loginUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const userAvatar = computed(() => {
|
||||||
|
if (isEmpty(userInfo.value.avatar)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (userInfo.value.avatar.startsWith("http")) {
|
||||||
|
return userInfo.value.avatar;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "api/basic/file/download?&key=" + userInfo.value.avatar;
|
||||||
|
});
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await getUserInfo();
|
await getUserInfo();
|
||||||
await loadOauthBounds();
|
await loadOauthBounds();
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
<a-button type="primary" size="large" html-type="submit" class="submit-button"> 找回密码</a-button>
|
<a-button type="primary" size="large" html-type="submit" class="submit-button"> 找回密码</a-button>
|
||||||
|
|
||||||
<div class="mt-2 flex-between">
|
<div class="mt-2 flex-between">
|
||||||
<a v-comm="false" href="https://certd.docmirror.cn/guide/use/forgotpasswd/" target="_blank"> 管理员无绑定通信方式或MFA丢失找回 </a>
|
<a v-comm="false" href="https://certd.docmirror.cn/guide/use/forgotpasswd/" target="_blank"> 管理员忘记密码 </a>
|
||||||
|
|
||||||
<router-link :to="{ name: 'login' }"> 返回登录 </router-link>
|
<router-link :to="{ name: 'login' }"> 返回登录 </router-link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -59,6 +59,9 @@
|
|||||||
<router-link v-if="!!settingStore.sysPublic.selfServicePasswordRetrievalEnabled && !queryBindCode" :to="{ name: 'forgotPassword' }">
|
<router-link v-if="!!settingStore.sysPublic.selfServicePasswordRetrievalEnabled && !queryBindCode" :to="{ name: 'forgotPassword' }">
|
||||||
{{ t("authentication.forgotPassword") }}
|
{{ t("authentication.forgotPassword") }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
<a v-else v-comm="false" href="https://certd.docmirror.cn/guide/use/forgotpasswd/" target="_blank">
|
||||||
|
{{ t("authentication.forgotPassword") }}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<router-link v-if="hasRegisterTypeEnabled() && !queryBindCode" class="register" :to="{ name: 'register' }">
|
<router-link v-if="hasRegisterTypeEnabled() && !queryBindCode" class="register" :to="{ name: 'register' }">
|
||||||
|
|||||||
@@ -3,6 +3,29 @@
|
|||||||
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.38.6](https://github.com/certd/certd/compare/v1.38.5...v1.38.6) (2026-02-04)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复新网找错域名的bug ([bd511f9](https://github.com/certd/certd/commit/bd511f97cb7fbdcaeff7ac899f0460a5c7b41826))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* oauth支持github 和google, 修复头像显示问题 ([693a4a6](https://github.com/certd/certd/commit/693a4a663385ced3176286bf4b5f3566da83d90e))
|
||||||
|
|
||||||
|
## [1.38.5](https://github.com/certd/certd/compare/v1.38.4...v1.38.5) (2026-02-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 阿里云esa查询证书限制接口无效,改成配置证书数量上限检查方式进行清理 ([2302567](https://github.com/certd/certd/commit/230256793f8ad87ef8a0738c37108bf7b5ab9853))
|
||||||
|
* 修复部署到火山引擎vod,获取域名列表为空的bug ([0719f4c](https://github.com/certd/certd/commit/0719f4c99e9198544d03431107b53652e076e881))
|
||||||
|
* 修复oidc配置取消后获取登出地址失败后无法列出oauth列表的bug ([eb5de15](https://github.com/certd/certd/commit/eb5de150332fd914c56b812c3ba2c2445f902bb7))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 将重置密码的日志挪到启动成功之后,方便查看 ([0fa9b34](https://github.com/certd/certd/commit/0fa9b344e08cf355aee7a7566f061cc5d95dc374))
|
||||||
|
* 支持绑定两个url地址 ([a2e9a41](https://github.com/certd/certd/commit/a2e9a41a7e712395c0e3ee6fe55b370aa1fc1f12))
|
||||||
|
|
||||||
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
## [1.38.4](https://github.com/certd/certd/compare/v1.38.3...v1.38.4) (2026-01-31)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ input:
|
|||||||
component:
|
component:
|
||||||
name: api-test
|
name: api-test
|
||||||
action: TestRequest
|
action: TestRequest
|
||||||
helper: 点击测试接口是否正常
|
helper: |-
|
||||||
|
测试前请务必先在新网后台关闭异地登录保护、关闭动态口令验证
|
||||||
|
如果提示需要短信验证码,请等几个小时后再试
|
||||||
pluginType: access
|
pluginType: access
|
||||||
type: builtIn
|
type: builtIn
|
||||||
scriptFilePath: /plugins/plugin-xinnet/access.js
|
scriptFilePath: /plugins/plugin-xinnet/access.js
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
addonType: oauth
|
||||||
|
name: github
|
||||||
|
title: GitHub认证
|
||||||
|
desc: GitHub OAuth2登录
|
||||||
|
icon: simple-icons:github
|
||||||
|
showTest: false
|
||||||
|
input:
|
||||||
|
clientId:
|
||||||
|
title: ClientId
|
||||||
|
helper: '[GitHub Developer Settings](https://github.com/settings/developers)创建应用后获取'
|
||||||
|
required: true
|
||||||
|
clientSecretKey:
|
||||||
|
title: ClientSecretKey
|
||||||
|
component:
|
||||||
|
placeholder: ClientSecretKey / appSecretKey
|
||||||
|
required: true
|
||||||
|
pluginType: addon
|
||||||
|
type: builtIn
|
||||||
|
scriptFilePath: /plugins/plugin-oauth/oauth2/plugin-github.js
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
addonType: oauth
|
||||||
|
name: google
|
||||||
|
title: Google认证
|
||||||
|
desc: Google OAuth2登录
|
||||||
|
icon: simple-icons:google
|
||||||
|
showTest: false
|
||||||
|
input:
|
||||||
|
clientId:
|
||||||
|
title: ClientId
|
||||||
|
helper: >-
|
||||||
|
[Google Cloud
|
||||||
|
Console](https://console.cloud.google.com/apis/credentials)创建应用后获取
|
||||||
|
required: true
|
||||||
|
clientSecretKey:
|
||||||
|
title: ClientSecretKey
|
||||||
|
component:
|
||||||
|
placeholder: ClientSecretKey / appSecretKey
|
||||||
|
required: true
|
||||||
|
pluginType: addon
|
||||||
|
type: builtIn
|
||||||
|
scriptFilePath: /plugins/plugin-oauth/oauth2/plugin-google.js
|
||||||
@@ -98,13 +98,13 @@ input:
|
|||||||
|
|
||||||
helper: 请选择要部署证书的站点
|
helper: 请选择要部署证书的站点
|
||||||
order: 0
|
order: 0
|
||||||
isFree:
|
certLimit:
|
||||||
title: 是否免费版
|
title: 免费证书数量限制
|
||||||
value: true
|
value: 2
|
||||||
component:
|
component:
|
||||||
name: a-switch
|
name: a-input-number
|
||||||
vModel: value
|
vModel: value
|
||||||
helper: 如果是免费站点,将检查证书数量限制,如果超限将删除最旧的那张证书
|
helper: 将检查证书数量限制,如果超限将删除最旧的那张证书
|
||||||
required: true
|
required: true
|
||||||
order: 0
|
order: 0
|
||||||
output: {}
|
output: {}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ default:
|
|||||||
runStrategy: 0
|
runStrategy: 0
|
||||||
name: CertApplyUpload
|
name: CertApplyUpload
|
||||||
icon: ph:certificate
|
icon: ph:certificate
|
||||||
title: 商用证书托管
|
title: 已有证书托管
|
||||||
group: cert
|
group: cert
|
||||||
desc: 手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次)
|
desc: 手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次)
|
||||||
shortcut:
|
shortcut:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-server",
|
"name": "@certd/ui-server",
|
||||||
"version": "1.38.4",
|
"version": "1.38.6",
|
||||||
"description": "fast-server base midway",
|
"description": "fast-server base midway",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -48,20 +48,20 @@
|
|||||||
"@aws-sdk/client-iam": "^3.964.0",
|
"@aws-sdk/client-iam": "^3.964.0",
|
||||||
"@aws-sdk/client-route-53": "^3.964.0",
|
"@aws-sdk/client-route-53": "^3.964.0",
|
||||||
"@aws-sdk/client-s3": "^3.964.0",
|
"@aws-sdk/client-s3": "^3.964.0",
|
||||||
"@certd/acme-client": "^1.38.4",
|
"@certd/acme-client": "^1.38.6",
|
||||||
"@certd/basic": "^1.38.4",
|
"@certd/basic": "^1.38.6",
|
||||||
"@certd/commercial-core": "^1.38.4",
|
"@certd/commercial-core": "^1.38.6",
|
||||||
"@certd/cv4pve-api-javascript": "^8.4.2",
|
"@certd/cv4pve-api-javascript": "^8.4.2",
|
||||||
"@certd/jdcloud": "^1.38.4",
|
"@certd/jdcloud": "^1.38.6",
|
||||||
"@certd/lib-huawei": "^1.38.4",
|
"@certd/lib-huawei": "^1.38.6",
|
||||||
"@certd/lib-k8s": "^1.38.4",
|
"@certd/lib-k8s": "^1.38.6",
|
||||||
"@certd/lib-server": "^1.38.4",
|
"@certd/lib-server": "^1.38.6",
|
||||||
"@certd/midway-flyway-js": "^1.38.4",
|
"@certd/midway-flyway-js": "^1.38.6",
|
||||||
"@certd/pipeline": "^1.38.4",
|
"@certd/pipeline": "^1.38.6",
|
||||||
"@certd/plugin-cert": "^1.38.4",
|
"@certd/plugin-cert": "^1.38.6",
|
||||||
"@certd/plugin-lib": "^1.38.4",
|
"@certd/plugin-lib": "^1.38.6",
|
||||||
"@certd/plugin-plus": "^1.38.4",
|
"@certd/plugin-plus": "^1.38.6",
|
||||||
"@certd/plus-core": "^1.38.4",
|
"@certd/plus-core": "^1.38.6",
|
||||||
"@google-cloud/publicca": "^1.3.0",
|
"@google-cloud/publicca": "^1.3.0",
|
||||||
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.185",
|
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.185",
|
||||||
"@huaweicloud/huaweicloud-sdk-core": "^3.1.185",
|
"@huaweicloud/huaweicloud-sdk-core": "^3.1.185",
|
||||||
|
|||||||
@@ -22,14 +22,13 @@ export class SysPlusController extends BaseController {
|
|||||||
return this.ok(true);
|
return this.ok(true);
|
||||||
}
|
}
|
||||||
@Post('/bindUrl', { summary: 'sys:settings:edit' })
|
@Post('/bindUrl', { summary: 'sys:settings:edit' })
|
||||||
async bindUrl(@Body(ALL) body: { url: string }) {
|
async bindUrl(@Body(ALL) body: { url: string ,url2?:string }) {
|
||||||
const { url } = body;
|
const { url,url2 } = body;
|
||||||
|
|
||||||
await this.plusService.register();
|
await this.plusService.register();
|
||||||
const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
|
const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
|
||||||
await this.plusService.bindUrl(url);
|
await this.plusService.bindUrl(url,url2);
|
||||||
|
|
||||||
installInfo.bindUrl = url;
|
installInfo.bindUrl = url;
|
||||||
|
installInfo.bindUrl2 = url2;
|
||||||
await this.sysSettingsService.saveSetting(installInfo);
|
await this.sysSettingsService.saveSetting(installInfo);
|
||||||
|
|
||||||
//重新验证vip
|
//重新验证vip
|
||||||
@@ -48,6 +47,11 @@ export class SysPlusController extends BaseController {
|
|||||||
const res = await this.plusService.getVipTrial(vipType);
|
const res = await this.plusService.getVipTrial(vipType);
|
||||||
return this.ok(res);
|
return this.ok(res);
|
||||||
}
|
}
|
||||||
|
@Post('/getTodayVipOrderCount', { summary: 'sys:settings:edit' })
|
||||||
|
async getTodayVipOrderCount() {
|
||||||
|
const res = await this.plusService.getTodayOrderCount();
|
||||||
|
return this.ok(res);
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// @Get('/test', { summary: Constants.per.guest })
|
// @Get('/test', { summary: Constants.per.guest })
|
||||||
// async test() {
|
// async test() {
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
|
import { CommonException, SysSettingsService } from "@certd/lib-server";
|
||||||
import { Autoload, Config, Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
|
import { Autoload, Config, Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
|
||||||
import { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa';
|
import { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa';
|
||||||
import { CommonException, SysSettingsService } from "@certd/lib-server";
|
import { UserSettingsService } from "../../modules/mine/service/user-settings-service.js";
|
||||||
import { UserService } from '../../modules/sys/authority/service/user-service.js';
|
import { UserService } from '../../modules/sys/authority/service/user-service.js';
|
||||||
import { logger } from '@certd/basic';
|
|
||||||
import {UserSettingsService} from "../../modules/mine/service/user-settings-service.js";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 重置密码模式
|
* 重置密码模式
|
||||||
@@ -33,21 +32,6 @@ export class ResetPasswdMiddleware implements IWebMiddleware {
|
|||||||
|
|
||||||
@Init()
|
@Init()
|
||||||
async init() {
|
async init() {
|
||||||
if (this.resetAdminPasswd === true) {
|
|
||||||
logger.info('开始重置1号管理员用户的密码');
|
|
||||||
const newPasswd = '123456';
|
|
||||||
await this.userService.resetPassword(1, newPasswd);
|
|
||||||
await this.userService.updateStatus(1, 1);
|
|
||||||
await this.userSettingsService.deleteWhere({
|
|
||||||
userId: 1,
|
|
||||||
key:"user.two.factor"
|
|
||||||
})
|
|
||||||
const publicSettings = await this.sysSettingsService.getPublicSettings()
|
|
||||||
publicSettings.captchaEnabled = false
|
|
||||||
await this.sysSettingsService.savePublicSettings(publicSettings);
|
|
||||||
|
|
||||||
const user = await this.userService.info(1);
|
|
||||||
logger.info(`重置1号管理员用户的密码完成,2FA设置已删除,验证码登录已禁用,用户名:${user.username},新密码:${newPasswd},请在登录进去之后尽快修改密码`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ import { getVersion } from '../../utils/version.js';
|
|||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { Application } from '@midwayjs/koa';
|
import { Application } from '@midwayjs/koa';
|
||||||
import { httpsServer, HttpsServerOptions } from './https/server.js';
|
import { httpsServer, HttpsServerOptions } from './https/server.js';
|
||||||
|
import { UserService } from '../sys/authority/service/user-service.js';
|
||||||
|
import { UserSettingsService } from '../mine/service/user-settings-service.js';
|
||||||
|
import { startProxyServer } from './proxy/server.js';
|
||||||
|
|
||||||
@Autoload()
|
@Autoload()
|
||||||
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
||||||
@@ -22,10 +25,20 @@ export class AutoZPrint {
|
|||||||
@Config('koa')
|
@Config('koa')
|
||||||
koaConfig: any;
|
koaConfig: any;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
userService: UserService;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
userSettingsService: UserSettingsService;
|
||||||
|
|
||||||
|
@Config('system.resetAdminPasswd')
|
||||||
|
private resetAdminPasswd: boolean;
|
||||||
|
|
||||||
@Init()
|
@Init()
|
||||||
async init() {
|
async init() {
|
||||||
//监听https
|
//监听https
|
||||||
this.startHttpsServer();
|
this.startHttpsServer();
|
||||||
|
// this.startProxyServer();
|
||||||
logger.info("ENV:", process.env.NODE_ENV);
|
logger.info("ENV:", process.env.NODE_ENV);
|
||||||
if (isDev()) {
|
if (isDev()) {
|
||||||
this.startHeapLog();
|
this.startHeapLog();
|
||||||
@@ -41,6 +54,26 @@ export class AutoZPrint {
|
|||||||
}
|
}
|
||||||
logger.info('Certd已启动');
|
logger.info('Certd已启动');
|
||||||
logger.info('=========================================');
|
logger.info('=========================================');
|
||||||
|
await this.resetPasswd();
|
||||||
|
}
|
||||||
|
|
||||||
|
async resetPasswd(){
|
||||||
|
if (this.resetAdminPasswd === true) {
|
||||||
|
logger.info('开始重置1号管理员用户的密码');
|
||||||
|
const newPasswd = '123456';
|
||||||
|
await this.userService.resetPassword(1, newPasswd);
|
||||||
|
await this.userService.updateStatus(1, 1);
|
||||||
|
await this.userSettingsService.deleteWhere({
|
||||||
|
userId: 1,
|
||||||
|
key:"user.two.factor"
|
||||||
|
})
|
||||||
|
const publicSettings = await this.sysSettingsService.getPublicSettings()
|
||||||
|
publicSettings.captchaEnabled = false
|
||||||
|
await this.sysSettingsService.savePublicSettings(publicSettings);
|
||||||
|
|
||||||
|
const user = await this.userService.info(1);
|
||||||
|
logger.info(`重置1号管理员用户的密码完成,2FA设置已删除,验证码登录已禁用,用户名:${user.username},新密码:${newPasswd},请在登录进去之后尽快修改密码`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
startHeapLog() {
|
startHeapLog() {
|
||||||
@@ -66,4 +99,8 @@ export class AutoZPrint {
|
|||||||
hostname: this.httpsConfig.hostname || this.koaConfig.hostname,
|
hostname: this.httpsConfig.hostname || this.koaConfig.hostname,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
startProxyServer() {
|
||||||
|
startProxyServer({port: 7003});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
// proxy-server.js
|
||||||
|
import http from 'http';
|
||||||
|
import https from 'https';
|
||||||
|
import url from 'url';
|
||||||
|
import net from 'net';
|
||||||
|
import { logger } from '@certd/basic';
|
||||||
|
|
||||||
|
|
||||||
|
export function startProxyServer(opts:{port:number}) {
|
||||||
|
const {port} = opts;
|
||||||
|
|
||||||
|
// 创建 HTTP 代理服务器
|
||||||
|
const proxyServer = http.createServer((clientReq, clientRes) => {
|
||||||
|
logger.log(`[proxy] 收到请求: ${clientReq.method} ${clientReq.url}`);
|
||||||
|
|
||||||
|
// 解析请求的 URL
|
||||||
|
const parsedUrl = url.parse(clientReq.url);
|
||||||
|
const options = {
|
||||||
|
hostname: parsedUrl.hostname,
|
||||||
|
port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
|
||||||
|
path: parsedUrl.path,
|
||||||
|
method: clientReq.method,
|
||||||
|
headers: clientReq.headers
|
||||||
|
};
|
||||||
|
|
||||||
|
// 根据协议选择不同的模块
|
||||||
|
const protocol = parsedUrl.protocol === 'https:' ? https : http;
|
||||||
|
|
||||||
|
// 移除可能会引起问题的 headers
|
||||||
|
delete options.headers['proxy-connection'];
|
||||||
|
delete options.headers['connection'];
|
||||||
|
delete options.headers['keep-alive'];
|
||||||
|
|
||||||
|
// 创建到目标服务器的请求
|
||||||
|
const proxyReq = protocol.request(options, (proxyRes) => {
|
||||||
|
// 将目标服务器的响应返回给客户端
|
||||||
|
clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
|
||||||
|
proxyRes.pipe(clientRes);
|
||||||
|
});
|
||||||
|
|
||||||
|
proxyReq.on('error', (err) => {
|
||||||
|
logger.error('[proxy] 代理请求错误:', err);
|
||||||
|
clientRes.writeHead(500);
|
||||||
|
clientRes.end('代理服务器错误');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 将客户端请求体转发到目标服务器
|
||||||
|
clientReq.pipe(proxyReq);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 处理 CONNECT 方法(HTTPS 代理)
|
||||||
|
proxyServer.on('connect', (req, clientSocket, head) => {
|
||||||
|
logger.log(`[proxy] HTTPS 连接请求: ${req.url}`);
|
||||||
|
|
||||||
|
const [hostname, port] = req.url.split(':');
|
||||||
|
const portNum = parseInt(port) || 443;
|
||||||
|
|
||||||
|
// 连接到目标服务器
|
||||||
|
const serverSocket = net.connect(portNum, hostname, () => {
|
||||||
|
// 告诉客户端连接已建立
|
||||||
|
clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
|
||||||
|
'Proxy-agent: Node.js-Proxy\r\n' +
|
||||||
|
'\r\n');
|
||||||
|
|
||||||
|
// 建立双向数据流
|
||||||
|
serverSocket.write(head);
|
||||||
|
serverSocket.pipe(clientSocket);
|
||||||
|
clientSocket.pipe(serverSocket);
|
||||||
|
});
|
||||||
|
|
||||||
|
serverSocket.on('error', (err) => {
|
||||||
|
logger.error('[proxy] HTTPS 代理错误:', err);
|
||||||
|
clientSocket.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
clientSocket.on('error', (err) => {
|
||||||
|
logger.error('[proxy] 客户端 socket 错误:', err);
|
||||||
|
serverSocket.end();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 监听端口
|
||||||
|
proxyServer.listen(port, () => {
|
||||||
|
logger.info(`[proxy] 正向代理服务器运行在 http://0.0.0.0:${port}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
proxyServer.close(() => {
|
||||||
|
logger.info('[proxy] 正向代理服务器已关闭');
|
||||||
|
});
|
||||||
|
|
||||||
|
return proxyServer
|
||||||
|
}
|
||||||
@@ -91,17 +91,17 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
|||||||
siteIds!: string[];
|
siteIds!: string[];
|
||||||
|
|
||||||
@TaskInput({
|
@TaskInput({
|
||||||
title: "是否免费版",
|
title: "免费证书数量限制",
|
||||||
value: true,
|
value: 2,
|
||||||
component: {
|
component: {
|
||||||
name: "a-switch",
|
name: "a-input-number",
|
||||||
vModel: "value"
|
vModel: "value"
|
||||||
},
|
},
|
||||||
helper: "如果是免费站点,将检查证书数量限制,如果超限将删除最旧的那张证书",
|
helper: "将检查证书数量限制,如果超限将删除最旧的那张证书",
|
||||||
required: true
|
required: true
|
||||||
})
|
})
|
||||||
|
|
||||||
isFree: boolean;
|
certLimit: number = 2;
|
||||||
|
|
||||||
|
|
||||||
async onInstance() {
|
async onInstance() {
|
||||||
@@ -141,9 +141,7 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
|||||||
const { certId, certName } = await this.getAliyunCertId(access);
|
const { certId, certName } = await this.getAliyunCertId(access);
|
||||||
|
|
||||||
for (const siteId of this.siteIds) {
|
for (const siteId of this.siteIds) {
|
||||||
if (this.isFree) {
|
await this.clearSiteLimitCert(client, siteId);
|
||||||
await this.clearSiteLimitCert(client, siteId);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
const res = await client.doRequest({
|
const res = await client.doRequest({
|
||||||
// 接口名称
|
// 接口名称
|
||||||
@@ -254,25 +252,10 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
|||||||
|
|
||||||
|
|
||||||
async clearSiteLimitCert(client: AliyunClientV2, siteId: string) {
|
async clearSiteLimitCert(client: AliyunClientV2, siteId: string) {
|
||||||
const res = await client.doRequest({
|
|
||||||
action: "GetCertificateQuota",
|
|
||||||
version: "2024-09-10",
|
|
||||||
method: "GET",
|
|
||||||
data: {
|
|
||||||
query: {
|
|
||||||
SiteId: siteId,
|
|
||||||
Type: "free"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.logger.info(`站点[${siteId}]证书限制情况, 限制${res.Quota} ,已使用${res.QuotaUsage}`);
|
|
||||||
|
|
||||||
if (res.QuotaUsage < res.Quota) {
|
|
||||||
this.logger.info(`站点[${siteId}]证书未超限制, 无需删除`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//删除最旧的证书
|
//删除最旧的证书
|
||||||
this.logger.info(`站点[${siteId}]证书已超限制, 开始删除最旧的证书`);
|
const certLimit = this.certLimit || 2;
|
||||||
|
this.logger.info(`站点[${siteId}]证书数量检查,当前限制${certLimit}`);
|
||||||
const certListRes = await client.doRequest({
|
const certListRes = await client.doRequest({
|
||||||
action: "ListCertificates",
|
action: "ListCertificates",
|
||||||
version: "2024-09-10",
|
version: "2024-09-10",
|
||||||
@@ -290,6 +273,12 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
|||||||
this.logger.info(`站点[${siteId}]没有证书, 无需删除`);
|
this.logger.info(`站点[${siteId}]没有证书, 无需删除`);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (list.length < certLimit) {
|
||||||
|
this.logger.info(`站点[${siteId}]证书数量(${list.length})未超限制, 无需删除`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.logger.info(`站点[${siteId}]证书数量(${list.length})已超限制, 开始删除最旧的证书`);
|
||||||
|
|
||||||
let oldly:any = null;
|
let oldly:any = null;
|
||||||
for (const item of list) {
|
for (const item of list) {
|
||||||
if (!oldly) {
|
if (!oldly) {
|
||||||
@@ -308,12 +297,11 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
|||||||
data: {
|
data: {
|
||||||
query: {
|
query: {
|
||||||
SiteId: siteId,
|
SiteId: siteId,
|
||||||
Id: oldly.id
|
Id: oldly.Id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.logger.info(`最旧证书${oldly.Name}已删除`);
|
this.logger.info(`最旧证书${oldly.Name}已删除`);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import dayjs from "dayjs";
|
|||||||
@IsTaskPlugin({
|
@IsTaskPlugin({
|
||||||
name: "CertApplyUpload",
|
name: "CertApplyUpload",
|
||||||
icon: "ph:certificate",
|
icon: "ph:certificate",
|
||||||
title: "商用证书托管",
|
title: "已有证书托管",
|
||||||
group: pluginGroups.cert.key,
|
group: pluginGroups.cert.key,
|
||||||
desc: "手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次)",
|
desc: "手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次)",
|
||||||
default: {
|
default: {
|
||||||
|
|||||||
@@ -2,4 +2,6 @@ export * from './api.js'
|
|||||||
export * from './oidc/plugin-oidc.js'
|
export * from './oidc/plugin-oidc.js'
|
||||||
export * from './wx/plugin-wx.js'
|
export * from './wx/plugin-wx.js'
|
||||||
export * from './oauth2/plugin-gitee.js'
|
export * from './oauth2/plugin-gitee.js'
|
||||||
export * from './oauth2/plugin-clogin.js'
|
export * from './oauth2/plugin-clogin.js'
|
||||||
|
export * from './oauth2/plugin-github.js'
|
||||||
|
export * from './oauth2/plugin-google.js'
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import { AddonInput, BaseAddon, IsAddon } from "@certd/lib-server";
|
||||||
|
import { BuildLoginUrlReq, BuildLogoutUrlReq, IOauthProvider, OnCallbackReq } from "../api.js";
|
||||||
|
|
||||||
|
@IsAddon({
|
||||||
|
addonType: "oauth",
|
||||||
|
name: 'github',
|
||||||
|
title: 'GitHub认证',
|
||||||
|
desc: 'GitHub OAuth2登录',
|
||||||
|
icon:"simple-icons:github",
|
||||||
|
showTest: false,
|
||||||
|
})
|
||||||
|
export class GithubOauthProvider extends BaseAddon implements IOauthProvider {
|
||||||
|
|
||||||
|
@AddonInput({
|
||||||
|
title: "ClientId",
|
||||||
|
helper: "[GitHub Developer Settings](https://github.com/settings/developers)创建应用后获取",
|
||||||
|
required: true,
|
||||||
|
})
|
||||||
|
clientId = "";
|
||||||
|
|
||||||
|
@AddonInput({
|
||||||
|
title: "ClientSecretKey",
|
||||||
|
component: {
|
||||||
|
placeholder: "ClientSecretKey / appSecretKey",
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
})
|
||||||
|
clientSecretKey = "";
|
||||||
|
|
||||||
|
async buildLoginUrl(params: BuildLoginUrlReq) {
|
||||||
|
|
||||||
|
let scope = "user:email" // Scope of the access request
|
||||||
|
let state:any = {
|
||||||
|
forType: params.forType || 'login',
|
||||||
|
}
|
||||||
|
state = this.ctx.utils.hash.base64(JSON.stringify(state))
|
||||||
|
|
||||||
|
const authorizeEndpoint = "https://github.com/login/oauth/authorize"
|
||||||
|
const redirectUrl = encodeURIComponent(params.redirectUri)
|
||||||
|
const loginUrl = `${authorizeEndpoint}?client_id=${this.clientId}&redirect_uri=${redirectUrl}&response_type=code&scope=${scope}&state=${state}`
|
||||||
|
return {
|
||||||
|
loginUrl,
|
||||||
|
ticketValue: {
|
||||||
|
state,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async onCallback(req: OnCallbackReq) {
|
||||||
|
|
||||||
|
const code = req.code || ""
|
||||||
|
|
||||||
|
const tokenEndpoint = "https://github.com/login/oauth/access_token"
|
||||||
|
|
||||||
|
const uri = new URL(req.currentURL)
|
||||||
|
const redirectUri = `${uri.origin}${uri.pathname}`
|
||||||
|
const res = await this.ctx.utils.http.request( {
|
||||||
|
url: tokenEndpoint,
|
||||||
|
method: "post",
|
||||||
|
headers: {
|
||||||
|
"Accept": "application/json"
|
||||||
|
},
|
||||||
|
data:{
|
||||||
|
client_id: this.clientId,
|
||||||
|
client_secret: this.clientSecretKey,
|
||||||
|
code,
|
||||||
|
redirect_uri: redirectUri
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const tokens = res
|
||||||
|
|
||||||
|
const userInfoEndpoint = "https://api.github.com/user"
|
||||||
|
|
||||||
|
// 获取用户信息
|
||||||
|
const userInfoRes = await this.ctx.utils.http.request( {
|
||||||
|
url: userInfoEndpoint,
|
||||||
|
method: "get",
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${tokens.access_token}`,
|
||||||
|
"Accept": "application/json"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const userInfo = userInfoRes
|
||||||
|
|
||||||
|
return {
|
||||||
|
token:{
|
||||||
|
accessToken: tokens.access_token,
|
||||||
|
refreshToken: tokens.refresh_token,
|
||||||
|
expiresIn: tokens.expires_in,
|
||||||
|
},
|
||||||
|
userInfo: {
|
||||||
|
openId: userInfo.id,
|
||||||
|
nickName: userInfo.login || userInfo.name || "",
|
||||||
|
avatar: userInfo.avatar_url,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async buildLogoutUrl(params: BuildLogoutUrlReq) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import { AddonInput, BaseAddon, IsAddon } from "@certd/lib-server";
|
||||||
|
import { BuildLoginUrlReq, BuildLogoutUrlReq, IOauthProvider, OnCallbackReq } from "../api.js";
|
||||||
|
|
||||||
|
@IsAddon({
|
||||||
|
addonType: "oauth",
|
||||||
|
name: 'google',
|
||||||
|
title: 'Google认证',
|
||||||
|
desc: 'Google OAuth2登录',
|
||||||
|
icon:"simple-icons:google",
|
||||||
|
showTest: false,
|
||||||
|
})
|
||||||
|
export class GoogleOauthProvider extends BaseAddon implements IOauthProvider {
|
||||||
|
|
||||||
|
@AddonInput({
|
||||||
|
title: "ClientId",
|
||||||
|
helper: "[Google Cloud Console](https://console.cloud.google.com/apis/credentials)创建应用后获取",
|
||||||
|
required: true,
|
||||||
|
})
|
||||||
|
clientId = "";
|
||||||
|
|
||||||
|
@AddonInput({
|
||||||
|
title: "ClientSecretKey",
|
||||||
|
component: {
|
||||||
|
placeholder: "ClientSecretKey / appSecretKey",
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
})
|
||||||
|
clientSecretKey = "";
|
||||||
|
|
||||||
|
async buildLoginUrl(params: BuildLoginUrlReq) {
|
||||||
|
|
||||||
|
let scope = "email profile" // Scope of the access request
|
||||||
|
let state:any = {
|
||||||
|
forType: params.forType || 'login',
|
||||||
|
}
|
||||||
|
state = this.ctx.utils.hash.base64(JSON.stringify(state))
|
||||||
|
|
||||||
|
const authorizeEndpoint = "https://accounts.google.com/o/oauth2/auth"
|
||||||
|
const redirectUrl = encodeURIComponent(params.redirectUri)
|
||||||
|
const loginUrl = `${authorizeEndpoint}?client_id=${this.clientId}&redirect_uri=${redirectUrl}&response_type=code&scope=${scope}&state=${state}`
|
||||||
|
return {
|
||||||
|
loginUrl,
|
||||||
|
ticketValue: {
|
||||||
|
state,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async onCallback(req: OnCallbackReq) {
|
||||||
|
|
||||||
|
const code = req.code || ""
|
||||||
|
|
||||||
|
const tokenEndpoint = "https://oauth2.googleapis.com/token"
|
||||||
|
|
||||||
|
const uri = new URL(req.currentURL)
|
||||||
|
const redirectUri = `${uri.origin}${uri.pathname}`
|
||||||
|
const res = await this.ctx.utils.http.request( {
|
||||||
|
url: tokenEndpoint,
|
||||||
|
method: "post",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded"
|
||||||
|
},
|
||||||
|
data:{
|
||||||
|
client_id: this.clientId,
|
||||||
|
client_secret: this.clientSecretKey,
|
||||||
|
code,
|
||||||
|
redirect_uri: redirectUri,
|
||||||
|
grant_type: "authorization_code"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const tokens = res
|
||||||
|
|
||||||
|
const userInfoEndpoint = "https://www.googleapis.com/oauth2/v3/userinfo"
|
||||||
|
|
||||||
|
// 获取用户信息
|
||||||
|
const userInfoRes = await this.ctx.utils.http.request( {
|
||||||
|
url: userInfoEndpoint,
|
||||||
|
method: "get",
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${tokens.access_token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const userInfo = userInfoRes
|
||||||
|
|
||||||
|
return {
|
||||||
|
token:{
|
||||||
|
accessToken: tokens.access_token,
|
||||||
|
refreshToken: tokens.refresh_token,
|
||||||
|
expiresIn: tokens.expires_in,
|
||||||
|
},
|
||||||
|
userInfo: {
|
||||||
|
openId: userInfo.sub,
|
||||||
|
nickName: userInfo.name || userInfo.email || "",
|
||||||
|
avatar: userInfo.picture,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async buildLogoutUrl(params: BuildLogoutUrlReq) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -135,10 +135,17 @@ export class OidcOauthProvider extends BaseAddon implements IOauthProvider {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async buildLogoutUrl(params: BuildLogoutUrlReq) {
|
async buildLogoutUrl(params: BuildLogoutUrlReq) {
|
||||||
const { config } = await this.getClient()
|
try{
|
||||||
let logoutUrl = config.serverMetadata().end_session_endpoint
|
const { config } = await this.getClient()
|
||||||
return {
|
let logoutUrl = config.serverMetadata().end_session_endpoint
|
||||||
logoutUrl: logoutUrl,
|
return {
|
||||||
};
|
logoutUrl: logoutUrl,
|
||||||
|
};
|
||||||
|
}catch(err){
|
||||||
|
this.logger.error(`获取注销地址失败: ${err}`)
|
||||||
|
return {
|
||||||
|
logoutUrl: "",
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -174,7 +174,7 @@ export class VolcengineDeployToVOD extends AbstractTaskPlugin {
|
|||||||
action: "ListDomain",
|
action: "ListDomain",
|
||||||
body: {
|
body: {
|
||||||
SpaceName: this.spaceName,
|
SpaceName: this.spaceName,
|
||||||
Offset: 100
|
// Offset: 100
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export class XinnetAccess extends BaseAccess {
|
|||||||
name: "api-test",
|
name: "api-test",
|
||||||
action: "TestRequest"
|
action: "TestRequest"
|
||||||
},
|
},
|
||||||
helper: "点击测试接口是否正常"
|
helper: "测试前请务必先在新网后台关闭异地登录保护、关闭动态口令验证\n如果提示需要短信验证码,请等几个小时后再试"
|
||||||
})
|
})
|
||||||
testRequest = true;
|
testRequest = true;
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,19 @@ export class XinnetProvider extends AbstractDnsProvider<XinnetRecord> {
|
|||||||
if (!res.list || res.list.length == 0) {
|
if (!res.list || res.list.length == 0) {
|
||||||
throw new Error("域名不存在");
|
throw new Error("域名不存在");
|
||||||
}
|
}
|
||||||
const serviceCode = res.list[0].serviceCode;
|
|
||||||
|
let list = res.list.map((item) => ({
|
||||||
|
domainName: item.domainName,
|
||||||
|
serviceCode: item.serviceCode
|
||||||
|
}));
|
||||||
|
this.logger.info("域名列表:", JSON.stringify(list));
|
||||||
|
|
||||||
|
const domainItem = list.find((item) => item.domainName === domain);
|
||||||
|
if (!domainItem) {
|
||||||
|
throw new Error("域名(" + domain + ")不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
const serviceCode = domainItem.serviceCode;
|
||||||
|
|
||||||
const dcpCookie = await client.getDcpCookie({
|
const dcpCookie = await client.getDcpCookie({
|
||||||
serviceCode
|
serviceCode
|
||||||
|
|||||||
Generated
+44
-44
@@ -49,7 +49,7 @@ importers:
|
|||||||
packages/core/acme-client:
|
packages/core/acme-client:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../basic
|
version: link:../basic
|
||||||
'@peculiar/x509':
|
'@peculiar/x509':
|
||||||
specifier: ^1.11.0
|
specifier: ^1.11.0
|
||||||
@@ -213,10 +213,10 @@ importers:
|
|||||||
packages/core/pipeline:
|
packages/core/pipeline:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../basic
|
version: link:../basic
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../pro/plus-core
|
version: link:../../pro/plus-core
|
||||||
dayjs:
|
dayjs:
|
||||||
specifier: ^1.11.7
|
specifier: ^1.11.7
|
||||||
@@ -412,7 +412,7 @@ importers:
|
|||||||
packages/libs/lib-k8s:
|
packages/libs/lib-k8s:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@kubernetes/client-node':
|
'@kubernetes/client-node':
|
||||||
specifier: 0.21.0
|
specifier: 0.21.0
|
||||||
@@ -452,19 +452,19 @@ importers:
|
|||||||
packages/libs/lib-server:
|
packages/libs/lib-server:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/acme-client':
|
'@certd/acme-client':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../plugins/plugin-lib
|
version: link:../../plugins/plugin-lib
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../pro/plus-core
|
version: link:../../pro/plus-core
|
||||||
'@midwayjs/cache':
|
'@midwayjs/cache':
|
||||||
specifier: 3.14.0
|
specifier: 3.14.0
|
||||||
@@ -610,16 +610,16 @@ importers:
|
|||||||
packages/plugins/plugin-cert:
|
packages/plugins/plugin-cert:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/acme-client':
|
'@certd/acme-client':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../plugin-lib
|
version: link:../plugin-lib
|
||||||
psl:
|
psl:
|
||||||
specifier: ^1.9.0
|
specifier: ^1.9.0
|
||||||
@@ -683,16 +683,16 @@ importers:
|
|||||||
specifier: ^3.964.0
|
specifier: ^3.964.0
|
||||||
version: 3.964.0(aws-crt@1.26.2)
|
version: 3.964.0(aws-crt@1.26.2)
|
||||||
'@certd/acme-client':
|
'@certd/acme-client':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../pro/plus-core
|
version: link:../../pro/plus-core
|
||||||
'@kubernetes/client-node':
|
'@kubernetes/client-node':
|
||||||
specifier: 0.21.0
|
specifier: 0.21.0
|
||||||
@@ -783,16 +783,16 @@ importers:
|
|||||||
packages/pro/commercial-core:
|
packages/pro/commercial-core:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/lib-server':
|
'@certd/lib-server':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/lib-server
|
version: link:../../libs/lib-server
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../plus-core
|
version: link:../plus-core
|
||||||
'@midwayjs/core':
|
'@midwayjs/core':
|
||||||
specifier: 3.20.11
|
specifier: 3.20.11
|
||||||
@@ -865,16 +865,16 @@ importers:
|
|||||||
packages/pro/plugin-plus:
|
packages/pro/plugin-plus:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../plugins/plugin-lib
|
version: link:../../plugins/plugin-lib
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../plus-core
|
version: link:../plus-core
|
||||||
crypto-js:
|
crypto-js:
|
||||||
specifier: ^4.2.0
|
specifier: ^4.2.0
|
||||||
@@ -950,7 +950,7 @@ importers:
|
|||||||
packages/pro/plus-core:
|
packages/pro/plus-core:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
dayjs:
|
dayjs:
|
||||||
specifier: ^1.11.7
|
specifier: ^1.11.7
|
||||||
@@ -1246,10 +1246,10 @@ importers:
|
|||||||
version: 0.1.3(zod@3.24.4)
|
version: 0.1.3(zod@3.24.4)
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@certd/lib-iframe':
|
'@certd/lib-iframe':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/lib-iframe
|
version: link:../../libs/lib-iframe
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@rollup/plugin-commonjs':
|
'@rollup/plugin-commonjs':
|
||||||
specifier: ^25.0.7
|
specifier: ^25.0.7
|
||||||
@@ -1438,46 +1438,46 @@ importers:
|
|||||||
specifier: ^3.964.0
|
specifier: ^3.964.0
|
||||||
version: 3.964.0(aws-crt@1.26.2)
|
version: 3.964.0(aws-crt@1.26.2)
|
||||||
'@certd/acme-client':
|
'@certd/acme-client':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/commercial-core':
|
'@certd/commercial-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../pro/commercial-core
|
version: link:../../pro/commercial-core
|
||||||
'@certd/cv4pve-api-javascript':
|
'@certd/cv4pve-api-javascript':
|
||||||
specifier: ^8.4.2
|
specifier: ^8.4.2
|
||||||
version: 8.4.2
|
version: 8.4.2
|
||||||
'@certd/jdcloud':
|
'@certd/jdcloud':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/lib-jdcloud
|
version: link:../../libs/lib-jdcloud
|
||||||
'@certd/lib-huawei':
|
'@certd/lib-huawei':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/lib-huawei
|
version: link:../../libs/lib-huawei
|
||||||
'@certd/lib-k8s':
|
'@certd/lib-k8s':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/lib-k8s
|
version: link:../../libs/lib-k8s
|
||||||
'@certd/lib-server':
|
'@certd/lib-server':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/lib-server
|
version: link:../../libs/lib-server
|
||||||
'@certd/midway-flyway-js':
|
'@certd/midway-flyway-js':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../libs/midway-flyway-js
|
version: link:../../libs/midway-flyway-js
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-cert':
|
'@certd/plugin-cert':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../plugins/plugin-cert
|
version: link:../../plugins/plugin-cert
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../plugins/plugin-lib
|
version: link:../../plugins/plugin-lib
|
||||||
'@certd/plugin-plus':
|
'@certd/plugin-plus':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../pro/plugin-plus
|
version: link:../../pro/plugin-plus
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.38.3
|
specifier: ^1.38.5
|
||||||
version: link:../../pro/plus-core
|
version: link:../../pro/plus-core
|
||||||
'@google-cloud/publicca':
|
'@google-cloud/publicca':
|
||||||
specifier: ^1.3.0
|
specifier: ^1.3.0
|
||||||
@@ -19971,13 +19971,13 @@ snapshots:
|
|||||||
resolve: 1.22.10
|
resolve: 1.22.10
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
|
|
||||||
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8):
|
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 7.32.0
|
eslint: 7.32.0
|
||||||
prettier: 2.8.8
|
prettier: 2.8.8
|
||||||
prettier-linter-helpers: 1.0.0
|
prettier-linter-helpers: 1.0.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
eslint-config-prettier: 8.10.0(eslint@7.32.0)
|
eslint-config-prettier: 8.10.0(eslint@8.57.0)
|
||||||
|
|
||||||
eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8):
|
eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8):
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -22377,7 +22377,7 @@ snapshots:
|
|||||||
eslint: 7.32.0
|
eslint: 7.32.0
|
||||||
eslint-config-prettier: 8.10.0(eslint@7.32.0)
|
eslint-config-prettier: 8.10.0(eslint@7.32.0)
|
||||||
eslint-plugin-node: 11.1.0(eslint@7.32.0)
|
eslint-plugin-node: 11.1.0(eslint@7.32.0)
|
||||||
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8)
|
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8)
|
||||||
execa: 5.1.1
|
execa: 5.1.1
|
||||||
inquirer: 7.3.3
|
inquirer: 7.3.3
|
||||||
json5: 2.2.3
|
json5: 2.2.3
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
01:02
|
01:18
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
11
|
16
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
01:17
|
01:33
|
||||||
|
|||||||
Reference in New Issue
Block a user