mirror of
https://github.com/certd/certd.git
synced 2026-05-04 21:07:27 +08:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 112a565bf7 | |||
| 59e5c76286 | |||
| 21620ac6bd | |||
| d05129ec67 | |||
| 0998de4ae6 | |||
| 2bdf1832da | |||
| a846c4b66e | |||
| ee535895a3 | |||
| 1e549dfd43 | |||
| 6ee718a252 | |||
| 557e98c33f | |||
| 7a9eec88e8 | |||
| a7a4f66633 | |||
| a88d0a6ae1 | |||
| db87bc770e | |||
| 7b6b71cd4b | |||
| df98463325 | |||
| f7492db8bd | |||
| 70b46d4a8f |
@@ -3,6 +3,25 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复创建流水线无法选择通知的bug ([a88d0a6](https://github.com/certd/certd/commit/a88d0a6ae15cb6170d0b36e21daf89f0dbd5f681))
|
||||
* 修复流水线任务编辑页面复制粘贴按钮在夜间模式显示问题 ([1e549df](https://github.com/certd/certd/commit/1e549dfd431ed74e2bcdfce63e5f640c51603af3))
|
||||
* 修复用户管理添加用户无法上传头像的bug ([557e98c](https://github.com/certd/certd/commit/557e98c33f5462167d8f6289f70dad68bb114a97))
|
||||
* 修复自定义插件删除后没有反注册的bug ([df98463](https://github.com/certd/certd/commit/df9846332596d2afaba53e66d2897aa1c598f9c4))
|
||||
* 修复spaceship创建record报错的bug ([70b46d4](https://github.com/certd/certd/commit/70b46d4a8f89cf8eded21ebb237e8c8ce6c40d30))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 1panel支持先上传证书再选择证书 ([7a9eec8](https://github.com/certd/certd/commit/7a9eec88e8eddf40dba055c072b5b2b0f67c1407))
|
||||
* 部署到1panel面板支持mux模式 ([d05129e](https://github.com/certd/certd/commit/d05129ec67893b0b639003a4bca6878d128f56ad))
|
||||
* 流水线修改编辑之后,增加未保存提示 ([21620ac](https://github.com/certd/certd/commit/21620ac6bdeb57e43509156a77037fc07c44282a))
|
||||
* 修复检查全部某些情况下无效的bug,优化公共触发站点证书检查定时逻辑 ([ee53589](https://github.com/certd/certd/commit/ee535895a3166c6f9046963e28fa8f22f018b574))
|
||||
* 增加域名管理 子域名检查提醒 ([2bdf183](https://github.com/certd/certd/commit/2bdf1832da73a3728f3ac415837bc26e70531cd6))
|
||||
* 站点监控域名气泡增加端口显示 ([6ee718a](https://github.com/certd/certd/commit/6ee718a25265a9db2115343af9a1a01958f34b81))
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -124,6 +124,7 @@ export default defineConfig({
|
||||
{text: "子域名托管", link: "/guide/use/cert/subdomain.md"},
|
||||
{text: "流水线有效期", link: "/guide/use/pipeline/valid.md"},
|
||||
{text: "IP证书申请", link: "/guide/use/cert/ip.md"},
|
||||
{text: "企业模式", link: "/guide/use/mode/enterprise.md"},
|
||||
{text: "插件开发", link: "/guide/use/dev/plugin.md"},
|
||||
]
|
||||
},
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# 企业模式(项目管理)
|
||||
|
||||
## 模式简介
|
||||
Certd支持两种管理模式,`SaaS模式(默认)`和`企业模式`。
|
||||
|
||||
|
||||

|
||||
|
||||
## SaaS模式
|
||||
* 默认的模式,每个用户管理自己的流水线和授权资源,每个用户独立使用。
|
||||
* Certd系统作为SaaS提供证书自动申请部署服务,您的客户注册即可使用,无需自己部署
|
||||
|
||||
|
||||
## 企业模式
|
||||
|
||||
* 通过项目合作管理流水线证书和授权资源,所有用户视为企业内部员工。
|
||||
|
||||
* 当你想在企业内部使用,企业内部有多个项目,各个项目成员共同管理项目资源和证书时可以启用此模式
|
||||
|
||||
* 需要在"系统设置->管理模式"中开启`企业模式`
|
||||
|
||||

|
||||
|
||||
|
||||
::: warning
|
||||
* 建议在开始使用时固定一个合适的模式,之后就不要随意切换了。
|
||||
* 商业版不能使用企业模式,因为商业版提供功能价值在于SaaS服务,与企业模式冲突
|
||||
:::
|
||||
|
||||
### 数据迁移
|
||||
模式之间数据不互通,您可以通过个人数据迁移功能将数据转到项目之下
|
||||
|
||||
#### 个人数据迁移到项目
|
||||
注意:此操作不可逆,请谨慎操作
|
||||

|
||||
|
||||
#### 流水线数据转到其他项目
|
||||
项目之间流水线数据可以转移,依赖的授权数据会同步复制一份
|
||||
|
||||

|
||||
Binary file not shown.
|
After Width: | Height: | Size: 95 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 118 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 145 KiB |
+1
-1
@@ -9,5 +9,5 @@
|
||||
}
|
||||
},
|
||||
"npmClient": "pnpm",
|
||||
"version": "1.39.9"
|
||||
"version": "1.39.10"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/publishlab/node-acme-client/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/acme-client
|
||||
|
||||
## [1.39.9](https://github.com/publishlab/node-acme-client/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/acme-client
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"description": "Simple and unopinionated ACME client",
|
||||
"private": false,
|
||||
"author": "nmorsman",
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"module": "scr/index.js",
|
||||
"main": "src/index.js",
|
||||
@@ -18,7 +18,7 @@
|
||||
"types"
|
||||
],
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@peculiar/x509": "^1.11.0",
|
||||
"asn1js": "^3.0.5",
|
||||
"axios": "^1.9.0",
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 流水线修改编辑之后,增加未保存提示 ([21620ac](https://github.com/certd/certd/commit/21620ac6bdeb57e43509156a77037fc07c44282a))
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
@@ -1 +1 @@
|
||||
01:21
|
||||
23:43
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/basic",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -126,7 +126,7 @@ export function createAxiosService({ logger }: { logger: ILogger }) {
|
||||
if (config.skipSslVerify || config.httpProxy) {
|
||||
let rejectUnauthorized = true;
|
||||
if (config.skipSslVerify) {
|
||||
logger.info("跳过SSL验证");
|
||||
logger.info("忽略接口请求的SSL校验");
|
||||
rejectUnauthorized = false;
|
||||
}
|
||||
const proxy: any = {};
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/pipeline
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/pipeline",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -18,8 +18,8 @@
|
||||
"compile": "tsc --skipLibCheck --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/plus-core": "^1.39.9",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@certd/plus-core": "^1.39.10",
|
||||
"dayjs": "^1.11.7",
|
||||
"lodash-es": "^4.17.21",
|
||||
"reflect-metadata": "^0.1.13"
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-huawei",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"main": "./dist/bundle.js",
|
||||
"module": "./dist/bundle.js",
|
||||
"types": "./dist/d/index.d.ts",
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-iframe",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/jdcloud
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/jdcloud
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/jdcloud",
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"description": "jdcloud openApi sdk",
|
||||
"main": "./dist/bundle.js",
|
||||
"module": "./dist/bundle.js",
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-k8s",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -18,7 +18,7 @@
|
||||
"compile": "tsc --skipLibCheck --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@kubernetes/client-node": "0.21.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复自定义插件删除后没有反注册的bug ([df98463](https://github.com/certd/certd/commit/df9846332596d2afaba53e66d2897aa1c598f9c4))
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/lib-server",
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"description": "midway with flyway, sql upgrade way ",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
@@ -28,11 +28,11 @@
|
||||
],
|
||||
"license": "AGPL",
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.39.9",
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/pipeline": "^1.39.9",
|
||||
"@certd/plugin-lib": "^1.39.9",
|
||||
"@certd/plus-core": "^1.39.9",
|
||||
"@certd/acme-client": "^1.39.10",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@certd/pipeline": "^1.39.10",
|
||||
"@certd/plugin-lib": "^1.39.10",
|
||||
"@certd/plus-core": "^1.39.10",
|
||||
"@midwayjs/cache": "3.14.0",
|
||||
"@midwayjs/core": "3.20.11",
|
||||
"@midwayjs/i18n": "3.20.13",
|
||||
|
||||
@@ -76,10 +76,12 @@ export abstract class BaseService<T> {
|
||||
* @param where
|
||||
*/
|
||||
async delete(ids: string | any[], where?: any) {
|
||||
const idArr = this.resolveIdArr(ids);
|
||||
let idArr = this.resolveIdArr(ids);
|
||||
idArr = this.filterIds(idArr);
|
||||
if (idArr.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this.getRepository().delete({
|
||||
id: In(idArr),
|
||||
...where,
|
||||
@@ -94,7 +96,9 @@ export abstract class BaseService<T> {
|
||||
}
|
||||
if (typeof ids === 'string') {
|
||||
return ids.split(',');
|
||||
} else {
|
||||
} else if(!Array.isArray(ids)){
|
||||
return [ids];
|
||||
}else {
|
||||
return ids;
|
||||
}
|
||||
}
|
||||
@@ -217,6 +221,7 @@ export abstract class BaseService<T> {
|
||||
if (!Array.isArray(ids)) {
|
||||
ids = [ids];
|
||||
}
|
||||
ids = this.filterIds(ids);
|
||||
const res = await this.getRepository().find({
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
@@ -234,7 +239,16 @@ export abstract class BaseService<T> {
|
||||
throw new PermissionException('权限不足');
|
||||
}
|
||||
|
||||
filterIds(ids: any[]) {
|
||||
if (!ids) {
|
||||
throw new ValidateException('ids不能为空');
|
||||
}
|
||||
return ids.filter((item) => {
|
||||
return item!=null && item != ""
|
||||
});
|
||||
}
|
||||
async batchDelete(ids: number[], userId: number,projectId?:number) {
|
||||
ids = this.filterIds(ids);
|
||||
if(userId!=null){
|
||||
const list = await this.getRepository().find({
|
||||
where: {
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/midway-flyway-js",
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"description": "midway with flyway, sql upgrade way ",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/plugin-cert",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -17,10 +17,10 @@
|
||||
"compile": "tsc --skipLibCheck --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.39.9",
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/pipeline": "^1.39.9",
|
||||
"@certd/plugin-lib": "^1.39.9",
|
||||
"@certd/acme-client": "^1.39.10",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@certd/pipeline": "^1.39.10",
|
||||
"@certd/plugin-lib": "^1.39.10",
|
||||
"psl": "^1.9.0",
|
||||
"punycode.js": "^2.3.1"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 1panel支持先上传证书再选择证书 ([7a9eec8](https://github.com/certd/certd/commit/7a9eec88e8eddf40dba055c072b5b2b0f67c1407))
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-lib
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/plugin-lib",
|
||||
"private": false,
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -22,10 +22,10 @@
|
||||
"@alicloud/pop-core": "^1.7.10",
|
||||
"@alicloud/tea-util": "^1.4.11",
|
||||
"@aws-sdk/client-s3": "^3.964.0",
|
||||
"@certd/acme-client": "^1.39.9",
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/pipeline": "^1.39.9",
|
||||
"@certd/plus-core": "^1.39.9",
|
||||
"@certd/acme-client": "^1.39.10",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@certd/pipeline": "^1.39.10",
|
||||
"@certd/plus-core": "^1.39.10",
|
||||
"@kubernetes/client-node": "0.21.0",
|
||||
"ali-oss": "^6.22.0",
|
||||
"basic-ftp": "^5.0.5",
|
||||
|
||||
@@ -7,6 +7,9 @@ import { ILogger } from "@certd/basic";
|
||||
import dayjs from "dayjs";
|
||||
import { uniq } from "lodash-es";
|
||||
|
||||
export interface ICertInfoGetter {
|
||||
getByPipelineId: (pipelineId: number) => Promise<CertInfo>;
|
||||
}
|
||||
export type CertInfo = {
|
||||
crt: string; //fullchain证书
|
||||
key: string; //私钥
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
export const CertApplyPluginNames = [":cert:"];
|
||||
export const EVENT_CERT_APPLY_SUCCESS = "CertApply.success";
|
||||
export const EVENT_CERT_APPLY_SUCCESS = "CertApply.success";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export * from "./convert.js";
|
||||
export * from "./cert-reader.js";
|
||||
export * from "./consts.js";
|
||||
export * from "./dns-provider/index.js";
|
||||
export * from "./dns-provider/index.js";
|
||||
|
||||
@@ -44,6 +44,10 @@ export function createRemoteSelectInputDefine(opts?: {
|
||||
component?: any;
|
||||
value?: any;
|
||||
pageSize?: number;
|
||||
uploadCert?: {
|
||||
title?: string;
|
||||
columns?: Record<string, any>;
|
||||
};
|
||||
}) {
|
||||
const title = opts?.title || "请选择";
|
||||
const certDomainsInputKey = opts?.certDomainsInputKey || "certDomains";
|
||||
@@ -74,6 +78,7 @@ export function createRemoteSelectInputDefine(opts?: {
|
||||
multi,
|
||||
pageSize: opts?.pageSize,
|
||||
watches: [certDomainsInputKey, accessIdInputKey, ...watches],
|
||||
uploadCert: opts?.uploadCert,
|
||||
...opts.component,
|
||||
},
|
||||
value: opts.value,
|
||||
|
||||
@@ -3,6 +3,23 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复创建流水线无法选择通知的bug ([a88d0a6](https://github.com/certd/certd/commit/a88d0a6ae15cb6170d0b36e21daf89f0dbd5f681))
|
||||
* 修复流水线任务编辑页面复制粘贴按钮在夜间模式显示问题 ([1e549df](https://github.com/certd/certd/commit/1e549dfd431ed74e2bcdfce63e5f640c51603af3))
|
||||
* 修复用户管理添加用户无法上传头像的bug ([557e98c](https://github.com/certd/certd/commit/557e98c33f5462167d8f6289f70dad68bb114a97))
|
||||
* 修复自定义插件删除后没有反注册的bug ([df98463](https://github.com/certd/certd/commit/df9846332596d2afaba53e66d2897aa1c598f9c4))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 1panel支持先上传证书再选择证书 ([7a9eec8](https://github.com/certd/certd/commit/7a9eec88e8eddf40dba055c072b5b2b0f67c1407))
|
||||
* 流水线修改编辑之后,增加未保存提示 ([21620ac](https://github.com/certd/certd/commit/21620ac6bdeb57e43509156a77037fc07c44282a))
|
||||
* 修复检查全部某些情况下无效的bug,优化公共触发站点证书检查定时逻辑 ([ee53589](https://github.com/certd/certd/commit/ee535895a3166c6f9046963e28fa8f22f018b574))
|
||||
* 增加域名管理 子域名检查提醒 ([2bdf183](https://github.com/certd/certd/commit/2bdf1832da73a3728f3ac415837bc26e70531cd6))
|
||||
* 站点监控域名气泡增加端口显示 ([6ee718a](https://github.com/certd/certd/commit/6ee718a25265a9db2115343af9a1a01958f34b81))
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/ui-client",
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite --open",
|
||||
@@ -106,8 +106,8 @@
|
||||
"zod-defaults": "^0.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@certd/lib-iframe": "^1.39.9",
|
||||
"@certd/pipeline": "^1.39.9",
|
||||
"@certd/lib-iframe": "^1.39.10",
|
||||
"@certd/pipeline": "^1.39.10",
|
||||
"@rollup/plugin-commonjs": "^25.0.7",
|
||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||
"@types/chai": "^4.3.12",
|
||||
|
||||
@@ -13,13 +13,11 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import parser from "cron-parser";
|
||||
import { computed, ref } from "vue";
|
||||
import dayjs from "dayjs";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import { getCronNextTimes } from "/@/components/cron-editor/utils";
|
||||
|
||||
const { t } = useI18n();
|
||||
import { getCronNextTimes } from "/@/components/cron-editor/utils";
|
||||
defineOptions({
|
||||
name: "CronEditor",
|
||||
});
|
||||
|
||||
+3
-4
@@ -2,7 +2,7 @@
|
||||
<div class="domains-verify-plan-editor" :class="{ fullscreen }">
|
||||
<div class="fullscreen-modal" @click="fullscreenExit"></div>
|
||||
<div class="plan-wrapper">
|
||||
<div class="plan-box">
|
||||
<div class="plan-box bg-white dark:bg-neutral-700">
|
||||
<div class="fullscreen-button pointer flex-center" @click="fullscreen = !fullscreen">
|
||||
<span v-if="!fullscreen" style="font-size: 10px" class="flex-center">
|
||||
这里可以放大
|
||||
@@ -273,7 +273,7 @@ watch(
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(74, 74, 74, 0.78);
|
||||
// background-color: rgba(74, 74, 74, 0.78);
|
||||
z-index: 1000;
|
||||
margin: auto;
|
||||
display: flex;
|
||||
@@ -287,7 +287,6 @@ watch(
|
||||
.plan-box {
|
||||
position: relative;
|
||||
margin: auto;
|
||||
background-color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -315,7 +314,7 @@ watch(
|
||||
height: 100%;
|
||||
//table-layout: fixed;
|
||||
th {
|
||||
background-color: #f5f5f5;
|
||||
// background-color: #f5f5f5;
|
||||
border-top: 1px solid #e8e8e8;
|
||||
border-left: 1px solid #e8e8e8;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
|
||||
@@ -33,7 +33,7 @@ export default {
|
||||
async function onCreate() {
|
||||
await pluginStore.init();
|
||||
options.value = pluginStore.group.getPreStepOutputOptions({
|
||||
pipeline: pipeline.value,
|
||||
pipeline: pipeline?.value,
|
||||
currentStageIndex: currentStageIndex.value,
|
||||
currentTaskIndex: currentTaskIndex.value,
|
||||
currentStepIndex: currentStepIndex.value,
|
||||
|
||||
@@ -25,8 +25,9 @@
|
||||
</div>
|
||||
</template>
|
||||
</a-select>
|
||||
<div class="ml-5">
|
||||
<div class="ml-5 flex flex-row no-wrap">
|
||||
<fs-button :loading="loading" title="刷新选项" icon="ion:refresh-outline" @click="refreshOptions"></fs-button>
|
||||
<UploadCert v-if="uploadCert" class="ml-5" v-bind="uploadCert" @submit="refreshOptions"></UploadCert>
|
||||
</div>
|
||||
</div>
|
||||
<div class="helper" :class="{ error: hasError }">
|
||||
@@ -39,6 +40,8 @@ import { ComponentPropsType, doRequest } from "/@/components/plugins/lib";
|
||||
import { defineComponent, inject, ref, useAttrs, watch, Ref } from "vue";
|
||||
import { PluginDefine } from "@certd/pipeline";
|
||||
import { getInputFromForm } from "./utils";
|
||||
import UploadCert from "./upload-cert.vue";
|
||||
import { UploadCertProps } from "./types";
|
||||
|
||||
defineOptions({
|
||||
name: "RemoteSelect",
|
||||
@@ -65,9 +68,10 @@ const props = defineProps<
|
||||
pager?: boolean;
|
||||
multi?: boolean;
|
||||
pageSize?: number;
|
||||
uploadCert?: UploadCertProps;
|
||||
} & ComponentPropsType
|
||||
>();
|
||||
|
||||
debugger;
|
||||
const emit = defineEmits<{
|
||||
"update:value": any;
|
||||
}>();
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
export interface UploadCertProps {
|
||||
title?: string;
|
||||
columns?: Record<string, any>;
|
||||
button?: any;
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
<template>
|
||||
<div class="upload-cert">
|
||||
<fs-button v-model:loading="loading" type="primary" text="上传" v-bind="props.button" @click="openUploadCertDialog"></fs-button>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { message } from "ant-design-vue";
|
||||
import { useFormDialog } from "../../../use/use-dialog";
|
||||
import { computed, inject, ref } from "vue";
|
||||
import { doRequest } from "../lib";
|
||||
import { getInputFromForm } from "./utils";
|
||||
import { UploadCertProps } from "./types";
|
||||
import { merge } from "lodash-es";
|
||||
|
||||
const props = defineProps<UploadCertProps>();
|
||||
const loading = ref(false);
|
||||
|
||||
const emit = defineEmits(["submit"]);
|
||||
const { openFormDialog } = useFormDialog();
|
||||
const pipeline = inject("pipeline", null);
|
||||
|
||||
const getCurrentPluginDefine: any = inject("getCurrentPluginDefine", () => {
|
||||
return {};
|
||||
});
|
||||
const getScope: any = inject("get:scope", () => {
|
||||
return {};
|
||||
});
|
||||
const getPluginType: any = inject("get:plugin:type", () => {
|
||||
return "plugin";
|
||||
});
|
||||
const title = computed(() => props.title || "上传证书");
|
||||
function openUploadCertDialog() {
|
||||
const columns = merge(
|
||||
{
|
||||
certName: {
|
||||
title: "证书名称",
|
||||
form: {
|
||||
component: {
|
||||
name: "a-input",
|
||||
vModel: "value",
|
||||
},
|
||||
helper: "上传后证书显示名称",
|
||||
},
|
||||
},
|
||||
},
|
||||
props.columns
|
||||
);
|
||||
openFormDialog({
|
||||
title: title.value,
|
||||
columns: {
|
||||
certName: {
|
||||
title: "证书名称",
|
||||
form: {
|
||||
component: {
|
||||
name: "a-input",
|
||||
vModel: "value",
|
||||
},
|
||||
},
|
||||
},
|
||||
...props.columns,
|
||||
},
|
||||
onSubmit: async (form: any) => {
|
||||
const pluginType = getPluginType();
|
||||
const scope = getScope();
|
||||
const { input, record } = getInputFromForm(scope.form, pluginType);
|
||||
loading.value = true;
|
||||
try {
|
||||
const res = await doRequest(
|
||||
{
|
||||
type: pluginType,
|
||||
typeName: scope.form.type,
|
||||
action: "onUploadCert",
|
||||
input,
|
||||
record,
|
||||
data: {
|
||||
pipelineId: pipeline?.value?.id,
|
||||
...form,
|
||||
},
|
||||
},
|
||||
{
|
||||
// onError(err: any) {
|
||||
// message.error(err.message);
|
||||
// },
|
||||
showErrorNotify: true,
|
||||
}
|
||||
);
|
||||
message.success("上传成功");
|
||||
emit("submit");
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<style lang="less">
|
||||
.upload-cert {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
<div class="step-item overflow-hidden">
|
||||
<div class="text">
|
||||
<h3 class="title">{{ number }} {{ currentStepItem.title }}</h3>
|
||||
<h3 class="title font-bold">{{ number }} {{ currentStepItem.title }}</h3>
|
||||
<div class="description mt-5">
|
||||
<div v-for="(desc, index) of currentStepItem.descriptions" :key="index">{{ desc }}</div>
|
||||
</div>
|
||||
@@ -247,6 +247,7 @@ function previewMask() {
|
||||
|
||||
<style lang="less">
|
||||
.tutorial-steps {
|
||||
display: flex;
|
||||
.step-item {
|
||||
display: flex !important;
|
||||
flex-direction: row;
|
||||
|
||||
@@ -251,7 +251,7 @@ function openUpgrade() {
|
||||
class: "vip-modal",
|
||||
maskClosable: true,
|
||||
okText: t("vip.close"),
|
||||
width: 1100,
|
||||
width: 1180,
|
||||
content: () => {
|
||||
return <VipModalContent placeholder={placeholder} isPlus={isPlus} productInfo={productInfo} goBuyPlusPage={goBuyPlusPage} goBuyCommPage={goBuyCommPage} openStarModal={openStarModal} modalRef={modalRef} />;
|
||||
},
|
||||
|
||||
@@ -65,6 +65,11 @@
|
||||
</div>
|
||||
<div class="get-show">
|
||||
<template v-if="item.type === 'plus'">
|
||||
<span v-if="todayOrderCount.showVipTotal" class="mr-5">
|
||||
已有
|
||||
<span class="color-red"> {{ todayOrderCount.vipTotal }}</span>
|
||||
位伙伴支持
|
||||
</span>
|
||||
<a-tooltip :title="t('vip.afdian_support_vip')">
|
||||
<a-button size="small" type="primary" @click="goBuyPlusPage">
|
||||
{{ t("vip.get_after_support") }}
|
||||
@@ -204,13 +209,13 @@ const vipTypeDefine: any = {
|
||||
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")],
|
||||
privilege: t("vip.free_privilege").split("\n"),
|
||||
},
|
||||
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")],
|
||||
privilege: t("vip.plus_privilege").split("\n"),
|
||||
trial: {
|
||||
title: t("vip.click_to_get_7_day_trial"),
|
||||
click: () => {
|
||||
@@ -227,7 +232,7 @@ const vipTypeDefine: any = {
|
||||
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")],
|
||||
privilege: t("vip.comm_privilege").split("\n"),
|
||||
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,
|
||||
@@ -260,12 +265,16 @@ const todayOrderCount = computed(() => {
|
||||
const lastStage = countInfo?.stages?.[countInfo?.stages?.length - 1] || {};
|
||||
lastStage.orderCount = orderCount;
|
||||
|
||||
const vipTotal = countInfo?.vipTotal || 0;
|
||||
const showVipTotal = countInfo?.showVipTotal || false;
|
||||
const userTotal = countInfo?.userTotal || 0;
|
||||
const stages: any = [];
|
||||
stages.push({
|
||||
title: countInfo.title,
|
||||
vipTotal: countInfo?.vipTotal || 0,
|
||||
orderCount: orderCount,
|
||||
bg: lastStage.bg,
|
||||
showVipTotal: showVipTotal,
|
||||
});
|
||||
if (lastStage.orderCount > 0) {
|
||||
stages.push(lastStage);
|
||||
@@ -273,6 +282,9 @@ const todayOrderCount = computed(() => {
|
||||
return {
|
||||
enabled: enabled,
|
||||
stages: stages,
|
||||
showVipTotal: showVipTotal,
|
||||
vipTotal: vipTotal,
|
||||
userTotal: userTotal,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@ export default {
|
||||
unlimited_certificate_pipelines: "Unlimited certificate pipelines",
|
||||
common_deployment_plugins: "Common host, cloud platform, CDN, Baota, 1Panel deployment plugins",
|
||||
email_webhook_notifications: "Email, webhook notification methods",
|
||||
free_privilege: "Unlimited certificate applications\nUnlimited domain count\nUnlimited certificate pipelines\nCommon host, cloud platform, CDN, Baota, 1Panel deployment plugins\nEmail, webhook notification methods",
|
||||
|
||||
professional_edition: "Professional Edition",
|
||||
open_source_support: "Open source requires your sponsorship support",
|
||||
@@ -60,10 +61,11 @@ export default {
|
||||
unlimited_site_certificate_monitoring: "Unlimited site certificate monitoring",
|
||||
more_notification_methods: "More notification methods",
|
||||
plugins_fully_open: "All plugins open, including Synology and more",
|
||||
plus_privilege: "Access to VIP group, your requests will have priority\nUnlimited site certificate monitoring\nMore notification methods\nAll plugins open, including Synology and more",
|
||||
click_to_get_7_day_trial: "Click to get 7-day trial",
|
||||
years: "years",
|
||||
afdian_support_vip: "Obtain the permanent professional version coupon",
|
||||
get_after_support: "Get after sponsoring",
|
||||
get_after_support: "sponsoring",
|
||||
|
||||
business_edition: "Business Edition",
|
||||
commercial_license: "Commercial license, allowed for external operation",
|
||||
@@ -73,6 +75,7 @@ export default {
|
||||
plugin_management: "Plugin management",
|
||||
unlimited_multi_users: "Unlimited multi-users",
|
||||
support_user_payment: "Supports user payments",
|
||||
comm_privilege: "All professional edition privileges\nAllows commercial use, can modify logo and title\nData statistics\nPlugin management\nUnlimited multi-users\nSupports user payments",
|
||||
contact_author_for_trial: "Buy It Now",
|
||||
activate: "Activate",
|
||||
get_pro_code_after_support: "Go to sponsoring",
|
||||
|
||||
@@ -33,7 +33,7 @@ export default {
|
||||
activateCertDesc2: "让证书生效",
|
||||
taskSuccessTitle: "部署任务添加成功",
|
||||
taskSuccessDesc: "现在可以运行",
|
||||
pluginsTitle: "本系统提供茫茫多的部署插件",
|
||||
pluginsTitle: "本系统提供海量的部署插件",
|
||||
pluginsDesc: "您可以根据自身需求将证书部署到各种应用和平台",
|
||||
},
|
||||
},
|
||||
|
||||
@@ -53,6 +53,7 @@ export default {
|
||||
unlimited_certificate_pipelines: "证书流水线数量无限制",
|
||||
common_deployment_plugins: "常用的主机、云平台、cdn、宝塔、1Panel等部署插件",
|
||||
email_webhook_notifications: "邮件、webhook通知方式",
|
||||
free_privilege: "证书申请无限制\n域名数量无限制\n证书流水线数量无限制\n常用的主机、云平台、cdn、宝塔、1Panel等部署插件\n邮件、webhook通知方式",
|
||||
|
||||
professional_edition: "专业版",
|
||||
open_source_support: "开源需要您的赞助支持,个人和企业内部使用",
|
||||
@@ -60,6 +61,7 @@ export default {
|
||||
unlimited_site_certificate_monitoring: "站点证书监控无限制",
|
||||
more_notification_methods: "更多通知方式",
|
||||
plugins_fully_open: "插件全开放,群晖等更多插件",
|
||||
plus_privilege: "可加VIP群,您的需求将优先实现\n站点证书监控无限制\n更多通知方式\n插件全开放,群晖等更多插件\n企业模式,项目管理\n域名到期监控\n第三方登录,PassKey登录",
|
||||
click_to_get_7_day_trial: "点击获取7天试用",
|
||||
years: "年",
|
||||
afdian_support_vip: "新用户开通永久专业版立享50优惠券",
|
||||
@@ -73,6 +75,7 @@ export default {
|
||||
plugin_management: "插件管理",
|
||||
unlimited_multi_users: "多用户无限制",
|
||||
support_user_payment: "支持用户支付(购买套餐,按流水线条数、域名数量、部署次数计费)",
|
||||
comm_privilege: "拥有专业版所有特权\n允许商用,可修改logo、标题\n数据统计\n插件管理\n多用户无限制\n支持用户支付(购买套餐,按流水线条数、域名数量、部署次数计费)",
|
||||
activate: "激活",
|
||||
get_pro_code_after_support: "前往获取",
|
||||
business_contact_author: "",
|
||||
|
||||
@@ -130,4 +130,16 @@ button.ant-btn.ant-btn-default.isPlus{
|
||||
background-color: rgba(50, 54, 57, 0.04);
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.dark{
|
||||
button.ant-btn.ant-btn-default.isPlus{
|
||||
color: #c5913f;
|
||||
border: 1px solid #c5913f;
|
||||
|
||||
&:disabled {
|
||||
border-color: hsl(0, 0%, 31%);
|
||||
color: rgba(233, 233, 233, 0.25);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -131,7 +131,7 @@ const userStore = useUserStore();
|
||||
const projectStore = useProjectStore();
|
||||
async function emitValue(value: any) {
|
||||
// target.value = optionsDictRef.dataMap[value];
|
||||
if (pipeline.value) {
|
||||
if (pipeline?.value) {
|
||||
const userId = userStore.userInfo.id;
|
||||
const isEnterprice = projectStore.isEnterprise;
|
||||
if (isEnterprice) {
|
||||
|
||||
@@ -99,3 +99,11 @@ export async function SyncExpirationStatus() {
|
||||
method: "post",
|
||||
});
|
||||
}
|
||||
|
||||
export async function IsSubdomain(body: any) {
|
||||
return await request({
|
||||
url: apiPrefix + "/isSubdomain",
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -52,6 +52,8 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
});
|
||||
|
||||
const openDomainImportManageDialog = useDomainImportManage();
|
||||
|
||||
const subdomainConfirmed = ref(false);
|
||||
return {
|
||||
crudOptions: {
|
||||
settings: {
|
||||
@@ -85,10 +87,29 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
fixed: "right",
|
||||
},
|
||||
form: {
|
||||
beforeSubmit({ form }) {
|
||||
async beforeSubmit({ form }) {
|
||||
if (form.challengeType === "cname") {
|
||||
throw new Error("CNAME方式请前往CNAME记录页面进行管理");
|
||||
}
|
||||
if (form.challengeType === "dns") {
|
||||
const isSubdomain = await api.IsSubdomain({ domain: form.domain });
|
||||
if (isSubdomain && !subdomainConfirmed.value) {
|
||||
Modal.confirm({
|
||||
title: "子域名确认",
|
||||
content: `检测到${form.domain}为子域名,只有托管子域名和免费二级子域名才需要在此处维护,否则会导致申请证书失败,请确认是否继续?`,
|
||||
okText: "确认",
|
||||
okType: "danger",
|
||||
onOk: () => {
|
||||
subdomainConfirmed.value = true;
|
||||
crudExpose.getFormWrapperRef().submit();
|
||||
},
|
||||
});
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
afterSubmit({ form }) {
|
||||
subdomainConfirmed.value = false;
|
||||
},
|
||||
},
|
||||
actionbar: {
|
||||
@@ -163,6 +184,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
},
|
||||
form: {
|
||||
required: true,
|
||||
helper: "注意:DNS校验方式下,子域名不需要在此处维护,否则会影响证书申请(子域名托管或免费二级域名除外)",
|
||||
},
|
||||
editForm: {
|
||||
component: {
|
||||
|
||||
@@ -346,12 +346,13 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
width: 230,
|
||||
sorter: true,
|
||||
cellRender({ value, row }) {
|
||||
const url = `https://${value}:${row.httpsPort}`;
|
||||
const domainPort = value + ":" + row.httpsPort;
|
||||
const url = `https://${domainPort}`;
|
||||
return (
|
||||
<a-tooltip title={value} placement="left">
|
||||
<fs-copyable modelValue={value}>
|
||||
<a-tooltip title={domainPort} placement="left">
|
||||
<fs-copyable modelValue={domainPort} title={domainPort}>
|
||||
<a target="_blank" href={url}>
|
||||
{value}:{row.httpsPort}
|
||||
{domainPort}
|
||||
</a>
|
||||
</fs-copyable>
|
||||
</a-tooltip>
|
||||
|
||||
+13
-10
@@ -134,18 +134,21 @@ async function emitValue(value: any) {
|
||||
const userId = userStore.userInfo.id;
|
||||
const isEnterprice = projectStore.isEnterprise;
|
||||
|
||||
if (isEnterprice) {
|
||||
const projectId = projectStore.currentProjectId;
|
||||
if (pipeline?.value?.projectId !== projectId) {
|
||||
message.error("对不起,您不能修改其他项目流水线的通知");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (pipeline?.value?.userId !== userId) {
|
||||
message.error("对不起,您不能修改他人流水线的通知");
|
||||
return;
|
||||
if (pipeline?.value) {
|
||||
if (isEnterprice) {
|
||||
const projectId = projectStore.currentProjectId;
|
||||
if (pipeline?.value?.projectId !== projectId) {
|
||||
message.error("对不起,您不能修改其他项目流水线的通知");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (pipeline?.value?.userId !== userId) {
|
||||
message.error("对不起,您不能修改他人流水线的通知");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
emit("change", value);
|
||||
emit("update:modelValue", value);
|
||||
}
|
||||
|
||||
+20
@@ -24,6 +24,9 @@
|
||||
</a-tabs>
|
||||
<template #footer>
|
||||
<fs-button v-if="settingsStore.sysPublic.aiChatEnabled !== false" key="aiChat" :tooltip="{ title: 'AI分析异常' }" type="primary" icon="ion:color-wand-outline" @click="taskModal.onAiChat">AI分析</fs-button>
|
||||
<!-- <fs-button v-if="!settingsStore.isComm && currentStatus === 'error'" key="1v1" :tooltip="{ title: '升级专业版,获得一对一分析服务,为您排忧解难' }" class="isPlus" icon="imingcute:vip-1-line" @click="callService">
|
||||
呼叫专家
|
||||
</fs-button> -->
|
||||
<fs-button key="rerun" type="primary" :tooltip="{ title: '强制重新执行此步骤' }" text="重新运行" icon="icon-park-outline:replay-music" @click="triggerRun(activeKey)"></fs-button>
|
||||
<fs-button key="downloadLogs" type="primary" :tooltip="{ title: '当前任务日志下载' }" icon="ion:arrow-down-circle-outline" @click="taskModal.onDownloadLogs">下载日志</fs-button>
|
||||
<fs-button key="cancel" :tooltip="{ title: '关闭窗口' }" icon="ion:close-circle-outline" @click="taskModal.onOk">关闭</fs-button>
|
||||
@@ -39,6 +42,7 @@ import PiStatusShow from "/@/views/certd/pipeline/pipeline/component/status-show
|
||||
import { usePreferences } from "/@/vben/preferences";
|
||||
import { useSettingStore } from "/@/store/settings/index";
|
||||
import { notification } from "ant-design-vue";
|
||||
import { mitter } from "/@/utils/util.mitt";
|
||||
export default {
|
||||
name: "PiTaskView",
|
||||
components: { PiStatusShow },
|
||||
@@ -196,6 +200,19 @@ export default {
|
||||
taskModal.value.open = false;
|
||||
}
|
||||
|
||||
const currentNode = computed(() => {
|
||||
return detail.value?.nodes?.find(item => item.node.id === activeKey.value);
|
||||
});
|
||||
const currentStatus = computed(() => {
|
||||
return currentNode.value?.node?.status?.result || "";
|
||||
});
|
||||
|
||||
function callService() {
|
||||
if (!settingsStore.isPlus) {
|
||||
mitter.emit("openVipModal");
|
||||
}
|
||||
}
|
||||
|
||||
const settingsStore = useSettingStore();
|
||||
return {
|
||||
detail,
|
||||
@@ -206,6 +223,9 @@ export default {
|
||||
tabPosition,
|
||||
triggerRun,
|
||||
settingsStore,
|
||||
currentNode,
|
||||
currentStatus,
|
||||
callService,
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -334,7 +334,7 @@ import { useCertViewer } from "/@/views/certd/pipeline/use";
|
||||
import { useI18n } from "/@/locales";
|
||||
import TriggerIcon from "./component/trigger-icon.vue";
|
||||
import { useCrudPermission } from "/@/plugin/permission";
|
||||
|
||||
import { onBeforeRouteLeave } from "vue-router";
|
||||
export default defineComponent({
|
||||
name: "PipelineEdit",
|
||||
// eslint-disable-next-line vue/no-unused-components
|
||||
@@ -372,10 +372,22 @@ export default defineComponent({
|
||||
},
|
||||
emits: ["update:modelValue", "update:editMode"],
|
||||
setup(props, ctx) {
|
||||
onBeforeRouteLeave((to, from) => {
|
||||
const newPipelineStr = JSON.stringify(pipeline.value || {});
|
||||
if (pipelineOriginStr.value && pipelineOriginStr.value !== newPipelineStr) {
|
||||
const answer = window.confirm("流水线还未保存,确定要离开吗?");
|
||||
if (!answer) {
|
||||
return false; // 返回 false 即可阻止本次路由跳转
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
const { t } = useI18n();
|
||||
//右侧选中的pipeline
|
||||
const currentPipeline: Ref<any> = ref({});
|
||||
const pipeline: Ref<any> = ref({});
|
||||
const pipelineOriginStr = ref("");
|
||||
const pipelineDetail: Ref<any> = ref({});
|
||||
const histories: Ref<RunHistory[]> = ref([]);
|
||||
|
||||
@@ -423,6 +435,7 @@ export default defineComponent({
|
||||
await loadCurrentHistoryDetail();
|
||||
pipeline.value = currentHistory.value.pipeline;
|
||||
currentPipeline.value = currentHistory.value.pipeline;
|
||||
pipelineOriginStr.value = JSON.stringify(pipeline.value);
|
||||
};
|
||||
|
||||
async function loadHistoryList(reload = false, historyId: number = null) {
|
||||
@@ -880,6 +893,7 @@ export default defineComponent({
|
||||
pipeline.value.version = version;
|
||||
currentPipeline.value.version = version;
|
||||
}
|
||||
pipelineOriginStr.value = JSON.stringify(pipeline.value);
|
||||
}
|
||||
if (offEdit) {
|
||||
toggleEditMode(false);
|
||||
|
||||
@@ -118,6 +118,10 @@ export function useTransfer() {
|
||||
<div class="text-2xl font-bold"> 迁移到→ </div>
|
||||
<div>项目:"{projectStore.currentProject?.name}"</div>
|
||||
</div>
|
||||
<div class="text-center m-4">
|
||||
<p class="text-red-500">注意;此操作不可逆,一旦迁移,数据将无法还原回个人用户名下。</p>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-row items-center justify-center w-full">
|
||||
<a-button type="primary" onClick={doTransfer}>
|
||||
确认迁移
|
||||
|
||||
@@ -238,10 +238,14 @@ const avatar = computed(() => {
|
||||
}
|
||||
return `/api/basic/file/download?key=${avt}`;
|
||||
});
|
||||
const dateNow = ref(Date.now());
|
||||
const now = computed(() => {
|
||||
const serverTime = Date.now() - settingStore.app.deltaTime;
|
||||
const serverTime = dateNow.value - settingStore.app.deltaTime;
|
||||
return dayjs(serverTime).format("YYYY-MM-DD HH:mm:ss");
|
||||
});
|
||||
setInterval(() => {
|
||||
dateNow.value = Date.now();
|
||||
}, 5000);
|
||||
|
||||
const deltaTimeWarning = computed(() => {
|
||||
return Math.abs(settingStore.app.deltaTime) > 1000 * 60 * 4;
|
||||
|
||||
@@ -172,7 +172,7 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
|
||||
width: "auto",
|
||||
},
|
||||
buildUrl(key: string) {
|
||||
return `api/basic/file/download?&key=` + key;
|
||||
return `api/basic/file/download?token=${userStore.getToken}&key=` + key;
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -188,7 +188,7 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
|
||||
onReady: null,
|
||||
uploader: {
|
||||
type: "form",
|
||||
action: "/basic/file/upload",
|
||||
action: "/basic/file/upload?token=" + userStore.getToken,
|
||||
name: "file",
|
||||
headers: {
|
||||
Authorization: "Bearer " + userStore.getToken,
|
||||
|
||||
@@ -9,6 +9,7 @@ import yaml from "js-yaml";
|
||||
import { usePluginImport } from "./use-import";
|
||||
import { usePluginConfig } from "./use-config";
|
||||
import { useSettingStore } from "/src/store/settings/index";
|
||||
import { usePluginStore } from "/@/store/plugin";
|
||||
|
||||
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
|
||||
const router = useRouter();
|
||||
@@ -43,6 +44,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
const { openConfigDialog } = usePluginConfig();
|
||||
|
||||
const settingStore = useSettingStore();
|
||||
const pluginStore = usePluginStore();
|
||||
return {
|
||||
crudOptions: {
|
||||
settings: {
|
||||
@@ -83,6 +85,15 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
},
|
||||
},
|
||||
},
|
||||
table: {
|
||||
rowKey: "name",
|
||||
remove: {
|
||||
afterRemove: async context => {
|
||||
await pluginStore.reload();
|
||||
},
|
||||
confirmMessage: "确定要删除吗?如果该插件已被使用,删除可能会导致流水线执行失败!",
|
||||
},
|
||||
},
|
||||
rowHandle: {
|
||||
show: true,
|
||||
minWidth: 200,
|
||||
@@ -142,9 +153,6 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
},
|
||||
},
|
||||
},
|
||||
table: {
|
||||
rowKey: "name",
|
||||
},
|
||||
tabs: {
|
||||
name: "type",
|
||||
show: true,
|
||||
|
||||
@@ -29,7 +29,7 @@ import { SysSettings } from "/@/views/sys/settings/api";
|
||||
import * as api from "/@/views/sys/settings/api";
|
||||
import { merge } from "lodash-es";
|
||||
import { useSettingStore } from "/@/store/settings";
|
||||
import { notification } from "ant-design-vue";
|
||||
import { Modal, notification } from "ant-design-vue";
|
||||
import { useI18n } from "/src/locales";
|
||||
import { dict } from "@fast-crud/fast-crud";
|
||||
import { useProjectStore } from "/@/store/project";
|
||||
@@ -80,6 +80,24 @@ const onFinish = async (form: any) => {
|
||||
notification.success({
|
||||
message: t("certd.saveSuccess"),
|
||||
});
|
||||
|
||||
if (formState.public.adminMode === "enterprise") {
|
||||
Modal.confirm({
|
||||
title: "数据迁移",
|
||||
okText: "去迁移",
|
||||
content: () => {
|
||||
return (
|
||||
<div>
|
||||
<div>设置为企业模式之后,之前创建的个人数据不会显示</div>
|
||||
<div>是否前往迁移数据到项目? </div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
onOk: () => {
|
||||
goCurrentProject();
|
||||
},
|
||||
});
|
||||
}
|
||||
} finally {
|
||||
saveLoading.value = false;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { request } from "/src/api/service";
|
||||
const apiPrefix = "/sys/site";
|
||||
|
||||
export async function SettingsGet(key: string) {
|
||||
export async function SettingsGet() {
|
||||
return await request({
|
||||
url: apiPrefix + "/get",
|
||||
method: "post",
|
||||
|
||||
@@ -88,7 +88,7 @@ const onFinish = async (form: any) => {
|
||||
const userStore = useUserStore();
|
||||
const uploaderConfig = ref({
|
||||
type: "form",
|
||||
action: "/basic/file/upload",
|
||||
action: "/basic/file/upload?token=" + userStore.getToken,
|
||||
name: "file",
|
||||
headers: {
|
||||
Authorization: "Bearer " + userStore.getToken,
|
||||
|
||||
@@ -3,6 +3,21 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.39.10](https://github.com/certd/certd/compare/v1.39.9...v1.39.10) (2026-04-11)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复自定义插件删除后没有反注册的bug ([df98463](https://github.com/certd/certd/commit/df9846332596d2afaba53e66d2897aa1c598f9c4))
|
||||
* 修复spaceship创建record报错的bug ([70b46d4](https://github.com/certd/certd/commit/70b46d4a8f89cf8eded21ebb237e8c8ce6c40d30))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 1panel支持先上传证书再选择证书 ([7a9eec8](https://github.com/certd/certd/commit/7a9eec88e8eddf40dba055c072b5b2b0f67c1407))
|
||||
* 部署到1panel面板支持mux模式 ([d05129e](https://github.com/certd/certd/commit/d05129ec67893b0b639003a4bca6878d128f56ad))
|
||||
* 流水线修改编辑之后,增加未保存提示 ([21620ac](https://github.com/certd/certd/commit/21620ac6bdeb57e43509156a77037fc07c44282a))
|
||||
* 修复检查全部某些情况下无效的bug,优化公共触发站点证书检查定时逻辑 ([ee53589](https://github.com/certd/certd/commit/ee535895a3166c6f9046963e28fa8f22f018b574))
|
||||
* 增加域名管理 子域名检查提醒 ([2bdf183](https://github.com/certd/certd/commit/2bdf1832da73a3728f3ac415837bc26e70531cd6))
|
||||
|
||||
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -23,7 +23,7 @@ input:
|
||||
component:
|
||||
name: api-test
|
||||
action: TestRequest
|
||||
helper: 测试 API 连接是否正常
|
||||
helper: 测试 API 连接是否正常,需要域名查询权限
|
||||
pluginType: access
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-spaceship/access.js
|
||||
|
||||
@@ -72,6 +72,22 @@ input:
|
||||
|
||||
helper: 要更新的1Panel证书的节点信息,目前只有v2存在此概念
|
||||
order: 0
|
||||
sslMode:
|
||||
title: SSL模式
|
||||
helper: SSL模式,只有2.1.x以上版本才支持,旧版本保持默认即可
|
||||
component:
|
||||
name: a-select
|
||||
vMode: value
|
||||
options:
|
||||
- label: 启用SSL(旧版本)
|
||||
value: enable
|
||||
- label: Strict模式(>=2.1.x)
|
||||
value: Enable
|
||||
- label: Mux模式(>=2.1.x)
|
||||
value: Mux
|
||||
value: enable
|
||||
required: true
|
||||
order: 0
|
||||
output: {}
|
||||
pluginType: deploy
|
||||
type: builtIn
|
||||
|
||||
@@ -88,6 +88,7 @@ input:
|
||||
- certDomains
|
||||
- accessId
|
||||
- accessId
|
||||
uploadCert: {}
|
||||
required: true
|
||||
mergeScript: |2-
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/ui-server",
|
||||
"version": "1.39.9",
|
||||
"version": "1.39.10",
|
||||
"description": "fast-server base midway",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -50,20 +50,20 @@
|
||||
"@aws-sdk/client-route-53": "^3.964.0",
|
||||
"@aws-sdk/client-s3": "^3.964.0",
|
||||
"@aws-sdk/client-sts": "^3.990.0",
|
||||
"@certd/acme-client": "^1.39.9",
|
||||
"@certd/basic": "^1.39.9",
|
||||
"@certd/commercial-core": "^1.39.9",
|
||||
"@certd/acme-client": "^1.39.10",
|
||||
"@certd/basic": "^1.39.10",
|
||||
"@certd/commercial-core": "^1.39.10",
|
||||
"@certd/cv4pve-api-javascript": "^8.4.2",
|
||||
"@certd/jdcloud": "^1.39.9",
|
||||
"@certd/lib-huawei": "^1.39.9",
|
||||
"@certd/lib-k8s": "^1.39.9",
|
||||
"@certd/lib-server": "^1.39.9",
|
||||
"@certd/midway-flyway-js": "^1.39.9",
|
||||
"@certd/pipeline": "^1.39.9",
|
||||
"@certd/plugin-cert": "^1.39.9",
|
||||
"@certd/plugin-lib": "^1.39.9",
|
||||
"@certd/plugin-plus": "^1.39.9",
|
||||
"@certd/plus-core": "^1.39.9",
|
||||
"@certd/jdcloud": "^1.39.10",
|
||||
"@certd/lib-huawei": "^1.39.10",
|
||||
"@certd/lib-k8s": "^1.39.10",
|
||||
"@certd/lib-server": "^1.39.10",
|
||||
"@certd/midway-flyway-js": "^1.39.10",
|
||||
"@certd/pipeline": "^1.39.10",
|
||||
"@certd/plugin-cert": "^1.39.10",
|
||||
"@certd/plugin-lib": "^1.39.10",
|
||||
"@certd/plugin-plus": "^1.39.10",
|
||||
"@certd/plus-core": "^1.39.10",
|
||||
"@google-cloud/publicca": "^1.3.0",
|
||||
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.185",
|
||||
"@huaweicloud/huaweicloud-sdk-core": "^3.1.185",
|
||||
|
||||
@@ -58,7 +58,8 @@ export class PluginController extends CrudController<PluginService> {
|
||||
|
||||
@Post('/delete', { description: 'sys:settings:edit' })
|
||||
async delete(@Query('id') id: number) {
|
||||
return super.deleteByIds([id]);
|
||||
const res = await this.service.deleteByIds([id]);
|
||||
return this.ok(res);
|
||||
}
|
||||
|
||||
@Post('/deleteByIds', { description: 'sys:settings:edit' })
|
||||
|
||||
@@ -3,6 +3,7 @@ import { Constants, CrudController } from '@certd/lib-server';
|
||||
import { DomainService } from "../../../modules/cert/service/domain-service.js";
|
||||
import { checkPlus } from '@certd/plus-core';
|
||||
import { ApiTags } from '@midwayjs/swagger';
|
||||
import { parseDomainByPsl } from '@certd/plugin-lib';
|
||||
|
||||
/**
|
||||
* 授权
|
||||
@@ -187,4 +188,12 @@ export class DomainController extends CrudController<DomainService> {
|
||||
return this.ok(setting);
|
||||
}
|
||||
|
||||
@Post('/isSubdomain', { description: Constants.per.authOnly, summary: "判断是否为子域名" })
|
||||
async isSubdomain(@Body(ALL) body: any) {
|
||||
const { domain } = body;
|
||||
const parsed = parseDomainByPsl(domain)
|
||||
const mainDomain = parsed.domain || ''
|
||||
return this.ok(mainDomain !== domain);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ export class SiteInfoController extends CrudController<SiteInfoService> {
|
||||
@Post('/checkAll', { description: Constants.per.authOnly, summary: "检查所有站点监控" })
|
||||
async checkAll() {
|
||||
const { projectId, userId } = await this.getProjectUserIdWrite()
|
||||
await this.service.checkAllByUsers(userId,projectId);
|
||||
this.service.triggerJobOnce(userId,projectId);
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
import {Autoload, Config, Init, Inject, Scope, ScopeEnum} from '@midwayjs/core';
|
||||
import {PipelineService} from '../pipeline/service/pipeline-service.js';
|
||||
import {logger} from '@certd/basic';
|
||||
import {SysSettingsService, SysSiteInfo} from '@certd/lib-server';
|
||||
import {SiteInfoService} from '../monitor/index.js';
|
||||
import {Cron} from '../cron/cron.js';
|
||||
import {UserSettingsService} from "../mine/service/user-settings-service.js";
|
||||
import {UserSiteMonitorSetting} from "../mine/service/models.js";
|
||||
import {getPlusInfo, isPlus} from "@certd/plus-core";
|
||||
import { logger } from '@certd/basic';
|
||||
import { SysSettingsService, SysSiteInfo } from '@certd/lib-server';
|
||||
import { getPlusInfo, isPlus } from "@certd/plus-core";
|
||||
import { Autoload, Config, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core';
|
||||
import dayjs from "dayjs";
|
||||
import {NotificationService} from "../pipeline/service/notification-service.js";
|
||||
import {UserService} from "../sys/authority/service/user-service.js";
|
||||
import {Between} from "typeorm";
|
||||
import { Between } from "typeorm";
|
||||
import { DomainService } from '../cert/service/domain-service.js';
|
||||
import { Cron } from '../cron/cron.js';
|
||||
import { UserSiteMonitorSetting } from "../mine/service/models.js";
|
||||
import { UserSettingsService } from "../mine/service/user-settings-service.js";
|
||||
import { SiteInfoService } from '../monitor/index.js';
|
||||
import { NotificationService } from "../pipeline/service/notification-service.js";
|
||||
import { PipelineService } from '../pipeline/service/pipeline-service.js';
|
||||
import { UserService } from "../sys/authority/service/user-service.js";
|
||||
import { ProjectService } from '../sys/enterprise/service/project-service.js';
|
||||
|
||||
@Autoload()
|
||||
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
||||
@@ -47,6 +48,9 @@ export class AutoCRegisterCron {
|
||||
|
||||
@Inject()
|
||||
domainService: DomainService;
|
||||
@Inject()
|
||||
projectService: ProjectService;
|
||||
|
||||
|
||||
|
||||
@Init()
|
||||
@@ -72,9 +76,23 @@ export class AutoCRegisterCron {
|
||||
|
||||
async registerSiteMonitorCron() {
|
||||
//先注册公共job
|
||||
await this.siteInfoService.registerSiteMonitorJob()
|
||||
logger.info(`注册公共站点证书检查定时任务`)
|
||||
const randomMinute = Math.floor(Math.random() * 60)
|
||||
this.cron.register({
|
||||
name: 'siteMonitor',
|
||||
cron: `0 ${randomMinute} 0 * * *`,
|
||||
job:async ()=>{
|
||||
logger.info(`开始公共站点证书检查任务`)
|
||||
await this.siteInfoService.triggerCommonJob()
|
||||
logger.info(`公共站点证书检查任务完成`)
|
||||
},
|
||||
});
|
||||
logger.info(`注册公共站点证书检查定时任务完成`)
|
||||
|
||||
|
||||
|
||||
//注册用户独立的检查时间
|
||||
logger.info(`注册用户独立站点证书检查定时任务`)
|
||||
const monitorSettingList = await this.userSettingsService.list({
|
||||
query:{
|
||||
key: UserSiteMonitorSetting.__key__,
|
||||
@@ -87,10 +105,11 @@ export class AutoCRegisterCron {
|
||||
}
|
||||
await this.siteInfoService.registerSiteMonitorJob(item.userId,item.projectId)
|
||||
}
|
||||
logger.info(`注册用户独立站点证书检查定时任务完成`)
|
||||
|
||||
if (this.immediateTriggerSiteMonitor) {
|
||||
logger.info(`立即触发一次站点证书检查任务`)
|
||||
await this.siteInfoService.triggerJobOnce()
|
||||
logger.info(`立即触发一次公共站点证书检查任务`)
|
||||
await this.siteInfoService.triggerCommonJob()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {Inject, Provide, Scope, ScopeEnum} from "@midwayjs/core";
|
||||
import {BaseService, NeedSuiteException, NeedVIPException, SysSettingsService} from "@certd/lib-server";
|
||||
import {BaseService, Constants, NeedSuiteException, NeedVIPException, SysSettingsService} from "@certd/lib-server";
|
||||
import {InjectEntityModel} from "@midwayjs/typeorm";
|
||||
import {In, Repository} from "typeorm";
|
||||
import {SiteInfoEntity} from "../entity/site-info.js";
|
||||
@@ -19,6 +19,8 @@ import { dnsContainer } from "./dns-custom.js";
|
||||
import { merge } from "lodash-es";
|
||||
import { JobHistoryService } from "./job-history-service.js";
|
||||
import { JobHistoryEntity } from "../entity/job-history.js";
|
||||
import { UserService } from "../../sys/authority/service/user-service.js";
|
||||
import { ProjectService } from "../../sys/enterprise/service/project-service.js";
|
||||
|
||||
@Provide()
|
||||
@Scope(ScopeEnum.Request, {allowDowngrade: true})
|
||||
@@ -44,6 +46,10 @@ export class SiteInfoService extends BaseService<SiteInfoEntity> {
|
||||
@Inject()
|
||||
jobHistoryService: JobHistoryService;
|
||||
|
||||
@Inject()
|
||||
userService: UserService;
|
||||
@Inject()
|
||||
projectService: ProjectService;
|
||||
|
||||
@Inject()
|
||||
cron: Cron;
|
||||
@@ -353,18 +359,7 @@ export class SiteInfoService extends BaseService<SiteInfoEntity> {
|
||||
}
|
||||
}
|
||||
|
||||
async checkAllByUsers(userId: any,projectId?: number) {
|
||||
if (userId==null) {
|
||||
throw new Error("userId is required");
|
||||
}
|
||||
// const sites = await this.repository.find({
|
||||
// where: {userId,projectId}
|
||||
// });
|
||||
// this.checkList(sites,false);
|
||||
await this.triggerJobOnce(userId,projectId);
|
||||
}
|
||||
|
||||
async checkList(sites: SiteInfoEntity[],isCommon: boolean) {
|
||||
async checkList(sites: SiteInfoEntity[]) {
|
||||
const cache = {}
|
||||
const getFromCache = async (userId: number,projectId?: number) =>{
|
||||
const key = `${userId}_${projectId??""}`
|
||||
@@ -377,13 +372,6 @@ export class SiteInfoService extends BaseService<SiteInfoEntity> {
|
||||
}
|
||||
for (const site of sites) {
|
||||
const setting = await getFromCache(site.userId,site.projectId)
|
||||
if (isCommon) {
|
||||
//公共的检查,排除有设置cron的用户
|
||||
if (setting?.cron) {
|
||||
//设置了cron,跳过公共检查
|
||||
continue;
|
||||
}
|
||||
}
|
||||
let retryTimes = setting?.retryTimes
|
||||
this.doCheck(site,true,retryTimes).catch(e => {
|
||||
logger.error(`检查站点证书失败,${site.domain}`, e.message);
|
||||
@@ -492,57 +480,73 @@ export class SiteInfoService extends BaseService<SiteInfoEntity> {
|
||||
}
|
||||
|
||||
async registerSiteMonitorJob(userId?: number,projectId?: number) {
|
||||
const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId,projectId, UserSiteMonitorSetting);
|
||||
if (!setting.cron) {
|
||||
return;
|
||||
}
|
||||
//注册个人的 或项目的
|
||||
this.cron.register({
|
||||
name: `siteMonitor_${userId}_${projectId||""}`,
|
||||
cron: setting.cron,
|
||||
job: () => this.triggerJobOnce(userId,projectId),
|
||||
});
|
||||
}
|
||||
|
||||
if(userId == null){
|
||||
//注册公共job
|
||||
logger.info(`注册站点证书检查定时任务`)
|
||||
this.cron.register({
|
||||
name: 'siteMonitor',
|
||||
cron: '0 0 0 * * *',
|
||||
job:async ()=>{
|
||||
await this.triggerJobOnce()
|
||||
},
|
||||
});
|
||||
logger.info(`注册站点证书检查定时任务完成`)
|
||||
}else{
|
||||
const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId,projectId, UserSiteMonitorSetting);
|
||||
if (!setting.cron) {
|
||||
return;
|
||||
async triggerCommonJob(){
|
||||
//遍历用户
|
||||
const userIds = await this.userService.getAllUserIds()
|
||||
for (const userId of userIds) {
|
||||
const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId,null,UserSiteMonitorSetting)
|
||||
if(setting && setting.cron){
|
||||
//该用户有自定义检查时间,跳过公共job
|
||||
continue
|
||||
}
|
||||
//注册个人的 或项目的
|
||||
this.cron.register({
|
||||
name: `siteMonitor_${userId}_${projectId||""}`,
|
||||
cron: setting.cron,
|
||||
job: () => this.triggerJobOnce(userId,projectId),
|
||||
});
|
||||
await this.triggerJobOnce(userId)
|
||||
}
|
||||
|
||||
//遍历项目
|
||||
const projectIds = await this.projectService.getAllProjectIds()
|
||||
for (const projectId of projectIds) {
|
||||
const userId = Constants.enterpriseUserId
|
||||
const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId,projectId,UserSiteMonitorSetting)
|
||||
if(setting && setting.cron){
|
||||
//该项目有自定义检查时间,跳过公共job
|
||||
continue
|
||||
}
|
||||
await this.triggerJobOnce(userId,projectId)
|
||||
}
|
||||
}
|
||||
|
||||
async triggerJobOnce(userId?:number,projectId?:number) {
|
||||
logger.info(`站点证书检查开始执行[${userId??'所有用户'}_${projectId??'所有项目'}]`);
|
||||
const query:any = { disabled: false };
|
||||
let jobEntity :Partial<JobHistoryEntity> = null;
|
||||
if(userId!=null){
|
||||
query.userId = userId;
|
||||
if(projectId){
|
||||
query.projectId = projectId;
|
||||
}
|
||||
//判断是否已关闭
|
||||
const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId,projectId, UserSiteMonitorSetting);
|
||||
if (setting && !setting.cron) {
|
||||
return;
|
||||
}
|
||||
jobEntity = {
|
||||
userId,
|
||||
projectId,
|
||||
type:"siteCertMonitor",
|
||||
title: '站点证书检查',
|
||||
result:"start",
|
||||
startAt:new Date().getTime(),
|
||||
}
|
||||
await this.jobHistoryService.add(jobEntity);
|
||||
if(userId==null){
|
||||
throw new Error("userId is required");
|
||||
}
|
||||
const query:any = { disabled: false };
|
||||
query.userId = userId;
|
||||
if(projectId){
|
||||
query.projectId = projectId;
|
||||
}
|
||||
const siteCount = await this.repository.count({
|
||||
where: query,
|
||||
});
|
||||
if (siteCount === 0) {
|
||||
logger.info(`用户/项目[${userId}_${projectId||""}]没有站点证书需要检查`)
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info(`站点证书检查开始执行[${userId}_${projectId||""}]`);
|
||||
|
||||
let jobEntity :Partial<JobHistoryEntity> = null;
|
||||
|
||||
jobEntity = {
|
||||
userId,
|
||||
projectId,
|
||||
type:"siteCertMonitor",
|
||||
title: '站点证书检查',
|
||||
result:"start",
|
||||
startAt:new Date().getTime(),
|
||||
}
|
||||
await this.jobHistoryService.add(jobEntity);
|
||||
let offset = 0;
|
||||
const limit = 50;
|
||||
let count = 0;
|
||||
@@ -557,21 +561,18 @@ export class SiteInfoService extends BaseService<SiteInfoEntity> {
|
||||
break;
|
||||
}
|
||||
offset += records.length;
|
||||
const isCommon = !userId;
|
||||
count += records.length;
|
||||
await this.checkList(records,isCommon);
|
||||
await this.checkList(records);
|
||||
}
|
||||
|
||||
logger.info(`站点证书检查完成[${userId??'所有用户'}_${projectId??'所有项目'}]`);
|
||||
if(jobEntity){
|
||||
await this.jobHistoryService.update({
|
||||
id: jobEntity.id,
|
||||
result: "done",
|
||||
content:`共检查${count}个站点`,
|
||||
endAt:new Date().getTime(),
|
||||
updateTime:new Date(),
|
||||
});
|
||||
}
|
||||
logger.info(`站点证书检查完成[${userId}_${projectId||""}]`);
|
||||
await this.jobHistoryService.update({
|
||||
id: jobEntity.id,
|
||||
result: "done",
|
||||
content:`共检查${count}个站点`,
|
||||
endAt:new Date().getTime(),
|
||||
updateTime:new Date(),
|
||||
});
|
||||
}
|
||||
|
||||
async batchDelete(ids: number[], userId: number,projectId?:number): Promise<void> {
|
||||
|
||||
@@ -320,8 +320,6 @@ export class SiteIpService extends BaseService<SiteIpEntity> {
|
||||
for (const item of list) {
|
||||
await this.add(item);
|
||||
}
|
||||
|
||||
// await this.checkAllByUsers(req.userId);
|
||||
};
|
||||
await batchAdd(list);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
import { CertInfo, CertReader, ICertInfoGetter } from '@certd/plugin-lib';
|
||||
import { CertInfoService } from '../../../monitor/index.js';
|
||||
|
||||
export class CertInfoGetter implements ICertInfoGetter {
|
||||
userId: number;
|
||||
projectId: number;
|
||||
certInfoService: CertInfoService;
|
||||
constructor(userId: number, projectId: number, certInfoService: CertInfoService) {
|
||||
this.userId = userId;
|
||||
this.projectId = projectId;
|
||||
this.certInfoService = certInfoService;
|
||||
}
|
||||
async getByPipelineId(pipelineId: number): Promise<CertInfo> {
|
||||
if (!pipelineId) {
|
||||
throw new Error(`流水线id不能为空`)
|
||||
}
|
||||
const query :any= {
|
||||
pipelineId,
|
||||
userId: this.userId,
|
||||
}
|
||||
if (this.projectId) {
|
||||
query.projectId = this.projectId
|
||||
}
|
||||
const entity = await this.certInfoService.findOne({
|
||||
where:query
|
||||
})
|
||||
if (!entity || !entity.certInfo) {
|
||||
throw new Error(`流水线(${pipelineId})还未生成证书,请先运行一次流水线`)
|
||||
}
|
||||
return new CertReader(JSON.parse(entity.certInfo)).cert;
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,9 @@ import { SubDomainsGetter } from "./sub-domain-getter.js";
|
||||
import { DomainVerifierGetter } from "./domain-verifier-getter.js";
|
||||
import { DomainService } from "../../../cert/service/domain-service.js";
|
||||
import { SubDomainService } from "../sub-domain-service.js";
|
||||
import { CertInfoGetter } from "./cert-info-getter.js";
|
||||
import { CertInfoService } from "../../../monitor/index.js";
|
||||
import { ICertInfoGetter } from "@certd/plugin-lib";
|
||||
|
||||
const serviceNames = [
|
||||
'ocrService',
|
||||
@@ -34,6 +37,8 @@ export class TaskServiceGetter implements IServiceGetter{
|
||||
return await this.getNotificationService() as T
|
||||
} else if (serviceName === 'domainVerifierGetter') {
|
||||
return await this.getDomainVerifierGetter() as T
|
||||
} else if (serviceName === 'certInfoGetter') {
|
||||
return await this.getCertInfoGetter() as T
|
||||
}else{
|
||||
if(!serviceNames.includes(serviceName)){
|
||||
throw new Error(`${serviceName} not in whitelist`)
|
||||
@@ -51,6 +56,11 @@ export class TaskServiceGetter implements IServiceGetter{
|
||||
return new SubDomainsGetter(this.userId,this.projectId, subDomainsService,domainService)
|
||||
}
|
||||
|
||||
async getCertInfoGetter(): Promise<ICertInfoGetter> {
|
||||
const certInfoService:CertInfoService = await this.appCtx.getAsync("certInfoService")
|
||||
return new CertInfoGetter(this.userId, this.projectId, certInfoService)
|
||||
}
|
||||
|
||||
async getAccessService(): Promise<AccessGetter> {
|
||||
const accessService:AccessService = await this.appCtx.getAsync("accessService")
|
||||
return new AccessGetter(this.userId, this.projectId, accessService.getById.bind(accessService));
|
||||
|
||||
@@ -524,15 +524,12 @@ export class PluginService extends BaseService<PluginEntity> {
|
||||
id: pluginEntity.id
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
async deleteByIds(ids: any[]) {
|
||||
ids = this.filterIds(ids);
|
||||
for (const id of ids) {
|
||||
await this.unRegisterById(id)
|
||||
await this.unRegisterById(id);
|
||||
await this.delete(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -400,7 +400,15 @@ export class UserService extends BaseService<UserEntity> {
|
||||
id: userId,
|
||||
...body,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
async getAllUserIds() {
|
||||
const users = await this.repository.find({
|
||||
select: ['id'],
|
||||
where: {
|
||||
status: 1,
|
||||
},
|
||||
})
|
||||
return users.map(item => item.id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,4 +284,14 @@ export class ProjectService extends BaseService<ProjectEntity> {
|
||||
return project?.isSystem ?? false;
|
||||
}
|
||||
|
||||
|
||||
async getAllProjectIds() {
|
||||
const projects = await this.repository.find({
|
||||
select: ['id'],
|
||||
where: {
|
||||
disabled: false,
|
||||
},
|
||||
})
|
||||
return projects.map(item => item.id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,10 +100,8 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
||||
helper: "将检查证书数量限制,如果超限将删除最旧的那张证书",
|
||||
required: true
|
||||
})
|
||||
|
||||
certLimit: number = 2;
|
||||
|
||||
|
||||
async onInstance() {
|
||||
}
|
||||
|
||||
@@ -123,7 +121,7 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
|
||||
certId = casCert.certId;
|
||||
certName = casCert.certName;
|
||||
} else if (certInfo.crt) {
|
||||
certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt));
|
||||
certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt),"certd");
|
||||
|
||||
const certIdRes = await sslClient.uploadCertificate({
|
||||
name: certName,
|
||||
|
||||
@@ -58,6 +58,22 @@ export class OnePanelDeployToPanelPlugin extends AbstractTaskPlugin {
|
||||
)
|
||||
currentNode!: string;
|
||||
|
||||
@TaskInput({
|
||||
title: "SSL模式",
|
||||
helper: "SSL模式,只有2.1.x以上版本才支持,旧版本保持默认即可",
|
||||
component: {
|
||||
name: "a-select",
|
||||
vMode: "value",
|
||||
options: [
|
||||
{ label: "启用SSL(旧版本)", value: "enable" },
|
||||
{ label: "Strict模式(>=2.1.x)", value: "Enable" },
|
||||
{ label: "Mux模式(>=2.1.x)", value: "Mux" }
|
||||
],
|
||||
},
|
||||
value: "enable",
|
||||
required: true,
|
||||
})
|
||||
sslMode!: string;
|
||||
|
||||
access: OnePanelAccess;
|
||||
async onInstance() {
|
||||
@@ -102,7 +118,7 @@ export class OnePanelDeployToPanelPlugin extends AbstractTaskPlugin {
|
||||
cert: this.cert.crt,
|
||||
key: this.cert.key,
|
||||
domain: domain,
|
||||
ssl: "Enable",
|
||||
ssl: this.sslMode,
|
||||
sslID: null,
|
||||
sslType: "import-paste",
|
||||
},
|
||||
|
||||
+33
-1
@@ -2,7 +2,7 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput
|
||||
|
||||
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
||||
import { OnePanelAccess } from "../access.js";
|
||||
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib";
|
||||
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine, ICertInfoGetter } from "@certd/plugin-lib";
|
||||
import { OnePanelClient } from "../client.js";
|
||||
|
||||
@IsTaskPlugin({
|
||||
@@ -66,6 +66,7 @@ export class OnePanelDeployToWebsitePlugin extends AbstractTaskPlugin {
|
||||
watches: ["accessId"],
|
||||
helper: "要更新的1Panel证书id,选择授权之后,从下拉框中选择\nIP需要加白名单,如果是同一台机器部署的,可以试试172.16.0.0/12",
|
||||
required: true,
|
||||
uploadCert: {}
|
||||
})
|
||||
)
|
||||
sslIds!: string[];
|
||||
@@ -213,5 +214,36 @@ export class OnePanelDeployToWebsitePlugin extends AbstractTaskPlugin {
|
||||
});
|
||||
return this.ctx.utils.options.buildGroupOptions(list, this.certDomains);
|
||||
}
|
||||
|
||||
async onUploadCert(data: { pipelineId: string, certName: string }) {
|
||||
if (!this.access) {
|
||||
throw new Error("请先选择1panel授权");
|
||||
}
|
||||
const certInfoGetter = await this.ctx.serviceGetter.get<ICertInfoGetter>("certInfoGetter")
|
||||
const cert = await certInfoGetter.getByPipelineId(Number(data.pipelineId));
|
||||
|
||||
const client = new OnePanelClient({
|
||||
access: this.access,
|
||||
http: this.http,
|
||||
logger: this.logger,
|
||||
utils: this.ctx.utils,
|
||||
});
|
||||
|
||||
await client.doRequest({
|
||||
url: `/api/${this.access.apiVersion}/websites/ssl/upload`,
|
||||
method: "post",
|
||||
data: {
|
||||
sslId: 0,
|
||||
certificate: cert.crt,
|
||||
certificatePath: "",
|
||||
description: data.certName,
|
||||
privateKey: cert.key,
|
||||
privateKeyPath: "",
|
||||
type: "paste",
|
||||
},
|
||||
currentNode: this.currentNode,
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
new OnePanelDeployToWebsitePlugin();
|
||||
|
||||
@@ -37,7 +37,7 @@ export class SpaceshipAccess extends BaseAccess {
|
||||
name: "api-test",
|
||||
action: "TestRequest"
|
||||
},
|
||||
helper: "测试 API 连接是否正常"
|
||||
helper: "测试 API 连接是否正常,需要域名查询权限"
|
||||
})
|
||||
testRequest = true;
|
||||
|
||||
@@ -48,7 +48,7 @@ export class SpaceshipAccess extends BaseAccess {
|
||||
|
||||
async doRequest(options: {
|
||||
url: string;
|
||||
method: 'GET' | 'POST' | 'DELETE';
|
||||
method: 'GET' | 'POST' | 'DELETE' | 'PUT';
|
||||
params?: any;
|
||||
data?: any;
|
||||
}) {
|
||||
|
||||
@@ -3,11 +3,7 @@ import { SpaceshipAccess } from "./access.js";
|
||||
import { PageRes, PageSearch } from "@certd/pipeline";
|
||||
|
||||
export type SpaceshipRecord = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: string;
|
||||
content: string;
|
||||
domainId: string;
|
||||
};
|
||||
|
||||
@IsDnsProvider({
|
||||
@@ -32,8 +28,9 @@ export class SpaceshipProvider extends AbstractDnsProvider<SpaceshipRecord> {
|
||||
await this.access.getDomainInfo(domain);
|
||||
|
||||
const recordRes = await this.access.doRequest({
|
||||
url: `https://spaceship.dev/api/v1/domains/${domain}/records`,
|
||||
method: "POST",
|
||||
// https://spaceship.dev/api/v1/dns/records/{domain}
|
||||
url: `https://spaceship.dev/api/v1/dns/records/${domain}`,
|
||||
method: "PUT",
|
||||
data: {
|
||||
force: false,
|
||||
items: [
|
||||
@@ -41,40 +38,33 @@ export class SpaceshipProvider extends AbstractDnsProvider<SpaceshipRecord> {
|
||||
type: type,
|
||||
value: value,
|
||||
name: hostRecord,
|
||||
ttl: 300
|
||||
ttl: 60
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
id: recordRes.items[0].id,
|
||||
name: hostRecord,
|
||||
type: type,
|
||||
content: value,
|
||||
domainId: domain
|
||||
};
|
||||
return recordRes;
|
||||
}
|
||||
|
||||
async removeRecord(options: RemoveRecordOptions<SpaceshipRecord>): Promise<void> {
|
||||
const recordRes = options.recordRes;
|
||||
this.logger.info("删除域名解析:", recordRes);
|
||||
const recordReq = options.recordReq;
|
||||
this.logger.info("删除域名解析:", recordReq);
|
||||
|
||||
await this.access.doRequest({
|
||||
url: `https://spaceship.dev/api/v1/domains/${recordRes.domainId}/records`,
|
||||
// https://spaceship.dev/api/v1/dns/records/xxx.net
|
||||
url: `https://spaceship.dev/api/v1/dns/records/${recordReq.domain}`,
|
||||
method: "DELETE",
|
||||
data: {
|
||||
Records: [
|
||||
{
|
||||
type: recordRes.type,
|
||||
value: recordRes.content,
|
||||
name: recordRes.name
|
||||
}
|
||||
]
|
||||
}
|
||||
data: [
|
||||
{
|
||||
type: recordReq.type,
|
||||
value: recordReq.value,
|
||||
name: recordReq.hostRecord
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
this.logger.info("删除域名解析成功:", recordRes.name);
|
||||
this.logger.info("删除域名解析成功:", JSON.stringify(recordReq));
|
||||
}
|
||||
|
||||
async getDomainListPage(req: PageSearch): Promise<PageRes<DomainRecord>> {
|
||||
|
||||
Generated
+111
-50
@@ -49,7 +49,7 @@ importers:
|
||||
packages/core/acme-client:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../basic
|
||||
'@peculiar/x509':
|
||||
specifier: ^1.11.0
|
||||
@@ -213,11 +213,11 @@ importers:
|
||||
packages/core/pipeline:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../basic
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.39.8
|
||||
version: link:../../pro/plus-core
|
||||
specifier: ^1.39.9
|
||||
version: 1.39.9
|
||||
dayjs:
|
||||
specifier: ^1.11.7
|
||||
version: 1.11.13
|
||||
@@ -412,7 +412,7 @@ importers:
|
||||
packages/libs/lib-k8s:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/basic
|
||||
'@kubernetes/client-node':
|
||||
specifier: 0.21.0
|
||||
@@ -452,20 +452,20 @@ importers:
|
||||
packages/libs/lib-server:
|
||||
dependencies:
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.39.8
|
||||
version: link:../../pro/plus-core
|
||||
specifier: ^1.39.9
|
||||
version: 1.39.9
|
||||
'@midwayjs/cache':
|
||||
specifier: 3.14.0
|
||||
version: 3.14.0
|
||||
@@ -610,16 +610,16 @@ importers:
|
||||
packages/plugins/plugin-cert:
|
||||
dependencies:
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../plugin-lib
|
||||
psl:
|
||||
specifier: ^1.9.0
|
||||
@@ -683,17 +683,17 @@ importers:
|
||||
specifier: ^3.964.0
|
||||
version: 3.964.0(aws-crt@1.26.2)
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.39.8
|
||||
version: link:../../pro/plus-core
|
||||
specifier: ^1.39.9
|
||||
version: 1.39.9
|
||||
'@kubernetes/client-node':
|
||||
specifier: 0.21.0
|
||||
version: 0.21.0
|
||||
@@ -783,16 +783,16 @@ importers:
|
||||
packages/pro/commercial-core:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../core/basic
|
||||
'@certd/lib-server':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../libs/lib-server
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../plus-core
|
||||
'@midwayjs/core':
|
||||
specifier: 3.20.11
|
||||
@@ -868,16 +868,16 @@ importers:
|
||||
packages/pro/plugin-plus:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../plus-core
|
||||
crypto-js:
|
||||
specifier: ^4.2.0
|
||||
@@ -953,7 +953,7 @@ importers:
|
||||
packages/pro/plus-core:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.7
|
||||
version: link:../../core/basic
|
||||
dayjs:
|
||||
specifier: ^1.11.7
|
||||
@@ -1249,10 +1249,10 @@ importers:
|
||||
version: 0.1.3(zod@3.24.4)
|
||||
devDependencies:
|
||||
'@certd/lib-iframe':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../libs/lib-iframe
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/pipeline
|
||||
'@rollup/plugin-commonjs':
|
||||
specifier: ^25.0.7
|
||||
@@ -1447,47 +1447,47 @@ importers:
|
||||
specifier: ^3.990.0
|
||||
version: 3.990.0(aws-crt@1.26.2)
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/basic
|
||||
'@certd/commercial-core':
|
||||
specifier: ^1.39.8
|
||||
version: link:../../pro/commercial-core
|
||||
specifier: ^1.39.9
|
||||
version: 1.39.9(better-sqlite3@11.10.0)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.9.3))
|
||||
'@certd/cv4pve-api-javascript':
|
||||
specifier: ^8.4.2
|
||||
version: 8.4.2
|
||||
'@certd/jdcloud':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../libs/lib-jdcloud
|
||||
'@certd/lib-huawei':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../libs/lib-huawei
|
||||
'@certd/lib-k8s':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../libs/lib-k8s
|
||||
'@certd/lib-server':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../libs/lib-server
|
||||
'@certd/midway-flyway-js':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../libs/midway-flyway-js
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-cert':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../plugins/plugin-cert
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.39.8
|
||||
specifier: ^1.39.9
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plugin-plus':
|
||||
specifier: ^1.39.8
|
||||
version: link:../../pro/plugin-plus
|
||||
specifier: ^1.39.9
|
||||
version: 1.39.9
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.39.8
|
||||
version: link:../../pro/plus-core
|
||||
specifier: ^1.39.9
|
||||
version: 1.39.9
|
||||
'@google-cloud/publicca':
|
||||
specifier: ^1.3.0
|
||||
version: 1.3.0(encoding@0.1.13)
|
||||
@@ -2838,9 +2838,18 @@ packages:
|
||||
'@better-scroll/zoom@2.5.1':
|
||||
resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==}
|
||||
|
||||
'@certd/commercial-core@1.39.9':
|
||||
resolution: {integrity: sha512-oq4rWrK6Xxy9hkxZaUbQbZ2pFgtRcPuqlg9Ud1vtzO8zmFkZY48j+vsUH0V32k1dNr75BIl9r9RFY2Vwc6rcVg==}
|
||||
|
||||
'@certd/cv4pve-api-javascript@8.4.2':
|
||||
resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==}
|
||||
|
||||
'@certd/plugin-plus@1.39.9':
|
||||
resolution: {integrity: sha512-OdY0glIHQeaGUYwH8KvN++go4QB5KUBmRvw1jzIDKu5pHZEKkEij0UBfeDv8a5CC9ynA+4/aoNPCvB0tncNuCg==}
|
||||
|
||||
'@certd/plus-core@1.39.9':
|
||||
resolution: {integrity: sha512-75Wo4KQoHFxhWwLB3XjRC+ihButagGiaxiwS1u4oVzESW9EqQ+XKcGEw/WJF3oh81dE7orexo2nA4p/PdoTSlg==}
|
||||
|
||||
'@certd/vue-js-cron-core@6.0.3':
|
||||
resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==}
|
||||
|
||||
@@ -15146,12 +15155,64 @@ snapshots:
|
||||
dependencies:
|
||||
'@better-scroll/core': 2.5.1
|
||||
|
||||
'@certd/commercial-core@1.39.9(better-sqlite3@11.10.0)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.9.3))':
|
||||
dependencies:
|
||||
'@certd/basic': link:packages/core/basic
|
||||
'@certd/lib-server': link:packages/libs/lib-server
|
||||
'@certd/pipeline': link:packages/core/pipeline
|
||||
'@certd/plus-core': 1.39.9
|
||||
'@midwayjs/core': 3.20.11
|
||||
'@midwayjs/koa': 3.20.13
|
||||
'@midwayjs/logger': 3.4.2
|
||||
'@midwayjs/swagger': 3.20.11
|
||||
'@midwayjs/typeorm': 3.20.11
|
||||
dayjs: 1.11.13
|
||||
typeorm: 0.3.24(better-sqlite3@11.10.0)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.9.3))
|
||||
transitivePeerDependencies:
|
||||
- '@google-cloud/spanner'
|
||||
- '@sap/hana-client'
|
||||
- babel-plugin-macros
|
||||
- better-sqlite3
|
||||
- hdb-pool
|
||||
- ioredis
|
||||
- mongodb
|
||||
- mssql
|
||||
- mysql2
|
||||
- oracledb
|
||||
- pg
|
||||
- pg-native
|
||||
- pg-query-stream
|
||||
- redis
|
||||
- reflect-metadata
|
||||
- sql.js
|
||||
- sqlite3
|
||||
- supports-color
|
||||
- ts-node
|
||||
- typeorm-aurora-data-api-driver
|
||||
|
||||
'@certd/cv4pve-api-javascript@8.4.2':
|
||||
dependencies:
|
||||
debug: 4.4.3(supports-color@8.1.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@certd/plugin-plus@1.39.9':
|
||||
dependencies:
|
||||
'@certd/basic': link:packages/core/basic
|
||||
'@certd/pipeline': link:packages/core/pipeline
|
||||
'@certd/plugin-lib': link:packages/plugins/plugin-lib
|
||||
'@certd/plus-core': 1.39.9
|
||||
crypto-js: 4.2.0
|
||||
dayjs: 1.11.13
|
||||
form-data: 4.0.2
|
||||
jsrsasign: 11.1.0
|
||||
querystring: 0.2.1
|
||||
|
||||
'@certd/plus-core@1.39.9':
|
||||
dependencies:
|
||||
'@certd/basic': link:packages/core/basic
|
||||
dayjs: 1.11.13
|
||||
|
||||
'@certd/vue-js-cron-core@6.0.3':
|
||||
dependencies:
|
||||
mustache: 4.2.0
|
||||
@@ -20864,13 +20925,13 @@ snapshots:
|
||||
resolve: 1.22.10
|
||||
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:
|
||||
eslint: 7.32.0
|
||||
prettier: 2.8.8
|
||||
prettier-linter-helpers: 1.0.0
|
||||
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):
|
||||
dependencies:
|
||||
@@ -23296,7 +23357,7 @@ snapshots:
|
||||
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-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
|
||||
inquirer: 7.3.3
|
||||
json5: 2.2.3
|
||||
|
||||
Reference in New Issue
Block a user